a
    ):M]!f                     @   s(  d Z ddlZddlZddlZejd dk r4eZeZne	Ze
Zdd ZG dd deZG dd	 d	eeZG d
d deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZedZedZed Zd!d" Zd#d$ Z d%d& Z!dKd(d)Z"d*d+ Z#d,d- Z$d.d/ Z%G d0d1 d1e&Z'G d2d3 d3e'Z(G d4d5 d5Z)d6d7 Z*e*d8Z+e*d9Z,e*d:Z-e*d;Z.e*d<e*d=d>Z/ed?j0Z1ee)j2ej3j0Z4ed@j0Z5e6dAdBZ7dCdD Z8dEdF Z9dGdH Z:G dIdJ dJeZ;dS )La  
    cssselect.parser
    ================

    Tokenizer, parser and parsed objects for CSS selectors.


    :copyright: (c) 2007-2012 Ian Bicking and contributors.
                See AUTHORS for more details.
    :license: BSD, see LICENSE for more details.

    N   c                 C   s   |  d dS )z(Lower-case, but only in the ASCII range.utf8)encodelowerdecode)string r   /lib/python3.9/site-packages/cssselect/parser.pyascii_lower   s    r
   c                   @   s   e Zd ZdZdS )SelectorErrorzCommon parent for :class:`SelectorSyntaxError` and
    :class:`ExpressionError`.

    You can just use ``except SelectorError:`` when calling
    :meth:`~GenericTranslator.css_to_xpath` and handle both exceptions types.

    N__name__
__module____qualname____doc__r   r   r   r	   r   !   s   r   c                   @   s   e Zd ZdZdS )SelectorSyntaxErrorz3Parsing a selector that does not match the grammar.Nr   r   r   r   r	   r   *   s   r   c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )Selectoru"  
    Represents a parsed selector.

    :meth:`~GenericTranslator.selector_to_xpath` accepts this object,
    but ignores :attr:`pseudo_element`. It is the user’s responsibility
    to account for pseudo-elements and reject selectors with unknown
    or unsupported pseudo-elements.

    Nc                 C   s*   || _ |d ur t|ts t|}|| _d S N)parsed_tree
isinstanceFunctionalPseudoElementr
   pseudo_element)selfZtreer   r   r   r	   __init__:   s    
zSelector.__init__c                 C   sB   t | jtrt| j}n| jr*d| j }nd}d| jj| j|f S )N::%s z%s[%r%s])r   r   r   repr	__class__r   r   )r   r   r   r   r	   __repr__U   s    zSelector.__repr__c                 C   s^   t | jtrd| j  }n| jr.d| j }nd}d| j |f }t|dkrZ|d}|S )zAReturn a CSS representation for this selector (a string)
        r   r   z%s%s   *)r   r   r   	canonicalr   lenlstrip)r   r   resr   r   r	   r!   _   s    
zSelector.canonicalc                 C   s(   | j  \}}}| jr|d7 }|||fS )zReturn the specificity_ of this selector as a tuple of 3 integers.

        .. _specificity: http://www.w3.org/TR/selectors/#specificity

        r   )r   specificityr   r   abcr   r   r	   r%   m   s    zSelector.specificity)Nr   r   r   r   r   r   r!   r%   r   r   r   r	   r   0   s
   	

r   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Classz(
    Represents selector.class_name
    c                 C   s   || _ || _d S r   )selector
class_name)r   r,   r-   r   r   r	   r   }   s    zClass.__init__c                 C   s   d| j j| j| jf S )Nz	%s[%r.%s])r   r   r,   r-   r   r   r   r	   r      s    zClass.__repr__c                 C   s   d| j  | jf S )Nz%s.%s)r,   r!   r-   r.   r   r   r	   r!      s    zClass.canonicalc                 C   s"   | j  \}}}|d7 }|||fS Nr   r,   r%   r&   r   r   r	   r%      s    zClass.specificityNr*   r   r   r   r	   r+   y   s
   r+   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )r   ax  
    Represents selector::name(arguments)

    .. attribute:: name

        The name (identifier) of the pseudo-element, as a string.

    .. attribute:: arguments

        The arguments of the pseudo-element, as a list of tokens.

        **Note:** tokens are not part of the public API,
        and may change between cssselect versions.
        Use at your own risks.

    c                 C   s   t || _|| _d S r   )r
   name	arguments)r   r1   r2   r   r   r	   r      s    
