o
    %eJ                     @   s|   d dl Z d dlmZ d dlmZ d dlmZ ddlmZ ddlm	Z	 e 
djZdd	d
ZG dd dZdd Zdd ZdS )    N)urlparse)	parse_nth)ascii_lower   )parser)SelectorErrorz	[^ 	
]+c                 C   s   dd t | |D S )a  Compile a (comma-separated) list of selectors.

    :param input:
        A string, or an iterable of tinycss2 component values such as
        the :attr:`tinycss2.ast.QualifiedRule.prelude` of a style rule.
    :param namespaces:
        A optional dictionary of all `namespace prefix declarations
        <http://www.w3.org/TR/selectors/#nsdecl>`_ in scope for this selector.
        Keys are namespace prefixes as strings, or ``None`` for the default
        namespace.
        Values are namespace URLs as strings.
        If omitted, assume that no prefix is declared.
    :returns:
        A list of opaque :class:`compiler.CompiledSelector` objects.

    c                 S   s   g | ]}t |qS  )CompiledSelector.0selectorr   r   F/var/www/html/venv/lib/python3.10/site-packages/cssselect2/compiler.py
<listcomp>   s    z)compile_selector_list.<locals>.<listcomp>)r   parse)input
namespacesr   r   r   compile_selector_list   s   
r   c                   @   s   e Zd ZdZdd ZdS )r	   z&Abstract representation of a selector.c                 C   s
  t |j}|dk| _tttd}td| |i | _|j| _|j	| _	d | _
d | _d | _d | _d | _d| _|j}t|tjr?|j}|jD ]@}t|tjrO|j| _
qBt|tjrZ|j| _qBt|tjri|j| _|j| _qBt|tjrt|j| _qBt|tjr|jdkrd| _qBd S )N0)split_whitespacer   r   zlambda el: FlangT)_compile_nodeparsed_treenever_matchesr   r   r   evaltestspecificitypseudo_elementid
class_name
local_namelower_local_name	namespacerequires_lang_attr
isinstancer   CombinedSelectorrightsimple_selectors
IDSelectoridentClassSelectorLocalNameSelectorNamespaceSelectorAttributeSelectorname)selfparsed_selectorsourceeval_globalsnodesimple_selectorr   r   r   __init__'   sB   







