B
    '‹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ýÿ  z	:any-linkz:emptyz:first-childz:first-of-typez	:in-rangez:out-of-rangez:last-childz:last-of-typez:linkz:only-childz:only-of-typez:rootz:checkedz:defaultz	:disabledz:enabledz:indeterminatez	:optionalz:placeholder-shownz
:read-onlyz:read-writez	:requiredz:scopez:definedz:activez:currentz:focusz:focus-visiblez:focus-withinz:futurez:hostz:hoverz:local-linkz:pastz:pausedz:playingz:targetz:target-withinz:user-invalidz:visitedz	:containsz:-soup-containsz:-soup-contains-ownz:hasz:isz:matchesz:notz:wherez:host-contextz:dirz:langz
:nth-childz:nth-last-childz:nth-last-of-typez: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]|$)))r   z/(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$|{nl})))r   Ú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}+)
)r   ÚidentzU
(?:{ws}*(?P<cmp>[!~^|*$]?=){ws}*(?P<value>{value})(?:{ws}*(?P<case>[is]))?)?{ws}*\]
)r   Úvaluez	\#{ident})r   z	\.{ident}z6(?P<tag_ns>(?:{ident}|\*)?\|)?(?P<tag_name>{ident}|\*)zD
\[{ws}*(?P<attr_ns>(?:{ident}|\*)?\|)?(?P<attr_name>{ident}){attr}
)r   r   Úattrz$(?P<name>:{ident})(?P<open>\({ws}*)?)r   r   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Úwscr   r   ÚnthzA
(?P<pseudo_nth_type>{name}
(?P<nth_type>{nth}|even|odd)){ws}*\)
)r   r   r   z7{name}(?P<values>{value}(?:{ws}*,{ws}*{value})*){ws}*\))r   r   r   z{name}(?P<dir>ltr|rtl){ws}*\))r   r   z0{wsc}*?(?P<relation>[,+>~]|{ws}(?![,+>~])){wsc}*)r   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.)r&   r'   )Úprocess_customÚcmZ	SoupSieveÚ	CSSParserÚprocess_selectors)r$   r%   r&   r'   Úcustom_selectors© r.   úa/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/soupsieve/css_parser.pyÚ_cached_css_compileÏ   s    	
r0   ÚNone)r(   c               C  s   t  ¡  dS )zPurge the cache.N)r0   Úcache_clearr.   r.   r.   r/   Ú_purge_cacheæ   s    r3   z dict[str, str | ct.SelectorList])r&   r(   c             C  sn   i }| dk	rjx\|   ¡ D ]P\}}t |¡}t |¡dkrDtd |¡ƒ‚||krZtd |¡ƒ‚||t|ƒ< qW |S )zProcess custom.Nz5The name '{}' is not a valid custom pseudo-class namez4The custom selector '{}' has already been registered)	Úitemsr   ÚlowerÚ	RE_CUSTOMÚmatchr   ÚformatÚKeyErrorÚcss_unescape)r&   r-   Úkeyr   r   r.   r.   r/   r)   ì   s    
r)   FÚbool)ÚcontentÚstringr(   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.
    z
Match[str]r"   )Úmr(   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   Nr   r   r   é   u   ï¿½Ú )Úgroupr#   ÚUNICODE_REPLACEMENT_CHARÚchr)r?   Ú	codepointr   r.   r.   r/   Úreplace  s    



zcss_unescape.<locals>.replace)Ú
RE_CSS_ESCÚRE_CSS_STR_ESCÚsub)r=   r>   rF   r.   r.   r/   r:   û   s    r:   )r   r(   c             C  sˆ  g }t | ƒ}|dko| d dk}|dkr@|r@| d | ¡¡ n>x:t| ƒD ],\}}t|ƒ}|dkrr| d¡ qLd|  kr†dksn |dkr¢| d |¡¡ qL|dks¶|rà|dkràd	|  krÊd
kràn n| d |¡¡ qL|dks^|dks^d	|  krd
ks^n d	|  kr&d
ks^n d|  kr@dks^n d|  krZdkrjn n| |¡ qL| d |¡¡ qLW d |¡S )zEscape identifier.r   ú-r   z\{}u   ï¿½é   é   z\{:x} é0   é9   )é-   é_   r   éA   éZ   éa   éz   rA   )ÚlenÚappendr8   Ú	enumerateÚordÚjoin)r   r>   ÚlengthZ
start_dashÚindexÚcrE   r.   r.   r/   Úescape  s$    ,.P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 )ÚSelectorPatternzSelector pattern.r"   r1   )r   r$   r(   c             C  s&   || _ t |tjtjB tjB ¡| _dS )zInitialize.N)r   ÚreÚcompileÚIÚXÚUÚ
re_pattern)Úselfr   r$   r.   r.   r/   Ú__init__5  s    zSelectorPattern.__init__)r(   c             C  s   | j S )z	Get name.)r   )re   r.   r.   r/   Úget_name;  s    zSelectorPattern.get_namer#   zMatch[str] | None)Úselectorr[   r'   r(   c             C  s   | j  ||¡S )zMatch the selector.)rd   r7   )re   rh   r[   r'   r.   r.   r/   r7   @  s    zSelectorPattern.matchN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__rf   rg   r7   r.   r.   r.   r/   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 )ÚSpecialPseudoPatternzSelector pattern.zCtuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]r1   )Úpatternsr(   c             C  sp   i | _ xB|D ]:}|d }|d ||d ƒ}x|d D ]}|| j |< q4W qW d| _t ttjtjB tjB ¡| _dS )zInitialize.r   r@   r   r   N)	rn   Úmatched_namer_   r`   ÚPAT_PSEUDO_CLASS_SPECIALra   rb   rc   Úre_pseudo_name)re   rn   Úpr   r$   Úpseudor.   r.   r/   rf   I  s    
zSpecialPseudoPattern.__init__r"   )r(   c             C  s   | j dkrdS | j  ¡ S )z	Get name.NrA   )ro   rg   )re   r.   r.   r/   rg   V  s    zSpecialPseudoPattern.get_namer#   zMatch[str] | None)rh   r[   r'   r(   c             C  sV   d}| j  ||¡}|rRt t| d¡ƒ¡}| j |¡}|rR| |||¡}|rR|| _|S )zMatch the selector.Nr   )	rq   r7   r   r5   r:   rB   rn   Úgetro   )re   rh   r[   r'   rs   r?   r   r$   r.   r.   r/   r7   [  s    zSpecialPseudoPattern.matchN)ri   rj   rk   rl   rf   rg   r7   r.   r.   r.   r/   rm   F  s   rm   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
   r1   )Úkwargsr(   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 )zInitialize.ÚtagNÚidsÚclassesÚ
