zmc
2023-12-22 9fdbf60165db0400c2e8e6be2dc6e88138ac719a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
U
¡ý°d×·ã@sødZddlmZddlZddlmZddlmZddlmZ    ddlm
Z dd    lm Z ddl Z dd
lmZmZmZmZd Zd d ddddddddddddddddddd d!d"d#hZd$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3hZd4d5d6d7d8d9d:d;hZd%d*d<hZd=d>d?d@dAdBhZeeBeBeBeBZdCZdD e¡ZdEZdFjeedGZdHjedIZdJjeedKZ dLjedMZ!dNjedIZ"dOjee!dPZ#dQjee#dRZ$dSje!dTZ%dUje!dTZ&dVje!dTZ'dWjee!e$dXZ(dYjee!dZZ)d[jee!dZZ*d\je!dTZ+d]jedIZ,d^ e)¡Z-d_je!dTZ.d`je*eeee"daZ/dbje*ee"dcZ0ddje*ee#deZ1dfje*edgZ2dhjeediZ3ddje*ee#deZ4e 5djjedIej6¡Z7e 5dkjeedKej6¡Z8e 5dljedIej6¡Z9e 5dmjee#dRej:¡Z;e 5e¡Z<e 5dn e¡¡Z=e 5do e¡¡Z>e 5dp e+¡ej:¡Z?dqZ@drZAdZBdsZCdtZDduZEdvZFdwZGdxZHdyZIdzZJd{ZKd|ZLd}ZMeeMd~dd€dd‚dƒd„œd…d†„ƒZNd‡dˆœd‰dŠ„ZOdd‹dŒœddŽ„ZPd­dddd‘œd’d“„ZQddd”œd•d–„ZRGd—d˜„d˜ƒZSGd™dš„dšeSƒZTGd›dœ„dœƒZUGddž„džƒZVeVdŸƒjWeBeFBd ZXeVd¡ƒjWeBeFBd ZYeVd¢ƒjWeBeFBeEBd ZZeVd£ƒjWeBeFBeGBd Z[eVd¤ƒjWeBeFBd Z\eVd¥ƒjWeBeFBd Z]eVd¦ƒjWeBeFBd Z^eVd§ƒjWeBeFBd Z_eVd¨ƒjWeBeFBeKBd Z`eVd©ƒjWeBd ZaeVdªƒjWeBeFBd ZbeVd«ƒjWeBeFBd ZceVd¬ƒjWeBeIBeFBd ZdeVd¬ƒjWeBeJBeFBd ZedS)®zCSS selector parser.é)Ú annotationsN)Ú    lru_cacheé)Úutil)Ú    css_match)Ú    css_types)ÚSelectorSyntaxError)ÚMatchÚAnyÚIteratorÚcastiýÿú    :any-linkú:emptyú :first-childú:first-of-typeú    :in-rangeú :out-of-rangeú :last-childú :last-of-typeú:linkú :only-childú :only-of-typeú:rootú:checkedú:defaultú    :disabledú:enabledú:indeterminateú    :optionalú:placeholder-shownú
:read-onlyú :read-writeú    :requiredú:scopeú:definedz:activez:currentz:focusz:focus-visiblez :focus-withinz:futurez:hostz:hoverz :local-linkz:pastz:pausedz:playingz:targetz:target-withinz :user-invalidz:visitedú    :containsú:-soup-containsú:-soup-contains-ownú:hasú:isz:matchesú:notú:wherez :host-contextú:dirú:langú
:nth-childú:nth-last-childú:nth-last-of-typeú :nth-of-typez(?:\r\n|(?!\r\n)[\n\f\r])z (?:[ \t]|{})z"(?:/\*[^*]*\*+(?:[^/*][^*]*\*+)*/)z(?:{ws}|{comments}))ÚwsÚcommentsz*(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$)))r2z/(?:\\(?:[a-f0-9]{{1,6}}{ws}?|[^\r\n\f]|$|{nl})))r2Únlz„
(?:(?:-?(?:[^\x00-\x2f\x30-\x40\x5B-\x5E\x60\x7B-\x9f]|{esc})+|--)
(?:[^\x00-\x2c\x2e\x2f\x3A-\x40\x5B-\x5E\x60\x7B-\x9f]|{esc})*)
)Úescz>(?:[-+])?(?:[0-9]+n?|n)(?:(?<=n){ws}*(?:[-+]){ws}*(?:[0-9]+))?zT
(?:"(?:\\(?:.|{nl})|[^\\"\r\n\f]+)*?"|'(?:\\(?:.|{nl})|[^\\'\r\n\f]+)*?'|{ident}+)
)r4ÚidentzU
(?:{ws}*(?P<cmp>[!~^|*$]?=){ws}*(?P<value>{value})(?:{ws}*(?P<case>[is]))?)?{ws}*\]
)r2Úvaluez    \#{ident})r6z    \.{ident}z6(?P<tag_ns>(?:{ident}|\*)?\|)?(?P<tag_name>{ident}|\*)zD
\[{ws}*(?P<attr_ns>(?:{ident}|\*)?\|)?(?P<attr_name>{ident}){attr}
)r2r6Úattrz$(?P<name>:{ident})(?P<open>\({ws}*)?)r2r6z#(?P<name>:{ident})(?P<open>\({ws}*)z(?P<name>:(?=--){ident})z{ws}*\)z:{}z    @P{ident}z}
(?P<pseudo_nth_child>{name}
(?P<nth_child>{nth}|even|odd))(?:{wsc}*\)|(?P<of>{comments}*{ws}{wsc}*of{comments}*{ws}{wsc}*))
)ÚnameÚwscr3r2ÚnthzA
(?P<pseudo_nth_type>{name}
(?P<nth_type>{nth}|even|odd)){ws}*\)
)r9r2r;z7{name}(?P<values>{value}(?:{ws}*,{ws}*{value})*){ws}*\))r9r2r7z{name}(?P<dir>ltr|rtl){ws}*\))r9r2z0{wsc}*?(?P<relation>[,+>~]|{ws}(?![,+>~])){wsc}*)r2r:z0(?:(\\[a-f0-9]{{1,6}}{ws}?)|(\\[^\r\n\f])|(\\$))z9(?:(\\[a-f0-9]{{1,6}}{ws}?)|(\\[^\r\n\f])|(\\$)|(\\{nl}))zL(?P<s1>[-+])?(?P<a>[0-9]+n?|n)(?:(?<=n){ws}*(?P<s2>[-+]){ws}*(?P<b>[0-9]+))?z-(?:(?P<value>{value})|(?P<split>{ws}*,{ws}*))z^{}*z{}*$z^{}$ú,ú ééééé é@é€éiiiô)ÚmaxsizeÚstrzct.Namespaces | Nonezct.CustomSelectors | NoneÚintz cm.SoupSieve)ÚpatternÚ
namespacesÚcustomÚflagsÚreturncCs(t|ƒ}t |t|||d ¡|||¡S)zCached CSS compile.©rKrL)Úprocess_customÚcmZ    SoupSieveÚ    CSSParserÚprocess_selectors)rIrJrKrLÚcustom_selectors©rTúKd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\soupsieve/css_parser.pyÚ_cached_css_compileÏs    ý÷rVÚNone©rMcCs t ¡dS)zPurge the cache.N)rVÚ cache_clearrTrTrTrUÚ _purge_cacheæsrZz dict[str, str | ct.SelectorList])rKrMcCsji}|dk    rf| ¡D]P\}}t |¡}t |¡dkrBtd |¡ƒ‚||krXtd |¡ƒ‚||t|ƒ<q|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)rKrSÚkeyr7r9rTrTrUrOìs
rOFÚbool)ÚcontentÚstringrMcCs$dddœdd„}|stnt ||¡S)zs
    Unescape CSS value.
 
    Strings allow for spanning the value on multiple strings by escaping a new line.
    ú
