a
    ñ»j¹¿  ã                   @  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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�dfdgdhdidjdkœdldm„ƒZOdndoœdpdq„ZPdhdrdsœdtdu„ZQd–dfdwdfdxœdydz„ZRdfdfd{œd|d}„ZSG d~d„ 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    >   ú:openú:out-of-rangeú:placeholder-shownú:defaultú	:disabledú:linkú	:in-rangeú:last-of-typeú:only-of-typeú
:read-onlyú:checkedú	:optionalú:rootú:last-childú:first-childú:only-childú:definedú:enabledú	:requiredú:first-of-typeú:scopeú:read-writeú	:any-linkú:indeterminateú:emptyú:muted>   z
:bufferingz:local-linkz:visitedz:user-invalidz:fullscreenz	:autofillz:futurez:playingz:popover-openz:hoverz:pastz:target-withinz:stalledz:targetú:hostz:focus-withinz:volume-lockedz:focus-visiblez:picture-in-picturez:focusz:seekingz:activeú:currentz:paused>   ú:isú:-soup-containsú	:containsú:notú:wherez:matchesú:-soup-contains-ownú:has>   r(   r'   z:host-context>   ú:nth-last-of-typeú
:nth-childú:nth-of-typeú:langú:nth-last-childú:dirz(?:\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Ú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.©rL   rM   )Úprocess_customÚcmZ	SoupSieveÚ	CSSParserÚprocess_selectors)rJ   rK   rL   rM   Úcustom_selectors© rU   ú:E:\soccer\ml_env\Lib\site-packages\soupsieve/css_parser.pyÚ_cached_css_compileÎ   s    	ý÷rW   ÚNone©rN   c                   C  s   t  ¡  dS )zPurge the cache.N)rW   Úcache_clearrU   rU   rU   rV   Ú_purge_cacheå   s    r[   z dict[str, str | ct.SelectorList])rL   rN   c                 C  sn   i }| durj|   ¡ D ]T\}}t |¡}t |¡du rDt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)rL   rT   ÚkeyÚvalueÚnamerU   rU   rV   rP   ë   s    
rP   FÚbool)ÚcontentÚstringrN   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]rH   )ÚmrN   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   NrB   r   r?   é   õ   ï¿½Ú )ÚgrouprI   ÚUNICODE_REPLACEMENT_CHARÚchr)ri   Ú	codepointrc   rU   rU   rV   Úreplace  s    



