zmc
2023-08-08 e792e9a60d958b93aef96050644f369feb25d61b
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
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
U
¡ý°d(ãã@sŒdZddlmZddlmZddlmZddlZddlmZddl    Z    ddl
Z
ddl m Z m Z mZmZmZmZe d    ¡Ze d
¡Zd Zd Zd ZdZdZdZdZdZdZdZejej BZ!ej"ej#BZ$ejej ddœZ%e d¡Z&e d¡Z'e d¡Z(e d¡Z)e d¡Z*e d¡Z+e d¡Z,dZ-dZ.dZ/d Z0d!Z1d"Z2d#Z3Gd$d%„d%ƒZ4Gd&d'„d'ƒZ5Gd(d)„d)ƒZ6Gd*d+„d+e5ƒZ7Gd,d-„d-ej8ƒZ9e :e9¡dS).z CSS matcher.é)Ú annotations)Údatetimeé)ÚutilN)Ú    css_types)ÚIteratorÚIterableÚAnyÚCallableÚSequenceÚcastz[^     
]z    [^     
]+ú ú>ú~ú+z: z:>z:~z:+zhttp://www.w3.org/1999/xhtmlz$http://www.w3.org/XML/1998/namespace)ZltrÚ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.eZdZdZdddœdd„Zddœd    d
„Zd 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.
    úbs4.TagÚNone)ÚelementÚreturncCs |g|_dS)ú Initialize.N)Úcontents)Úselfr ©r%úJd:\z\workplace\vscode\pyvenv\venv\Lib\site-packages\soupsieve/css_match.pyÚ__init__Dsz_FakeParent.__init__úbs4.PageElement©r!cCs
t|jƒS)zLength.)Úlenr#©r$r%r%r&Ú__len__Isz_FakeParent.__len__N)Ú__name__Ú
__module__Ú __qualname__Ú__doc__r'r,r%r%r%r&r;src@sxeZdZdZedddœdd„ƒZeddd    œd
d „ƒZed dd    œd d„ƒZed dd    œdd„ƒZ    ed dd    œdd„ƒZ
ed dd    œdd„ƒZ ed dd    œdd„ƒZ ed dd    œdd„ƒZ ed dd    œdd„ƒZedddœdd„ƒZedddœdd „ƒZdddœd!d"„Zdddœd#d$„Zd[ddd&d'œd(d)„Zd\dd,dddd&d-œd.d/„Zd]dddd&d0œd1d2„Zd^dddd'œd3d4„Zedd5dœd6d7„ƒZedd5dœd8d9„ƒZedd5dœd:d;„ƒZed_ddd d<œd=d>„ƒZed`ddd d<œd?d@„ƒZedddœdAdB„ƒZeddCdDdEœdFdG„ƒZeddHdIœdJdK„ƒZedaddCdLdLdMœdNdO„ƒZeddPdœdQdR„ƒZ eddSdœdTdU„ƒZ!dbdddCd'œdVdW„Z"dcdddXd'œdYdZ„Z#d*S)dÚ _DocumentNavz#Navigate a Beautiful Soup document.r    r©Útagr!cCs | |¡std t|ƒ¡ƒ‚dS)z%Check if valid input tag or document.z<Expected a BeautifulSoup 'Tag', but instead received type {}N)Úis_tagÚ    TypeErrorÚformatÚtype)Úclsr3r%r%r&Úassert_valid_inputRs
z_DocumentNav.assert_valid_inputrÚbool)Úobjr!cCs t|tjƒS)zIs `BeautifulSoup` object.)Ú
isinstanceÚbs4Z BeautifulSoup©r;r%r%r&Úis_docZsz_DocumentNav.is_docr(cCs t|tjƒS)zIs tag.)r<r=ÚTagr>r%r%r&r4_sz_DocumentNav.is_tagcCs t|tjƒS)zIs declaration.)r<r=Ú Declarationr>r%r%r&Úis_declarationdsz_DocumentNav.is_declarationcCs t|tjƒS)z    Is CDATA.)r<r=ÚCDatar>r%r%r&Úis_cdataisz_DocumentNav.is_cdatacCs t|tjƒS)zIs processing instruction.)r<r=ÚProcessingInstructionr>r%r%r&Úis_processing_instructionnsz&_DocumentNav.is_processing_instructioncCs t|tjƒS)zIs navigable string.)r<r=ZNavigableStringr>r%r%r&Úis_navigable_stringssz _DocumentNav.is_navigable_stringcCst|tjtjtjtjtjfƒS)zIs special string.)r<r=ÚCommentrArCrEÚDoctyper>r%r%r&Úis_special_stringxsz_DocumentNav.is_special_stringcCs| |¡o| |¡ S)z Check if node is content string.)rGrJ)r8r;r%r%r&Úis_content_string}sz_DocumentNav.is_content_stringr©Úelr!cCst|ƒS)z'Create fake parent for a given element.)r©rMr%r%r&Úcreate_fake_parentƒsz_DocumentNav.create_fake_parentcCs
t|jƒS)z2Check if element (or document) is from a XML tree.)r:Ú_is_xmlrNr%r%r&Ú is_xml_tree‰sz_DocumentNav.is_xml_treecCs.t| |¡r|jn
t |j¡dko*| |¡ƒS)z Check if element is an `iframe`.Úiframe)r:rQÚnamerÚlowerÚ is_html_tag©r$rMr%r%r&Ú    is_iframes þz_DocumentNav.is_iframecCs:|jo|j|k}|s6| |¡}|dk    o4|jo4| |¡}|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_htmlrW)r$rMrXÚparentr%r%r&Úis_root—s
 
