o
    Q+ iu                     @  s   d Z ddlmZ dgZddlZddlZddlZddlZddl	m
Z
 ddlmZ G dd dZejG d	d
 d
ejjZG dd dejjZdS )zSelector is a single Selector of a CSSStyleRule SelectorList.
Partly implements http://www.w3.org/TR/css3-selectors/.

TODO
    - .contains(selector)
    - .isSubselector(selector)
    )annotationsSelectorN)
Deprecated)_SimpleNamespacesc                   @  sL   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZed ZdZdS )	Constantszexpected constants z:type_selector universal HASH class attrib pseudo negation z"HASH class attrib pseudo negation element_namez0type_selector universal HASH class attrib pseudo)zprefix attribute	attributezcombinator ]value]z$PLUS - DIMENSION NUMBER STRING IDENTz )z combinatorN)__name__
__module____qualname____doc__Ssimple_selector_sequencesimple_selector_sequence2r   negation_argnegationendattnameattname2attcombinatorattvalueattendexpressionstart
expression
combinator r   r   a/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/cssutils/css/selector.pyr      s"    r   c                   @  s  e Zd ZU dZded< ded< ejdd dZd	ed
< 	 dZded< dZ	ded< ejdd dZ
ded< 	 dZded< d5ddZd6ddZd6ddZd6ddZd6ddZd6dd Zd6d!d"Zd6d#d$Zd6d%d&Zd6d'd(Zd6d)d*Zd6d+d,Zd6d-d.Zd6d/d0Zd6d1d2Zed3d4 ZdS )7Newz7
    Derives from _BaseClass to provide self._log.
    r   selectorzdict[str, str]
namespacesc                   C  s   dgS )N r   r   r   r   r   <lambda>:       zNew.<lambda>)default_factoryz	list[str]contextNz
str | Noneelement_PREFIXc                   C  s
   dgd S )Nr      r   r   r   r   r   r$   >   s   
 z	list[int]specificityTbool
wellformedc           
      C  s  | j d }|r|d |d }}nd\}}|dkr"|dd | _dS | jdur/| jd}| _n|dkr?d|v r?|d\}}nd}|d	sJ|dkrd
|krP|r|dkrXtj}	n.|du rd| jdd}	n"|dkrkd}	n| j| }	|	du rd| _| j	j
d| |tjjd dS |	|f}|r|dkrd|kr| jd  d7  < nd|ksd|kr| jd  d7  < n|dv r| jd  d7  < |s|dv r|| _|j||||d dS )aH  
        appends to seq

        namespace_prefix, IDENT will be combined to a tuple
        (prefix, name) where prefix might be None, the empty string
        or a prefix.

        Saved are also:
            - specificity definition: style, id, class/att, type
            - element: the element this Selector is for
              NNr)   N	universal|	-selectorattribute-selector*r#   Fz-Selector: No namespaceURI found for prefix %r)tokenerrornegationid   class[)type-selectornegation-type-selectorpseudo-element)r>   r2   )linecol)r'   r)   splitendswithcssutilsZ_ANYNSr"   getr-   _logr8   xmldomZNamespaceErrr+   r(   append)
selfseqvaltypr7   r'   rA   rB   prefixZnamespaceURIr   r   r   rJ   B   sP   


z
New.appendc                 C  s    | j |tj|gd|d |S )z(special implementation for comment tokenCOMMENTr7   )rJ   rE   cssZ
CSSCommentrK   expectedrL   r7   	tokenizerr   r   r   _COMMENT   s   zNew._COMMENTc                 C  sr   | j d }|dr|r|d jdvr| j|tjd|d |S |dkr7d|v r7| j|tjd|d tjtj S |S )	Nr.   pseudo-+-r   rQ   attribr   Z
descendant)r'   
startswithr   rJ   r   r   r   r   )rK   rT   rL   r7   rU   r'   r   r   r   _S   s   

