o
    Uj¹¿  ã                   @  sn  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Zh d£Zh d£Zh d£Zh d£Zh d£ZeeB eB eB eB ZdZde› dZdZde› de› dZde› dZde› de› dZ de› de› dZ!de› d e› d!Z"d"e› d#e› d$e!› dZ#de› d%e› d&e#› d'e› d(e› d)Z$d*e!› Z%d+e!› Z&d,e!› d-e!› d.Z'd/e› d0e!› d1e!› de$› d2	Z(d3e!› d4e› d5Z)d3e!› d4e› d6Z*d7e!› dZ+d8Z,e› d9Z-d:e)› Z.d;e!› Z/d<e*› d=e"› d>e› d?e› d)e› e› d@e› d)e› e› dAZ0dBe*› dCe"› dDe› dEZ1e*› dFe#› de› dGe› d)e#› dHe› d9Z2e*› dIe› d9Z3e› dJe› dKe› d)Z4e*› dFe#› de› dGe› d)e#› dHe› d9Z5e 6dLe› dMej7¡Z8e 6dLe› dNe› dej7¡Z9e 6dOe› dPe› dQej7¡Z:e 6dRe#› dSe› dGe› dTej;¡Z<e 6e¡Z=e 6dUe› d)¡Z>e 6e› dV¡Z?e 6dUe+› dWej;¡Z@dXZAdYZBdZCdZZDd[ZEd\ZFd]ZGd^ZHd_ZId`ZJdaZKdbZLdcZMddZNeeNded™dpdq„ƒZOdšdsdt„ZPd›dvdw„ZQdœdd|d}„ZRdždd€„ZSG dd‚„ d‚ƒZTG dƒd„„ d„eTƒZUG d…d†„ d†ƒZVG d‡dˆ„ dˆƒZWeWd‰ƒjXeCeGB dŠZYeWd‹ƒjXeCeGB dŠZZeWdŒƒjXeCeGB eFB dŠZ[eWdƒjXeCeGB eHB dŠZ\eWdŽƒjXeCeGB dŠZ]eWdƒjXeCeGB dŠZ^eWdƒjXeCeGB dŠZ_eWd‘ƒjXeCeGB dŠZ`eWd’ƒjXeCeGB eLB dŠZaeWd“ƒjXeCdŠZbeWd”ƒjXeCeGB dŠZceWd•ƒjXeCeGB dŠZdeWd–ƒjXeCeJB eGB dŠZeeWd–ƒjXeCeKB eGB dŠZfeWd—ƒjXeCeGB dŠZgeWd˜ƒjXeCeGB dŠZhdS )ŸzCSS selector parser.é    )ÚannotationsN)Ú	lru_cacheé   )Úutil)Ú	css_match)Ú	css_types)ÚSelectorSyntaxError)ÚMatchÚAnyÚIteratorÚcastiýÿ  i    >   ú:linkú:openú:rootú:emptyú:mutedú:scopeú:checkedú:defaultú:definedú:enabledú	:any-linkú	:disabledú	:in-rangeú	:optionalú	:requiredú