z_DocumentNav.is_rootFzIterator[bs4.PageElement])rMÚ    no_iframer!ccs$|r| |¡s |jD]
}|VqdS)z$Get contents or contents in reverse.N)rWr#)r$rMr]Úcontentr%r%r&Ú get_contents¥s
z_DocumentNav.get_contentsNTú
int | None)rMÚstartÚreverseÚtagsr]r!c csž|r| |¡sšt|jƒd}|dkr2|r,|nd}n|}|r>dn|d}|rNdnd}    d|krf|kršnn0||krš|j|}
||    7}|r’| |
¡rj|
VqjdS)z Get children.rNréÿÿÿÿ)rWr*r#r4) r$rMrarbrcr]ÚlastÚindexÚendÚincrÚnoder%r%r&Ú get_children«s
 
z_DocumentNav.get_children)rMrcr]r!ccs®|r| |¡sªd}|jD]}|dk    r2||k    r.qd}| |¡}|rš|rš| |¡rš|jdk    r`|j}n&|}| |¡r€|jr€|jd}qd|j}|V|dkrqªq|r¢|r|VqdS)zGet descendants.Nrd)rWZ descendantsr4Ú next_siblingr#Z next_element)r$rMrcr]Z    next_goodÚchildr4Z
last_childr%r%r&Úget_descendantsÅs*
 
 
 z_DocumentNav.get_descendantscCs$|j}|r |dk    r | |¡r d}|S)z Get parent.N)r[rW)r$rMr]r[r%r%r&rYész_DocumentNav.get_parentú
str | NonecCs td|jƒS)úGet tag.rn)r rSrNr%r%r&Ú get_tag_nameñsz_DocumentNav.get_tag_namecCs td|jƒS)ú Get prefix.rn)r ÚprefixrNr%r%r&Úget_prefix_name÷sz_DocumentNav.get_prefix_namecCs td|jƒS)zGet namespace `URI`.rn)r Ú    namespacerNr%r%r&Úget_uriýsz_DocumentNav.get_uri)rMrcr!cCs(|j}|r$| |¡s$|dk    r$|j}q|S)zGet next sibling tag.N)rkr4©r8rMrcÚsiblingr%r%r&Úget_nextsz_DocumentNav.get_nextcCs(|j}|r$| |¡s$|dk    r$|j}q|S)zGet previous sibling tag.N)Zprevious_siblingr4rvr%r%r&Ú get_previous sz_DocumentNav.get_previouscCs"|rt|dƒnd}t|o|tkƒ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`.
        rtN)Úgetattrr:ÚNS_XHTML)rMÚnsr%r%r&Ú has_html_nss    z_DocumentNav.has_html_nsÚstrztuple[str | None, str | None])rMÚ    attr_namer!cCst|ddƒt|ddƒfS)z7Return namespace and attribute name without the prefix.rtNrS)rz)rMrr%r%r&Úsplit_namespace!sz_DocumentNav.split_namespacezstr | Sequence[str])Úvaluer!cCs|dkr dSt|tƒr|St|tƒr.| d¡St|tƒrˆg}|D]B}t|ttfƒslt|tƒrl| t|ƒ¡q@| tt| |¡ƒ¡q@|St|ƒS)z6Normalize the value to be a string or list of strings.NÚÚutf8)r<r~ÚbytesÚdecoder Úappendr Únormalize_value)r8rÚ    new_valueÚvr%r%r&r‡'s
 
 
 
z_DocumentNav.normalize_valueústr | Sequence[str] | None)rMrSÚdefaultr!cCsj|}|jr6z| |j|¡}Wqftk
r2YqfXn0|j ¡D]$\}}t |¡|kr@| |¡}qfq@|S)zGet attribute by name.)rPr‡ÚattrsÚKeyErrorÚitemsrrT)r8rMrSr‹rÚkr‰r%r%r&Úget_attribute_by_nameHs    
z"_DocumentNav.get_attribute_by_namez0Iterator[tuple[str, str | Sequence[str] | None]]ccs(|j ¡D]\}}|| |¡fVq
dS)zIterate attributes.N)rŒrŽr‡)r8rMrr‰r%r%r&Úiter_attributes^sz_DocumentNav.iter_attributesz Sequence[str]cCs0| |dg¡}t|tƒr"t |¡}ttt|ƒS)z Get classes.Úclass)rr<r~Ú    RE_NOT_WSÚfindallr r )r8rMÚclassesr%r%r&Ú get_classeses
 