zcss_unescape.<locals>.replace)Ú
RE_CSS_ESCÚRE_CSS_STR_ESCÚsub)rf   rg   rq   rU   rU   rV   ra   ú   s    ra   )ÚidentrN   c                 C  sŠ  g }t | ƒ}|dko| d dk}|dkr@|r@| d| › �¡ �n@t| ƒD �]4\}}t|ƒ}|dkrn| d¡ qHd|  kr‚dksŒn |dkr¢| d|d›d	�¡ qH|dks¶|rä|dkräd
|  krÊdkrän n| d|d›d	�¡ qH|dv �sb|dk�sbd
|  k�rdk�sbn d
|  k�r*dk�sbn d|  k�rDdk�sbn d|  k�r^dk�rnn n| |¡ qH| d|› �¡ qHd |¡S )zEscape identifier.r   ú-r   ú\rk   é   é   Úxr>   é0   é9   )é-   é_   rE   éA   éZ   éa   éz   rl   )ÚlenÚappendÚ	enumerateÚordÚjoin)ru   rg   ÚlengthZ
start_dashÚindexÚcrp   rU   rU   rV   Úescape  sH    ,ÿÿÿ
ÿ
þ
þ
þ
þ
þ
þr‹   c                   @  sD   e Zd ZdZddddœdd„Zddœdd	„Zdd
d
ddœdd„ZdS )ÚSelectorPatternúSelector pattern.rH   rX   )rd   rJ   rN   c                 C  s&   || _ t |tjtjB tjB ¡| _dS )úInitialize.N)rd   ÚreÚcompileÚIÚXÚUÚ
re_pattern)Úselfrd   rJ   rU   rU   rV   Ú__init__4  s    zSelectorPattern.__init__rY   c                 C  s   | j S )ú	Get name.)rd   ©r•   rU   rU   rV   Úget_name:  s    zSelectorPattern.get_namerI   úMatch[str] | None©Úselectorr‰   rM   rN   c                 C  s   | j  ||¡S )úMatch the selector.)r”   r_   )r•   rœ   r‰   rM   rU   rU   rV   r_   ?  s    zSelectorPattern.matchN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r–   r™   r_   rU   rU   rU   rV   rŒ   1  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]], ...]rX   )ÚpatternsrN   c                 C  sh   i | _ |D ]6}|d }|d ||d ƒ}|d D ]}|| j |< q0q
d| _t ttjtjB tjB ¡| _dS )rŽ   r   rj   r?   r   N)	r¤   Úmatched_namer�   r�   ÚPAT_PSEUDO_CLASS_SPECIALr‘   r’   r“   Úre_pseudo_name)r•   r¤   Úprd   rJ   ÚpseudorU   rU   rV   r–   H  s    zSpecialPseudoPattern.__init__rH   rY   c                 C  s   | j du rdS | j  ¡ S )r—   Nrl   )r¥   r™   r˜   rU   rU   rV   r™   U  s    zSpecialPseudoPattern.get_namerI   rš   r›   c                 C  sV   d}| j  ||¡}|rRt t| d¡ƒ¡}| j |¡}|rR| |||¡}|rR|| _|S )r�   Nrd   )	r§   r_   r   r]   ra   rm   r¤   Úgetr¥   )r•   rœ   r‰   rM   r©   ri   rd   rJ   rU   rU   rV   r_   Z  s    zSpecialPseudoPattern.matchNrž   rU   rU   rU   rV   r£   E  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
   rX   )ÚkwargsrN   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ÚlangrM   r   Úno_matchF)rª   r­   r®   r¯   r°   r±   r²   r³   r´   rµ   r¶   rM   r·   )r•   r¬   rU   rU   rV   r–   s  s    z_Selector.__init__úlist[_Selector]úct.SelectorList)r³   rN   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³   ÚselrU   rU   rV   Ú_freeze_relationsƒ  s
    z_Selector._freeze_relationszct.Selector | ct.SelectorNullrY   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¶   rM   r˜   rU   rU   rV   r½   �  s    
õz_Selector.freezerH   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=r6   )r­   r®   r¯   r°   r±   r²   r³   r´   rµ   r¶   rM   r·   r˜   rU   rU   rV   Ú__str__¡  s$    "ÿÿÿþþþþýÿz_Selector.__str__N)	rŸ   r    r¡   r¢   r–   r¿   r½   rÁ   Ú__repr__rU   rU   rU   rV   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dSdddddœdd„Z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/œd0d1„Zd#d$d%d-d%d2œd3d4„Zd#dd%d-dd%d5œd6d7„Zd#d$d%d8ddd9d:œd;d<„Zd#d$d%d8d8d%d%dd=d>œ	d?d@„Z d#d$d%d%d&œdAdB„Z!d#d$d%d%d&œdCdD„Z"d#d$d%d%d&œdEdF„Z#d#d$d%d%d&œdGdH„Z$dTd-dddIdJœdKdL„Z%dd-dMœdNdO„Z&dUdddIdPœdQdR„Z'dS )VrR   zParse CSS selectors.Úpseudo_closeÚpseudo_contains)r+   r*   r.   Úpseudo_nth_child)r1   r4   Úpseudo_nth_type)r2   r0   Úpseudo_lang)r3   Ú
pseudo_dir)r5   Úpseudo_class_customÚpseudo_classÚpseudo_elementÚampÚat_ruleÚidÚclassr­   Ú	attributeÚcombineNr   rH   z'dict[str, str | ct.SelectorList] | NonerI   rX   )rœ   rL   rM   rN   c                 C  s>   |  dd¡| _|| _| jtj@ | _|du r.i n|| _d| _dS )rŽ   ú rk   Nr   )rq   rJ   rM   r   ÚDEBUGÚdebugrL   Úcount)r•   rœ   rL   rM   rU   rU   rV   r–   Í  s
    zCSSParser.__init__rY   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˜   rU   rU   rV   Úcheck_countÛ  s    