zNew._Sc                 C  d   | j d }| j|}d|v r%| j||d|d d|krtjS tjtj S d| _| j	j
d|d |S )Nr.   r2   rQ   r9   FzSelector: Unexpected universal.r'   r!   _tokenvaluerJ   r   r   r   r   r-   rG   r8   rK   rT   rL   r7   rU   r'   rM   r   r   r   
_universal      
zNew._universalc                 C  sx   | j d }| j|}d|krd|v r| j||d|d tjS d|v r/| j||d|d tjS d| _| jj	d|d |S )	Nr.   rY   rO   r)   rQ   type_selectorFz&Selector: Unexpected namespace prefix.)
r'   r!   r^   rJ   r   r   r   r-   rG   r8   r_   r   r   r   _namespace_prefix   s   
zNew._namespace_prefixc                 C  s   | j d }| jj|dd| j|}}d|v rI|dv rd}| j||||d |dr5| j | tjS d	|kr<tjS d|krCtj	S tj
tj	 S d
| _| jjd|d |S )a0  
        /* '::' starts a pseudo-element, ':' a pseudo-class */
        /* Exceptions: :first-line, :first-letter, :before and
        :after. */
        /* Note that pseudo-elements are restricted to one per selector
        and */
        /* occur only in the last simple_selector_sequence. */
        r.   T	normalizeZpseudo)z:first-linez:first-letterz:beforez:afterr@   rQ   (r9   Fz%Selector: Unexpected start of pseudo.)r'   r!   r^   _typerJ   rD   r   r   r   r   r   r-   rG   r8   rK   rT   rL   r7   rU   r'   rM   rN   r   r   r   _pseudo   s&   



zNew._pseudoc                 C  sd   | j d }| j|| j|}}|dr#| j||||d tjS d| _| j	j
d| |d |S )Nr.   rW   rQ   FSelector: Unexpected %s.)r'   r!   r^   rg   rZ   rJ   r   r   r-   rG   r8   rh   r   r   r   _expression   s   

zNew._expressionc                 C  sn   | j d }| j|| j|}}d|kr(d|v r(| j||| |d tjS d| _| j	j
d| |d |S )Nr.   rY   r   rQ   Frj   )r'   r!   r^   rg   rJ   lowerr   r   r-   rG   r8   rh   r   r   r   _attcombinator   s   
zNew._attcombinatorc                 C  s   | j d }| j|| j|}}d|kr&d|v r&| j||||d tjS |dr7| j||||d tjS d| _	| j
jd|d |S )Nr.   rY   r   rQ   rW   FzSelector: Unexpected STRING.)r'   r!   rg   Z_stringtokenvaluerJ   r   r   rZ   r   r-   rG   r8   )rK   rT   rL   r7   rU   r'   rN   rM   r   r   r   _string  s   

zNew._stringc                 C  s   | j d }| j|| j|}}d|kr&d|v r&| j||d|d tjS d|kr:d|v r:| j||d|d tjS d|krJ| j||d	|d tjS |	d
r[| j||||d tj
S d|v sdtj|krs| j||d|d tjtj S d| _| jjd|d |S )Nr.   rY   r
   r5   rQ   r   zattribute-valuer9   r?   rW   rb   r>   FzSelector: Unexpected IDENT.)r'   r!   r^   rg   rJ   r   r   r   r   rZ   r   r   r   r   r-   rG   r8   rh   r   r   r   _ident%  s(   

