o
    i                     @  sz  d Z ddlmZ ddlZddlmZ ddlmZ ddlmZ	 ddlm
Z dd	lmZ ddlZdd
lmZmZmZmZmZ dZh dZh dZh dZh dZh dZeeB eB eB eB ZdZdeZdZdjeedZdjedZ djeedZ!dje dZ"djedZ#djee"dZ$djee$d Z%d!je"d"Z&d#je"d"Z'd$je"d"Z(d%jee"e%d&Z)d'jee"d(Z*d)jee"d(Z+d*je"d"Z,d+jedZ-d,e*Z.d-je"d"Z/d.je+eeee#d/Z0d0je+ee#d1Z1d2je+ee$d3Z2d4je+ed5Z3d6jeed7Z4d2je+ee$d3Z5e6d8jedej7Z8e6d9jeedej7Z9e6d:jedej7Z:e6d;jee$d ej;Z<e6eZ=e6d<eZ>e6d=eZ?e6d>e,ej;Z@d?ZAd@ZBdZCdAZDdBZEdCZFdDZGdEZHdFZIdGZJdHZKdIZLdJZMdKZNeeNdLd~dWdXZOddZd[ZPdd]d^ZQdddcddZRddfdgZSG dhdi diZTG djdk dkeTZUG dldm dmZVG dndo doZWeWdpjXeCeGB dqZYeWdrjXeCeGB dqZZeWdsjXeCeGB eFB dqZ[eWdtjXeCeGB eHB dqZ\eWdujXeCeGB dqZ]eWdvjXeCeGB dqZ^eWdwjXeCeGB dqZ_eWdxjXeCeGB dqZ`eWdyjXeCeGB eLB dqZaeWdzjXeCdqZbeWd{jXeCeGB dqZceWd|jXeCeGB dqZdeWd}jXeCeJB eGB dqZeeWd}jXeCeKB eGB dqZfdS )zCSS selector parser.    )annotationsN)	lru_cache   )util)	css_match)	css_types)SelectorSyntaxError)OptionalMatchAnyIteratorcasti  >   :link:root:empty:scope:checked:default:defined:enabled	:any-link	:disabled	:in-range	:optional	:required
:read-only:last-child:only-child:read-write:first-child:last-of-type:only-of-type:out-of-range:first-of-type:indeterminate:placeholder-shown>   :past:focus:hover:active:future:paused:target:playing:visited:local-link:focus-within:user-invalid:focus-visible:target-within:host:current>   :matches:is:has:not:where	:contains:-soup-contains:-soup-contains-own>   :host-contextr4   r5   >   :dir:lang
:nth-child:nth-of-type:nth-last-child:nth-last-of-typez(?:\r\n|(?!\r\n)[\n\f\r])z(?:[ \t]|{})z"(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)z(?:{ws}|{comments}))wscommentsz*(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$)))rE   z/(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$|{nl})))rE   nlz
(?:(?:-?(?:[^\x00-\x2f\x30-\x40\x5B-\x5E\x60\x7B-\x9f]|{esc})+|--)
(?:[^\x00-\x2c\x2e\x2f\x3A-\x40\x5B-\x5E\x60\x7B-\x9f]|{esc})*)
)escz>(?:[-+])?(?:[0-9]+n?|n)(?:(?<=n){ws}*(?:[-+]){ws}*(?:[0-9]+))?zT
(?:"(?:\\(?:.|{nl})|[^\\"\r\n\f]+)*?"|'(?:\\(?:.|{nl})|[^\\'\r\n\f]+)*?'|{ident}+)
)rG   identzU
(?:{ws}*(?P<cmp>[!~^|*$]?=){ws}*(?P<value>{value})(?:{ws}+(?P<case>[is]))?)?{ws}*\]
)rE   valuez	\#{ident})rI   z	\.{ident}z6(?P<tag_ns>(?:{ident}|\*)?\|)?(?P<tag_name>{ident}|\*)zD
\[{ws}*(?P<attr_ns>(?:{ident}|\*)?\|)?(?P<attr_name>{ident}){attr}
)rE   rI   attrz$(?P<name>:{ident})(?P<open>\({ws}*)?)rE   rI   z#(?P<name>:{ident})(?P<open>\({ws}*)z(?P<name>:(?=--){ident})z{ws}*\)z:{}z	@P{ident}z}
(?P<pseudo_nth_child>{name}
(?P<nth_child>{nth}|even|odd))(?:{wsc}*\)|(?P<of>{comments}*{ws}{wsc}*of{comments}*{ws}{wsc}*))
)namewscrF   rE   nthzA
(?P<pseudo_nth_type>{name}
(?P<nth_type>{nth}|even|odd)){ws}*\)
)rL   rE   rN   z7{name}(?P<values>{value}(?:{ws}*,{ws}*{value})*){ws}*\))rL   rE   rJ   z{name}(?P<dir>ltr|rtl){ws}*\))rL   rE   z0{wsc}*?(?P<relation>[,+>~]|{ws}(?![,+>~])){wsc}*)rE   rM   z0(?:(\\[a-f0-9]{{1,6}}{ws}?)|(\\[^\r\n\f])|(\\$))z9(?:(\\[a-f0-9]{{1,6}}{ws}?)|(\\[^\r\n\f])|(\\$)|(\\{nl}))zL(?P<s1>[-+])?(?P<a>[0-9]+n?|n)(?:(?<=n){ws}*(?P<s2>[-+]){ws}*(?P<b>[0-9]+))?z-(?:(?P<value>{value})|(?P<split>{ws}*,{ws}*))z^{}*z{}*$z^{}$,                 @         i   i   i  )maxsizepatternstr
namespacesOptional[ct.Namespaces]customOptional[ct.CustomSelectors]flagsintreturncm.SoupSievec                 C  s(   t |}t| t| ||d |||S )zCached CSS compile.r^   r`   )process_customcm	SoupSieve	CSSParserprocess_selectors)rZ   r\   r^   r`   custom_selectors rk   O/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/soupsieve/css_parser.py_cached_css_compile   s   	rm   Nonec                   C  s   t   dS )zPurge the cache.N)rm   cache_clearrk   rk   rk   rl   _purge_cache   s   rp    dict[str, str | ct.SelectorList]c                 C  sj   i }| dur3|   D ](\}}t|}t|du r!td|||v r,td|||t|< q
|S )zProcess custom.Nz5The name '{}' is not a valid custom pseudo-class namez4The custom selector '{}' has already been registered)	itemsr   lower	RE_CUSTOMmatchr   formatKeyErrorcss_unescape)r^   rj   keyrJ   rL   rk   rk   rl   re      s   
re   Fcontentstringboolc                 C  s   ddd}|s	t nt|| S )	zs
    Unescape CSS value.

    Strings allow for spanning the value on multiple strings by escaping a new line.
    m
