U
    :g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   7/tmp/pip-unpacked-wheel-xeg67qda/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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   sn	  t | tj rt| j}|dkr$dS |dkrZ| jdkr<d}q| jdk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 nlt | tjrndd t	t| j
D }t|dkr:|d }n0d|krJd}n |rfddd |D }n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rq|jdkrd!}n4|jdkrd"}n"|jdkr(d#}n|jdkr8d$}|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 n~t | tjrd.| jS t | tjr | jd/S t | tjr:d0| jS t | tjr.| jd1k	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#d1kr|	 d4S | j#d5kr2d6|	 d7|S | j#d8krtt|$ dks^|% |krbdS |d9|	 d:S n| j#d;krd<|d=|d> d?|	 d@S | j#dAkr|rd6|	 dB|dS dS n^| j#dCkr|rd6|	 dD|dS dS n4| j#dEkr|r|dF|	 dGS dS ntdH| j#nt&n<t | tj'r| jdIkrtt(dJdKdL}|dM7 }| jdNkrp|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dbkr:dS | jdckrJddS | jdekrZdfS | jdgkrjdhS | jdikrzdjS | jdkkrdlS | jdmkrdnS | jdokrdpS | jdqkrdrS tds| jnt | 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qddzd |D S g }g }|}| j*D ]:}|j,dvkr|j"d{kr||kr|}q|| q|rdd|d t/|D }| jd}krd~| d'}nZ| jdkr2d| d'}n@| jdkrLd| d}n&| jdkrfd| d}ntds| j|d| d7 }np||krtd| j d| jd}krd}nB| jdkrd}n0| jdkrd}n| jdkrd}ntds| jt0|}|d1k	rtd| j d|\}}|d }|dk	rBd| d7| S d| d| d| d@S nt1t,| | d1S )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 combinatorr3   zany((z) for el in el.ancestors)r4   znext(el is not None and (z) for el in [el.parent])r6   z) for el in [el.previous])r5   z!) for el in el.previous_siblings)(z) and ()c                 S   s   g | ]}|d kr|qS r2   r   r   exprr   r   r   r      s   z!_compile_node.<locals>.<listcomp>r   r   z and c                 s   s   | ]}d | dV  qdS r7   r8   Nr   )r   er   r   r   	<genexpr>   s     z _compile_node.<locals>.<genexpr>c                 S   s   g | ]}|d kr|qS r9   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>      s     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>      s     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arearE   z. and el.etree_element.get("href") is not None rF   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 k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(rD   r8   Nr   )r   r   r   r   r   r>   Q  s   Zofc                 s   s   | ]}t |jV  qd S Nr?   r
   r   r   r   r>   `  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   leftZ
combinatorr   r!   ZCompoundSelectormapr"   lenjoinZNegationSelectorselector_listZRelationalSelectorr   r   appendZMatchesAnySelectorZSpecificityAdjustmentSelectorr&   r   r   r'   r   r%   r   r#   r$   r(   r)   Z
lower_namereprvalueoperatorsplitstripNotImplementedErrorZPseudoClassSelectorhtml_tag_eqZFunctionalPseudoClassSelector	argumentspopr[   Zlower_valuer   r   r   	TypeError)r   Zleft_insidera   r!   Zsub_expressionsr   Zrelative_selectorZ
expressionelementskeylowerr)   rh   r   grouprG   rL   Zlangstokensr\   Znthre   Zcurrent_listargumentcountresultbBr   r   r   r   K   s   















 
          













r   c                  G   sl   t | dkr.d| 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 == r@   r`   c                 s   s   | ]}t |V  qd S r_   rg   r   nr   r   r   r>     s     zhtml_tag_eq.<locals>.<genexpr>c                 s   s   | ]}t d | V  qdS )r{   Nr|   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   rm     s    
rm   )N)reurllib.parser   Ztinycss2.nthr   webencodingsr    r   r   compilefindallr   r   r	   r   rm   r   r   r   r   <module>   s   
&  \