a
    $i                     @  s$  d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	m
Z
mZmZmZ erpddlmZmZmZ ddlmZ dddd	d
ZG dd deZG dd deeZed Zedef ZG dd dZG dd dZG dd dZG dd dZG dd dZ G dd dZ!G dd dZ"G dd dZ#G d d! d!Z$G d"d# d#Z%G d$d% d%Z&G d&d' d'Z'G d(d) d)Z(e)d*Z*e)d+Z+e)d,Z,dd-d.d/d0Z-d1d2d3d4d5Z.d1d6d3d7d8Z/drd1d:d6d;d<d=Z0d1d>d3d?d@Z1d1dAd3dBdCZ2d1dDd3dEdFZ3dGd1d#dHdIdJZ4dKdLdMdNdOZ5G dPdQ dQe6ee	e f Z7G dRdS dSe7Z8G dTdU dUZ9G dVdW dWe
Z:ddWdXdYdZZ;e;d[Z<e;d\Z=e;d]Z>e;d^Z?e;d_e;d`daZ@e)dbjAZBe)e9jCejDjAZEe)dcjAZFeGdddeZHdfddgdhdiZIdddjdkdlZJddmdndodpZKG dqd1 d1ZLdS )sz
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.

    )annotationsN)TYPE_CHECKINGLiteralOptionalProtocolUnioncastoverload)IterableIteratorSequence)Selfstr)stringreturnc                 C  s   |  d dS )z(Lower-case, but only in the ASCII range.utf8)encodelowerdecode)r    r   ^/var/www/staging/api/virtual_environments/venv/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   )ElementHashClassFunctionPseudoAttribNegationRelationMatchingSpecificityAdjustmentCombinedSelectorFunctionalPseudoElementc                   @  sN   e Zd ZdZdddddddZd	d
ddZd	d
ddZdd
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.

    NTreezPseudoElement | NoneNone)treepseudo_elementr   c                 C  s*   || _ |d ur t|ts t|}|| _d S N)parsed_tree
isinstancer*   r   r/   )selfr.   r/   r   r   r   __init__L   s    
zSelector.__init__r   r   c                 C  sJ   t | jtrt| j}n| jr,d| j }nd}| jj d| j| dS )N:: [])r2   r/   r*   repr	__class__r   r1   )r3   r/   r   r   r   __repr__h   s    zSelector.__repr__c                 C  sb   t | jtrd| j  }n| jr2d| j }nd}| j  | }t|dkr^|d}|S )z8Return a CSS representation for this selector (a string)r6   r7      *)r2   r/   r*   	canonicalr1   lenlstrip)r3   r/   resr   r   r   r?   q   s    
zSelector.canonicaltuple[int, int, int]c                 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=   )r1   specificityr/   r3   abcr   r   r   rD   ~   s    zSelector.specificity)Nr   r   r   r   r4   r<   r?   rD   r   r   r   r   r+   A   s
   
	r+   c                   @  sL   e Zd ZdZddddddZddd	d
ZddddZddddZdS )r!   z(
    Represents selector.class_name
    r,   r   r-   )selector
class_namer   c                 C  s   || _ || _d S r0   )rJ   rK   )r3   rJ   rK   r   r   r   r4      s    zClass.__init__r5   c                 C  s   | j j d| jd| j dS )Nr8   .r9   )r;   r   rJ   rK   r3   r   r   r   r<      s    zClass.__repr__c                 C  s   | j   d| j S )NrL   )rJ   r?   rK   rM   r   r   r   r?      s    zClass.canonicalrC   c                 C  s"   | j  \}}}|d7 }|||fS Nr=   rJ   rD   rE   r   r   r   rD      s    zClass.specificityNrI   r   r   r   r   r!      s
   r!   c                   @  sJ   e Zd ZdZdddddZdddd	Zd
dddZdd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.

    r   Sequence[Token])name	argumentsc                 C  s   t || _|| _d S r0   )r   rQ   rR   )r3   rQ   rR   r   r   r   r4      s    
z FunctionalPseudoElement.__init__r5   c                 C  s,   dd | j D }| jj d| j d|dS )Nc                 S  s   g | ]
}|j qS r   value.0tokenr   r   r   
<listcomp>       z4FunctionalPseudoElement.__repr__.<locals>.<listcomp>z[::()])rR   r;   r   rQ   r3   Ztoken_valuesr   r   r   r<      s    z FunctionalPseudoElement.__repr__	list[str]c                 C  s   dd | j D S )Nc                 S  s   g | ]
}|j qS r   typerU   r   r   r   rX      rY   z:FunctionalPseudoElement.argument_types.<locals>.<listcomp>rR   rM   r   r   r   argument_types   s    z&FunctionalPseudoElement.argument_typesc                 C  s(   d dd | jD }| j d| dS )Nr7   c                 s  s   | ]}|  V  qd S r0   cssrU   r   r   r   	<genexpr>   rY   z4FunctionalPseudoElement.canonical.<locals>.<genexpr>rZ   ))joinrR   rQ   r3   argsr   r   r   r?      s    z!FunctionalPseudoElement.canonicalN)r   r   r   r   r4   r<   ra   r?   r   r   r   r   r*      s
   c                   @  s\   e Zd ZdZdddddddZdd	d
dZdd	ddZdd	ddZdd	ddZdS )r"   z(
    Represents selector:name(expr)
    r,   r   rP   r-   )rJ   rQ   rR   r   c                 C  s   || _ t|| _|| _d S r0   )rJ   r   rQ   rR   )r3   rJ   rQ   rR   r   r   r   r4      s    
zFunction.__init__r5   c                 C  s4   dd | j D }| jj d| jd| j d|dS )Nc                 S  s   g | ]
}|j qS r   rS   rU   r   r   r   rX      rY   z%Function.__repr__.<locals>.<listcomp>r8   :rZ   r[   )rR   r;   r   rJ   rQ   r\   r   r   r   r<      s    zFunction.__repr__r]   c                 C  s   dd | j D S )Nc                 S  s   g | ]
}|j qS r   r^   rU   r   r   r   rX      rY   z+Function.argument_types.<locals>.<listcomp>r`   rM   r   r   r   ra      s    zFunction.argument_typesc                 C  s4   d dd | jD }| j  d| j d| dS )Nr7   c                 s  s   | ]}|  V  qd S r0   rb   rU   r   r   r   rd      rY   z%Function.canonical.<locals>.<genexpr>ri   rZ   re   )rf   rR   rJ   r?   rQ   rg   r   r   r   r?      s    zFunction.canonicalrC   c                 C  s"   | j  \}}}|d7 }|||fS rN   rO   rE   r   r   r   rD      s    zFunction.specificityN)	r   r   r   r   r4   r<   ra   r?   rD   r   r   r   r   r"      s   r"   c                   @  sL   e Zd ZdZddddddZddd	d
ZddddZddddZdS )r#   z#
    Represents selector:ident
    r,   r   r-   )rJ   identr   c                 C  s   || _ t|| _d S r0   )rJ   r   rj   )r3   rJ   rj   r   r   r   r4      s    zPseudo.__init__r5   c                 C  s   | j j d| jd| j dS )Nr8   ri   r9   )r;   r   rJ   rj   rM   r   r   r   r<      s    zPseudo.__repr__c                 C  s   | j   d| j S )Nri   )rJ   r?   rj   rM   r   r   r   r?      s    zPseudo.canonicalrC   c                 C  s"   | j  \}}}|d7 }|||fS rN   rO   rE   r   r   r   rD      s    zPseudo.specificityNrI   r   r   r   r   r#      s
   r#   c                   @  sL   e Zd ZdZddddddZddd	d