:read-onlyú:last-childú:only-childú:read-writeú:first-childú:last-of-typeú:only-of-typeú:out-of-rangeú:first-of-typeú:indeterminateú:placeholder-shown>   ú:pastú:focusú:hoverú:activeú:futureú:pausedú:targetú:playingú:seekingú:stalledú:visitedú	:autofillú
:bufferingú:fullscreenú:local-linkú:focus-withinú:popover-openú:user-invalidú:focus-visibleú:target-withinú:volume-lockedú:picture-in-pictureú:hostú:current>   ú:matchesú:isú:hasú:notú:whereú	:containsú:-soup-containsú:-soup-contains-own>   ú:host-contextr=   r>   >   ú:dirú:langú
:nth-childú:nth-of-typeú:nth-last-childú:nth-last-of-typez(?:\r\n|(?!\r\n)[\n\f\r])z	(?:[ \t]|ú)z"(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)z(?:ú|z(?:\\(?:[a-f0-9]{1,6}z?|[^\r\n\f]|$))z?|[^\r\n\f]|$|z))z8
(?:(?:-?(?:[^\x00-\x2f\x30-\x40\x5B-\x5E\x60\x7B-\x9f]|z>)+|--)
(?:[^\x00-\x2c\x2e\x2f\x3A-\x40\x5B-\x5E\x60\x7B-\x9f]|z)*)
z (?:[-+])?(?:[0-9]+n?|n)(?:(?<=n)z	*(?:[-+])z*(?:[0-9]+))?z(?:"(?:\\(?:.|z)|[^\\"\r\n\f])*?"|'(?:\\(?:.|z)|[^\\'\r\n\f])*?'|z*(?P<cmp>[!~^|*$]?=)z*(?P<value>z)(?:z*(?P<case>[is]))?)?Ú*z\#z\.z(?P<tag_ns>(?:z|\*)?\|)?(?P<tag_name>z|\*)z\[z*(?P<attr_ns>(?:z|\*)?\|)?(?P<attr_name>z\]z
(?P<name>:z)(?P<open>\(z*)?z*)z(?P<name>:(?=--)ú&z*\)ú:z@Pz
(?P<pseudo_nth_child>z
(?P<nth_child>z|even|odd))(?:z*\)|(?P<of>z*ofz*))
z
(?P<pseudo_nth_type>z
(?P<nth_type>z|even|odd))z*\)
z(?P<values>z*,z)*)z(?P<dir>ltr|rtl)z*?(?P<relation>[,+>~]|z(?![,+>~]))z(?:(\\[a-f0-9]{1,6}z?)|(\\[^\r\n\f])|(\\$))z?)|(\\[^\r\n\f])|(\\$)|(\\z'(?P<s1>[-+])?(?P<a>[0-9]+n?|n)(?:(?<=n)z*(?P<s2>[-+])z*(?P<b>[0-9]+))?z(?:(?P<value>z)|(?P<split>z*))ú^z*$ú$ú,ú é   é   é   é   é    é@   é€   é   i   i   iô  )ÚmaxsizeÚpatternÚstrÚ
namespacesúct.Namespaces | NoneÚcustomúct.CustomSelectors | NoneÚflagsÚintÚreturnúcm.SoupSievec                 C  s(   t |ƒ}t | t| ||d ¡ |||¡S )zCached CSS compile.©rd   rf   )Úprocess_customÚcmÚ	SoupSieveÚ	CSSParserÚprocess_selectors)r`   rb   rd   rf   Úcustom_selectors© rq   úM/opt/telega-widget/.venv/lib/python3.10/site-packages/soupsieve/css_parser.pyÚ_cached_css_compileÎ   s   	ý÷rs   ÚNonec                   C  s   t  ¡  dS )zPurge the cache.N)rs   Úcache_clearrq   rq   rq   rr   Ú_purge_cacheå   s   rv   ú dict[str, str | ct.SelectorList]c                 C  sn   i }| dur5|   ¡ D ]*\}}t |¡}t |¡du r"td|› dƒ‚||v r.td|› dƒ‚||t|ƒ< q
|S )zProcess custom.Nz
The name 'z)' is not a valid custom pseudo-class namezThe custom selector 'z' has already been registered)Úitemsr   ÚlowerÚ	RE_CUSTOMÚmatchr   ÚKeyErrorÚcss_unescape)rd   rp   ÚkeyÚvalueÚnamerq   rq   rr   rk   ë   s   
rk   FÚcontentÚstringÚboolc                 C  s   ddd„}|s	t nt || ¡S )	zs
    Unescape CSS value.

    Strings allow for spanning the value on multiple strings by escaping a new line.
    Úmú
Match[str]rh   ra   c                 S  st   |   d¡rt|   d¡dd… dƒ}|dkrt}t|ƒ}|S |   d¡r-|   d¡dd… }|S |   d¡r6d}|S d}|S )	z(Replace with the appropriate substitute.r   NrZ   r   rW   é   õ   ï¿½Ú )Úgrouprg   ÚUNICODE_REPLACEMENT_CHARÚchr)r„   Ú	codepointr   rq   rq   rr   Úreplace  s   

ù
ûþzcss_unescape.<locals>.replaceN)r„   r…   rh   ra   )Ú
RE_CSS_ESCÚRE_CSS_STR_ESCÚsub)r   r‚   r   rq   rq   rr   r}   ú   s   
r}   Úidentc                 C  sr  g }t | ƒ}|dko| d dk}|dkr|r| d| › ¡ n•t| ƒD ]\}}t|ƒ}|dkr5| d¡ q#d|  kr?dksDn |dkrO| d|d›d	¡ q#|dksY|rp|dkrpd
|  krcdkrpn n| d|d›d	¡ q#|dv s¥|dks¥d
|  kr‚dks¥n d
|  krd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   ú\r‡   é   é   ÚxrV   é0   é9   )é-   é_   r]   éA   éZ   éa   éz   rˆ   )ÚlenÚappendÚ	enumerateÚordÚjoin)r‘   r‚   ÚlengthÚ
start_dashÚindexÚcrŒ   rq   rq   rr   Úescape  s$   ,&D
r¨   c                   @  s.   e Zd ZdZddd„Zdd	d
„Zddd„ZdS )ÚSelectorPatternúSelector pattern.r€   ra   r`   rh   rt   c                 C  s&   || _ t |tjtjB tjB ¡| _dS )úInitialize.N)r€   ÚreÚcompileÚIÚXÚUÚ
re_pattern)Úselfr€   r`   rq   rq   rr   Ú__init__4  s    zSelectorPattern.__init__c                 C  s   | j S )ú	Get name.)r€   ©r²   rq   rq   rr   Úget_name:  s   zSelectorPattern.get_nameÚselectorr¦   rg   rf   úMatch[str] | Nonec                 C  s   | j  ||¡S )úMatch the selector.)r±   r{   )r²   r·   r¦   rf   rq   rq   rr   r{   ?  s   zSelectorPattern.matchN)r€   ra   r`   ra   rh   rt   ©rh   ra   ©r·   ra   r¦   rg   rf   rg   rh   r¸   ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r³   r¶   r{   rq   rq   rq   rr   r©   1  s
    

r©   c                   @  s.   e Zd ZdZddd„Zdd	d
„Zddd„ZdS )ÚSpecialPseudoPatternrª   ÚpatternsúCtuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]rh   rt   c                 C  sh   i | _ |D ]}|d }|d ||d ƒ}|d D ]}|| j |< qqd| _t ttjtjB tjB ¡| _dS )r«   r   r†   rW   r   N)	rÂ   Úmatched_namer¬   r­   ÚPAT_PSEUDO_CLASS_SPECIALr®   r¯   r°   Úre_pseudo_name)r²   rÂ   Úpr€   r`   Úpseudorq   rq   rr   r³   H  s   ÿ zSpecialPseudoPattern.__init__ra   c                 C  s   | j du rdS | j  ¡ S )r´   Nrˆ   )rÄ   r¶   rµ   rq   rq   rr   r¶   U  s   zSpecialPseudoPattern.get_namer·   r¦   rg   rf   r¸   c                 C  sV   d}| j  ||¡}|r)t t| d¡ƒ¡}| j |¡}|r)| |||¡}|r)|| _|S )r¹   Nr€   )	rÆ   r{   r   ry   r}   r‰   rÂ   ÚgetrÄ   )r²   r·   r¦   rf   rÈ   r„   r€   r`   rq   rq   rr   r{   Z  s   zSpecialPseudoPattern.matchN)rÂ   rÃ   rh   rt   rº   r»   r¼   rq   rq   rq   rr   rÁ   E  s
    