z
New._identc                 C  r\   )Nr.   r<   rQ   r9   FzSelector: Unexpected class.r]   r_   r   r   r   _classK  ra   z
New._classc                 C  sd   | j d }| j|}d|v r%| j||d|d d|krtjS tjtj S d| _| j	j
d|d |S )Nr.   HASHr:   rQ   r9   FzSelector: Unexpected HASH.r]   r_   r   r   r   _hash\  ra   z	New._hashc                 C  s  | j d }| j|}d|kr7d|kr7d|v r7| j||d|d | j  }| j d }d|kr1tjS tjtj S d|krOd|krOd|v rO| j||d	|d tj	S d
|krtd|krtd
|v rt| j||d|d | j   | j d }tj
tj S |dv r|drddd}|dkr|r|d jtjkr|d|||  tjS | j|||| |d tjS d
|kr|drtj|kr| j||d|d | j   d|krtjS tj
tj S d|krd|v r| j||d|d | j d tjS |dv r#d|v r#dddd}|r|d jtjkr|d|||  tj
S | j|||| |d tj
S d|kr8d| _| jjdtjj|d |S d| _| jjd|d |S ) Nr.   r   rY   zattribute-endrQ   r9   =r   equalsr	   znegation-endrX   rW   plusminus)+-rw   zfunction-endr@   r=   zattribute-startz+>~childzadjacent-siblingzfollowing-sibling)>rw   ~,FzSelector: Single selector only.)r8   r7   zSelector: Unexpected CHAR.)r'   r!   r^   rJ   popr   r   r   r   r   r   rZ   r   r   replacer   r   r-   rG   r8   rH   rI   ZInvalidModificationErr)rK   rT   rL   r7   rU   r'   rM   Z_namesr   r   r   _charm  st   








z	New._charc                 C  sV   | j j|dd}d|v r| jd | j||d|d tjS d| _| jjd|d |S )NTrd   r9   znegation-startrQ   FzSelector: Unexpected negation.)	r!   r^   r'   rJ   r   r   r-   rG   r8   )rK   rT   rL   r7   rU   rM   r   r   r   	_negation  s   zNew._negationc                 C  s   d| _ | jjd|d |S )zinvalidates selectorFzSelector: Unexpected ATKEYWORD.rQ   )r-   rG   r8   rS   r   r   r   
_atkeyword  s   zNew._atkeywordc                 C  s   i d| j d| jd| jd| jd| jd| jd| jd| jd	| jd
| jd| j	d| j	d| j
d| j
d| j
d| j
d| j
| j| j| jdS )NZCHARr<   rq   STRINGIDENTnamespace_prefixr9   pseudo-classr@   r2   NUMBERZ	DIMENSIONZPREFIXMATCHZSUFFIXMATCHZSUBSTRINGMATCHZ	DASHMATCHZINCLUDES)r   rP   Z	ATKEYWORD)r   rp   rr   rn   ro   rc   r   ri   r`   rk   rm   r[   rV   r   rK   r   r   r   productions  sN   	
zNew.productionsr1   N)r   r   r   r   __annotations__dataclassesfieldr'   r(   r)   r+   r-   rJ   rV   r[   r`   rc   ri   rk   rm   rn   ro   rp   rr   r   r   r   propertyr   r   r   r   r   r    2   s8   
 

S




'



&