Match[str]rG)ÚmrMcSsn| d¡r8t| d¡dd…dƒ}|dkr.t}t|ƒ}n2| d¡rV| d¡dd…}n| d¡rfd}nd}|S)    z(Replace with the appropriate substitute.rNrArr>éõ�Ú)ÚgrouprHÚUNICODE_REPLACEMENT_CHARÚchr)rgÚ    codepointr7rTrTrUÚreplaces
 
 
 
zcss_unescape.<locals>.replace)Ú
RE_CSS_ESCÚRE_CSS_STR_ESCÚsub)rdrerorTrTrUraûsra)r6rMcCs‚g}t|ƒ}|dko|ddk}|dkr@|r@| d |¡¡n8t|ƒD],\}}t|ƒ}|dkrn| d¡qHd|kr‚dksŒn|dkrž| d |¡¡qH|dks²|rÜ|dkrÜd    |krÆd
krÜnn| d |¡¡qH|d ksZ|d ksZd    |krd
ksZnd    |kr"d
ksZnd |kr<dksZnd|krVdkrfnn | |¡qH| d |¡¡qHd |¡S)zEscape identifier.rú-rz\{}riééz\{:x} é0é9)é-é_rDéAéZéaézrj)ÚlenÚappendr_Ú    enumerateÚordÚjoin)r6reÚlengthZ
start_dashÚindexÚcrnrTrTrUÚescapesP  ,ÿÿÿ
ÿ
þ
þ
þ
þ
þ
þ  r†c@sDeZdZdZddddœdd„Zddœdd    „Zdd
d
d d œd d„ZdS)ÚSelectorPatternúSelector pattern.rGrW)r9rIrMcCs&||_t |tjtjBtjB¡|_dS)ú Initialize.N)r9ÚreÚcompileÚIÚXÚUÚ
re_pattern)Úselfr9rIrTrTrUÚ__init__5szSelectorPattern.__init__rXcCs|jS)ú    Get name.)r9©rrTrTrUÚget_name;szSelectorPattern.get_namerHúMatch[str] | None©Úselectorr„rLrMcCs|j ||¡S)úMatch the selector.)rr^)rr—r„rLrTrTrUr^@szSelectorPattern.matchN©Ú__name__Ú
__module__Ú __qualname__Ú__doc__r‘r”r^rTrTrTrUr‡2sr‡c@sBeZdZdZdddœdd„Zddœd    d
„Zdd d d d œdd„ZdS)ÚSpecialPseudoPatternrˆzCtuple[tuple[str, tuple[str, ...], str, type[SelectorPattern]], ...]rW)ÚpatternsrMcCshi|_|D]6}|d}|d||dƒ}|dD]}||j|<q0q
d|_t ttjtjBtjB¡|_dS)r‰rrhr>rN)    rŸÚ matched_namerŠr‹ÚPAT_PSEUDO_CLASS_SPECIALrŒrrŽÚre_pseudo_name)rrŸÚpr9rIÚpseudorTrTrUr‘Is zSpecialPseudoPattern.__init__rGrXcCs|jdkrdS|j ¡S)r’Nrj)r r”r“rTrTrUr”VszSpecialPseudoPattern.get_namerHr•r–cCsVd}|j ||¡}|rRt t| d¡ƒ¡}|j |¡}|rR| |||¡}|rR||_|S)r˜Nr9)    r¢r^rr\rarkrŸÚgetr )rr—r„rLr¤rgr9rIrTrTrUr^[s zSpecialPseudoPattern.matchNr™rTrTrTrUržFs ržc@sPeZdZdZdddœdd„Zddd    œd
d „Zd d œdd„Zdd œdd„ZeZdS)Ú    _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
rW)ÚkwargsrMcKs¬| dd¡|_| dg¡|_| dg¡|_| dg¡|_| dg¡|_| dg¡|_| dg¡|_| d    d¡|_| d
g¡|_    | d g¡|_
| d d ¡|_ | dd¡|_ dS)r‰ÚtagNÚidsÚclassesÚ
attributesr;Ú    selectorsÚ    relationsÚrel_typeÚcontainsÚlangrLrÚno_matchF) r¥r¨r©rªr«r;r¬r­r®r¯r°rLr±)rr§rTrTrUr‘tsz_Selector.__init__úlist[_Selector]úct.SelectorList)r­rMcCs<|r0|d}|j |dd…¡t | ¡g¡St ¡SdS)zFreeze relation.rrN)r­ÚextendÚctÚ SelectorListÚfreeze)rr­ÚselrTrTrUÚ_freeze_relations„s
z_Selector._freeze_relationszct.Selector | ct.SelectorNullrXc Csh|jrt ¡St |jt|jƒt|jƒt|jƒt|j    ƒt|j
ƒ|  |j ¡|j t|jƒt|jƒ|j¡ SdS)z Freeze self.N)r±rµZ SelectorNullZSelectorr¨Útupler©rªr«r;r¬r¹r­r®r¯r°rLr“rTrTrUr·Žs
õz_Selector.freezerGcCs8d |j|j|j|j|j|j|j|j|j    |j
|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})) r_r¨r©rªr«r;r¬r­r®r¯r°rLr±r“rTrTrUÚ__str__¢sÿûz_Selector.__str__N)    ršr›rœrr‘r¹r·r»Ú__repr__rTrTrTrUr¦ks 
 r¦c @söeZdZdZedeƒeddeefddeefdde    efd    d
