/ lib / soupsieve / css_parser.pyc
css_parser.pyc
  1  o

  2  t�c#��@s�dZddlZddlmZddlmZddlmZddlmZ	ddlm
  3  Z
  4  ddlZdd	lm
Z
mZmZmZmZmZmZmZmZmZd
  5  Zhd�Zhd�Zhd
�Zhd�Zhd�ZeeBeBeBeBZdZd�e�Z dZ!dje e!d�Z"dje d�Z#dje ed�Z$dje#d�Z%dje"d�Z&djee%d�Z'dje"e'd�Z(d je%d!�Z)d"je%d!�Z*d#je%d!�Z+d$je"e%e(d%�Z,d&je"e%d'�Z-d(je"e%d'�Z.d)je%d!�Z/d*je"d�Z0d+�e-�Z1d,je%d!�Z2d-je.e"e!e e&d.�Z3d/je.e"e&d0�Z4d1je.e"e'd2�Z5d3je.e"d4�Z6d5je e"d6�Z7d1je.e"e'd2�Z8e�9d7je"d�ej:�Z;e�9d8je ed�ej:�Z<e�9d9je"d�ej:�Z=e�9d:je"e'd�ej>�Z?e�9e �Z@e�9d;�e"��ZAe�9d<�e"��ZBe�9d=�e/�ej>�ZCd>ZDd?ZEdZFd@ZGdAZHdBZIdCZJdDZKdEZLdFZMdGZNdHZOdIZPdJZQeeQdK�dLeRdMe
e	jSdNe
e	jTdOeUdPejVf
  6  dQdR��ZWdudSdT�ZXdNe
e	jTdPeeReeRe	jYfffdUdV�ZZdvdXeRdYe[dPeRfdZd[�Z\d\eRdPeRfd]d^�Z]Gd_d`�d`�Z^Gdadb�dbe^�Z_Gdcdd�dd�Z`Gdedf�df�Zaeadg�jbeFeJBdh�Zceadi�jbeFeJBdh�Zdeadj�jbeFeJBeIBdh�Zeeadk�jbeFeJBeKBdh�Zfeadl�jbeFeJBdh�Zgeadm�jbeFeJBdh�Zheadn�jbeFeJBdh�Zieado�jbeFeJBdh�Zjeadp�jbeFeJBeOBdh�Zkeadq�jbeFdh�Zleadr�jbeFeJBdh�Zmeads�jbeFeJBdh�Zneadt�jbeFeMBeJBdh�Zoeadt�jbeFeNBeJBdh�ZpdS)wzCSS selector parser.�N)�	lru_cache�)�util)�	css_match)�	css_types)�SelectorSyntaxError)
  7  �Optional�Dict�Match�Tuple�Type�Any�List�Union�Iterator�casti��>�
:last-of-type�	:required�:scope�:default�:last-child�
:out-of-range�
  8  :read-only�:first-child�:indeterminate�:first-of-type�:defined�	:disabled�	:optional�:enabled�
:only-of-type�:checked�:placeholder-shown�:only-child�:link�:empty�:root�:read-write�	:in-range�	:any-link>z:focusz:focus-visiblez:targetz:pastz:futurez:local-linkz:hoverz:target-withinz:playingz:visitedz
:user-invalidz:activez
:focus-withinz:paused�:host�:current>�:where�:-soup-contains�:is�	:contains�:-soup-contains-own�:not�:hasz:matches>z
:host-contextr*r+>�:nth-last-of-type�:lang�:nth-of-type�:nth-last-child�
  9  :nth-child�:dirz(?:\r\n|(?!\r\n)[\n\f\r])z(?:[ \t]|{})z"(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)z(?:{ws}|{comments}))�ws�commentsz*(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$)))r9z/(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$|{nl})))r9�nlz�
 10  (?:(?:-?(?:[^\x00-\x2f\x30-\x40\x5B-\x5E\x60\x7B-\x9f]|{esc})+|--)
 11  (?:[^\x00-\x2c\x2e\x2f\x3A-\x40\x5B-\x5E\x60\x7B-\x9f]|{esc})*)
 12  )�escz>(?:[-+])?(?:[0-9]+n?|n)(?:(?<=n){ws}*(?:[-+]){ws}*(?:[0-9]+))?zT
 13  (?:"(?:\\(?:.|{nl})|[^\\"\r\n\f]+)*?"|'(?:\\(?:.|{nl})|[^\\'\r\n\f]+)*?'|{ident}+)
 14  )r;�identzU
 15  (?:{ws}*(?P<cmp>[!~^|*$]?=){ws}*(?P<value>{value})(?:{ws}+(?P<case>[is]))?)?{ws}*\]
 16  )r9�valuez	\#{ident})r=z	\.{ident}z6(?P<tag_ns>(?:{ident}|\*)?\|)?(?P<tag_name>{ident}|\*)zD
 17  \[{ws}*(?P<attr_ns>(?:{ident}|\*)?\|)?(?P<attr_name>{ident}){attr}
 18  )r9r=�attrz$(?P<name>:{ident})(?P<open>\({ws}*)?)r9r=z#(?P<name>:{ident})(?P<open>\({ws}*)z(?P<name>:(?=--){ident})z{ws}*\)z:{}z	@P{ident}z}
 19  (?P<pseudo_nth_child>{name}
 20  (?P<nth_child>{nth}|even|odd))(?:{wsc}*\)|(?P<of>{comments}*{ws}{wsc}*of{comments}*{ws}{wsc}*))
 21  )�name�wscr:r9�nthzA
 22  (?P<pseudo_nth_type>{name}
 23  (?P<nth_type>{nth}|even|odd)){ws}*\)
 24  )r@r9rBz7{name}(?P<values>{value}(?:{ws}*,{ws}*{value})*){ws}*\))r@r9r>z{name}(?P<dir>ltr|rtl){ws}*\))r@r9z0{wsc}*?(?P<relation>[,+>~]|{ws}(?![,+>~])){wsc}*)r9rAz0(?:(\\[a-f0-9]{{1,6}}{ws}?)|(\\[^\r\n\f])|(\\$))z9(?:(\\[a-f0-9]{{1,6}}{ws}?)|(\\[^\r\n\f])|(\\$)|(\\{nl}))zL(?P<s1>[-+])?(?P<a>[0-9]+n?|n)(?:(?<=n){ws}*(?P<s2>[-+]){ws}*(?P<b>[0-9]+))?z-(?:(?P<value>{value})|(?P<split>{ws}*,{ws}*))z^{}*z{}*$z^{}$�,� ����� �@��iii�)�maxsize�pattern�
 25  namespaces�custom�flags�returncCs(t|�}t�|t|||d���|||�S)zCached CSS compile.�rPrQ)�process_custom�cm�	SoupSieve�	CSSParser�process_selectors)rNrOrPrQ�custom_selectors�rZ��C:\Users\Jacks.GUTTSPC\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\soupsieve\css_parser.py�_cached_css_compile�s	��r\cCst��dS)zPurge the cache.N)r\�cache_clearrZrZrZr[�_purge_cache�sr^cCsji}|dur3|��D](\}}t�|�}t�|�dur!td�|���||vr,td�|���||t|�<q
 26  |S)zProcess custom.Nz5The name '{}' is not a valid custom pseudo-class namez4The custom selector '{}' has already been registered)	�itemsr�lower�	RE_CUSTOM�matchr�format�KeyError�css_unescape)rPrY�keyr>r@rZrZr[rT�s
 27  rTF�content�stringcCs*dttdtfdd�}|stnt�||�S)zs
 28      Unescape CSS value.
 29  
 30      Strings allow for spanning the value on multiple strings by escaping a new line.
 31      �mrRcSst|�d�rt|�d�dd�d�}|dkrt}t|�}|S|�d�r-|�d�dd�}|S|�d�r6d}|Sd}|S)	z(Replace with the appropriate substitute.rNrHrrE����)�group�int�UNICODE_REPLACEMENT_CHAR�chr)ri�	codepointr>rZrZr[�replaces
 32  
 33  �
 34  ��zcss_unescape.<locals>.replace)r
 35  �str�
 36  RE_CSS_ESC�RE_CSS_STR_ESC�sub)rgrhrrrZrZr[re�srer=cCsjg}t|�}|dko|ddk}|dkr|r|�d�|��n�t|�D]�\}}t|�}|dkr5|�d�q#d|kr?dksDn|dkrM|�d�|��q#|dksW|rl|dkrld	|krad
 37  krlnn	|�d�|��q#|dvs�|dks�d	|kr~d
 38  ks�nd	|kr�d
 39  ks�nd
|kr�dks�nd|kr�dkr�nn|�|�q#|�d�|��q#d�|�S)zEscape identifier.r�-rz\{}rk��z\{:x} �0�9)�-�_rK�A�Z�a�zrl)�len�appendrc�	enumerate�ord�join)r=rh�lengthZ
 40  start_dash�index�crqrZrZr[�escapes$,&D
 41  r�c
 42  @sVeZdZdZdededdfdd�Zdefdd	�Zd
 43  edededee	efd
d�Z
 44  dS)�SelectorPattern�Selector pattern.r@rNrRNcCs&||_t�|tjtjBtjB�|_dS)�Initialize.N)r@�re�compile�I�X�U�
 45  re_pattern)�selfr@rNrZrZr[�__init__4s zSelectorPattern.__init__cCs|jS)�	Get name.)r@�r�rZrZr[�get_name:szSelectorPattern.get_name�selectorr�rQcCs|j�||�S)�Match the selector.)r�rb)r�r�r�rQrZrZr[rb?szSelectorPattern.match)�__name__�
 46  __module__�__qualname__�__doc__rsr�r�rnrr
 47  rbrZrZrZr[r�1s
 48  &r�c
 49  @sreZdZdZdeeeeedfeeefdfddfdd�Zdefdd	�Z	d
 50  ede
 51  de
 52  deeefd
d�Z
dS)�SpecialPseudoPatternr��patterns.rRNcCshi|_|D]}|d}|d||d�}|dD]}||j|<qqd|_t�ttjtjBtjB�|_dS)r�rrjrErN)	r��matched_namer�r��PAT_PSEUDO_CLASS_SPECIALr�r�r��re_pseudo_name)r�r��pr@rN�pseudorZrZr[r�Hs� zSpecialPseudoPattern.__init__cCs|jdurdS|j��S)r�Nrl)r�r�r�rZrZr[r�UszSpecialPseudoPattern.get_namer�r�rQcCsVd}|j�||�}|r)t�t|�d���}|j�|�}|r)|�|||�}|r)||_|S)r�Nr@)	r�rbrr`rermr��getr�)r�r�r�rQr�rir@rNrZrZr[rbZszSpecialPseudoPattern.match)r�r�r�r�rrsrr�r�r�rnrr
 53  rbrZrZrZr[r�Es
 54  2
&r�c@sfeZdZdZdeddfdd�Zdeddejfdd	�Z	de
 55  ejejffd
 56  d�Z
defdd
�ZeZdS)�	_Selectorz�
 57      Intermediate selector class.
 58  
 59      This stores selector data for a compound selector as we are acquiring them.
 60      Once we are done collecting the data for a compound selector, we freeze
 61      the data in an object that can be pickled and hashed.
 62      �kwargsrRNcKs�|�dd�|_|�dg�|_|�dg�|_|�dg�|_|�dg�|_|�dg�|_|�dg�|_|�d	d�|_|�d
 63  g�|_	|�dg�|_
 64  |�dd
