a
    [XhI                     @   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   X/var/www/viveiro_mudafortebrasil/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| _
qt|tjr|j| _qt|tjr|j| _|j| _qt|tjr|j| _qt|tjr|jdkrd| _qd S )N0)split_whitespacer   r   zlambda el: FlangT)_compile_nodeparsed_treeZnever_matchesr   r   r   evaltestZspecificityZpseudo_elementid
class_name
local_namelower_local_name	namespaceZ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__r.   r   r   r   r   r	   "   s   r	   c              
   C   s	  t | tj rt| j}|dkr$dS |dkrZ| jdv r<d}q| jdv rLd}qtd| jnl| jdkrrd	| d
}nT| jdkrd| d}n<| jdkrd| d}n$| jdkrd	| d}ntd| jt| j}|dkrdS |dkr|S d| d| dS nt | 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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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( qd |S t | tjtjfrd)d d*d | jD D }|sdS d d+d |D S t | tjr| j| jkrd,| jS d-| jd.| jdS nt | 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rt d3| j d4| j }n:d3| j d4| j }	d3| j d4| j }
d|	d.|
d}n:| j| jkrt | 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rt
|% dks|& |krd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 rt)dIdJdK}|dL7 }| jdMkr|dN7 }|S | jdOkrt)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rdeS | jdfkrdgS | jdhkrdiS | jdjkrdkS | jdlkrdmS | jdnkrdoS | jdpkrdqS tdr| jnt | tj*	r| jdskrg }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|rdd{d t0|D }| jd|kr@d}| d(}nZ| jd~krZd| d(}n@| jdkrtd| d}n&| jdkrd| d}ntdr| j|d| d7 }np||u rtd| j d| jd|krd}nB| jd~krd}n0| jdkrd}n| jdk	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 )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 combinatorr4   zany((z) for el in el.ancestors)r5   znext(el is not None and (z) for el in [el.parent])r7   z) for el in [el.previous])r6   z!) for el in el.previous_siblings)(z) and ()c                 S   s   g | ]}|d kr|qS r3   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 r8   r9   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 r=   r   r;   r   r   r   r?      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   r@   r
   r   r   r   r      s   c                 s   s   | ]}d | dV  qdS r=   r   r;   r   r   r   r?      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arearF   z. and el.etree_element.get("href") is not None rG   z5and not urlparse(el.etree_element.get("href")).schemeZenabledbuttonr   selecttextareaoption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playingZpausedZseeking	bufferingZstalledZmutedzvolume-lockedz
user-validzuser-invalid)rootZ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(rE   r9   Nr   )r   r   r   r   r   r?   H  s   Zofc                 s   s   | ]}t |jV  qd S Nr@   r
   r   r   r   r?   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   leftZ
combinatorr   r"   ZCompoundSelectorr#   lenjoinZNegationSelectorselector_listZRelationalSelectorr   r   appendZMatchesAnySelectorZSpecificityAdjustmentSelectorr'   r   r   r(   r   r&   r   r$   r%   r)   r*   Z
lower_namereprvalueZcase_sensitiveloweroperatorsplitstripNotImplementedErrorZPseudoClassSelectorhtml_tag_eqZFunctionalPseudoClassSelector	argumentspopr\   Zlower_valuer   r   r   	TypeError)r   Zleft_insiderb   r"   Zsub_expressionsZrelative_selectorZ
expressionelementskeyri   r*   rh   Zattribute_valuer   r   grouprH   rM   Zlangstokensr]   Znthre   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 == rA   ra   c                 s   s   | ]}t |V  qd S r`   rg   )r   nr   r   r   r?     r   zhtml_tag_eq.<locals>.<genexpr>c                 s   s   | ]}t d | V  qdS )r{   Nr|   )r   r*   r   r   r   r?     s   z((el.local_name in (z9)) if el.in_html_document else (el.etree_element.tag in (z)))N)rc   rd   )Zlocal_namestagnamestagsr   r   r   rn     s    
rn   )N)reurllib.parser   Ztinycss2.nthr   webencodingsr    r   r   compilefindallr   r   r	   r   rn   r   r   r   r   <module>   s   
&  V