V
r    c                      s   e Zd ZdZd% fdd	Zdd Zdd	 Zd
d Zdd Zdd Z	e
e	ddZe
dd Ze
dd ddZdd Zdd Zdd Ze
eeddZe
dd ddZe
d d Zed!d"d# Ze
ed$dZ  ZS )&r   a  
    (cssutils) a single selector in a :class:`~cssutils.css.SelectorList`
    of a :class:`~cssutils.css.CSSStyleRule`.

    Format::

        # implemented in SelectorList
        selectors_group
          : selector [ COMMA S* selector ]*
          ;

        selector
          : simple_selector_sequence [ combinator simple_selector_sequence ]*
          ;

        combinator
          /* combinators can be surrounded by white space */
          : PLUS S* | GREATER S* | TILDE S* | S+
          ;

        simple_selector_sequence
          : [ type_selector | universal ]
            [ HASH | class | attrib | pseudo | negation ]*
          | [ HASH | class | attrib | pseudo | negation ]+
          ;

        type_selector
          : [ namespace_prefix ]? element_name
          ;

        namespace_prefix
          : [ IDENT | '*' ]? '|'
          ;

        element_name
          : IDENT
          ;

        universal
          : [ namespace_prefix ]? '*'
          ;

        class
          : '.' IDENT
          ;

        attrib
          : '[' S* [ namespace_prefix ]? IDENT S*
                [ [ PREFIXMATCH |
                    SUFFIXMATCH |
                    SUBSTRINGMATCH |
                    '=' |
                    INCLUDES |
                    DASHMATCH ] S* [ IDENT | STRING ] S*
                ]? ']'
          ;

        pseudo
          /* '::' starts a pseudo-element, ':' a pseudo-class */
          /* Exceptions: :first-line, :first-letter, :before and :after. */
          /* Note that pseudo-elements are restricted to one per selector and */
          /* occur only in the last simple_selector_sequence. */
          : ':' ':'? [ IDENT | functional_pseudo ]
          ;

        functional_pseudo
          : FUNCTION S* expression ')'
          ;

        expression
          /* In CSS3, the expressions are identifiers, strings, */
          /* or of the form "an+b" */
          : [ [ PLUS | '-' | DIMENSION | NUMBER | STRING | IDENT ] S* ]+
          ;

        negation
          : NOT S* negation_arg S* ')'
          ;

        negation_arg
          : type_selector | universal | HASH | class | attrib | pseudo
          ;

    NFc                   s>   t    t| jd| _d| _|| _d| _|r|| _|| _	dS )z
        :Parameters:
            selectorText
                initial value of this selector
            parent
                a SelectorList
            readonly
                default to False
        logN)r   r   r   r   )
super__init__r   rG   _Selector__namespaces_element_parent_specificityselectorTextZ	_readonly)rK   r   parentreadonly	__class__r   r   r   G  s   


zSelector.__init__c                 C  s4   |   r| j|  f}n| j}d| jj d|dS )Nzcssutils.css.z(selectorText=r	   )_Selector__getNamespacesr   _getUsedNamespacesr   r   )rK   str   r   r   __repr__]  s   zSelector.__repr__c                 C  s"   d| j j| j| j|  t| f S )NzN<cssutils.css.%s object selectorText=%r specificity=%r _namespaces=%r at 0x%x>)r   r   r   r+   r   r:   r   r   r   r   __str__d  s   zSelector.__str__c                 C  sZ   t  }| jD ]$}|j|j}}|ds#|dkr*t|tr*|d dvr*||d  q|S )z3Return list of actually used URIs in this Selector.r4   r2   r   )Nr6   )setrL   typer   rD   
isinstancetupleadd)rK   urisitemtype_rM   r   r   r   _getUsedUrisq  s   
zSelector._getUsedUrisc                 C  s@   |   }t| jd}t| j D ]\}}||v r|||< q|S )z%Return actually used namespaces only.r   )r   r   rG   list_namespacesitems)rK   Zusedurisr"   purir   r   r   r     s   zSelector._getUsedNamespacesc                 C  s(   z| j jjjW S  ty   | j Y S w )zEUse own namespaces if not attached to a sheet, else the sheet's ones.)r   
parentRuleparentStyleSheetr"   AttributeErrorr   r   r   r   r   Z__getNamespaces  s
   