�|_|�dd�|_dS)r��tagN�ids�classes�
 65  attributesrB�	selectors�	relations�rel_type�contains�langrQr�no_matchF)
r�r�r�r�r�rBr�r�r�r�r�rQr�)r�r�rZrZr[r�ssz_Selector.__init__r�cCs8|r|d}|j�|dd��t�|��g�St��S)zFreeze relation.rrN)r��extend�ct�SelectorList�freeze)r�r��selrZrZr[�_freeze_relations�s
 66  z_Selector._freeze_relationsc
Csd|jrt��St�|jt|j�t|j�t|j�t|j	�t|j
 67  �|�|j�|j
t|j�t|j�|j�S)zFreeze self.)r�r��SelectorNull�Selectorr��tupler�r�r�rBr�r�r�r�r�r�rQr�rZrZr[r��s
 68  �z_Selector.freezecCs8d�|j|j|j|j|j|j|j|j|j	|j
 69  |j|j�S)zString representation.z�_Selector(tag={!r}, ids={!r}, classes={!r}, attributes={!r}, nth={!r}, selectors={!r}, relations={!r}, rel_type={!r}, contains={!r}, lang={!r}, flags={!r}, no_match={!r}))
rcr�r�r�r�rBr�r�r�r�r�rQr�r�rZrZr[�__str__�s��z_Selector.__str__)r�r�r�r�r
r�rr�r�r�rr�r�r�rsr��__repr__rZrZrZr[r�js
 70  r�c@s.eZdZdZede�eddeefddeefdde	efd	d
 71  e
 72  efddeeff�ed
e�ede
�ede�ede�ede�ede�ede�ede�ede�fZ		dIdedeeeeeejffdeddfdd�Zdedeed e de fd!d"�Z!dedeed e de fd#d$�Z"dedeed e de fd%d&�Z#dedeed e d'e$e%eeefd(e de%e e ffd)d*�Z&dedeed e d'e$e%eeefde f
 73  d+d,�Z'ded-ed e d'e$e%eeefd.ede fd/d0�Z(dedeed e d1e)ed2ed.ede%e eeffd3d4�Z*dedeed e d1e)ed5e)ed6e d7e d.ede%e effd8d9�Z+dedeed e de fd:d;�Z,dedeed e de fd<d=�Z-dedeed e de fd>d?�Z.dedeed e de fd@dA�Z/		dJd'e$e%eeefd.ededejfdBdC�Z0dDede$e%eeeffdEdF�Z1dJd.ededejfdGdH�Z2dS)KrWzParse CSS selectors.�pseudo_close�pseudo_contains)r/r-r0�pseudo_nth_child)r7r6�pseudo_nth_type)r5r3�pseudo_lang)r4�
 74  pseudo_dir)r8�pseudo_class_custom�pseudo_class�pseudo_element�at_rule�id�classr��	attribute�combineNrr�rPrQrRcCs>|�dd�|_||_|jtj@|_|duri|_dS||_dS)r��rkN)rrrNrQr�DEBUG�debugrP)r�r�rPrQrZrZr[r��szCSSParser.__init__r�ri�has_selectorcCsPd}|�d�}|�d�rt�|�d��nd}|�d�r&t|�d�dd��nd}t|�d��}d}	d}
 75  d}|rD|d	kr>tjnd
 76  tjB}nt�|�dkrTtjtjB}d}	ntj}|ru|�d