e
efd d e effƒed e ƒede ƒedeƒedeƒedeƒedeƒedeƒedeƒedeƒf ZdOdddddœdd„Zdd d!d!d"œd#d$„Zdd d!d!d"œd%d&„Zdd d!d!d"œd'd(„Zdd d!d)d!d*d+œd,d-„Zdd d!d)d!d.œd/d0„Zddd!d)dd!d1œd2d3„Zdd d!d4ddd5d6œd7d8„Zdd d!d4d4d!d!dd9d:œ    d;d<„Zdd d!d!d"œd=d>„Zdd d!d!d"œd?d@„Z dd d!d!d"œdAdB„Z!dd d!d!d"œdCdD„Z"dPd)dddEdFœdGdH„Z#dd)dIœdJdK„Z$dQdddEdLœdMdN„Z%dS)RrQzParse CSS selectors.Ú pseudo_closeÚpseudo_contains)r%r&r'Úpseudo_nth_child)r.r/Úpseudo_nth_type)r1r0Ú pseudo_lang)r-Ú
pseudo_dir)r,Úpseudo_class_customÚ pseudo_classÚpseudo_elementÚat_ruleÚidÚclassr¨Ú    attributeÚcombineNrrGz'dict[str, str | ct.SelectorList] | NonerHrW)r—rKrLrMcCs8| dd¡|_||_|jtj@|_|dkr.in||_dS)r‰úriN)rorIrLrÚDEBUGÚdebugrK)rr—rKrLrTrTrUr‘ÎszCSSParser.__init__r¦rfrc)r¸rgÚ has_selectorrMcCs^d}| d¡}| d¡r(t | d¡¡nd}| d¡rLt| d¡dd…ƒnd}t| d¡ƒ}d}    d}
d} |rˆ|d    kr|tjnd
tjB} n&t |¡d kr¨tjtjB} d }    ntj} |rê| d ¡ d¡rÜt| d ¡dd…d ƒ} nt| d ¡ƒ} |sôd} nô| d¡rt dt     | ¡| ¡} nÐ| d¡r<t dt     | ¡| ¡} n¬| d¡r`t dt     | ¡| ¡} nˆ| d¡rž| r~t
  | ¡r‚dnt     | ¡} t d| | ¡} nJ| d¡rÂt dt     | ¡| ¡} n&t dt     | ¡| ¡} | d¡rèd }|    r| rt | j ¡}
t  ||| |
¡}|rJtƒ}|j |¡t  | ¡gd d¡}|j |¡n |j |¡d }|S)z8Create attribute selector from the returned regex match.FÚcmpÚcaseNZattr_nséÿÿÿÿrjÚ    attr_nameÚirÚtypeTr7©ú"ú'rú^z^%s.*ú$z.*?%s$Ú*z.*?%s.*ú~z[^\s\S]z7.*?(?:(?<=^)|(?<=[ \t\r\n\f]))%s(?=(?:[ \t\r\n\f]|$)).*ú|z ^%s(?:-.*)?$z^%s$ú!)rkrr\rarŠrŒÚDOTALLÚ
startswithr‹r†ÚRE_WSÚsearchrIrµZSelectorAttributer¦r«rr¶r·r¬)rr¸rgrÎZinverseÚoprÐÚnsr8Zis_typeZpattern2r7rLrIZsel_attrZsub_selZnot_listrTrTrUÚparse_attribute_selectorÛsZ
$            z"CSSParser.parse_attribute_selectorcCsH| d¡r t| d¡dd…ƒnd}t| d¡ƒ}t ||¡|_d}|S)z#Parse tag pattern from regex match.Ztag_nsNrÑZtag_nameT)rkrarµÚ SelectorTagr¨)rr¸rgrÎÚprefixr¨rTrTrUÚparse_tag_pattern!s
$zCSSParser.parse_tag_patterncCs–t t| d¡ƒ¡}|j |¡}|dkrJtd || d¡¡|j    | d¡ƒ‚t
|t j ƒs‚|j|=t ||j|jdjtd}||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.
        r9Nz3Undefined custom selector '{}' found at position {}rrN©rLT)rr\rarkrKr¥rr_ÚendrIÚ
isinstancerµr¶rQrLrRÚ
FLG_PSEUDOr¬r)rr¸rgrÎr¤r—rTrTrUÚparse_pseudo_class_custom*s* ý ÿþ
 z#CSSParser.parse_pseudo_class_customz Iterator[tuple[str, Match[str]]]ztuple[bool, bool])r¸rgrÎÚ    iselectorÚis_htmlrMc Csìd}t t| d¡ƒ¡}| d¡r&d}|rN|tkrN| ||||| d¡¡}n–|s`|tkr`|dkrz|jt    j
O_nà|dkrš|jt    j O_d}nÀ|dkr¶|jt    j O_n¤|d    krÒ|jt    j O_nˆ|d
krê|j t¡np|d kr|j t¡nV|d kr|j t¡n<|d kr8|j t¡n"|dkrR|j t¡n|dkrl|j t¡nî|dkr†|j t¡nÔ|dkr |j t¡nº|dkrº|j t¡n |dkrÔ|j t¡n†|dkrî|j t¡nl|dkr|j t¡nR|dkr"|j t¡n8|dkrP|j t     dddddt     ¡¡¡n
|dkr||j t     dddddt     ¡¡¡nÞ|dkr¨|j t     dddddt     ¡¡¡n²|dkrÔ|j t     dddddt     ¡¡¡n†|dkr|j  t     dddddt     ¡¡t     dddddt     ¡¡g¡nB|dkrZ|j  t     dddddt     ¡¡t     dddddt     ¡¡g¡d}n„|r”|t!kr”| "|| d¡t#t$B¡d|_%d}nP|s°|t&kr°d|_%d}n4|t'krÖt(d )|¡|j*| +d¡ƒ‚nt,d )|¡ƒ‚||fS) zParse pseudo class.Fr9ÚopenTrrr$r#r)rr rrrrrr"rr r!rrrrrrrrrrz$Invalid syntax for pseudo class '{}'z1'{}' pseudo-class is not implemented at this time)-rr\rarkÚPSEUDO_COMPLEXÚparse_pseudo_openréÚ PSEUDO_SIMPLErLrµZSEL_ROOTZ SEL_DEFINEDZ    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_SUPPORTEDrr_rIÚstartÚNotImplementedError)rr¸rgrÎrírîZcomplex_pseudor¤rTrTrUÚparse_pseudo_classFs 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
$
"
"
"
þÿ
þÿ
ýÿzCSSParser.parse_pseudo_class)r¸rgrÎrírMc Cs.| ¡}| d¡rd}nd}t t|dƒ¡|d<t | d|¡¡}|dkr\d}d}    d    }
nè|d
krrd}d }    d    }
nÒtttt     |¡ƒ} |  
d ¡r¢|  
d ¡d kr¢d nd} |  
d¡} |   d¡}
|   d¡rÎ| d7} n|
rä| | dd…7} n| | 7} |  
d¡r |  
d¡d kr d nd}|  
d¡r,||  
d¡7}nd}t | dƒ}t |dƒ}    |d}|dkrÐ| 
d¡r|| || d¡ttB¡}nt}|dkr¨|j t ||
|    dd|¡¡n&|dkr&|j t ||
|    dd    |¡¡nV|dkrü|j t ||
|    d    dt ¡¡¡n*|dkr&|j t ||
|    d    d    t ¡¡¡d    }|S)zParse `nth` pseudo.r¿Z_childÚ_typer9r;Zevenr>rTZoddrÚs1rsrjÚaÚnÚ1NrÑÚs2ÚbÚ0é
Zofr.Fr/r1r0)Ú    groupdictr¥rr\rar r    rGÚRE_NTHr^rkÚendswithrßrHrrérërÚCSS_NTH_OF_S_DEFAULTr;rrµrr¶)rr¸rgrÎríZmdictZpostfixrdr
rÚvarZ    nth_partsZ_s1r Z_s2Z
pseudo_selZnth_selrTrTrUÚparse_pseudo_nth¥sX    
 
 
 
 
$ 
 
 
 
 
 
"
 zCSSParser.parse_pseudo_nth)r¸r9rÎrír„rMcCsZttB}|dkr|tO}n"|dkr,|tO}n|dkr<|tO}|j | |||¡¡d}|S)z"Parse pseudo with opening bracket.r*r()r+r)T)rërÚFLG_NOTÚ FLG_RELATIVEÚ FLG_FORGIVEr¬rr)rr¸r9rÎrír„rLrTrTrUrñæs
 
 
zCSSParser.parse_pseudo_openr²ztuple[bool, _Selector, str])r¸rgrÎr¬r®r„rMcCs¦| d¡ ¡}|st}|tkrJ||_|dj |¡dt}| tƒ¡nH|rf||_|dj |¡n$|dd…tkrŠtd     |¡|j
|ƒ‚d|}tƒ}d}|||fS)úParse combinator tokens.ÚrelationrÑú:rNz'The multiple combinators at position {}F) rkÚstripÚ WS_COMBINATORÚCOMMA_COMBINATORr®r­rr¦rr_rI)rr¸rgrÎr¬r®r„Ú
combinatorrTrTrUÚparse_has_combinatorýs* ýzCSSParser.parse_has_combinatorztuple[bool, _Selector])    r¸rgrÎr¬r­Ú    is_pseudoÚ
is_forgiver„rMc    
CsÚ| d¡ ¡}    |    st}    |s`|r&|    tkr<td |    |¡|j|ƒ‚|    tkrÈd|_|dd…=| |¡nh|    tkr¢|j    s€|s€t
  dd¡|_    |j   |¡| |¡|dd…=n&|j   |¡|    |_|dd…=| |¡tƒ}d}||fS)rrzBThe combinator '{}' at position {}, must have a selector before itTNrÚF)rkrrr rr_rIr±rr¨rµrår­r´r®r¦)
