o
    ïT·jB¿  ã                   @  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mZ ddlmZ ddlmZ ddlZe ¡ Ze ¡ ZdZdZh d£Zh d£Z h d£Z!h d£Z"h d£Z#ee B e!B e"B e#B Z$dZ%de%› d�Z&dZ'de&› de'› d�Z(de&› d�Z)de&› de%› d�Z*de)› de)› d �Z+d!e(› d"e(› d#�Z,d$e%› d%e%› d&e+› d'�Z-de(› d(e(› d)e-› d*e(› d+e(› d,�Z.d-e+› �Z/d.e+› �Z0d/e+› d0e+› d1�Z1d2e(› d3e+› d4e+› de.› e(› d5�
Z2d6e+› d7e(› d8�Z3d6e+› d7e(› d9�Z4d:e+› d�Z5d;Z6e(› d<�Z7d=e3› �Z8d>e+› �Z9d?e4› d@e,› dAe(› dBe'› d,e&› e(› dCe'› d,e&› e(› dD�Z:dEe4› dFe,› dGe(› dH�Z;e4› dIe-› de(› dJe(› d,e-› dKe(› d<�Z<e4› dLe(› d<�Z=e'› dMe&› dNe(› dOe(› d,�Z>e4› dIe-› de(› dJe(› d,e-› dKe(› d<�Z?e @dPe(› dQ�ejA¡ZBe @dPe&› dRe%› dS�ejA¡ZCe @dTe(› dUe(› dV�ejA¡ZDe @dWe-› dXe(› dJe(› dY�ejE¡ZFe @e&¡ZGe @dZe(› d,�¡ZHe @d[e'› d\�¡ZIe @dZe5› d]�ejE¡ZJe @e4ejAejEB ejKB ¡ZLe @e3ejEejAB ejKB ¡ZMd^ZNd_ZOd`ZPdZQdaZRdbZSdcZTddZUdeZVdfZWdgZXdhZYdiZZdjZ[dkZ\ee\dl�		d¢d£dydz„ƒZ]d¤d|d}„Z^d¥dd€„Z_d¦d‚dƒ„Z`d§d…d†„ZaG d‡dˆ„ dˆƒZbG d‰dŠ„ dŠebƒZcG d‹dŒ„ dŒƒZdeG d�dŽ„ dŽƒƒZeG d�d�„ d�eefeeejgB f ƒZheed‘eQeUB ƒZieed’eQeUB ƒZjeed“eQeUB eTB ƒZkeed”eQeUB eVB ƒZleed•eQeUB ƒZmeed–eQeUB ƒZneed—eQeUB ƒZoeed˜eQeUB ƒZpeed™eQeUB eZB ƒZqeedšeQeUB ƒZreed›eQeUB ƒZseedœeQeUB eXB ƒZteedœeQeUB eYB ƒZueed�eQeUB ƒZveedžeQeUB ƒZweedŸeQƒZxG d d¡„ d¡ƒZydS )¨zCSS selector parser.é    )ÚannotationsN)Ú	lru_cacheé   )Úutil)Ú	css_match)Ú	css_types)ÚSelectorSyntaxError)ÚMatchÚAnyÚIteratorÚIterableÚcast)Ú	dataclass)ÚUserDictiýÿ  i    >   ú:linkú:openú:rootú:emptyú:mutedú:scopeú:checkedú:defaultú:definedú:enabledú	:any-linkú	:disabledú	:in-rangeú	:optionalú	:requiredú
:read-onlyú:last-childú:only-childú:read-writeú:first-childú:last-of-typeú:only-of-typeú:out-of-rangeú:first-of-typeú:indeterminateú:placeholder-shown>   ú:pastú:focusú:hoverú:activeú:futureú:pausedú:targetú:playingú:seekingú:stalledú:visitedú	:autofillú
:bufferingú:fullscreenú:local-linkú:focus-withinú:popover-openú:user-invalidú:focus-visibleú:target-withinú:volume-lockedú:picture-in-pictureú:hostú:current>   ú:matchesú:isú:hasú:notú:whereú	:containsú:-soup-containsú:-soup-contains-own>   ú:host-contextr@   rA   >   ú:dirú:langú
:nth-childú:nth-of-typeú:nth-last-childú:nth-last-of-typez(?:\r\n|(?!\r\n)[\n\f\r])z	(?:[ \t]|ú)z(?:/\*(?:[^*]|\*(?!/))*\*/)z(?:ú|z(?:\\(?:[a-f0-9]{1,6}z?|[^\r\n\f]|$))z?|z|[^\r\n\f]|$))z;
(?:(?:--|-?(?:[^\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])|[^\\"\r\n\f])*"|
'(?:\\(?:z|[^\r\n\f])|[^\\'\r\n\f])*'|
z)
z*(?P<cmp>[!~^|*$]?=)z*(?P<value>z)(?:z*(?P<case>[is]))?)?Ú*z\#z\.z(?P<tag_ns>(?:z|\*)?\|)?(?P<tag_name>z|\*)z\[z*(?P<attr_ns>(?:z|\*)?\|(?!=))?(?P<attr_name>z*\]z
(?P<name>:z)(?P<open>\(z*)?z*)z(?P<name>:(?=--)ú&z*\)ú:z@Pz
(?P<pseudo_nth_child>z
(?P<nth_child>z|even|odd))(?:z*\)|(?P<of>z*ofz*))
z
(?P<pseudo_nth_type>z
(?P<nth_type>z|even|odd))z*\)
z(?P<values>z*,z)*)z(?P<dir>ltr|rtl)z*(?=z|[,+>~])z*(?P<relation>[,+>~])?z(?:(\\[a-f0-9]{1,6}z?)|(\\[^\r\n\f])|(\\$))z?)|(\\[^\r\n\f])|(\\$)|(\\z))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$^(?:[ \t]|(?:\n\r|(?!\n\r)[\n\f\r])|z)*ú$)ú'ú"ú,ú é   é   é   é   é    é@   é€   é   i   i   iô  )ÚmaxsizeÚpatternÚstrÚ
namespacesúct.Namespaces | NoneÚcustomúct.CustomSelectors | NoneÚignoreútuple[str] | NoneÚflagsÚintÚreturnúcm.SoupSievec              	   C  s*   t |ƒ}t | t| |||d� ¡ |||¡S )zCached CSS compile.©ri   rk   rm   )Úprocess_customÚcmÚ	SoupSieveÚ	CSSParserÚprocess_selectors)re   rg   ri   rk   rm   Úcustom_selectors© rx   úW/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/soupsieve/css_parser.pyÚ_cached_css_compileÜ   s   
üörz   ÚNonec                   C  s   t  ¡  dS )zPurge the cache.N)rz   Úcache_clearrx   rx   rx   ry   Ú_purge_cacheõ   s   r}   ú 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   rw   ÚkeyÚvalueÚnamerx   rx   ry   rr   û   s   
rr   Úcontentc                 C  s:   d
dd„}|   t¡}|rtnt ||r| dd… ¡S | ¡S )zs
    Unescape CSS value.

    Strings allow for spanning the value on multiple strings by escaping a new line.
    Úmú
