o
    HªRhhâ  ã                   @  sŒ  d 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 ddl	Z	ddl
Z
ddlmZmZmZmZmZmZ e d	¡Ze d
¡ZdZdZdZdZdZdZdZdZdZdZejej B Z!ej"ej#B Z$ejej ddœZ%e d¡Z&e d¡Z'e d¡Z(e d¡Z)e d¡Z*e d¡Z+e d¡Z,dZ-dZ.dZ/d Z0d!Z1d"Z2d#Z3G d$d%„ d%ƒZ4G d&d'„ d'ƒZ5G d(d)„ d)ƒZ6G d*d+„ d+e5ƒZ7G d,d-„ d-ej8ƒZ9e :e9¡ dS ).zCSS matcher.é    )Úannotations)Údatetimeé   )ÚutilN)Ú	css_types)ÚIteratorÚIterableÚAnyÚCallableÚSequenceÚcastz[^ 	
]z	[^ 	
]+ú ú>ú~ú+z: z:>z:~z:+zhttp://www.w3.org/1999/xhtmlz$http://www.w3.org/XML/1998/namespace)ÚltrÚrtlÚautoz0^(?P<value>-?(?:[0-9]{1,}(\.[0-9]+)?|\.[0-9]+))$z*^(?P<hour>[0-9]{2}):(?P<minutes>[0-9]{2})$z)^(?P<year>[0-9]{4,})-(?P<month>[0-9]{2})$z)^(?P<year>[0-9]{4,})-W(?P<week>[0-9]{2})$z;^(?P<year>[0-9]{4,})-(?P<month>[0-9]{2})-(?P<day>[0-9]{2})$zd^(?P<year>[0-9]{4,})-(?P<month>[0-9]{2})-(?P<day>[0-9]{2})T(?P<hour>[0-9]{2}):(?P<minutes>[0-9]{2})$z(?:(?:-\*-)(?:\*(?:-|$))*|-\*$))é   é   é	   é   é   é   é   é   é   é   c                   @  s$   e Zd ZdZddd„Zdd	d
„ZdS )Ú_FakeParentzæ
    Fake parent class.

    When we have a fragment with no `BeautifulSoup` document object,
    we can't evaluate `nth` selectors properly.  Create a temporary
    fake parent so we can traverse the root element as a child.
    Úelementúbs4.TagÚreturnÚNonec                 C  s   |g| _ dS )úInitialize.N)Úcontents)Úselfr   © r&   úU/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/soupsieve/css_match.pyÚ__init__D   ó   z_FakeParent.__init__úbs4.PageElementc                 C  ó
   t | jƒS )zLength.)Úlenr$   ©r%   r&   r&   r'   Ú__len__I   ó   
