o
    \"<f#»  ã                   @   sØ  d 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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Z0d+ e-¡Z1d,je%d!Z2d-je.e"e!e e&d.Z3d/je.e"e&d0Z4d1je.e"e'd2Z5d3je.e"d4Z6d5je e"d6Z7d1je.e"e'd2Z8e 9d7je"dej:¡Z;e 9d8je edej:¡Z<e 9d9je"dej:¡Z=e 9d:je"e'dej>¡Z?e 9e ¡Z@e 9d; e"¡¡ZAe 9d< e"¡¡ZBe 9d= e/¡ej>¡ZCd>ZDd?ZEdZFd@ZGdAZHdBZIdCZJdDZKdEZLdFZMdGZNdHZOdIZPdJZQeeQdKdLeRdMee	jS dNee	jT dOeUdPejVf
dQdR„ƒZWdudSdT„ZXdNee	jT dPeeReeRe	jYf f fdUdV„ZZdvdXeRdYe[dPeRfdZd[„Z\d\eRdPeRfd]d^„Z]G d_d`„ d`ƒZ^G dadb„ dbe^ƒZ_G dcdd„ ddƒZ`G dedf„ dfƒZaeadgƒjbeFeJB dhZceadiƒjbeFeJB dhZdeadjƒjbeFeJB eIB dhZeeadkƒjbeFeJB eKB dhZfeadlƒjbeFeJB dhZgeadmƒjbeFeJB dhZheadnƒjbeFeJB dhZieadoƒjbeFeJB dhZjeadpƒjbeFeJB eOB dhZkeadqƒjbeFdhZleadrƒjbeFeJB dhZmeadsƒjbeFeJB dhZneadtƒjbeFeMB eJB dhZoeadtƒjbeFeNB eJB dhZpdS )wzCSS selector parser.é    N)Ú	lru_cacheé   )Úutil)Ú	css_match)Ú	css_types)ÚSelectorSyntaxError)
ÚOptionalÚDictÚMatchÚTupleÚTypeÚAnyÚListÚUnionÚ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-contextr8   r9   >   ú: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]|$)))rI   z/(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$|{nl})))rI   Ú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}+)
)rK   ÚidentzU
(?:{ws}*(?P<cmp>[!~^|*$]?=){ws}*(?P<value>{value})(?:{ws}+(?P<case>[is]))?)?{ws}*\]
)rI   Úvaluez	\#{ident})rM   z	\.{ident}z6(?P<tag_ns>(?:{ident}|\*)?\|)?(?P<tag_name>{ident}|\*)zD
\[{ws}*(?P<attr_ns>(?:{ident}|\*)?\|)?(?P<attr_name>{ident}){attr}
)rI   rM   Úattrz$(?P<name>:{ident})(?P<open>\({ws}*)?)rI   rM   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ÚwscrJ   rI   ÚnthzA
(?P<pseudo_nth_type>{name}
(?P<nth_type>{nth}|even|odd)){ws}*\)
)rP   rI   rR   z7{name}(?P<values>{value}(?:{ws}*,{ws}*{value})*){ws}*\))rP   rI   rN   z{name}(?P<dir>ltr|rtl){ws}*\))rP   rI   z0{wsc}*?(?P<relation>[,+>~]|{ws}(?![,+>~])){wsc}*)rI   rQ   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Ú
namespacesÚcustomÚflagsÚreturnc                 C   s(   t |ƒ}t | t| ||d ¡ |||¡S )zCached CSS compile.©r`   ra   )Úprocess_customÚcmÚ	SoupSieveÚ	CSSParserÚprocess_selectors)r^   r_   r`   ra   Úcustom_selectors© rj   úK/var/www/html/kck/venv/lib/python3.10/site-packages/soupsieve/css_parser.pyÚ_cached_css_compileÎ   s   	ý÷rl   c                   C   s   t  ¡  dS )zPurge the cache.N)rl   Úcache_clearrj   rj   rj   rk   Ú_purge_cacheå   s   rn   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`   ri   ÚkeyrN   rP   rj   rj   rk   rd   ë   s   
rd   FÚcontentÚstringc                 C   s*   dt t dtf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.
    Úmrb   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   NrX   r   rU   é   õ   ï¿½Ú )ÚgroupÚintÚUNICODE_REPLACEMENT_CHARÚchr)ry   Ú	codepointrN   rj   rj   rk   Úreplace  s   

