B
    é¹`«  ã               @   s¨  d 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	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-d.d/d0d1hZd2d3d4d5d6d7d8d9hZd#d(d:hZd;d<d=d>d?d@hZeeB eB eB eB ZdAZdB e¡ZdCZdDjeedEZdFjedGZdHjeedIZdJjedKZdLjedGZdMjeedNZdOjeedPZdQjedRZdSjedRZdTjedRZ dUjeeedVZ!dWjeedXZ"dYjeedXZ#dZjedRZ$d[jedGZ%d\ e"¡Z&d]jedRZ'd^je#eeeed_Z(d`je#eedaZ)dbje#eedcZ*ddje#edeZ+dfjeedgZ,dbje#eedcZ-e .dhjedGej/¡Z0e .dijeedIej/¡Z1e .djjedGej/¡Z2e .dkjeedPej3¡Z4e .e¡Z5e .dl e¡¡Z6e .dm e¡¡Z7e .dn e$¡ej3¡Z8doZ9dpZ:dZ;dqZ<drZ=dsZ>dtZ?duZ@dvZAdwZBdxZCdyZDdzZEeeEd{d|d}„ ƒZFd~d„ ZGd€d„ ZHddƒd„„ZId…d†„ ZJG d‡dˆ„ dˆeKƒZLG d‰dŠ„ dŠeLƒZMG d‹dŒ„ dŒeKƒZNG ddŽ„ dŽeKƒZOeOdƒjPe;e?B dZQeOd‘ƒjPe;e?B dZReOd’ƒjPe;e?B e>B dZSeOd“ƒjPe;e?B e@B dZTeOd”ƒjPe;e?B dZUeOd•ƒjPe;e?B dZVeOd–ƒjPe;e?B dZWeOd—ƒjPe;e?B dZXeOd˜ƒjPe;e?B eDB dZYeOd™ƒjPe;dZZeOdšƒjPe;e?B dZ[eOd›ƒjPe;e?B dZ\eOdœƒjPe;eBB e?B dZ]eOdœƒjPe;eCB e?B dZ^dS )žzCSS selector parser.é    N)Ú	lru_cacheé   )Úutil)Ú	css_match)Ú	css_types)ÚSelectorSyntaxErroriýÿ  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ô  )Úmaxsizec             C   s(   t |ƒ}t | t| ||d ¡ |||¡S )zCached CSS compile.)ÚcustomÚflags)Úprocess_customÚcmZ	SoupSieveÚ	CSSParserÚprocess_selectors)ÚpatternÚ
namespacesr   r   Úcustom_selectors© r&   ú\/home/kop/projects/devel/pgwui/test_venv/lib/python3.7/site-packages/soupsieve/css_parser.pyÚ_cached_css_compileÌ   s    r(   c               C   s   t  ¡  dS )zPurge the cache.N)r(   Úcache_clearr&   r&   r&   r'   Ú_purge_cacheÚ   s    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   Fc             C   s   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.
    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   ï¿½Ú )ÚgroupÚintÚUNICODE_REPLACEMENT_CHARÚchr)ÚmÚ	codepointr   r&   r&   r'   Úreplaceö   s    



zcss_unescape.<locals>.replace)Ú
RE_CSS_ESCÚRE_CSS_STR_ESCÚsub)ÚcontentÚstringr;   r&   r&   r'   r1   ï   s    r1   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   r4   )ÚlenÚappendr/   Ú	enumerateÚordÚjoin)r   r@   ÚlengthZ
start_dashÚindexÚcr:   r&   r&   r'   Úescape
  s$    ,.PrT   c               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚSelectorPatternzSelector pattern.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__)  s    zSelectorPattern.__init__c             C   s   | j S )z	Get name.)r   )r\   r&   r&   r'   Úget_name/  s    zSelectorPattern.get_namec             C   s   | j  ||¡S )zMatch the selector.)r[   r.   )r\   ÚselectorrR   r   r&   r&   r'   r.   4  s    zSelectorPattern.matchN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r]   r^   r.   r&   r&   r&   r'   rU   &  s   rU   c               @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚSpecialPseudoPatternzSelector pattern.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   r3   r   r   N)	ÚpatternsÚmatched_namerV   rW   ÚPAT_PSEUDO_CLASS_SPECIALrX   rY   rZ   Úre_pseudo_name)r\   re   Úpr   r#   Úpseudor&   r&   r'   r]   =  s    