zCompiledSelector.__init__N)__name__
__module____qualname____doc__r4   r   r   r   r   r	   %   s    r	   c                 C   sD	  t | tjr{t| j}|dkrdS |dkr+| jdv rd}nD| jdv r%d}n<td| j| jdkr7d	| d
}n*| jdkrCd| d}n| jdkrOd| d}n| jdkr[d	| d}ntd| jt| j}|dkrldS |dkrr|S d| d| dS t | tjrdd t	t| j
D }t|dkr|d }|S d|v rd}|S |rddd |D }|S d}|S t | tjrdd dd | jD D }|sdS ddd d |D  dS t | tjr$g }| jD ];}t|jj}|dkrq|jdkrd!}n|jdkrd"}n|jdkr
d#}n|jdkrd$}|d%| d&| d' qd|S t | tjtjfrJd(d d)d | jD D }|s@dS dd*d |D S t | tjri| j| jkr^d+| jS d,| jd-| jdS t | tjrvd.| jS t | tjr| jd/S t | tjrd0| jS t | tjr| jd1ur| jr| j| j krt!d2| j d3| j }	n;d2| j d3| j  }
d2| j d3| j }d|
d-|d}	n| j| j krt!| j}	n| j | j}
}d|
d-|d}	| j"}| j#d1u r|	 d4S | j#d5krd6|	 d7|S | j#d8kr,t|$ dks"|% |kr$dS |d9|	 d:S | j#d;kr@d<|d=|d> d?|	 d@S | j#dAkrT|rRd6|	 dB|dS dS | j#dCkrh|rfd6|	 dD|dS dS | j#dEkr{|ry|dF|	 dGS dS tdH| j#t&t | tj'rR| jdIv rt(dJdKdL}|dM7 }| jdNkr|dO7 }|S | jdPkrt(dQdRdSdTdU}t(dVdWdX}t(dJdKdL}d| dY| dZ| d[S | jd\krt(dQdRdSdTdU}t(dVdWdX}d| d]| d^S | jd_krt(dRdW}t(dU}d| d`| daS | jdbv r	dS | jdcv rddS | jdekrdfS | jdgkr!dhS | jdikr*	 djS | jdkkr3	 dlS | jdmkr;dnS | jdokrD	 dpS | jdqkrLdrS tds| jt | tj)r| jdtkrg }dud | j*D }|r|+d}|j,dvkr~||j- n|j,dwkr|t.|j" ntdx|r|+d}|j,dvkr|j"dykrtdx|slddzd |D S g }g }|}| j*D ]}|j,dvkr|j"d{kr||u r|}q|| q|r0dd|d t/|D }| jd}krd~| d'}n-| jdkrd| d'}n | jdkrd| d}n| jdkr!d| d}ntds| j|d| d7 }n8||u r>td| j d| jd}krGd}n!| jdkrPd}n| jdkrYd}n| jdkrbd}ntds| jt0|}|d1u rztd| j d|\}}|d }|dkrd| d7| S d| d| d| d@S t1t,| | )zReturn a boolean expression, as a Python source string.

    When evaluated in a context where the `el` variable is an
    :class:`cssselect2.tree.Element` object, tells whether the element is a
    subject of `selector`.

    r   1) >zel.parent is not None)~+zel.previous is not NonezUnknown combinatorr:   zany((z) for el in el.ancestors)r;   znext(el is not None and (z) for el in [el.parent])r=   z) for el in [el.previous])r<   z!) for el in el.previous_siblings)(z) and ()c                 S      g | ]}|d kr|qS r9   r   r   exprr   r   r   r      s
    z!_compile_node.<locals>.<listcomp>r   r   z and c                 s       | ]	}d | dV  qdS r>   r?   Nr   )r   er   r   r   	<genexpr>       z _compile_node.<locals>.<genexpr>c                 S   r@   rA   r   rB   r   r   r   r      
    c                 S      g | ]}t |jqS r   r   r   r
   r   r   r   r          znot (z or c                 s   rD   rE   r   rB   r   r   r   rG      rH   zlist(el.iter_subtree())[1:]zel.iter_children()z!list(el.iter_next_siblings())[:1]zel.iter_next_siblings()z(any(z for el in ))c                 S   r@   )r   r   rB   r   r   r   r      rI   c                 S   rJ   r   rK   r
   r   r   r   r      rL   c                 s   rD   rE   r   rB   r   r   r   rG      rH   zel.local_name == zel.local_name == (z if el.in_html_document else zel.namespace_url == z in el.classesz	el.id == N{}z in el.etree_element.attrib=zel.etree_element.get(z) == z~=z* in split_whitespace(el.etree_element.get(z, ""))z|=z
next(v == z) or      (v is not None and v.startswith(-z&))     for v in [el.etree_element.get(z)])z^=z, "").startswith(z$=z, "").endswith(z*=z in el.etree_element.get(z, "")zUnknown attribute operator)linkzany-link
local-linkaarearR   z. and el.etree_element.get("href") is not None rS   z5and not urlparse(el.etree_element.get("href")).schemeenabledbuttonr   selecttextareaoptionoptgroupmenuitemfieldsetzS and el.etree_element.get("disabled") is None  and not el.in_disabled_fieldset) or(z3 and el.etree_element.get("disabled") is None) or (z. and el.etree_element.get("href") is not None)disabledzT and (el.etree_element.get("disabled") is not None  or el.in_disabled_fieldset)) or(z2 and el.etree_element.get("disabled") is not None)checkedz and el.etree_element.get("checked") is not None and  ascii_lower(el.etree_element.get("type", ""))   in ("checkbox", "radio")) or (z2 and el.etree_element.get("selected") is not None))visitedhoveractivefocuszfocus-withinzfocus-visibletargetztarget-withincurrentpastfutureplayingpausedseeking	bufferingstalledmutedzvolume-lockedz
user-validzuser-invalid)rootscopezel.parent is Nonezfirst-childzel.index == 0z
last-childz&el.index + 1 == len(el.etree_siblings)zfirst-of-typezKall(s.tag != el.etree_element.tag    for s in el.etree_siblings[:el.index])zlast-of-typezOall(s.tag != el.etree_element.tag    for s in el.etree_siblings[el.index + 1:])z
only-childzlen(el.etree_siblings) == 1zonly-of-typez_all(s.tag != el.etree_element.tag or i == el.index    for i, s in enumerate(el.etree_siblings))emptyz0not (el.etree_children or el.etree_element.text)zUnknown pseudo-classr   c                 S   s   g | ]	}|j d vr|qS ))
whitespacecomment)type)r   tokenr   r   r   r   B  s
    