zCSSParser.check_countr«   rh   re   )r¾   ri   Úhas_selectorrN   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éÿÿÿÿrl   Ú	attr_nameÚir   ÚtypeTrc   ©ú"ú'r   r;   z^%s.*r<   z.*?%s$r8   z.*?%s.*ú~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*r7   z^%s(?:-.*)?$z^%s$ú!)rm   r   r]   ra   r�   r‘   ÚDOTALLÚ
startswithr�   r‹   ÚRE_WSÚsearchrJ   r»   ZSelectorAttributer«   r°   r„   r¼   r½   r²   )r•   r¾   ri   rÙ   ZinverseÚoprÛ   ÚnsÚattrZis_typeZpattern2rc   rM   rJ   Zsel_attrZsub_selZnot_listrU   rU   rV   Úparse_attribute_selectorá  sZ    
$ z"CSSParser.parse_attribute_selectorc                 C  sH   |  d¡r t|  d¡dd… ƒnd}t|  d¡ƒ}t ||¡|_d}|S )z#Parse tag pattern from regex match.Ztag_nsNrÜ   Ztag_nameT)rm   ra   r»   ÚSelectorTagr­   )r•   r¾   ri   rÙ   Úprefixr­   rU   rU   rV   Úparse_tag_pattern'  s
    $zCSSParser.parse_tag_patternc                 C  s²   t  t| d¡ƒ¡}| j |¡}|du rNtd|› d| d¡› �| j| d¡ƒ‚t	|t
jƒs†| 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.
        rd   NzUndefined custom selector 'z' found at position r   rO   ©rM   T)r   r]   ra   rm   rL   rª   r   ÚendrJ   Ú
isinstancer»   r¼   rR   rM   rS   Ú
FLG_PSEUDOrÕ   rØ   r²   r„   )r•   r¾   ri   rÙ   r©   rœ   rU   rU   rV   Úparse_pseudo_class_custom0  s*    ý
ÿþ
z#CSSParser.parse_pseudo_class_customz Iterator[tuple[str, Match[str]]]ztuple[bool, bool])r¾   ri   rÙ   Ú	iselectorÚis_htmlrN   c                 C  sš  d}t  t| d¡ƒ¡}| d¡r&d}|rN|tv rN|  ||||| d¡¡}�nD|�sþ|tv �rþ|dkrz| jt	j
O  _�n~|dkrš| jt	jO  _d}�n^|dkr¶| jt	jO  _�nB|d	krÒ| jt	jO  _�n&|d
v �r|  jtj7  _|  ¡  |j t¡ �nô|dk�r6|  jtj7  _|  ¡  |j t¡ �nÂ|dk�rh|  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�r0|  jtj7  _|  ¡  |j t¡ �nÈ|dk�rb|  jtj7  _|  ¡  |j t¡ �n–|dk�r”|  jtj7  _|  ¡  |j t¡ �nd|dk�rÆ|  jtj7  _|  ¡  |j t¡ �n2|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¡ �nj|dk�rÀ|  jt j7  _|  ¡  |j t ¡ �n8|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�rF|j! t	 "dddddt	 #¡ ¡¡ n²|dk�rr|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�rø|j! $t	 "dddddt	 #¡ ¡t	 "dddddt	 #¡ ¡g¡ d}n”|�r2|t%v �r2|  &|| d¡t't(B ¡ d|_)d}n`|�sN|t*v �rNd|_)d}nD|t+v �rvt,d |› d!�| j-| .d¡ƒ‚nt,d!|› d"�| j-| .d¡ƒ‚||fS )#zParse pseudo class.Frd   Ú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   r]   ra   rm   ÚPSEUDO_COMPLEXÚparse_pseudo_openrñ   ÚPSEUDO_SIMPLErM   r»   ZSEL_ROOTZSEL_DEFINEDÚ	SEL_SCOPEZ	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   rJ   Ústart)r•   r¾   ri   rÙ   rõ   rö   Zcomplex_pseudor©   rU   rU   rV   Úparse_pseudo_classO  sè    

