z_FakeParent.__len__N)r   r    r!   r"   )r!   r*   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r(   r.   r&   r&   r&   r'   r   ;   s    
r   c                   @  s´  e Zd ZdZed]dd„ƒZed^dd„ƒZed_dd„ƒZed_dd„ƒZ	ed_dd„ƒZ
ed_dd„ƒZed_dd„ƒZed_dd„ƒZed_dd„ƒZed`dd„ƒZedad d!„ƒZdad"d#„Zdad$d%„Zdbdcd)d*„Z	+	&	,	&ddded1d2„Z	,	&dfdgd3d4„Zdbdhd5d6„Zedid8d9„ƒZedid:d;„ƒZedid<d=„ƒZedjdkd>d?„ƒZedjdkd@dA„ƒZedadBdC„ƒZedldGdH„ƒZedmdKdL„ƒZe	+dndodPdQ„ƒZedpdSdT„ƒZ edqdVdW„ƒZ!dbdrdXdY„Z"dbdsd[d\„Z#d+S )tÚ_DocumentNavz#Navigate a Beautiful Soup document.Útagr	   r!   r"   c                 C  s    |   |¡stdt|ƒ› ƒ‚dS )z%Check if valid input tag or document.z:Expected a BeautifulSoup 'Tag', but instead received type N)Úis_tagÚ	TypeErrorÚtype)Úclsr5   r&   r&   r'   Úassert_valid_inputR   s   
ÿz_DocumentNav.assert_valid_inputÚobjr    Úboolc                 C  ó   t | tjƒS )zIs `BeautifulSoup` object.)Ú
isinstanceÚbs4ÚBeautifulSoup©r;   r&   r&   r'   Úis_docZ   r)   z_DocumentNav.is_docr*   c                 C  r=   )zIs tag.)r>   r?   ÚTagrA   r&   r&   r'   r6   _   r)   z_DocumentNav.is_tagc                 C  r=   )zIs declaration.)r>   r?   ÚDeclarationrA   r&   r&   r'   Úis_declarationd   r)   z_DocumentNav.is_declarationc                 C  r=   )z	Is CDATA.)r>   r?   ÚCDatarA   r&   r&   r'   Úis_cdatai   r)   z_DocumentNav.is_cdatac                 C  r=   )zIs processing instruction.)r>   r?   ÚProcessingInstructionrA   r&   r&   r'   Úis_processing_instructionn   r)   z&_DocumentNav.is_processing_instructionc                 C  r=   )zIs navigable string.)r>   r?   ÚNavigableStringrA   r&   r&   r'   Úis_navigable_strings   r)   z _DocumentNav.is_navigable_stringc                 C  s   t | tjtjtjtjtjfƒS )zIs special string.)r>   r?   ÚCommentrD   rF   rH   ÚDoctyperA   r&   r&   r'   Úis_special_stringx   s   z_DocumentNav.is_special_stringc                 C  s   |   |¡o
|  |¡ S )z Check if node is content string.)rK   rN   )r9   r;   r&   r&   r'   Úis_content_string}   s   z_DocumentNav.is_content_stringÚelr   c                 C  s   t | ƒS )z'Create fake parent for a given element.)r   ©rP   r&   r&   r'   Úcreate_fake_parentƒ   ó   z_DocumentNav.create_fake_parentc                 C  r+   )z2Check if element (or document) is from a XML tree.)r<   Ú_is_xmlrQ   r&   r&   r'   Úis_xml_tree‰   s   
z_DocumentNav.is_xml_treec                 C  s.   t |  |¡r	|jnt |j¡dko|  |¡ƒS )z Check if element is an `iframe`.Úiframe)r<   rU   Únamer   ÚlowerÚis_html_tag©r%   rP   r&   r&   r'   Ú	is_iframe   s    þz_DocumentNav.is_iframec                 C  s:   | j o| j |u }|s|  |¡}|duo| jo|  |¡}|S )zà
        Return whether element is a root element.

        We check that the element is the root of the tree (which we have already pre-calculated),
        and we check if it is the root element under an `iframe`.
        N)ÚrootÚ
get_parentÚis_htmlr[   )r%   rP   r\   Úparentr&   r&   r'   Úis_root—   s
   
z_DocumentNav.is_rootFÚ	no_iframeúIterator[bs4.PageElement]c                 c  s$    |r|   |¡s|jE dH  dS dS )z$Get contents or contents in reverse.N)r[   r$   ©r%   rP   ra   r&   r&   r'   Úget_contents¥   s   €ÿz_DocumentNav.get_contentsNTÚstartú
int | NoneÚreverseÚtagsc                 c  s´    |r|   |¡sTt|jƒd }|du r|r|nd}n|}|r dn|d }|r(dnd}	d|  kr4|krVn dS ||krX|j| }
||	7 }|rK|  |
¡rN|
V  ||ks;dS dS dS dS )zGet children.r   Nr   éÿÿÿÿ)r[   r,   r$   r6   )r%   rP   re   rg   rh   ra   ÚlastÚindexÚendÚincrÚnoder&   r&   r'   Úget_childrenª   s$   €

üö	z_DocumentNav.get_childrenc                 c  sÄ    |r|   |¡s^d}|jD ]R}|dur||urqd}|  |¡}|rV|rV|   |¡rV|jdur1|j}n|}|  |¡rH|jrH|jd }|  |¡rH|js;|j}|V  |du rU dS q|rZ|r]|V  qdS dS )zGet descendants.Nri   )r[   Údescendantsr6   Únext_siblingr$   Únext_element)r%   rP   rh   ra   Ú	next_goodÚchildr6   Ú
last_childr&   r&   r'   Úget_descendantsÄ   s4   €



ÿ€æz_DocumentNav.get_descendantsc                 C  s$   |j }|r|dur|  |¡rd}|S )zGet parent.N)r_   r[   )r%   rP   ra   r_   r&   r&   r'   r]   è   s   z_DocumentNav.get_parentú
str | Nonec                 C  ó   t d| jƒS )úGet tag.rw   )r   rW   rQ   r&   r&   r'   Úget_tag_nameð   ó   z_DocumentNav.get_tag_namec                 C  rx   )úGet prefix.rw   )r   ÚprefixrQ   r&   r&   r'   Úget_prefix_nameö   r{   z_DocumentNav.get_prefix_namec                 C  rx   )zGet namespace `URI`.rw   )r   Ú	namespacerQ   r&   r&   r'   Úget_uriü   r{   z_DocumentNav.get_uric                 C  ó<   |j }|r|  |¡s|dur|j }|r|  |¡s|dus|S )zGet next sibling tag.N)rq   r6   ©r9   rP   rh   Úsiblingr&   r&   r'   Úget_next  ó
   ÿz_DocumentNav.get_nextc                 C  r   )zGet previous sibling tag.N)Úprevious_siblingr6   r‚   r&   r&   r'   Úget_previous  r…   z_DocumentNav.get_previousc                 C  s"   | rt | dƒnd}t|o|tkƒS )zÊ
        Check if element has an HTML namespace.

        This is a bit different than whether a element is treated as having an HTML namespace,
        like we do in the case of `is_html_tag`.
        r   N)Úgetattrr<   ÚNS_XHTML)rP   Únsr&   r&   r'   Úhas_html_ns  s   	z_DocumentNav.has_html_nsÚ	attr_nameÚstrútuple[str | None, str | None]c                 C  s   t |ddƒt |ddƒfS )z7Return namespace and attribute name without the prefix.r   NrW   )rˆ   )rP   rŒ   r&   r&   r'   Úsplit_namespace   ó   z_DocumentNav.split_namespaceÚvalueústr | Sequence[str]c                 C  s   |du rdS t |tƒr|S t |tƒr| d¡S t |tƒrDg }|D ]!}t |ttfƒs6t |tƒr6| t|ƒ¡ q | tt|  |¡ƒ¡ q |S t|ƒS )z6Normalize the value to be a string or list of strings.NÚ Úutf8)r>   r   ÚbytesÚdecoder   Úappendr   Únormalize_value)r9   r‘   Ú	new_valueÚvr&   r&   r'   r˜   &  s   



z_DocumentNav.normalize_valuerW   Údefaultústr | Sequence[str] | Nonec                 C  sl   |}|j rz|  |j| ¡}W |S  ty   Y |S w |j ¡ D ]\}}t |¡|kr3|  |¡} |S q |S )zGet attribute by name.)rT   r˜   ÚattrsÚKeyErrorÚitemsr   rX   )r9   rP   rW   r›   r‘   Úkrš   r&   r&   r'   Úget_attribute_by_nameG  s    	ùù
ýz"_DocumentNav.get_attribute_by_nameú0Iterator[tuple[str, str | Sequence[str] | None]]c                 c  s*    |j  ¡ D ]\}}||  |¡fV  qdS )zIterate attributes.N)r   rŸ   r˜   )r9   rP   r    rš   r&   r&   r'   Úiter_attributes]  s   €ÿz_DocumentNav.iter_attributesúSequence[str]c                 C  s0   |   |dg ¡}t|tƒrt |¡}ttt |ƒS )zGet classes.Úclass)r¡   r>   r   Ú	RE_NOT_WSÚfindallr   r   )r9   rP   Úclassesr&   r&   r'   Úget_classesd  s   

z_DocumentNav.get_classesc                   s$   d  ‡ fdd„ˆ j|d|dD ƒ¡S )z	Get text.r“   c                   ó   g | ]	}ˆ   |¡r|‘qS r&   ©rO   ©Ú.0rn   r-   r&   r'   Ú
<listcomp>q  ó    z)_DocumentNav.get_text.<locals>.<listcomp>F)rh   ra   )Újoinrv   rc   r&   r-   r'   Úget_textm  s   ÿz_DocumentNav.get_textú	list[str]c                   s   ‡ fdd„ˆ j ||dD ƒS )zGet Own Text.c                   rª   r&   r«   r¬   r-   r&   r'   r®   w  r¯   z-_DocumentNav.get_own_text.<locals>.<listcomp>©ra   )rd   rc   r&   r-   r'   Úget_own_textt  s   z_DocumentNav.get_own_text)r5   r	   r!   r"   )r;   r    r!   r<   )r;   r*   r!   r<   )rP   r    r!   r   ©rP   r    r!   r<   ©F)rP   r    ra   r<   r!   rb   )NFTF)rP   r    re   rf   rg   r<   rh   r<   ra   r<   r!   rb   )TF)rP   r    rh   r<   ra   r<   r!   rb   )rP   r    ra   r<   r!   r    ©rP   r    r!   rw   )T)rP   r    rh   r<   r!   r*   )rP   r    rŒ   r   r!   rŽ   )r‘   r	   r!   r’   ©N)rP   r    rW   r   r›   rœ   r!   rœ   )rP   r    r!   r¢   )rP   r    r!   r¤   )rP   r    ra   r<   r!   r   )rP   r    ra   r<   r!   r²   )$r0   r1   r2   r3   Úclassmethodr:   ÚstaticmethodrB   r6   rE   rG   rI   rK   rN   rO   rR   rU   r[   r`   rd   ro   rv   r]   rz   r~   r€   r„   r‡   r‹   r   r˜   r¡   r£   r©   r±   r´   r&   r&   r&   r'   r4   O   sz    