r(   stringzInvalid arguments for :lang(),c                 s   s&    | ]}d |d|d dV  qdS )zel.lang == z or el.lang.startswith(rQ   r?   Nr   )r   r   r   r   r   rG   Q  s
    
ofc                 s   s    | ]}t |jV  qd S NrK   r
   r   r   r   rG   `  s
    
z	nth-childz)sum(1 for el in el.previous_siblings if (znth-last-childzBsum(1 for el in    tuple(el.iter_siblings())[el.index + 1:]   if (znth-of-typez@sum(1 for s in (      el for el in el.previous_siblings     if (z5))    if s.etree_element.tag == el.etree_element.tag)znth-last-of-typezYsum(1 for s in (      el for el in      tuple(el.iter_siblings())[el.index + 1:]     if (zif (z) else float("nan")zInvalid arguments for :z()zel.indexz%len(el.etree_siblings) - el.index - 1zPsum(1 for s in el.etree_siblings[:el.index]    if s.tag == el.etree_element.tag)zTsum(1 for s in el.etree_siblings[el.index + 1:]    if s.tag == el.etree_element.tag)z/next(r == 0 and n >= 0    for n, r in [divmod((z) - , )2r#   r   r$   r   left
combinatorr   r%   CompoundSelectormapr&   lenjoinNegationSelectorselector_listRelationalSelectorr   r   appendMatchesAnySelectorSpecificityAdjustmentSelectorr*   r    r   r+   r!   r)   r   r'   r(   r,   r-   
lower_namereprvalueoperatorsplitstripNotImplementedErrorPseudoClassSelectorhtml_tag_eqFunctionalPseudoClassSelector	argumentspoprs   lower_valuer   r   r   	TypeError)r   left_insiderz   r%   sub_expressionsr   relative_selector
expressionelementskeylowerr-   r   r   grouprT   rZ   langstokensrt   nthr   current_listargumentcountresultbBr   r   r   r   K   s@  















 












r   c                  G   sh   t | dkrd| d  }d| d d|dS ddd	 | D }dd
d	 | D }d| d| dS )z;Generate expression testing equality with HTML local names.r   {http://www.w3.org/1999/xhtml}r   z((el.local_name == z7) if el.in_html_document else (el.etree_element.tag == rM   ry   c                 s   s    | ]}t |V  qd S rx   r   r   nr   r   r   rG     s    zhtml_tag_eq.<locals>.<genexpr>c                 s   s    | ]	}t d | V  qdS )r   Nr   r   r   r   r   rG     s    
z((el.local_name in (z9)) if el.in_html_document else (el.etree_element.tag in (z))))r~   r   )local_namestagnamestagsr   r   r   r     s   
r   rx   )reurllib.parser   tinycss2.nthr   webencodingsr    r   r   compilefindallr   r   r	   r   r   r   r   r   r   <module>   s    
&  \