zSpecialPseudoPattern.__init__c             C   s
   | j  ¡ S )z	Get name.)rf   r^   )r\   r&   r&   r'   r^   J  s    zSpecialPseudoPattern.get_namec             C   sV   d}| j  ||¡}|rRt t| d¡ƒ¡}| j |¡}|rR| |||¡}|rR|| _|S )zMatch the selector.Nr   )	rh   r.   r   r,   r1   r5   re   Úgetrf   )r\   r_   rR   r   rj   r9   r   r#   r&   r&   r'   r.   O  s    zSpecialPseudoPattern.matchN)r`   ra   rb   rc   r]   r^   r.   r&   r&   r&   r'   rd   :  s   rd   c               @   s4   e Zd ZdZdd„ Zdd„ Zdd„ Z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.
    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)rk   rm   rn   ro   rp   r   rq   rr   rs   rt   ru   r   rv   )r\   Úkwargsr&   r&   r'   r]   h  s    z_Selector.__init__c             C   s<   |r0|d }|j  |dd… ¡ t | ¡ g¡S t ¡ S dS )zFreeze relation.r   r   N)rr   ÚextendÚctÚSelectorListÚfreeze)r\   rr   Úselr&   r&   r'   Ú_freeze_relationsx  s
    z_Selector._freeze_relationsc             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)rv   ry   ZSelectorNullZSelectorrm   Útuplern   ro   rp   r   rq   r}   rr   rs   rt   ru   r   )r\   r&   r&   r'   r{   ‚  s    
z_Selector.freezec             C   s8   d  | j| j| j| j| j| j| j| j| j	| j
| j| j¡S )zString representation.zª_Selector(tag={!r}, ids={!r}, classes={!r}, attributes={!r}, nth={!r}, selectors={!r}, relations={!r}, rel_type={!r}, contains={!r}, lang={!r}, flags={!r}, no_match={!r}))r/   rm   rn   ro   rp   r   rq   rr   rs   rt   ru   r   rv   )r\   r&   r&   r'   Ú__str__–  s    z_Selector.__str__N)	r`   ra   rb   rc   r]   r}   r{   r   Ú__repr__r&   r&   r&   r'   rl   _  s   
rl   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d8dd„Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Z d.d/„ Z!d0d1„ Z"d9d2d3„Z#d4d5„ Z$d:d6d7„Z%dS );r!   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Úclassrm   Ú	attributeÚcombineNr   c             C   s8   |  dd¡| _|| _| jtj@ | _|dkr.i n|| _dS )zInitialize.ú u   ï¿½N)r;   r#   r   r   ÚDEBUGÚdebugr   )r\   r_   r   r   r&   r&   r'   r]   Â  s    zCSSParser.__init__c             C   sR  d}|  d¡}|  d¡r(t |  d¡¡nd}|  d¡rLt|  d¡dd… ƒnd}t|  d¡ƒ}d}	d}
|r~|d	krxtjnd
}nt |¡dkr˜tj}d}	nd
}|rÚ|  d¡ d¡rÊt|  d¡dd… dƒ}qÞt|  d¡ƒ}nd}|sèd}nô| d¡rt dt |¡ |¡}nÐ| d¡r0t dt |¡ |¡}n¬| d¡rTt dt |¡ |¡}nˆ| d¡r’|rrt	 
|¡rvdnt |¡}t d| |¡}nJ| 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 |¡ n|j |¡ d}|S )z8Create attribute selector from the returned regex match.FÚcmpÚcaseNZattr_nséÿÿÿÿr4   Ú	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$ú!)r5   r   r,   r1   rV   rX   Ú
startswithrW   rT   ÚRE_WSÚsearchr#   ry   ZSelectorAttributerl   rp   rM   rz   r{   rq   )r\   r|   r9   Úhas_selectorZ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)r5   r1   ry   ÚSelectorTagrm   )r\   r|   r9   r£   Úprefixrm   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„d| 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   Nz2Undefined custom selector '{}' found at postion {}r   )r   r   )r   T)r   r,   r1   r5   r   rk   r   r/   Úendr#   Ú
isinstancery   rz   r!   r   r"   Ú
FLG_PSEUDOrq   rM   )r\   r|   r9   r£   rj   r_   r&   r&   r'   Úparse_pseudo_class_custom  s     

z#CSSParser.parse_pseudo_class_customc             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   r,   r1   r5   ÚPSEUDO_COMPLEXÚparse_pseudo_openrª   ÚPSEUDO_SIMPLEr   ry   ZSEL_ROOTZSEL_DEFINEDZ	SEL_SCOPEZ	SEL_EMPTYrq   rM   Ú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   ÚSelectorNthrz   rx   ÚPSEUDO_COMPLEX_NO_MATCHÚparse_selectorsr¬   ÚFLG_OPENrv   ÚPSEUDO_SIMPLE_NO_MATCHÚPSEUDO_SUPPORTEDr   r/   r#   ÚstartÚNotImplementedError)r\   r|   r9   r£   Ú	iselectorÚis_htmlZcomplex_pseudorj   r&   r&   r'   Úparse_pseudo_class5  s”    