ZddddZddddZdS )r%   z.
    Represents selector:not(subselector)
    r,   r-   )rJ   subselectorr   c                 C  s   || _ || _d S r0   )rJ   rk   )r3   rJ   rk   r   r   r   r4      s    zNegation.__init__r   r5   c                 C  s   | j j d| jd| jdS )Nr8   :not(r[   r;   r   rJ   rk   rM   r   r   r   r<      s    zNegation.__repr__c                 C  s6   | j  }t|dkr |d}| j  d| dS )Nr=   r>   rl   re   )rk   r?   r@   rA   rJ   r3   Zsubselr   r   r   r?      s    

zNegation.canonicalrC   c                 C  s6   | j  \}}}| j \}}}|| || || fS r0   rJ   rD   rk   r3   Za1b1c1Za2b2c2r   r   r   rD     s    zNegation.specificityNrI   r   r   r   r   r%      s
   r%   c                   @  sL   e Zd ZdZddddddZdd	d
dZdd	ddZdd	ddZdS )r&   z.
    Represents selector:has(subselector)
    r,   Tokenr+   rJ   
combinatorrk   c                 C  s   || _ || _|| _d S r0   rv   r3   rJ   rw   rk   r   r   r   r4     s    zRelation.__init__r   r5   c                 C  s   | j j d| jd| jdS )Nr8   :has(r[   rm   rM   r   r   r   r<     s    zRelation.__repr__c                 C  s\   z| j d  }W n ty.   | j  }Y n0 t|dkrF|d}| j  d| dS )Nr   r=   r>   ry   re   )rk   r?   	TypeErrorr@   rA   rJ   rn   r   r   r   r?     s    
zRelation.canonicalrC   c                 C  sb   | j  \}}}z| jd  \}}}W n" tyJ   | j \}}}Y n0 || || || fS )N)rJ   rD   rk   rz   rp   r   r   r   rD     s    zRelation.specificityNrI   r   r   r   r   r&   	  s
   	r&   c                   @  sJ   e Zd ZdZdddddZddd	d
