o
    eQ´  ã                   @  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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#› Z'd2e › d3e› d4Z(d2e › d3e› d5Z)d6e › dZ*e› d7Z+d8e(› Z,d9e › Z-d:e)› d;e!› d<e› d=e› d>e› e› d?e› d>e› e› d@Z.dAe)› dBe!› dCe› dDZ/e)› dEe"› de› dFe› d>e"› dGe› d7Z0e)› dHe› d7Z1e› dIe› dJe› d>Z2e)› dEe"› de› dFe› d>e"› dGe› d7Z3e 4dKe› dLej5¡Z6e 4dKe› dMe› dej5¡Z7e 4dNe› dOe› dPej5¡Z8e 4dQe"› dRe› dFe› dSej9¡Z:e 4e¡Z;e 4dTe› d>¡Z<e 4e› dU¡Z=e 4dTe*› dVej9¡Z>dWZ?dXZ@dZAdYZBdZZCd[ZDd\ZEd]ZFd^ZGd_ZHd`ZIdaZJdbZKdcZLeeLddd–dodp„ƒZMd—drds„ZNd˜dudv„ZOd™dšd{d|„ZPd›d~d„ZQG d€d„ dƒZRG d‚dƒ„ dƒeRƒZSG d„d…„ d…ƒZTG d†d‡„ d‡ƒZUeUdˆƒjVeAeEB d‰ZWeUdŠƒjVeAeEB d‰ZXeUd‹ƒjVeAeEB eDB d‰ZYeUdŒƒjVeAeEB eFB d‰ZZeUdƒjVeAeEB d‰Z[eUdŽƒjVeAeEB d‰Z\eUdƒjVeAeEB d‰Z]eUdƒjVeAeEB d‰Z^eUd‘ƒjVeAeEB eJB d‰Z_eUd’ƒjVeAd‰Z`eUd“ƒjVeAeEB d‰ZaeUd”ƒjVeAeEB d‰ZbeUd•ƒjVeAeHB eEB d‰ZceUd•ƒjVeAeIB eEB d‰ZddS )œzCSS selector parser.é    )ÚannotationsN)Ú	lru_cacheé   )Úutil)Ú	css_match)Ú	css_types)ÚSelectorSyntaxError)ÚMatchÚAnyÚIteratorÚcastiýÿ  >   ú:definedú:placeholder-shownú:last-of-typeú
:read-onlyú	:requiredú:last-childú:first-childú	:any-linkú:defaultú:read-writeú:only-of-typeú:emptyú:only-childú	:disabledú:checkedú	:optionalú:first-of-typeú	:in-rangeú:out-of-rangeú:indeterminateú:rootú:enabledú:linkú:scope>   z:focus-withinz:pausedz:activez:playingz:focusz:local-linkz:targetz:target-withinz:pastz:hoverz:focus-visiblez:visitedz:futureú:currentú:hostz:user-invalid>   ú:isú:-soup-contains-ownú:whereú	:containsú:-soup-containsz:matchesú:hasú:not>   z:host-contextr%   r&   >   ú:dirú:langú
:nth-childú:nth-last-of-typeú:nth-of-typeú:nth-last-childz(?:\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+)z*(?P<cmp>[!~^|*$]?=)z*(?P<value>z)(?:z*(?P<case>[is]))?)?z*\]z\#z\.z(?P<tag_ns>(?:z|\*)?\|)?(?P<tag_name>z|\*)z\[z*(?P<attr_ns>(?:z|\*)?\|)?(?P<attr_name>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.©rI   rK   )Úprocess_customÚcmZ	SoupSieveÚ	CSSParserÚprocess_selectors)rE   rG   rI   rK   Úcustom_selectors© rU   úDD:\Projects\ConvertPro\env\Lib\site-packages\soupsieve/css_parser.pyÚ_cached_css_compileÀ   s   	ý÷rW   ÚNonec                   C  s   t  ¡  dS )zPurge the cache.N)rW   Úcache_clearrU   rU   rU   rV   Ú_purge_cache×   s   rZ   ú 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)rI   rT   ÚkeyÚvalueÚnamerU   rU   rV   rP   Ý   s   
rP   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]rM   rF   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   Nr?   r   r<   é   õ   ï¿½Ú )ÚgrouprL   ÚUNICODE_REPLACEMENT_CHARÚchr)rh   Ú	codepointrc   rU   rU   rV   Úreplaceó   s   