rÁ   c                   @  s<   e Zd ZdZddd„Zddd„Zddd„Zddd„ZeZdS )Ú	_Selectorzý
    Intermediate selector class.

    This stores selector data for a compound selector as we are acquiring them.
    Once we are done collecting the data for a compound selector, we freeze
    the data in an object that can be pickled and hashed.
    Úkwargsr
   rh   rt   c                 K  s¬   |  dd¡| _|  dg ¡| _|  dg ¡| _|  dg ¡| _|  dg ¡| _|  dg ¡| _|  dg ¡| _|  d	d¡| _|  d
g ¡| _	|  dg ¡| _
|  dd¡| _|  dd¡| _dS )r«   ÚtagNÚidsÚclassesÚ
attributesÚnthÚ	selectorsÚ	relationsÚrel_typeÚcontainsÚlangrf   r   Úno_matchF)rÉ   rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rf   rÖ   )r²   rË   rq   rq   rr   r³   s  s   z_Selector.__init__rÒ   úlist[_Selector]úct.SelectorListc                 C  s8   |r|d }|j  |dd… ¡ t | ¡ g¡S t ¡ S )zFreeze relation.r   r   N)rÒ   ÚextendÚctÚSelectorListÚfreeze)r²   rÒ   Úselrq   rq   rr   Ú_freeze_relationsƒ  s
   z_Selector._freeze_relationsúct.Selector | ct.SelectorNullc                 C  sd   | j rt ¡ S t | jt| jƒt| jƒt| jƒt| j	ƒt| j
ƒ|  | j¡| jt| jƒt| jƒ| j¡S )zFreeze self.)rÖ   rÚ   ÚSelectorNullÚSelectorrÌ   ÚtuplerÍ   rÎ   rÏ   rÐ   rÑ   rÞ   rÒ   rÓ   rÔ   rÕ   rf   rµ   rq   rq   rr   rÜ     s   
õz_Selector.freezera   c                 C  sf   d| j ›d| j›d| j›d| j›d| j›d| j›d| j›d| j›d	| j›d
| j	›d| j
›d| j›dS )zString representation.z_Selector(tag=z, ids=z
, classes=z, attributes=z, nth=z, selectors=z, relations=z, rel_type=z, contains=z, lang=z, flags=z, no_match=rN   )rÌ   rÍ   rÎ   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rf   rÖ   rµ   rq   rq   rr   Ú__str__¡  s$   "ÿÿÿþþþþýÿz_Selector.__str__N)rË   r
   rh   rt   )rÒ   r×   rh   rØ   )rh   rß   rº   )	r½   r¾   r¿   rÀ   r³   rÞ   rÜ   rã   Ú__repr__rq   rq   rq   rr   rÊ   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ƒedeƒfZ		dYdZd!d"„Zd[d#d$„Zd\d+d,„Zd\d-d.„Zd\d/d0„Zd]d5d6„Zd^d7d8„Zd_d;d<„Zd`dAdB„ZdadGdH„Z d\dIdJ„Z!d\dKdL„Z"d\dMdN„Z#d\dOdP„Z$		dbdcdRdS„Z%dddUdV„Z&dbdedWdX„Z'dS )frn   zParse CSS selectors.Úpseudo_closeÚpseudo_contains)rD   rE   rF   Úpseudo_nth_child)rJ   rL   Úpseudo_nth_type)rK   rM   Úpseudo_lang)rI   Ú