$
"
"
"


zCSSParser.parse_pseudo_classc             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 |¡}| 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¡rn|  || d¡ttB ¡}nt}|dkrš|j t ||
|	dd|¡¡ n&|dkr|j t ||
|	dd	|¡¡ nV|dkrî|j t ||
|	d	dt ¡ ¡¡ n*|dkr|j t ||
|	d	d	t ¡ ¡¡ d	}|S )zParse `nth` pseudo.rƒ   Z_childÚ_typer   r   Zevenr   r   TZoddr   Ús1rA   r4   ÚaÚnÚ1Nr”   Ús2ÚbÚ0é
   Zofz
:nth-childFz:nth-last-childz:nth-of-typez:nth-last-of-type)Ú	groupdictrk   r   r,   r1   ÚRE_NTHr.   r5   Úendswithr    r6   rÁ   rª   r¬   rÂ   ÚCSS_NTH_OF_S_DEFAULTr   rM   ry   r¿   rz   )r\   r|   r9   r£   rÇ   ZmdictZpostfixr?   rË   rÏ   ÚvarZ	nth_partsrÌ   Z
pseudo_selZnth_selr&   r&   r'   Úparse_pseudo_nth  sX    

 



 





"
 zCSSParser.parse_pseudo_nthc             C   sF   t tB }|dkr|tO }|dkr(|tO }|j |  |||¡¡ d}|S )z"Parse pseudo with opening bracket.z:notz:hasT)r¬   rÂ   ÚFLG_NOTÚFLG_RELATIVErq   rM   rÁ   )r\   r|   r   r£   rÇ   rR   r   r&   r&   r'   r°   È  s    zCSSParser.parse_pseudo_openc             C   sÀ   |  d¡ ¡ }|st}|tkrd|s8td ||¡| j|ƒ‚||_|d j 	|¡ dt }| 	t
