a
    Cøgíµ  ã                   @  sd  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*d7Z+e› d8Z,d9e(› Z-d:e › Z.d;e)› d<e!› d=e› d>e› d?e› e› d@e› d?e› e› dAZ/dBe)› dCe!› dDe› dEZ0e)› dFe"› de› dGe› d?e"› dHe› d8Z1e)› dIe› d8Z2e› dJe› dKe› d?Z3e)› dFe"› de› dGe› d?e"› dHe› d8Z4e 5dLe› dMej6¡Z7e 5dLe› dNe› dej6¡Z8e 5dOe› dPe› dQej6¡Z9e 5dRe"› dSe› dGe› dTej:¡Z;e 5e¡Z<e 5dUe› d?¡Z=e 5e› dV¡Z>e 5dUe*› dWej:¡Z?dXZ@dYZAdZBdZZCd[ZDd\ZEd]ZFd^ZGd_ZHd`ZIdaZJdbZKdcZLddZMeeMdedfdgdhdidjdkœdldm„ƒZNdndoœdpdq„ZOdhdrdsœdtdu„ZPd”dfdwdfdxœdydz„ZQdfdfd{œd|d}„ZRG d~d„ dƒZSG d€d„ deSƒZTG d‚dƒ„ dƒƒZUG d„d…„ 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ýÿ  >   ú:read-writeú:only-childú	:requiredú:checkedú:only-of-typeú:indeterminateú:last-childú:first-childú	:disabledú	:any-linkú:placeholder-shownú:enabledú:rootú	:in-rangeú:first-of-typeú:emptyú:last-of-typeú:scopeú:definedú	:optionalú:out-of-rangeú
:read-onlyú:linkú:default>   z:focus-visiblez:focus-withinz:target-withinz:visitedú:currentú:hostz:activez:local-linkz:focusz:targetz:pausedz:futurez:hoverz:playingz:user-invalidz:past>   ú	:containsú:notú:whereú:-soup-containsú:hasú:isú:-soup-contains-ownz:matches>   z:host-contextr%   r&   >   ú:nth-last-childú:dirú:langú
:nth-childú:nth-last-of-typeú:nth-of-typez(?:\r\n|(?!\r\n)[\n\f\r])z	(?:[ \t]|ú)z"(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)z(?:ú|z(?:\\(?:[a-f0-9]{1,6}z?|[^\r\n\f]|$))z?|[^\r\n\f]|$|z))z8
(?:(?:-?(?:[^\x00-\x2f\x30-\x40\x5B-\x5E\x60\x7B-\x9f]|z>)+|--)
(?:[^\x00-\x2c\x2e\x2f\x3A-\x40\x5B-\x5E\x60\x7B-\x9f]|z)*)
z (?:[-+])?(?:[0-9]+n?|n)(?:(?<=n)z	*(?:[-+])z*(?:[0-9]+))?z(?:"(?:\\(?:.|z)|[^\\"\r\n\f]+)*?"|'(?:\\(?:.|z)|[^\\'\r\n\f]+)*?'|z+)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Ú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.©rJ   rK   )Úprocess_customÚcmZ	SoupSieveÚ	CSSParserÚprocess_selectors)rH   rI   rJ   rK   Úcustom_selectors© rS   úS/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/site-packages/soupsieve/css_parser.pyÚ_cached_css_compileÂ   s    	ý÷rU   ÚNone©rL   c                   C  s   t  ¡  dS )zPurge the cache.N)rU   Úcache_clearrS   rS   rS   rT   Ú_purge_cacheÙ   s    rY   z dict[str, str | ct.SelectorList])rJ   rL   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)rJ   rR   ÚkeyÚvalueÚnamerS   rS   rT   rN   ß   s    
rN   FÚbool)ÚcontentÚstringrL   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]rF   )ÚmrL   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=   é   õ   ï¿½Ú )ÚgrouprG   ÚUNICODE_REPLACEMENT_CHARÚchr)rg   Ú	codepointra   rS   rS   rT   Úreplaceõ   s    