úü$ ür4   c                   @  sr   e Zd ZdZeddd	„ƒZed dd„ƒZed!dd„ƒZed"dd„ƒZed#dd„ƒZ	ed$dd„ƒZ
ed%dd„ƒZdS )&ÚInputsz-Class for parsing and validating input items.ÚyearÚintÚmonthÚdayr!   r<   c                 C  s^   t }|tkr| d dkr| d dks| d dkrtnt}n|tv r#t}d|  ko,|kS   S )zValidate day.r   r   éd   i  r   )Ú
LONG_MONTHÚFEBÚFEB_LEAP_MONTHÚ	FEB_MONTHÚ	MONTHS_30ÚSHORT_MONTH)r¼   r¾   r¿   Úmax_daysr&   r&   r'   Úvalidate_day}  s   .zInputs.validate_dayÚweekc                 C  sH   t  d› dd› d| › d¡ ¡ d }|dkrd}d|  ko!|kS   S )zValidate week.é   ú-r   z%m-%d-%Yr   é5   )r   ÚstrptimeÚisocalendar)r¼   rÉ   Úmax_weekr&   r&   r'   Úvalidate_weekˆ  s   $zInputs.validate_weekc                 C  ó   d|   ko	dkS   S )zValidate month.r   rÊ   r&   )r¾   r&   r&   r'   Úvalidate_month‘  r   zInputs.validate_monthc                 C  s   d| kS )zValidate year.r   r&   )r¼   r&   r&   r'   Úvalidate_year—  rS   zInputs.validate_yearÚhourc                 C  rÑ   )zValidate hour.r   é   r&   )rÔ   r&   r&   r'   Úvalidate_hour  r   zInputs.validate_hourÚminutesc                 C  rÑ   )zValidate minutes.r   é;   r&   )r×   r&   r&   r'   Úvalidate_minutes£  r   zInputs.validate_minutesÚityper   r‘   rw   útuple[float, ...] | Nonec                 C  st  d}|du r|S |dkrCt  |¡}|rAt| d¡dƒ}t| d¡dƒ}t| d¡dƒ}|  |¡rA|  |¡rA|  |||¡rA|||f}|S |dkrnt |¡}|rlt| d¡dƒ}t| d¡dƒ}|  |¡rl|  |¡rl||f}|S |dkršt |¡}|r˜t| d¡dƒ}t| d¡dƒ}|  |¡r˜|  	||¡r˜||f}|S |dkrÅt
 |¡}|rÃt| d	¡dƒ}	t| d
¡dƒ}
|  |	¡rÃ|  |
¡rÃ|	|
f}|S |dkr#t |¡}|r!t| d¡dƒ}t| d¡dƒ}t| d¡dƒ}t| d	¡dƒ}	t| d
¡dƒ}
|  |¡r!|  |¡r!|  |||¡r!|  |	¡r!|  |
¡r!||||	|
f}|S |dv r8t |¡}|r8t| d¡ƒf}|S )zParse the input value.NÚdater¼   é
   r¾   r¿   rÉ   ÚtimerÔ   r×   údatetime-local)ÚnumberÚranger‘   )ÚRE_DATEÚmatchr½   ÚgrouprÓ   rÒ   rÈ   ÚRE_MONTHÚRE_WEEKrÐ   ÚRE_TIMErÖ   rÙ   ÚRE_DATETIMEÚRE_NUMÚfloat)r9   rÚ   r‘   ÚparsedÚmr¼   r¾   r¿   rÉ   rÔ   r×   r&   r&   r'   Úparse_value©  sz   
"
'Ú
 á
è

