a
    !f׷                     @  s  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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/Z/d0je*ee"d1Z0d2je*ee#d3Z1d4je*ed5Z2d6jeed7Z3d2je*ee#d3Z4e5d8jedej6Z7e5d9jeedej6Z8e5d:jedej6Z9e5d;jee#d ej:Z;e5eZ<e5d<eZ=e5d=eZ>e5d>e+ej:Z?d?Z@d@ZAdZBdAZCdBZDdCZEdDZFdEZGdFZHdGZIdHZJdIZKdJZLdKZMeeMdLdMdNdOdPdQdRdSdTZNdUdVdWdXZOdOdYdZd[d\ZPd{dMd^dMd_d`daZQdMdMdbdcddZRG dedf dfZSG dgdh dheSZTG didj djZUG dkdl dlZVeVdmjWeBeFB dnZXeVdojWeBeFB dnZYeVdpjWeBeFB eEB dnZZeVdqjWeBeFB eGB dnZ[eVdrjWeBeFB dnZ\eVdsjWeBeFB dnZ]eVdtjWeBeFB dnZ^eVdujWeBeFB dnZ_eVdvjWeBeFB eKB dnZ`eVdwjWeBdnZaeVdxjWeBeFB dnZbeVdyjWeBeFB dnZceVdzjWeBeIB eFB dnZdeVdzjWeBeJB eFB dnZedS )|zCSS selector parser.    )annotationsN)	lru_cache   )util)	css_match)	css_types)SelectorSyntaxError)MatchAnyIteratorcasti  >   :indeterminate:first-of-type:root:last-of-type:only-of-type:out-of-range:read-write	:disabled:scope:placeholder-shown	:any-link:defined:default:link:enabled:last-child	:in-range	:optional	:required:first-child:only-child:checked:empty
:read-only>   z:focusz:visitedz:user-invalid:hostz:focus-visiblez:focus-withinz:playingz:activez:futurez:local-link:currentz:pastz:pausedz:target-withinz:hoverz:target>   :has:where:-soup-contains	:contains:is:-soup-contains-ownz:matches:not>   r&   z:host-contextr%   >   :dir:lang:nth-last-child:nth-last-of-type:nth-of-type
:nth-childz(?:\r\n|(?!\r\n)[\n\f\r])z(?:[ \t]|{})z"(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)z(?:{ws}|{comments}))wscommentsz*(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$)))r4   z/(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$|{nl})))r4   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}+)
)r6   identzU
(?:{ws}*(?P<cmp>[!~^|*$]?=){ws}*(?P<value>{value})(?:{ws}*(?P<case>[is]))?)?{ws}*\]
)r4   valuez	\#{ident})r8   z	\.{ident}z6(?P<tag_ns>(?:{ident}|\*)?\|)?(?P<tag_name>{ident}|\*)zD
\[{ws}*(?P<attr_ns>(?:{ident}|\*)?\|)?(?P<attr_name>{ident}){attr}
)r4   r8   attrz$(?P<name>:{ident})(?P<open>\({ws}*)?)r4   r8   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wscr5   r4   nthzA
(?P<pseudo_nth_type>{name}
(?P<nth_type>{nth}|even|odd)){ws}*\)
)r;   r4   r=   z7{name}(?P<values>{value}(?:{ws}*,{ws}*{value})*){ws}*\))r;   r4   r9   z{name}(?P<dir>ltr|rtl){ws}*\))r;   r4   z0{wsc}*?(?P<relation>[,+>~]|{ws}(?![,+>~])){wsc}*)r4   r<   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strzct.Namespaces | Nonezct.CustomSelectors | Noneintzcm.SoupSieve)pattern
namespacescustomflagsreturnc                 C  s(   t |}t| t| ||d |||S )zCached CSS compile.rM   rN   )process_customcmZ	SoupSieve	CSSParserprocess_selectors)rK   rL   rM   rN   custom_selectors rV   U/var/www/html/python-backend/venv/lib/python3.9/site-packages/soupsieve/css_parser.py_cached_css_compile   s    	rX   NonerO   c                   C  s   t   dS )zPurge the cache.N)rX   cache_clearrV   rV   rV   rW   _purge_cache   s    r\   z dict[str, str | ct.SelectorList])rM   rO   c                 C  sj   i }| durf|   D ]P\}}t|}t|du rBtd|||v rXt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)rM   rU   keyr9   r;   rV   rV   rW   rQ      s    
rQ   Fbool)contentstringrO   c                 C  s$   dd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.
    