ƒ ¡ nH|r€||_|d j 	|¡ n$|dd… tkr¤td |¡| j|ƒ‚d| }t
ƒ }d}|||fS )	zParse combinator tokens.ÚrelationzAThe combinator '{}' at postion {}, must have a selector before itr”   ú:r   Nz'The multiple combinators at position {}F)r5   ÚstripÚWS_COMBINATORÚCOMMA_COMBINATORr   r/   r#   rs   rr   rM   rl   )r\   r|   r9   r£   rq   rs   rR   Ú
combinatorr&   r&   r'   Úparse_has_combinatorÕ  s2    
zCSSParser.parse_has_combinatorc       	      C   sª   |  d¡ ¡ }|st}|s0td ||¡| j|ƒ‚|tkrr|jsP|sPt 	dd¡|_|j
 |¡ | |¡ |dd…= n&|j
 |¡ ||_|dd…= | |¡ tƒ }d}||fS )zParse combinator tokens.rÛ   zAThe combinator '{}' at postion {}, must have a selector before itrœ   NF)r5   rÝ   rÞ   r   r/   r#   rß   rm   ry   r§   rr   rx   rM   rs   rl   )	r\   r|   r9   r£   rq   rr   Ú	is_pseudorR   rà   r&   r&   r'   Úparse_combinatorÿ  s*    




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)r5   r    ro   rM   r1   rn   )r\   r|   r9   r£   r_   r&   r&   r'   Ú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 }xXt |¡D ]J}| d¡r^qN| d¡}	|	 	d¡r†t|	d	d
… dƒ}	nt|	ƒ}	| 
|	¡ qNW |j 
t 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   r,   r1   r5   ÚwarningsÚwarnÚFutureWarningÚ	RE_VALUESÚfinditerr    rM   rt   ry   ZSelectorContainsr~   )
r\   r|   r9   r£   rj   Zcontains_ownræ   re   Útokenr   r&   r&   r'   Úparse_pseudo_contains(  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)	r5   rë   rì   r    r1   rM   ru   ry   ZSelectorLang)r\   r|   r9   r£   ræ   re   rí   r   r&   r&   r'   Úparse_pseudo_langA  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,   r5   ry   ZSEL_DIR_LTRZSEL_DIR_RTLr   )r\   r|   r9   r£   r   r&   r&   r'   Úparse_pseudo_dirV  s     zCSSParser.parse_pseudo_dirc          	   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@ ƒ}| 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ƒ |rtdƒ |r,| t ƒ ¡ y8x0t|ƒ\}}|dkrbtd | d¡¡ƒ‚nò|dkr~|  |||¡}nÖ|dkr¢|  |||||¡\}}n²|dkrÄtd | d¡¡ƒ‚n|dkrà|  |||¡}nt|dkrþ|  ||||¡}nV|dkr|  |||¡}n:|dkr:|  |||¡}d}n|dkrš|sjtd | d¡¡| j| d¡ƒ‚|
rxd}P n td | d¡¡| j| d¡ƒ‚nº|dkrâ|rÆ|  |||||	|¡\}}}	n|  |||||||¡\}}nr|dkrü|  |||¡}nX|dkr<|r,td | d¡¡| j| d¡ƒ‚|  |||¡}n|d krT|   |||¡}| !d¡}q4W 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#…= | |¡ ntd% |¡| j|ƒ‚|r&t$j)|d$ _*|r8t$j+|d$ _*|rJt$j,|d$ _*|r\t$j-|d$ _*|rnt$j.|d$ _*t$ /d&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: 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 postion {}z*Unmatched pseudo-class close at postion {}rŽ   r   rm   z5Tag name found at position {} instead of at the start)rŒ   r‹   z$Unclosed pseudo-class at position {}rœ   Nr”   z"Expected a selector at position {}c             S   s   g | ]}|  ¡ ‘qS r&   )r{   )Ú.0Úsr&   r&   r'   ú
<listcomp>ô  s    z-CSSParser.parse_selectors.<locals>.<listcomp>)0rl   rÞ   ÚboolrÂ   r¬   rÚ   rÙ   ÚFLG_HTMLÚFLG_DEFAULTÚFLG_INDETERMINATEÚFLG_IN_RANGEÚFLG_OUT_OF_RANGEÚFLG_PLACEHOLDER_SHOWNr‘   ÚprintrM   ÚnextrÆ   r/   rÅ   r­   rÉ   rî   rØ   rï   rñ   r   r#   rá   rã   r¦   r©   rå   rª   ÚStopIterationrm   ry   r§   rs   rr   rx   ZSEL_DEFAULTr   ZSEL_INDETERMINATEZSEL_IN_RANGEZSEL_OUT_OF_RANGEZSEL_PLACEHOLDER_SHOWNrz   )r\   rÇ   rR   r   r|   rq   r£   Úclosedrr   rs   Zis_openrâ   Zis_relativeÚis_notrÈ   Z
is_defaultZis_indeterminateZis_in_rangeZis_out_of_rangeZis_placeholder_shownr2   r9   r&   r&   r'   rÁ   ^  sò    













zCSSParser.parse_selectorsc       	   	   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Å   rL   r‘   rü   r/   Ú
css_tokensr.   r   r^   r5   r   r#   )	r\   r#   r9   rR   rª   Úvr   rS   Úmsgr&   r&   r'   Úselector_iterö  s>    






zCSSParser.selector_iterc             C   s   |   |  | j¡||¡S )zProcess selectors.)rÁ   r  r#   )r\   rR   r   r&   r&   r'   r"     s    zCSSParser.process_selectors)Nr   )r   r   )r   r   )&r`   ra   rb   rc   rU   ÚPAT_PSEUDO_CLOSErd   Ú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  r]   r¦   r©   r­   rÉ   rØ   r°   rá   rã   rå   rî   rï   rñ   rÁ   r  r"   r&   r&   r&   r'   r!   ¤  sJ   



F	X;*
 )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)_rc   rV   Ú	functoolsr   r4   r   r   r    r   ry   r   rè   r7   r±   rÃ   r¯   rÀ   ZPSEUDO_SPECIALrÄ   ÚNEWLINEr/   ZWSZCOMMENTSZWSCZCSS_ESCAPESZCSS_STRING_ESCAPESÚ
IDENTIFIERZNTHZVALUEZATTRr  r  r  r  r  rg   r  r	  r  r  r  r  r  r  r  r
  rW   rX   r<   r=   rÔ   rY   rë   r¡   r  r  r-   rß   rÞ   r¬   rÙ   rÚ   r÷   rö   rø   rÂ   rù   rú   rû   Ú	_MAXCACHEr(   r*   r   r1   rT   ÚobjectrU   rd   rl   r!   r"   r²   r³   r´   rµ   r¶   r·   r¸   r¹   r¾   rÖ   r»   rº   r¼   r½   r&   r&   r&   r'   Ú<module>   s\  




%E     
	