rr¸rgrÎr¬r­r#r$r„r!rTrTrUÚparse_combinator(s6  
ý
 
 
 
 
zCSSParser.parse_combinatorcCsN| d¡}| d¡r.|j t|dd…ƒ¡n|j t|dd…ƒ¡d}|S)zParse HTML classes and ids.rÚ.rNT)rkrßrªrrar©)rr¸rgrÎr—rTrTrUÚparse_class_idXs 
 
zCSSParser.parse_class_idc
Cs´t t| d¡ƒ¡}|dkr(t dt¡|dk}t| d¡ƒ}g}t |¡D]J}| d¡r\qL| d¡}    |         d¡r„t|    d    d
…d ƒ}    nt|    ƒ}    | 
|    ¡qL|j  
t   ||¡¡d }|S) zParse contains.r9r%z\The pseudo class ':contains' is deprecated, ':-soup-contains' should be used moving forward.r'ÚvaluesÚsplitr7)r×rÖrrÑT)rr\rarkÚwarningsÚwarnÚ FutureWarningÚ    RE_VALUESÚfinditerrßrr¯rµZSelectorContains)
rr¸rgrÎr¤Z contains_ownr(rŸÚtokenr7rTrTrUÚparse_pseudo_containscs(þ
 
 
 zCSSParser.parse_pseudo_containscCs~| d¡}g}t |¡D]J}| d¡r(q| d¡}| d¡rPt|dd…dƒ}nt|ƒ}| |¡q|j t |¡¡d}|S)zParse pseudo language.r(r)r7rÕrrÑT)    rkr-r.rßrarr°rµZ SelectorLang)rr¸rgrÎr(rŸr/r7rTrTrUÚparse_pseudo_lang|s
 
 
 
 zCSSParser.parse_pseudo_langcCs6t | d¡¡dkrtjntj}|j|O_d}|S)zParse pseudo direction.ÚdirZltrT)rr\rkrµZ SEL_DIR_LTRZ SEL_DIR_RTLrL)rr¸rgrÎr7rTrTrUÚparse_pseudo_dir‘s zCSSParser.parse_pseudo_dirr³)rír„rLrMc
