o
    LK&hw                     @  sh  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 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 dZdZde de dZde dZde de dZde de dZ de de d Z!d!e d"e d#e  d$Z"de d%e d&e" d'e d(e d)Z#d*e  Z$d+e  Z%d,e  d-e  d.Z&d/e d0e  d1e  de# Z'd2e  d3e d4Z(d2e  d3e d5Z)d6e  dZ*d7Z+e d8Z,d9e( Z-d:e  Z.d;e) d<e! d=e d>e d?e e d@e d?e e dAZ/dBe) dCe! dDe dEZ0e) dFe" de dGe d?e" dHe d8Z1e) dIe d8Z2e dJe dKe d?Z3e) dFe" de dGe d?e" dHe d8Z4e5dLe dMej6Z7e5dLe dNe dej6Z8e5dOe dPe dQej6Z9e5dRe" dSe dGe dTej:Z;e5eZ<e5dUe d?Z=e5e dVZ>e5dUe* dWej:Z?dXZ@dYZAdZBdZZCd[ZDd\ZEd]ZFd^ZGd_ZHd`ZIdaZJdbZKdcZLddZMeeMdeddpdqZNddsdtZOddvdwZPddd|d}ZQdddZRG dd dZSG dd deSZTG dd dZUG dd dZVeVdjWeBeFB dZXeVdjWeBeFB dZYeVdjWeBeFB eEB dZZeVdjWeBeFB eGB dZ[eVdjWeBeFB dZ\eVdjWeBeFB dZ]eVdjWeBeFB dZ^eVdjWeBeFB dZ_eVdjWeBeFB eKB dZ`eVdjWeBdZaeVdjWeBeFB dZbeVdjWeBeFB dZceVdjWeBeIB eFB dZdeVdjWeBeJB eFB dZeeVdjWeBeFB dZfeVdjWeBeFB dZgdS )zCSS selector parser.    )annotationsN)	lru_cache   )util)	css_match)	css_types)SelectorSyntaxError)MatchAnyIteratorcasti  >   :link:open:root:empty:muted: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:seeking:stalled:visited	:autofill