zcss_unescape.<locals>.replace)Ú
RE_CSS_ESCÚRE_CSS_STR_ESCÚsub)rd   re   ro   rS   rS   rT   r_   î   s    r_   )ÚidentrL   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   ú\ri   é   é   Úxr<   é0   é9   )é-   é_   rC   éA   éZ   éa   éz   rj   )ÚlenÚappendÚ	enumerateÚordÚjoin)rs   re   ÚlengthZ
start_dashÚindexÚcrn   rS   rS   rT   Ú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.rF   rV   )rb   rH   rL   c                 C  s&   || _ t |tjtjB tjB ¡| _dS )úInitialize.N)rb   ÚreÚcompileÚIÚXÚUÚ
re_pattern)Úselfrb   rH   rS   rS   rT   Ú__init__(  s    zSelectorPattern.__init__rW   c                 C  s   | j S )ú	Get name.)rb   ©r“   rS   rS   rT   Úget_name.  s    zSelectorPattern.get_namerG   úMatch[str] | None©Úselectorr‡   rK   rL   c                 C  s   | j  ||¡S )úMatch the selector.)r’   r]   )r“   rš   r‡   rK   rS   rS   rT   r]   3  s    zSelectorPattern.matchN©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r”   r—   r]   rS   rS   rS   rT   rŠ   %  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]], ...]rV   )ÚpatternsrL   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   rh   r=   r   N)	r¢   Úmatched_namer   rŽ   ÚPAT_PSEUDO_CLASS_SPECIALr   r   r‘   Úre_pseudo_name)r“   r¢   Úprb   rH   ÚpseudorS   rS   rT   r”   <  s    zSpecialPseudoPattern.__init__rF   rW   c                 C  s   | j du rdS | j  ¡ S )r•   Nrj   )r£   r—   r–   rS   rS   rT   r—   I  s    zSpecialPseudoPattern.get_namerG   r˜   r™   c                 C  sV   d}| j  ||¡}|rRt t| d¡ƒ¡}| j |¡}|rR| |||¡}|rR|| _|S )r›   Nrb   )	r¥   r]   r   r[   r_   rk   r¢   Úgetr£   )r“   rš   r‡   rK   r§   rg   rb   rH   rS   rS   rT   r]   N  s    zSpecialPseudoPattern.matchNrœ   rS   rS   rS   rT   r¡   9  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
   rV   )ÚkwargsrL   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ª   rS   rS   rT   r”   g  s    z_Selector.__init__úlist[_Selector]úct.SelectorList)r±   rL   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±   ÚselrS   rS   rT   Ú_freeze_relationsw  s
    z_Selector._freeze_relationszct.Selector | ct.SelectorNullrW   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´   rK   r–   rS   rS   rT   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–   rS   rS   rT   Ú__str__•  s$    "ÿÿÿþþþþýÿz_Selector.__str__N)	r   rž   rŸ   r    r”   r½   r»   r¿   Ú__repr__rS   rS   rS   rT   r©   ^  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dPd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/œd0d1„Zd dd"d*dd"d2œd3d4„Zd d!d"d5ddd6d7œd8d9„Zd d!d"d5d5d"d"dd:d;œ	d<d=„Zd d!d"d"d#œd>d?„Z d d!d"d"d#œd@dA„Z!d d!d"d"d#œdBdC„Z"d d!d"d"d#œdDdE„Z#dQd*dddFdGœdHdI„Z$dd*dJœdKdL„Z%dRdddFdMœdNdO„Z&dS )SrP   zParse CSS selectors.Úpseudo_closeÚpseudo_contains)r'   r*   r-   Úpseudo_nth_child)r1   r.   Úpseudo_nth_type)r3   r2   Úpseudo_lang)r0   Ú