Match[str]rb   r[   c                 S  st   |  drt|  ddd d}|dkrt}t|}|S |  dr-|  ddd }|S |  dr6d}|S d}|S )	z(Replace with the appropriate substitute.r   NrT   r   rQ         � )groupra   UNICODE_REPLACEMENT_CHARchr)r}   	codepointrJ   rk   rk   rl   replace  s   


zcss_unescape.<locals>.replaceN)r}   r~   rb   r[   )
RE_CSS_ESCRE_CSS_STR_ESCsub)rz   r{   r   rk   rk   rl   rx      s   
rx   rI   c                 C  sj  g }t | }|dko| d dk}|dkr|r|d|  nt| D ]\}}t|}|dkr5|d q#d|  kr?dksDn |dkrM|d| q#|dksW|rl|dkrld	|  krad
krln n	|d| q#|dv s|dksd	|  kr~d
ksn d	|  krd
ksn d|  krdksn d|  krdkrn n|| q#|d| q#d|S )zEscape identifier.r   -r   z\{}r         z\{:x} 0   9   )-   _   rW   A   Z   a   z   r   )lenappendrv   	enumerateordjoin)rI   r{   length
start_dashindexcr   rk   rk   rl   escape  s$   ,&D
r   c                   @  s.   e Zd ZdZdddZdd	d
ZdddZdS )SelectorPatternSelector pattern.rL   r[   rZ   rb   rn   c                 C  s&   || _ t|tjtjB tjB | _dS )Initialize.N)rL   recompileIXU
re_pattern)selfrL   rZ   rk   rk   rl   __init__5  s    zSelectorPattern.__init__c                 C  s   | j S )	Get name.)rL   r   rk   rk   rl   get_name;  s   zSelectorPattern.get_nameselectorr   ra   r`   Optional[Match[str]]c                 C  s   | j ||S )Match the selector.)r   ru   )r   r   r   r`   rk   rk   rl   ru   @  s   zSelectorPattern.matchN)rL   r[   rZ   r[   rb   rn   rb   r[   r   r[   r   ra   r`   ra   rb   r   __name__
__module____qualname____doc__r   r   ru   rk   rk   rk   rl   r   2  s
    

r   c                   @  s.   e Zd ZdZdddZdd	d
ZdddZdS )SpecialPseudoPatternr   patternsCtuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]rb   rn   c                 C  sh   i | _ |D ]}|d }|d ||d }|d D ]}|| j |< qqd| _tttjtjB tjB | _dS )r   r   r   rQ   r   N)	r   matched_namer   r   PAT_PSEUDO_CLASS_SPECIALr   r   r   re_pseudo_name)r   r   prL   rZ   pseudork   rk   rl   r   I  s    zSpecialPseudoPattern.__init__r[   c                 C  s   | j du rdS | j  S )r   Nr   )r   r   r   rk   rk   rl   r   V  s   zSpecialPseudoPattern.get_namer   r   ra   r`   r   c                 C  sV   d}| j ||}|r)tt|d}| j|}|r)||||}|r)|| _|S )r   NrL   )	r   ru   r   rs   rx   r   r   getr   )r   r   r   r`   r   r}   rL   rZ   rk   rk   rl   ru   [  s   zSpecialPseudoPattern.matchN)r   r   rb   rn   r   r   r   rk   rk   rk   rl   r   F  s
    

r   c                   @  s<   e Zd ZdZdddZdddZdddZdddZeZdS )	_Selectorz
    Intermediate selector class.

    This stores selector data for a compound selector as we are acquiring them.
    Once we are done collecting the data for a compound selector, we freeze
    the data in an object that can be pickled and hashed.
    kwargsr   rb   rn   c                 K  s   | dd| _| dg | _| dg | _| dg | _| dg | _| dg | _| dg | _| d	d| _| d
g | _	| dg | _
| dd| _| dd| _dS )r   tagNidsclasses
attributesrN   	selectors	relationsrel_typecontainslangr`   r   no_matchF)r   r   r   r   r   rN   r   r   r   r   r   r`   r   )r   r   rk   rk   rl   r   t  s   z_Selector.__init__r   list[_Selector]ct.SelectorListc                 C  s8   |r|d }|j |dd  t| gS t S )zFreeze relation.r   r   N)r   extendctSelectorListfreeze)r   r   selrk   rk   rl   _freeze_relations  s
   z_Selector._freeze_relationsct.Selector | ct.SelectorNullc                 C  sd   | j rt S t| jt| jt| jt| jt| j	t| j
| | j| jt| jt| j| jS )zFreeze self.)r   r   SelectorNullSelectorr   tupler   r   r   rN   r   r   r   r   r   r   r`   r   rk   rk   rl   r     s   
z_Selector.freezer[   c                 C  s8   d | j| j| j| j| j| j| j| j| j	| j
| j| jS )zString representation.z_Selector(tag={!r}, ids={!r}, classes={!r}, attributes={!r}, nth={!r}, selectors={!r}, relations={!r}, rel_type={!r}, contains={!r}, lang={!r}, flags={!r}, no_match={!r}))rv   r   r   r   r   rN   r   r   r   r   r   r`   r   r   rk   rk   rl   __str__  s   z_Selector.__str__N)r   r   rb   rn   )r   r   rb   r   )rb   r   r   )	r   r   r   r   r   r   r   r   __repr__rk   rk   rk   rl   r   k  s    




r   c                   @  sJ  e Zd ZdZedeeddeefddeefdde	efd	d
e
efddeeffedeedeedeedeedeedeedeedeedefZ		dVdWd d!ZdXd(d)ZdXd*d+ZdXd,d-ZdYd2d3ZdZd4d5Zd[d8d9Zd\d>d?Zd]dDdEZdXdFdGZdXdHdIZ dXdJdKZ!dXdLdMZ"		d^d_dOdPZ#d`dRdSZ$d^dadTdUZ%dS )brh   zParse CSS selectors.pseudo_closepseudo_contains)r;   r<   r=   pseudo_nth_child)rA   rC   pseudo_nth_type)rB   rD   pseudo_lang)r@   
pseudo_dir)r?   pseudo_class_custompseudo_classpseudo_elementat_ruleidclassr   	attributecombineNr   r   r[   r^   *Optional[dict[str, str | ct.SelectorList]]r`   ra   rb   rn   c                 C  s>   | dd| _|| _| jtj@ | _|du ri | _dS || _dS )r    r   N)r   rZ   r`   r   DEBUGdebugr^   )r   r   r^   r`   rk   rk   rl   r     s   zCSSParser.__init__r   r   r}   r~   has_selectorr|   c                 C  sP  d}| d}| drt| dnd}| dr&t| ddd nd}t| d}d}	d}
d}|rD|d	kr>tjnd
tjB }nt|dkrTtjtjB }d}	ntj}|ru| ddrnt| ddd d}nt| d}|szd}nr|drtdt	| |}na|drtdt	| |}nP|drtdt	| |}n?|dr|rt
|rdnt	|}td| |}n#|drtdt	| |}ntdt	| |}|drd}|	r|rt|j}
t||||
}|rt }|j| t| gdd}|j| d}|S |j| d}|S )z8Create attribute selector from the returned regex match.FcmpcaseNattr_nsr   	attr_nameir   typeTrJ   "'r   ^z^%s.*$z.*?%s$*z.*?%s.*~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*|z^%s(?:-.*)?$z^%s$!)r   r   rs   rx   r   r   DOTALL
startswithr   r   RE_WSsearchrZ   r   SelectorAttributer   r   r   r   r   r   )r   r   r}   r   inverseopr   nsrK   is_typepattern2rJ   r`   rZ   sel_attrsub_selnot_listrk   rk   rl   parse_attribute_selector  s^   
$





