U
    «”?d×·  ã                   @  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ddddddddddddddddddddd d!d"d#hZd$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3hZd4d5d6d7d8d9d:d;hZd%d*d<hZd=d>d?d@dAdBhZeeB eB eB eB ZdCZdD e¡ZdEZdFjeedGZdHjedIZdJjeedKZ dLjedMZ!dNjedIZ"dOjee!dPZ#dQjee#dRZ$dSje!dTZ%dUje!dTZ&dVje!dTZ'dWjee!e$dXZ(dYjee!dZZ)d[jee!dZZ*d\je!dTZ+d]jedIZ,d^ e)¡Z-d_je!dTZ.d`je*eeee"daZ/dbje*ee"dcZ0ddje*ee#deZ1dfje*edgZ2dhjeediZ3ddje*ee#deZ4e 5djjedIej6¡Z7e 5dkjeedKej6¡Z8e 5dljedIej6¡Z9e 5dmjee#dRej:¡Z;e 5e¡Z<e 5dn e¡¡Z=e 5do e¡¡Z>e 5dp e+¡ej:¡Z?dqZ@drZAdZBdsZCdtZDduZEdvZFdwZGdxZHdyZIdzZJd{ZKd|ZLd}ZMeeMd~dd€dd‚dƒd„œd…d†„ƒZNd‡dˆœd‰dŠ„ZOdd‹dŒœddŽ„ZPd­dddd‘œd’d“„ZQddd”œd•d–„ZRG d—d˜„ d˜ƒZSG d™dš„ dšeSƒZTG d›dœ„ 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 ZedS )®zCSS selector parser.é    )ÚannotationsN)Ú	lru_cacheé   )Úutil)Ú	css_match)Ú	css_types)ÚSelectorSyntaxError)ÚMatchÚAnyÚIteratorÚcastiýÿ  ú	:any-linkú:emptyú:first-childú:first-of-typeú	:in-rangeú:out-of-rangeú:last-childú:last-of-typeú:linkú:only-childú:only-of-typeú:rootú:checkedú:defaultú	:disabledú:enabledú:indeterminateú	:optionalú:placeholder-shownú
:read-onlyú:read-writeú	:requiredú:scopeú:definedz:activez:currentz:focusz:focus-visiblez:focus-withinz:futurez:hostz:hoverz:local-linkz:pastz:pausedz:playingz:targetz:target-withinz:user-invalidz:visitedú	:containsú:-soup-containsú:-soup-contains-ownú:hasú:isz:matchesú:notú:wherez:host-contextú:dirú:langú
:nth-childú:nth-last-childú:nth-last-of-typeú:nth-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]|$)))r2   z/(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$|{nl})))r2   Ú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}+)
)r4   ÚidentzU
(?:{ws}*(?P<cmp>[!~^|*$]?=){ws}*(?P<value>{value})(?:{ws}*(?P<case>[is]))?)?{ws}*\]
)r2   Úvaluez	\#{ident})r6   z	\.{ident}z6(?P<tag_ns>(?:{ident}|\*)?\|)?(?P<tag_name>{ident}|\*)zD
\[{ws}*(?P<attr_ns>(?:{ident}|\*)?\|)?(?P<attr_name>{ident}){attr}
)r2   r6   Úattrz$(?P<name>:{ident})(?P<open>\({ws}*)?)r2   r6   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Úwscr3   r2   ÚnthzA
(?P<pseudo_nth_type>{name}
(?P<nth_type>{nth}|even|odd)){ws}*\)
)r9   r2   r;   z7{name}(?P<values>{value}(?:{ws}*,{ws}*{value})*){ws}*\))r9   r2   r7   z{name}(?P<dir>ltr|rtl){ws}*\))r9   r2   z0{wsc}*?(?P<relation>[,+>~]|{ws}(?![,+>~])){wsc}*)r2   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.©rK   rL   )Úprocess_customÚcmZ	SoupSieveÚ	CSSParserÚprocess_selectors)rI   rJ   rK   rL   Úcustom_selectors© rT   ú8/tmp/pip-unpacked-wheel-2_thdmds/soupsieve/css_parser.pyÚ_cached_css_compileÏ   s    	ý÷rV   ÚNone©rM   c                   C  s   t  ¡  dS )zPurge the cache.N)rV   Úcache_clearrT   rT   rT   rU   Ú_purge_cacheæ   s    rZ   z dict[str, str | ct.SelectorList])rK   rM   c                 C  sj   i }| dk	rf|   ¡ D ]P\}}t |¡}t |¡dkrBtd |¡ƒ‚||k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)rK   rS   Úkeyr7   r9   rT   rT   rU   rO   ì   s    
rO   FÚbool)ÚcontentÚstringrM   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]rG   )ÚmrM   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   NrA   r   r>   é   õ   ï¿½Ú )ÚgrouprH   ÚUNICODE_REPLACEMENT_CHARÚchr)rg   Ú	codepointr7   rT   rT   rU   Úreplace  s    