Match[str]rI   )mrO   c                 S  sn   |  dr8t|  ddd d}|dkr.t}t|}n2|  drV|  ddd }n|  drfd}nd}|S )	z(Replace with the appropriate substitute.r   NrC   r   r@         � )grouprJ   UNICODE_REPLACEMENT_CHARchr)ri   	codepointr9   rV   rV   rW   replace  s    



zcss_unescape.<locals>.replace)
RE_CSS_ESCRE_CSS_STR_ESCsub)rf   rg   rq   rV   rV   rW   rc      s    rc   )r8   rO   c                 C  s  g }t | }|dko| d dk}|dkr@|r@|d|  n8t| D ],\}}t|}|dkrn|d qHd|  krdksn |dkr|d| qH|dks|r|dkrd	|  krd
krn n|d| qH|dv sZ|dksZd	|  krd
ksZn d	|  kr"d
ksZn d|  kr<dksZn d|  krVdkrfn n|| qH|d| qHd|S )zEscape identifier.r   -r   z\{}rk         z\{:x} 0   9   )-   _   rF   A   Z   a   z   rl   )lenappendra   	enumerateordjoin)r8   rg   lengthZ
start_dashindexcrp   rV   rV   rW   escape  sH    ,






r   c                   @  sD   e Zd ZdZddddddZdddd	Zdd
d
ddddZdS )SelectorPatternSelector pattern.rI   rY   )r;   rK   rO   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;   rK   rV   rV   rW   __init__5  s    zSelectorPattern.__init__rZ   c                 C  s   | j S )	Get name.)r;   r   rV   rV   rW   get_name;  s    zSelectorPattern.get_namerJ   Match[str] | Noneselectorr   rN   rO   c                 C  s   | j ||S )Match the selector.)r   r`   )r   r   r   rN   rV   rV   rW   r`   @  s    zSelectorPattern.matchN__name__
__module____qualname____doc__r   r   r`   rV   rV   rV   rW   r   2  s   r   c                   @  sB   e Zd ZdZdddddZddd	d
ZdddddddZdS )SpecialPseudoPatternr   zCtuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]rY   )patternsrO   c                 C  sh   i | _ |D ]6}|d }|d ||d }|d D ]}|| j |< q0q
d| _tttjtjB tjB | _dS )r   r   rj   r@   r   N)	r   matched_namer   r   PAT_PSEUDO_CLASS_SPECIALr   r   r   re_pseudo_name)r   r   pr;   rK   pseudorV   rV   rW   r   I  s    zSpecialPseudoPattern.__init__rI   rZ   c                 C  s   | j du rdS | j  S )r   Nrl   )r   r   r   rV   rV   rW   r   V  s    zSpecialPseudoPattern.get_namerJ   r   r   c                 C  sV   d}| j ||}|rRtt|d}| j|}|rR||||}|rR|| _|S )r   Nr;   )	r   r`   r   r^   rc   rm   r   getr   )r   r   r   rN   r   ri   r;   rK   rV   rV   rW   r`   [  s    zSpecialPseudoPattern.matchNr   rV   rV   rV   rW   r   F  s   r   c                   @  sP   e Zd ZdZdddddZddd	d
dZddddZd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.
    r
   rY   )kwargsrO   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
attributesr=   	selectors	relationsrel_typecontainslangrN   r   no_matchF)r   r   r   r   r   r=   r   r   r   r   r   rN   r   )r   r   rV   rV   rW   r   t  s    z_Selector.__init__list[_Selector]ct.SelectorList)r   rO   c                 C  s<   |r0|d }|j |dd  t| gS t S dS )zFreeze relation.r   r   N)r   extendctSelectorListfreeze)r   r   selrV   rV   rW   _freeze_relations  s
    z_Selector._freeze_relationszct.Selector | ct.SelectorNullrZ   c                 C  sh   | j rt S t| jt| jt| jt| jt| j	t| j
| | j| jt| jt| j| jS dS )zFreeze self.N)r   r   ZSelectorNullZSelectorr   tupler   r   r   r=   r   r   r   r   r   r   rN   r   rV   rV   rW   r     s    
z_Selector.freezerI   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}))ra   r   r   r   r   r=   r   r   r   r   r   rN   r   r   rV   rV   rW   __str__  s
    z_Selector.__str__N)	r   r   r   r   r   r   r   r   __repr__rV   rV   rV   rW   r   k  s   
r   c                   @  s  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dOdddddddZdd d!d!d"d#d$Zdd d!d!d"d%d&Zdd d!d!d"d'd(Zdd d!d)d!d*d+d,d-Zdd d!d)d!d.d/d0Zddd!d)dd!d1d2d3Zdd d!d4ddd5d6d7d8Zdd d!d4d4d!d!dd9d:	d;d<Zdd d!d!d"d=d>Zdd d!d!d"d?d@Z dd d!d!d"dAdBZ!dd d!d!d"dCdDZ"dPd)dddEdFdGdHZ#dd)dIdJdKZ$dQdddEdLdMdNZ%dS )RrS   zParse CSS selectors.pseudo_closepseudo_contains)r*   r)   r,   pseudo_nth_child)r3   r0   pseudo_nth_type)r2   r1   pseudo_lang)r/   
pseudo_dir)r.   pseudo_class_custompseudo_classpseudo_elementat_ruleidclassr   	attributecombineNr   rI   z'dict[str, str | ct.SelectorList] | NonerJ   rY   )r   rM   rN   rO   c                 C  s8   | dd| _|| _| jtj@ | _|du r.i n|| _dS )r    rk   N)rq   rK   rN   r   DEBUGdebugrM   )r   r   rM   rN   rV   rV   rW   r     s    zCSSParser.__init__r   rh   re   )r   ri   has_selectorrO   c                 C  s^  d}| d}| dr(t| dnd}| drLt| ddd nd}t| d}d}	d}
d}|r|d	kr|tjnd
tjB }n&t|dkrtjtjB }d}	ntj}|r| ddrt| ddd d}nt| d}|sd}n|drtdt	| |}n|dr<tdt	| |}n|dr`tdt	| |}n|dr|r~t
|rdnt	|}td| |}nJ|drtdt	| |}n&tdt	| |}|drd}|	r |r t|j}
t||||
}|rJt }|j| t| gdd}|j| n|j| d}|S )z8Create attribute selector from the returned regex match.FcmpcaseNZattr_nsrl   	attr_nameir   typeTr9   "'r   ^z^%s.*$z.*?%s$*z.*?%s.*~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*|z^%s(?:-.*)?$z^%s$!)rm   r   r^   rc   r   r   DOTALL
startswithr   r   RE_WSsearchrK   r   ZSelectorAttributer   r   r   r   r   r   )r   r   ri   r   Zinverseopr   nsr:   Zis_typeZpattern2r9   rN   rK   Zsel_attrZsub_selZnot_listrV   rV   rW   parse_attribute_selector  sZ    
$ 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.Ztag_nsNr   Ztag_nameT)rm   rc   r   SelectorTagr   )r   r   ri   r   prefixr   rV   rV   rW   parse_tag_pattern!  s
    $zCSSParser.parse_tag_patternc                 C  s   t t|d}| j|}|du rJtd||d| j	|dt