z"CSSParser.parse_attribute_selectorc                 C  sH   | drt| ddd nd}t| d}t|||_d}|S )z#Parse tag pattern from regex match.tag_nsNr   tag_nameT)r   rx   r   SelectorTagr   )r   r   r}   r   prefixr   rk   rk   rl   parse_tag_pattern!  s
   $zCSSParser.parse_tag_patternc                 C  s   t t|d}| j|}|du r%td||d| j	|dt
|tjsA| j|= t|| j| jdjtd}|| j|< |j| d}|S )z
        Parse custom pseudo class alias.

        Compile custom selectors as we need them. When compiling a custom selector,
        set it to `None` in the dictionary so we can avoid an infinite loop.
        rL   Nz3Undefined custom selector '{}' found at position {}r   rd   r`   T)r   rs   rx   r   r^   r   r   rv   endrZ   
isinstancer   r   rh   r`   ri   
FLG_PSEUDOr   r   )r   r   r}   r   r   r   rk   rk   rl   parse_pseudo_class_custom*  s&   

z#CSSParser.parse_pseudo_class_custom	iselector Iterator[tuple[str, Match[str]]]is_htmltuple[bool, bool]c                 C  s  d}t t|d}|drd}|r)|tv r)| |||||d}||fS |s|tv r|dkr?| jt	j
O  _nY|dkrO| jt	jO  _d}nI|dkr]| jt	jO  _n;|d	krk| jt	jO  _n-|d
v rw|jt n!|dkr|jt n|dkr|jt n	|dkr|jt n|dkr|jt n|dkr|jt n|dkr|jt n|dkr|jt n|dkr|jt n|dkr|jt n|dkr|jt n|dkr|jt n|dkr|jt n|dkr|jt	dddddt	  n|dkr)|jt	dddddt	  no|dkr?|jt	dddddt	  nY|dkrU|jt	dddddt	  nC|dkrw|j t	dddddt	 t	dddddt	 g n!|dkr|j t	dddddt	 t	dddddt	 g d}||fS |r|t!v r| "||dt#t$B  d|_%d}||fS |s|t&v rd|_%d}||fS |t'v rt(d)|| j*|+dt,d)|) zParse pseudo class.FrL   openTr   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!   z$Invalid syntax for pseudo class '{}'z1'{}' pseudo-class is not implemented at this time)-r   rs   rx   r   PSEUDO_COMPLEXparse_pseudo_openr  PSEUDO_SIMPLEr`   r   SEL_ROOTSEL_DEFINED	SEL_SCOPE	SEL_EMPTYr   r   CSS_LINKCSS_CHECKEDCSS_DEFAULTCSS_INDETERMINATECSS_DISABLEDCSS_ENABLEDCSS_REQUIREDCSS_OPTIONALCSS_READ_ONLYCSS_READ_WRITECSS_IN_RANGECSS_OUT_OF_RANGECSS_PLACEHOLDER_SHOWNrN   SelectorNthr   r   PSEUDO_COMPLEX_NO_MATCHparse_selectorsr  FLG_OPENr   PSEUDO_SIMPLE_NO_MATCHPSEUDO_SUPPORTEDr   rv   rZ   startNotImplementedError)r   r   r}   r   r  r  complex_pseudor   rk   rk   rl   parse_pseudo_classF  s   