ï
ÿÿÿþþ
ü
zInputs.parse_valueN)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!   r<   )r×   r½   r!   r<   )rÚ   r   r‘   rw   r!   rÛ   )r0   r1   r2   r3   rº   rÈ   rÐ   rÒ   rÓ   rÖ   rÙ   r¹   rí   r&   r&   r&   r'   r»   z  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ddd„Zddd„Z	d‚dd„Z
dƒd!d"„Zd„d&d'„Zd…d*d+„Zd†d.d/„Zd…d0d1„Zd‡d3d4„Zdˆd6d7„Zd‰dŠd;d<„Zdˆd=d>„Zdˆd?d@„Zd‹dCdD„ZdŒdFdG„Zd€dHdI„Zd€dJdK„ZddMdN„ZdŽdPdQ„Zd€dRdS„ZddUdV„ZddYdZ„Zd€d[d\„Zd€d]d^„Zd‘dadb„Z d’ddde„Z!d“dgdh„Z"d€didj„Z#d€dkdl„Z$d”dmdn„Z%d•d–drds„Z&d—dudv„Z'd˜dxdy„Z(d€dzd{„Z)d|S )™ÚCSSMatchzPerform CSS matching.Ú	selectorsúct.SelectorListÚscoper    Ú
namespacesúct.Namespaces | NoneÚflagsr½   r!   r"   c           	      C  sÖ   |   |¡ || _g | _g | _g | _|| _|du ri n|| _|| _d| _|}|  	|¡}|r5|}|  	|¡}|s,d}|  
|¡s?|}n
|  |¡D ]}|} || _||urR|n|| _|  |¡| _|  |¡| _| j pg| j| _dS )r#   NF)r:   r5   Úcached_meta_langÚcached_default_formsÚcached_indeterminate_formsrï   rò   rô   Úiframe_restrictr]   rB   ro   r\   rñ   r‹   Úhas_html_namespacerU   Úis_xmlr^   )	r%   rï   rñ   rò   rô   Údocr_   r\   rt   r&   r&   r'   r(   ä  s4   
	

þ
zCSSMatch.__init__r<   c                 C  s   | j p| jS )z3Check if namespaces are supported in the HTML type.)rú   rù   r-   r&   r&   r'   Úsupports_namespaces  r)   zCSSMatch.supports_namespacesrP   r   c                 C  s*   |   ¡ rd}|  |¡}|r|}|S t}|S )zGet tag namespace.r“   )rü   r€   r‰   )r%   rP   r   rŠ   r&   r&   r'   Ú
get_tag_ns  s   
ÿzCSSMatch.get_tag_nsc                 C  s   |   |¡tkS )z"Check if tag is in HTML namespace.)rý   r‰   rZ   r&   r&   r'   rY     s   zCSSMatch.is_html_tagrw   c                 C  ó&   |   |¡}|dur| jst |¡S |S )ry   N)rz   rú   r   rX   ©r%   rP   rW   r&   r&   r'   Úget_tag#  ó   
zCSSMatch.get_tagc                 C  rþ   )r|   N)r~   rú   r   rX   )r%   rP   r}   r&   r&   r'   Ú
get_prefix)  r  zCSSMatch.get_prefixrf   c              
   C  sÀ   | j |ddD ]V}|  |¡r;t t |  |dd¡¡d¡}|  |¡dv s,|  |¡r,|dur-q|  	|¡}|dur:|  S q|  
|¡rAq|D ]}t |¡}|dv r\|dkrUtjntj    S qCqdS )	z%Get directionality from element text.F©rh   Údirr“   N)ÚbdiÚscriptÚstyleÚtextarearV   ©ÚALÚRÚLr  )ro   r6   ÚDIR_MAPÚgetr   rX   r¡   r   rY   Ú	find_bidirN   ÚunicodedataÚbidirectionalÚctÚSEL_DIR_LTRÚSEL_DIR_RTL)r%   rP   rn   Ú	directionr‘   ÚcÚbidir&   r&   r'   r  /  s*   
ÿ


ÿþzCSSMatch.find_bidiÚ
lang_rangeÚlang_tagc                 C  s*  d}t  d|¡ ¡ }| d¡}| ¡  d¡}t|ƒ}t|ƒ}d}d}	|| }
||	 }|dkr:|dkr:|
s:|
|kr:dS |
dkrB|
|ksL|
dkrN|dkrN|sNd}|d7 }|	d7 }	|r“||k r“|| }
z||	 }W n tyq   d}Y qVw |
swd}qV||
kr€|d7 }n	t|ƒdkr‰d}qV|	d7 }	|r“||k s\|S )zFilter the language tags.TrË   r   r   Ú*F)ÚRE_WILD_STRIPÚsubrX   Úsplitr,   Ú
IndexError)r%   r  r  rã   ÚrangesÚsubtagsÚlengthÚslengthÚrindexÚsindexÚrÚsr&   r&   r'   Úextended_language_filterS  sF   
$ü
æz!CSSMatch.extended_language_filterÚattrr}   rœ   c           
      C  s  d}|   ¡ rsd}|r| j |¡}|du r|dkrdS nd}|  |¡D ]N\}}|  ||¡\}}	|du rL| jr9||ksF| jsKt |¡t |¡krK|} |S q"|du sX||krY|dkrYq"| jsgt |¡t |	¡krln||	krlq"|} |S |S |  |¡D ]\}}t |¡t |¡kr‡qx|} |S |S )z3Match attribute name and return value if it exists.Nr  )rü   rò   r  r£   r   rú   r   rX   )
r%   rP   r(  r}   r‘   rŠ   r    rš   r   rW   r&   r&   r'   Úmatch_attribute_name‹  s<   €(î$ûzCSSMatch.match_attribute_namer5   úct.SelectorTagc                 C  s    d}|   |¡}| j d¡}|jdu rdn| j |j¡}|jdu r,|dur,||kr,d}|S |jdur<|jdkr<|r<d}|S |jrN|jdkrN|du sL||krNd}|S )z#Match the namespace of the element.Tr“   NFr  )rý   rò   r  r}   )r%   rP   r5   rã   r   Údefault_namespaceÚtag_nsr&   r&   r'   Úmatch_namespaceÀ  s   

