o
    Zh0hI                     @   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      g | ]}t |qS  )CompiledSelector.0selectorr	   r	   I/var/www/html/rh/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__r5   r	   r	   r	   r   r
   "   s    r
   c              
   C   sf	  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 dd | j	D 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rd#}n|jdkrd$}n|jdkrd%}|d&| d'| d( qd |S t | tjtjfrCd)d d*d | jD D }|s9dS d d+d |D S t | tjrb| j| jkrWd,| jS d-| jd.| jdS t | tjrod/| jS t | tjr|| jd0S t | tjrd1| jS t | tjr| jd2ur| 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r;t
|% dks1|& |kr3dS |d>| dS | j$d?krT| d;| d<|d | d@|dA d
S | j$dBkrg|re| d@|dS dS | j$dCkrz|rx| dD|dS dS | j$dEkr|r|dF| S dS tdG| j$t't | tj(rc| 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rt)dPdQdRdSdT}t)dUdVdW}d| d\| d]S | jd^krt)dQdV}t)dT}d| d_| d`S | jdav rdS | jdbv r"dcS | jddkr*deS | jdfkr2dgS | jdhkr;	 diS | jdjkrD	 dkS | jdlkrLdmS | jdnkrU	 doS | jdpkr]dqS tdr| jt | tj*r| jdskrg }dtd | j+D }|r|,d}|j-dukr||j. n|j-dvkr|t/|j! ntdw|r|,d}|j-dukr|j!dxkrtdw|s}d dyd |D S g }g }|}| j+D ]}|j-dukr|j!dzkr||u r|}q|| q|rAdd{d t0|D }| jd|krd}| d(}n-| jd~krd| d(}n | jdkr%d| d}n| jdkr2d| d}ntdr| j|d| d7 }n8||u rOtd| j d| jd|krXd}n!| jd~krad}n| jdkrjd}n| jdkrsd}ntdr| jt1|}|d2u rtd| j d|\}}|d }|dkrd| d| S d| d| d| dS t2t-| | )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 r:   r	   r   exprr	   r	   r   r   }   
    z!_compile_node.<locals>.<listcomp>c                 S   r   r	   )r   r   r	   r	   r   r   ~   s    r   r   z and c                 s       | ]	}d | dV  qdS r?   r@   Nr	   )r   elr	   r	   r   	<genexpr>       z _compile_node.<locals>.<genexpr>c                 S   rA   rB   r	   rC   r	   r	   r   r      rE   c                 S      g | ]}t |jqS r	   r   r   r   r	   r	   r   r          znot (z or c                 s   rF   rG   r	   rC   r	   r	   r   rI      rJ   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   rA   )r   r	   rC   r	   r	   r   r      rE   c                 S   rK   r	   rL   r   r	   r	   r   r      rM   c                 s   rF   rG   r	   rC   r	   r	   r   rI      rJ   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arearS   z. and el.etree_element.get("href") is not None rT   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   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(rR   r@   Nr	   )r   r   r	   r	   r   rI   H  s
    
ofc                 s   s    | ]}t |jV  qd S NrL   r   r	   r	   r   rI   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&   CompoundSelectorr'   lenjoinNegationSelectorselector_listRelationalSelectorr   r   appendMatchesAnySelectorSpecificityAdjustmentSelectorr+   r!   r    r,   r"   r*   r   r(   r)   r-   r.   
lower_namereprvaluecase_sensitiveloweroperatorsplitstripNotImplementedErrorPseudoClassSelectorhtml_tag_eqFunctionalPseudoClassSelector	argumentspoprt   lower_valuer   r   r   	TypeError)r   left_insider{   r&   sub_expressionsrelative_selector
expressionelementskeyr   r.   r   attribute_valuer   r   grouprU   r[   langstokensru   nthr   current_listargumentcountresultbBr	   r	   r   r   H   s@  















"












r   c                  G   sj   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 == rN   rz   c                 s   s    | ]}t |V  qd S ry   r   )r   nr	   r	   r   rI     s    zhtml_tag_eq.<locals>.<genexpr>c                 s   s    | ]
}t d | V  qdS )r   Nr   )r   r.   r	   r	   r   rI     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   ry   )reurllib.parser   tinycss2.nthr   webencodingsr    r   r   compilefindallr   r   r
   r   r   r	   r	   r	   r   <module>   s    
&  V