Match[str]ro   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\   é   õ   ï¿½Ú )Úgrouprn   ÚUNICODE_REPLACEMENT_CHARÚchr)r‰   Ú	codepointr†   rx   rx   ry   Úreplace  s   

ù
ûþzcss_unescape.<locals>.replacer   éÿÿÿÿN)r‰   rŠ   ro   rf   )Ú
startswithÚQUOTEDÚRE_CSS_STR_ESCÚ
RE_CSS_ESCÚsub)rˆ   r’   Úquotedrx   rx   ry   r„   
  s   

þþr„   Ú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r�d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   ú\rŒ   é   é   Úxr[   é0   é9   )é-   é_   rb   éA   éZ   éa   éz   r�   )ÚlenÚappendÚ	enumerateÚordÚjoin)rš   ÚstringÚlengthÚ
start_dashÚindexÚcr‘   rx   rx   ry   Úescape)  s$   ,&D
r²   c                   @  s<   e Zd ZdZddd„Zedd
d„ƒZddd„Zddd„ZdS )ÚSelectorPatternúSelector pattern.r‡   rf   re   ro   r{   c                 C  s   || _ || _d| _dS )úInitialize.N)r‡   re   Ú_re_pattern)Úselfr‡   re   rx   rx   ry   Ú__init__H  s   
zSelectorPattern.__init__úre.Pattern[str]c                 C  sh   t �' | jdu r t | jtjtjB tjB ¡| _W d  ƒ | jS W d  ƒ | jS 1 s,w   Y  | jS )z1Retrieve the compiled regular expression pattern.N)ÚRE_LOCKr¶   ÚreÚcompilere   ÚIÚXÚU©r·   rx   rx   ry   Ú
re_patternO  s   
 