z_DocumentNav.get_classescs$d ‡fdd„ˆj|d|dDƒ¡S)z    Get text.r‚csg|]}ˆ |¡r|‘qSr%©rK©Ú.0rir+r%r&Ú
<listcomp>rs
z)_DocumentNav.get_text.<locals>.<listcomp>F)rcr])Újoinrm©r$rMr]r%r+r&Úget_textnsÿz_DocumentNav.get_textz    list[str]cs‡fdd„ˆj||dDƒS)z Get Own Text.csg|]}ˆ |¡r|‘qSr%r—r˜r+r%r&ršxs
z-_DocumentNav.get_own_text.<locals>.<listcomp>©r])r_rœr%r+r&Ú get_own_textusz_DocumentNav.get_own_text)F)NFTF)TF)F)T)T)N)F)F)$r-r.r/r0Ú classmethodr9Ú staticmethodr?r4rBrDrFrGrJrKrOrQrWr\r_rjrmrYrprsrurxryr}r€r‡rr‘r–rrŸr%r%r%r&r1Osx    úü$  ür1c@s¤eZdZdZedddddœdd„ƒZeddddœdd    „ƒZeddd
œd d „ƒZeddd œdd„ƒZedddœdd„ƒZ    edddœdd„ƒZ
e ddddœdd„ƒZ dS)ÚInputsz-Class for parsing and validating input items.Úintr:)ÚyearÚmonthÚdayr!cCs^t}|tkr:|ddkr$|ddks0|ddkr4tnt}n |tkrFt}d|koX|kSS)z Validate day.rrédir)Ú
LONG_MONTHÚFEBÚFEB_LEAP_MONTHÚ    FEB_MONTHÚ    MONTHS_30Ú SHORT_MONTH)r¤r¥r¦Zmax_daysr%r%r&Ú validate_day~s .zInputs.validate_day)r¤Úweekr!cCsBt d dd|¡d¡ ¡d}|dkr*d}d|ko<|kSS)zValidate week.z{}-{}-{}é rz%m-%d-%Yré5)rÚstrptimer6Ú isocalendar)r¤r¯Zmax_weekr%r%r&Ú validate_week‰szInputs.validate_week)r¥r!cCsd|kodkSS)zValidate month.rr°r%)r¥r%r%r&Úvalidate_month’szInputs.validate_month)r¤r!cCsd|kS)zValidate year.rr%)r¤r%r%r&Ú validate_year˜szInputs.validate_year)Úhourr!cCsd|kodkSS)zValidate hour.rér%)r·r%r%r&Ú validate_houržszInputs.validate_hour)Úminutesr!cCsd|kodkSS)zValidate minutes.ré;r%)rºr%r%r&Úvalidate_minutes¤szInputs.validate_minutesr~rnztuple[float, ...] | None)Úityperr!c Cs€d}|dkr|S|dkr†t |¡}|r‚t| d¡dƒ}t| d¡dƒ}t| d¡dƒ}| |¡r‚| |¡r‚| |||¡r‚|||f}nö|dkrÜt |¡}|rØt| d¡dƒ}t| d¡dƒ}| |¡rØ| |¡rØ||f}n |dkr<t |¡}|r|t| d¡dƒ}t| d¡dƒ}| |¡r||     ||¡r|||f}n@|dkr˜t
 |¡}|r|t| d    ¡dƒ}    t| d
¡dƒ}
|  |    ¡r||  |
¡r||    |
f}nä|d krRt  |¡}|r|t| d¡dƒ}t| d¡dƒ}t| d¡dƒ}t| d    ¡dƒ}    t| d
¡dƒ}
| |¡r|| |¡r|| |||¡r||  |    ¡r||  |
¡r|||||    |
f}n*|d kr|t |¡}|r|t| d ¡ƒf}|S)zParse 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) r8r½rÚparsedÚmr¤r¥r¦r¯r·rºr%r%r&Ú parse_valueªsp
"
 
 
 
 
 
 
 
ÿÿ ÿþþ
 