$
"
"
"
þÿ
þÿ

ý
üzCSSParser.parse_pseudo_class)r¾   ri   rÙ   rõ   rN   c                 C  sF  |  ¡ }| 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}|  j|j7  _|  ¡  |dk�rÀ|j t ||
|	dd|¡¡ n&|dk�r>|j t ||
|	dd	|¡¡ nV|dk�r|j t ||
|	d	dt ¡ ¡¡ n*|dk�r>|j t ||
|	d	d	t ¡ ¡¡ d	}|S )zParse `nth` pseudo.rÅ   Ú_childÚ_typerd   r±   Zevenr?   r   TZoddr   Ús1rv   rl   ÚaÚnÚ1NrÜ   Ús2ÚbÚ0é
   Zofr1   Fr4   r2   r0   )Ú	groupdictrª   r   r]   ra   r   r	   rH   ÚRE_NTHr_   rm   Úendswithræ   rI   r  rñ   ró   r  ÚCSS_NTH_OF_S_DEFAULTrÕ   rØ   r±   r„   r»   r  r¼   )r•   r¾   ri   rÙ   rõ   ZmdictZpostfixrf   r  r  ÚvarZ	nth_partsZ_s1r  Z_s2Z
pseudo_selZnth_selrU   rU   rV   Úparse_pseudo_nthÓ  s\    	
 



$





"
 zCSSParser.parse_pseudo_nth)r¾   rd   rÙ   rõ   r‰   rN   c                 C  sZ   t tB }|dkr|tO }n"|dkr,|tO }n|dv r<|tO }|j |  |||¡¡ d}|S )z"Parse pseudo with opening bracket.r,   r/   )r-   r)   T)ró   r  ÚFLG_NOTÚFLG_RELATIVEÚFLG_FORGIVEr²   r„   r  )r•   r¾   rd   rÙ   rõ   r‰   rM   rU   rU   rV   rù     s    


zCSSParser.parse_pseudo_openr¸   ztuple[bool, _Selector, str])r¾   ri   rÙ   r²   r´   r‰   rN   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:   r   Nz%The multiple combinators at position F)
rm   ÚstripÚWS_COMBINATORÚCOMMA_COMBINATORr´   r³   r„   r«   r   rJ   )r•   r¾   ri   rÙ   r²   r´   r‰   Ú
combinatorrU   rU   rV   Úparse_has_combinator-  s*    ýzCSSParser.parse_has_combinatorztuple[bool, _Selector])	r¾   ri   rÙ   r²   r³   Ú	is_pseudoÚ
is_forgiver‰   rN   c	           
      C  sà   |  d¡ ¡ }	|	st}	|sf|r&|	tkrBtd|	› d|› 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'  zThe combinator 'z' at position z , must have a selector before itTNr8   F)rm   r(  r)  r*  r   rJ   r·   r„   r­   r»   rí   r³   rº   r´   r«   )
r•   r¾   ri   rÙ   r²   r³   r-  r.  r‰   r+  rU   rU   rV   Úparse_combinatorX  s6    ý