pseudo_dir)rH   Úpseudo_class_customÚpseudo_classÚpseudo_elementÚampÚat_ruleÚidÚclassrÌ   Ú	attributeÚcombineNr   r·   ra   rd   ú'dict[str, str | ct.SelectorList] | Nonerf   rg   rh   rt   c                 C  s>   |  dd¡| _|| _| jtj@ | _|du ri n|| _d| _dS )r«   ú r‡   Nr   )r   r`   rf   r   ÚDEBUGÚdebugrd   Úcount)r²   r·   rd   rf   rq   rq   rr   r³   Í  s
   
zCSSParser.__init__c                 C  s   | j tkrtdt› ƒ‚dS )z!Check the current selector count.z/Selector exceeds pseudo-class nesting limit of N)rø   ÚSELECTOR_LIMITÚ
ValueErrorrµ   rq   rq   rr   Úcheck_countÛ  s   
ÿzCSSParser.check_countrÝ   rÊ   r„   r…   Úhas_selectorrƒ   c                 C  sP  d}|  d¡}|  d¡rt |  d¡¡nd}|  d¡r&t|  d¡dd… ƒnd}t|  d¡ƒ}d}	d}
d}|rD|d	kr>tjnd
tjB }nt |¡dkrTtjtjB }d}	ntj}|ru|  d¡ d¡rnt|  d¡dd… dƒ}nt|  d¡ƒ}|szd}nr| d¡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   ÚtypeTr   ©ú"ú'r   rS   z^%s.*rT   z.*?%s$rP   z.*?%s.*ú~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*rO   z^%s(?:-.*)?$z^%s$ú!)r‰   r   ry   r}   r¬   r®   ÚDOTALLÚ
startswithr­   r¨   ÚRE_WSÚsearchr`   rÚ   ÚSelectorAttributerÊ   rÏ   r    rÛ   rÜ   rÑ   )r²   rÝ   r„   rü   ÚinverseÚoprþ   ÚnsÚattrÚis_typeÚpattern2r   rf   r`   Úsel_attrÚsub_selÚnot_listrq   rq   rr   Úparse_attribute_selectorá  s^   
$





ýz"CSSParser.parse_attribute_selectorc                 C  sH   |  d¡rt|  d¡dd… ƒnd}t|  d¡ƒ}t ||¡|_d}|S )z#Parse tag pattern from regex match.Útag_nsNr   Útag_nameT)r‰   r}   rÚ   ÚSelectorTagrÌ   )r²   rÝ   r„   rü   ÚprefixrÌ   rq   rq   rr   Úparse_tag_pattern'  s
   $zCSSParser.parse_tag_patternc                 C  s²   t  t| d¡ƒ¡}| j |¡}|du r'td|› d| d¡› | j| d¡ƒ‚t	|t