zInputs.parse_valueN) r-r.r/r0r¡r®r´rµr¶r¹r¼r rÏr%r%r%r&r¢{s
r¢c@s eZdZdZddddddœdd    „Zd
d œd d „Zdddœdd„Zdd
dœdd„Zdddœdd„Zdddœdd„Z    dddœdd„Z
ddd
dœdd„Z ddddd œd!d"„Z dd#d
d$œd%d&„Z dd'd
d(œd)d*„Zdd#d
d$œd+d,„Zdd-d
d$œd.d/„Zddd
d0œd1d2„Zdxddd
d
d4œd5d6„Zddd
d0œd7d8„Zddd
d0œd9d:„Zdd;d
d<œd=d>„Zdd;d
d?œd@dA„Zdd
dœdBdC„Zdd
dœdDdE„Zddd
dFœdGdH„Zddd
dIœdJdK„Zdd
dœdLdM„ZddNd
dOœdPdQ„ZddRd
dSœdTdU„Zdd
dœdVdW„Zdd
dœdXdY„ZddZd
d[œd\d]„Z ddd
d^œd_d`„Z!ddd
daœdbdc„Z"dd
dœddde„Z#dd
dœdfdg„Z$ddd
dOœdhdi„Z%dyddkdlœdmdn„Z&dod œdpdq„Z'drd œdsdt„Z(dd
dœdudv„Z)dwS)zÚCSSMatchzPerform CSS matching.úct.SelectorListrúct.Namespaces | Noner£r)Ú    selectorsÚscopeÚ
namespacesÚflagsr!c    CsØ| |¡||_g|_g|_g|_||_|dkr4in||_||_d|_|}|     |¡}|rh|}|     |¡}qTd}| 
|¡s||}n|  |¡D] }|}q”q†||_ ||k    r¦|n||_ | |¡|_| |¡|_|j pÐ|j|_dS)r"NF)r9r3Úcached_meta_langÚcached_default_formsÚcached_indeterminate_formsrÓrÕrÖÚiframe_restrictrYr?rjrXrÔr}Úhas_html_namespacerQÚis_xmlrZ)    r$rÓrÔrÕrÖÚdocr[rXrlr%r%r&r'ås2    
 
 
  zCSSMatch.__init__r:r)cCs |jp
|jS)z3Check if namespaces are supported in the HTML type.)rÜrÛr+r%r%r&Úsupports_namespacesszCSSMatch.supports_namespacesr~rLcCs(| ¡r d}| |¡}|r$|}nt}|S)zGet tag namespace.r‚)rÞrur{)r$rMrtr|r%r%r&Ú
get_tag_nss
zCSSMatch.get_tag_nscCs| |¡tkS)z"Check if tag is in HTML namespace.)rßr{rVr%r%r&rUszCSSMatch.is_html_tagrncCs&| |¡}|dk    r"|js"t |¡S|S)roN)rprÜrrT©r$rMrSr%r%r&Úget_tag$s
zCSSMatch.get_tagcCs&| |¡}|dk    r"|js"t |¡S|S)rqN)rsrÜrrT)r$rMrrr%r%r&Ú
get_prefix*s
zCSSMatch.get_prefixr`c
CsÀ|j|ddD]¬}| |¡rvt t | |dd¡¡d¡}| |¡dks| |¡r|dk    rZq|     |¡}|dk    r|Sq| 
|¡r‚q|D]2}t   |¡}|dkr†|dkrªt jnt jSq†qdS)    z%Get directionality from element text.F©rcÚdirr‚N)ÚbdiÚscriptÚstyleÚtextarearR©ÚALÚRÚLrì)rjr4ÚDIR_MAPÚgetrrTrrárUÚ    find_bidirJÚ unicodedataÚ bidirectionalÚctÚ SEL_DIR_LTRÚ SEL_DIR_RTL)r$rMriÚ    directionrÚcÚbidir%r%r&rï0s*
 ÿþý
 
 
 zCSSMatch.find_bidi)Ú
lang_rangeÚlang_tagr!c Cs0d}t d|¡ ¡}| d¡}| ¡ d¡}t|ƒ}t|ƒ}d}d}    ||}
||    } |dkrt|dkrt|
st|
| krtdS|
dkr„|
| ks˜|
dkrœ|dkrœ| sœd}|d7}|    d7}    |r,||kr,||}
z ||    } Wntk
rìd}Yq¬YnX|
súd}q¬n(| |
kr|d7}nt| ƒdkr"d}q¬|    d7}    q¬|S)zFilter the language tags.Tú-rrÚ*F)Ú RE_WILD_STRIPÚsubrTÚsplitr*Ú
IndexError) r$rørùrÅÚrangesZsubtagsÚlengthZslengthÚrindexZsindexÚrÚsr%r%r&Úextended_language_filterTsB
$ 
 
 
 
z!CSSMatch.extended_language_filterrŠ)rMÚattrrrr!c
Csd}| ¡râd}|r6|j |¡}|dkr:|dkr:dSnd}| |¡D]š\}}| ||¡\}}    |dkr–|jrr||ksŒ|jsDt |¡t |¡krD|}qàqD|dksD||kr°|dkr°qD|jsÌt |¡t |    ¡krÖqD||    krÖqD|}qàqDn6| |¡D]*\}}t |¡t |¡kr qì|}qqì|S)z3Match attribute name and return value if it exists.Nrû)rÞrÕrîr‘r€rÜrrT)
r$rMrrrrr|rr‰rtrSr%r%r&Úmatch_attribute_nameŒs6 ($zCSSMatch.match_attribute_namezct.SelectorTag)rMr3r!cCsœd}| |¡}|j d¡}|jdkr(dn |j |j¡}|jdkrV|dk    rV||krVd}nB|jdk    rt|jdkrt|rtd}n$|jr˜|jdkr˜|dks”||kr˜d}|S)z#Match the namespace of the element.Tr‚NFrû)rßrÕrîrr)r$rMr3rÅrtÚdefault_namespaceZtag_nsr%r%r&Úmatch_namespaceÁs$
 ÿþþþzCSSMatch.match_namespacez tuple[ct.SelectorAttribute, ...])rMÚ