þþ
ÿýzSelectorPattern.re_patternc                 C  s   | j S )ú	Get name.)r‡   rÀ   rx   rx   ry   Úget_nameX  s   zSelectorPattern.get_nameÚselectorr°   rn   rm   úMatch[str] | Nonec                 C  s   | j  ||¡S )úMatch the selector.)rÁ   r‚   )r·   rÄ   r°   rm   rx   rx   ry   r‚   ]  ó   zSelectorPattern.matchN)r‡   rf   re   rf   ro   r{   )ro   r¹   ©ro   rf   ©rÄ   rf   r°   rn   rm   rn   ro   rÅ   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r¸   ÚpropertyrÁ   rÃ   r‚   rx   rx   rx   ry   r³   E  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]], ...]ro   r{   c                 C  sL   i | _ |D ]}|d }|d ||d ƒ}|d D ]}|| j |< qqd| _dS )rµ   r   r‹   r\   r   N)rÐ   Úmatched_name)r·   rÐ   Úpr‡   re   Úpseudorx   rx   ry   r¸   f  s   ÿ
zSpecialPseudoPattern.__init__rf   c                 C  s   | j du rdS | j  ¡ S )rÂ   Nr�   )rÒ   rÃ   rÀ   rx   rx   ry   rÃ   r  s   zSpecialPseudoPattern.get_namerÄ   r°   rn   rm   rÅ   c                 C  sT   d}t  ||¡}|r(t t| d¡ƒ¡}| j |¡}|r(| |||¡}|r(|| _|S )rÆ   Nr‡   )	ÚRE_PSEUDO_CLASS_SPECIALr‚   r   r€   r„   rŽ   rÐ   ÚgetrÒ   )r·   rÄ   r°   rm   rÔ   r‰   r‡   re   rx   rx   ry   r‚   w  s   zSpecialPseudoPattern.matchN)rÐ   rÑ   ro   r{   rÈ   rÉ   )rÊ   rË   rÌ   rÍ   r¸   rÃ   r‚   rx   rx   rx   ry   rÏ   c  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
   ro   r{   c                 K  s¬   |  dd¡| _|  dg ¡| _|  dg ¡| _|  dg ¡| _|  dg ¡| _|  dg ¡| _|  dg ¡| _|  d	d¡| _|  d
g ¡| _	|  dg ¡| _
|  dd¡| _|  dd¡| _dS )rµ   ÚtagNÚidsÚclassesÚ
attributesÚnthÚ	selectorsÚ	relationsÚrel_typeÚcontainsÚlangrm   r   Úno_matchF)rÖ   rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rá   râ   rm   rã   )r·   rØ   rx   rx   ry   r¸   �  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ß   Úselrx   rx   ry   Ú_freeze_relations   s
   z_Selector._freeze_relationsúct.Selector | ct.SelectorNullc                 C  sb   | j rtj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ç   ÚNullÚSelectorrÙ   ÚtuplerÚ   rÛ   rÜ   rÝ   rÞ   rë   rß   rà   rá   râ   rm   rÀ   rx   rx   ry   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=rQ   )rÙ   rÚ   rÛ   rÜ   rÝ   rÞ   rß   rà   rá   râ   rm   rã   rÀ   rx   rx   ry   Ú__str__¾  s$   "ÿÿÿþþþþýÿz_Selector.__str__N)rØ   r
   ro   r{   )rß   rä   ro   rå   )ro   rì   rÈ   )	rÊ   rË   rÌ   rÍ   r¸   rë   ré   rð   Ú__repr__rx   rx   rx   ry   r×   ‡  s    