øüÿzCSSMatch.match_namespaceÚ
attributesú tuple[ct.SelectorAttribute, ...]c                 C  sŒ   d}|rD|D ]=}|   ||j|j¡}| jr|jr|jn|j}|du r&d} |S t|tƒr-|nd |¡}|du r7q| 	|¡du rCd} |S q|S )zMatch attributes.TNFr   )
r)  Ú	attributer}   rú   Úxml_type_patternÚpatternr>   r   r°   rã   )r%   rP   r.  rã   ÚaÚtempr2  r‘   r&   r&   r'   Úmatch_attributesÕ  s$   úýzCSSMatch.match_attributesc                 C  s>   | j s|jdurt |j¡n|j}|duo||  |¡dfv S )zMatch tag name.Nr  )rú   rW   r   rX   r   )r%   rP   r5   rW   r&   r&   r'   Úmatch_tagnameè  s   "þzCSSMatch.match_tagnameúct.SelectorTag | Nonec                 C  s0   d}|dur|   ||¡sd}|  ||¡sd}|S )zMatch the tag.TNF)r-  r6  )r%   rP   r5   rã   r&   r&   r'   Ú	match_tagñ  s   zCSSMatch.match_tagÚrelationc                 C  s  d}t |d tjƒr|S |d jtkr3| j|| jd}|s1|r1|  ||¡}| j|| jd}|s1|s|S |d jtkrL| j|| jd}|rJ|  ||¡}|S |d jt	krm|  
|¡}|sk|rk|  ||¡}|  
|¡}|sk|s\|S |d jtkr†|  
|¡}|r†|  |¡r†|  ||¡}|S )zMatch past relationship.Fr   r³   )r>   r  ÚSelectorNullÚrel_typeÚ
REL_PARENTr]   rø   Úmatch_selectorsÚREL_CLOSE_PARENTÚREL_SIBLINGr‡   ÚREL_CLOSE_SIBLINGr6   )r%   rP   r9  Úfoundr_   rƒ   r&   r&   r'   Úmatch_past_relationsý  s6   þó
÷

þü
zCSSMatch.match_past_relationsFr_   Ú	recursivec                 C  sD   d}|r| j }n| j}||| jdD ]}|  ||¡}|r |S q|S )zMatch future child.Fr³   )rv   ro   rø   r=  )r%   r_   r9  rC  rã   Úchildrenrt   r&   r&   r'   Úmatch_future_child  s   þzCSSMatch.match_future_childc                 C  sÎ   d}t |d tjƒr|S |d jtkr|  ||d¡}|S |d jtkr+|  ||¡}|S |d jtkrL|  |¡}|sJ|rJ|  	||¡}|  |¡}|sJ|s;|S |d jt
kre|  |¡}|re|  |¡re|  	||¡}|S )zMatch future relationship.Fr   T)r>   r  r:  r;  ÚREL_HAS_PARENTrE  ÚREL_HAS_CLOSE_PARENTÚREL_HAS_SIBLINGr„   r=  ÚREL_HAS_CLOSE_SIBLINGr6   )r%   rP   r9  rA  rƒ   r&   r&   r'   Úmatch_future_relations'  s*   õ
÷

þü
zCSSMatch.match_future_relationsc                 C  sV   d}t |d tjƒs|d jdu r|S |d j d¡r#|  ||¡}|S |  ||¡}|S )z%Match relationship to other elements.Fr   Nú:)r>   r  r:  r;  Ú
startswithrJ  rB  )r%   rP   r9  rA  r&   r&   r'   Úmatch_relations>  s   þzCSSMatch.match_relationsÚidsútuple[str, ...]c                 C  s.   d}|D ]}||   |dd¡krd} |S q|S )zMatch element's ID.TÚidr“   F)r¡   )r%   rP   rN  rA  Úir&   r&   r'   Úmatch_idM  s   ýzCSSMatch.match_idr¨   c                 C  s.   |   |¡}d}|D ]}||vrd} |S q	|S )zMatch element's classes.TF)r©   )r%   rP   r¨   Úcurrent_classesrA  r  r&   r&   r'   Úmatch_classesW  s   
ýzCSSMatch.match_classesc                 C  sÖ   |   |¡}|r7| j|dd}|r7|dur7|  |¡s'|  |¡r"| ¡ s'|  |¡r*d}n| j|dd}|r7|dus|ri| j|dd}|ri|duri|  |¡sY|  |¡rT| ¡ sY|  |¡r\d}n| j|dd}|ri|dusF|S )zMatch element as root.Fr  N)r`   r‡   r6   rO   ÚstriprG   r„   )r%   rP   r`   rƒ   r&   r&   r'   Ú
match_rootb  s<   
ÿÿÿþùÿÿÿþùzCSSMatch.match_rootc                 C  s
   | j |u S )zMatch element as scope.)rñ   rZ   r&   r&   r'   Úmatch_scope|  r/   zCSSMatch.match_scopert   c                 C  s(   |   |¡|   |¡ko|  |¡|  |¡kS )z!Match tag type for `nth` matches.)r   rý   )r%   rP   rt   r&   r&   r'   Úmatch_nth_tag_type  s   þzCSSMatch.match_nth_tag_typeÚnthc                 C  s  d}|D ]‚}d}|j r|  ||j ¡s |S |  |¡}|du r$|  |¡}|j}t|ƒd }|r1|nd}d}	|j}