N
"
"
"
"


zCSSParser.parse_pseudo_classc                 C  s0  |  }|drd}nd}tt|d |d< t|d| }|dkr.d}d}	d	}
nq|d
kr9d}d}	d	}
nfttt t	|}|
drQ|
ddkrQdnd}|
d}|d}
|drg|d7 }n|
rr||dd 7 }n||7 }|
dr|
ddkrdnd}|
dr||
d7 }nd}t|d}t|d}	|d }|dkr|
dr| ||dttB }nt}|dkr|jt||
|	dd| d	}|S |dkr|jt||
|	dd	| d	}|S |dkr|jt||
|	d	dt  d	}|S |dkr|jt||
|	d	d	t  d	}|S )zParse `nth` pseudo.r   _child_typerL   rN   evenrQ   r   Toddr   s1r   r   an1Nr   s2b0
   ofrA   FrC   rB   rD   )	groupdictr   r   rs   rx   r   r
   r[   RE_NTHru   r   endswithr   ra   r0  r  r  r1  CSS_NTH_OF_S_DEFAULTrN   r   r   r.  r   )r   r   r}   r   r  mdictpostfixrz   r<  r@  var	nth_parts_s1r=  _s2
pseudo_selnth_selrk   rk   rl   parse_pseudo_nth  sd   	
 



 



 
 zCSSParser.parse_pseudo_nthrL   r   c                 C  sZ   t tB }|dkr|tO }n|dkr|tO }n|dv r|tO }|j| ||| d}|S )z"Parse pseudo with opening bracket.r9   r8   )r:   r7   T)r  r1  FLG_NOTFLG_RELATIVEFLG_FORGIVEr   r   r0  )r   r   rL   r   r  r   r`   rk   rk   rl   r    s   