r×   c                   @  s"   e Zd ZU dZded< ded< dS )Ú
CSSPatternz<A CSS pattern that hasn't been processed by `CSSParser` yet.rf   rÄ   rn   rm   N)rÊ   rË   rÌ   rÍ   Ú__annotations__rx   rx   rx   ry   rò   Ë  s   
 rò   c                   @  s$   e Zd ZdZddd	„Zddd„ZdS )ÚPseudoSelectorMapzPseudo selector map.r…   rf   r†   úCSSPattern | ct.SelectorListro   r{   c                 C  s   || j |< dS )z	Set item.N)Údata©r·   r…   r†   rx   rx   ry   Ú__setitem__Ö  rÇ   zPseudoSelectorMap.__setitem__rå   c                 C  sl   t �* | j| }t|tƒr$t|jƒj|jd�}|| j|< W d  ƒ |S W d  ƒ |S 1 s/w   Y  |S )z	Get item.©rm   N)ÚSEL_LOCKrö   Ú
isinstancerò   ru   rÄ   rv   rm   r÷   rx   rx   ry   Ú__getitem__Û  s   


üü
þúzPseudoSelectorMap.__getitem__N)r…   rf   r†   rõ   ro   r{   )r…   rf   ro   rå   )rÊ   rË   rÌ   rÍ   rø   rü   rx   rx   rx   ry   rô   Ó  s    
rô   zhtml|*:is(a, area)[href]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=''])
    a  
    html|*:is(
        textarea,
        input:is(
            :not([type]),
            [type=""],
            [type=text],
            [type=search],
            [type=url],
            [type=tel],
            [type=email],
            [type=number],
            [type=password],
            [type=date],
            [type=datetime-local],
            [type=month],
            [type=time],
            [type=week]
        )
    ):not([readonly], :disabled),
    html|*:is([contenteditable=""], [contenteditable="true" i])
    zhtml|*:not(:read-write)zó
    html|input:is(
        [type="date"],
        [type="month"],
        [type="week"],
        [type="time"],
        [type="datetime-local"],
        [type="number"],
        [type="range"]
    ):is(
        [min],
        [max]
    )
    z html|*:is(details, dialog)[open]zhtml|*:is(video, audio)[muted]z*|*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ei de“de“de“de“de“de“de“de“de“d e “d!e!“d"e"“d#e#“d$e$“d%e%“d&e&“d'e'“ƒZ(d(d(d)d*œdod5d6„Z)dpdqd9d:„Z*drdAdB„Z+drdCdD„Z,drdEdF„Z-dsdKdL„Z.dtdMdN„Z/dudQdR„Z0dvdWdX„Z1dwd]d^„Z2drd_d`„Z3drdadb„Z4drdcdd„Z5drdedf„Z6	)	)dxdydhdi„Z7dzdkdl„Z8dxd{dmdn„Z9d(S )|ru   zParse CSS selectors.Úpseudo_closeÚpseudo_contains)rG   rH   rI   Úpseudo_nth_child)rM   rO   Úpseudo_nth_type)rN   rP   Úpseudo_lang)rL   Ú
pseudo_dir)rK   Úpseudo_class_customÚpseudo_classÚpseudo_elementÚampÚat_ruleÚidÚclassrÙ   Ú	attributeÚcombiner   r   r   r   r(   r   r   r   r   r   r   r   r"   r   r&   r)   ú
<nth-of-s>Nr   rq   rÄ   rf   ri   ú'dict[str, str | ct.SelectorList] | Nonerk   úIterable[str] | Nonerm   rn   ro   r{   c                C  sT   |  dd¡| _|| _| jtj@ | _|du ri n|| _t|du r!g n|ƒ| _d| _	dS )rµ   ú rŒ   Nr   )
r’   re   rm   r   ÚDEBUGÚdebugri   Ú	frozensetrk   Úcount)r·   rÄ   ri   rk   rm   rx   rx   ry   r¸   ²  s   