zCSSParser.parse_combinatorc                 C  sN   |  d¡}| d¡r.|j t|dd… ƒ¡ n|j t|dd… ƒ¡ d}|S )zParse HTML classes and ids.r   Ú.r   NT)rm   ræ   r¯   r„   ra   r®   )r•   r¾   ri   rÙ   rœ   rU   rU   rV   Ú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 ]J}| d¡r\qL| d¡}	|	 	d¡r„t|	d	d
… dƒ}	nt|	ƒ}	| 
|	¡ qL|j 
t ||¡¡ d}|S )zParse contains.rd   r+   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.r.   ÚvaluesÚsplitrc   )râ   rá   r   rÜ   T)r   r]   ra   rm   ÚwarningsÚwarnÚFutureWarningÚ	RE_VALUESÚfinditerræ   r„   rµ   r»   ZSelectorContains)
r•   r¾   ri   rÙ   r©   Zcontains_ownr2  r¤   Útokenrc   rU   rU   rV   Úparse_pseudo_contains“  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.r2  r3  rc   rà   r   rÜ   T)	rm   r7  r8  ræ   ra   r„   r¶   r»   ZSelectorLang)r•   r¾   ri   rÙ   r2  r¤   r9  rc   rU   rU   rV   Úparse_pseudo_lang¬  s    



zCSSParser.parse_pseudo_langc                 C  s6   t  | d¡¡dkrtjntj}| j|O  _d}|S )zParse pseudo direction.ÚdirZltrT)r   r]   rm   r»   ZSEL_DIR_LTRZSEL_DIR_RTLrM   )r•   r¾   ri   rÙ   rc   rU   rU   rV   Úparse_pseudo_dirÁ  s     zCSSParser.parse_pseudo_dirr¹   )rõ   r‰   rM   rN   c              
   C  s4  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ƒ |rÈtdƒ |rÔtdƒ |ràtdƒ |rìtdƒ |røtdƒ |�rtd	ƒ |�rtd
ƒ |�r"tdƒ |�r0tdƒ |�r>tdƒ |�rP| t ƒ ¡ �z†t|ƒ\}}|dv�r€|  jd7  _|  ¡  |dk�r¢td| d¡› �ƒ‚�n&|dk�rÄ| jtjO  _d}�n|dk�rà|  |||¡}�nè|dk�r|  |||||¡\}}�nÄ|dk�r&td| d¡› �ƒ‚�n¢|dk�rB|  |||¡}�n†|dv �r`|  ||||¡}�nh|dk�r||  |||¡}�nL|dk�rœ|  |||¡}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�rT|�r6|  "|||||	|¡\}}}	n|  #||||||||¡\}}nt|d!k�rn|  $|||¡}nZ|d"k�r°|�r td#| d¡› d$�| j | d¡ƒ‚|  %|||¡}n|d%v �rÈ|  &|||¡}| 'd¡}�qTW n t(�yì   Y n0 |�r|�std&|› �| j |ƒ‚|�rp|j)�s0|�s0t *d'd(¡|_)|�rN|	|_+|d) j, |¡ n |j, -|¡ |d(d(…= | |¡ n0|�r |�r‚|�s d|_!|d(d(…= | |¡ d}|�sºtd|› �| j |ƒ‚|�rÌtj.|d) _|�rÞtj/|d) _|�rðtj0|d) _|�rtj1|d) _|�rtj2|d) _t 3d*d+„ |D ƒ||| j|
 ¡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: True)rÑ   rÃ   r   rÍ   zAt-rules found at position r   rÌ   TrÉ   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 r8   NrÜ   c                 S  s   g | ]}|  ¡ ‘qS rU   )r½   )Ú.0ÚsrU   rU   rV   Ú