|tjs| 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;   Nz3Undefined custom selector '{}' found at position {}r   rP   rN   T)r   r^   rc   rm   rM   r   r   ra   endrK   
isinstancer   r   rS   rN   rT   
FLG_PSEUDOr   r   )r   r   ri   r   r   r   rV   rV   rW   parse_pseudo_class_custom*  s&    

z#CSSParser.parse_pseudo_class_customz Iterator[tuple[str, Match[str]]]ztuple[bool, bool])r   ri   r   	iselectoris_htmlrO   c                 C  s  d}t t|d}|dr&d}|rN|tv rN| |||||d}n|s`|tv r`|dkrz| jt	j
O  _n|dkr| jt	jO  _d}n|dkr| jt	jO  _n|d	kr| jt	jO  _n|d
v r|jt np|dkr|jt nV|dkr|jt n<|dkr8|jt n"|dkrR|jt n|dkrl|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 nl|dkr|jt nR|dkr"|jt n8|dkrP|jt	ddddd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	  n|dkr|jt	dddddt	  n|dkr|j t	dddddt	 t	dddddt	 g nB|dkrZ|j t	dddddt	 t	dddddt	 g d}n|r|t!v r| "||dt#t$B  d|_%d}nP|s|t&v rd|_%d}n4|t'v rt(d)|| j*|+dnt,d)|||fS ) 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   z$Invalid syntax for pseudo class '{}'z1'{}' pseudo-class is not implemented at this time)-r   r^   rc   rm   PSEUDO_COMPLEXparse_pseudo_openr   PSEUDO_SIMPLErN   r   ZSEL_ROOTZSEL_DEFINEDZ	SEL_SCOPEZ	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_SHOWNr=   SelectorNthr   r   PSEUDO_COMPLEX_NO_MATCHparse_selectorsr   FLG_OPENr   PSEUDO_SIMPLE_NO_MATCHPSEUDO_SUPPORTEDr   ra   rK   startNotImplementedError)r   r   ri   r   r   r   Zcomplex_pseudor   rV   rV   rW   parse_pseudo_classF  s    