:buffering:fullscreen:local-link:focus-within:popover-open:user-invalid:focus-visible:target-within:volume-locked:picture-in-picture:host:current>   :matches:is:has:not:where	:contains:-soup-contains:-soup-contains-own>   :host-contextr=   r>   >   :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(?:|z(?:\\(?:[a-f0-9]{1,6}z?|[^\r\n\f]|$))z?|[^\r\n\f]|$|z))z8
(?:(?:-?(?:[^\x00-\x2f\x30-\x40\x5B-\x5E\x60\x7B-\x9f]|z>)+|--)
(?:[^\x00-\x2c\x2e\x2f\x3A-\x40\x5B-\x5E\x60\x7B-\x9f]|z)*)
z (?:[-+])?(?:[0-9]+n?|n)(?:(?<=n)z	*(?:[-+])z*(?:[0-9]+))?z(?:"(?:\\(?:.|z)|[^\\"\r\n\f]+)*?"|'(?:\\(?:.|z)|[^\\'\r\n\f]+)*?'|z+)z*(?P<cmp>[!~^|*$]?=)z*(?P<value>z)(?:z*(?P<case>[is]))?)?z*\]z\#z\.z(?P<tag_ns>(?:z|\*)?\|)?(?P<tag_name>z|\*)z\[z*(?P<attr_ns>(?:z|\*)?\|)?(?P<attr_name>z
(?P<name>:z)(?P<open>\(z*)?z*)z(?P<name>:(?=--)&z*\):z@Pz
(?P<pseudo_nth_child>z
(?P<nth_child>z|even|odd))(?:z*\)|(?P<of>*z*ofz*))
z
(?P<pseudo_nth_type>z
(?P<nth_type>z|even|odd))z*\)
z(?P<values>z*,z)*)z(?P<dir>ltr|rtl)z*?(?P<relation>[,+>~]|z(?![,+>~]))z(?:(\\[a-f0-9]{1,6}z?)|(\\[^\r\n\f])|(\\$))z?)|(\\[^\r\n\f])|(\\$)|(\\z'(?P<s1>[-+])?(?P<a>[0-9]+n?|n)(?:(?<=n)z*(?P<s2>[-+])z*(?P<b>[0-9]+))?z(?:(?P<value>z)|(?P<split>z*))^z*$$,                 @         i   i   i  )maxsizepatternstr
namespacesct.Namespaces | Nonecustomct.CustomSelectors | Noneflagsintreturncm.SoupSievec                 C  s(   t |}t| t| ||d |||S )zCached CSS compile.rd   rf   )process_customcm	SoupSieve	CSSParserprocess_selectors)r`   rb   rd   rf   custom_selectors rq   G/var/www/html/venv/lib/python3.10/site-packages/soupsieve/css_parser.py_cached_css_compile   s   	rs   Nonec                   C  s   t   dS )zPurge the cache.N)rs   cache_clearrq   rq   rq   rr   _purge_cache   s   rv    dict[str, str | ct.SelectorList]c                 C  sn   i }| dur5|   D ]*\}}t|}t|du r"td| d||v r.td| d||t|< q
|S )zProcess custom.Nz
The name 'z)' is not a valid custom pseudo-class namezThe custom selector 'z' has already been registered)itemsr   lower	RE_CUSTOMmatchr   KeyErrorcss_unescape)rd   rp   keyvaluenamerq   rq   rr   rk      s   
rk   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]rh   ra   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   NrZ   r   rW         � )grouprg   UNICODE_REPLACEMENT_CHARchr)r   	codepointr   rq   rq   rr   replace   s   


zcss_unescape.<locals>.replaceN)r   r   rh   ra   )
RE_CSS_ESCRE_CSS_STR_ESCsub)r   r   r   rq   rq   rr   r}      s   
r}   identc                 C  sr  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rO|d|dd	 q#|dksY|rp|dkrpd
|  krcdkrpn n|d|dd	 q#|dv s|dksd
|  krd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   \r         xrV   0   9   )-   _   r]   A   Z   a   z   r   )lenappend	enumerateordjoin)r   r   length
start_dashindexcr   rq   rq   rr   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.r   ra   r`   rh   rt   c                 C  s&   || _ t|tjtjB tjB | _dS )Initialize.N)r   recompileIXU
re_pattern)selfr   r`   rq   rq   rr   __init__2  s    zSelectorPattern.__init__c                 C  s   | j S )	Get name.)r   r   rq   rq   rr   get_name8  s   zSelectorPattern.get_nameselectorr   rg   rf   Match[str] | Nonec                 C  s   | j ||S )Match the selector.)r   r{   )r   r   r   rf   rq   rq   rr   r{   =  s   zSelectorPattern.matchN)r   ra   r`   ra   rh   rt   rh   ra   r   ra   r   rg   rf   rg   rh   r   __name__
__module____qualname____doc__r   r   r{   rq   rq   rq   rr   r   /  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]], ...]rh   rt   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   rW   r   N)	r   matched_namer   r   PAT_PSEUDO_CLASS_SPECIALr   r   r   re_pseudo_name)r   r   pr   r`   pseudorq   rq   rr   r   F  s    zSpecialPseudoPattern.__init__ra   c                 C  s   | j du rdS | j  S )r   Nr   )r   r   r   rq   rq   rr   r   S  s   zSpecialPseudoPattern.get_namer   r   rg   rf   r   c                 C  sV   d}| j ||}|r)tt|d}| j|}|r)||||}|r)|| _|S )r   Nr   )	r   r{   r   ry   r}   r   r   getr   )r   r   r   rf   r   r   r   r`   rq   rq   rr   r{   X  s   zSpecialPseudoPattern.matchN)r   r   rh   rt   r   r   r   rq   rq   rq   rr   r   C  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
   rh   rt   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
