a
    ¥Q•hÓI  ã                   @   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   úL/var/www/sistema_ama/venv/lib/python3.9/site-packages/cssselect2/compiler.pyÚ
<listcomp>   ó    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ƒrž|j| _
q„t|tjƒr´|j| _q„t|tjƒrÒ|j| _|j| _q„t|tjƒrè|j| _q„t|tjƒr„|jdkr„d| _q„d 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)ÚselfZparsed_selectorÚsourceZeval_globalsÚnodeZsimple_selectorr   r   r   Ú__init__$   s>    

ý





zCompiledSelector.__init__N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r2   r   r   r   r   r	   "   s   r	   c              
   C   s–	  t | tjƒ� rþt| jƒ}|dkr$dS |dkrZ| jdv r<d}qÆ| jdv rLd}qÆtd| jƒ‚nl| jdkrrd	|› d
�}nT| jdkrŠd|› d�}n<| jdkr¢d|› d�}n$| jdkrºd	|› d�}ntd| jƒ‚t| jƒ}|dkrÜdS |dkrè|S d|› d|› d�S �n”t | tjƒ�rldd„ dd„ | j	D ƒD ƒ}t
|ƒdk�r<|d S d|v �rJdS |�rdd dd„ |D ƒ¡S dS �n&t | tjƒ�rºdd„ dd„ | jD ƒD ƒ}|�sždS dd  d!d„ |D ƒ¡› d�S t | tjƒ�r\g }| jD ]~}t|jjƒ}|dk�rð�qÒ|jdk�rd"}n4|jdk�rd#}n"|jdk�r&d$}n|jdk�r6d%}| d&|› d'|› d(�¡ �qÒd  |¡S t | tjtjfƒ�r¨d)d„ d*d„ | jD ƒD ƒ}|�s”dS d  d+d„ |D ƒ¡S t | tjƒ�rê| j| jk�rÐd,| j›�S d-| j›d.| j›d�S �n¨t | tjƒ�rd/| j›�S t | tjƒ�r| j›d0�S t | tjƒ�r8d1| j›�S t | tjƒ�rV| jd2u�rN| j�r¾| j| jk�r‚t d3| j› d4| j› �ƒ}n:d3| j› d4| j› �}	d3| j› d4| j› �}
d|	›d.|
›d�}n:| j| jk�rØt | jƒ}n | j| j }	}
d|	›d.|
›d�}| j!}d5|› d6�}| j"d7u �r&| #¡ }|d87 }| j$d2u �r<|› d9�S | j$d:k�r\|› d;|› d<|›�S | j$d=k�rœt
| %¡ ƒdk�sˆ| &¡ |k�rŒdS |›d>|› d�S | j$d?k�rÎ|› d;|› d<|›d |› d@|dA ›d�
S | j$dBk�rö|�rð|› d@|›d�S dS nV| j$dCk�r|�r|› dD|›d�S dS | j$dEk�r@|�r<|›dF|› �S dS tdG| j$ƒ‚nt'‚�n<t | tj(ƒ�rò| jdHv �rœt)dIdJdKƒ}|dL7 }| jdMk�r˜|dN7 }|S | jdOk�rèt)dPdQdRdSdTƒ}t)dUdVdWƒ}t)dIdJdKƒ}d|› dX|› dY|› dZ�S | jd[k�r"t)dPdQdRdSdTƒ}t)dUdVdWƒ}d|› d\|› d]�S | jd^k�rRt)dQdVƒ}t)dTƒ}d|› d_|› d`�S | jdav �rbdS | jdbv �rrdcS | jddk�r‚deS | jdfk�r’dgS | jdhk�r¢diS | jdjk�r²dkS | jdlk�rÂdmS | jdnk�rÒdoS | jdpk�râdqS tdr| jƒ‚�n t | tj*ƒ�	r„| jdsk�r¸g }dtd„ | j+D ƒ}|�r¤| ,d¡}|j-duk�rJ| |j.¡ n&|j-dvk�rh| t/|j!ƒ¡ ntdwƒ‚|�r | ,d¡}|j-duk�r |j!dxk�r tdwƒ‚�q d  dyd„ |D ƒ¡S g }g }|}| j+D ]:}|j-duk�rø|j!dzk�rø||u �rø|}�qÊ| |¡ �qÊ|�r¬d d{d„ t 0|¡D ƒ¡}| jd|k�r@d}|› d(�}nZ| jd~k�rZd|› d(�}n@| jd€k�rtd�|› d‚�}n&| jdƒk�rŽd„|› d‚�}ntdr| jƒ‚|d…|› d†�7 }np||u �rÈtd‡| j› dˆ�ƒ‚| jd|k�rÚd‰}nB| jd~k�rìdŠ}n0| jd€k�rþd‹}n| jdƒk�	rdŒ}ntdr| jƒ‚t1|ƒ}|d2u �	r@td‡| j› dˆ�ƒ‚|\}}|d }|dk�	rjd|› d�|› �S dŽ|› d�|› d�|› d‘�S nt2t-| ƒ| ƒ‚d2S )’zãReturn 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 combinatorr8   zany((z) for el in el.ancestors)r9   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   s   g | ]}|d kr|‘qS ©r7   r   ©r   Úexprr   r   r   r   }   s   ýz!_compile_node.<locals>.<listcomp>c                 S   s   g | ]}t |ƒ‘qS r   )r   r
   r   r   r   r   ~   s   ÿr   r   z and c                 s   s   | ]}d |› d�V  qdS ©r<   r=   Nr   )r   Úelr   r   r   Ú	<genexpr>‡   r   z _compile_node.<locals>.<genexpr>c                 S   s   g | ]}|d kr|‘qS r>   r   r?   r   r   r   r   Œ   s   ýc                 S   s   g | ]}t |jƒ‘qS r   ©r   r   r
   r   r   r   r   �   s   ÿznot (z or c                 s   s   | ]}d |› d�V  qdS rA   r   r?   r   r   r   rC   “   r   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   s   g | ]}|d kr|‘qS )r   r   r?   r   r   r   r   ¨   s   ýc                 S   s   g | ]}t |jƒ‘qS r   rD   r
   r   r   r   r   ©   s   ÿc                 s   s   | ]}d |› d�V  qdS rA   r   r?   r   r   r   rC   ¯   r   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el.etree_element.get(z, "")Fz.lower()z in el.etree_element.attribú=z  in el.etree_element.attrib and z == z~=z in split_whitespace(z|=z.startswith(ú-z^=z$=z
.endswith(z*=z in zUnknown attribute operator)Úlinkzany-linkú
local-linkÚaÚarearJ   z. and el.etree_element.get("href") is not None rK   z5and not urlparse(el.etree_element.get("href")).schemeÚenabledZbuttonr   ÚselectÚtextareaÚoptionZoptgroupZ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))ÚvisitedZhoverÚactiveZfocuszfocus-withinzfocus-visibleÚtargetztarget-withinÚcurrentZpastÚfutureZplayingÚpausedZseekingÚ	bufferingZstalledZ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   9  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(rI   r=   Nr   )r   r   r   r   r   rC   H  s   ÿÚofc                 s   s   | ]}t |jƒV  qd S ©NrD   r
   r   r   r   rC   W  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) == z/next(r == 0 and n >= 0    for n, r in [divmod((z) - ú, z)]))3r$   r   r%   r   ÚleftÚ