attributesr!cCsŠd}|r†|D]x}| ||j|j¡}|jr4|jr4|jn|j}|dkrJd}q†t|tƒrX|nd |¡}|dkrnq q |     |¡dkr d}q†q |S)zMatch attributes.TNFr )
rÚ    attributerrrÜZxml_type_patternÚpatternr<r~r›rÅ)r$rMr
rÅÚaÚtempr rr%r%r&Úmatch_attributesÖszCSSMatch.match_attributescCs>|js|jdk    rt |j¡n|j}|dk    o:|| |¡dfk S)zMatch tag name.Nrû)rÜrSrrTrá)r$rMr3rSr%r%r&Ú match_tagnameés"þzCSSMatch.match_tagnamezct.SelectorTag | NonecCs0d}|dk    r,| ||¡sd}| ||¡s,d}|S)zMatch the tag.TNF)r    r)r$rMr3rÅr%r%r&Ú    match_tagòs  zCSSMatch.match_tag)rMÚrelationr!cCsþd}t|dtjƒr|S|djtkr^|j||jd}|sú|rú| ||¡}|j||jd}q6nœ|djtkrŽ|j||jd}|rú| ||¡}nl|djt    krÈ| 
|¡}|sú|rú| ||¡}| 
|¡}q¦n2|djt krú| 
|¡}|rú|  |¡rú| ||¡}|S)zMatch past relationship.Frrž) r<ròÚ SelectorNullÚrel_typeÚ
REL_PARENTrYrÚÚmatch_selectorsÚREL_CLOSE_PARENTÚ REL_SIBLINGryÚREL_CLOSE_SIBLINGr4)r$rMrÚfoundr[rwr%r%r&Úmatch_past_relationsþs, 
 
 zCSSMatch.match_past_relationsF)r[rÚ    recursiver!cCsBd}|r|j}n|j}|||jdD]}| ||¡}|r$q>q$|S)zMatch future child.Frž)rmrjrÚr)r$r[rrrÅÚchildrenrlr%r%r&Úmatch_future_childs zCSSMatch.match_future_childcCsÂd}t|dtjƒr|S|djtkr6| ||d¡}nˆ|djtkrR| ||¡}nl|djtkrŒ| |¡}|s¾|r¾|     ||¡}| |¡}qjn2|djt
kr¾| |¡}|r¾|  |¡r¾|     ||¡}|S)zMatch future relationship.FrT) r<ròrrÚREL_HAS_PARENTrÚREL_HAS_CLOSE_PARENTÚREL_HAS_SIBLINGrxrÚREL_HAS_CLOSE_SIBLINGr4)r$rMrrrwr%r%r&Úmatch_future_relations(s"
 
 zCSSMatch.match_future_relationscCsTd}t|dtjƒs"|djdkr&|S|dj d¡rD| ||¡}n | ||¡}|S)z%Match relationship to other elements.FrNú:)r<ròrrÚ
startswithr#r)r$rMrrr%r%r&Úmatch_relations?s zCSSMatch.match_relationsztuple[str, ...])rMÚidsr!cCs,d}|D]}|| |dd¡krd}q(q|S)zMatch element's ID.TÚidr‚F)r)r$rMr'rÚir%r%r&Úmatch_idNs zCSSMatch.match_id)rMr•r!cCs,| |¡}d}|D]}||krd}q(q|S)zMatch element's classes.TF)r–)r$rMr•Zcurrent_classesrrör%r%r&Ú match_classesXs
zCSSMatch.match_classescCsÂ| |¡}|rd|j|dd}|rd|dk    rd| |¡sN| |¡rD| ¡sN| |¡rTd}q|j|dd}q|r¾|j|dd}|r¾|dk    r¾| |¡s¨| |¡rž| ¡s¨| |¡r®d}qv|j|dd}qv|S)zMatch element as root.FrãN)r\ryr4rKÚstriprDrx)r$rMr\rwr%r%r&Ú
match_rootcs8
 ÿÿÿþ ÿÿÿþzCSSMatch.match_rootcCs