attributesnth	selectors	relationsrel_typecontainslangrf   r   no_matchF)r   r   r   r   r   r   r   r   r   r   r   rf   r   )r   r   rq   rq   rr   r   q  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   selrq   rq   rr   _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   r   r   r   r   r   r   r   rf   r   rq   rq   rr   r     s   
z_Selector.freezera   c                 C  sf   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S )zString representation.z_Selector(tag=z, ids=z
, classes=z, attributes=z, nth=z, selectors=z, relations=z, rel_type=z, contains=z, lang=z, flags=z, no_match=rN   )r   r   r   r   r   r   r   r   r   r   rf   r   r   rq   rq   rr   __str__  s$   "z_Selector.__str__N)r   r
   rh   rt   )r   r   rh   r   )rh   r   r   )	r   r   r   r   r   r   r   r   __repr__rq   rq   rq   rr   r   h  s    





r   c                   @  sR  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edefZ		dWdXd!d"ZdYd)d*ZdYd+d,ZdYd-d.ZdZd3d4Zd[d5d6Zd\d9d:Zd]d?d@Zd^dEdFZdYdGdHZ dYdIdJZ!dYdKdLZ"dYdMdNZ#		d_d`dPdQZ$dadSdTZ%d_dbdUdVZ&dS )crn   zParse CSS selectors.pseudo_closepseudo_contains)rD   rE   rF   pseudo_nth_child)rJ   rL   pseudo_nth_type)rK   rM   pseudo_lang)rI   
pseudo_dir)rH   pseudo_class_custompseudo_classpseudo_elementampat_ruleidclassr   	attributecombineNr   r   ra   rd   'dict[str, str | ct.SelectorList] | Nonerf   rg   rh   rt   c                 C  s>   | dd| _|| _| jtj@ | _|du ri | _dS || _dS )r    r   N)r   r`   rf   r   DEBUGdebugrd   )r   r   rd   rf   rq   rq   rr   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   typeTr   "'r   rS   z^%s.*rT   z.*?%s$rR   z.*?%s.*~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*rO   z^%s(?:-.*)?$z^%s$!)r   r   ry   r}   r   r   DOTALL
startswithr   r   RE_WSsearchr`   r   SelectorAttributer   r   r   r   r   r   )r   r   r   r   inverseopr   nsattris_typepattern2r   rf   r`   sel_attrsub_selnot_listrq   rq   rr   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   r}   r   SelectorTagr   )r   r   r   r   prefixr   rq   rq   rr   parse_tag_pattern  s
   $zCSSParser.parse_tag_patternc                 C  s   t t|d}| j|}|du r'td| d|d | j|dt	|t
jsC| 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.
        r   NzUndefined custom selector 'z' found at position r   rj   rf   T)r   ry   r}   r   rd   r   r   endr`   
isinstancer   r   rn   rf   ro   
FLG_PSEUDOr   r   )r   r   r   r   r   r   rq   rq   rr   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  _nu|dkrO| jt	jO  _d}ne|dkr]| jt	jO  _nW|d	krk| jt	jO  _nI|d
v rw|jt n=|dkr|jt n1|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 n|dkr/|jt	 dddddt	!  n|dkrE|jt	 dddddt	!  no|dkr[|jt	 dddddt	!  nY|dkrq|jt	 dddddt	!  nC|dkr|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 | d!| j+|,dt*d!| d"| j+|,d)#zParse pseudo class.Fr   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!   r   r"   z!Invalid syntax for pseudo class 'r  z' was detected as a pseudo-class and is either unsupported or invalid. If the syntax was not intended to be recognized as a pseudo-class, please escape the colon.)-r   ry   r}   r   PSEUDO_COMPLEXparse_pseudo_openr  PSEUDO_SIMPLErf   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_MUTEDCSS_OPENCSS_OPTIONALCSS_READ_ONLYCSS_READ_WRITECSS_IN_RANGECSS_OUT_OF_RANGECSS_PLACEHOLDER_SHOWNr   SelectorNthr   r   PSEUDO_COMPLEX_NO_MATCHparse_selectorsr  FLG_OPENr   PSEUDO_SIMPLE_NO_MATCHPSEUDO_SUPPORTEDr   r`   start)r   r   r   r   r  r   complex_pseudor   rq   rq   rr   parse_pseudo_classC  s   