zCSSParser.parse_pseudo_openr   r   r   tuple[bool, _Selector, str]c                 C  s   | d }|st}|tkr%||_|d j| dt }|t  n$|r3||_|d j| n|dd tkrEtd	|| j
|d| }t }d}|||fS )Parse combinator tokens.relationr   :r   Nz'The multiple combinators at position {}F)r   stripWS_COMBINATORCOMMA_COMBINATORr   r   r   r   r   rv   rZ   )r   r   r}   r   r   r   r   
combinatorrk   rk   rl   parse_has_combinator  s*   
zCSSParser.parse_has_combinatorr   	is_pseudo
is_forgivetuple[bool, _Selector]c	           
      C  s   | d }	|	st}	|s0|r|	tkrtd|	|| j||	tkr/d|_|dd= || n4|	tkrQ|j	s@|s@t
dd|_	|j| || |dd= n|j| |	|_|dd= || t }d}||fS )rV  rW  zBThe combinator '{}' at position {}, must have a selector before itTNr   F)r   rY  rZ  r[  r   rv   rZ   r   r   r   r   r  r   r   r   r   )
r   r   r}   r   r   r   r^  r_  r   r\  rk   rk   rl   parse_combinator(  s8   






zCSSParser.parse_combinatorc                 C  sT   | d}|dr|jt|dd  d}|S |jt|dd  d}|S )zParse HTML classes and ids.r   .r   NT)r   r   r   r   rx   r   )r   r   r}   r   r   rk   rk   rl   parse_class_idX  s   