attributesr   Ú	selectorsÚ	relationsÚrel_typeÚcontainsÚlangr'   r   Úno_matchF)rt   rw   rx   ry   rz   r   r{   r|   r}   r~   r   r'   r€   )re   rv   r.   r.   r/   rf   t  s    z_Selector.__init__zlist[_Selector]zct.SelectorList)r|   r(   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)re   r|   Úselr.   r.   r/   Ú_freeze_relations„  s
    z_Selector._freeze_relationszct.Selector | ct.SelectorNull)r(   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Selectorrw   Útuplerx   ry   rz   r   r{   r†   r|   r}   r~   r   r'   )re   r.   r.   r/   r„   Ž  s    
z_Selector.freezer"   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}))r8   rw   rx   ry   rz   r   r{   r|   r}   r~   r   r'   r€   )re   r.   r.   r/   Ú__str__¢  s    z_Selector.__str__N)	ri   rj   rk   rl   rf   r†   r„   rˆ   Ú__repr__r.   r.   r.   r/   ru   k  s   
ru   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 )Rr+   zParse CSS selectors.Úpseudo_closeÚpseudo_contains)z	:containsz:-soup-containsz:-soup-contains-ownÚpseudo_nth_child)z
:nth-childz:nth-last-childÚpseudo_nth_type)z:nth-of-typez:nth-last-of-typeÚpseudo_lang)z:langÚ
pseudo_dir)z:dirÚpseudo_class_customÚpseudo_classÚpseudo_elementÚat_ruleÚidÚclassrw   Ú	attributeÚcombineNr   r"   z'dict[str, str | ct.SelectorList] | Noner#   r1   )rh   r&   r'   r(   c             C  s8   |  dd¡| _|| _| jtj@ | _|dkr.i n|| _dS )zInitialize.ú u   ï¿½N)rF   r$   r'   r   ÚDEBUGÚdebugr&   )re   rh   r&   r'   r.   r.   r/   rf   Î  s    zCSSParser.__init__ru   z
Match[str]r<   )r…   r?   Úhas_selectorr(   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éÿÿÿÿrA   Ú	attr_nameÚir   ÚtypeTr   )ú"ú'r   ú^z^%s.*ú$z.*?%s$Ú*z.*?%s.*ú~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*ú|z^%s(?:-.*)?$z^%s$ú!)rB   r   r5   r:   r_   ra   ÚDOTALLÚ
startswithr`   r]   ÚRE_WSÚsearchr$   r‚   ZSelectorAttributeru   rz   rV   rƒ   r„   r{   )re   r…   r?   r›   ZinverseÚopr   Únsr   Zis_typeZpattern2r   r'   r$   Zsel_attrZsub_selZnot_listr.   r.   r/   Ú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)rB   r:   r‚   ÚSelectorTagrw   )re   r…   r?   r›   Úprefixrw   r.   r.   r/   Ú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.
        r   Nz3Undefined custom selector '{}' found at position {}r   )r&   r'   )r'   T)r   r5   r:   rB   r&   rt   r   r8   Úendr$   Ú
isinstancer‚   rƒ   r+   r'   r,   Ú
FLG_PSEUDOr{   rV   )re   r…   r?   r›   rs   rh   r.   r.   r/   Úparse_pseudo_class_custom*  s     
z#CSSParser.parse_pseudo_class_customz Iterator[tuple[str, Match[str]]]ztuple[bool, bool])r…   r?   r›   Ú	iselectorÚis_htmlr(   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.Fr   ÚopenTr   z:rootz:definedz:scopez:empty)z:linkz	:any-linkz:checkedz:defaultz:indeterminatez	:disabledz:enabledz	:requiredz	:optionalz
:read-onlyz:read-writez	:in-rangez:out-of-rangez:placeholder-shownz:first-childr   z:last-childz:first-of-typez:last-of-typez:only-childz:only-of-typez$Invalid syntax for pseudo class '{}'z1'{}' pseudo-class is not implemented at this time)-r   r5   r:   rB   ÚPSEUDO_COMPLEXÚparse_pseudo_openr´   ÚPSEUDO_SIMPLEr'   r‚   ZSEL_ROOTZSEL_DEFINEDZ	SEL_SCOPEZ	SEL_EMPTYr{   rV   Ú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   r8   r$   ÚstartÚNotImplementedError)re   r…   r?   r›   r¸   r¹   Zcomplex_pseudors   r.   r.   r/   Úparse_pseudo_classF  s”    














$
"
"
"


zCSSParser.parse_pseudo_class)r…   r?   r›   r¸   r(   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Œ   Ú_childÚ_typer   r   Zevenr   r   TZoddr   Ús1rJ   rA   ÚaÚnÚ1Nrž   Ús2ÚbÚ0é
   Zofz
:nth-childFz:nth-last-childz:nth-of-typez:nth-last-of-type)Ú	groupdictrt   r   r5   r:   r   r	   r"   ÚRE_NTHr7   rB   Úendswithr«   r#   rÍ   r´   r¶   rÎ   ÚCSS_NTH_OF_S_DEFAULTr   rV   r‚   rË   rƒ   )re   r…   r?   r›   r¸   ZmdictZpostfixr=   rÖ   rÚ   ÚvarZ	nth_partsZ_s1r×   Z_s2Z
pseudo_selZnth_selr.   r.   r/   Úparse_pseudo_nth¥  sX    	
 



$





"
 zCSSParser.parse_pseudo_nth)r…   r   r›   r¸   r[   r(   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.z:notz:has)z:wherez:isT)r¶   rÎ   ÚFLG_NOTÚFLG_RELATIVEÚFLG_FORGIVEr{   rV   rÍ   )re   r…   r   r›   r¸   r[   r'   r.   r.   r/   r¼   æ  s    


zCSSParser.parse_pseudo_openzlist[_Selector]ztuple[bool, _Selector, str])r…   r?   r›   r{   r}   r[   r(   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 )zParse combinator tokens.Úrelationrž   ú:r   Nz'The multiple combinators at position {}F)rB   ÚstripÚWS_COMBINATORÚCOMMA_COMBINATORr}   r|   rV   ru   r   r8   r$   )re   r…   r?   r›   r{   r}   r[   Ú
combinatorr.   r.   r/   Úparse_has_combinatorý  s(    zCSSParser.parse_has_combinatorztuple[bool, _Selector])	r…   r?   r›   r{   r|   Ú	is_pseudoÚ
is_forgiver[   r(   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 )zParse combinator tokens.rç   zBThe combinator '{}' at position {}, must have a selector before itTNr¦   F)rB   ré   rê   rë   r   r8   r$   r€   rV   rw   r‚   r±   r|   r   r}   ru   )
re   r…   r?   r›   r{   r|   rî   rï   r[   rì   r.   r.   r/   Úparse_combinator(  s4    





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)rB   r«   ry   rV   r:   rx   )re   r…   r?   r›   rh   r.   r.   r/   Ú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 }xXt |¡D ]J}| d¡r^qN| d¡}	|	 	d¡r†t|	d	d
… dƒ}	nt|	ƒ}	| 
|	¡ qNW |j 
t ||¡¡ d}|S )zParse contains.r   z	:containsz\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.z:-soup-contains-ownÚvaluesÚsplitr   )r£   r¢   r   rž   T)r   r5   r:   rB   ÚwarningsÚwarnÚFutureWarningÚ	RE_VALUESÚfinditerr«   rV   r~   r‚   ZSelectorContains)
re   r…   r?   r›   rs   Zcontains_ownró   rn   Útokenr   r.   r.   r/   Úparse_pseudo_containsc  s&    


zCSSParser.parse_pseudo_containsc             C  s‚   |  d¡}g }xXt |¡D ]J}|  d¡r*q|  d¡}| d¡rRt|dd… dƒ}nt|ƒ}| |¡ qW |j t |¡¡ d}|S )zParse pseudo language.ró   rô   r   )r¢   r£   r   rž   T)	rB   rø   rù   r«   r:   rV   r   r‚   ZSelectorLang)re   r…   r?   r›   ró   rn   rú   r   r.   r.   r/   Ú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   r5   rB   r‚   ZSEL_DIR_LTRZSEL_DIR_RTLr'   )re   r…   r?   r›   r   r.   r.   r/   Úparse_pseudo_dir‘  s     zCSSParser.parse_pseudo_dirzct.SelectorList)r¸   r[   r'   r(   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 ƒ ¡ yFx>t|ƒ\}}|dkr~t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|  ||||¡}nd|dkr6|  |||¡}nH|dkrV|  |||¡}d}n(|dkrÂ|s’|sŒtd | d¡¡| j| d¡ƒ‚d|_|
r d}P n td | d¡¡| j| d¡ƒ‚n¼|dkr|rî|  |||||	|¡\}}}	n|  ||||||||¡\}}nr|dkr&|   |||¡}nX|dkrf|rVtd  | d¡¡| j| d¡ƒ‚|  !|||¡}n|d!kr~|  "|||¡}| #d¡}qPW W 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|rZ|r<|sZd|_|d$d$…= | |¡ d}|stt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–   rw   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 r.   )r„   )Ú.0Úsr.   r.   r/   ú
<listcomp>K  s    z-CSSParser.parse_selectors.<locals>.<listcomp>)2ru   rê   r<   rÎ   r¶   rå   rä   ÚFLG_HTMLÚFLG_DEFAULTÚFLG_INDETERMINATEÚFLG_IN_RANGEÚFLG_OUT_OF_RANGEÚFLG_PLACEHOLDER_SHOWNræ   rš   ÚprintrV   ÚnextrÒ   r8   rÑ   r·   rÓ   rû   rã   rü   rþ   r   r$   r€   rí   rð   r°   r³   rò   r´   ÚStopIterationrw   r‚   r±   r}   r|   r   ZSEL_DEFAULTr'   ZSEL_INDETERMINATEZSEL_IN_RANGEZSEL_OUT_OF_RANGEZSEL_PLACEHOLDER_SHOWNrƒ   )re   r¸   r[   r'   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ï   r;   r?   r.   r.   r/   rÍ   ™  s   	















zCSSParser.parse_selectors)r$   r(   c       	   	   c  sf  t  |¡}|r| d¡nd}t |¡}|r8| d¡d n
t|ƒd }| jrXtd |¡ƒ xø||krPd}xd| j	D ]Z}| 
||| j¡}|rp| ¡ }| jr´td || d¡| d¡¡ƒ | d¡}||fV  P qpW |dkrZ|| }|dkròd |¡}nN|dkrd	 |¡}n8|d
krd |¡}n"|dkr4d |¡}nd ||¡}t|| j|ƒ‚qZW | jrbt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Ñ   rU   rš   r  r8   Ú
css_tokensr7   r'   rg   rB   r   r$   )	re   r$   r?   r[   r´   Úvr   r\   Úmsgr.   r.   r/   Úselector_iterM  s>    






zCSSParser.selector_iter)r[   r'   r(   c             C  s   |   |  | j¡||¡S )zProcess selectors.)rÍ   r  r$   )re   r[   r'   r.   r.   r/   r,   v  s    zCSSParser.process_selectors)Nr   )r   r   )r   r   )&ri   rj   rk   rl   r^   ÚPAT_PSEUDO_CLOSErm   Ú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_COMBINEr  rf   r°   r³   r·   rÓ   rã   r¼   rí   rð   rò   rû   rü   rþ   rÍ   r  r,   r.   r.   r.   r/   r+   °  sN   


 	F	_A+0  1)r+   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)frl   Ú
__future__r   r_   Ú	functoolsr   rA   r   r   r*   r   r‚   r   rõ   Útypingr	   r
   r   r   rC   r½   rÏ   r»   rÌ   ZPSEUDO_SPECIALrÐ   ÚNEWLINEr8   ZWSZCOMMENTSZWSCZCSS_ESCAPESZCSS_STRING_ESCAPESÚ
IDENTIFIERZNTHZVALUEZATTRr   r!  r"  r#  r  rp   r  r  r  r  r  r  r  r  r$  r  r`   ra   rG   rH   rß   rb   rø   r¬   r  r  r6   rë   rê   r¶   rä   rå   r  r  r  rÎ   r  r  r  ræ   Ú	_MAXCACHEr0   r3   r)   r:   r]   r^   rm   ru   r+   r,   r¾   r¿   rÀ   rÁ   rÂ   rÃ   rÄ   rÅ   rÊ   rá   rÇ   rÆ   rÈ   rÉ   r.   r.   r.   r/   Ú<module>   sb  



 %E     U	