|j}|j}d}d}|rFdnd}|rP|
| | n|
 }}|rïd}|dk s`||kr¿|dk rd| }|durq|dkrqnNd}||7 }|r|
| | n|
 }}d| }||krŒn3n*|| }|durš|dkršn%d}||7 }|r¨|
| | n|
 }}|| }||krµn
|}|dk s`||ks`|}|
dk rá|dkrß|}||7 }|r×|
| | n|
 }}|dksÉd}|}|rë|
| | n|
 }}d|  krü|d krn nƒd}| j	|||dk ddD ]D}||7 }|  
|¡sq|j r'|  ||j ¡s'q|jr4|  ||¡s4q|	d7 }	|	|krG||u rEd}n n	||u rN nq||u rVn+|}||7 }|dk rbn|rk|
| | n|
}||krsnd|  kr€|d ksþn |s‡ |S q|S )zMatch `nth` elements.TFNr   r   ri   )re   rg   rh   )rï   r=  r]   rR   rj   r,   r3  ÚbÚnro   r6   Úof_typerX  )r%   rP   rY  Úmatchedr[  r_   rj   Ú
last_indexrk   Úrelative_indexr3  rZ  ÚvarÚcountÚ
count_incrÚfactorÚidxÚlast_idxÚadjustÚdiff_lowÚdiffÚ	diff_highÚlowestrt   r&   r&   r'   Ú	match_nth‰  s°   
[
¦
ÿëý


ÿ


âþzCSSMatch.match_nthc                 C  sN   d}| j |ddD ]}|  |¡rd} |S |  |¡r$t |¡r$d} |S q	|S )z)Check if element is empty (if requested).TFr  )ro   r6   rO   ÚRE_NOT_EMPTYÚsearch)r%   rP   Úis_emptyrt   r&   r&   r'   Úmatch_emptyî  s   
ý€ zCSSMatch.match_emptyútuple[ct.SelectorList, ...]c                 C  s"   d}|D ]
}|   ||¡sd}q|S )zMatch selectors.TF)r=  )r%   rP   rï   rã   Úselr&   r&   r'   Úmatch_subselectorsû  s   €zCSSMatch.match_subselectorsÚcontainsútuple[ct.SelectorContains, ...]c           	      C  s˜   d}d}|D ]C}|du r |j r| j|| jd}n| j|| jd}d}|jD ]}|j r<|D ]
}||v r6d} nq,|r; n
q%||v rDd} nq%|sId}q|S )z"Match element if it contains text.TNr³   F)Úownr´   r^   r±   Útext)	r%   rP   rs  rã   ÚcontentÚcontain_listrA  rv  r  r&   r&   r'   Úmatch_contains  s4   
þÿþ€zCSSMatch.match_containsc                 C  s  d}d}| j |dd}|r-|du r-|  |¡dkr |  |¡r |}n| j |dd}|r-|du sd}| jD ]\}}||u rDd}||u rBd} nq2|s‚| j|ddD ]3}|  |¡}	|	dkr\ |S |	dv r|  |dd¡}
|
rt |
¡d	kr| j ||f¡ ||u r~d} |S qN|S )
úMatch default.FNTr³   Úform)ÚinputÚbuttonr8   r“   Úsubmit)	r]   r   rY   rö   rv   r¡   r   rX   r—   )r%   rP   rã   r{  r_   Ú
found_formÚfÚtrt   rW   rš   r&   r&   r'   Úmatch_default   s@   üü
ù€ zCSSMatch.match_defaultc                   sT  d}t tˆ  |d¡ƒ}d‡ fdd„}||ƒ}d}ˆ jD ]\}}}	||u r2||kr2d	}|	d	u r0d	} nq|s¨d}
ˆ j|d	d
D ]\}||u rEq>ˆ  |¡}|dkr–d}d}d}ˆ  |¡D ]<\}}t |¡dkrnt |¡dkrnd	}nt |¡dkr|||kr|d	}n	t |¡dkr…d	}|r•|r•|r•||ƒ|u r•d	}
 nqY|
rš nq>|
sŸd	}ˆ j 	|||f¡ |S )rz  FrW   rP   r    r!   úbs4.Tag | Nonec                   sl   d}ˆ j | dd}|du r4ˆ  |¡dkrˆ  |¡r|}	 |S |}ˆ j |dd}|du r0|}	 |S |du s|S )zFind this input's form.NTr³   r{  )r]   r   rY   )rP   r{  r_   Úlast_parentr-   r&   r'   Úget_parent_formM  s   û÷	z5CSSMatch.match_indeterminate.<locals>.get_parent_formTr³   r|  r8   ÚradioÚcheckedN)rP   r    r!   rƒ  )
r   r   r¡   r÷   rv   r   r£   r   rX   r—   )r%   rP   rã   rW   r…  r{  r  r€  r[  rQ  r‡  rt   Útag_nameÚis_radioÚcheckÚhas_namer    rš   r&   r-   r'   Úmatch_indeterminateG  sP   €
€ÿzCSSMatch.match_indeterminateÚlangsútuple[ct.SelectorLang, ...]c                 C  sº  d}|   ¡ }| j}| j}|}d}d}	|sq|  |¡}
|  |¡D ]8\}}|  ||¡\}}|r.|
r:| js6t |¡n|dksR|rV|
sV|t	krV| jsN|durNt |¡n|dkrV|} nq|}	| j
|| jd}|du ro|	}|  |¡}|	}n|r|du rˆ| jrˆ| jD ]}||d u r‡|d }q{|du r6| jr™|r6|jdkr6d}dD ]%}d}| j|| jdD ]}|  |¡|kr½|  |¡r½d	}|} nq©|sÂ nq|r6|D ]]}|  |¡r|  |¡d
kr|  |¡rd}d}|  |¡D ]6\}}t |¡dkrût |¡dkrûd	}t |¡dkr|}|r|r|}| j tt|ƒtt|ƒf¡  nqç|dur% nqÈ|du r6| j tt|ƒdf¡ |dur[|D ]}d}|D ]}|  |tt|ƒ¡rQd	}qC|sY |S q=|S )zMatch languages.FNÚlangr³   r   r   Úhtml)r  ÚheadTÚmetaz
http-equivzcontent-languagerw  r“   )rü   r\   rù   r‹   r£   r   rú   r   rX   ÚNS_XMLr]   r^   rõ   rW   ro   r   rY   r6   r—   r   r   r'  )r%   rP   r  rã   Úhas_nsr\   rù   r_   Ú
found_langrj   r‹   r    rš   Úattr_nsr(  ÚcacherA  r5   rt   Úc_langrw  Úpatternsr2  r&   r&   r'   Ú
match_lang„  s¦   
ÿÿþþ €
ì
€"€ÿ(€
ÿ

€ýzCSSMatch.match_langÚdirectionalityc              	     s   |t j@ r|t j@ rdS |du sˆ  |¡sdS t t ˆ  |dd¡¡d¡}|dvr-||kS ˆ  	|¡}|r=|du r=t j|kS ˆ  
|¡}|dk}|dk}|dk}|rZt ˆ  |d	d¡¡nd}	|rk|	d
krk|du rkt j|kS |rq|	dv ss|rÌ|dkrÌ|r‹d ‡ fdd„ˆ j|ddD ƒ¡}
n
ttˆ  |dd¡ƒ}
|
rº|
D ]}t |¡}|dv r´|dkr«t jnt j}||k  S q™t j|kS |rÁt j|kS ˆ  ˆ j|dd|¡S |rÒ|du sÖ|dkrõˆ  |¡}|durã||kS |rêt j|kS ˆ  ˆ j|dd|¡S ˆ  ˆ j|dd|¡S )zCheck directionality.FNr  r“   )Nr   r|  r  r  r8   Útel)rv  rm  rœ  ÚurlÚemailr   c                 3  s    | ]
}ˆ   |¡r|V  qd S r¸   r«   r¬   r-   r&   r'   Ú	<genexpr>ú  s   € z%CSSMatch.match_dir.<locals>.<genexpr>Tr³   r‘   r	  r  )r  r  r  rY   r  r  r   rX   r¡   r`   r   r°   rd   r   r   r  r  Ú	match_dirr]   r  )r%   rP   r›  r  r`   rW   Úis_inputÚis_textareaÚis_bdirÚ   r‘   r  r  r&   r-   r'   r   Ú  sP   



$
þ



zCSSMatch.match_dirÚ	conditionc              
   C  s2  d}t  |  |d¡¡}t |tt|  |dd¡ƒ¡}t |tt|  |dd¡ƒ¡}|du r1|du r1dS t |tt|  |dd¡ƒ¡}|dur|dv r^|durQ||k rQd}|s]|dur]||kr]d}n1|d	kr|dury|dury||kry||k rx||krxd}n|durƒ||k rƒd}|s|dur||krd}|tj@ r—| S |S )
ac  
        Match range.

        Behavior is modeled after what we see in browsers. Browsers seem to evaluate
        if the value is out of range, and if not, it is in range. So a missing value
        will not evaluate out of range; therefore, value is in range. Personally, I
        feel like this should evaluate as neither in or out of range.
        Fr8   ÚminNÚmaxr‘   )rÜ   rß   r¾   rÉ   rà   rá   TrÞ   )	r   rX   r¡   r»   rí   r   r   r  ÚSEL_IN_RANGE)r%   rP   r¤  Úout_of_rangerÚ   ÚmnÚmxr‘   r&   r&   r'   Úmatch_range  s0   
€€zCSSMatch.match_rangec                 C  s<   |   |¡}|duo| d¡dkp| d¡dkp|  |¡duS )aã  
        Match defined.

        `:defined` is related to custom elements in a browser.

        - If the document is XML (not XHTML), all tags will match.
        - Tags that are not custom (don't have a hyphen) are marked defined.
        - If the tag has a prefix (without or without a namespace), it will not match.

        This is of course requires the parser to provide us with the proper prefix and namespace info,
        if it doesn't, there is nothing we can do.
        NrË   ri   rK  )r   Úfindr  rÿ   r&   r&   r'   Úmatch_defined=  s   
ÿüzCSSMatch.match_definedc                 C  s   d}|   |¡}|dv rd}|S )z«
        Match placeholder shown according to HTML spec.

        - text area should be checked if they have content. A single newline does not count as content.

        F)r“   Ú
T)r±   )r%   rP   rã   rw  r&   r&   r'   Úmatch_placeholder_shownT  s
   
z CSSMatch.match_placeholder_shownc           	      C  s
  d}|j }|j}|r| j}| j}dti| _d| _|r| jrú|D ]Ú}|}t|tjƒr*q|  ||j	¡s2q|j
tj@ r>|  |¡s>q|j
tj@ rJ|  |¡sJq|j
tj@ rV|  |¡sVq|j
tj@ rb|  |¡sbq|  ||j¡sjq|j
tj@ rv|  |¡svq|jr|  ||j¡sq|jrŒ|  ||j¡sŒq|  ||j¡s”q|j
t@ r£|  ||j
t@ ¡s£q|jr®|   ||j¡s®q|j!r¹|  "||j!¡s¹q|j#rÄ|  $||j#¡sÄq|j
tj%@ rÐ|  &|¡sÐq|j
tj'@ rÜ|  (|¡sÜq|j
t)@ rë|  *||j
t)@ ¡sëq|j+rö|  ,||j+¡söq| } |r|| _|| _|S )z.Check if element matches one of the selectors.Fr  T)-Úis_notr^   rò   rø   r‰   r>   r  r:  r8  r5   rô   ÚSEL_DEFINEDr­  ÚSEL_ROOTrV  Ú	SEL_SCOPErW  ÚSEL_PLACEHOLDER_SHOWNr¯  rk  rY  Ú	SEL_EMPTYro  rN  rR  r¨   rT  r5  r.  ÚRANGESr«  r  rš  rï   rr  r9  rM  ÚSEL_DEFAULTr‚  ÚSEL_INDETERMINATErŒ  Ú	DIR_FLAGSr   rs  ry  )	r%   rP   rï   rã   r°  r^   rò   rø   Úselectorr&   r&   r'   r=  c  sn   

zCSSMatch.match_selectorsr   ÚlimitúIterator[bs4.Tag]c                 c  sV    |dk rdn|}|   | j¡D ]}|  |¡r(|V  |dur(|d8 }|dk r( dS qdS )z&Match all tags under the targeted tag.r   N)rv   r5   rã   )r%   r»  Úlimrt   r&   r&   r'   Úselect·  s   €
€úzCSSMatch.selectrƒ  c                 C  sH   | j }d}|du r"|dur"|  |¡r|}n|  |¡}|du r"|dus|S )úMatch closest ancestor.N)r5   rã   r]   )r%   ÚcurrentÚclosestr&   r&   r'   rÁ  Ä  s   

üzCSSMatch.closestúlist[bs4.Tag]c                   s   ‡ fdd„ˆ   ˆ j¡D ƒS )zFilter tag's children.c                   s$   g | ]}ˆ   |¡sˆ  |¡r|‘qS r&   )rK   rã   )r­   r5   r-   r&   r'   r®   Ó  ó   $ z#CSSMatch.filter.<locals>.<listcomp>)rd   r5   r-   r&   r-   r'   ÚfilterÐ  ó   zCSSMatch.filterc                 C  s$   |   |¡ o|  |¡o|  || j¡S ©zMatch.)rB   r6   r=  rï   rZ   r&   r&   r'   rã   Õ  s   $zCSSMatch.matchN)
rï   rð   rñ   r    rò   ró   rô   r½   r!   r"   )r!   r<   )rP   r    r!   r   rµ   r·   )rP   r    r!   rf   )r  r   r  r   r!   r<   )rP   r    r(  r   r}   rw   r!   rœ   )rP   r    r5   r*  r!   r<   )rP   r    r.  r/  r!   r<   )rP   r    r5   r7  r!   r<   )rP   r    r9  rð   r!   r<   r¶   )r_   r    r9  rð   rC  r<   r!   r<   )rP   r    rN  rO  r!   r<   )rP   r    r¨   rO  r!   r<   )rP   r    rt   r    r!   r<   )rP   r    rY  r    r!   r<   )rP   r    rï   rp  r!   r<   )rP   r    rs  rt  r!   r<   )rP   r    r  rŽ  r!   r<   )rP   r    r›  r½   r!   r<   )rP   r    r¤  r½   r!   r<   )rP   r    rï   rð   r!   r<   ©r   )r»  r½   r!   r¼  )r!   rƒ  )r!   rÂ  )*r0   r1   r2   r3   r(   rü   rý   rY   r   r  r  r'  r)  r-  r5  r6  r8  rB  rE  rJ  rM  rR  rT  rV  rW  rX  rk  ro  rr  ry  r‚  rŒ  rš  r   r«  r­  r¯  r=  r¾  rÁ  rÄ  rã   r&   r&   r&   r'   rî   á  sP    

)





$
8
5


	










e

	

'
=
V
;
(

T

rî   c                      sž   e Zd ZU dZded< ded< ded< ded	< d
ed< dZd(‡ fdd„Zd)dd„Zd*dd„Zd+dd„Z	d*dd„Z
d,d-d!d"„Zd,d.d$d%„Zd/d&d'„ZeZ‡  ZS )0Ú	SoupSievez-Compiled Soup Sieve selector matching object.r   r2  rð   rï   ró   rò   zdict[str, str]Úcustomr½   rô   )r2  rï   rò   rÉ  rô   Ú_hashúct.CustomSelectors | Nonec                   s   t ƒ j|||||d dS )r#   )r2  rï   rò   rÉ  rô   N)Úsuperr(   )r%   r2  rï   rò   rÉ  rô   ©Ú	__class__r&   r'   r(   æ  s   

ûzSoupSieve.__init__r5   r    r!   r<   c                 C  s   t | j|| j| jƒ |¡S rÆ  )rî   rï   rò   rô   rã   ©r%   r5   r&   r&   r'   rã   ø  rÅ  zSoupSieve.matchc                 C  s   t | j|| j| jƒ ¡ S )r¿  )rî   rï   rò   rô   rÁ  rÏ  r&   r&   r'   rÁ  ý  s   zSoupSieve.closestÚiterableúIterable[bs4.Tag]rÂ  c                   s4   t  |¡rt ˆ j|ˆ jˆ jƒ ¡ S ‡ fdd„|D ƒS )a‘  
        Filter.

        `CSSMatch` can cache certain searches for tags of the same document,
        so if we are given a tag, all tags are from the same document,
        and we can take advantage of the optimization.

        Any other kind of iterable could have tags from different documents or detached tags,
        so for those, we use a new `CSSMatch` for each item in the iterable.
        c                   s$   g | ]}t  |¡sˆ  |¡r|‘qS r&   )rî   rK   rã   r¬   r-   r&   r'   r®     rÃ  z$SoupSieve.filter.<locals>.<listcomp>)rî   r6   rï   rò   rô   rÄ  )r%   rÐ  r&   r-   r'   rÄ    s   
zSoupSieve.filterc                 C  s   | j |dd}|r|d S dS )zSelect a single tag.r   )r»  r   N)r¾  )r%   r5   rh   r&   r&   r'   Ú
select_one  s   zSoupSieve.select_oner   r»  c                 C  s   t |  ||¡ƒS )zSelect the specified tags.)ÚlistÚiselect©r%   r5   r»  r&   r&   r'   r¾    s   zSoupSieve.selectr¼  c                 c  s&    t | j|| j| jƒ |¡E dH  dS )zIterate the specified tags.N)rî   rï   rò   rô   r¾  rÕ  r&   r&   r'   rÔ    s   €$zSoupSieve.iselectc              	   C  s&   d| j ›d| j›d| j›d| j›d	S )zRepresentation.zSoupSieve(pattern=z, namespaces=z	, custom=z, flags=ú))r2  rò   rÉ  rô   r-   r&   r&   r'   Ú__repr__#  s   ÿÿÿzSoupSieve.__repr__)
r2  r   rï   rð   rò   ró   rÉ  rË  rô   r½   )r5   r    r!   r<   )r5   r    r!   r    )rÐ  rÑ  r!   rÂ  rÇ  )r5   r    r»  r½   r!   rÂ  )r5   r    r»  r½   r!   r¼  )r!   r   )r0   r1   r2   r3   Ú__annotations__Ú	__slots__r(   rã   rÁ  rÄ  rÒ  r¾  rÔ  r×  Ú__str__Ú__classcell__r&   r&   rÍ  r'   rÈ  Û  s"   
 




rÈ  );r3   Ú
__future__r   r   r“   r   Úrer   r  r  r?   Útypingr   r   r	   r
   r   r   Úcompilerl  r¦   r<  r>  r?  r@  rF  rG  rH  rI  r‰   r“  r  r  r¹  r§  ÚSEL_OUT_OF_RANGEr¶  r  ré   rç   rå   ræ   râ   rè   r  rÅ   rÂ   rÆ   rÁ   rÄ   rÃ   ÚDAYS_IN_WEEKr   r4   r»   rî   Ú	ImmutablerÈ  Úpickle_registerr&   r&   r&   r'   Ú<module>   sv     

ý




ÿ
  -g        S