zcss_unescape.<locals>.replace)Ú
RE_CSS_ESCÚRE_CSS_STR_ESCÚsub)rd   re   ro   rT   rT   rU   ra   û   s    ra   )r6   rM   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r‚dksŒn |dkrž| d |¡¡ qH|dks²|rÜ|dkrÜd	|  krÆd
krÜn n| d |¡¡ qH|dk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\{}ri   é   é   z\{:x} é0   é9   )é-   é_   rD   éA   éZ   éa   éz   rj   )ÚlenÚappendr_   Ú	enumerateÚordÚjoin)r6   re   ÚlengthZ
start_dashÚindexÚcrn   rT   rT   rU   Úescape  sP    ,ÿÿ ÿ
ÿ
 þ
þ
 þ
þ
 þ
þ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.rG   rW   )r9   rI   rM   c                 C  s&   || _ t |tjtjB tjB ¡| _dS )úInitialize.N)r9   ÚreÚcompileÚIÚXÚUÚ
re_pattern)Úselfr9   rI   rT   rT   rU   Ú__init__5  s    zSelectorPattern.__init__rX   c                 C  s   | j S )ú	Get name.)r9   ©r   rT   rT   rU   Úget_name;  s    zSelectorPattern.get_namerH   úMatch[str] | None©Úselectorr„   rL   rM   c                 C  s   | j  ||¡S )úMatch the selector.)r   r^   )r   r—   r„   rL   rT   rT   rU   r^   @  s    zSelectorPattern.matchN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r‘   r”   r^   rT   rT   rT   rU   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]], ...]rW   )ÚpatternsrM   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   rh   r>   r   N)	rŸ   Úmatched_namerŠ   r‹   ÚPAT_PSEUDO_CLASS_SPECIALrŒ   r   rŽ   Úre_pseudo_name)r   rŸ   Úpr9   rI   ÚpseudorT   rT   rU   r‘   I  s    zSpecialPseudoPattern.__init__rG   rX   c                 C  s   | j dkrdS | j  ¡ S )r’   Nrj   )r    r”   r“   rT   rT   rU   r”   V  s    zSpecialPseudoPattern.get_namerH   r•   r–   c                 C  sV   d}| j  ||¡}|rRt t| d¡ƒ¡}| j |¡}|rR| |||¡}|rR|| _|S )r˜   Nr9   )	r¢   r^   r   r\   ra   rk   rŸ   Úgetr    )r   r—   r„   rL   r¤   rg   r9   rI   rT   rT   rU   r^   [  s    zSpecialPseudoPattern.matchNr™   rT   rT   rT   rU   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
   rW   )ÚkwargsrM   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ÚlangrL   r   Úno_matchF)r¥   r¨   r©   rª   r«   r;   r¬   r­   r®   r¯   r°   rL   r±   )r   r§   rT   rT   rU   r‘   t  s    z_Selector.__init__úlist[_Selector]úct.SelectorList)r­   rM   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­   ÚselrT   rT   rU   Ú_freeze_relations„  s
    z_Selector._freeze_relationszct.Selector | ct.SelectorNullrX   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°   rL   r“   rT   rT   rU   r·   Ž  s    