$
"
"
"


zCSSParser.parse_pseudo_class)r   ri   r   r   rO   c                 C  s.  |  }|drd}nd}tt|d |d< t|d| }|dkr\d}d}	d	}
n|d
krrd}d}	d	}
nttt t	|}|
dr|
ddkrdnd}|
d}|d}
|dr|d7 }n|
r||dd 7 }n||7 }|
dr|
ddkrd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| n&|dkr&|jt||
|	dd	| nV|dkr|jt||
|	d	dt  n*|dkr&|jt||
|	d	d	t  d	}|S )zParse `nth` pseudo.r   _child_typer;   r=   Zevenr@   r   TZoddr   s1ru   rl   an1Nr   s2b0
   Zofr3   Fr0   r2   r1   )	groupdictr   r   r^   rc   r   r	   rI   RE_NTHr`   rm   endswithr   rJ   r  r   r   r  CSS_NTH_OF_S_DEFAULTr=   r   r   r  r   )r   r   ri   r   r   ZmdictZpostfixrf   r  r  varZ	nth_partsZ_s1r  Z_s2Z
pseudo_selZnth_selrV   rV   rW   parse_pseudo_nth  sX    	
 



$





"
 zCSSParser.parse_pseudo_nth)r   r;   r   r   r   rO   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.r-   r'   )r(   r+   T)r   r  FLG_NOTFLG_RELATIVEFLG_FORGIVEr   r   r  )r   r   r;   r   r   r   rN   rV   rV   rW   r     s    


zCSSParser.parse_pseudo_openr   ztuple[bool, _Selector, str])r   ri   r   r   r   r   rO   c                 C  s   | d }|st}|tkrJ||_|d j| dt }|t  nH|rf||_|d j| n$|dd tkrtd	|| j
|d| }t }d}|||fS )Parse combinator tokens.relationr   :r   Nz'The multiple combinators at position {}F)rm   stripWS_COMBINATORCOMMA_COMBINATORr   r   r   r   r   ra   rK   )r   r   ri   r   r   r   r   
combinatorrV   rV   rW   parse_has_combinator  s*    zCSSParser.parse_has_combinatorztuple[bool, _Selector])	r   ri   r   r   r   	is_pseudo
is_forgiver   rO   c	           
      C  s   | d }	|	st}	|s`|r&|	tkr<td|	|| j||	tkrd|_|dd= || nh|	tkr|j	s|st
dd|_	|j| || |dd= n&|j| |	|_|dd= || t }d}||fS )r  r  zBThe combinator '{}' at position {}, must have a selector before itTNr   F)rm   r!  r"  r#  r   ra   rK   r   r   r   r   r   r   r   r   r   )
r   r   ri   r   r   r   r&  r'  r   r$  rV   rV   rW   parse_combinator(  s6    





zCSSParser.parse_combinatorc                 C  sN   | d}|dr.|jt|dd  n|jt|dd  d}|S )zParse HTML classes and ids.r   .r   NT)rm   r   r   r   rc   r   )r   r   ri   r   r   rV   rV   rW   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 ]J}|dr\qL|d}	|		drt|	d	d
 d}	nt|	}	|
|	 qL|j
t|| d}|S )zParse contains.r;   r*   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.r,   valuessplitr9   )r   r   r   r   T)r   r^   rc   rm   warningswarnFutureWarning	RE_VALUESfinditerr   r   r   r   ZSelectorContains)
r   r   ri   r   r   Zcontains_ownr+  r   tokenr9   rV   rV   rW   parse_pseudo_containsc  s(    


zCSSParser.parse_pseudo_containsc                 C  s~   | d}g }t|D ]J}| dr(q| d}|drPt|dd d}nt|}|| q|jt| d}|S )zParse pseudo language.r+  r,  r9   r   r   r   T)	rm   r0  r1  r   rc   r   r   r   ZSelectorLang)r   r   ri   r   r+  r   r2  r9   rV   rV   rW   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.dirZltrT)r   r^   rm   r   ZSEL_DIR_LTRZSEL_DIR_RTLrN   )r   r   ri   r   r9   rV   rV   rW   parse_pseudo_dir  s     zCSSParser.parse_pseudo_dirr   )r   r   rN   rO   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r6|rtd |
rtd |rtd |rtd |rtd |rtd |rtd	 |rtd
 |rtd |r(td |r6td |rH|t   zBt|\}}|dkrztd|dn|dkr| |||}n|dkr| |||||\}}n|dkrtd|dn|dkr| |||}n|dv r| ||||}nf|dkr2| |||}nJ|dkrR| |||}d}n*|dkr|s|std|d| j|dd|_|