|j|kS)zMatch element as scope.)rÔrVr%r%r&Ú match_scope}szCSSMatch.match_scope)rMrlr!cCs(| |¡| |¡ko&| |¡| |¡kS)z!Match tag type for `nth` matches.)rárß)r$rMrlr%r%r&Úmatch_nth_tag_type‚sþzCSSMatch.match_nth_tag_type)rMÚnthr!cCsd}|D]}d}|jr,| ||j¡s,q| |¡}|dkrH| |¡}|j}t|ƒd}|rb|nd}d}    |j}
|j} |j} d} d}|rŒdnd}| r |
| | n|
}}| rîd}|dksÄ||krŠ|dkr(d|}|dk    rê|dkrêqŠd}| |7} | r|
| | n|
}}d|}||krˆqŠq²||}|dk    rH|dkrHqŠd}| |7} | rf|
| | n|
}}||}||kr„qŠ|}q²| }|
dkrÐ|dkrÌ| }| |7} | rÀ|
| | n|
}}q˜d}|} | ræ|
| | n|
}}d|kr
|dkrnnød}|j    |||dkddD]Œ}||7}| 
|¡sDq(|jr`| ||j¡s`q(|j rz|  ||¡szq(|    d7}    |    |kr¢||krœd}nq¶||kr(q¶q(||krĐq|}| |7} | dkrސq| rð|
| | n|
}||krîqqî|sqq|S)zMatch `nth` elements.TFNrrrd)rarbrc) rÓrrYrOrer*r ÚbÚnrjr4Zof_typer/)r$rMr0Úmatchedr2r[reÚ
last_indexrfZrelative_indexr r1ÚvarÚcountZ
count_incrZfactorÚidxZlast_idxÚadjustZdiff_lowZdiffZ    diff_highZlowestrlr%r%r&Ú    match_nthŠs 
 
 
 
 
 
 
 
  
 
 
 
 
 
 
zCSSMatch.match_nthcCsLd}|j|ddD]4}| |¡r*d}qHq| |¡rt |¡rd}qHq|S)z)Check if element is empty (if requested).TFrã)rjr4rKÚ RE_NOT_EMPTYÚsearch)r$rMZis_emptyrlr%r%r&Ú match_emptyïs
zCSSMatch.match_emptyztuple[ct.SelectorList, ...])rMrÓr!cCs"d}|D]}| ||¡sd}q|S)zMatch selectors.TF)r)r$rMrÓrÅÚselr%r%r&Úmatch_subselectorsüs
 zCSSMatch.match_subselectorsztuple[ct.SelectorContains, ...])rMÚcontainsr!c    Cs˜d}d}|D]†}|dkr@|jr0|j||jd}n|j||jd}d}|jD]>}|jrx|D]}||krXd}qnqX|rˆqŠqJ||krJd}qŠqJ|s d}q |S)z"Match element if it contains text.TNržF)ZownrŸrZrÚtext)    r$rMr?rÅr^Z contain_listrr@rör%r%r&Úmatch_containss,
zCSSMatch.match_containsc Csúd}d}|j|dd}|rP|dkrP| |¡dkr@| |¡r@|}q|j|dd}qd}|jD]$\}}||krZd}||krzd}q€qZ|sö|j|ddD]b}| |¡}    |    dkr¬qö|    dkr’| |dd¡}
|
r’t |
¡d    kr’|j ||f¡||krðd}qöq’|S)
úMatch default.FNTržÚform)ÚinputÚbuttonr7r‚Zsubmit)    rYrárUrØrmrrrTr†) r$rMrÅrCr[Ú
found_formÚfÚtrlrSr‰r%r%r&Ú match_default!s6 
zCSSMatch.match_defaultcsjd}ttˆ |d¡ƒ}dddœ‡fdd„ }||ƒ}d}ˆjD].\}}}    ||kr<||kr<d}|    dkrfd}qlq<|sfd}
ˆj|dd    D]Ä} | |kr’q„ˆ | ¡} | d
kr>d} d}d}ˆ | ¡D]€\}}t |¡d kræt |¡d kræd} n4t |¡dkr||krd}nt |¡d krd}| r¼|r¼|r¼|| ƒ|kr¼d}
q>q¼|
r„qJq„|
sTd}ˆj     |||f¡|S)rBFrSrúbs4.Tag | NonerLcs^d}ˆj|dd}|dkrZˆ |¡dkr8ˆ |¡r8|}qZ|}ˆj|dd}|dkr|}qZq|S)zFind this input's form.NTržrC)rYrárU)rMrCr[Z last_parentr+r%r&Úget_parent_formNsz5CSSMatch.match_indeterminate.<locals>.get_parent_formTržrDr7ZradioÚchecked)
r r~rrÙrmrár‘rrTr†)r$rMrÅrSrKrCrFrGr2r)rLrlZtag_nameZis_radioÚcheckZhas_namerr‰r%r+r&Úmatch_indeterminateHsJ
 