z FunctionalPseudoElement.__init__c                 C   s    d| j j| jdd | jD f S )Nz%s[::%s(%r)]c                 S   s   g | ]
}|j qS r   value.0tokenr   r   r	   
<listcomp>       z4FunctionalPseudoElement.__repr__.<locals>.<listcomp>)r   r   r1   r2   r.   r   r   r	   r      s    
z FunctionalPseudoElement.__repr__c                 C   s   dd | j D S )Nc                 S   s   g | ]
}|j qS r   typer5   r   r   r	   r8      r9   z:FunctionalPseudoElement.argument_types.<locals>.<listcomp>r2   r.   r   r   r	   argument_types   s    z&FunctionalPseudoElement.argument_typesc                 C   s$   d dd | jD }d| j|f S )Nr   c                 s   s   | ]}|  V  qd S r   cssr5   r   r   r	   	<genexpr>   r9   z4FunctionalPseudoElement.canonical.<locals>.<genexpr>z%s(%s))joinr2   r1   r   argsr   r   r	   r!      s    z!FunctionalPseudoElement.canonicalc                 C   s"   | j  \}}}|d7 }|||fS r/   r0   r&   r   r   r	   r%      s    z#FunctionalPseudoElement.specificityN	r   r   r   r   r   r   r=   r!   r%   r   r   r   r	   r      s   r   c                   @   s8   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d ZdS )Functionz(
    Represents selector:name(expr)
    c                 C   s   || _ t|| _|| _d S r   )r,   r
   r1   r2   )r   r,   r1   r2   r   r   r	   r      s    
zFunction.__init__c                 C   s$   d| j j| j| jdd | jD f S )Nz%s[%r:%s(%r)]c                 S   s   g | ]
}|j qS r   r3   r5   r   r   r	   r8      r9   z%Function.__repr__.<locals>.<listcomp>)r   r   r,   r1   r2   r.   r   r   r	   r      s    zFunction.__repr__c                 C   s   dd | j D S )Nc                 S   s   g | ]
}|j qS r   r:   r5   r   r   r	   r8      r9   z+Function.argument_types.<locals>.<listcomp>r<   r.   r   r   r	   r=      s    zFunction.argument_typesc                 C   s,   d dd | jD }d| j | j|f S )Nr   c                 s   s   | ]}|  V  qd S r   r>   r5   r   r   r	   r@      r9   z%Function.canonical.<locals>.<genexpr>z	%s:%s(%s))rA   r2   r,   r!   r1   rB   r   r   r	   r!      s    zFunction.canonicalc                 C   s"   | j  \}}}|d7 }|||fS r/   r0   r&   r   r   r	   r%      s    zFunction.specificityNrD   r   r   r   r	   rE      s   rE   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Pseudoz#
    Represents selector:ident
    c                 C   s   || _ t|| _d S r   )r,   r
   ident)r   r,   rG   r   r   r	   r      s    zPseudo.__init__c                 C   s   d| j j| j| jf S )Nz	%s[%r:%s])r   r   r,   rG   r.   r   r   r	   r      s    zPseudo.__repr__c                 C   s   d| j  | jf S )Nz%s:%s)r,   r!   rG   r.   r   r   r	   r!      s    zPseudo.canonicalc                 C   s"   | j  \}}}|d7 }|||fS r/   r0   r&   r   r   r	   r%      s    zPseudo.specificityNr*   r   r   r   r	   rF      s
   rF   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Negationz.
    Represents selector:not(subselector)
    c                 C   s   || _ || _d S r   )r,   subselector)r   r,   rI   r   r   r	   r      s    zNegation.__init__c                 C   s   d| j j| j| jf S )Nz%s[%r:not(%r)])r   r   r,   rI   r.   r   r   r	   r      s    zNegation.__repr__c                 C   s2   | j  }t|dkr |d}d| j |f S )Nr   r    z
%s:not(%s))rI   r!   r"   r#   r,   r   Zsubselr   r   r	   r!      s    

zNegation.canonicalc                 C   s6   | j  \}}}| j \}}}|| || || fS r   r,   r%   rI   r   Za1b1Zc1Za2b2Zc2r   r   r	   r%      s    zNegation.specificityNr*   r   r   r   r	   rH      s
   rH   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Attribz>
    Represents selector[namespace|attrib operator value]
    c                 C   s"   || _ || _|| _|| _|| _d S r   )r,   	namespaceattriboperatorr4   )r   r,   rP   rQ   rR   r4   r   r   r	   r     s
    zAttrib.__init__c                 C   s^   | j rd| j | jf }n| j}| jdkr<d| jj| j|f S d| jj| j|| j| jjf S d S )N%s|%sexistsz
%s[%r[%s]]z%s[%r[%s %s %r]])rP   rQ   rR   r   r   r,   r4   )r   rQ   r   r   r	   r     s    

