o
    /hu                     @  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   I/var/www/html/myenv/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cssutils_ANYNSr"   getr-   _logr8   xmldomNamespaceErrr+   r(   append)
selfseqvaltypr7   r'   rA   rB   prefixnamespaceURIr   r   r   rL   B   sP   


z
New.appendc                 C  s    | j |tj|gd|d |S )z(special implementation for comment tokenCOMMENTr7   )rL   rE   css
CSSCommentrM   expectedrN   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   rT   attribr   
descendant)r'   
startswithr   rL   r   r   r   r   )rM   rX   rN   r7   rY   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   rT   r9   FzSelector: Unexpected universal.r'   r!   _tokenvaluerL   r   r   r   r   r-   rH   r8   rM   rX   rN   r7   rY   r'   rO   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.   r]   rQ   r)   rT   type_selectorFz&Selector: Unexpected namespace prefix.)
r'   r!   rc   rL   r   r   r   r-   rH   r8   rd   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	normalizepseudo)z:first-linez:first-letterz:beforez:afterr@   rT   (r9   Fz%Selector: Unexpected start of pseudo.)r'   r!   rc   _typerL   rD   r   r   r   r   r   r-   rH   r8   rM   rX   rN   r7   rY   r'   rO   rP   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.   r[   rT   FSelector: Unexpected %s.)r'   r!   rc   rm   r_   rL   r   r   r-   rH   r8   rn   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.   r]   r   rT   Frp   )r'   r!   rc   rm   rL   lowerr   r   r-   rH   r8   rn   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.   r]   r   rT   r[   FzSelector: Unexpected STRING.)r'   r!   rm   _stringtokenvaluerL   r   r   r_   r   r-   rH   r8   )rM   rX   rN   r7   rY   r'   rP   rO   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.   r]   r
   r5   rT   r   zattribute-valuer9   r?   r[   rg   r>   FzSelector: Unexpected IDENT.)r'   r!   rc   rm   rL   r   r   r   r   r_   r   r   r   r   r-   rH   r8   rn   r   r   r   _ident%  s(   

z
New._identc                 C  ra   )Nr.   r<   rT   r9   FzSelector: Unexpected class.rb   rd   r   r   r   _classK  rf   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:   rT   r9   FzSelector: Unexpected HASH.rb   rd   r   r   r   _hash\  rf   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   r]   zattribute-endrT   r9   =r   equalsr	   znegation-endr\   r[   plusminus)+-r~   zfunction-endr@   r=   zattribute-startz+>~childzadjacent-siblingzfollowing-sibling)>r~   ~,FzSelector: Single selector only.)r8   r7   zSelector: Unexpected CHAR.)r'   r!   rc   rL   popr   r   r   r   r   r   r_   r   r   replacer   r   r-   rH   r8   rI   rJ   InvalidModificationErr)rM   rX   rN   r7   rY   r'   rO   _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 )NTri   r9   znegation-startrT   FzSelector: Unexpected negation.)	r!   rc   r'   rL   r   r   r-   rH   r8   )rM   rX   rN   r7   rY   rO   r   r   r   	_negation  s   zNew._negationc                 C  s   d| _ | jjd|d |S )zinvalidates selectorFzSelector: Unexpected ATKEYWORD.rT   )r-   rH   r8   rW   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 )NCHARr<   rx   STRINGIDENTnamespace_prefixr9   pseudo-classr@   r2   NUMBER	DIMENSIONPREFIXMATCHSUFFIXMATCHSUBSTRINGMATCH	DASHMATCHINCLUDES)r   rS   	ATKEYWORD)r   rw   ry   ru   rv   rh   r   ro   re   rq   rs   r`   rZ   r   rM   r   r   r   productions  sN   	
zNew.productionsr1   N)r   r   r   r   __annotations__dataclassesfieldr'   r(   r)   r+   r-   rL   rZ   r`   re   rh   ro   rq   rs   ru   rv   rw   ry   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   rH   _Selector__namespaces_element_parent_specificityselectorText	_readonly)rM   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   )rM   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   )setrN   typer   rD   
isinstancetupleadd)rM   urisitemtype_rO   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   rH   list_namespacesitems)rM   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   __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   ser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"   )rX   rN   rY   r   r;   Fz,Selector: Invalid or incomplete selector: %sr   z#Selector: No element name found: %sz(Selector: Cannot end with combinator: %sr.   stripr#   )"_checkReadonly_splitNamespacesOff
contextlibsuppressr   r   r   r   r"   
_tokenize2rH   r8   _prepare_tokensr    _tempSeq_parser   r   r   r-   lenr'   	_valuestrhasattrr   r   r   r(   r   r   r+   r   _setSeqr   )rM   r   r"   rY   newnewseqr-   rX   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<   rl   r@   r   FUNCTIONznot(r9   r0   r6   r   r3   r2   )	rc   r_   rD   rm   rL   _prodsr   finditer)rM   rY   tokenstrP   rO   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   rN   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   
parentList__classcell__r   r   r   r   r     sD    U	

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