õz_Selector.freezerG   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}))r_   r¨   r©   rª   r«   r;   r¬   r­   r®   r¯   r°   rL   r±   r“   rT   rT   rU   Ú__str__¢  s    ÿ          ûz_Selector.__str__N)	rš   r›   rœ   r   r‘   r¹   r·   r»   Ú__repr__rT   rT   rT   rU   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 )RrQ   zParse CSS selectors.Úpseudo_closeÚpseudo_contains)r%   r&   r'   Úpseudo_nth_child)r.   r/   Úpseudo_nth_type)r1   r0   Úpseudo_lang)r-   Ú
pseudo_dir)r,   Úpseudo_class_customÚpseudo_classÚpseudo_elementÚat_ruleÚidÚclassr¨   Ú	attributeÚcombineNr   rG   z'dict[str, str | ct.SelectorList] | NonerH   rW   )r—   rK   rL   rM   c                 C  s8   |  dd¡| _|| _| jtj@ | _|dkr.i n|| _dS )r‰   ú ri   N)ro   rI   rL   r   ÚDEBUGÚdebugrK   )r   r—   rK   rL   rT   rT   rU   r‘   Î  s    zCSSParser.__init__r¦   rf   rc   )r¸   rg   Úhas_selectorrM   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r¨tjtjB }d}	ntj}|rê|  d¡ d¡rÜt|  d¡dd… dƒ}nt|  d¡ƒ}|sôd}nô| d¡rt dt 	|¡ |¡}nÐ| d¡r<t dt 	|¡ |¡}n¬| d¡r`t dt 	|¡ |¡}nˆ| d¡rž|r~t
 |¡r‚dnt 	|¡}t d| |¡}nJ| d¡rÂt dt 	|¡ |¡}n&t dt 	|¡ |¡}| d¡rèd}|	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_nséÿÿÿÿrj   Ú	attr_nameÚir   ÚtypeTr7   ©ú"ú'r   ú^z^%s.*ú$z.*?%s$Ú*z.*?%s.*ú~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*ú|z^%s(?:-.*)?$z^%s$ú!)rk   r   r\   ra   rŠ   rŒ   ÚDOTALLÚ
startswithr‹   r†   ÚRE_WSÚsearchrI   rµ   ZSelectorAttributer¦   r«   r   r¶   r·   r¬   )r   r¸   rg   rÎ   ZinverseÚoprÐ   Únsr8   Zis_typeZpattern2r7   rL   rI   Zsel_attrZsub_selZnot_listrT   rT   rU   Ú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)rk   ra   rµ   ÚSelectorTagr¨   )r   r¸   rg   rÎ   Úprefixr¨   rT   rT   rU   Úparse_tag_pattern!  s
    $zCSSParser.parse_tag_patternc                 C  s–   t  t| d¡ƒ¡}| j |¡}|dk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.
        r9   Nz3Undefined custom selector '{}' found at position {}r   rN   ©rL   T)r   r\   ra   rk   rK   r¥   r   r_   ÚendrI   Ú
isinstancerµ   r¶   rQ   rL   rR   Ú
FLG_PSEUDOr¬   r   )r   r¸   rg   rÎ   r¤   r—   rT   rT   rU   Úparse_pseudo_class_custom*  s*    ý  ÿþ
z#CSSParser.parse_pseudo_class_customz Iterator[tuple[str, Match[str]]]ztuple[bool, bool])r¸   rg   rÎ   Ú	iselectorÚis_htmlrM   c                 C  sì  d}t  t| d¡ƒ¡}| d¡r&d}|rN|tkrN|  ||||| d¡¡}n–|s`|tk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
k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!kr”|  "|| d¡t#t$B ¡ d|_%d}nP|s°|t&kr°d|_%d}n4|t'krÖt(d )|¡| j*| +d¡ƒ‚nt,d )|¡ƒ‚||fS ) zParse pseudo class.Fr9   Ú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\   ra   rk   ÚPSEUDO_COMPLEXÚparse_pseudo_openré   ÚPSEUDO_SIMPLErL   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   r_   rI   ÚstartÚNotImplementedError)r   r¸   rg   rÎ   rí   rî   Zcomplex_pseudor¤   rT   rT   rU   Úparse_pseudo_classF  s     














