o
    j                     @  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                   @  sd   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eg dZeg 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 combinator)z:has(z:is(z:where(z	:matches(z:any()z
::slotted(z::cue(z::cue-region(N)__name__
__module____qualname____doc__Ssimple_selector_sequencesimple_selector_sequence2r   negation_argnegationendattnameattname2attcombinatorattvalueattendexpressionstart
expression
combinator	frozensetselector_pseudosselector_pseudo_elements r!   r!   V/var/www/html/Deteccion_Ine/venv/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>B       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'   F   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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[pseudo-class)type-selectornegation-type-selectorpseudo-element)rB   r5   )linecol)r*   r,   splitendswithcssutilsZ_ANYNSr%   getr0   _logr;   xmldomZNamespaceErrr.   r+   append)
selfseqvaltypr:   r*   rE   rF   prefixZnamespaceURIr!   r!   r"   rN   J   sP   


z
New.appendc                 C  s    | j |tj|gd|d |S )z(special implementation for comment tokenCOMMENTr:   )rN   rI   cssZ
CSSCommentrO   expectedrP   r:   	tokenizerr!   r!   r"   _COMMENT   s   zNew._COMMENTc                 C  s   | j d }|dkrd|v r| j|tjd|d tjtj S |dr7|r5|d jdvr5| j|tjd|d |S |d	krOd|v rO| j|tjd|d tjtj S |S )
Nr1   pseudo-class-hasr   Z
descendantrU   pseudo-+-r   attrib)r*   rN   r   r   r   r   
startswithr   )rO   rX   rP   r:   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 )Nr1   r5   rU   r<   FzSelector: Unexpected universal.r*   r$   _tokenvaluerN   r   r   r   r   r0   rK   r;   rO   rX   rP   r:   rY   r*   rQ   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 )	Nr1   r^   rS   r,   rU   type_selectorFz&Selector: Unexpected namespace prefix.)
r*   r$   rc   rN   r   r   r   r0   rK   r;   rd   r!   r!   r"   _namespace_prefix   s   
zNew._namespace_prefixc           	      C  s   | j d }| jj|dd| j|}}d|v rf|dv rd}| j||||d |drR| tjv r6d	}n| tj	v r@d}n	| j | tj
S | j | tjS d
|krYtjS d|kr`t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. */
        r1   T	normalizeZpseudo)z:first-linez:first-letterz:beforez:afterrD   rU   (r[   r<   Fz%Selector: Unexpected start of pseudo.)r*   r$   rc   _typerN   rH   lowerr   r   r    r   r   r   r   r   r0   rK   r;   )	rO   rX   rP   r:   rY   r*   rQ   rR   ctxr!   r!   r"   _pseudo   s2   



zNew._pseudoc                 C  sd   | j d }| j|| j|}}|dr#| j||||d tjS d| _| j	j
d| |d |S )Nr1   r\   rU   FSelector: Unexpected %s.)r*   r$   rc   rl   r_   rN   r   r   r0   rK   r;   rO   rX   rP   r:   rY   r*   rQ   rR   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 )Nr1   r^   r   rU   Frp   )r*   r$   rc   rl   rN   rm   r   r   r0   rK   r;   rq   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 )Nr1   r^   r   rU   r\   FzSelector: Unexpected STRING.)r*   r$   rl   Z_stringtokenvaluerN   r   r   r_   r   r0   rK   r;   )rO   rX   rP   r:   rY   r*   rR   rQ   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
kr]| j||d|d tj	tj
 S |drn| j||||d tjS d|v swtj|kr| j||d|d tj	tj
 S d| _| jjd|d |S )Nr1   r^   r
   r8   rU   r   zattribute-valuer<   rC   r[   rB   r\   rg   FzSelector: Unexpected IDENT.)r*   r$   rc   rl   rN   r   r   r   r   r   r   r_   r   r   r0   rK   r;   rq   r!   r!   r"   _ident=  s.   

z
New._identc                 C  ra   )Nr1   r?   rU   r<   FzSelector: Unexpected class.rb   rd   r!   r!   r"   _classh  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 )Nr1   HASHr=   rU   r<   FzSelector: Unexpected HASH.rb   rd   r!   r!   r"   _hashy  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
|kr|dkr| j||d|d | j   | j d }d|krtjS 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rtj|ks|dkrd|v r| j||d|d | j   d|krtjS tj
tj S d|kr$d|v r$| j||d|d | j d tjS |dv rZd|v rZdddd}|rL|d jtjkrL|d|||  tj
S | j|||| |d tj
S d|krod| _| jjdtjj|d |S d| _| jjd |d |S )!Nr1   r   r^   zattribute-endrU   r<   =r   equalsr	   znegation-endr[   zfunction-endrD   r]   r\   plusminus)+-r}   r@   zattribute-startz+>~childzadjacent-siblingzfollowing-sibling)>r}   ~,FzSelector: Single selector only.)r;   r:   zSelector: Unexpected CHAR.)r*   r$   rc   rN   popr   r   r   r   r   r   r   r_   r   r   replacer   r0   rK   r;   rL   rM   ZInvalidModificationErr)rO   rX   rP   r:   rY   r*   rQ   Z_namesr!   r!   r"   _char  s   












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   r<   znegation-startrU   FzSelector: Unexpected negation.)	r$   rc   r*   rN   r   r   r0   rK   r;   )rO   rX   rP   r:   rY   rQ   r!   r!   r"   	_negation  s   zNew._negationc                 C  s   d| _ | jjd|d |S )zinvalidates selectorFzSelector: Unexpected ATKEYWORD.rU   )r0   rK   r;   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 )NZCHARr?   rw   STRINGIDENTnamespace_prefixr<   rA   rD   r5   NUMBERZ	DIMENSIONZPREFIXMATCHZSUFFIXMATCHZSUBSTRINGMATCHZ	DASHMATCHZINCLUDES)r   rT   Z	ATKEYWORD)r   rv   rx   rt   ru   rh   r   ro   re   rr   rs   r`   rZ   r   rO   r!   r!   r"   productions  sN   	
zNew.productionsr4   N)r   r   r   r   __annotations__dataclassesfieldr*   r+   r,   r.   r0   rN   rZ   r`   re   rh   ro   rr   rs   rt   ru   rv   rx   r   r   r   propertyr   r!   r!   r!   r"   r#   :   s8   
 

S




2



+


g
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   rK   _Selector__namespaces_element_parent_specificityselectorTextZ	_readonly)rO   r   parentreadonly	__class__r!   r"   r   u  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   )rO   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__  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.r7   r5   r   )Nr9   )setrP   typer   rH   
isinstancetupleadd)rO   urisitemtype_rQ   r!   r!   r"   _getUsedUris  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   rK   list_namespacesitems)rO   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.)rI   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%   )rX   rP   rY   r   r>   Fz,Selector: Invalid or incomplete selector: %sr   z#Selector: No element name found: %sz(Selector: Cannot end with combinator: %sr1   stripr&   )"Z_checkReadonlyZ_splitNamespacesOff
contextlibsuppressr   r   r   r   r%   Z
_tokenize2rK   r;   _prepare_tokensr#   Z_tempSeq_parser   r   r   r0   lenr*   Z	_valuestrhasattrr   r   r   r+   r   r   r.   r   Z_setSeqr   )rO   r   r%   rY   newZnewseqr0   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
        :r1   z::r   .r?   rk   rD   rA   ZFUNCTIONznot(r<   r3   r9   r   r6   r5   )	rc   r_   rH   rl   rN   Z_prodsr   finditer)rO   rY   tokenstrR   rQ   ZlinrF   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   rP   r   r!   r!   r"   r'     s    zUse property parent insteadc                 C  r   r   )r   r   r!   r!   r"   _getParentList  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.   r0   r   r   Z
parentList__classcell__r!   r!   r   r"   r     sD    U	

T[
)r   
__future__r   __all__r   r   Zxml.domrL   rI   Zcssutils.helperr   Zcssutils.utilr   r   	dataclassutilZ
_BaseClassr#   ZBase2r   r!   r!   r!   r"   <module>   s     $   g