��d�rnt|�d
�dd�d�}nt|�d
��}|szd}
nr|�d�r�t�dt�	|�|�}
na|�d�r�t�dt�	|�|�}
nP|�d�r�t�dt�	|�|�}
n?|�d�r�|r�t
 77  �|�r�dnt�	|�}t�d||�}
n#|�d�r�t�dt�	|�|�}
nt�dt�	|�|�}
|�d�r�d}|	r�|
r�t�|
j�}
 78  t
�|||
|
 79  �}|�rt�}|j�|�t
�|��gdd�}|j�|�d}|S|j�|�d}|S)z8Create attribute selector from the returned regex match.F�cmp�caseN�attr_ns�����rl�	attr_name�ir�typeTr>��"�'r�^z^%s.*�$z.*?%s$�*z.*?%s.*�~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*�|z^%s(?:-.*)?$z^%s$�!)rmrr`rer�r��DOTALL�
 80  startswithr�r��RE_WS�searchrNr��SelectorAttributer�r�r�r�r�r�)r�r�rir��inverse�opr��nsr?�is_type�pattern2r>rQrNZsel_attrZsub_selZnot_listrZrZr[�parse_attribute_selector�s^
 81  $
 82  
 83  
 84  
 85  
 86  
 87  �z"CSSParser.parse_attribute_selectorcCsH|�d�rt|�d�dd��nd}t|�d��}t�||�|_d}|S)z#Parse tag pattern from regex match.�tag_nsNr��tag_nameT)rmrer��SelectorTagr�)r�r�rir��prefixr�rZrZr[�parse_tag_pattern s
 88  $zCSSParser.parse_tag_patterncCs�t�t|�d���}|j�|�}|dur%td�||�d��|j	|�d���t
 89  |tj�sA|j|=t