<listcomp>ƒ  ó    z-CSSParser.parse_selectors.<locals>.<listcomp>)4r«   r)  rÕ   re   r  ró   r$  r#  ÚFLG_HTMLÚFLG_DEFAULTÚFLG_INDETERMINATEÚFLG_IN_RANGEÚFLG_OUT_OF_RANGEÚFLG_PLACEHOLDER_SHOWNr%  rÔ   Úprintr„   ÚnextrØ   ÚNotImplementedErrorr  rM   r»   rû   rô   r  r:  r"  r;  r=  r   rJ   r·   r,  r/  rì   rï   r1  rñ   ÚStopIterationr­   rí   r´   r³   rº   ZSEL_DEFAULTZSEL_INDETERMINATEZSEL_IN_RANGEZSEL_OUT_OF_RANGEZSEL_PLACEHOLDER_SHOWNr¼   )r•   rõ   r‰   rM   r¾   r²   rÙ   Úclosedr³   r´   rÕ   Zis_openr-  Zis_relativeÚis_notrö   Ú
is_defaultZis_indeterminateZis_in_rangeZis_out_of_rangeZis_placeholder_shownr.  rb   ri   rU   rU   rV   r  É  s"   	










ýý
ÿÿ


ý
ý


ý	zCSSParser.parse_selectors)rJ   rN   c           	   
   c  sl  t  |¡}|r| d¡nd}t |¡}|r8| d¡d n
t|ƒd }| jrXtd|›�ƒ ||k�rXd}| jD ]d}| 	||| j
¡}|rl| ¡ }| jr¸td|› d| d¡›d| d¡› �ƒ | d¡}||fV   qÒql|du rX|| }|dkröd	|› �}nR|d
k�rd|› �}n<|dk�r"d|› �}n&|dk�r8d|› �}nd|›d|› �}t|| j|ƒ‚qX| j�rhtdƒ dS )zIterate selector tokens.r   r   z## PARSING: NzTOKEN: 'z' --> z at position ú[z)Malformed attribute selector at position r0  z%Malformed class selector at position ú#z"Malformed id selector at position r:   z,Malformed pseudo-class selector at position zInvalid character z
 position z## END PARSING)ÚRE_WS_BEGINrè   rñ   Ú	RE_WS_ENDr  rƒ   rÔ   rH  Ú
css_tokensr_   rM   r™   rm   r   rJ   )	r•   rJ   ri   r‰   rñ   Úvrd   rŠ   ÚmsgrU   rU   rV   Úselector_iter…  s>    



&




zCSSParser.selector_iter)r‰   rM   rN   c                 C  s   |   |  | j¡||¡S )zProcess selectors.)r  rV  rJ   )r•   r‰   rM   rU   rU   rV   rS   ®  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_AMPÚPAT_AT_RULEÚPAT_IDÚ	PAT_CLASSÚPAT_TAGÚPAT_ATTRÚPAT_COMBINErS  r–   rØ   rì   rï   rô   r  r"  rù   r,  r/  r1  r:  r;  r=  r  rV  rS   rU   rU   rU   rV   rR   ®  s`   ü



öÿç  üF	 C+0  ü =)rR   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]
    )F)ir¢   Ú
__future__r   r�   Ú	functoolsr   rl   r   r   rQ   r   r»   r   r4  Útypingr	   r
   r   r   rn   rÖ   rú   r  rø   r  ZPSEUDO_SPECIALr  ÚNEWLINEÚWSZCOMMENTSZWSCZCSS_ESCAPESZCSS_STRING_ESCAPESÚ
IDENTIFIERZNTHZVALUEZATTRrb  rc  rd  re  r^  r¦   r]  r`  rW  r_  ra  rY  rZ  r[  r\  rf  rX  r�   r‘   rr   rs   r  r’   r7  rç   rQ  rR  r^   r*  r)  ró   r#  r$  rC  rB  rD  r  rE  rF  rG  r%  Ú	_MAXCACHErW   r[   rP   ra   r‹   rŒ   r£   r«   rR   rS   rü   rý   rþ   rÿ   r   r  r  r  r
  r   r  r  r  r	  r  r  rU   rU   rU   rV   Ú<module>   s|  	ÿþ$




ÿþþþþþþþþÿþþ(("
%D      ÿþÿüÿ

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