zAttrib.__repr__c                 C   sV   | j rd| j | jf }n| j}| jdkr.|}nd|| j| j f }d| j |f S )NrS   rT   z%s%s%s%s[%s])rP   rQ   rR   r4   r?   r,   r!   )r   rQ   opr   r   r	   r!     s    
zAttrib.canonicalc                 C   s"   | j  \}}}|d7 }|||fS r/   r0   r&   r   r   r	   r%   "  s    zAttrib.specificityNr*   r   r   r   r	   rO      s
   rO   c                   @   s2   e Zd ZdZdddZdd Zdd Zd	d
 ZdS )ElementzU
    Represents namespace|element

    `None` is for the universal selector '*'

    Nc                 C   s   || _ || _d S r   )rP   element)r   rP   rX   r   r   r	   r   /  s    zElement.__init__c                 C   s   d| j j|  f S )NrU   )r   r   r!   r.   r   r   r	   r   3  s    zElement.__repr__c                 C   s"   | j pd}| jrd| j|f }|S )Nr    rS   )rX   rP   )r   rX   r   r   r	   r!   6  s    
zElement.canonicalc                 C   s   | j r
dS dS d S )N)r   r   r   )r   r   r   rX   r.   r   r   r	   r%   <  s    zElement.specificity)NNr*   r   r   r   r	   rW   (  s
   
rW   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )Hashz 
    Represents selector#id
    c                 C   s   || _ || _d S r   )r,   id)r   r,   r[   r   r   r	   r   G  s    zHash.__init__c                 C   s   d| j j| j| jf S )Nz	%s[%r#%s])r   r   r,   r[   r.   r   r   r	   r   K  s    zHash.__repr__c                 C   s   d| j  | jf S )Nz%s#%s)r,   r!   r[   r.   r   r   r	   r!   O  s    zHash.canonicalc                 C   s"   | j  \}}}|d7 }|||fS r/   r0   r&   r   r   r	   r%   R  s    zHash.specificityNr*   r   r   r   r	   rZ   C  s
   rZ   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
CombinedSelectorc                 C   s"   |d usJ || _ || _|| _d S r   )r,   
combinatorrI   )r   r,   r]   rI   r   r   r	   r   Y  s    zCombinedSelector.__init__c                 C   s.   | j dkrd}n| j }d| jj| j|| jf S )N z
<followed>z%s[%r %s %r])r]   r   r   r,   rI   )r   Zcombr   r   r	   r   _  s    
zCombinedSelector.__repr__c                 C   s6   | j  }t|dkr |d}d| j | j|f S )Nr   r    z%s %s %s)rI   r!   r"   r#   r,   r]   rJ   r   r   r	   r!   g  s    

zCombinedSelector.canonicalc                 C   s6   | j  \}}}| j \}}}|| || || fS r   rK   rL   r   r   r	   r%   n  s    zCombinedSelector.specificityN)r   r   r   r   r   r!   r%   r   r   r   r	   r\   X  s   r\   z%^[ \t\r\n\f]*([a-zA-Z]+)[ \t\r\n\f]*$z6^[ \t\r\n\f]*([a-zA-Z]*)#([a-zA-Z0-9_-]+)[ \t\r\n\f]*$z?^[ \t\r\n\f]*([a-zA-Z]*)\.([a-zA-Z][a-zA-Z0-9_-]*)[ \t\r\n\f]*$c                 C   s   t | }|r$tt|ddgS t| }|dur\ttt|dpHdd|dgS t| }|durttt|dpdd|dgS t	t
| }| |_tt|S )a  Parse a CSS *group of selectors*.

    If you don't care about pseudo-elements or selector specificity,
    you can skip this and use :meth:`~GenericTranslator.css_to_xpath`.

    :param css:
        A *group of selectors* as an Unicode string.
    :raises:
        :class:`SelectorSyntaxError` on invalid selectors.
    :returns:
        A list of parsed :class:`Selector` objects, one for each
        selector in the comma-separated group.

    r   rY   N   )_el_rematchr   rW   group_id_rerZ   	_class_rer+   TokenStreamtokenizesourcelistparse_selector_group)r?   ra   streamr   r   r	   parse  s     


rk   c                 c   s<   |    tt|  V  |  dkr8|   |    qq8qd S )NDELIM,)skip_whitespacer   parse_selectorpeeknext)rj   r   r   r	   ri     s    
ri   c                 C   s~   t | \}}|   |  }|dv r&qv|r6td| |dddrX|  j}|   nd}t | \}}t|||}q||fS )N))EOFNrl   4Got pseudo-element ::%s not at the end of a selector+>~r^   )parse_simple_selectorro   rq   r   is_delimrr   r4   r\   )rj   resultr   rq   r]   Znext_selectorr   r   r	   rp     s$    