Csâtƒ}g}d}d}g}dt}    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¶tdƒ|
rÂtdƒ| rÎtdƒ| rÚtdƒ|rætdƒ|ròtdƒ|rþtd    ƒ|r td
ƒ|rtd ƒ|r(td ƒ|r6td ƒ| rH| tƒ¡zBt|ƒ\}}|dkrztd | d¡¡ƒ‚n|dkr–| |||¡}næ|dkrº| |||||¡\}}nÂ|dkrÜtd | d¡¡ƒ‚n |dkrø| |||¡}n„|dkr| ||||¡}nf|dkr2| |||¡}nJ|dkrR| |||¡}d}n*|dkrÀ|sŽ|sˆtd | d¡¡|j| d¡ƒ‚d|_|
ržd}qŠn td | d¡¡|j| d¡ƒ‚n¼|dkr
| rì| |||||    |¡\}}}    n| |||||| ||¡\}}nr|dkr$|  |||¡}nX|dkrd|rTtd  | d¡¡|j| d¡ƒ‚| !|||¡}n|d!kr|| "|||¡}| #d¡}qLWnt$k
r¢YnX|
rÄ|sÄtd" |¡|j|ƒ‚|r&|j%sæ| sæt& 'd#d$¡|_%| r|    |_(|d%j) |¡n |j) *|¡|d$d$…=| |¡n0|rV|r8|sVd|_|d$d$…=| |¡d}|sptd |¡|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)(zParse selectors.Frz    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ÆzAt-rules found at position {}rrÃrÄrÅz#Pseudo-element found at position {}r¾)rÀr¿rÁrÂTr½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ÑcSsg|] }| ¡‘qSrT)r·)Ú.0ÚsrTrTrUÚ
<listcomp>Ksz-CSSParser.parse_selectors.<locals>.<listcomp>)2r¦rrcrrërrÚFLG_HTMLÚ FLG_DEFAULTÚFLG_INDETERMINATEÚ FLG_IN_RANGEÚFLG_OUT_OF_RANGEÚFLG_PLACEHOLDER_SHOWNrrÍÚprintrÚnextrr_rrìrr0rr1r3rrIr±r"r%rärçr'réÚ StopIterationr¨rµrår®r­r´Z SEL_DEFAULTrLZSEL_INDETERMINATEZ SEL_IN_RANGEZSEL_OUT_OF_RANGEZSEL_PLACEHOLDER_SHOWNr¶)rrír„rLr¸r¬rÎÚclosedr­r®Zis_openr#Z is_relativeÚis_notrîZ
is_defaultZis_indeterminateZ is_in_rangeZis_out_of_rangeZis_placeholder_shownr$rbrgrTrTrUr™s,                 
 
 
 
 
 
 
 
 
ýý
ÿ ÿ
 
 
ý
 ý 
 
 