combinatorr   r&   ZCompoundSelectorr'   ÚlenÚjoinZNegationSelectorÚselector_listZRelationalSelectorr   r   ÚappendZMatchesAnySelectorZSpecificityAdjustmentSelectorr+   r!   r    r,   r"   r*   r   r(   r)   r-   r.   Ú
lower_nameÚreprÚvalueZcase_sensitiveÚlowerÚoperatorÚsplitÚstripÚNotImplementedErrorZPseudoClassSelectorÚhtml_tag_eqZFunctionalPseudoClassSelectorÚ	argumentsÚpopra   Zlower_valuer   r   r   Ú	TypeError)r   Zleft_insiderh   r&   Úsub_expressionsZrelative_selectorÚ
expressionÚelementsÚkeyrq   r.   rp   Zattribute_valuer   r   ÚgrouprL   rQ   ÚlangsÚtokensrb   Únthrl   Zcurrent_listÚargumentÚcountÚresultÚbÚBr   r   r   r   H   s8   





ÿ

ÿ

þÿ
þÿ


ÿþÿ
ÿÿ
ÿÿÿ$þÿÿþþÿÿ
ÿþýÿ
ÿþÿ
ýÿÿÿÿÿ


þ


þ
ÿþÿþÿýÿ
ÿÿÿ
ÿ
ÿÿÿÿr   c                  G   sn   t | ƒdkr0d| d › �}d| d ›d|›d�S d dd	„ | D ƒ¡}d d
d	„ | D ƒ¡}d|› d|› d�S 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 == rE   rg   c                 s   s   | ]}t |ƒV  qd S rf   ©ro   )r   Únr   r   r   rC   ¤  r   zhtml_tag_eq.<locals>.<genexpr>c                 s   s   | ]}t d |› �ƒV  qdS )r‡   Nrˆ   )r   r.   r   r   r   rC   ¥  s   ÿz((el.local_name in (z9)) if el.in_html_document else (el.etree_element.tag in (z)))N)rj   rk   )Zlocal_namesÚtagÚnamesÚtagsr   r   r   rv   œ  s    ÿÿ
þÿÿrv   )N)ÚreÚurllib.parser   Ztinycss2.nthr   Úwebencodingsr   Ú r   r   ÚcompileÚfindallr   r   r	   r   rv   r   r   r   r   Ú<module>   s   
&  V