o
    B a»  ã                   @   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})*)
)Z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})rL   z	\.{ident}z6(?P<tag_ns>(?:{ident}|\*)?\|)?(?P<tag_name>{ident}|\*)zD
\[{ws}*(?P<attr_ns>(?:{ident}|\*)?\|)?(?P<attr_name>{ident}){attr}
)rI   rL   Úattrz$(?P<name>:{ident})(?P<open>\({ws}*)?)rI   rL   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}*\)
)rO   rI   rQ   z7{name}(?P<values>{value}(?:{ws}*,{ws}*{value})*){ws}*\))rO   rI   rM   z{name}(?P<dir>ltr|rtl){ws}*\))rO   rI   z0{wsc}*?(?P<relation>[,+>~]|{ws}(?![,+>~])){wsc}*)rI   rP   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_   r`   )Úprocess_customÚcmÚ	SoupSieveÚ	CSSParserÚprocess_selectors)r]   r^   r_   r`   Úcustom_selectors© ri   ú6/usr/lib/python3/dist-packages/soupsieve/css_parser.pyÚ_cached_css_compileÎ   s   	ý÷rk   c                   C   s   t  ¡  dS )zPurge the cache.N)rk   Úcache_clearri   ri   ri   rj   Ú_purge_cacheå   s   rm   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_   rh   ÚkeyrM   rO   ri   ri   rj   rc   ë   s   
rc   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.
    Úmra   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   NrW   r   rT   é   õ   ï¿½Ú )ÚgroupÚintÚUNICODE_REPLACEMENT_CHARÚchr)rx   Ú	codepointrM   ri   ri   rj   Úreplace  s   

ù
ûþzcss_unescape.<locals>.replace)r
   ÚstrÚ
RE_CSS_ESCÚRE_CSS_STR_ESCÚsub)rv   rw   r   ri   ri   rj   rt   ú   s   rt   rL   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\{}rz   é   é   z\{:x} é0   é9   )é-   é_   rZ   éA   éZ   éa   éz   r{   )ÚlenÚappendrr   Ú	enumerateÚordÚjoin)rL   rw   ÚlengthZ
start_dashÚindexÚcr€   ri   ri   rj   Úescape  sH   ,ÿÿÿÿþþþþþ
þ
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.rO   r]   ra   Nc                 C   s&   || _ t |tjtjB tjB ¡| _dS )úInitialize.N)rO   ÚreÚcompileÚIÚXÚUÚ
re_pattern)ÚselfrO   r]   ri   ri   rj   Ú__init__4  s    zSelectorPattern.__init__c                 C   s   | j S )ú	Get name.)rO   ©r£   ri   ri   rj   Úget_name:  s   zSelectorPattern.get_nameÚselectorr—   r`   c                 C   s   | j  ||¡S )úMatch the selector.)r¢   rq   )r£   r¨   r—   r`   ri   ri   rj   rq   ?  s   zSelectorPattern.match)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r‚   r¤   r§   r}   r   r
   rq   ri   ri   ri   rj   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.ra   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   ry   rT   r   N)	r¯   Úmatched_namer   rž   ÚPAT_PSEUDO_CLASS_SPECIALrŸ   r    r¡   Úre_pseudo_name)r£   r¯   ÚprO   r]   Úpseudori   ri   rj   r¤   H  s   ÿ zSpecialPseudoPattern.__init__c                 C   s   | j du rdS | j  ¡ S )r¥   Nr{   )r°   r§   r¦   ri   ri   rj   r§   U  s   zSpecialPseudoPattern.get_namer¨   r—   r`   c                 C   sV   d}| j  ||¡}|r)t t| d¡ƒ¡}| j |¡}|r)| |||¡}|r)|| _|S )r©   NrO   )	r²   rq   r   ro   rt   r|   r¯   Úgetr°   )r£   r¨   r—   r`   r´   rx   rO   r]   ri   ri   rj   rq   Z  s   zSpecialPseudoPattern.match)rª   r«   r¬   r­   r   r‚   r   rš   r¤   r§   r}   r   r
   rq   ri   ri   ri   rj   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.
    Úkwargsra   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Ú