ý         zCSSParser.parse_selectors)rIrMc        cs`t |¡}|r| d¡nd}t |¡}|r8| d¡dn
t|ƒd}|jrXtd |¡ƒ||krLd}|j    D]\}| 
|||j ¡}|rl|  ¡}|jr°td ||  d¡| d¡¡ƒ| d¡}||fVqÊql|dkrX||}|dkrîd |¡}nN|dkrd     |¡}n8|d
krd  |¡}n"|d kr0d  |¡}n d ||¡}t||j|ƒ‚qX|jr\tdƒdS)zIterate selector tokens.rrz## PARSING: {!r}Nz#TOKEN: '{}' --> {!r} at position {}ú[z+Malformed attribute selector at position {}r&z'Malformed class selector at position {}ú#z$Malformed id selector at position {}rz.Malformed pseudo-class selector at position {}z"Invalid character {!r} position {}z## END PARSING)Ú RE_WS_BEGINráréÚ    RE_WS_ENDrr~rÍr=r_Ú
css_tokensr^rLr”rkrrI)    rrIrgr„réÚvr9r…ÚmsgrTrTrUÚ selector_iterMs>
 
 
 
 
 
 
 
 
  zCSSParser.selector_iter)r„rLrMcCs| | |j¡||¡S)zProcess selectors.)rrIrI)rr„rLrTrTrUrRvszCSSParser.process_selectors)Nr)rr)rr)&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_AT_RULEÚPAT_IDÚ    PAT_CLASSÚPAT_TAGÚPAT_ATTRÚ PAT_COMBINErFr‘rärçrìrrrñr"r%r'r0r1r3rrIrRrTrTrTrUrQ°sZü
 
 
 
öÿèü F    _A+0  ü5)rQzhtml|*: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__rrŠÚ    functoolsrrjrrrPrrµrr*Útypingr    r
r r rlròrrðrZPSEUDO_SPECIALrÚNEWLINEr_ZWSZCOMMENTSZWSCZ CSS_ESCAPESZCSS_STRING_ESCAPESÚ
IDENTIFIERZNTHZVALUEZATTRrTrUrVrWrQr¡rPrJrRrSrLrMrNrOrXrKr‹rŒrprqrrr-ràrDrEr]r rrërrr8r7r9rr:r;r<rÚ    _MAXCACHErVrZrOrar†r‡ržr¦rQrRrórôrõrör÷rørùrúrÿrrürûrýrþrTrTrTrUÚ<module>sä      èðø ýú    
 ý þþ   þ  
 ýýÿÿ ÿ
þ
%EUÿþÿüÿ
 
ö ÿ
ôÿø
ÿüÿþÿþÿ
ñÿþÿéÿüÿ
ñÿ
ñ