rp   Fc                 C   s  |    t| j}|  }|jdks,|dkrv|jdkrB|  j}n|   d }|  dkrl|   |  }q~|}d }nd  }}t||}d }|  }|jdv s|	dddds|r|d	krq|rt
d
| |jdkrt||  j}q|dkr|   t||  }q|dkr.|   td |  }q|dkrL|   t|| }q|dkr|   |  dkr|   |  }|  dkr|   t|t| }q|  }| dv rt|}q|  dkrt||}| dkrt| jdkst| jdkr| jd jdkst
dq|   |    | dkr|rHt
dt| dd\}	}
|  }|
rxt
d|
|jf |d	krt
d|f t||	}nt||t| }qt
d|f qt| j|krt
d|  f ||fS )NIDENTrm   r    rm   |)Srs   rn   ru   rv   rw   rm   )rt   HASH)rm   .)rm   [)rm   :)rm   ()z
first-linezfirst-letterbeforeZafterzPseudo[Element[*]:scope]r_   r   r   r   zJGot immediate child pseudo-element ":scope" not at the start of a selectornotzGot nested :not()T)inside_negationz+Got pseudo-element ::%s inside :not() at %szExpected ')', got %szExpected selector, got %s)ro   r"   usedrq   r;   rr   r4   next_ident_or_starrW   ry   r   rZ   r+   
next_identparse_attribr   parse_argumentsr   _unicoderF   r   rx   posrH   rE   )rj   r   Zselector_startrq   rP   rX   rz   r   rG   argumentZargument_pseudo_elementrr   r   r   r	   rx     s    











rx   c                 C   sR   g }|    |  }|jdv s&|dv r2|| q|dkr>|S td|f qd S )N)r{   STRINGNUMBER))rm   ru   )rm   -r   zExpected an argument, got %s)ro   rr   r;   appendr   )rj   r2   rr   r   r   r	   r   (  s    r   c                 C   sf  |   | }|d u r6| dkr6td| f | dkrz|  | dkrhd }|  d}q|}| }d }nd  }}|d u r|   | }|dkrt| ||dd S |dkrd}nB|dd	d
dddr| dkr|jd }|  ntd|f |   | }|j	dvr.td|f |   | }|dkrVtd|f t| ||||S )Nr}   zExpected '|', got %s)rm   =z|=)rm   ]rT   r   ^$r    rw   r~   !zOperator expected, got %s)r{   r   z Expected string or ident, got %szExpected ']', got %s)
ro   r   rq   r   rr   r   rO   ry   r4   r;   )r,   rj   rQ   rP   rV   rr   r4   r   r   r	   r   7  sX    




r   c                 C   s   | D ]}|j dkrtdqddd | D  }|dkr@dS |dkrLd	S |d
krXdS d
|vrldt|fS |d
d\}}|sd}n&|dks|dkrt|d }nt|}|sd}nt|}||fS )zv
    Parses the arguments for :nth-child() and friends.

    :raises: A list of tokens
    :returns: :``(a, b)``

    r   z$String tokens not allowed in series.r   c                 s   s   | ]}|j V  qd S r   r3   r5   r   r   r	   r@   o  r9   zparse_series.<locals>.<genexpr>Zodd)r_   r   Zeven)r_   r   n)r   r   r   r   r   ru   1)r;   
ValueErrorrA   stripintsplit)tokensr7   sr'   r(   r   r   r	   parse_seriesd  s,    

r   c                   @   sH   e Zd Zdd Zdd Zdd ZeedZ	eedZ
d	d
 ZdS )Tokenc                 C   s   t | ||f}||_|S r   )tuple__new__r   )clstype_r4   r   objr   r   r	   r     s    zToken.__new__c                 C   s   d| j | j| jf S )Nz<%s '%s' at %i>)r;   r4   r   r.   r   r   r	   r     s    zToken.__repr__c                 G   s   | j dko| j|v S )Nrm   )r;   r4   )r   valuesr   r   r	   ry     s    zToken.is_delimr   r   c                 C   s   | j dkrt| jS | jS d S )Nr   )r;   r   r4   r.   r   r   r	   r?     s    