ù
ûþzcss_unescape.<locals>.replaceN)rh   ri   rM   rF   )Ú
RE_CSS_ESCÚRE_CSS_STR_ESCÚsub)re   rf   rq   rU   rU   rV   ra   ì   s   
ra   Ú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   ú\rk   é   é   Úxr;   é0   é9   )é-   é_   rB   éA   éZ   éa   éz   rl   )ÚlenÚappendÚ	enumerateÚordÚjoin)ru   rf   ÚlengthZ
start_dashÚindexÚcrp   rU   rU   rV   Ú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.rd   rF   rE   rM   rX   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   rE   rU   rU   rV   Ú__init__&  s    zSelectorPattern.__init__c                 C  s   | j S )ú	Get name.)rd   ©r•   rU   rU   rV   Úget_name,  s   zSelectorPattern.get_nameÚselectorr‰   rL   rK   úMatch[str] | Nonec                 C  s   | j  ||¡S )úMatch the selector.)r”   r_   )r•   rš   r‰   rK   rU   rU   rV   r_   1  s   zSelectorPattern.matchN)rd   rF   rE   rF   rM   rX   ©rM   rF   ©rš   rF   r‰   rL   rK   rL   rM   r›   ©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r–   r™   r_   rU   rU   rU   rV   rŒ   #  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]], ...]rM   rX   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   rj   r<   r   N)	r¥   Úmatched_namer   r   ÚPAT_PSEUDO_CLASS_SPECIALr‘   r’   r“   Úre_pseudo_name)r•   r¥   Úprd   rE   ÚpseudorU   rU   rV   r–   :  s   ÿ zSpecialPseudoPattern.__init__rF   c                 C  s   | j du rdS | j  ¡ S )r—   Nrl   )r§   r™   r˜   rU   rU   rV   r™   G  s   zSpecialPseudoPattern.get_namerš   r‰   rL   rK   r›   c                 C  sV   d}| j  ||¡}|r)t t| d¡ƒ¡}| j |¡}|r)| |||¡}|r)|| _|S )rœ   Nrd   )	r©   r_   r   r]   ra   rm   r¥   Úgetr§   )r•   rš   r‰   rK   r«   rh   rd   rE   rU   rU   rV   r_   L  s   zSpecialPseudoPattern.matchN)r¥   r¦   rM   rX   r   rž   rŸ   rU   rU   rU   rV   r¤   7  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
   rM   rX   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ÚlangrK   r   Úno_matchF)r¬   r¯   r°   r±   r²   r³   r´   rµ   r¶   r·   r¸   rK   r¹   )r•   r®   rU   rU   rV   r–   e  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µ   ÚselrU   rU   rV   Ú_freeze_relationsu  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½   ZSelectorNullZSelectorr¯   Útupler°   r±   r²   r³   r´   rÁ   rµ   r¶   r·   r¸   rK   r˜   rU   rU   rV   r¿     s   
õz_Selector.freezerF   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=r4   )r¯   r°   r±   r²   r³   r´   rµ   r¶   r·   r¸   rK   r¹   r˜   rU   rU   rV   Ú__str__“  s$   "ÿÿÿþþþþýÿz_Selector.__str__N)r®   r
   rM   rX   )rµ   rº   rM   r»   )rM   rÂ   r   )	r    r¡   r¢   r£   r–   rÁ   r¿   rÄ   Ú__repr__rU   rU   rU   rV   r­   \  s    