ù
ûþzcss_unescape.<locals>.replace)r
   ÚstrÚ
RE_CSS_ESCÚRE_CSS_STR_ESCÚsub)rw   rx   r‚   rj   rj   rk   ru   ú   s   ru   rM   c                 C   sj  g }t | ƒ}|dko| d dk}|dkr|r| d | ¡¡ n‘t| ƒ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s¡d	|  kr~d
ks¡n d	|  kr‰d
ks¡n d|  kr”dks¡n d|  krŸdkr§n n| |¡ q#| d |¡¡ q#d |¡S )zEscape identifier.r   ú-r   z\{}r{   é   é   z\{:x} é0   é9   )é-   é_   r[   éA   éZ   éa   éz   r|   )ÚlenÚappendrs   Ú	enumerateÚordÚjoin)rM   rx   ÚlengthÚ
start_dashÚindexÚcr   rj   rj   rk   Úescape  s$   ,&D
r›   c                
   @   sV   e Zd ZdZdededdfdd„Zdefdd	„Zd
edededee	e  fdd„Z
dS )ÚSelectorPatternúSelector pattern.rP   r^   rb   Nc                 C   s&   || _ t |tjtjB tjB ¡| _dS )úInitialize.N)rP   ÚreÚcompileÚIÚXÚUÚ
re_pattern)ÚselfrP   r^   rj   rj   rk   Ú__init__4  s    zSelectorPattern.__init__c                 C   s   | j S )ú	Get name.)rP   ©r¥   rj   rj   rk   Úget_name:  s   zSelectorPattern.get_nameÚselectorr™   ra   c                 C   s   | j  ||¡S )úMatch the selector.)r¤   rr   )r¥   rª   r™   ra   rj   rj   rk   rr   ?  s   zSelectorPattern.match)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rƒ   r¦   r©   r~   r   r
   rr   rj   rj   rj   rk   rœ   1  s
    &rœ   c                
   @   sr   e Zd ZdZdeeeeedf eee f df ddfdd„Zdefdd	„Z	d
ede
de
deee  fdd„ZdS )ÚSpecialPseudoPatternr   Úpatterns.rb   Nc                 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   rz   rU   r   N)	r±   Úmatched_namerŸ   r    ÚPAT_PSEUDO_CLASS_SPECIALr¡   r¢   r£   Úre_pseudo_name)r¥   r±   ÚprP   r^   Úpseudorj   rj   rk   r¦   H  s   ÿ zSpecialPseudoPattern.__init__c                 C   s   | j du rdS | j  ¡ S )r§   Nr|   )r²   r©   r¨   rj   rj   rk   r©   U  s   zSpecialPseudoPattern.get_namerª   r™   ra   c                 C   sV   d}| j  ||¡}|r)t t| d¡ƒ¡}| j |¡}|r)| |||¡}|r)|| _|S )r«   NrP   )	r´   rr   r   rp   ru   r}   r±   Úgetr²   )r¥   rª   r™   ra   r¶   ry   rP   r^   rj   rj   rk   rr   Z  s   zSpecialPseudoPattern.match)r¬   r­   r®   r¯   r   rƒ   r   rœ   r¦   r©   r~   r   r
   rr   rj   rj   rj   rk   r°   E  s
    2&r°   c                   @   sf   e Zd ZdZdeddfdd„Zded  dejfdd	„Z	de
ejejf fd
d„Zdef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.
    Úkwargsrb   Nc                 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Ú
attributesrR   Ú	selectorsÚ	relationsÚrel_typeÚcontainsÚlangra   r   Úno_matchF)r·   rº   r»   r¼   r½   rR   r¾   r¿   rÀ   rÁ   rÂ   ra   rÃ   )r¥   r¹   rj   rj   rk   r¦   s  s   z_Selector.__init__r¿   c                 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¿   Úselrj   rj   rk   Ú_freeze_relationsƒ  s
   z_Selector._freeze_relationsc                 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½   rR   r¾   rÉ   r¿   rÀ   rÁ   rÂ   ra   r¨   rj   rj   rk   rÇ     s   