zSelector.__getNamespaceszIf this Selector is attached to a CSSStyleSheet the namespaces of that sheet are mirrored here. While the Selector (or parent SelectorList or parentRule(s) of that are not attached a own dict of {prefix: namespaceURI} is used.)docc                 C     | j S )z*Effective element target of this selector.)r   r   r   r   r   r(     s   zSelector.elementc                 C  r   r   )r   r   r   r   r   r$     r%   zSelector.<lambda>zn(DOM) The SelectorList that contains this Selector or None if this Selector is not attached to a SelectorList.c                 C  s   t j| S )zReturn serialized format.)rE   ZserZdo_css_Selectorr   r   r   r   _getSelectorText  s   zSelector._getSelectorTextc                 C  s  |    | |\}}tt | jjjj}W d   n1 s!w   Y  | 	|}|s5| j
d dS | |}t| |d}|  }| jtj|||jd\}}|oU|j}t|jdks_|sld}| j
d| |  |dkr}d}| j
d	| |  |tjkr|rd}| j
d
| |  |rt|d jdr|d j dkr|d= |r|| _|j| _t|j| _|  | | ! | _dS dS )at  
        :param selectorText:
            parsable string or a tuple of (selectorText, dict-of-namespaces).
            Given namespaces are ignored if this object is attached to a
            CSSStyleSheet!

        :exceptions:
            - :exc:`~xml.dom.NamespaceErr`:
              Raised if the specified selector uses an unknown namespace
              prefix.
            - :exc:`~xml.dom.SyntaxErr`:
              Raised if the specified CSS string value has a syntax error
              and is unparsable.
            - :exc:`~xml.dom.NoModificationAllowedErr`:
              Raised if this rule is readonly.
        Nz Selector: No selectorText given.)r!   r"   )rT   rL   rU   r   r;   Fz,Selector: Invalid or incomplete selector: %sr   z#Selector: No element name found: %sz(Selector: Cannot end with combinator: %sr.   stripr#   )"Z_checkReadonlyZ_splitNamespacesOff
contextlibsuppressr   r   r   r   r"   Z
_tokenize2rG   r8   _prepare_tokensr    Z_tempSeq_parser   r   r   r-   lenr'   Z	_valuestrhasattrr   r   r   r(   r   r   r+   r   Z_setSeqr   )rK   r   r"   rU   newZnewseqr-   rT   r   r   r   _setSelectorText  sf   




zSelector._setSelectorTextc                 C  s  g }|D ]C}|\}}}}|dkr%|r%|  |d dkr%|d||f|d< q|dkr?|r?|  |d dkr?dd| ||f|d< q|dkrx|rx|  |d drx|  |d dsx|  |d drfd}nd	}||  |d | ||f|d< q|d
kr|dkr|rd|  |d krdd| ||d d f|d< q|d
kr|r|  |d dr|  |d drd}nd	}||  |d | ||f|d< q|dkr|r| |d dkr|  |d drd|  |d | ||f|d< q|dkr|d|||f q|dkr4|r4| |d | jjdfv r4|  |d ddkr4d|  |d d ||f|d< q|dkrC|d|||f q|| qt|S )aE  
        "*" -> type "universal"
        "*"|IDENT + "|" -> combined to "namespace_prefix"
        "|" -> type "namespace_prefix"
        "." + IDENT -> combined to "class"
        ":" + IDENT, ":" + FUNCTION -> pseudo-class
        FUNCTION "not(" -> negation
        "::" + IDENT, "::" + FUNCTION -> pseudo-element
        :r.   z::r   .r<   rf   r@   r   ZFUNCTIONznot(r9   r0   r6   r   r3   r2   )	r^   rZ   rD   rg   rJ   Z_prodsr   finditer)rK   rU   tokenstrN   rM   ZlinrB   r   r   r   r     sx   

  




zSelector._prepare_tokensz:(DOM) The parsable textual representation of the selector.c                 C  r   r   )r   r   r   r   r   r$   _  r%   a  Specificity of this selector (READONLY).
                Tuple of (a, b, c, d) where:

                a
                    presence of style in document, always 0 if not used on a
                    document
                b
                    number of ID selectors
                c
                    number of .class selectors
                d
                    number of Element (type) selectorsc                 C  s   t t| jS r   )r,   r   rL   r   r   r   r   r$   n  s    zUse property parent insteadc                 C  r   r   )r   r   r   r   r   _getParentListp  s   zSelector._getParentListz'DEPRECATED, see property parent instead)NNF)r   r   r   r   r   r   r   r   r   r   r   r   r(   r   r   r   r   r   r+   r-   r   r   Z
parentList__classcell__r   r   r   r   r     sD    U	

T[
)r   
__future__r   __all__r   r   Zxml.domrH   rE   Zcssutils.helperr   Zcssutils.utilr   r   	dataclassutilZ
_BaseClassr    ZBase2r   r   r   r   r   <module>   s        A