$
"
"
"
þÿ
þÿ
ýÿzCSSParser.parse_pseudo_class)r¸   rg   rÎ   rí   rM   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	}
nÒttt t 	|¡ƒ}| 
d¡r¢| 
d¡dkr¢d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¿   Z_childÚ_typer9   r;   Zevenr>   r   TZoddr   Ús1rs   rj   ÚaÚnÚ1NrÑ   Ús2ÚbÚ0é
   Zofr.   Fr/   r1   r0   )Ú	groupdictr¥   r   r\   ra   r   r	   rG   ÚRE_NTHr^   rk   Úendswithrß   rH   r  ré   rë   r  ÚCSS_NTH_OF_S_DEFAULTr;   r   rµ   r   r¶   )r   r¸   rg   rÎ   rí   ZmdictZpostfixrd   r
  r  ÚvarZ	nth_partsZ_s1r  Z_s2Z
pseudo_selZnth_selrT   rT   rU   Úparse_pseudo_nth¥  sX    	
 



$





"
 zCSSParser.parse_pseudo_nth)r¸   r9   rÎ   rí   r„   rM   c                 C  sZ   t tB }|dkr|tO }n"|dkr,|tO }n|dk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¸   r9   rÎ   rí   r„   rL   rT   rT   rU   rñ   æ  s    