r­   c                   @  sJ  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		dVdWd d!„ZdXd(d)„ZdXd*d+„ZdXd,d-„ZdYd2d3„ZdZd4d5„Zd[d8d9„Zd\d>d?„Zd]dDdE„ZdXdFdG„ZdXdHdI„Z dXdJdK„Z!dXdLdM„Z"		d^d_dOdP„Z#d`dRdS„Z$d^dadTdU„Z%dS )brR   zParse CSS selectors.Úpseudo_closeÚpseudo_contains)r*   r+   r(   Úpseudo_nth_child)r0   r3   Úpseudo_nth_type)r2   r1   Úpseudo_lang)r/   Ú
pseudo_dir)r.   Úpseudo_class_customÚpseudo_classÚpseudo_elementÚat_ruleÚidÚclassr¯   Ú	attributeÚcombineNr   rš   rF   rI   ú'dict[str, str | ct.SelectorList] | NonerK   rL   rM   rX   c                 C  s>   |  dd¡| _|| _| jtj@ | _|du ri | _dS || _dS )rŽ   ú rk   N)rq   rE   rK   r   ÚDEBUGÚdebugrI   )r•   rš   rI   rK   rU   rU   rV   r–   ¾  s   zCSSParser.__init__rÀ   r­   rh   ri   Úhas_selectorrg   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ÚcaseNZattr_nséÿÿÿÿrl   Z	attr_nameÚir   ÚtypeTrc   ©ú"ú'r   r8   z^%s.*r9   z.*?%s$r7   z.*?%s.*ú~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*r5   z^%s(?:-.*)?$z^%s$ú!)rm   r   r]   ra   r   r‘   ÚDOTALLÚ
startswithr   r‹   ÚRE_WSÚsearchrE   r½   ZSelectorAttributer­   r²   r„   r¾   r¿   r´   )r•   rÀ   rh   rØ   ZinverseÚoprÚ   ÚnsÚattrZis_typeZpattern2rc   rK   rE   Zsel_attrZsub_selZnot_listrU   rU   rV   Ú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)rm   ra   r½   ÚSelectorTagr¯   )r•   rÀ   rh   rØ   Úprefixr¯   rU   rU   rV   Ú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 |¡ 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   ©rK   T)r   r]   ra   rm   rI   r¬   r   ÚendrE   Ú
isinstancer½   r¾   rR   rK   rS   Ú
FLG_PSEUDOr´   r„   )r•   rÀ   rh   rØ   r«   rš   rU   rU   rV   Úparse_pseudo_class_custom  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 |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|› d| j)| *d¡ƒ‚t+d|› d ƒ‚)!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   z!Invalid syntax for pseudo class 'rà   z.' pseudo-class is not implemented at this time),r   r]   ra   rm   ÚPSEUDO_COMPLEXÚparse_pseudo_openrï   ÚPSEUDO_SIMPLErK   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   rE   ÚstartÚNotImplementedError)r•   rÀ   rh   rØ   ró   rõ   Zcomplex_pseudor«   rU   rU   rV   Úparse_pseudo_class6  s¦   

N³
"
"
"
"
þÿ
þÿîò
õ
ý
ÿzCSSParser.parse_pseudo_classc                 C  s0  |  ¡ }| d¡rd}nd}t t|d ƒ¡|d< t | d| ¡¡}|dkr.d}d}	d	}
nq|d
kr9d}d}	d	}
nfttt t 	|¡ƒ}| 
d¡rQ| 
d¡dkrQdnd}| 
d¡}| d¡}
| d¡rg|d7 }n|
rr||dd… 7 }n||7 }| 
d¡r„| 
d¡dkr„dnd}| 
d¡r“|| 
d¡7 }nd}t|dƒ}t|dƒ}	|d }|dkrç| 
d¡r¹|  || d¡ttB ¡}nt}|dkrÑ|j t ||
|	dd|¡¡ d	}|S |dkrã|j t ||
|	dd	|¡¡ d	}|S |dkrÿ|j t ||
|	d	dt ¡ ¡¡ d	}|S |dkr|j t ||
|	d	d	t ¡ ¡¡ d	}|S )zParse `nth` pseudo.rÈ   Ú_childÚ_typerd   r³   Zevenr<   r   TZoddr   Ús1rv   rl   ÚaÚnÚ1NrÛ   Ús2ÚbÚ0é
   Zofr0   Fr3   r2   r1   )Ú	groupdictr¬   r   r]   ra   r   r	   rF   ÚRE_NTHr_   rm   Úendswithrä   rL   r
  rï   rñ   r  ÚCSS_NTH_OF_S_DEFAULTr³   r„   r½   r  r¾   )r•   rÀ   rh   rØ   ró   ZmdictZpostfixre   r  r  ÚvarZ	nth_partsZ_s1r  Z_s2Z