z	Token.cssN)r   r   r   r   r   ry   propertyrR   
itemgetterr;   r4   r?   r   r   r   r	   r     s   r   c                   @   s   e Zd Zdd Zdd ZdS )EOFTokenc                 C   s   t | dd |S )Nrs   )r   r   )r   r   r   r   r	   r     s    zEOFToken.__new__c                 C   s   d| j | jf S )Nz
<%s at %i>)r;   r   r.   r   r   r	   r     s    zEOFToken.__repr__N)r   r   r   r   r   r   r   r   r	   r     s   r   c                   @   s<   e Zd ZdZed Zde ZdZdeef Zdeef ZdS )TokenMacrosz&\\([0-9a-f]{1,6})(?:\r\n|[ \n\r\t\f])?z|\\[^\n\r\f0-9a-f]z\\(?:\n|\r\n|\r|\f)|z
[^\0-\177]z[_a-z0-9-]|%s|%sz[_a-z]|%s|%sN)	r   r   r   unicode_escapeescapeZstring_escapeZnonasciiZnmcharZnmstartr   r   r   r	   r     s   r   c                 C   s   t | tt t jjS r   )recompilevarsr   
IGNORECASEra   )patternr   r   r	   _compile  s    r   z[ \t\r\n\f]+z[+-]?(?:[0-9]*\.[0-9]+|[0-9]+)z#(?:%(nmchar)s)+z -?(?:%(nmstart)s)(?:%(nmchar)s)*z!([^\n\r\f\\']|%(string_escape)s)*z!([^\n\r\f\\"]|%(string_escape)s)*)'"z\\(.)z\\(?:\n|\r\n|\r|\f)rb   r   c                 C   s&   t | dd}|tjkrd}t|S )Nr      i  )r   rb   sys
maxunicode_unichr)ra   Z	codepointr   r   r	   _replace_unicode  s    
r   c                 C   s   t t| } tt| } | S r   )_sub_unicode_escaper   _sub_simple_escape_replace_simpler3   r   r   r	   unescape_ident  s    

r   c                 c   s  d}t | }||k rt| |d}|r>tdd|V  | }qt| |d}|rztttt|	 }td||V  | }qt
| |d}|rtttt|	 dd  }td||V  | }q| | }|tv rZt| | |d d}|sJ d| }||krtd	| | | |kr(td
| tttttd|	 }td||V  |d }qt| |d}|r|	 }td||V  | }q|d }| || dkr| d|}|dkr|}q|d7 }qtd| | |V  |d7 }q||ksJ t|V  d S )Nr   )r   r   r^   r{   r   r   z)Should have found at least an empty matchzUnclosed string at %szInvalid string at %sr   r   r   r_   z/*z*/rm   )r"   _match_whitespacer   end_match_identr   r   r   r   rb   _match_hash_match_string_by_quoter   _sub_newline_escape_match_numberfindr   )r   r   Zlen_sra   r4   quoteZend_posZpos2r   r   r	   rf     st    




rf   c                   @   s>   e Zd ZdddZdd Zdd Zdd	 Zd
d Zdd ZdS )re   Nc                 C   sR   g | _ t|| _|| _d | _d| _z| jj| _W n tyL   | jj	| _Y n0 d S NF)
r   iterr   rg   peeked_peekingrr   
next_tokenAttributeError__next__)r   r   rg   r   r   r	   r     s    
zTokenStream.__init__c                 C   s<   | j r d| _ | j| j | jS |  }| j| |S d S r   )r   r   r   r   r   r   rr   r   r   r	   rr      s    zTokenStream.nextc                 C   s   | j s|  | _d| _ | jS )NT)r   r   r   r.   r   r   r	   rq   *  s    
zTokenStream.peekc                 C   s&   |   }|jdkr td|f |jS )Nr{   zExpected ident, got %s)rr   r;   r   r4   r   r   r   r	   r   0  s    
zTokenStream.next_identc                 C   s6   |   }|jdkr|jS |dkr$d S td|f d S )Nr{   r|   zExpected ident or '*', got %s)rr   r;   r4   r   r   r   r   r	   r   6  s    
zTokenStream.next_ident_or_starc                 C   s   |   }|jdkr|   d S )Nr   )rq   r;   rr   )r   rq   r   r   r	   ro   @  s    
zTokenStream.skip_whitespace)N)	r   r   r   r   rr   rq   r   r   ro   r   r   r   r	   re     s   


re   )F)<r   r   r   rR   version_infoZunicoder   Zunichrr   strchrr
   	Exceptionr   SyntaxErrorr   objectr   r+   r   rE   rF   rH   rO   rW   rZ   r\   r   r`   rc   rd   rk   ri   rp   rx   r   r   r   r   r   r   r   r   r   r   r   r   r   subr   r   Ir   r   methodcallerr   r   r   rf   re   r   r   r   r	   <module>   sh   	I'+

(

]-%A