zCSSParser.parse_class_idc           
      C  s   t t|d}|dkrtdt |dk}t|d}g }t|D ]%}|dr.q&|d}	|		drBt|	d	d
 d}	nt|	}	|
|	 q&|j
t|| d}|S )zParse contains.rL   r;   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.r=   valuessplitrJ   )r   r   r   r   T)r   rs   rx   r   warningswarnFutureWarning	RE_VALUESfinditerr   r   r   r   SelectorContains)
r   r   r}   r   r   contains_ownrd  r   tokenrJ   rk   rk   rl   parse_pseudo_containsc  s(   


zCSSParser.parse_pseudo_containsc                 C  s~   | d}g }t|D ]%}| drq| d}|dr(t|dd d}nt|}|| q|jt| d}|S )zParse pseudo language.rd  re  rJ   r   r   r   T)	r   ri  rj  r   rx   r   r   r   SelectorLang)r   r   r}   r   rd  r   rm  rJ   rk   rk   rl   parse_pseudo_lang|  s   



zCSSParser.parse_pseudo_langc                 C  s6   t |ddkrtjntj}| j|O  _d}|S )zParse pseudo direction.dirltrT)r   rs   r   r   SEL_DIR_LTRSEL_DIR_RTLr`   )r   r   r}   r   rJ   rk   rk   rl   parse_pseudo_dir  s    zCSSParser.parse_pseudo_dirr   c              
   C  s  t  }g }d}d}g }dt }	t|t@ }
t|t@ }t|t@ }t|t@ }t|t@ }t|t@ }t|t	@ }t|t
@ }t|t@ }t|t@ }t|t@ }| jr|rZtd |
r`td |rftd |rltd |rrtd |rxtd |r~td	 |rtd
 |rtd |rtd |rtd |r|t   z	 t|\}}|dkrtd|d|dkr| |||}n|dkr| |||||\}}n|dkrtd|d|dkr| |||}n|dv r| ||||}n|dkr| |||}n|dkr| |||}d}n|dkrH|s2|s/td|d| j|dd|_|
r8d}nttd|d| j|d|dkrm|r^| |||||	|\}}}	nH| ||||||||\}}n9|dkrz|  |||}n,|dkr|rtd |d| j|d| !|||}n|d!v r| "|||}|#d}qW n
 t$y   Y nw |