zCSSParser.__init__r   Ú	incrementc                 C  s*   |  j |7  _ | j tkrtdt› �ƒ‚dS )z!Check the current selector count.z/Selector exceeds pseudo-class nesting limit of N)r  ÚSELECTOR_LIMITÚ
ValueError)r·   r  rx   rx   ry   Úincrement_countÃ  s   
ÿzCSSParser.increment_countrê   r×   r‰   rŠ   Úhas_selectorÚboolc                 C  sJ  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}|r`t|  d¡ƒ}|sed}n„| d¡r||sndnt |¡}t 	d| |¡}nm| d¡r“|s…dnt |¡}t 	d| |¡}nV| d¡rª|sœdnt |¡}t 	d| |¡}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ÚcaseNÚattr_nsr“   r�   Ú	attr_nameÚir   ÚtypeTr†   rV   z(?!)z^%s.*rW   z.*?%s$rS   z.*?%s.*ú~z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*rR   z^%s(?:-.*)?$z^%s$ú!)rŽ   r   r€   r„   r»   r½   ÚDOTALLr”   r²   r¼   ÚRE_WSÚsearchre   rç   ÚSelectorAttributer×   rÜ   r©   rè   ré   rÞ   )r·   rê   r‰   r  ÚinverseÚopr  ÚnsÚattrÚis_typeÚpattern2r†   rm   re   Úsel_attrÚsub_selÚnot_listrx   rx   ry   Ú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.Útag_nsNr“   Útag_nameT)rŽ   r„   rç   ÚSelectorTagrÙ   )r·   rê   r‰   r  ÚprefixrÙ   rx   rx   ry   Ú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ƒsE| j|= t|| j| j| jd�jtd�}|| j|< |  |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‡   NzUndefined custom selector 'z' found at position r   )ri   rm   rk   rù   T)r   r€   r„   rŽ   ri   rÖ   r   Úendre   rû   rç   rè   ru   rm   rk   rv   Ú
FLG_PSEUDOr  r  rÞ   r©   )r·   rê   r‰   r  rÔ   rÄ   rx   rx   ry   Ú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  _nÖ|dkrM| jt	jO  _d}nÇ|dkrZ| jt	jO  _nº|d	krg| jt	jO  _n­|| jv r~| j| }|  |j¡ |j |¡ n–|d
kr“|j t	 dddddt	 ¡ ¡¡ n�|dkr¨|j t	 dddddt	 ¡ ¡¡ nl|dkr½|j t	 dddddt	 ¡ ¡¡ nW|dkrÒ|j t	 dddddt	 ¡ ¡¡ nB|dkró|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 |�r7|tv �r7|  || d¡ttB ¡ d|_d}||fS |�sH|tv �rHd|_d}||fS |tv �r[td|› d�| j|  d¡ƒ‚td|› d�| j|  d¡ƒ‚)zParse pseudo class.Fr‡   ÚopenTr   r   r   r   r   r#   r   r    r'   r$   r!   r%   z!Invalid syntax for pseudo class 'rX   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„   rŽ   ÚPSEUDO_COMPLEXÚparse_pseudo_openr5  ÚPSEUDO_SIMPLErm   rç   ÚSEL_ROOTÚSEL_DEFINEDÚ	SEL_SCOPEÚ	SEL_EMPTYÚPSEUDO_SELECTORSr  r  rÞ   r©   rÝ   ÚSelectorNthrè   ræ   ÚPSEUDO_COMPLEX_NO_MATCHÚparse_selectorsr6  ÚFLG_OPENrã   ÚPSEUDO_SIMPLE_NO_MATCHÚPSEUDO_SUPPORTEDr   re   Ústart)	r·   rê   r‰   r  r8  r:  Úcomplex_pseudorÔ   Úpseudo_selectorrx   rx   ry   Úparse_pseudo_class8  s~   

;Æ

""""þÿ
þÿëï
ò
ý
üzCSSParser.parse_pseudo_classc                 C  sR  |  ¡ }| d¡rd}nd}t t|d ƒ¡|d< t | d| ¡¡}|dkr.d}d}	d	}
nx|d
kr9d}d}	d	}
nmttt t 	|¡ƒ}| 
d¡rQ| 
d¡dkrQdnd}d}| 
d¡}| d¡}
| d¡ri|d7 }n|
rt||dd… 7 }n|| }d}| 
d¡rˆ| 
d¡dkrˆd}| 
d¡r”|| 
d¡7 }|r›t|dƒnd}|r¤t|dƒnd}	|d }|dkr÷| 
d¡rÀ|  || d¡ttB ¡}n| jd }|  |j¡ |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Ú_typer‡   rÝ   Úevenr\   r   TÚoddr   Ús1r›   r�   ÚaÚnÚ1Nr“   Ús2Úbé
   Úofr  rM   FrO   rN   rP   )Ú	groupdictrÖ   r   r€   r„   r   r	   rf   ÚRE_NTHr‚   rŽ   Úendswithr”   rn   rG  r5  r6  rH  rD  r  r  rÝ   r©   rç   rE  rè   )r·   rê   r‰   r  r8  ÚmdictÚpostfixrˆ   rS  rW  ÚvarÚ	nth_partsÚ_s1Ú_s2rT  Ú
pseudo_selÚnth_selrx   rx   ry   Úparse_pseudo_nth„  sj   	
 






ø
û 
ý zCSSParser.parse_pseudo_nthr‡   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.rE   rD   )rF   rC   T)r6  rH  ÚFLG_NOTÚFLG_RELATIVEÚFLG_FORGIVErÞ   r©   rG  )r·   rê   r‡   r  r8  r°   rm   rx   rx   ry   r>  Ç  s   


zCSSParser.parse_pseudo_openrÞ   rä   rà   útuple[bool, _Selector, str]c                 C  sÂ   |  d¡}|s	t}|tkr3|std|› d|› d�| j|ƒ‚||_|d j |¡ dt }| tƒ ¡ n$|rA||_|d j |¡ n|dd… tkrStd	|› �| j|ƒ‚d| }tƒ }d
}|||fS )úParse combinator tokens.ÚrelationúThe combinator 'ú' at position ú , must have a selector before itr“   rU   r   Nz%The multiple combinators at position F)	rŽ   ÚWS_COMBINATORÚCOMMA_COMBINATORr   re   rà   rß   r©   r×   )r·   rê   r‰   r  rÞ   rà   r°   Ú
combinatorrx   rx   ry   Úparse_has_combinatorÞ  s6   
ýý
zCSSParser.parse_has_combinatorrß   Ú	is_pseudoÚ
is_forgiveútuple[bool, _Selector]c	           
      C  sÔ   |  d¡}	|	s	t}	|s-|r|	tkrtd|	› d|› d�| j|ƒ‚|	tkr,|  ¡  |dd…= n4|	tkrN|js=|s=t dd¡|_|j	 
|¡ | |¡ |dd…= n|j	 
|¡ |	|_|dd…= | |¡ tƒ }d}||fS )rk  rl  rm  rn  ro  NrS   F)rŽ   rp  rq  r   re   r  rÙ   rç   r2  rß   ræ   r©   rà   r×   )
r·   rê   r‰   r  rÞ   rß   rt  ru  r°   rr  rx   rx   ry   Úparse_combinator  s6   
ý
€



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)rŽ   r”   rÛ   r©   r„   rÚ   )r·   rê   r‰   r  rÄ   rx   rx   ry   Úparse_class_id>  s   

þzCSSParser.parse_class_idc                 C  sf   t  t| d¡ƒ¡}|dkrt dt¡ |dk}dd„ t | d¡¡D ƒ}|j	 
t ||¡¡ d}|S )	zParse contains.r‡   rG   z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.rI   c                 S  ó$   g | ]}|  d ¡st|  d¡ƒ‘qS ©Úsplitr†   ©rŽ   r„   ©Ú.0Útokenrx   rx   ry   Ú
<listcomp>S  ó    ýÿz3CSSParser.parse_pseudo_contains.<locals>.<listcomp>ÚvaluesT)r   r€   r„   rŽ   ÚwarningsÚwarnÚFutureWarningÚ	RE_VALUESÚfinditerrá   r©   rç   ÚSelectorContains)r·   rê   r‰   r  rÔ   Úcontains_ownrÐ   rx   rx   ry   Úparse_pseudo_containsI  s   þþzCSSParser.parse_pseudo_containsc                 C  s4   dd„ t  | d¡¡D ƒ}|j t |¡¡ d}|S )zParse pseudo language.c                 S  rz  r{  r}  r~  rx   rx   ry   r�  _  r‚  z/CSSParser.parse_pseudo_lang.<locals>.<listcomp>rƒ  T)r‡  rˆ  rŽ   râ   r©   rç   ÚSelectorLang)r·   rê   r‰   r  rÐ   rx   rx   ry   Ú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.ÚdirÚltrT)r   r€   rŽ   rç   ÚSEL_DIR_LTRÚSEL_DIR_RTLrm   )r·   rê   r‰   r  r†   rx   rx   ry   Úparse_pseudo_diri  s    zCSSParser.parse_pseudo_dirrå   c              
   C  s^  t ƒ }g }d}d}g }dt }	| j}
t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t	@ ƒ}t|t
@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}t|t@ ƒ}| jr™|r]tdƒ |rctdƒ |ritdƒ |rotdƒ |rutdƒ |r{tdƒ |r�td	ƒ |r‡td
ƒ |r�tdƒ |r“tdƒ |r™tdƒ |r¡| t ƒ ¡ �z[	 t|ƒ\}}|dvr²|  ¡  | jrât | d¡¡}|durâ| d¡ ¡ | jv râtd| d¡› d| d¡› d�| j| d¡ƒ‚|dkrðtd| d¡› �ƒ‚|dkrÿ| jtjO  _d}n÷|dk�r|   |||¡}nê|dk�r|  !|||||¡\}}nÙ|dk�r,td| d¡› �ƒ‚|dk�r9|  "|||¡}n½|dv �rG|  #||||¡}n¯|dk�rT|  $|||¡}n¢|d k�rc|  %|||¡}d}n“|d!k�r—|�s�|�s~td"| d¡› �| j| d¡ƒ‚d|_&|�r‡d}nutd#| d¡› �| j| d¡ƒ‚|d$k�r¼|�r­|  '|||||	|¡\}}}	nI|  (||||||||¡\}}n:|d%k�rÉ|  )|||¡}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|ƒ‚|�rI|j.�s)|�s)t /d+d¡|_.|�r8|	|_0|d, j1 |¡ n-|j1 2|¡ |dd…= | |¡ n|�re|�rR|�se|  ¡  d|_&|dd…= | |¡ d}|�srtd"|› �| j|ƒ‚|�r{tj3|d, _|�r„tj4|d, _|�r�tj5|d, _|�r–tj6|d, _|�rŸtj7|d, _t 8d-d.„ |D ƒ||| j|
 ¡S )/zParse selectors.FrU   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: TrueT)r  rý   r   Nr‡   zThe selector 'rn  z, has been disallowedr  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 rS   r“   c                 S  s   g | ]}|  ¡ ‘qS rx   )ré   )r  Úsrx   rx   ry   r�  3  s    z-CSSParser.parse_selectors.<locals>.<listcomp>)9r×   rp  r  r  rH  r6  rh  rg  ÚFLG_HTMLÚFLG_DEFAULTÚFLG_INDETERMINATEÚFLG_IN_RANGEÚFLG_OUT_OF_RANGEÚFLG_PLACEHOLDER_SHOWNri  r  Úprintr©   Únextr  rk   ÚRE_PSEUDO_IGNOREr‚   rŽ   r€   r   rK  re   ÚNotImplementedErrorrm   rç   rB  r7  rN  r‹  rf  r�  r’  rã   rs  rw  r/  r4  ry  r5  ÚStopIterationrÙ   r2  rà   rß   ræ   ÚSEL_DEFAULTÚSEL_INDETERMINATEÚSEL_IN_RANGEÚSEL_OUT_OF_RANGEÚSEL_PLACEHOLDER_SHOWNrè   )r·   r8  r°   rm   rê   rÞ   r  Úclosedrß   rà   r  Úis_openrt  Úis_relativeÚis_notr:  Ú
is_defaultÚis_indeterminateÚis_in_rangeÚis_out_of_rangeÚis_placeholder_shownru  r…   r‰   Úmirx   rx   ry   rG  q  s:  	ý







ýý
ÿ
ÿ

ý

´/ÿý


ý	 zCSSParser.parse_selectorsre   c           
   
   c  s|  � t  |¡}|r| d¡nd}t |ddd… ¡}|r | d¡nd}t|ƒd|  }| jr4td|›�ƒ ||kr³d}| jD ]2}| ||| j	¡}|ro| 
¡ }| jrctd|› d| d¡›d| d¡› �ƒ | d¡}||fV   nq=|du r¯|| }|d	kr‚d
|› �}	n&|dkrŒd|› �}	n|dkr–d|› �}	n|dkr d|› �}	nd|›d|› �}	t|	| j|ƒ‚||ks8| jr¼tdƒ dS dS )zIterate selector tokens.r   Nr“   r   z## PARSING: zTOKEN: 'z' --> z at position ú[z)Malformed attribute selector at position rx  z%Malformed class selector at position ú#z"Malformed id selector at position rU   z,Malformed pseudo-class selector at position zInvalid character z
 position z## END PARSING)ÚRE_WS_BEGINr$  r5  Ú	RE_WS_ENDr¨   r  rš  Ú
CSS_TOKENSr‚   rm   rÃ   rŽ   rK  r   re   )
r·   re   r‰   r°   Úoffsetr5  Úvr‡   r±   Úmsgrx   rx   ry   Úselector_iter5  sH   €

&

úæÿzCSSParser.selector_iterc                 C  s   |   |  | j¡||¡S )zProcess selectors.)rG  r¶  re   )r·   r°   rm   rx   rx   ry   rv   _  s   zCSSParser.process_selectors)
rÄ   rf   ri   r  rk   r  rm   rn   ro   r{   )r   )r  rn   ro   r{   )rê   r×   r‰   rŠ   r  r  ro   r  )rê   r×   r‰   rŠ   r  r  r8  r9  r:  r  ro   r;  )
rê   r×   r‰   rŠ   r  r  r8  r9  ro   r  )rê   r×   r‡   rf   r  r  r8  r9  r°   rn   ro   r  )rê   r×   r‰   rŠ   r  r  rÞ   rä   rà   rf   r°   rn   ro   rj  )rê   r×   r‰   rŠ   r  r  rÞ   rä   rß   rä   rt  r  ru  r  r°   rn   ro   rv  )r   r   )r8  r9  r°   rn   rm   rn   ro   rå   )re   rf   ro   r9  )r°   rn   rm   rn   ro   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_COMBINEr²  rô   ÚCSS_LINKÚCSS_CHECKEDÚCSS_DEFAULTÚCSS_INDETERMINATEÚCSS_DISABLEDÚCSS_ENABLEDÚCSS_REQUIREDÚ	CSS_MUTEDÚCSS_OPENÚCSS_OPTIONALÚCSS_READ_ONLYÚCSS_READ_WRITEÚCSS_IN_RANGEÚCSS_OUT_OF_RANGEÚCSS_PLACEHOLDER_SHOWNÚCSS_NTH_OF_S_DEFAULTrD  r¸   r  r/  r4  r7  rN  rf  r>  rs  rw  ry  r‹  r�  r’  rG  r¶  rv   rx   rx   rx   ry   ru   |  s¬    ü



öÿçÿþýüûúùø	÷
öõôóòñðïÿú

H
	

L
C

1
/


ü 
E*ru   )Nr   )re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   )ro   r{   )ri   rj   ro   r~   )rˆ   rf   ro   rf   )rš   rf   ro   rf   )zrÍ   Ú
__future__r   r»   Ú	functoolsr   r�   r   r   rs   r   rç   r   r„  Útypingr	   r
   r   r   r   Údataclassesr   Úcollectionsr   Ú	threadingÚLockrº   ÚRLockrú   r�   r  r?  rI  r=  rF  ÚPSEUDO_SPECIALrJ  ÚNEWLINEÚWSÚCOMMENTSÚWSCÚCSS_ESCAPESÚCSS_STRING_ESCAPESÚ
IDENTIFIERÚNTHÚVALUEÚATTRrÂ  rÃ  rÄ  rÅ  r¾  ÚPAT_PSEUDO_CLASS_SPECIALr½  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•   rq  rp  r6  rg  rh  r•  r”  r–  rH  r—  r˜  r™  ri  Ú	_MAXCACHErz   r}   rr   r„   r²   r³   rÏ   r×   rò   rf   rè   rô   rÇ  rÈ  rÉ  rÊ  rË  rÌ  rÍ  rÐ  rÕ  rÒ  rÑ  rÓ  rÔ  rÏ  rÎ  rÖ  ru   rx   rx   rx   ry   Ú<module>   sN   	ÿþÿþý$

"


ÿþþþþþþþþÿþþ(("
û



$Dü
	ö
ôøü
ñé
ñ
ñ