pseudo_dir)r/   Úpseudo_class_customÚpseudo_classÚpseudo_elementÚampÚat_ruleÚidÚclassr«   Ú	attributeÚcombineNr   rF   z'dict[str, str | ct.SelectorList] | NonerG   rV   )rš   rJ   rK   rL   c                 C  s8   |  dd¡| _|| _| jtj@ | _|du r.i n|| _dS )rŒ   ú ri   N)ro   rH   rK   r   ÚDEBUGÚdebugrJ   )r“   rš   rJ   rK   rS   rS   rT   r”   Á  s    zCSSParser.__init__r©   rf   rc   )r¼   rg   Úhas_selectorrL   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éÿÿÿÿrj   Ú	attr_nameÚir   ÚtypeTra   ©ú"ú'r   r9   z^%s.*r:   z.*?%s$r8   z.*?%s.*ú~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*r5   z^%s(?:-.*)?$z^%s$ú!)rk   r   r[   r_   r   r   ÚDOTALLÚ
startswithrŽ   r‰   ÚRE_WSÚsearchrH   r¹   ZSelectorAttributer©   r®   r‚   rº   r»   r°   )r“   r¼   rg   rÓ   ZinverseÚoprÕ   ÚnsÚattrZis_typeZpattern2ra   rK   rH   Zsel_attrZsub_selZnot_listrS   rS   rT   Ú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)rk   r_   r¹   ÚSelectorTagr«   )r“   r¼   rg   rÓ   Úprefixr«   rS   rS   rT   Ú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 |¡ 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.
        rb   NzUndefined custom selector 'z' found at position r   rM   ©rK   T)r   r[   r_   rk   rJ   r¨   r   ÚendrH   Ú
isinstancer¹   rº   rP   rK   rQ   Ú
FLG_PSEUDOr°   r‚   )r“   r¼   rg   rÓ   r§   rš   rS   rS   rT   Úparse_pseudo_class_custom  s&    ý
ÿþ
z#CSSParser.parse_pseudo_class_customz Iterator[tuple[str, Match[str]]]ztuple[bool, bool])r¼   rg   rÓ   Ú	iselectorÚis_htmlrL   c                 C  sü  d}t  t| d¡ƒ¡}| d¡r&d}|rN|tv rN|  ||||| d¡¡}n¦|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  _n¤|d	krÒ| jt	jO  _nˆ|d
v 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!v r”|  "|| d¡t#t$B ¡ d|_%d}n`|s°|t&v r°d|_%d}nD|t'v rØt(d|› d| j)| *d¡ƒ‚nt(d|› d | j)| *d¡ƒ‚||fS )!zParse pseudo class.Frb   Ú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¢' 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[   r_   rk   ÚPSEUDO_COMPLEXÚparse_pseudo_openrë   ÚPSEUDO_SIMPLErK   r¹   ZSEL_ROOTZSEL_DEFINEDÚ	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   rH   Ústart)r“   r¼   rg   rÓ   rï   rð   Zcomplex_pseudor§   rS   rS   rT   Úparse_pseudo_class9  s¤    














$
"
"
"
þÿ
þÿ

ý
üzCSSParser.parse_pseudo_class)r¼   rg   rÓ   rï   rL   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Ã   Z_childÚ_typerb   r¯   Zevenr=   r   TZoddr   Ús1rt   rj   ÚaÚnÚ1NrÖ   Ús2ÚbÚ0é
   Zofr1   Fr.   r3   r2   )Ú	groupdictr¨   r   r[   r_   r   r	   rF   ÚRE_NTHr]   rk   Úendswithrà   rG   r  rë   rí   r  ÚCSS_NTH_OF_S_DEFAULTr¯   r‚   r¹   r  rº   )r“   r¼   rg   rÓ   rï   ZmdictZpostfixrd   r  r  ÚvarZ	nth_partsZ_s1r  Z_s2Z
pseudo_selZnth_selrS   rS   rT   Úparse_pseudo_nth›  sX    	
 



$





"
 zCSSParser.parse_pseudo_nth)r¼   rb   rÓ   rï   r‡   rL   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¼   rb   rÓ   rï   r‡   rK   rS   rS   rT   ró   Ü  s    