r|std"|| j||r|j%s|st&'d#d$|_%|r|	|_(|d% j)| n)|j)*| |d$d$= || n|r|r|sd|_|d$d$= || d}|std|| j||r't&j+|d% _,|r0t&j-|d% _,|r9t&j.|d% _,|rBt&j/|d% _,|rKt&j0|d% _,t&1d&d' |D ||S )(zParse selectors.FrX  z    is_pseudo: Truez    is_open: Truez    is_relative: Truez    is_not: Truez    is_html: Truez    is_default: Truez    is_indeterminate: Truez    is_in_range: Truez    is_out_of_range: Truez    is_placeholder_shown: Truez    is_forgive: TrueTr   zAt-rules found at position {}r   r   r   r   z#Pseudo-element found at position {}r   )r   r   r   r   r   z"Expected a selector at position {}z+Unmatched pseudo-class close at position {}r   r   r   z5Tag name found at position {} instead of at the start)r   r   z$Unclosed pseudo-class at position {}r   Nr   c                 S  s   g | ]}|  qS rk   )r   ).0srk   rk   rl   
<listcomp>K  s    z-CSSParser.parse_selectors.<locals>.<listcomp>)2r   rZ  r|   r1  r  rS  rR  FLG_HTMLFLG_DEFAULTFLG_INDETERMINATEFLG_IN_RANGEFLG_OUT_OF_RANGEFLG_PLACEHOLDER_SHOWNrT  r   printr   nextr5  rv   r4  r  r7  rn  rQ  rp  ru  r   rZ   r   r]  ra  r
  r  rc  r  StopIterationr   r   r  r   r   r   SEL_DEFAULTr`   SEL_INDETERMINATESEL_IN_RANGESEL_OUT_OF_RANGESEL_PLACEHOLDER_SHOWNr   )r   r  r   r`   r   r   r   closedr   r   is_openr^  is_relativeis_notr  
is_defaultis_indeterminateis_in_rangeis_out_of_rangeis_placeholder_shownr_  ry   r}   rk   rk   rl   r0    s  	








!


	zCSSParser.parse_selectorsrZ   c           	   	   c  sb   t |}|r|dnd}t|}|r|dd nt|d }| jr-td| ||krd}| j	D ].}|
||| j}|rd| }| jrXtd||d|d |d}||fV   nq6|du r|| }|dkrwd|}n$|dkrd	|}n|d
krd|}n|dkrd|}nd||}t|| j|||ks1| jrtd dS dS )zIterate selector tokens.r   r   z## PARSING: {!r}Nz#TOKEN: '{}' --> {!r} at position {}[z+Malformed attribute selector at position {}rb  z'Malformed class selector at position {}#z$Malformed id selector at position {}rX  z.Malformed pseudo-class selector at position {}z"Invalid character {!r} position {}z## END PARSING)RE_WS_BEGINr   r  	RE_WS_ENDr4  r   r   r  rv   
css_tokensru   r`   r   r   r   rZ   )	r   rZ   r}   r   r  vrL   r   msgrk   rk   rl   selector_iterM  sF   




zCSSParser.selector_iterc                 C  s   |  | | j||S )zProcess selectors.)r0  r  rZ   )r   r   r`   rk   rk   rl   ri   v  s   zCSSParser.process_selectors)Nr   )r   r[   r^   r   r`   ra   rb   rn   )r   r   r}   r~   r   r|   rb   r|   )r   r   r}   r~   r   r|   r  r  r  r|   rb   r  )
r   r   r}   r~   r   r|   r  r  rb   r|   )r   r   rL   r[   r   r|   r  r  r   ra   rb   r|   )r   r   r}   r~   r   r|   r   r   r   r[   r   ra   rb   rU  )r   r   r}   r~   r   r|   r   r   r   r   r^  r|   r_  r|   r   ra   rb   r`  )r   r   )r  r  r   ra   r`   ra   rb   r   )rZ   r[   rb   r  )r   ra   r`   ra   rb   r   )&r   r   r   r   r   PAT_PSEUDO_CLOSEr   PAT_PSEUDO_CONTAINSPAT_PSEUDO_NTH_CHILDPAT_PSEUDO_NTH_TYPEPAT_PSEUDO_LANGPAT_PSEUDO_DIRPAT_PSEUDO_CLASS_CUSTOMPAT_PSEUDO_CLASSPAT_PSEUDO_ELEMENTPAT_AT_RULEPAT_ID	PAT_CLASSPAT_TAGPAT_ATTRPAT_COMBINEr  r   r
  r  r  r7  rQ  r  r]  ra  rc  rn  rp  ru  r0  r  ri   rk   rk   rk   rl   rh     s\    