õz_Selector.freezec                 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}))rs   rº   r»   r¼   r½   rR   r¾   r¿   rÀ   rÁ   rÂ   ra   rÃ   r¨   rj   rj   rk   Ú__str__¡  s   þýz_Selector.__str__)r¬   r­   r®   r¯   r   r¦   r   rÅ   rÆ   rÉ   r   rË   rÊ   rÇ   rƒ   rÍ   Ú__repr__rj   rj   rj   rk   r¸   j  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		dIdedeeeeeejf f  deddfdd„Zdedee d e de fd!d"„Z!dedee d e de fd#d$„Z"dedee d e de fd%d&„Z#dedee d e d'e$e%eee f  d(e de%e e f fd)d*„Z&dedee d e d'e$e%eee f  de f
d+d,„Z'ded-ed e d'e$e%eee f  d.ede fd/d0„Z(dedee d e d1e)e d2ed.ede%e eef fd3d4„Z*dedee d e d1e)e d5e)e d6e d7e d.ede%e ef fd8d9„Z+dedee d e de fd:d;„Z,dedee d e de fd<d=„Z-dedee d e de fd>d?„Z.dedee d e de fd@dA„Z/		dJd'e$e%eee f  d.ededejfdBdC„Z0dDede$e%eee f  fdEdF„Z1dJd.ededejfdGdH„Z2dS )Krg   zParse CSS selectors.Úpseudo_closeÚpseudo_contains)r?   r@   rA   Úpseudo_nth_child)rE   rG   Úpseudo_nth_type)rF   rH   Úpseudo_lang)rD   Ú
pseudo_dir)rC   Úpseudo_class_customÚpseudo_classÚpseudo_elementÚat_ruleÚidÚclassrº   Ú	attributeÚcombineNr   rª   r`   ra   rb   c                 C   s>   |  dd¡| _|| _| jtj@ | _|du ri | _dS || _dS )rž   ú r{   N)r‚   r^   ra   r   ÚDEBUGÚdebugr`   )r¥   rª   r`   ra   rj   rj   rk   r¦   Í  s   zCSSParser.__init__rÈ   ry   Úhas_selectorc                 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¡r‹t dt 	|¡ |¡}na| d¡rœt dt 	|¡ |¡}nP| d¡r­t dt 	|¡ |¡}n?| d¡rÉ|r¹t
 |¡r»dnt 	|¡}t d| |¡}n#| d¡rÚt dt 	|¡ |¡}nt dt 	|¡ |¡}| d¡rìd}|	rö|röt |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_nséÿÿÿÿr|   Ú	attr_nameÚir   ÚtypeTrN   ©ú"ú'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   rp   ru   rŸ   r¡   ÚDOTALLÚ
startswithr    r›   ÚRE_WSÚsearchr^   rÅ   ÚSelectorAttributer¸   r½   r“   rÆ   rÇ   r¾   )r¥   rÈ   ry   rà   ÚinverseÚoprâ   ÚnsrO   Úis_typeÚpattern2rN   ra   r^   Úsel_attrÚsub_selÚnot_listrj   rj   rk   Ú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}   ru   rÅ   ÚSelectorTagrº   )r¥   rÈ   ry   rà   Úprefixrº   rj   rj   rk   Ú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.
        rP   Nz3Undefined custom selector '{}' found at position {}r   rc   ©ra   T)r   rp   ru   r}   r`   r·   r   rs   Úendr^   Ú
isinstancerÅ   rÆ   rg   ra   rh   Ú
FLG_PSEUDOr¾   r“   )r¥   rÈ   ry   rà   r¶   rª   rj   rj   rk   Úparse_pseudo_class_custom)  s&   ý
ÿþ
z#CSSParser.parse_pseudo_class_customÚ	iselectorÚis_htmlc                 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 rÌd|_%d}||fS |t'v rÞt(d )|¡| j*| +d¡ƒ‚t,d )|¡ƒ‚) zParse pseudo class.FrP   Ú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   rp   ru   r}   ÚPSEUDO_COMPLEXÚparse_pseudo_openr  ÚPSEUDO_SIMPLEra   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_SHOWNrR   ÚSelectorNthrÆ   rÄ   ÚPSEUDO_COMPLEX_NO_MATCHÚparse_selectorsr  ÚFLG_OPENrÃ   ÚPSEUDO_SIMPLE_NO_MATCHÚPSEUDO_SUPPORTEDr   rs   r^   ÚstartÚNotImplementedError)r¥   rÈ   ry   rà   r	  r
  Úcomplex_pseudor¶   rj   rj   rk   Úparse_pseudo_classE  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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|¡¡ 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Ú_typerP   rR   ÚevenrU   r   TÚoddr   Ús1r‡   r|   ÚaÚnÚ1Nrä   Ús2ÚbÚ0é
   ÚofrE   FrG   rF   rH   )Ú	groupdictr·   r   rp   ru   r   r
   rƒ   ÚRE_NTHrr   r}   Úendswithrò   r~   r"  r  r  r#  ÚCSS_NTH_OF_S_DEFAULTrR   r“   rÅ   r   rÆ   )r¥   rÈ   ry   rà   r	  ÚmdictÚpostfixrw   r.  r2  ÚvarÚ	nth_partsÚ_s1r/  Ú_s2Ú