zCSSParser.parse_pseudo_openr¶   ztuple[bool, _Selector, str])r¼   rg   rÓ   r°   r²   r‡   rL   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Ö   r7   r   Nz%The multiple combinators at position F)
rk   ÚstripÚWS_COMBINATORÚCOMMA_COMBINATORr²   r±   r‚   r©   r   rH   )r“   r¼   rg   rÓ   r°   r²   r‡   Ú
combinatorrS   rS   rT   Úparse_has_combinatoró  s*    ýzCSSParser.parse_has_combinatorztuple[bool, _Selector])	r¼   rg   rÓ   r°   r±   Ú	is_pseudoÚ
is_forgiver‡   rL   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)rk   r  r   r!  r   rH   rµ   r‚   r«   r¹   rç   r±   r¸   r²   r©   )
r“   r¼   rg   rÓ   r°   r±   r$  r%  r‡   r"  rS   rS   rT   Úparse_combinator  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)rk   rà   r­   r‚   r_   r¬   )r“   r¼   rg   rÓ   rš   rS   rS   rT   Úparse_class_idN  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.rb   r'   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.r-   ÚvaluesÚsplitra   )rÜ   rÛ   r   rÖ   T)r   r[   r_   rk   ÚwarningsÚwarnÚFutureWarningÚ	RE_VALUESÚfinditerrà   r‚   r³   r¹   ZSelectorContains)
r“   r¼   rg   rÓ   r§   Zcontains_ownr)  r¢   Útokenra   rS   rS   rT   Úparse_pseudo_containsY  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.r)  r*  ra   rÚ   r   rÖ   T)	rk   r.  r/  rà   r_   r‚   r´   r¹   ZSelectorLang)r“   r¼   rg   rÓ   r)  r¢   r0  ra   rS   rS   rT   Úparse_pseudo_langr  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[   rk   r¹   ZSEL_DIR_LTRZSEL_DIR_RTLrK   )r“   r¼   rg   rÓ   ra   rS   rS   rT   Úparse_pseudo_dir‡  s     zCSSParser.parse_pseudo_dirr·   )rï   r‡   rK   rL   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 ƒ ¡ zft|ƒ\}}|dkrzt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r|  |||¡}n†|dv r8|  ||||¡}nh|dkrT|  |||¡}nL|dkrt|  |||¡}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r,|r|   |||||	|¡\}}}	n|  !||||||||¡\}}nt|dkrF|  "|||¡}nZ|d krˆ|rxtd!| d¡› d"| j| d¡ƒ‚|  #|||¡}n|d#v r |  $|||¡}| %d¡}qLW n t&yÄ   Y n0 |
ræ|sætd$|› | j|ƒ‚|rH|j's|st (d%d&¡|_'|r&|	|_)|d' j* |¡ n |j* +|¡ |d&d&…= | |¡ n0|rx|rZ|sxd|_|d&d&…= | |¡ d}|s’t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.Fr7   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Ê   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 rS   )r»   )Ú.0ÚsrS   rS   rT   Ú
<listcomp>D  ó    z-CSSParser.parse_selectors.<locals>.<listcomp>)2r©   r   rc   r  rí   r  r  ÚFLG_HTMLÚFLG_DEFAULTÚFLG_INDETERMINATEÚFLG_IN_RANGEÚFLG_OUT_OF_RANGEÚFLG_PLACEHOLDER_SHOWNr  rÒ   Úprintr‚   ÚnextÚNotImplementedErrorr	  rK   r¹   rõ   rî   r
  r1  r  r2  r4  r   rH   rµ   r#  r&  ræ   ré   r(  rë   ÚStopIterationr«   rç   r²   r±   r¸   ZSEL_DEFAULTZ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ð   Z
is_defaultZis_indeterminateZis_in_rangeZis_out_of_rangeZis_placeholder_shownr%  r`   rg   rS   rS   rT   r    s   	









ýý
ÿÿ


ý
ý


ý	zCSSParser.parse_selectors)rH   rL   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 r'  z%Malformed class selector at position ú#z"Malformed id selector at position r7   z,Malformed pseudo-class selector at position zInvalid character z
 position z## END PARSING)ÚRE_WS_BEGINrâ   rë   Ú	RE_WS_ENDr	  r   rÒ   r?  Ú
css_tokensr]   rK   r—   rk   r   rH   )	r“   rH   rg   r‡   rë   Úvrb   rˆ   ÚmsgrS   rS   rT   Úselector_iterF  s>    



&




zCSSParser.selector_iter)r‡   rK   rL   c                 C  s   |   |  | j¡||¡S )zProcess selectors.)r  rL  rH   )r“   r‡   rK   rS   rS   rT   rQ   o  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_COMBINErI  r”   ræ   ré   rî   r
  r  ró   r#  r&  r(  r1  r2  r4  r  rL  rQ   rS   rS   rS   rT   rP   ¢  s\   ü



öÿç  üF	bA+0  ü 8)rP   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)fr    Ú
__future__r   r   Ú	functoolsr   rj   r   r   rO   r   r¹   r   r+  Útypingr	   r
   r   r   rl   rô   r  rò   r  ZPSEUDO_SPECIALr  ÚNEWLINEZWSZCOMMENTSZWSCZCSS_ESCAPESZCSS_STRING_ESCAPESÚ
IDENTIFIERZNTHZVALUEZATTRrX  rY  rZ  r[  rT  r¤   rS  rV  rM  rU  rW  rO  rP  rQ  rR  r\  rN  rŽ   r   rp   rq   r  r   r.  rá   rG  rH  r\   r!  r   rí   r  r  r:  r9  r;  r  r<  r=  r>  r  Ú	_MAXCACHErU   rY   rN   r_   r‰   rŠ   r¡   r©   rP   rQ   rö   r÷   rø   rù   rú   rû   rü   rý   r  r  rÿ   rþ   r   r  rS   rS   rS   rT   Ú<module>   sd  	ÿÿ$




ÿþþþþþþþþÿþþ(("
%D     \ÿþÿüÿ

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