pseudo_selZnth_selrU   rU   rV   Úparse_pseudo_nth•  sd   	
 



 



øû 
ý zCSSParser.parse_pseudo_nthrd   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.r-   r,   )r)   r'   T)rñ   r  ÚFLG_NOTÚFLG_RELATIVEÚFLG_FORGIVEr´   r„   r
  )r•   rÀ   rd   rØ   ró   r‰   rK   rU   rU   rV   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Û   r6   r   Nz%The multiple combinators at position F)
rm   ÚstripÚWS_COMBINATORÚCOMMA_COMBINATORr¶   rµ   r„   r­   r   rE   )r•   rÀ   rh   rØ   r´   r¶   r‰   Ú
combinatorrU   rU   rV   Ú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 )	r%  r&  zThe combinator 'z' at position z , must have a selector before itTNr7   F)rm   r'  r(  r)  r   rE   r¹   r„   r¯   r½   rë   rµ   r¼   r¶   r­   )
r•   rÀ   rh   rØ   r´   rµ   r,  r-  r‰   r*  rU   rU   rV   Ú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)rm   rä   r±   r„   ra   r°   )r•   rÀ   rh   rØ   rš   rU   rU   rV   Úparse_class_idH  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.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À   rh   rØ   r«   Zcontains_ownr2  r¥   Útokenrc   rU   rU   rV   Úparse_pseudo_containsS  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.r2  r3  rc   rÞ   r   rÛ   T)	rm   r7  r8  rä   ra   r„   r¸   r½   ZSelectorLang)r•   rÀ   rh   rØ   r2  r¥   r9  rc   rU   rU   rV   Úparse_pseudo_langl  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_RTLrK   )r•   rÀ   rh   rØ   rc   rU   rU   rV   Úparse_pseudo_dir  s    zCSSParser.parse_pseudo_dirr»   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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}nutd| d¡› | j| d¡ƒ‚|dkrm|r^|  |||||	|¡\}}}	nI|  ||||||||¡\}}n:|dkrz|  |||¡}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|r|r|sd|_|d%d%…= | |¡ d}|std|› | j|ƒ‚|r(t%j*|d& _+|r1t%j,|d& _+|r:t%j-|d& _+|rCt%j.|d& _+|rLt%j/|d& _+t% 0d'd(„ |D ƒ||¡S ))zParse selectors.Fr6   z    is_pseudo: Truez    is_open: Truez    is_relative: Truez    is_not: Truez    is_html: Truez    is_default: Truez    is_indeterminate: Truez    is_in_range: Truez    is_out_of_range: Truez    is_placeholder_shown: Truez    is_forgive: TrueTrÏ   zAt-rules found at position r   rÌ   rÍ   rÎ   z!Pseudo-element found at position rÇ   )rÉ   rÈ   rÊ   rË   rÆ   z Expected a selector at position z)Unmatched pseudo-class close at position rÓ   rÒ   r¯   zTag name found at position z instead of at the start)rÑ   rÐ   z"Unclosed pseudo-class at position r7   NrÛ   c                 S  s   g | ]}|  ¡ ‘qS rU   )r¿   )Ú.0ÚsrU   rU   rV   Ú
<listcomp>;  s    z-CSSParser.parse_selectors.<locals>.<listcomp>)1r­   r(  rg   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:  r   r;  r=  r   rE   r¹   r+  r/  rê   rí   r1  rï   ÚStopIterationr¯   r½   rë   r¶   rµ   r¼   ZSEL_DEFAULTrK   ZSEL_INDETERMINATEZSEL_IN_RANGEZSEL_OUT_OF_RANGEZSEL_PLACEHOLDER_SHOWNr¾   )r•   ró   r‰   rK   rÀ   r´   rØ   Úclosedrµ   r¶   Zis_openr,  Zis_relativeÚis_notrõ   Ú
is_defaultZis_indeterminateZis_in_rangeZis_out_of_rangeZis_placeholder_shownr-  rb   rh   rU   rU   rV   r
  ‰  s  	