pseudo_selÚnth_selrj   rj   rk   Úparse_pseudo_nth¤  sd   	
 



 



øû 
ý zCSSParser.parse_pseudo_nthrP   r™   c                 C   s^   t tB }|dkr|tO }n|dkr|ttB 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È   rP   rà   r	  r™   ra   rj   rj   rk   r  å  s   

zCSSParser.parse_pseudo_openr¾   rÀ   c                 C   s°   |  d¡ ¡ }|st}|tkr*|sd|_||_|d j |¡ dt }| tƒ ¡ n$|r8||_|d j |¡ n|dd… tkrJt	d 
|¡| j|ƒ‚d| }tƒ }d}|||fS )	úParse combinator tokens.ÚrelationTrä   ú:r   Nz'The multiple combinators at position {}F)r}   ÚstripÚWS_COMBINATORÚCOMMA_COMBINATORrÃ   rÀ   r¿   r“   r¸   r   rs   r^   )r¥   rÈ   ry   rà   r¾   rÀ   r™   Ú
combinatorrj   rj   rk   Úparse_has_combinatorü  s.   ý
zCSSParser.parse_has_combinatorr¿   Ú	is_pseudoÚ
is_forgivec	           
      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 )rG  rH  zBThe combinator '{}' at position {}, must have a selector before itTNrí   F)r}   rJ  rK  rL  r   rs   r^   rÃ   r“   rº   rÅ   r  r¿   rÄ   rÀ   r¸   )
r¥   rÈ   ry   rà   r¾   r¿   rO  rP  r™   rM  rj   rj   rk   Ú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“   ru   r»   )r¥   rÈ   ry   rà   rª   rj   rj   rk   Ú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.rP   r?   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.rA   ÚvaluesÚsplitrN   )rê   ré   r   rä   T)r   rp   ru   r}   ÚwarningsÚwarnÚFutureWarningÚ	RE_VALUESÚfinditerrò   r“   rÁ   rÅ   ÚSelectorContains)
r¥   rÈ   ry   rà   r¶   Úcontains_ownrT  r±   ÚtokenrN   rj   rj   rk   Ú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.rT  rU  rN   rè   r   rä   T)	r}   rY  rZ  rò   ru   r“   rÂ   rÅ   ÚSelectorLang)r¥   rÈ   ry   rà   rT  r±   r]  rN   rj   rj   rk   Ú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   rp   r}   rÅ   ÚSEL_DIR_LTRÚSEL_DIR_RTLra   )r¥   rÈ   ry   rà   rN   rj   rj   rk   Úparse_pseudo_dir•  s    zCSSParser.parse_pseudo_dirc              
   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	ƒ |r„td
ƒ |rŠtdƒ |rtdƒ |r–tdƒ |rž| t ƒ ¡ z	 t|ƒ\}}|dkrµtd | d¡¡ƒ‚|dkrÁ|  |||¡}nå|dkrÑ|  |||||¡\}}nÕ|dkrßt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š|r’td  | d¡¡| j| d¡ƒ‚|  !|||¡}n|d!v r¦|  "|||¡}| #d¡}q¡W n
 t$y·   Y nw |