zCSSMatch.match_indeterminateztuple[ct.SelectorLang, ...])rMÚlangsr!cCsØd}| ¡}|j}|j}|}d}d}    |sà| |¡}
| |¡D]p\} } | || ¡\} }|r\|
rt|jslt | ¡n| dks¤|r<|
s<| t    kr<|jsœ|dk    rœt |¡n|dkr<| }q®q<|}    |j
||j d}|dkr$|    }| |¡}|    }qàq$|dkr|j r|j D]}||dkrø|d}qø|dkrŠ|jr6|rŠ|j dkrŠd}dD]X}d}|j||j dD]0}| |¡|krV| |¡rVd    }|}qˆqV|s>q˜q>|rŠ|D]Æ}| |¡rV| |¡d
krV| |¡rVd}d}| |¡D]t\} } t | ¡d kr t | ¡d kr d    }t | ¡d kr | }|rà|rà|}|j  tt|ƒtt|ƒf¡qVqà|dk    r¢qjq¢|dkrŠ|j  tt|ƒdf¡|dk    rÔ|D]:}d}|D]}| |tt|ƒ¡r¤d    }q¤|s˜qԐq˜|S)zMatch languages.FNÚlangržrrÚhtml)rQÚheadTÚmetaz
http-equivzcontent-languager^r‚)rÞrXrÛr}r‘r€rÜrrTÚNS_XMLrYrZr×rSrjrárUr4r†r r~r)r$rMrOrÅZhas_nsrXrÛr[Z
found_langrer}rr‰Zattr_nsrÚcacherr3rlZc_langr^Úpatternsr r%r%r&Ú
match_lang…s˜
ÿÿÿýýýü
 
 
$
 
(  
 
 
 
 
 
zCSSMatch.match_lang)rMÚdirectionalityr!c    Cs2|tj@r|tj@rdS|dks*| |¡s.dSt t | |dd¡¡d¡}|dkrZ||kS|     |¡}|rz|dkrztj|kS| 
|¡}|dk}|dk}|dk}|r´t | |d    d¡¡nd}    |rÖ|    d
krÖ|dkrÖtj|kS|râ|    d ksè|rÀ|d krÀ|r4g}
|j |d dD]} |  | ¡r
|
  | ¡q
d |
¡} ntt| |dd¡ƒ} | rš| D]<} t | ¡}|dkrR|dkrztjntj}||kSqRtj|kS|rªtj|kS| |j|d d|¡S|rÐ|dksÚ|d kr| |¡}|dk    rö||kS|rtj|kS| |j|d d|¡S| |j|d d|¡S)zCheck directionality.FNrär‚)NrrDrèrår7Útel)r@r;rYÚurlÚemailrTržrrérì)ròrórôrUrírîrrTrr\rár_rKr†r›r r~rðrñÚ    match_dirrYrï)r$rMrXrõr\rSZis_inputZ is_textareaZis_bdir½rrirrör÷r%r%r&r\ÛsV
 
 
 
 
 
 
 
 
 
 
zCSSMatch.match_dir)rMÚ    conditionr!c
CsBd}t | |d¡¡}t |tt| |dd¡ƒ¡}t |tt| |dd¡ƒ¡}|dkrb|dkrbdSt |tt| |dd¡ƒ¡}|dk    r,|dkr¾|dk    r¤||kr¤d}|s¼|dk    r¼||kr¼d}nn|d    kr,|dk    rö|dk    rö||krö||krô||krôd}n6|dk    r||krd}|s,|dk    r,||kr,d}|tj@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.
        Fr7ÚminNÚmaxr)r¾rÁr¥r¯rÂrÃTrÀ)    rrTrr¢rÏr r~ròÚ SEL_IN_RANGE)r$rMr]Z out_of_ranger½ÚmnZmxrr%r%r&Ú match_ranges,
 
 
zCSSMatch.match_rangecCs<| |¡}|dk    o:| d¡dkp:| d¡dkp:| |¡dk    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úrdr$)ráÚfindrâràr%r%r&Ú match_definedBs
 ÿ üzCSSMatch.match_definedcCsd}| |¡}|dkrd}|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$rMrÅr^r%r%r&Úmatch_placeholder_shownYs
 
z CSSMatch.match_placeholder_shownc    Cs>d}|j}|j}|r0|j}|j}dti|_d|_|r<|jr(|D]ä}|}t|tjƒrXq@| ||j    ¡shq@|j
tj @r€|  |¡s€q@|j
tj @r˜| |¡s˜q@|j
tj@r°| |¡s°q@|j
tj@rÈ| |¡sÈq@| ||j¡sØq@|j
tj@rð| |¡sðq@|jr
| ||j¡s
q@|jr$| ||j¡s$q@| ||j¡s6q@|j
t@rX| ||j
t@¡sXq@|jrr|  ||j¡srq@|j!rŒ| "||j!¡sŒq@|j#r¦| $||j#¡s¦q@|j
tj%@rÂ| &|¡sÂq@|j
tj'@rÞ| (|¡sÞq@|j
t)@r| *||j
t)@¡sq@|j+r| ,||j+¡sq@| }q(q@|r:||_||_|S)z.Check if element matches one of the selectors.FrQT)-Úis_notrZrÕrÚr{r<ròrrr3rÖZ SEL_DEFINEDrdZSEL_ROOTr-Z    SEL_SCOPEr.ZSEL_PLACEHOLDER_SHOWNrfr9r0Z    SEL_EMPTYr<r'r*r•r+rr
ÚRANGESrbrPrWrÓr>rr&Z SEL_DEFAULTrIZSEL_INDETERMINATErNÚ    DIR_FLAGSr\r?rA)    r$rMrÓrÅrgrZrÕrÚÚselectorr%r%r&rhsn
 
   zCSSMatch.match_selectorsrúIterator[bs4.Tag])Úlimitr!ccsR|dkr dn|}| |j¡D]0}| |¡r|V|dk    r|d8}|dkrqNqdS)z&Match all tags under the targeted tag.rN)rmr3rÅ)r$rlZlimrlr%r%r&Úselect¼s