ýý
ÿ
ÿ

ý

Â!ÿý


ý	zCSSParser.parse_selectorsrE   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 r0  z%Malformed class selector at position ú#z"Malformed id selector at position r6   z,Malformed pseudo-class selector at position zInvalid character z
 position z## END PARSING)ÚRE_WS_BEGINræ   rï   Ú	RE_WS_ENDr  rƒ   r×   rG  Ú
css_tokensr_   rK   r™   rm   r   rE   )	r•   rE   rh   r‰   rï   Úvrd   rŠ   ÚmsgrU   rU   rV   Úselector_iter=  sF   €


&

úæÿzCSSParser.selector_iterc                 C  s   |   |  | j¡||¡S )zProcess selectors.)r
  rT  rE   )r•   r‰   rK   rU   rU   rV   rS   f  s   zCSSParser.process_selectors)Nr   )rš   rF   rI   rÔ   rK   rL   rM   rX   )rÀ   r­   rh   ri   rØ   rg   rM   rg   )rÀ   r­   rh   ri   rØ   rg   ró   rô   rõ   rg   rM   rö   )
rÀ   r­   rh   ri   rØ   rg   ró   rô   rM   rg   )rÀ   r­   rd   rF   rØ   rg   ró   rô   r‰   rL   rM   rg   )rÀ   r­   rh   ri   rØ   rg   r´   rº   r¶   rF   r‰   rL   rM   r$  )rÀ   r­   rh   ri   rØ   rg   r´   rº   rµ   rº   r,  rg   r-  rg   r‰   rL   rM   r.  )r   r   )ró   rô   r‰   rL   rK   rL   rM   r»   )rE   rF   rM   rô   )r‰   rL   rK   rL   rM   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_COMBINErQ  r–   rê   rí   rò   r  r   rù   r+  r/  r1  r:  r;  r=  r
  rT  rS   rU   rU   rU   rV   rR      s\    ü



öÿèü

F
	

_
A

+
0


ü 
5)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]
    )
    )
rE   rF   rG   rH   rI   rJ   rK   rL   rM   rN   )rM   rX   )rI   rJ   rM   r[   )F)re   rF   rf   rg   rM   rF   )ru   rF   rM   rF   )er£   Ú
__future__r   r   Ú	functoolsr   rl   r   r   rQ   r   r½   r   r4  Útypingr	   r
   r   r   rn   rú   r  rø   r	  ZPSEUDO_SPECIALr  ÚNEWLINEZWSZCOMMENTSZWSCZCSS_ESCAPESZCSS_STRING_ESCAPESÚ
IDENTIFIERZNTHZVALUEZATTRr_  r`  ra  rb  r\  r¨   r[  rU  r]  r^  rW  rX  rY  rZ  rc  rV  r   r‘   rr   rs   r  r’   r7  rå   rO  rP  r^   r)  r(  rñ   r!  r"  rB  rA  rC  r  rD  rE  rF  r#  Ú	_MAXCACHErW   rZ   rP   ra   r‹   rŒ   r¤   r­   rR   rS   rû   rü   rý   rþ   rÿ   r   r  r  r  r  r  r  r  r  rU   rU   rU   rV   Ú<module>   sd   	ÿþ$




ÿþþþþþþþþÿþþ(("



%D     Uÿþÿüÿ
öÿôÿø
ÿüÿþÿþÿñÿþÿéÿüÿñÿ
ñ