jƒsC| j|= t|| j| jdjtd}|| j|< |  j|j7  _|  ¡  |j |¡ d}|S )	zÔ
        Parse custom pseudo class alias.

        Compile custom selectors as we need them. When compiling a custom selector,
        set it to `None` in the dictionary so we can avoid an infinite loop.
        r€   NzUndefined custom selector 'z' found at position r   rj   ©rf   T)r   ry   r}   r‰   rd   rÉ   r   Úendr`   Ú
isinstancerÚ   rÛ   rn   rf   ro   Ú
FLG_PSEUDOrø   rû   rÑ   r    )r²   rÝ   r„   rü   rÈ   r·   rq   rq   rr   Úparse_pseudo_class_custom0  s*   ý
ÿþ
z#CSSParser.parse_pseudo_class_customÚ	iselectorú Iterator[tuple[str, Match[str]]]Úis_htmlútuple[bool, bool]c                 C  sŽ  d}t  t| d¡ƒ¡}| d¡rd}|r)|tv r)|  ||||| d¡¡}||fS |sx|tv rx|dkr?| jt	j
O  _n3|dkrO| jt	jO  _d}n#|dkr]| jt	jO  _n|d	krk| jt	jO  _n|d
v rƒ|  jtj7  _|  ¡  |j t¡ nï|dkr›|  jtj7  _|  ¡  |j t¡ n×|dkr³|  jtj7  _|  ¡  |j t¡ n¿|dkrË|  jtj7  _|  ¡  |j t¡ n§|dkrã|  jtj7  _|  ¡  |j t¡ n|dkrû|  jtj7  _|  ¡  |j t¡ nw|dkr|  jtj7  _|  ¡  |j t¡ n^|dkr-|  jtj7  _|  ¡  |j t¡ nE|dkrF|  jtj7  _|  ¡  |j t¡ n,|dkr_|  jtj7  _|  ¡  |j t¡ n|dkrw|  jtj7  _|  ¡  |j t¡ nû|dkr|  jtj7  _|  ¡  |j t¡ nã|dkr§|  jtj7  _|  ¡  |j t¡ nË|dkr¿|  jtj7  _|  ¡  |j t¡ n³|dkr×|  jt j7  _|  ¡  |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r/|j! t	 "dddddt	 #¡ ¡¡ nC|dkrQ|j! $t	 "dddddt	 #¡ ¡t	 "dddddt	 #¡ ¡g¡ n!|dkrr|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 |› d!| j-| .d¡ƒ‚t,d!|› d"| j-| .d¡ƒ‚)#zParse pseudo class.Fr€   ÚopenTr   r   r   r   r   )r   r   r   r   r%   r   r   r   r   r   r   r   r   r   r#   r&   r    r   r   r$   r!   r   r"   z!Invalid syntax for pseudo class 'r  z¢' was detected as a pseudo-class and is either unsupported or invalid. If the syntax was not intended to be recognized as a pseudo-class, please escape the colon.)/r   ry   r}   r‰   ÚPSEUDO_COMPLEXÚparse_pseudo_openr  ÚPSEUDO_SIMPLErf   rÚ   ÚSEL_ROOTÚSEL_DEFINEDÚ	SEL_SCOPEÚ	SEL_EMPTYrø   ÚCSS_LINKrû   rÑ   r    ÚCSS_CHECKEDÚCSS_DEFAULTÚCSS_INDETERMINATEÚCSS_DISABLEDÚCSS_ENABLEDÚCSS_REQUIREDÚ	CSS_MUTEDÚCSS_OPENÚCSS_OPTIONALÚCSS_READ_ONLYÚCSS_READ_WRITEÚCSS_IN_RANGEÚCSS_OUT_OF_RANGEÚCSS_PLACEHOLDER_SHOWNrÐ   ÚSelectorNthrÛ   rÙ   ÚPSEUDO_COMPLEX_NO_MATCHÚparse_selectorsr   ÚFLG_OPENrÖ   ÚPSEUDO_SIMPLE_NO_MATCHÚPSEUDO_SUPPORTEDr   r`   Ústart)r²   rÝ   r„   rü   r"  r$  Úcomplex_pseudorÈ   rq   rq   rr   Úparse_pseudo_classO  sî   

sŽ









"
"
"
"
þÿ
þÿëï
ò
ý
üzCSSParser.parse_pseudo_classc                 C  sJ  |  ¡ }| 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}|  j|j7  _|  ¡  |dkrÝ|j t ||
|	dd|¡¡ d	}|S |dkrï|j t ||
|	dd	|¡¡ d	}|S |dkr|j t ||
|	d	dt ¡ ¡¡ d	}|S |dkr!|j t ||
|	d	d	t ¡ ¡¡ d	}|S )zParse `nth` pseudo.rç   Ú_childÚ_typer€   rÐ   ÚevenrW   r   TÚoddr   Ús1r’   rˆ   ÚaÚnÚ1Nr   Ús2ÚbÚ0é
   ÚofrJ   FrL   rK   rM   )Ú	groupdictrÉ   r   ry   r}   r   r	   ra   ÚRE_NTHr{   r‰   Úendswithr
  rg   r?  r  r   r@  ÚCSS_NTH_OF_S_DEFAULTrø   rû   rÐ   r    rÚ   r=  rÛ   )r²   rÝ   r„   rü   r"  ÚmdictÚpostfixr   rJ  rN  ÚvarÚ	nth_partsÚ_s1rK  Ú_s2Ú
pseudo_selÚnth_selrq   rq   rr   Úparse_pseudo_nthÓ  sh   	
 



 