U



"
"
"
"




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_typer   r   evenrW   r   Toddr   s1r   r   an1Nr   s2b0
   ofrJ   FrL   rK   rM   )	groupdictr   r   ry   r}   r   r	   ra   RE_NTHr{   r   endswithr  rg   r;  r  r  r<  CSS_NTH_OF_S_DEFAULTr   r   r   r9  r   )r   r   r   r   r  mdictpostfixr   rF  rJ  var	nth_parts_s1rG  _s2
pseudo_selnth_selrq   rq   rr   parse_pseudo_nth  sd   	
 



 



 
 zCSSParser.parse_pseudo_nthr   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.rB   rA   )rC   r@   T)r  r<  FLG_NOTFLG_RELATIVEFLG_FORGIVEr   r   r;  )r   r   r   r   r  r   rf   rq   rq   rr   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   rQ   r   Nz%The multiple combinators at position F)
r   stripWS_COMBINATORCOMMA_COMBINATORr   r   r   r   r   r`   )r   r   r   r   r   r   r   
combinatorrq   rq   rr   parse_has_combinator  s*   
zCSSParser.parse_has_combinatorr   	is_pseudo
is_forgivetuple[bool, _Selector]c	           
      C  s   | d }	|	st}	|s3|r|	tkr!td|	 d| d| j||	tkr2d|_|dd= || n4|	tkrT|jsC|sCt	
dd|_|j| || |dd= n|j| |	|_|dd= || t }d}||fS )	r`  ra  zThe combinator 'z' at position z , must have a selector before itTNrR   F)r   rb  rc  rd  r   r`   r   r   r   r   r  r   r   r   r   )
r   r   r   r   r   r   rg  rh  r   re  rq   rq   rr   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   r}   r   )r   r   r   r   r   rq   rq   rr   parse_class_id\  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.r   rD   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.rF   valuessplitr   )r  r  r   r   T)r   ry   r}   r   warningswarnFutureWarning	RE_VALUESfinditerr  r   r   r   SelectorContains)
r   r   r   r   r   contains_ownrm  r   tokenr   rq   rq   rr   parse_pseudo_containsg  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.rm  rn  r   r   r   r   T)	r   rr  rs  r  r}   r   r   r   SelectorLang)r   r   r   r   rm  r   rv  r   rq   rq   rr   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   ry   r   r   SEL_DIR_LTRSEL_DIR_RTLrf   )r   r   r   r   r   rq   rq   rr   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| jtjO  _d}n|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rX|sB|s?td|d | j|dd|_|
rHd}nutd|d | j|d|dkr}|rn|  |||||	|\}}}	nI| !||||||||\}}n:|dkr| "|||}n-|d kr|rtd!|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||r8tj,|d' _|rAtj-|d' _|rJtj.|d' _|rStj/|d' _|r\tj0|d' _t1d(d) |D ||S )*zParse selectors.FrQ   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   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   zTag name found at position z instead of at the start)r   r   z"Unclosed pseudo-class at position rR   Nr   c                 S  s   g | ]}|  qS rq   )r   ).0srq   rq   rr   
<listcomp>R  s    z-CSSParser.parse_selectors.<locals>.<listcomp>)2r   rc  r   r<  r  r]  r\  FLG_HTMLFLG_DEFAULTFLG_INDETERMINATEFLG_IN_RANGEFLG_OUT_OF_RANGEFLG_PLACEHOLDER_SHOWNr^  r   printr   nextNotImplementedErrorr?  rf   r   r(  r  rA  rw  r[  ry  r~  r   r`   r   rf  rj  r  r  rl  r  StopIterationr   r  r   r   r   SEL_DEFAULTSEL_INDETERMINATESEL_IN_RANGESEL_OUT_OF_RANGESEL_PLACEHOLDER_SHOWNr   )r   r  r   rf   r   r   r   closedr   r   is_openrg  is_relativeis_notr   
is_defaultis_indeterminateis_in_rangeis_out_of_rangeis_placeholder_shownrh  r~   r   rq   rq   rr   r;    s"  	