rd}qn td|d| j|dn|dkr
|r| |||||	|\}}}	n| ||||||||\}}nr|dkr$|  |||}nX|dkrd|rTtd |d| j|d| !|||}n|d!v r|| "|||}|#d}qLW n t$y   Y n0 |
r|std"|| j||r$|j%s|st&'d#d$|_%|r|	|_(|d% j)| n |j)*| |d$d$= || n0|rT|r6|sTd|_|d$d$= || d}|sntd|| j||rt&j+|d% _,|rt&j-|d% _,|rt&j.|d% _,|rt&j/|d% _,|rt&j0|d% _,t&1d&d' |D ||S )(zParse selectors.Fr   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: Truer   zAt-rules found at position {}r   r   r   r   z#Pseudo-element found at position {}r   )r   r   r   r   Tr   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 rV   )r   ).0srV   rV   rW   
<listcomp>K      z-CSSParser.parse_selectors.<locals>.<listcomp>)2r   r"  re   r  r   r  r  FLG_HTMLFLG_DEFAULTFLG_INDETERMINATEFLG_IN_RANGEFLG_OUT_OF_RANGEFLG_PLACEHOLDER_SHOWNr  r   printr   nextr	  ra   r  r   r
  r3  r  r4  r6  r   rK   r   r%  r(  r   r   r*  r   StopIterationr   r   r   r   r   r   ZSEL_DEFAULTrN   ZSEL_INDETERMINATEZSEL_IN_RANGEZSEL_OUT_OF_RANGEZSEL_PLACEHOLDER_SHOWNr   )r   r   r   rN   r   r   r   closedr   r   Zis_openr&  Zis_relativeis_notr   
is_defaultZis_indeterminateZis_in_rangeZis_out_of_rangeZis_placeholder_shownr'  rd   ri   rV   rV   rW   r    s   	
















	zCSSParser.parse_selectors)rK   rO   c           	   	   c  s`  t |}|r|dnd}t|}|r8|dd n
t|d }| jrXtd| ||krLd}| j	D ]\}|
||| j}|rl| }| jrtd||d|d |d}||fV   qql|du rX|| }|dkrd|}nN|dkrd	|}n8|d
krd|}n"|dkr0d|}nd||}t|| j|qX| jr\td dS )zIterate selector tokens.r   r   z## PARSING: {!r}Nz#TOKEN: '{}' --> {!r} at position {}[z+Malformed attribute selector at position {}r)  z'Malformed class selector at position {}#z$Malformed id selector at position {}r   z.Malformed pseudo-class selector at position {}z"Invalid character {!r} position {}z## END PARSING)RE_WS_BEGINr   r   	RE_WS_ENDr  r   r   rA  ra   
css_tokensr`   rN   r   rm   r   rK   )	r   rK   ri   r   r   vr;   r   msgrV   rV   rW   selector_iterM  s>    








zCSSParser.selector_iter)r   rN   rO   c                 C  s   |  | | j||S )zProcess selectors.)r  rN  rK   )r   r   rN   rV   rV   rW   rT   v  s    zCSSParser.process_selectors)Nr   )r   r   )r   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_COMBINErK  r   r   r   r   r
  r  r   r%  r(  r*  r3  r4  r6  r  rN  rT   rV   rV   rV   rW   rS     sZ   



  F	_A+0   5)rS   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]
    )
    )F)fr   
__future__r   r   	functoolsr   rl   r   r   rR   r   r   r   r-  typingr	   r
   r   r   rn   r   r  r   r  ZPSEUDO_SPECIALr  NEWLINEra   ZWSZCOMMENTSZWSCZCSS_ESCAPESZCSS_STRING_ESCAPES
IDENTIFIERZNTHZVALUEZATTRrY  rZ  r[  r\  rV  r   rU  rO  rW  rX  rQ  rR  rS  rT  r]  rP  r   r   rr   rs   r  r   r0  r   rI  rJ  r_   r#  r"  r   r  r  r<  r;  r=  r  r>  r?  r@  r  	_MAXCACHErX   r\   rQ   rc   r   r   r   r   rS   rT   r   r   r   r   r   r   r   r   r  r  r   r   r   r   rV   rV   rV   rW   <module>   sT  	




%E     U