ø
û 
ý zCSSParser.parse_pseudo_nthr€   r¦   c                 C  sZ   t tB }|dkr|tO }n|dkr|tO }n|dv r|tO }|j |  |||¡¡ d}|S )z"Parse pseudo with opening bracket.rB   rA   )rC   r@   T)r   r@  ÚFLG_NOTÚFLG_RELATIVEÚFLG_FORGIVErÑ   r    r?  )r²   rÝ   r€   rü   r"  r¦   rf   rq   rq   rr   r(    s   


zCSSParser.parse_pseudo_openrÑ   r×   rÓ   útuple[bool, _Selector, str]c                 C  s¦   |  d¡ ¡ }|st}|tkr%||_|d j |¡ dt }| tƒ ¡ n$|r3||_|d j |¡ n|dd… tkrEtd|› | j	|ƒ‚d| }tƒ }d}|||fS )úParse combinator tokens.Úrelationr   rR   r   Nz%The multiple combinators at position F)
r‰   ÚstripÚWS_COMBINATORÚCOMMA_COMBINATORrÓ   rÒ   r    rÊ   r   r`   )r²   rÝ   r„   rü   rÑ   rÓ   r¦   Ú
combinatorrq   rq   rr   Úparse_has_combinator-  s*   ý
zCSSParser.parse_has_combinatorrÒ   Ú	is_pseudoÚ
is_forgiveútuple[bool, _Selector]c	           
      C  sà   |  d¡ ¡ }	|	st}	|s3|r|	tkr!td|	› d|› d| j|ƒ‚|	tkr2d|_|dd…= | |¡ n4|	tkrT|jsC|sCt	 
dd¡|_|j |¡ | |¡ |dd…= n|j |¡ |	|_|dd…= | |¡ tƒ }d}||fS )	rd  re  zThe combinator 'z' at position z , must have a selector before itTNrP   F)r‰   rf  rg  rh  r   r`   rÖ   r    rÌ   rÚ   r  rÒ   rÙ   rÓ   rÊ   )
r²   rÝ   r„   rü   rÑ   rÒ   rk  rl  r¦   ri  rq   rq   rr   Úparse_combinatorX  s8   ý

€



zCSSParser.parse_combinatorc                 C  sT   |  d¡}| d¡r|j t|dd… ƒ¡ d}|S |j t|dd… ƒ¡ d}|S )zParse HTML classes and ids.r   Ú.r   NT)r‰   r
  rÎ   r    r}   rÍ   )r²   rÝ   r„   rü   r·   rq   rq   rr   Úparse_class_idˆ  s   

þzCSSParser.parse_class_idc           
      C  s´   t  t| d¡ƒ¡}|dkrt dt¡ |dk}t| d¡ƒ}g }t |¡D ]%}| d¡r.q&| d¡}	|	 	d¡rBt|	d	d
… dƒ}	nt|	ƒ}	| 
|	¡ q&|j 
t ||¡¡ d}|S )zParse contains.r€   rD   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.rF   ÚvaluesÚsplitr   )r  r  r   r   T)r   ry   r}   r‰   ÚwarningsÚwarnÚFutureWarningÚ	RE_VALUESÚfinditerr
  r    rÔ   rÚ   ÚSelectorContains)
r²   rÝ   r„   rü   rÈ   Úcontains_ownrq  rÂ   Útokenr   rq   rq   rr   Úparse_pseudo_contains“  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.rq  rr  r   r  r   r   T)	r‰   rv  rw  r
  r}   r    rÕ   rÚ   ÚSelectorLang)r²   rÝ   r„   rü   rq  rÂ   rz  r   rq   rq   rr   Úparse_pseudo_lang¬  s   



zCSSParser.parse_pseudo_langc                 C  s6   t  | d¡¡dkrtjntj}| j|O  _d}|S )zParse pseudo direction.ÚdirÚltrT)r   ry   r‰   rÚ   ÚSEL_DIR_LTRÚSEL_DIR_RTLrf   )r²   rÝ   r„   rü   r   rq   rq   rr   Úparse_pseudo_dirÁ  s    zCSSParser.parse_pseudo_dirrØ   c              
   C  s   t ƒ }g }d}d}g }dt }	| j}