zCSSMatch.selectrJcCs:|j}d}|dkr6|dk    r6| |¡r*|}q
| |¡}q
|S)úMatch closest ancestor.N)r3rÅrY)r$ÚcurrentÚclosestr%r%r&rpÉs
 zCSSMatch.closestú list[bs4.Tag]cs‡fdd„ˆ ˆj¡DƒS)zFilter tag's children.cs$g|]}ˆ |¡sˆ |¡r|‘qSr%)rGrÅ)r™r3r+r%r&ršØs
 
z#CSSMatch.filter.<locals>.<listcomp>)r_r3r+r%r+r&ÚfilterÕszCSSMatch.filtercCs$| |¡ o"| |¡o"| ||j¡S©zMatch.)r?r4rrÓrVr%r%r&rÅÚszCSSMatch.matchN)F)r)*r-r.r/r0r'rÞrßrUrárârïrrr    rrrrrr#r&r*r+r-r.r/r9r<r>rArIrNrWr\rbrdrfrrmrprrrÅr%r%r%r&rÐâsN) $85     
 e     '=V?(T  rÐcsÖeZdZUdZded<ded<ded<ded    <d
ed <d Zdddd d
dœ‡fdd„ Zdddœdd„Zdddœdd„Zdddœdd„Z    dddœdd„Z
d)dd
dd œd!d"„Z d*dd
d#d œd$d%„Z dd&œd'd(„Z e Z‡ZS)+Ú    SoupSievez-Compiled Soup Sieve selector matching object.r~r rÑrÓrÒrÕzdict[str, str]Úcustomr£rÖ)r rÓrÕrurÖÚ_hashzct.CustomSelectors | None©r rÓrÕrurÖcstƒj|||||ddS)r"rwN)Úsuperr')r$r rÓrÕrurÖ©Ú    __class__r%r&r'ës
ûzSoupSieve.__init__rr:r2cCst|j||j|jƒ |¡Srs)rÐrÓrÕrÖrÅ©r$r3r%r%r&rÅýszSoupSieve.matchcCst|j||j|jƒ ¡S)rn)rÐrÓrÕrÖrpr{r%r%r&rpszSoupSieve.closestzIterable[bs4.Tag]rq)Úiterabler!cs8t |¡r"tˆj|ˆjˆjƒ ¡S‡fdd„|DƒSdS)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.
        cs$g|]}t |¡sˆ |¡r|‘qSr%)rÐrGrÅr˜r+r%r&ršs
 
z$SoupSieve.filter.<locals>.<listcomp>N)rÐr4rÓrÕrÖrr)r$r|r%r+r&rrs
zSoupSieve.filtercCs|j|dd}|r|dSdS)zSelect a single tag.r)rlrN)rm)r$r3rcr%r%r&Ú
select_oneszSoupSieve.select_oner)r3rlr!cCst| ||¡ƒS)zSelect the specified tags.)ÚlistÚiselect)r$r3rlr%r%r&rmszSoupSieve.selectrkccs*t|j||j|jƒ |¡D]
}|VqdS)zIterate the specified tags.N)rÐrÓrÕrÖrm)r$r3rlrMr%r%r&r#szSoupSieve.iselectr)cCsd |j|j|j|j¡S)zRepresentation.zASoupSieve(pattern={!r}, namespaces={!r}, custom={!r}, flags={!r}))r6r rÕrurÖr+r%r%r&Ú__repr__)s üzSoupSieve.__repr__)r)r)r-r.r/r0Ú__annotations__Ú    __slots__r'rÅrprrr}rmrr€Ú__str__Ú __classcell__r%r%ryr&rtàs 
 
rt);r0Ú
__future__rrr‚rÚrerròrðr=Útypingrrr    r
r r Úcompiler:r“rrrrrr r!r"r{rTrórôrir`ZSEL_OUT_OF_RANGErhrírËrÉrÇrÈrÄrÊrür¬r©r­r¨r«rªZ DAYS_IN_WEEKrr1r¢rÐZ    ImmutablertZpickle_registerr%r%r%r&Ú<module>st     
 
  ý
 
 
 
 
ÿ
.gV