zCSSParser.parse_pseudo_openr²   ztuple[bool, _Selector, str])r¸   rg   rÎ   r¬   r®   r„   rM   c                 C  s¦   |  d¡ ¡ }|st}|tkrJ||_|d j |¡ dt }| tƒ ¡ nH|rf||_|d j |¡ n$|dd… tkrŠtd 	|¡| j
|ƒ‚d| }tƒ }d}|||fS )úParse combinator tokens.ÚrelationrÑ   ú:r   Nz'The multiple combinators at position {}F)rk   ÚstripÚWS_COMBINATORÚCOMMA_COMBINATORr®   r­   r   r¦   r   r_   rI   )r   r¸   rg   rÎ   r¬   r®   r„   Ú
combinatorrT   rT   rU   Úparse_has_combinatorý  s*    ýzCSSParser.parse_has_combinatorztuple[bool, _Selector])	r¸   rg   rÎ   r¬   r­   Ú	is_pseudoÚ
is_forgiver„   rM   c	           
      C  sÚ   |  d¡ ¡ }	|	st}	|s`|r&|	tkr<td |	|¡| j|ƒ‚|	tkrÈd|_|dd…= | |¡ nh|	tkr¢|j	s€|s€t
 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)rk   r  r  r   r   r_   rI   r±   r   r¨   rµ   rå   r­   r´   r®   r¦   )
r   r¸   rg   rÎ   r¬   r­   r#  r$  r„   r!  rT   rT   rU   Ú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)rk   rß   rª   r   ra   r©   )r   r¸   rg   rÎ   r—   rT   rT   rU   Ú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¡r„t|	d	d
… dƒ}	nt|	ƒ}	| 
|	¡ qL|j 
t ||¡¡ d}|S )zParse contains.r9   r%   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.r'   ÚvaluesÚsplitr7   )r×   rÖ   r   rÑ   T)r   r\   ra   rk   ÚwarningsÚwarnÚFutureWarningÚ	RE_VALUESÚfinditerrß   r   r¯   rµ   ZSelectorContains)
r   r¸   rg   rÎ   r¤   Zcontains_ownr(  rŸ   Útokenr7   rT   rT   rU   Ú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)  r7   rÕ   r   rÑ   T)	rk   r-  r.  rß   ra   r   r°   rµ   ZSelectorLang)r   r¸   rg   rÎ   r(  rŸ   r/  r7   rT   rT   rU   Ú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\   rk   rµ   ZSEL_DIR_LTRZSEL_DIR_RTLrL   )r   r¸   rg   rÎ   r7   rT   rT   rU   Úparse_pseudo_dir‘  s     zCSSParser.parse_pseudo_dirr³   )rí   r„   rL   rM   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|r¶tdƒ |
rÂtdƒ |rÎtdƒ |rÚtdƒ |rætdƒ |ròtdƒ |rþt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rÜtd | d¡¡ƒ‚n |dkrø|  |||¡}n„|dkr|  ||||¡}nf|dkr2|  |||¡}nJ|dkrR|  |||¡}d}n*|dkrÀ|sŽ|sˆtd | d¡¡| j| d¡ƒ‚d|_|
ržd}qŠn 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!kr||  "|||¡}| #d¡}qLW n t$k
r¢   Y nX |
rÄ|sÄtd" |¡| j|ƒ‚|r&|j%sæ|sæt& 'd#d$¡|_%|r|	|_(|d% j) |¡ n |j) *|¡ |d$d$…= | |¡ n0|rV|r8|sVd|_|d$d$…= | |¡ d}|sptd |¡| j|ƒ‚|r‚t&j+|d% _,|r”t&j-|d% _,|r¦t&j.|d% _,|r¸t&j/|d% _,|rÊt&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 rT   )r·   )Ú.0ÚsrT   rT   rU   Ú
<listcomp>K  s     z-CSSParser.parse_selectors.<locals>.<listcomp>)2r¦   r  rc   r  rë   r  r  ÚFLG_HTMLÚFLG_DEFAULTÚFLG_INDETERMINATEÚFLG_IN_RANGEÚFLG_OUT_OF_RANGEÚFLG_PLACEHOLDER_SHOWNr  rÍ   Úprintr   Únextr  r_   r  rì   r  r0  r  r1  r3  r   rI   r±   r"  r%  rä   rç   r'  ré   ÚStopIterationr¨   rµ   rå   r®   r­   r´   ZSEL_DEFAULTrL   ZSEL_INDETERMINATEZSEL_IN_RANGEZSEL_OUT_OF_RANGEZSEL_PLACEHOLDER_SHOWNr¶   )r   rí   r„   rL   r¸   r¬   rÎ   Úclosedr­   r®   Zis_openr#  Zis_relativeÚis_notrî   Z
is_defaultZis_indeterminateZis_in_rangeZis_out_of_rangeZis_placeholder_shownr$  rb   rg   rT   rT   rU   r  ™  s,   	








ýý
     ÿ       ÿ


ý
ý


ý	zCSSParser.parse_selectors)rI   rM   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r°td || d¡| d¡¡ƒ | d¡}||fV   qÊql|dkrX|| }|dkrîd |¡}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Í   r=  r_   Ú
css_tokensr^   rL   r”   rk   r   rI   )	r   rI   rg   r„   ré   Úvr9   r…   ÚmsgrT   rT   rU   Úselector_iterM  s>    








zCSSParser.selector_iter)r„   rL   rM   c                 C  s   |   |  | j¡||¡S )zProcess selectors.)r  rI  rI   )r   r„   rL   rT   rT   rU   rR   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_COMBINErF  r‘   rä   rç   rì   r  r  rñ   r"  r%  r'  r0  r1  r3  r  rI  rR   rT   rT   rT   rU   rQ   °  sZ   ü



öÿè  üF	_A+0  ü 5)rQ   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   rj   r   r   rP   r   rµ   r   r*  Útypingr	   r
   r   r   rl   rò   r  rð   r  ZPSEUDO_SPECIALr  ÚNEWLINEr_   ZWSZCOMMENTSZWSCZCSS_ESCAPESZCSS_STRING_ESCAPESÚ
IDENTIFIERZNTHZVALUEZATTRrT  rU  rV  rW  rQ  r¡   rP  rJ  rR  rS  rL  rM  rN  rO  rX  rK  r‹   rŒ   rp   rq   r  r   r-  rà   rD  rE  r]   r   r  rë   r  r  r8  r7  r9  r  r:  r;  r<  r  Ú	_MAXCACHErV   rZ   rO   ra   r†   r‡   rž   r¦   rQ   rR   ró   rô   rõ   rö   r÷   rø   rù   rú   rÿ   r  rü   rû   rý   rþ   rT   rT   rT   rU   Ú<module>   sä  èðøýú	
ý þ þ  þ
    ý  ý  ÿ  ÿ ÿ
þ
%E     Uÿþÿüÿ

öÿ
ôÿø
ÿüÿþÿþÿ
ñÿþÿéÿüÿ
ñÿ
ñ