F
	

_
A

+
0


 
5)rh   zhtml|*:is(a, area)[href]r  z\
    html|*:is(input[type=checkbox], input[type=radio])[checked], html|option[selected]
    z
    :checked,

    /*
    This pattern must be at the end.
    Special logic is applied to the last selector.
    */
    html|form html|*:is(button, input)[type="submit"]
    aF  
    html|input[type="checkbox"][indeterminate],
    html|input[type="radio"]:is(:not([name]), [name=""]):not([checked]),
    html|progress:not([value]),

    /*
    This pattern must be at the end.
    Special logic is applied to the last selector.
    */
    html|input[type="radio"][name]:not([name='']):not([checked])
    a  
    html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset)[disabled],
    html|optgroup[disabled] > html|option,
    html|fieldset[disabled] > html|*:is(input:not([type=hidden]), button, select, textarea, fieldset),
    html|fieldset[disabled] >
        html|*:not(legend:nth-of-type(1)) html|*:is(input:not([type=hidden]), button, select, textarea, fieldset)
    z|
    html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset):not(:disabled)
    z,html|*:is(input, textarea, select)[required]z2html|*:is(input, textarea, select):not([required])aW  
    html|input:is(
        :not([type]),
        [type=""],
        [type=text],
        [type=search],
        [type=url],
        [type=tel],
        [type=email],
        [type=password],
        [type=number]
    )[placeholder]:not([placeholder='']):is(:not([value]), [value=""]),
    html|textarea[placeholder]:not([placeholder=''])
    z*|*a  
    html|*:is(
        textarea,
        input:is(
            :not([type]),
            [type=""],
            [type=text],
            [type=search],
            [type=url],
            [type=tel],
            [type=email],
            [type=number],
            [type=password],
            [type=date],
            [type=datetime-local],
            [type=month],
            [type=time],
            [type=week]
        )
    ):not([readonly], :disabled),
    html|*:is([contenteditable=""], [contenteditable="true" i])
    z!
    html|*:not(:read-write)
    z
    html|input:is(
        [type="date"],
        [type="month"],
        [type="week"],
        [type="time"],
        [type="datetime-local"],
        [type="number"],
        [type="range"]
    ):is(
        [min],
        [max]
    )
    )
rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   )rb   rn   )r^   r_   rb   rq   )F)rz   r[   r{   r|   rb   r[   )rI   r[   rb   r[   )gr   
__future__r   r   	functoolsr   r   r   r   rf   r   r   r   rf  typingr	   r
   r   r   r   r   r  r2  r  r/  PSEUDO_SPECIALr3  NEWLINErv   WSCOMMENTSWSCCSS_ESCAPESCSS_STRING_ESCAPES
IDENTIFIERNTHVALUEATTRr  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r  r   r   r   r   rF  r   ri  r   r  r  rt   r[  rZ  r  rR  rS  rz  ry  r{  r1  r|  r}  r~  rT  	_MAXCACHErm   rp   re   rx   r   r   r   r   rh   ri   r!  r"  r#  r$  r%  r&  r'  r(  r-  rH  r*  r)  r+  r,  rk   rk   rk   rl   <module>   sV   	






%E     U