rÈ|sÈtd" |¡| j|ƒ‚|rù|j%sÙ|sÙt& 'd#d$¡|_%|rè|	|_(|d% j) |¡ nM|j) *|¡ |d$d$…= | |¡ n<|r5|r |r|d% j(d$u r|	d&kr|	|_(d|_|d% j) |¡ d}n|r&|s5d|_|d$d$…= | |¡ d}|sBtd |¡| j|ƒ‚|rKt&j+|d% _,|rTt&j-|d% _,|r]t&j.|d% _,|rft&j/|d% _,|rot&j0|d% _,t& 1d'd(„ |D ƒ||¡S ))zParse selectors.FrI  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ä   z: c                 S   s   g | ]}|  ¡ ‘qS rj   )rÇ   )Ú.0Úsrj   rj   rk   Ú
<listcomp>Y  s    z-CSSParser.parse_selectors.<locals>.<listcomp>)2r¸   rK  Úboolr#  r  rE  rD  ÚFLG_HTMLÚFLG_DEFAULTÚFLG_INDETERMINATEÚFLG_IN_RANGEÚFLG_OUT_OF_RANGEÚFLG_PLACEHOLDER_SHOWNrF  rß   Úprintr“   Únextr'  rs   r&  r  r)  r^  rC  r`  re  r   r^   rÃ   rN  rQ  rþ   r  rS  r  ÚStopIterationrº   rÅ   r  rÀ   r¿   rÄ   ÚSEL_DEFAULTra   ÚSEL_INDETERMINATEÚSEL_IN_RANGEÚSEL_OUT_OF_RANGEÚSEL_PLACEHOLDER_SHOWNrÆ   )r¥   r	  r™   ra   rÈ   r¾   rà   Úclosedr¿   rÀ   Úis_openrO  Úis_relativeÚis_notr
  Ú
is_defaultÚis_indeterminateÚis_in_rangeÚis_out_of_rangeÚis_placeholder_shownrP  rv   ry   rj   rj   rk   r"    s,  	


ýý
ÿ
ÿ

ý

Â!ÿý
 €

ý	zCSSParser.parse_selectorsr^   c           	   	   c   sb   t  |¡}|r| d¡nd}t |¡}|r| d¡d nt|ƒd }| jr-td |¡ƒ ||kr¦d}| 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r‹d |¡}n|dkr•d |¡}nd ||¡}t|| j|ƒ‚||ks1| jr¯t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 {}rR  z'Malformed class selector at position {}ú#z$Malformed id selector at position {}rI  z.Malformed pseudo-class selector at position {}z"Invalid character {!r} position {}z## END PARSING)ÚRE_WS_BEGINrô   r  Ú	RE_WS_ENDr&  r’   rß   rp  rs   Ú
css_tokensrr   ra   r©   r}   r   r^   )	r¥   r^   ry   r™   r  ÚvrP   rš   Úmsgrj   rj   rk   Úselector_iter[  sF   €




úæÿzCSSParser.selector_iterc                 C   s   |   |  | j¡||¡S )zProcess selectors.)r"  rˆ  r^   )r¥   r™   ra   rj   rj   rk   rh   „  s   zCSSParser.process_selectors)Nr   )r   r   )3r¬   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   rÅ   rÆ   r~   r¦   r¸   r
   ri  rþ   r  r  r   r   r)  rC  r  r   rN  rQ  rS  r^  r`  re  r"  rˆ  rh   rj   rj   rj   rk   rg   ¯  s    ü



öÿèüþýü
ûF	þýüûú

ù_þýüû
úAþýüûú
ùþýüûúù
ø0þýüûúùø	÷


ö0üþýü
û "?)rg   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]
    )
    )rb   N)F)qr¯   rŸ   Ú	functoolsr   r|   r   r   re   r   rÅ   r   rV  Útypingr   r	   r
   r   r   r   r   r   r   r   r   r  r$  r  r!  ÚPSEUDO_SPECIALr%  ÚNEWLINErs   Ú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…   r8  r¢   rY  ró   rƒ  r„  rq   rL  rK  r  rD  rE  rk  rj  rl  r#  rm  rn  ro  rF  Ú	_MAXCACHErƒ   Ú
NamespacesÚCustomSelectorsr~   rf   rl   rn   rÆ   rd   ri  ru   r›   rœ   r°   r¸   rg   rh   r  r  r  r  r  r  r  r  r  r:  r  r  r  r  rj   rj   rj   rk   Ú<module>   sh   0	
ýþþþ
ýýÿÿÿ
þ
ÿþýüû
*%E     dÿþÿüÿ
öÿôÿø
ÿüÿþÿþÿñÿþÿéÿüÿñÿ
ñ