||j|jd�jtd�}||j|<|j�|�d}|S)z�
 90          Parse custom pseudo class alias.
 91  
 92          Compile custom selectors as we need them. When compiling a custom selector,
 93          set it to `None` in the dictionary so we can avoid an infinite loop.
 94          r@Nz3Undefined custom selector '{}' found at position {}rrS�rQT)rr`rermrPr�rrc�endrN�
 95  isinstancer�r�rWrQrX�
 96  FLG_PSEUDOr�r�)r�r�rir�r�r�rZrZr[�parse_pseudo_class_custom)s&�
 97  ��
 98  z#CSSParser.parse_pseudo_class_custom�	iselector�is_htmlcCs�d}t�t|�d���}|�d�rd}|r)|tvr)|�|||||�d��}||fS|�s�|tv�r�|dkr?|jt	j
 99  O_�nY|dkrO|jt	jO_d}�nI|dkr]|jt	jO_�n;|d	krk|jt	j
O_�n-|d
100  vrw|j�t��n!|dkr�|j�t��n|dkr�|j�t��n	|d
kr�|j�t�n�|dkr�|j�t�n�|dkr�|j�t�n�|dkr�|j�t�n�|dkr�|j�t�n�|dkr�|j�t�n�|dkr�|j�t�n�|dkr�|j�t�n�|dkr�|j�t�n�|dkr�|j�t�n�|dk�r|j�t	�dddddt	����n�|dk�r)|j�t	�dddddt	����no|dk�r?|j�t	�dddddt	����nY|dk�rU|j�t	�dddddt	����nC|dk�rw|j� t	�dddddt	���t	�dddddt	���g�n!|dk�r�|j� t	�dddddt	���t	�dddddt	���g�d}||fS|�r�|t!v�r�|�"||�d�t#t$B�d|_%d}||fS|�s�|t&v�r�d|_%d}||fS|t'v�r�t(d�)|�|j*|�+d���t,d�)|���) zParse pseudo class.Fr@�openTrr&rrr%)r$r)r!rrrrrrrr'r(rr"rrrrrr#r z$Invalid syntax for pseudo class '{}'z1'{}' pseudo-class is not implemented at this time)-rr`rerm�PSEUDO_COMPLEX�parse_pseudo_openr��
PSEUDO_SIMPLErQr��SEL_ROOT�SEL_DEFINED�	SEL_SCOPE�	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_SHOWNrB�SelectorNthr�r��PSEUDO_COMPLEX_NO_MATCH�parse_selectorsr��FLG_OPENr��PSEUDO_SIMPLE_NO_MATCH�PSEUDO_SUPPORTEDrrcrN�start�NotImplementedError)r�r�rir�r�r�Zcomplex_pseudor�rZrZr[�parse_pseudo_classEs�
101  
102  N�
103  "
104  "
105  "
106  "
107  ��
108  ����
109  ���zCSSParser.parse_pseudo_classcCs0|��}|�d�rd}nd}t�t|d��|d<t�|�d|��}|dkr.d}d}	d	}
110  nq|d
111  kr9d}d}	d	}
112  nftttt�	|��}|�
113  d�rQ|�
114  d�d
krQd
nd}|�
115  d�}
|
�d�}
116  |
�d�rg|d7}n|
117  rr||
dd�7}n||
7}|�
118  d�r�|�
119  d�d
kr�d
nd}|�
120  d�r�||�
121  d�7}nd}t
|d�}t
|d�}	|d}|dkr�|�
122  d�r�|�||�d�ttB�}nt}|dkr�|j�t�||
123  |	dd|��d	}|S|dkr�|j�t�||
124  |	dd	|��d	}|S|dkr�|j�t�||
125  |	d	dt����d	}|S|dk�r|j�t�||
126  |	d	d	t����d	}|S)zParse `nth` pseudo.r��_child�_typer@rB�evenrErT�oddr�s1rwrl�a�n�1Nr��s2�b�0�
127  �ofr7Fr6r5r3)�	groupdictr�rr`rerr
128  rs�RE_NTHrbrm�endswithr�rnrr�r�r�CSS_NTH_OF_S_DEFAULTrBr�r�rr�)r�r�rir�r��mdict�postfixrgrr�varZ	nth_partsZ_s1rZ_s2Z
129  pseudo_selZnth_selrZrZr[�parse_pseudo_nth�sd	
130   
131  
132  
133  
134   
135  
136  
137  
138  �� 
139  � zCSSParser.parse_pseudo_nthr@r�cCs^ttB}|dkr
|tO}n|dkr|ttBO}n|dvr |tO}|j�|�|||��d}|S)z"Parse pseudo with opening bracket.r1r2)r,r.T)r�r�FLG_NOT�FLG_RELATIVE�FLG_FORGIVEr�r�r)r�r�r@r�r�r�rQrZrZr[r��s
140  
141  zCSSParser.parse_pseudo_openr�r�cCs�|�d���}|st}|tkr*|sd|_||_|dj�|�dt}|�t��n$|r8||_|dj�|�n|dd�tkrJt	d�
142  |�|j|��d|}t�}d}|||fS)	�Parse combinator tokens.�relationTr��:rNz'The multiple combinators at position {}F)rm�strip�
WS_COMBINATOR�COMMA_COMBINATORr�r�r�r�r�rrcrN)r�r�rir�r�r�r��
143  combinatorrZrZr[�parse_has_combinator�s.�
144  zCSSParser.parse_has_combinatorr��	is_pseudo�
145  is_forgivec	
146  Cs�|�d���}	|	st}	|s0|r|	tkrtd�|	|�|j|��|	tkr/d|_|dd�=|�|�n4|	tkrQ|j	s@|s@t
147  �dd�|_	|j�
|�|�|�|dd�=n|j�
|�|	|_|dd�=|�|�t�}d}||fS)r-r.zBThe combinator '{}' at position {}, must have a selector before itTNr�F)rmr0r1r2rrcrNr�r�r�r�r�r�r�r�r�)
148  r�r�rir�r�r�r5r6r�r3rZrZr[�parse_combinator,s8

149  �
150  
151  �
152  
153  
154  
155  zCSSParser.parse_combinatorcCsT|�d�}|�d�r|j�t|dd���d}|S|j�t|dd���d}|S)zParse HTML classes and ids.r�.rNT)rmr�r�r�rer�)r�r�rir�r�rZrZr[�parse_class_id\s
156  
157  �zCSSParser.parse_class_idc
158  Cs�t�t|�d���}|dkrt�dt�|dk}t|�d��}g}t�|�D]%}|�d�r.q&|�d�}	|	�	d�rBt|	d	d
159  �d�}	nt|	�}	|�
160  |	�q&|j�
161  t�
||��d}|S)zParse contains.r@r/z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.r0�values�splitr>)r�r�rr�T)rr`rerm�warnings�warn�
FutureWarning�	RE_VALUES�finditerr�r�r�r��SelectorContains)
162  r�r�rir�r�Zcontains_ownr:r��tokenr>rZrZr[�parse_pseudo_containsgs(�
163  
164  
165  zCSSParser.parse_pseudo_containscCs~|�d�}g}t�|�D]%}|�d�rq|�d�}|�d�r(t|dd�d�}nt|�}|�|�q|j�t�|��d}|S)zParse pseudo language.r:r;r>r�rr�T)	rmr?r@r�rer�r�r��SelectorLang)r�r�rir�r:r�rBr>rZrZr[�parse_pseudo_lang�s
166  
167  
168  
169  zCSSParser.parse_pseudo_langcCs6t�|�d��dkr
tjntj}|j|O_d}|S)zParse pseudo direction.�dir�ltrT)rr`rmr��SEL_DIR_LTR�SEL_DIR_RTLrQ)r�r�rir�r>rZrZr[�parse_pseudo_dir�s zCSSParser.parse_pseudo_dirc
170  Cs�t�}g}d}d}g}dt}	t|t@�}
171  t|t@�}t|t@�}t|t@�}
t|t@�}t|t@�}t|t	@�}t|t
172  @�}t|t@�}t|t@�}t|t
@�}|jr�|rZtd�|
173  r`td�|rftd�|
rltd�|rrtd�|rxtd�|r~td	�|r�td
174  �|r�td�|r�td�|r�td
�|r�|�t���z	t|�\}}|dkr�td�|�d����|dkr�|�|||�}n�|dkr�|�|||||�\}}n�|dkr�td�|�d����|dkr�|�|||�}n�|dvr�|�||||�}n�|dk�r|�|||�}n�|dk�r|�|||�}d}n�|dk�rH|�s2|�s/td�|�d��|j|�d���d|_|
175  �r8d}nttd�|�d��|j|�d���|dk�rm|�r^|�|||||	|�\}}}	nH|�||||||||�\}}n9|dk�rz|� |||�}n,|dk�r�|�r�td �|�d��|j|�d���|�!|||�}n|d!v�r�|�"|||�}|�#d�}q�Wn
176  t$�y�Ynw|
177  �r�|�s�td"�|�|j|��|�r�|j%�s�|�s�t&�'d#d$�|_%|�r�|	|_(|d%j)�|�nM|j)�*|�|d$d$�=|�|�n<|�r5|�r |�r|d%j(d$u�r|	d&k�r|	|_(d|_|d%j)�|�d}n|�r&|�s5d|_|d$d$�=|�|�d}|�sBtd�|�|j|��|�rKt&j+|d%_,|�rTt&j-|d%_,|�r]t&j.|d%_,|�rft&j/|d%_,|�rot&j0|d%_,t&�1d'd(�|D�|
|�S))zParse selectors.Fr/z    is_pseudo: Truez    is_open: Truez    is_relative: Truez    is_not: Truez    is_html: Truez    is_default: Truez    is_indeterminate: Truez    is_in_range: Truez    is_out_of_range: Truez    is_placeholder_shown: Truez    is_forgive: TrueTr�zAt-rules found at position {}rr�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�z5Tag name found at position {} instead of at the start)r�r�z$Unclosed pseudo-class at position {}r�Nr�z: cSsg|]}|���qSrZ)r�)�.0�srZrZr[�
178  <listcomp>Ysz-CSSParser.parse_selectors.<locals>.<listcomp>)2r�r1�boolrr�r+r*�FLG_HTML�FLG_DEFAULT�FLG_INDETERMINATE�FLG_IN_RANGE�FLG_OUT_OF_RANGE�FLG_PLACEHOLDER_SHOWNr,r��printr��nextrrcrr�rrCr)rErJrrNr�r4r7r�r�r9r��
StopIterationr�r�r�r�r�r��SEL_DEFAULTrQ�SEL_INDETERMINATE�SEL_IN_RANGE�SEL_OUT_OF_RANGE�SEL_PLACEHOLDER_SHOWNr�)r�r�r�rQr�r�r��closedr�r��is_openr5Zis_relative�is_notr��
179  is_defaultZis_indeterminateZis_in_rangeZis_out_of_rangeZis_placeholder_shownr6rfrirZrZr[r�s,	
180  
181  
182  ��
183  �
184185  
186  �
187  
188  �!��
189   �
190  
191  �	zCSSParser.parse_selectorsrNc		csb�t�|�}|r
|�d�nd}t�|�}|r|�d�dnt|�d}|jr-td�|��||kr�d}|j	D].}|�
192  |||j�}|rd|��}|jrXtd�||�
d�|�d���|�d�}||fVnq6|dur�||}|dkrwd�|�}n$|dkr�d	�|�}n|d
193  kr�d�|�}n|dkr�d
�|�}nd�||�}t||j|��||ks1|jr�td�dSdS)zIterate selector tokens.rrz## PARSING: {!r}Nz#TOKEN: '{}' --> {!r} at position {}�[z+Malformed attribute selector at position {}r8z'Malformed class selector at position {}�#z$Malformed id selector at position {}r/z.Malformed pseudo-class selector at position {}z"Invalid character {!r} position {}z## END PARSING)�RE_WS_BEGINr�r��	RE_WS_ENDrr�r�rUrc�
194  css_tokensrbrQr�rmrrN)	r�rNrir�r��vr@r��msgrZrZr[�
selector_iter[sF�
195  
196  
197  
198  
199  ���zCSSParser.selector_itercCs|�|�|j�||�S)zProcess selectors.)rrhrN)r�r�rQrZrZr[rX�szCSSParser.process_selectors)Nr)rr)3r�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_AT_RULE�PAT_ID�	PAT_CLASS�PAT_TAG�PAT_ATTR�PAT_COMBINErersrr	rr�r�rnr�r�r
200  rNr�r�r�rrrr)r�rr4r7r9rCrErJrrhrXrZrZrZr[rW�s�
201  
202  
203  
204  �������
205  �
F	�����
206  
207  �_����
208  �A�����
209  �������
210  �0�������	�
211  
212  
213  �0����
214  �"?)rWzhtml|*:is(a, area)[href]r�z\
215      html|*:is(input[type=checkbox], input[type=radio])[checked], html|option[selected]
216      z�
217      :checked,
218  
219      /*
220      This pattern must be at the end.
221      Special logic is applied to the last selector.
222      */
223      html|form html|*:is(button, input)[type="submit"]
224      aF
225      html|input[type="checkbox"][indeterminate],
226      html|input[type="radio"]:is(:not([name]), [name=""]):not([checked]),
227      html|progress:not([value]),
228  
229      /*
230      This pattern must be at the end.
231      Special logic is applied to the last selector.
232      */
233      html|input[type="radio"][name]:not([name='']):not([checked])
234      a�
235      html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset)[disabled],
236      html|optgroup[disabled] > html|option,
237      html|fieldset[disabled] > html|*:is(input:not([type=hidden]), button, select, textarea, fieldset),
238      html|fieldset[disabled] >
239          html|*:not(legend:nth-of-type(1)) html|*:is(input:not([type=hidden]), button, select, textarea, fieldset)
240      z|
241      html|*:is(input:not([type=hidden]), button, select, textarea, fieldset, optgroup, option, fieldset):not(:disabled)
242      z,html|*:is(input, textarea, select)[required]z2html|*:is(input, textarea, select):not([required])aW
243      html|input:is(
244          :not([type]),
245          [type=""],
246          [type=text],
247          [type=search],
248          [type=url],
249          [type=tel],
250          [type=email],
251          [type=password],
252          [type=number]
253      )[placeholder]:not([placeholder='']):is(:not([value]), [value=""]),
254      html|textarea[placeholder]:not([placeholder=''])
255      z*|*a
256      html|*:is(
257          textarea,
258          input:is(
259              :not([type]),
260              [type=""],
261              [type=text],
262              [type=search],
263              [type=url],
264              [type=tel],
265              [type=email],
266              [type=number],
267              [type=password],
268              [type=date],
269              [type=datetime-local],
270              [type=month],
271              [type=time],
272              [type=week]
273          )
274      ):not([readonly], :disabled),
275      html|*:is([contenteditable=""], [contenteditable="true" i])
276      z!
277      html|*:not(:read-write)
278      z�
279      html|input:is(
280          [type="date"],
281          [type="month"],
282          [type="week"],
283          [type="time"],
284          [type="datetime-local"],
285          [type="number"],
286          [type="range"]
287      ):is(
288          [min],
289          [max]
290      )
291      )rRN)F)qr�r��	functoolsrrlrrrUrr�rr<�typingrr	r
292  rrr
rrrrror�rr�r
�PSEUDO_SPECIALr�NEWLINErc�WS�COMMENTS�WSC�CSS_ESCAPES�CSS_STRING_ESCAPES�
293  IDENTIFIER�NTH�VALUE�ATTRrsrtrurvrpr�rorirqrrrkrlrmrnrwrjr�r�rtrur#r�r?r�rcrdrar2r1r�r*r+rPrOrQrrRrSrTr,�	_MAXCACHErs�
294  Namespaces�CustomSelectorsrnrVr\r^r�rTrNrer�r�r�r�rWrXr�rrrrrrrrr%rrr	r
295  rZrZrZr[�<module>sh0	
296  ����
297  �����
298  �
299  �����
300  *%Ed�����
301  �����
302  �����������������
303