t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t	@ ƒ}t|t
@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}| jr™|r]tdƒ |rctdƒ |ritdƒ |rotdƒ |rutdƒ |r{tdƒ |rtd	ƒ |r‡td
ƒ |rtdƒ |r“tdƒ |r™tdƒ |r¡| t ƒ ¡ z0	 t|ƒ\}}|dvr¹|  jd7  _|  ¡  |dkrÇtd| d¡› ƒ‚|dkrÖ| jtjO  _d}nõ|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r8|  |||¡}d}n“|dkrl|sV|sStd| d¡› | j | d¡ƒ‚d|_!|r\d}nutd| d¡› | j | d¡ƒ‚|d kr‘|r‚|  "|||||	|¡\}}}	nI|  #||||||||¡\}}n:|d!krž|  $|||¡}n-|d"kr¿|r·td#| 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, |¡ n)|j, -|¡ |d(d(…= | |¡ n|r6|r'|s6d|_!|d(d(…= | |¡ d}|sCtd|› | j |ƒ‚|rLtj.|d) _|rUtj/|d) _|r^tj0|d) _|rgtj1|d) _|rptj2|d) _t 3d*d+„ |D ƒ||| j|
 ¡S ),zParse selectors.FrR   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: TrueT)ró   rå   r   rï   zAt-rules found at position r   rî   rë   rì   rí   z!Pseudo-element found at position ræ   )rè   rç   ré   rê   rå   z Expected a selector at position z)Unmatched pseudo-class close at position ró   rò   rÌ   zTag name found at position z instead of at the start)rñ   rð   z"Unclosed pseudo-class at position rP   Nr   c                 S  s   g | ]}|  ¡ ‘qS rq   )rÜ   )Ú.0Úsrq   rq   rr   Ú
<listcomp>ƒ  s    z-CSSParser.parse_selectors.<locals>.<listcomp>)4rÊ   rg  rø   rƒ   r@  r   ra  r`  ÚFLG_HTMLÚFLG_DEFAULTÚFLG_INDETERMINATEÚFLG_IN_RANGEÚFLG_OUT_OF_RANGEÚFLG_PLACEHOLDER_SHOWNrb  r÷   Úprintr    Únextrû   ÚNotImplementedErrorrC  rf   rÚ   r,  r!  rE  r{  r_  r}  r‚  r   r`   rÖ   rj  rn  r  r  rp  r  ÚStopIterationrÌ   r  rÓ   rÒ   rÙ   ÚSEL_DEFAULTÚSEL_INDETERMINATEÚSEL_IN_RANGEÚSEL_OUT_OF_RANGEÚSEL_PLACEHOLDER_SHOWNrÛ   )r²   r"  r¦   rf   rÝ   rÑ   rü   ÚclosedrÒ   rÓ   rø   Úis_openrk  Úis_relativeÚis_notr$  Ú
is_defaultÚis_indeterminateÚis_in_rangeÚis_out_of_rangeÚis_placeholder_shownrl  r~   r„   rq   rq   rr   r?  É  s*  	





ýý
ÿ
ÿ

ý

»(ÿý


ý	 zCSSParser.parse_selectorsr`   c           	   
   c  sn   t  |¡}|r| d¡nd}t |¡}|r| d¡d nt|ƒd }| jr-td|›ƒ ||kr¬d}| jD ]2}| 	||| j
¡}|rh| ¡ }| jr\td|› d| d¡›d| d¡› ƒ | d¡}||fV   nq6|du r¨|| }|dkr{d	|› }n&|d
kr…d|› }n|dkrd|› }n|dkr™d|› }nd|›d|› }t|| j|ƒ‚||ks1| jrµtdƒ dS dS )zIterate selector tokens.r   r   z## PARSING: NzTOKEN: 'z' --> z at position ú[z)Malformed attribute selector at position ro  z%Malformed class selector at position ú#z"Malformed id selector at position rR   z,Malformed pseudo-class selector at position zInvalid character z
 position z## END PARSING)ÚRE_WS_BEGINr  r  Ú	RE_WS_ENDrC  rŸ   r÷   rŒ  Ú
css_tokensr{   rf   r¶   r‰   r   r`   )	r²   r`   r„   r¦   r  Úvr€   r§   Úmsgrq   rq   rr   Úselector_iter…  sF   €


&

úæÿzCSSParser.selector_iterc                 C  s   |   |  | j¡||¡S )zProcess selectors.)r?  r¥  r`   )r²   r¦   rf   rq   rq   rr   ro   ®  s   zCSSParser.process_selectors)Nr   )r·   ra   rd   rô   rf   rg   rh   rt   ©rh   rt   )rÝ   rÊ   r„   r…   rü   rƒ   rh   rƒ   )rÝ   rÊ   r„   r…   rü   rƒ   r"  r#  r$  rƒ   rh   r%  )
rÝ   rÊ   r„   r…   rü   rƒ   r"  r#  rh   rƒ   )rÝ   rÊ   r€   ra   rü   rƒ   r"  r#  r¦   rg   rh   rƒ   )rÝ   rÊ   r„   r…   rü   rƒ   rÑ   r×   rÓ   ra   r¦   rg   rh   rc  )rÝ   rÊ   r„   r…   rü   rƒ   rÑ   r×   rÒ   r×   rk  rƒ   rl  rƒ   r¦   rg   rh   rm  )r   r   )r"  r#  r¦   rg   rf   rg   rh   rØ   )r`   ra   rh   r#  )r¦   rg   rf   rg   rh   rØ   )(r½   r¾   r¿   rÀ   r©   ÚPAT_PSEUDO_CLOSErÁ   ÚPAT_PSEUDO_CONTAINSÚPAT_PSEUDO_NTH_CHILDÚPAT_PSEUDO_NTH_TYPEÚPAT_PSEUDO_LANGÚPAT_PSEUDO_DIRÚPAT_PSEUDO_CLASS_CUSTOMÚPAT_PSEUDO_CLASSÚPAT_PSEUDO_ELEMENTÚPAT_AMPÚPAT_AT_RULEÚPAT_IDÚ	PAT_CLASSÚPAT_TAGÚPAT_ATTRÚPAT_COMBINEr¢  r³   rû   r  r  r!  rE  r_  r(  rj  rn  rp  r{  r}  r‚  r?  r¥  ro   rq   rq   rq   rr   rn   ®  sb    ü