$


	zCSSParser.parse_selectorsr`   c           	   
   c  sn   t |}|r|dnd}t|}|r|dd nt|d }| jr-td| ||krd}| jD ]2}|	||| j
}|rh| }| jr\td| d|dd|d  |d}||fV   nq6|du r|| }|dkr{d	| }n&|d
krd| }n|dkrd| }n|dkrd| }nd|d| }t|| j|||ks1| jrtd dS dS )zIterate selector tokens.r   r   z## PARSING: NzTOKEN: 'z' --> z at position [z)Malformed attribute selector at position rk  z%Malformed class selector at position #z"Malformed id selector at position rQ   z,Malformed pseudo-class selector at position zInvalid character z
 position z## END PARSING)RE_WS_BEGINr  r  	RE_WS_ENDr?  r   r   r  
css_tokensr{   rf   r   r   r   r`   )	r   r`   r   r   r  vr   r   msgrq   rq   rr   selector_iterT  sF   


&

zCSSParser.selector_iterc                 C  s   |  | | j||S )zProcess selectors.)r;  r  r`   )r   r   rf   rq   rq   rr   ro   }  s   zCSSParser.process_selectors)Nr   )r   ra   rd   r   rf   rg   rh   rt   )r   r   r   r   r   r   rh   r   )r   r   r   r   r   r   r  r  r   r   rh   r!  )
r   r   r   r   r   r   r  r  rh   r   )r   r   r   ra   r   r   r  r  r   rg   rh   r   )r   r   r   r   r   r   r   r   r   ra   r   rg   rh   r_  )r   r   r   r   r   r   r   r   r   r   rg  r   rh  r   r   rg   rh   ri  )r   r   )r  r  r   rg   rf   rg   rh   r   )r`   ra   rh   r  )r   rg   rf   rg   rh   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_AMPPAT_AT_RULEPAT_ID	PAT_CLASSPAT_TAGPAT_ATTRPAT_COMBINEr  r   r  r  r  rA  r[  r$  rf  rj  rl  rw  ry  r~  r;  r  ro   rq   rq   rq   rr   rn     s^    





F
	

f
A

+
0


 
8)rn   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]
    )
    z*
    html|*:is(details, dialog)[open]
    z(
    html|*:is(video, audio)[muted]
    )
r`   ra   rb   rc   rd   re   rf   rg   rh   ri   )rh   rt   )rd   re   rh   rw   )F)r   ra   r   r   rh   ra   )r   ra   rh   ra   )hr   
__future__r   r   	functoolsr   r   r   r   rl   r   r   r   ro  typingr	   r
   r   r   r   r%  r=  r#  r:  PSEUDO_SPECIALr>  NEWLINE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   r   rP  r   rr  r  r  r  rz   rd  rc  r  r\  r]  r  r  r  r<  r  r  r  r^  	_MAXCACHErs   rv   rk   r}   r   r   r   r   rn   ro   r*  r+  r,  r-  r.  r/  r0  r3  r8  rR  r5  r4  r6  r7  r2  r1  rq   rq   rq   rr   <module>   sz   	$




(("



%D     `