ZddddZddddZdS )r'   z/
    Represents selector:is(selector_list)
    r,   zIterable[Tree]rJ   selector_listc                 C  s   || _ || _d S r0   r|   r3   rJ   r}   r   r   r   r4   -  s    zMatching.__init__r   r5   c                 C  s2   d dd | jD }| jj d| jd| dS )N, c                 s  s   | ]}t |V  qd S r0   r:   rV   sr   r   r   rd   2  rY   z$Matching.__repr__.<locals>.<genexpr>r8   :is(r[   rf   r}   r;   r   rJ   r3   args_strr   r   r   r<   1  s    zMatching.__repr__c                 C  sR   g }| j D ]}| }||d q
ddd |D }| j  d| dS )Nr>   r   c                 s  s   | ]}t |V  qd S r0   r   r   r   r   r   rd   :  rY   z%Matching.canonical.<locals>.<genexpr>r   re   r}   r?   appendrA   rf   rJ   r3   Zselector_argumentsr   Zselargr   r   r   r   r?   5  s    
zMatching.canonicalrC   c                 C  s   t dd | jD S )Nc                 s  s   | ]}|  V  qd S r0   )rD   )rV   xr   r   r   rd   >  rY   z'Matching.specificity.<locals>.<genexpr>)maxr}   rM   r   r   r   rD   =  s    zMatching.specificityNrI   r   r   r   r   r'   (  s
   r'   c                   @  sJ   e Zd ZdZdddddZddd	d
ZddddZddddZdS )r(   zz
    Represents selector:where(selector_list)
    Same as selector:is(selector_list), but its specificity is always 0
    r,   
list[Tree]r|   c                 C  s   || _ || _d S r0   r|   r~   r   r   r   r4   G  s    zSpecificityAdjustment.__init__r   r5   c                 C  s2   d dd | jD }| jj d| jd| dS )Nr   c                 s  s   | ]}t |V  qd S r0   r   r   r   r   r   rd   L  rY   z1SpecificityAdjustment.__repr__.<locals>.<genexpr>r8   :where(r[   r   r   r   r   r   r<   K  s    zSpecificityAdjustment.__repr__c                 C  sR   g }| j D ]}| }||d q
ddd |D }| j  d| dS )Nr>   r   c                 s  s   | ]}t |V  qd S r0   r   r   r   r   r   rd   T  rY   z2SpecificityAdjustment.canonical.<locals>.<genexpr>r   re   r   r   r   r   r   r?   O  s    
zSpecificityAdjustment.canonicalrC   c                 C  s   dS )Nr   r   r   r   rM   r   r   r   rD   W  s    z!SpecificityAdjustment.specificityNrI   r   r   r   r   r(   A  s
   r(   c                   @  s   e Zd ZdZeddddddddd	Zeddddd
dddd	Zddddddddd	ZddddZddddZddddZdS )r$   z>
    Represents selector[namespace|attrib operator value]
    r,   
str | Noner   zLiteral['exists']r-   )rJ   	namespaceattriboperatorrT   r   c                 C  s   d S r0   r   r3   rJ   r   r   r   rT   r   r   r   r4   `  s    zAttrib.__init__ru   c                 C  s   d S r0   r   r   r   r   r   r4   j  s    zToken | Nonec                 C  s"   || _ || _|| _|| _|| _d S r0   )rJ   r   r   r   rT   r   r   r   r   r4   t  s
    r5   c              
   C  s   | j r| j  d| j n| j}| jdkrD| jj d| jd| dS | jd usRJ | jj d| jd| d| j d| jjd
S )N|existsr8   z]] )r   r   r   r;   r   rJ   rT   )r3   r   r   r   r   r<     s
    
zAttrib.__repr__c                 C  sj   | j r| j  d| j n| j}| jdkr.|}n&| jd us<J | | j | j  }| j  d| dS )Nr   r   r8   r9   )r   r   r   rT   rc   rJ   r?   )r3   r   opr   r   r   r?     s    
zAttrib.canonicalrC   c                 C  s"   | j  \}}}|d7 }|||fS rN   rO   rE   r   r   r   rD     s    zAttrib.specificityN)	r   r   r   r   r	   r4   r<   r?   rD   r   r   r   r   r$   [  s   		r$   c                   @  sN   e Zd ZdZdddddddZdd	d
dZdd	ddZdd	ddZdS )r   zU
    Represents namespace|element

    `None` is for the universal selector '*'

    Nr   r-   )r   elementr   c                 C  s   || _ || _d S r0   )r   r   )r3   r   r   r   r   r   r4     s    zElement.__init__r   r5   c                 C  s   | j j d|   dS )Nr8   r9   )r;   r   r?   rM   r   r   r   r<     s    zElement.__repr__c                 C  s$   | j pd}| jr | j d| }|S )Nr>   r   )r   r   )r3   r   r   r   r   r?     s    
zElement.canonicalrC   c                 C  s   | j r
dS dS )N)r   r   r=   r   r   rM   r   r   r   rD     s    zElement.specificity)NNrI   r   r   r   r   r     s    r   c                   @  sL   e Zd ZdZddddddZddd	d
ZddddZddddZdS )r    z 
    Represents selector#id
    r,   r   r-   )rJ   idr   c                 C  s   || _ || _d S r0   )rJ   r   )r3   rJ   r   r   r   r   r4     s    zHash.__init__r5   c                 C  s   | j j d| jd| j dS )Nr8   #r9   )r;   r   rJ   r   rM   r   r   r   r<     s    zHash.__repr__c                 C  s   | j   d| j S )Nr   )rJ   r?   r   rM   r   r   r   r?     s    zHash.canonicalrC   c                 C  s"   | j  \}}}|d7 }|||fS rN   rO   rE   r   r   r   rD     s    zHash.specificityNrI   r   r   r   r   r      s
   r    c                   @  sJ   e Zd ZdddddddZdddd	Zddd
dZddddZdS )r)   r,   r   r-   )rJ   rw   rk   r   c                 C  s"   |d usJ || _ || _|| _d S r0   rv   rx   r   r   r   r4     s    zCombinedSelector.__init__r5   c                 C  s8   | j dkrdn| j }| jj d| jd| d| jdS )Nr   z
<followed>r8   r9   )rw   r;   r   rJ   rk   )r3   combr   r   r   r<     s    "zCombinedSelector.__repr__c                 C  s<   | j  }t|dkr |d}| j  d| j d| S )Nr=   r>   r   )rk   r?   r@   rA   rJ   rw   rn   r   r   r   r?     s    

zCombinedSelector.canonicalrC   c                 C  s6   | j  \}}}| j \}}}|| || || fS r0   ro   rp   r   r   r   rD     s    zCombinedSelector.specificityN)r   r   r   r4   r<   r?   rD   r   r   r   r   r)     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]*$zlist[Selector])rc   r   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 a 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=   r   N   )_el_rematchr+   r   group_id_rer    	_class_rer!   TokenStreamtokenizesourcelistparse_selector_group)rc   r   streamr   r   r   parse  s    

&
"r   r   zIterator[Selector])r   r   c                 c  s<   |    tt|  V  |  dkr8|   |    qq8qd S )NDELIM,)skip_whitespacer+   parse_selectorpeeknext)r   r   r   r   r     s    
r   z!tuple[Tree, PseudoElement | None]c                 C  s   t | \}}|   |  }|dv r&q|r:td| d|dddrbtt|  j}|   nd}t | \}}t	|||}q||fS )N)EOFNr   Got pseudo-element :: not at the end of a selector+>~r   )
parse_simple_selectorr   r   r   is_delimr   r   r   rT   r)   )r   resultr/   r   rw   Znext_selectorr   r   r   r   (  s     

r   Fbool)r   inside_negationr   c                 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
| d|jdkrt|tt|  j}q|dkr|   t||  }q|dkr8|   td |  }q|dkrV|   t|| }q|dkrz|   |  dkr|   |  }|  dkr|   t|t| }q|  }| dv rt|}q|  dkrxt||}t|dkrt| jdkst| jdkr| jd jdkst| jdkr<| jd 	dst| jdkrn| jd jdkrn| jd 	dst
dq|   |    | dkr|rt
dt| dd\}	}
|  }|
rt
d
|
 d|j |d	krt
d | t||	}n|| d!kr$t| \}}t|||}nT| d"v rFt| }t||}n2| d#krht| }t||}nt||t| }qt
d$| qt| j|krt
d$|   ||fS )%NIDENTr   r>   r   r   )Sr   r   r   r   r   r   re   r   r   HASHr   rL   )r   r8   )r   ri   )r   rZ   )z
first-linezfirst-letterbeforeafterzPseudo[Element[*]:scope]r      r   r      zJGot immediate child pseudo-element ":scope" not at the start of a selectornotzGot nested :not()T)r   z inside :not() at zExpected ')', got has)matchesiswherezExpected selector, got )r   r@   usedr   r_   r   rT   next_ident_or_starr   r   r   r    r   r   r!   
next_identparse_attribr*   parse_argumentsr   r#   r:   r   posr%   parse_relative_selectorr&   parse_simple_selector_argumentsr'   r(   r"   )r   r   Zselector_startr   r   r   r   r/   rj   argumentZargument_pseudo_elementr   rw   rR   	selectorsr   r   r   r   @  s    













r   zlist[Token]c                 C  sR   g }|    |  }|jdv s&|dv r2|| q|dkr>|S td| qd S )Nr   STRINGNUMBER)r   r   r   -r   Expected an argument, got )r   r   r_   r   r   )r   rR   r   r   r   r   r     s    r   ztuple[Token, Selector]c                 C  s   |    d}|  }|dv r2|}|    |  }ntdddd}|jdv sR|dv rd|tt|j7 }n*|d	krt|}||d fS td
| |  }q@d S )Nr7   )r   r   )r   r   )r   r   r   r   r   r   r   )r   r   r   r   )	r   r   ru   r_   r   r   rT   r   r   )r   rk   r   rw   r   r   r   r   r     s    
r   r   c                 C  s   g }t | d\}}|r&td| d|   |  }|dv rZ|   |   || q|dkrp|| qqtd| q|S )NTr   z inside functionr   r   r   )r   r   r   r   r   )r   rR   r   r/   r   r   r   r   r     s"    

r   r,   )rJ   r   r   c                 C  s|  |   | }|d u r6| dkr6td|  | dkrz|  | dkrhd }|  d}q|}| }d }nd  }}|d u r|   | }|dkrt| |tt|dd S |dkrd}nL|	dd	d
dddr| dkrtt|j
d }|  ntd| |   | }|jdvr>td| |   | }|dkrftd| t| |tt|||S )Nr   zExpected '|', got )r   =z|=)r   r9   r   r   ^$r>   r   r   !zOperator expected, got )r   r   zExpected string or ident, got zExpected ']', got )r   r   r   r   r   r   r$   r   r   r   rT   r_   )rJ   r   r   r   r   r   rT   r   r   r   r     sH    



r   Iterable[Token]ztuple[int, int])tokensr   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v rt|d }nt|}|rt|nd}||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.r7   c                 s  s   | ]}t t|jV  qd S r0   )r   r   rT   rU   r   r   r   rd   )  rY   zparse_series.<locals>.<genexpr>Zodd)r   r=   Zeven)r   r   n)r=   r   r   r=   >   r   r   1)r_   
ValueErrorrf   stripintsplit)r   rW   r   rF   rG   Za_as_intZb_as_intr   r   r   parse_series  s(    

r   c                   @  s   e Zd ZU edddddddZedd	dddd
dZdddddddZddddZdddddZded< eddddZ	eddddZ
ddddZdS )ru   z:Literal['IDENT', 'HASH', 'STRING', 'S', 'DELIM', 'NUMBER']r   r   r   )type_rT   r   r   c                 C  s   d S r0   r   clsr   rT   r   r   r   r   __new__C  s    zToken.__new__zLiteral['EOF']r-   c                 C  s   d S r0   r   r   r   r   r   r   K  s    r   c                 C  s   t | ||f}||_|S r0   )tupler   r   )r   r   rT   r   objr   r   r   r   N  s    r5   c                 C  s   d| j  d| j d| j dS )N<z 'z' at r   )r_   rT   r   rM   r   r   r   r<   S  s    zToken.__repr__r   )valuesr   c                 G  s   | j dko| j|v S )Nr   )r_   rT   )r3   r   r   r   r   r   V  s    zToken.is_delimr   c                 C  s   | d S )Nr   r   rM   r   r   r   r_   [  s    z
Token.typec                 C  s   | d S rN   r   rM   r   r   r   rT   _  s    zToken.valuec                 C  s    | j dkrt| jS tt| jS )Nr   )r_   r:   rT   r   r   rM   r   r   r   rc   c  s    

z	Token.cssN)r   r   r   r	   r   r<   r   __annotations__propertyr_   rT   rc   r   r   r   r   ru   B  s   
ru   c                   @  s*   e Zd ZdddddZdddd	Zd
S )EOFTokenr   r   )r   r   c                 C  s   t | dd |S )Nr   )ru   r   )r   r   r   r   r   r   j  s    zEOFToken.__new__r   r5   c                 C  s   d| j  d| j dS )Nr   z at r   )r_   r   rM   r   r   r   r<   m  s    zEOFToken.__repr__N)r   r   r   r   r<   r   r   r   r   r   i  s   r   c                   @  sD   e Zd ZdZed Zde ZdZde de Zde de 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-]|r   z[_a-z]|N)	r   r   r   unicode_escapeescapeZstring_escapeZnonasciiZnmcharZnmstartr   r   r   r   r   t  s   r   c                   @  s"   e Zd Zd	dddddddZdS )
	MatchFunc.r   r   zre.Match[str] | None)r   r   endposr   c                 C  s   d S r0   r   )r3   r   r   r   r   r   r   __call__~  s    zMatchFunc.__call__N)..)r   r   r   r   r   r   r   r   r   }  s    r   )patternr   c                 C  s   t | tt t jjS r0   )recompilevarsr   
IGNORECASEr   )r   r   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)r   r=   zre.Match[str])r   r   c                 C  s&   t | dd}|tjkrd}t|S )Nr=      i  )r   r   sys
maxunicodechr)r   	codepointr   r   r   _replace_unicode  s    
r  )rT   r   c                 C  s   t t| } tt| S r0   )_sub_unicode_escaper  _sub_simple_escape_replace_simplerS   r   r   r   unescape_ident  s    
r  zIterator[Token])r   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 r^t| | |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 zInvalid string at r7   r   r   r   z/*z*/r{   r   )r@   _match_whitespaceru   end_match_identr  r  r  r  r   _match_hash_match_string_by_quoter   _sub_newline_escape_match_numberfindr   )r   r   Zlen_sr   rT   quoteend_pospos2r   r   r   r     sx    




r   c                   @  sf   e Zd ZdddddddZdd	d
dZdd	ddZdd	ddZdd	ddZdd	ddZdS )r   Nr   r   r-   )r   r   r   c                 C  s0   g | _ t|| _|| _d | _d| _| jj| _d S NF)r   iterr   r   peeked_peeking__next__
next_token)r3   r   r   r   r   r   r4     s    
zTokenStream.__init__ru   r5   c                 C  sF   | j r.d| _ | jd usJ | j| j | jS |  }| j| |S r  )r   r  r   r   r"  r3   r   r   r   r   r     s    zTokenStream.nextc                 C  s*   | j s|  | _d| _ | jd us$J | jS )NT)r   r"  r  rM   r   r   r   r     s
    
zTokenStream.peekr   c                 C  s,   |   }|jdkr td| tt|jS )Nr   zExpected ident, got )r   r_   r   r   r   rT   r#  r   r   r   r     s    
zTokenStream.next_identc                 C  s6   |   }|jdkr|jS |dkr$d S td| d S )Nr   r   zExpected ident or '*', got )r   r_   rT   r   r#  r   r   r   r     s    
zTokenStream.next_ident_or_starc                 C  s   |   }|jdkr|   d S )Nr   )r   r_   r   )r3   r   r   r   r   r     s    
zTokenStream.skip_whitespace)N)	r   r   r   r4   r   r   r   r   r   r   r   r   r   r     s   
)F)Mr   
__future__r   r   r  r	  typingr   r   r   r   r   r   r	   collections.abcr
   r   r   Ztyping_extensionsr   r   	Exceptionr   SyntaxErrorr   r,   r   ZPseudoElementr+   r!   r*   r"   r#   r%   r&   r'   r(   r$   r   r    r)   r  r   r   r   r   r   r   r   r   r   r   r   r   r   ru   r   r   r   r  r  r  r  r  r  subr  r   r  r  r  methodcallerr  r  r  r   r   r   r   r   r   <module>   s~   $
I"?

* r,$'	G