öÿçü


F
	
 

C

+
0


ü 
=)rn   zhtml|*:is(a, area)[href]r  z\
    html|*:is(input[type=checkbox], input[type=radio])[checked], html|option[selected]
    z°
    :checked,

    /*
    This pattern must be at the end.
    Special logic is applied to the last selector.
    */
    html|form html|*:is(button, input)[type="submit"]
    aF  
    html|input[type="checkbox"][indeterminate],
    html|input[type="radio"]:is(:not([name]), [name=""]):not([checked]),
    html|progress:not([value]),

    /*
    This pattern must be at the end.
    Special logic is applied to the last selector.
    */
    html|input[type="radio"][name]:not([name='']):not([checked])
    aš  
    html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset)[disabled],
    html|optgroup[disabled] > html|option,
    html|fieldset[disabled] > html|*:is(input:not([type=hidden]), button, select, textarea, fieldset),
    html|fieldset[disabled] >
        html|*:not(legend:nth-of-type(1)) html|*:is(input:not([type=hidden]), button, select, textarea, fieldset)
    z|
    html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset):not(:disabled)
    z,html|*:is(input, textarea, select)[required]z2html|*:is(input, textarea, select):not([required])aW  
    html|input:is(
        :not([type]),
        [type=""],
        [type=text],
        [type=search],
        [type=url],
        [type=tel],
        [type=email],
        [type=password],
        [type=number]
    )[placeholder]:not([placeholder='']):is(:not([value]), [value=""]),
    html|textarea[placeholder]:not([placeholder=''])
    z*|*a  
    html|*:is(
        textarea,
        input:is(
            :not([type]),
            [type=""],
            [type=text],
            [type=search],
            [type=url],
            [type=tel],
            [type=email],
            [type=number],
            [type=password],
            [type=date],
            [type=datetime-local],
            [type=month],
            [type=time],
            [type=week]
        )
    ):not([readonly], :disabled),
    html|*:is([contenteditable=""], [contenteditable="true" i])
    z!
    html|*:not(:read-write)
    zó
    html|input:is(
        [type="date"],
        [type="month"],
        [type="week"],
        [type="time"],
        [type="datetime-local"],
        [type="number"],
        [type="range"]
    ):is(
        [min],
        [max]
    )
    z*
    html|*:is(details, dialog)[open]
    z(
    html|*:is(video, audio)[muted]
    )
r`   ra   rb   rc   rd   re   rf   rg   rh   ri   r¦  )rd   re   rh   rw   )F)r   ra   r‚   rƒ   rh   ra   )r‘   ra   rh   ra   )irÀ   Ú
__future__r   r¬   Ú	functoolsr   rˆ   r   r   rl   r   rÚ   r   rs  Útypingr	   r
   r   r   rŠ   rù   r)  rA  r'  r>  ÚPSEUDO_SPECIALrB  ÚNEWLINEÚWSÚCOMMENTSÚWSCÚCSS_ESCAPESÚCSS_STRING_ESCAPESÚ
IDENTIFIERÚNTHÚVALUEÚATTRr²  r³  r´  rµ  r®  rÅ   r­  r°  r§  r¯  r±  r©  rª  r«  r¬  r¶  r¨  r­   r®   rŽ   r   rT  r¯   rv  r  r   r¡  rz   rh  rg  r   r`  ra  r‡  r†  rˆ  r@  r‰  rŠ  r‹  rb  Ú	_MAXCACHErs   rv   rk   r}   r¨   r©   rÁ   rÊ   rn   ro   r.  r/  r0  r1  r2  r3  r4  r7  r<  rV  r9  r8  r:  r;  r6  r5  rq   rq   rq   rr   Ú<module>   s~   	ÿþ$




ÿþþþþþþþþÿþþ(("



%D      ÿþÿüÿ
öÿôÿø
ÿüÿþÿþÿñÿþÿéÿüÿñÿñÿüÿ
ü