attributesrQ   Ú	selectorsÚ	relationsÚrel_typeÚcontainsÚlangr`   r   Úno_matchF)rµ   r¸   r¹   rº   r»   rQ   r¼   r½   r¾   r¿   rÀ   r`   rÁ   )r£   r·   ri   ri   rj   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½   Úselri   ri   rj   Ú_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»   rQ   r¼   rÇ   r½   r¾   r¿   rÀ   r`   r¦   ri   ri   rj   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}))rr   r¸   r¹   rº   r»   rQ   r¼   r½   r¾   r¿   rÀ   r`   rÁ   r¦   ri   ri   rj   Ú__str__¡  s   þýz_Selector.__str__)rª   r«   r¬   r­   r   r¤   r   rÃ   rÄ   rÇ   r   rÉ   rÈ   rÅ   r‚   rË   Ú__repr__ri   ri   ri   rj   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 )Krf   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_   r`   ra   c                 C   s>   |  dd¡| _|| _| jtj@ | _|du ri | _dS || _dS )rœ   ú rz   N)r   r]   r`   r   ÚDEBUGÚdebugr_   )r£   r¨   r_   r`   ri   ri   rj   r¤   Í  s   zCSSParser.__init__rÆ   rx   Ú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.FZcmpÚcaseNZattr_nséÿÿÿÿr{   Z	attr_nameÚir   ÚtypeTrM   ©ú"ú'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   ro   rt   r   rŸ   ÚDOTALLÚ
startswithrž   r™   ÚRE_WSÚsearchr]   rÃ   ZSelectorAttributer¶   r»   r’   rÄ   rÅ   r¼   )r£   rÆ   rx   rÞ   ZinverseÚoprß   ÚnsrN   Zis_typeZpattern2rM   r`   r]   Zsel_attrZsub_selZnot_listri   ri   rj   Ú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.Ztag_nsNrà   Ztag_nameT)r|   rt   rÃ   ÚSelectorTagr¸   )r£   rÆ   rx   rÞ   Úprefixr¸   ri   ri   rj   Ú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.
        rO   Nz2Undefined custom selector '{}' found at postion {}r   rb   ©r`   T)r   ro   rt   r|   r_   rµ   r   rr   Úendr]   Ú
isinstancerÃ   rÄ   rf   r`   rg   Ú
FLG_PSEUDOr¼   r’   )r£   rÆ   rx   rÞ   r´   r¨   ri   ri   rj   Ú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.FrO   Ú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   ro   rt   r|   ÚPSEUDO_COMPLEXÚparse_pseudo_openr÷   ÚPSEUDO_SIMPLEr`   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_SHOWNrQ   ÚSelectorNthrÄ   rÂ   ÚPSEUDO_COMPLEX_NO_MATCHÚparse_selectorsrù   ÚFLG_OPENrÁ   ÚPSEUDO_SIMPLE_NO_MATCHÚPSEUDO_SUPPORTEDr   rr   r]   ÚstartÚNotImplementedError)r£   rÆ   rx   rÞ   rû   rü   Zcomplex_pseudor´   ri   ri   rj   Ú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Ï   Z_childZ_typerO   rQ   ZevenrT   r   TZoddr   Ús1r†   r{   ÚaÚnÚ1Nrà   Ús2ÚbÚ0é
   ZofrE   FrG   rF   rH   )Ú	groupdictrµ   r   ro   rt   r   r
   r‚   ÚRE_NTHrq   r|   Úendswithrí   r}   r  r÷   rù   r  ÚCSS_NTH_OF_S_DEFAULTrQ   r’   rÃ   r  rÄ   )r£   rÆ   rx   rÞ   rû   ZmdictZpostfixrv   r  r  ÚvarZ	nth_partsZ_s1r  Z_s2Z
pseudo_selZnth_selri   ri   rj   Úparse_pseudo_nth¤  sd   	
 



 



øû 
ý zCSSParser.parse_pseudo_nthrO   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Æ   rO   rÞ   rû   r—   r`   ri   ri   rj   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   rr   r]   )r£   rÆ   rx   rÞ   r¼   r¾   r—   Ú
combinatorri   ri   rj   Ú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 )r(  r)  zAThe combinator '{}' at postion {}, must have a selector before itTNrè   F)r|   r+  r,  r-  r   rr   r]   rÁ   r’   r¸   rÃ   ró   r½   rÂ   r¾   r¶   )
r£   rÆ   rx   rÞ   r¼   r½   r0  r1  r—   r.  ri   ri   rj   Ú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’   rt   r¹   )r£   rÆ   rx   rÞ   r¨   ri   ri   rj   Ú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.rO   r?   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.rA   ÚvaluesÚsplitrM   )rå   rä   r   rà   T)r   ro   rt   r|   ÚwarningsÚwarnÚFutureWarningÚ	RE_VALUESÚfinditerrí   r’   r¿   rÃ   ZSelectorContains)
r£   rÆ   rx   rÞ   r´   Zcontains_ownr5  r¯   ÚtokenrM   ri   ri   rj   Ú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.r5  r6  rM   rã   r   rà   T)	r|   r:  r;  rí   rt   r’   rÀ   rÃ   ZSelectorLang)r£   rÆ   rx   rÞ   r5  r¯   r<  rM   ri   ri   rj   Ú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   ro   r|   rÃ   ZSEL_DIR_LTRZSEL_DIR_RTLr`   )r£   rÆ   rx   rÞ   rM   ri   ri   rj   Ú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.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: 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 postion {}z*Unmatched pseudo-class close at postion {}rÚ   rÙ   r¸   z5Tag name found at position {} instead of at the start)rØ   r×   z$Unclosed pseudo-class at position {}rè   Nrà   z: z"Expected a selector at position {}c                 S   s   g | ]}|  ¡ ‘qS ri   )rÅ   )Ú.0Úsri   ri   rj   Ú
<listcomp>Y  s    z-CSSParser.parse_selectors.<locals>.<listcomp>)2r¶   r,  Úboolr  rù   r&  r%  ÚFLG_HTMLÚFLG_DEFAULTÚFLG_INDETERMINATEÚFLG_IN_RANGEÚFLG_OUT_OF_RANGEÚFLG_PLACEHOLDER_SHOWNr'  rÝ   Úprintr’   Únextr  rr   r  rú   r  r=  r$  r>  r@  r   r]   rÁ   r/  r2  rò   rõ   r4  r÷   ÚStopIterationr¸   rÃ   ró   r¾   r½   rÂ   ZSEL_DEFAULTr`   ZSEL_INDETERMINATEZSEL_IN_RANGEZSEL_OUT_OF_RANGEZSEL_PLACEHOLDER_SHOWNrÄ   )r£   rû   r—   r`   rÆ   r¼   rÞ   Úclosedr½   r¾   Zis_openr0  Zis_relativeÚis_notrü   Z
is_defaultZis_indeterminateZis_in_rangeZis_out_of_rangeZis_placeholder_shownr1  ru   rx   ri   ri   rj   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 {}r3  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Ý   rK  rr   Ú
css_tokensrq   r`   r§   r|   r   r]   )	r£   r]   rx   r—   r÷   ÚvrO   r˜   Úmsgri   ri   rj   Úselector_iter[  sF   €




úæÿzCSSParser.selector_iterc                 C   s   |   |  | j¡||¡S )zProcess selectors.)r  rW  r]   )r£   r—   r`   ri   ri   rj   rg   „  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_COMBINErT  r‚   r   r	   r   rÃ   rÄ   r}   r¤   r¶   r
   rD  rò   rõ   rú   r   r   r  r$  rÿ   r   r/  r2  r4  r=  r>  r@  r  rW  rg   ri   ri   ri   rj   rf   ¯  s    ü



öÿèüþýü
ûF	þýüûú

ù_þýüû
úAþýüûú
ùþýüûúù
ø0þýüûúùø	÷


ö0üþýü
û "?)rf   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]
    )
    )ra   N)F)qr­   r   Ú	functoolsr   r{   r   r   rd   r   rÃ   r   r7  Útypingr   r	   r
   r   r   r   r   r   r   r   r~   r   r  rþ   r  ZPSEUDO_SPECIALr  ÚNEWLINErr   ZWSZCOMMENTSZWSCZCSS_ESCAPESZCSS_STRING_ESCAPESZ
IDENTIFIERZNTHZVALUEZATTRrb  rc  rd  re  r_  r±   r^  rX  r`  ra  rZ  r[  r\  r]  rf  rY  rž   rŸ   rƒ   r„   r   r    r:  rî   rR  rS  rp   r-  r,  rù   r%  r&  rF  rE  rG  r  rH  rI  rJ  r'  Ú	_MAXCACHEr‚   Z
NamespacesZCustomSelectorsr}   re   rk   rm   rÄ   rc   rD  rt   r™   rš   r®   r¶   rf   rg   r  r  r  r  r  r  r  r  r  r"  r
  r	  r  r  ri   ri   ri   rj   Ú<module>   sh   0	
ýþþþ
ýýÿÿÿ
þ
ÿþýüû
*%E     dÿþÿüÿ
öÿôÿø
ÿüÿþÿþÿñÿþÿéÿüÿñÿ
ñ