6,jdZddlmZddlmZddlmZddlZddlmZddl Z ddl Z ddl m Z m Z mZmZmZmZmZejd Zejd Zd Zd Zd ZdZdZdZdZdZdZdZejej zZ!ej"ej#zZ$ejej ddZ%ejdZ&ejdZ'ejdZ(ejdZ)ejdZ*ejdZ+ejdZ,dZ-dZ.dZ/d Z0d!Z1d"Z2d#Z3Gd$d%Z4Gd&d'Z5Gd(d)Z6Gd*d+e5Z7Gd,d-ej8Z9ej:e9dS).z CSS matcher.) annotations)datetime)utilN) css_types)IteratorIterableAnyCallableSequencer castz[^ ]z [^ ]+ >~+z: z:>z:~z:+zhttp://www.w3.org/1999/xhtmlz$http://www.w3.org/XML/1998/namespace)ltrrtlautoz0^(?P-?(?:[0-9]{1,}(\.[0-9]+)?|\.[0-9]+))$z*^(?P[0-9]{2}):(?P[0-9]{2})$z)^(?P[0-9]{4,})-(?P[0-9]{2})$z)^(?P[0-9]{4,})-W(?P[0-9]{2})$z;^(?P[0-9]{4,})-(?P[0-9]{2})-(?P[0-9]{2})$zd^(?P[0-9]{4,})-(?P[0-9]{2})-(?P[0-9]{2})T(?P[0-9]{2}):(?P[0-9]{2})$z(?:(?:-\*-)(?:\*(?:-|$))*|-\*$)) c"eZdZdZd dZd dZd 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. elementbs4.TagreturnNonec|g|_dS) Initialize.N)contents)selfr!s CC:\PYTHON\GemmaClient\venv\Lib\site-packages\soupsieve/css_match.py__init__z_FakeParent.__init__Ds!  intc*t|jS)zLength.)lenr'r(s r)__len__z_FakeParent.__len__Is4=!!!r+N)r!r"r#r$)r#r,)__name__ __module__ __qualname____doc__r*r0r+r)r r ;sF"""" """"""r+r ceZdZdZedEdZedFd ZedFd ZedFd Z edFd Z edFdZ edFdZ edFdZ edFdZedGdZedHdZdHdZdIdZdJdKdZ dLdMd#Z dNdOd%Z dJdPd&Z dQdRd'ZdJdSd(ZedTd*ZedUd+ZedTd,ZedVd-ZedJdWd.ZedXdYd0ZedJdWd1ZedHd2Z edZd6Z!ed[d9Z"e d\d]d=Z#ed^d?Z$ed_dAZ%dJd`dBZ&dJdadDZ'dS)b _DocumentNavz#Navigate a Beautiful Soup document.tagr r#r$cn||stdt|dS)z%Check if valid input tag or document.z:Expected a BeautifulSoup 'Tag', but instead received type N)is_tag TypeErrortype)clsr8s r)assert_valid_inputz_DocumentNav.assert_valid_inputRsD zz# fdY]^aYbYbddee e f fr+objbs4.element.PageElement | Noneboolc6t|tjS)zIs `BeautifulSoup` object.) isinstancebs4 BeautifulSoupr?s r)is_docz_DocumentNav.is_docZs#s0111r+c6t|tjS)zIs tag.)rCrDTagrFs r)r:z_DocumentNav.is_tag_s#sw'''r+c6t|tjS)zIs declaration.)rCrD DeclarationrFs r)is_declarationz_DocumentNav.is_declarationds#s///r+c6t|tjS)z Is CDATA.)rCrDCDatarFs r)is_cdataz_DocumentNav.is_cdatais#sy)))r+c6t|tjS)zIs processing instruction.)rCrDProcessingInstructionrFs r)is_processing_instructionz&_DocumentNav.is_processing_instructionns#s8999r+c@t|tjjS)zIs navigable string.)rCrDr!NavigableStringrFs r)is_navigable_stringz _DocumentNav.is_navigable_stringss#s{:;;;r+ct|tjtjtjtjtjfS)zIs special string.)rCrDCommentrKrNrQDoctyperFs r)is_special_stringz_DocumentNav.is_special_stringxs,# S_ciIbdgdopqqqr+cX||o|| S)z Check if node is content string.)rUrY)r=r?s r)is_content_stringz_DocumentNav.is_content_string}s.&&s++NC4I4I#4N4N0NNr+elr"r c t|S)z'Create fake parent for a given element.)r r\s r)create_fake_parentz_DocumentNav.create_fake_parents2r+bs4.Tag | Nonec2|duot|jS)z2Check if element (or document) is from a XML tree.N)rA_is_xmlr^s r) is_xml_treez_DocumentNav.is_xml_trees~2$rz"2"22r+c|dSt||r|jntj|jdko||S)z Check if element is an `iframe`.NFiframe)rArcnamerlower is_html_tagr(r\s r) is_iframez_DocumentNav.is_iframesc :5))"--Fbgg4:bg3F3F8 S !   R    r+c|jo|j|u}|s5||}|duo|jo||}|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_parentis_htmlrj)r(r\rlparents r)is_rootz_DocumentNav.is_rootsWy,TY"_ R__R((F%Q$,Q4>>&;Q;QD r+F no_iframe!Iterator[bs4.element.PageElement]c#^K|&|r||s|jEd{VdSdSdS)z$Get contents or contents in reverse.N)rjr'r(r\rqs r) get_contentsz_DocumentNav.get_contentssY > 'DNN2$6$6 ';&&&&&&&&& > ' 'r+Nstart int | NonereverseIterator[bs4.Tag]c4||||d|S)zGet tag children.T) get_children)r(r\rvrxrqs r)get_tag_childrenz_DocumentNav.get_tag_childrens   UGT9EEEr+tagsc#BK||r||st|jdz }||r|nd}n|}|rdn|dz}|rdnd} d|cxkr|krCndS||kr;|j|} || z }|r|| r| V||k3dSdSdSdSdS)z Get children.Nrr)rjr.r'r:) r(r\rvrxr}rqlastindexendincrnodes r)r{z_DocumentNav.get_childrens >9>DNN24F4F>r{##a'D} '.Q-""TAXC '22aDE!!!!T!!!!!!sll;u-DTME#4;;t#4#4#" sllll >>>"!"lr+c#FK||d|Ed{VdS)z!Specifically get tag descendants.T)r}rqN)get_descendantsrts r)get_tag_descendantsz _DocumentNav.get_tag_descendantss;'''KKKKKKKKKKKr+c#K||r||sd}|jD]}|||ur d}t|tjr|r||rq|j|j}nX|}t|tjr5|jr.|jd}t|tjr|j.|j}|V|dS|V|s|VdSdSdS)zGet descendants.Nr)rj descendantsrCrDrI next_siblingr' next_element)r(r\r}rq next_goodchild last_childs r)rz_DocumentNav.get_descendantss9 >9>DNN24F4F>I  (I-- $IeSW--  !T^^E%:%: ! -9(-(:II).J",Z"A"AEjFYE-7-@-D #-Z"A"AEjFYE(2(?I# $,!EE KKKK KKK5 >>>  r+cR||jnd}|r|||rd}|S)z Get parent.N)rorj)r(r\rqros r)rmz_DocumentNav.get_parents;!n$  +v0F0F+F r+ str | Nonec||jndS)Get tag.N)rfr^s r) get_tag_namez_DocumentNav.get_tag_name s.rwwd2r+c|jSz Get prefix.)prefixr^s r)get_prefix_namez_DocumentNav.get_prefix_names yr+c||jndS)zGet namespace `URI`.N) namespacer^s r)get_uriz_DocumentNav.get_uris "~r||47r+c0||dS)Get next sibling tag.T)r})get_next)r=r\s r) get_next_tagz_DocumentNav.get_next_tags||BT|***r+c|j}|rAt|tjs'|%|j}|rt|tjs|%|rt|tjsd}|S)rN)rrCrDrIr=r\r}siblings r)rz_DocumentNav.get_next!s|/ +:gsw77 +G***r+ attr_namestrtuple[str | None, str | None]cN|dSt|ddt|ddfS)z7Return namespace and attribute name without the prefix.N)NNrrf)r)r\rs r)split_namespacez_DocumentNav.split_namespaceMs2 ::y+t44giQU6V6VVVr+valuestr | Sequence[str]c |dSt|tr|St|tr|dSt|trg}|D]}t|ttfs8t|tr#|t|V|t t|||St|S)z6Normalize the value to be a string or list of strings.Nutf8)rCrbytesdecoder appendr normalize_value)r=r new_valuevs r)rz_DocumentNav.normalize_valueVs =2 uc " " L eU # # (<<'' ' eX & & I H H!!c5\22Hz!X7N7NH$$SVV,,,,$$T#s/B/B1/E/E%F%FGGGG 5zzr+rfdefaultstr | Sequence[str] | Nonec|}|jr2 ||j|}n^#t$rYnRwxYw|jD]4\}}t j||kr||}n5|S)zGet attribute by name.)rbrattrsKeyErroritemsrrg)r=r\rfrrkrs r)get_attribute_by_namez"_DocumentNav.get_attribute_by_namews :  ++BHTN;;    ((  1:a==D((//22EE) s , 990Iterator[tuple[str, str | Sequence[str] | None]]c#K|8|jD] \}}|||fVdSdS)zIterate attributes.N)rrr)r=r\rrs r)iter_attributesz_DocumentNav.iter_attributess_ >(( 0 01,,Q/////// > 0 0r+ Sequence[str]c||dg}t|trt|}t t t|S)z Get classes.class)rrCr RE_NOT_WSfindallr r )r=r\classess r) get_classesz_DocumentNav.get_classessT++B<< gs # # 1''00GHSM7+++r+cpdfd||DS)z Get text.rc>g|]}||Sr5r[.0rr(s r) z)_DocumentNav.get_text..s=   ))$//    r+rq)joinrrts` r)get_textz_DocumentNav.get_textsTww    !%!5!5bI!5!N!N      r+ list[str]cJfd||DS)z Get Own Text.c>g|]}||Sr5rrs r)rz-_DocumentNav.get_own_text..s=   4KaKabfKgKg    r+r)rurts` r) get_own_textz_DocumentNav.get_own_textsA    !..rY.GG    r+)r8r r#r$)r?r@r#rA)r\r"r#r r\r`r#rAr\r"r#rAF)r\r`rqrAr#rr)NFF) r\r`rvrwrxrArqrAr#ry)NFFF) r\r`rvrwrxrAr}rArqrAr#rr)r\r`rqrAr#ry)FF)r\r`r}rArqrAr#rr)r\r`rqrAr#r`r\r`r#rr\r"r#rr\r"r#r`)r\r"r}rAr#r@)T)r\r"r}rAr#r`)r\r`rrr#r)rr r#rN)r\r"rfrrrr#r)r\r`r#r)r\r"r#r)r\r"rqrAr#r)r\r"rqrAr#r)(r1r2r3r4 classmethodr> staticmethodrGr:rLrOrRrUrYr[r_rcrjrprur|r{rrrmrrrrrrrrrrrrrrrr5r+r)r7r7Osc--fff[f222\2(((\(000\0***\*:::\:<<<\<rrr\rOOO[O \ 333\3         '''''! F F F F F! #####: LLLLL " " " " " H333\3 \ 888\8 +++[+     [ ****[*     [  + + +\ +WWW\W[@ /3 [*000[0,,,[,            r+r7ceZdZdZeddZedd Zedd Zedd ZeddZ eddZ e ddZ dS)Inputsz-Class for parsing and validating input items.yearr,monthdayr#rAct}|tkr*|dzdkr |dzdks |dzdkrtnt}n|tvrt }d|cxko|kncS)z Validate day.rrdir) LONG_MONTHFEBFEB_LEAP_MONTH FEB_MONTH MONTHS_30 SHORT_MONTH)rrrmax_dayss r) validate_dayzInputs.validate_daysz C<<+/!8q==tczQUY\_U_cdUdUd~~ktHH i  "HC####8#####r+weekctt|ddd}d|cxko|kncS)zValidate week. rr)r isocalendar)rrmax_weeks r) validate_weekzInputs.validate_weeksHD"b))5577:D$$$$H$$$$$r+c"d|cxkodkncS)zValidate month.rrr5)rs r)validate_monthzInputs.validate_months&ERr+cd|kS)zValidate year.rr5)rs r) validate_yearzInputs.validate_yearsDyr+hourc"d|cxkodkncS)zValidate hour.rr5)rs r) validate_hourzInputs.validate_hoursDBr+minutesc"d|cxkodkncS)zValidate minutes.r;r5)rs r)validate_minuteszInputs.validate_minutess&G!!!!r!!!!!r+ityperrrtuple[float, ...] | Nonec\d}||S|dkrt|}|rt|dd}t|dd}t|dd}||r1||r||||r|||f}nR|dkrt|}|rtt|dd}t|dd}||r||r||f}n|dkrt|}|rut|dd}t|dd}||r| ||r||f}n!|dkrt|}|rtt|d d} t|d d} | | r| | r| | f}n|d kr?t|}|r!t|dd}t|dd}t|dd}t|d d} t|d d} ||r]||rH||||r1| | r| | r|||| | f}nC|d vr?t|}|r#t|d f}|S)zParse the input value.Ndater rrrtimerrdatetime-local)numberranger)RE_DATEmatchr,grouprrrRE_MONTHRE_WEEKrRE_TIMErr RE_DATETIMERE_NUMfloat) r=rrparsedmrrrrrrs r) parse_valuezInputs.parse_values =L F?? e$$A 01776??B//AGGG,,b11!''%.."--$$T**0s/A/A%/H/H0SM]M]^bdiknMoMo0"E3/F g  u%%A +1776??B//AGGG,,b11$$T**+s/A/A%/H/H+"E]F f__ e$$A *1776??B//1776??B//$$T***s/@/@t/L/L*"D\F f__ e$$A -1776??B//aggi00"55$$T**-s/C/CG/L/L-"G_F & & &!!%((A ?1776??B//AGGG,,b11!''%.."--1776??B//aggi00"55%%d++?030B0B50I0I?NQN^N^_cejloNpNp?%%d++?030D0DW0M0M?#E3g>F ) ) ) U##A 4 0 0113 r+N)rr,rr,rr,r#rA)rr,rr,r#rA)rr,r#rA)rr,r#rA)rr,r#rA)rr,r#rA)rrrrr#r) r1r2r3r4rrrrrrrrrr5r+r)rrs77$$$\$%%%\%"   \ \ \ """\" 444[444r+rcFeZdZdZdXd ZdYdZdZdZd[dZd\dZd]dZ d^dZ d_dZ d`dZ dad"Z dbd%Zdad&Zdcd(Zddd*Zdedfd.Zddd/Zddd0Zdgd3Zdhd5Zdid6Zdid7Zdjd9Zdkd<Zdid=Zdld?ZdmdBZdidCZdidDZdndGZ dodIZ!dpdKZ"didLZ#didMZ$dqdNZ%drdsdRZ&dtdSZ'dudUZ(didVZ)dWS)vCSSMatchzPerform CSS matching. selectorsct.SelectorListscoper` namespacesct.Namespaces | Noneflagsr,r#r$c,||||_g|_g|_g|_||_|in||_||_d|_|}| |}|r|}| |}|d}| |s|}n| |D]}|}||_ ||ur|n||_ |||_|||_|j p|j|_dS)r&NF)r>r8cached_meta_langcached_default_formscached_indeterminate_formsrr r"iframe_restrictrmrGr|rlrrhas_html_namespacercis_xmlrn) r(rrr r"docrorlrs r)r*zCSSMatch.__init__#sD &&& "$&!*,'" * 2""  $%% *C__S))F *{{3 DD..s33   #3..UUD "&"2"24"8"8&&s++ ;A$*A r+rAc|jp|jS)z3Check if namespaces are supported in the HTML type.)r)r(r/s r)supports_namespaceszCSSMatch.supports_namespacesLs{5d55r+r\rc|d}||S|r||}|r|}nt}|S)zGet tag namespace.r)r,rr)r(r\rrs r) get_tag_nszCSSMatch.get_tag_nsQsR :   # # % % !b!!B   Ir+c>||tkS)z"Check if tag is in HTML namespace.)r.rris r)rhzCSSMatch.is_html_tag`sr""h..r+rcj||}||jstj|n|S)r)rr)rrgr(r\rfs r)get_tagzCSSMatch.get_tages8  $$#'#3DK#3tz$TQr+r"cj||}||jstj|n|Sr)rr)rrg)r(r\rs r) get_prefixzCSSMatch.get_prefixks9%%b))%+%7 %7tz&!!!QWWr+rwc ,||D]}||rtt j||ddd}||}|r|dvs||r|| |}||cS| |r|D]<}tj |}|dvr"|dkr tjn tjccS=dS)z%Get directionality from element text.dirrN)bdiscriptstyletextareareALRLr>)r{r:DIR_MAPgetrrgrr2rh find_bidirY unicodedata bidirectionalct SEL_DIR_LTR SEL_DIR_RTL)r(r\r directionrfrcbidis r)rAzCSSMatch.find_bidiqsW%%b)) M MD{{4   $KK 43M3MdTY[]3^3^(_(_aeff ||D))"&VVV((..W)t,,$ LLL%%d++  M M"033+++-1S[[2>>bnLLLLL, Mtr+ lang_rangelang_tagcxd}td|}|d}|d}t |}t |}d}d} ||} || } |dkr|dkr | s| | krdS| dkr| | ks| dkr |dkr| sd}|dz }| dz } |r^||krX||} || } n#t $rd}Y(wxYw| sd}1| | kr|dz }nt | dkrd}S| dz } |r||kX|S)zFilter the language tags.T-rr*F) RE_WILD_STRIPsubrgsplitr. IndexError) r(rJrKrrangessubtagslengthslengthrindexsindexrss r)extended_language_filterz!CSSMatch.extended_language_filters"&&sJ77==?? !!#&&..""((--Vg,, 6N FO Q;;7a<<||r|s||rd}n||}|r|o|r||}|rq|o||s>||r|s||rd}n||}|r|o|S)zMatch element as root.NF)rprr:r[striprOr)r(r\rprs r) match_rootzCSSMatch.match_rootsd,,r""  9''++G 9g1KK((9-1-C-CG-L-L9QXQ^Q^Q`Q`9MM'**9$GG"//88G 9g1  5mmB''G 5g1KK((5-1-C-CG-L-L5QXQ^Q^Q`Q`5MM'**5$GG"mmG44G 5g1r+c|j|uS)zMatch element as scope.)rris r) match_scopezCSSMatch.match_scopeszRr+rc||||ko+||||kS)z!Match tag type for `nth` matches.)r2r.)r(r\rs r)match_nth_tag_typezCSSMatch.match_nth_tag_typesN\\% DLL$4$4 4 < __U # #tr':': : r+nthtuple[ct.SelectorNth, ...]cd}|D][}d}|jr|||jsn3||}|#td||}|j}t |dz }|r|nd}d} |j} |j} |j } d} d}|rdnd}| r| | z| zn| x}}| rd}|dks||krs|dkr0d|z }||dkrn_d}| |z } | r| | z| zn| x}}d|z }||krn>n1||z }||dkrn/d}| |z } | r| | z| zn| x}}||z }||krn|}|dkm||ks| }| dkr#|dkr| }| |z } | r| | z| zn| x}}|dkd}|} | r| | z| zn| x}}d|cxkr |dzkrnnd}| |||dkD]}}||z }t|tj s"|jr|||jsE|jr|||sc| dz } | |kr ||urd}nn||urn~||urn3|}| |z } | dkrn%| r| | z| zn| }||krnd|cxkr |dzkn|sn]|S) zMatch `nth` elements.TFNr"rrr)rvrx)rrwrmr r_rr.rjbnr{rCrDrIof_typer)r(r\rmatchedrror last_indexrrelative_indexrjrvarcount count_incrfactoridxlast_idxadjustdiff_lowdiff diff_highlowestrs r) match_nthzCSSMatch.match_nths] ] AG{ 4#7#7AK#H#H __R((F~i)@)@)D)DEE6DVqJ"&-JJAENAA#CEJ&RRQF.18QY]]q 8C(& =Aggz!1!1Qww#$s7!-&A++!!#+:=)DUQ1Dh 3w8++!,%(*$4 !-&B,,!!"+:=)DUQ1Dh"Z/9,,!$( +Aggz!1!14q55((!&+:=)DUQ1Dh(("$J25!<UQ1<hs,,,,j1n,,,,,!..vUFUVJ.WWEVOE%eSW55! {!4+?+?q{+S+S! y!)@)@U)K)K! "a'N%,, B;;&*GG!E{{#B;;#199'*1a%i!mms??=s,,,,j1n,,,,>  r+cd}||D]N}||rd}n4||rt|rd}nO|S)z)Check if element is empty (if requested).TF)r{r:r[ RE_NOT_EMPTYsearch)r(r\is_emptyrs r) match_emptyzCSSMatch.match_empty1s&&r**  E{{5!!  ''.. <3F3Fu3M3M  r+tuple[ct.SelectorList, ...]cDd}|D]}|||sd}|S)zMatch selectors.TF)rw)r(r\rrsels r)match_subselectorszCSSMatch.match_subselectors>s;  C''C00  r+containstuple[ct.SelectorContains, ...]cd}d}|D]u}|@|jr|||j}n|||j}d}|jD]#}|jr|D] }||vrd}n |rn ||vrd}n$|sd}v|S)z"Match element if it contains text.TNrF)ownrrnrtext) r(r\rrcontent contain_listr{rrHs r)match_containszCSSMatch.match_containsGs$  L#H"//dl/KKGG"mmB$,mGGGE$)  # $""199$(E!E%w $'  r+c>d}d}||d}|rN|L||dkr||r|}n||d}|r|L|d}|jD]\}}||ur d}||urd}n|s||dD]x}||} | dkrnZ| dvrU||dd} | r.get_parent_formsD__R4_88F,<<''611d6F6Fv6N6N1!D$ 4@@>&D,Kr+NTrrr<radiocheckedr) r rrr&rr2rrrgr)r(r\rrfrrrrrrrrtag_nameis_radiocheckhas_namerrs` r)match_indeterminatezCSSMatch.match_indeterminatesC33B??@@      r""  J:  1a99d!%JDyy $E L!55dd5KKE{{ #||E22H7**#( %#($($8$8$?$? & &DAq#z!}}664:a==G;S;S+/!%A&!8!8Q$YY+/!%A)!;!;(,'&E&h&??SXCYCY]aCaCa*. %! E/66dE7JKKK r+langstuple[ct.SelectorLang, ...]c d}|}|j}|j}|}d}d} |s||} ||D]y\} } ||| \} }|r| r!|jstj| n| dks2|r4| s2| tkr'|js|tj|n|dkr| }nz|} | ||j }|| }||}| }n||8|j r1|j D])}|%tt||dur|d}*||jr|r|r|jdkrd}dD][}d}|||j D]6}|||kr||rd }|}n7|sn\|r<|9|D]}t'|t(jr||d kr||rd}d}||D]\} } tj| d krtj| d krd }tj| d kr| }|rH|rF|}|j tt|tt|fn|n|/|j tt|df|;|D]8}d}|D]-}||tt|rd }.|sn9|S)zMatch languages.FNlangrrrhtml)rheadTmetaz http-equivzcontent-languagerr)r,rlr(rrrr)rrgNS_XMLrmrnr$r rrfr|r2rhrCrDrIrr[)r(r\rrhas_nsrlr(ro found_langrrrrattr_nsr\cacher{r8rchild2c_langrpatternsris r) match_langzCSSMatch.match_langs))++y!4  **622K,,V44  1 $ 4 4VQ ? ?  $/KO;6]djmmm\]bh5h5h6i'26i7>&7H7H15[AQD)))W[`fff"#JED__Vt|_DDF~%)%5%5d%;%;") .  $"7 . * *#S$58(C(C!&qJ  t{ 7I d W[W`djWjWjE'  !226T\2RRE||E**c11d6F6Fu6M6M1 $!&E H+$F!&#'22 &t||F7K7Kv7U7UZ^ZjZjkqZrZr7U!&"&$($8$8$@$@&&DAq#z!}} <<ARdAdAd)-#z!}} 99*+%&'&-4 $ 5 < S>STT% $E r+directionalityc `|tjzr|tjzrdS||sdStt j|ddd}|dvr||kS |}|r|tj|kS |}|dk}|dk}|dk}|r)t j|d dnd} |r| d kr|tj|kS|r| d vs|r|d kr|r7d fd  |dD} n*tt|dd} | rS| D]@} tj| } | dvr&| dkr tjn tj}||kcSAtj|kS|rtj|kS|d|S|r||d krZ|}|||kS|rtj|kS|d|S|d|S)zCheck directionality.FNr6r)Nrrr:r7r<tel)rrrurlemailrc3FK|]}||VdSrrrs r) z%CSSMatch.match_dir..?s8wwZ^ZpZpquZvZvwwwwwwwr+Trrr;r>)rDrErFrhr?r@rrgrrpr2rrur rrBrC match_dirrmrA) r(r\rrGrprfis_input is_textareais_bdirrrHrIs ` r)rzCSSMatch.match_dirs BN * ~/N 5 :T--b11:5KK 4+E+Eb%QS+T+T U UW[\\ I % %. .,,r""  4y(>^3 3||B7?j( JRZ 455b&"EEFFFXZ  49+<>^3 3 W%#LLLQ\Lbkopbpbp Owwww1B1B2QU1B1V1VwwwwwS$"<">$//"/"E"E~VV V  Wy(Y!^^r**I$ N22 8~77>>$//"/"E"E~VV V~~doobDoAA>RRRr+ conditionc d}tj||d}t|t t ||dd}t|t t ||dd}||dSt|t t ||dd}|P|dvr|||krd}|s |||krd}n5|d kr/||||kr||kr||krd}n|||krd}|s |||krd}|tjzr| n|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. Fr<minNmaxr)r r rrr rTr ) rrgrrrr rrD SEL_IN_RANGE)r(r\r out_of_rangermnmxrs r) match_rangezCSSMatch.match_rangeZs  455b&AABB   tC1K1KBPUW[1\1\']'] ^ ^   tC1K1KBPUW[1\1\']'] ^ ^ :"*5""5$sD4N4NrSZ\`4a4a*b*bcc  VVV>ebjj#'L#(52::#'L&>bnbrzzebjj'+ ~%"**'+ ',BNurzz'+ #,r#>P<LPr+c||}|duoH|ddkp/|ddkp||duS)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. NrMrr)r2findr4r1s r) match_definedzCSSMatch.match_definedsi||B    #"$0 #"$0##4/  r+c@d}||}|dvrd}|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(r\rrs r)match_placeholder_shownz CSSMatch.match_placeholder_showns/--## j E r+cnd}|j}|j}|r#|j}|j}dti|_d|_|r|jr|D]}|}t |t jr |||j s<|j t j zr| |sf|j t j zr||s|j t jzr||s|j t jzr||s|||js|j t jzr||s,|jr|||jsP|jr|||jst|||js|j t:zr%|||j t:zs|jr| ||js|j!r|"||j!s |j#r|$||j#s1|j t j%zr|&|s\|j t j'zr|(|s|j tRzr%|*||j tRzs|j+r|,||j+s| }|r||_||_|S)z.Check if element matches one of the selectors.FrT)-is_notrnr r'rrCrDrtrqr8r" SEL_DEFINEDrSEL_ROOTr SEL_SCOPErSEL_PLACEHOLDER_SHOWNrrr SEL_EMPTYrrrrrrlrdRANGESrrrrrrrr SEL_DEFAULTrSEL_INDETERMINATEr DIR_FLAGSrrr) r(r\rrrrnr r'selectors r)rwzCSSMatch.match_selectorssi!#  (J"2O%x0DO#'D = $,= %< < h88~~b(,77>BN24;M;Mb;Q;Q>BK/8K8K>BL09I9I"9M9M>B$<<TEaEabdEeEe~~b(,77>BL09I9I"9M9M< b(,(G(G#D,>,>r8CS,T,T,,R1DEE>F*43C3CBY_H_3`3`=X])K)K%d.E.Eb(J\.].]$T-A-A"hFW-X-X>BN24;M;Mb;Q;Q>B$88AYAYZ\A]A]>I-dnnRZcIc6d6d$T-@-@XEV-W-W"   3(DO#2D  r+rlimitryc#K|dkrdn|}||jD]+}||r|V||dz}|dkrdS,dS)z&Match all tags under the targeted tag.rN)rr8r)r(r limrs r)selectzCSSMatch.selects~aiiddU--dh77  Ezz%    ?1HCQww   r+c|j}d}|3|1||r|}n||}||1|S)Match closest ancestor.N)r8rrm)r(currentclosests r)rzCSSMatch.closest sY(o'"5zz'"" 3!//'22 o'"5 r+ list[bs4.Tag]cPfdjDS)zFilter tag's children.crg|]3}t|tj|1|4Sr5)rCrDrIr)rr8r(s r)rz#CSSMatch.filter..sM   #sw'' ,0JJsOO    r+)rur8r/s`r)filterzCSSMatch.filters>    ,,TX66    r+c|| o/||o|||jSzMatch.)rGr:rwrris r)rzCSSMatch.matchs@;;r??"ct{{2c4;O;OPRTXTb;c;ccr+N) rrrr`r r!r"r,r#r$)r#rA)r\r`r#rrrr)r\r"r#rw)rJrrKrr#rA)r\r"r\rrrr#r)r\r"r8r_r#rA)r\r"rdrer#rA)r\r"r8ror#rA)r\r"rrrr#rAr)ror"rrrr}rAr#rA)r\r"rrr#rA)r\r"rrr#rAr)r\r"rr"r#rA)r\r"rrr#rA)r\r"rrr#rA)r\r"rrr#rA)r\r"rrr#rA)r\r`rr,r#rA)r\r"rr,r#rA)r\r"rrr#rAr)r r,r#ry)r#r`)r#r)*r1r2r3r4r*r,r.rhr2r4rAr[r^rcrlrnrqr|rrrrrrrrrrrrrrrrrrrrwrrrrr5r+r)rr sM'B'B'B'BR6666    //// RRRR XXXX ####J6666p3333j*&        8     .        4        ccccJ    8&&&&P<<<<|TTTTl9S9S9S9Sv&Q&Q&Q&QP    .    RRRRh             ddddddr+rceZdZUdZded<ded<ded<ded <d ed <d Zd!fd Zd"dZd#dZd$dZ d#dZ d%d&dZ d%d'dZ d(d Z e ZxZS)) SoupSievez-Compiled Soup Sieve selector matching object.rrirrr!r zdict[str, str]customr,r")rirr rr"_hashct.CustomSelectors | NonecTt|||||dS)r&)rirr rr"N)superr*)r(rirr rr" __class__s r)r*zSoupSieve.__init__.s? !      r+r8r"r#rAcjt|j||j|j|Sr)rrr r"rr(r8s r)rzSoupSieve.match@s-T_djIIOOPSTTTr+r`cht|j||j|jS)r)rrr r"rr$s r)rzSoupSieve.closestEs*T_djIIQQSSSr+iterableIterable[bs4.Tag]rct|tjr3tj|jjSfd|DS)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. crg|]3}t||1|4Sr5)rrUrrs r)rz$SoupSieve.filter..YsBmmmTX5Q5QRV5W5Wm\`\f\fgk\l\lmDmmmr+)rCrDrIrrr r"r)r(r&s` r)rzSoupSieve.filterJsZ h ( ( nDNHdotzRRYY[[ [mmmmXmmm mr+cH||d}|r|dndS)zSelect a single tag.r)r rN)r)r(r8r}s r) select_onezSoupSieve.select_one[s,{{3a{(((tAwwD(r+rr cHt|||S)zSelect the specified tags.)listiselectr(r8r s r)rzSoupSieve.selectas DLLe,,---r+ryc#~Kt|j||j|j|Ed{VdS)zIterate the specified tags.N)rrr r"rr/s r)r.zSoupSieve.iselectfsIDNC$*MMTTUZ[[[[[[[[[[[r+c Hd|jd|jd|jd|jd S)zRepresentation.zSoupSieve(pattern=z , namespaces=z , custom=z, flags=))rir rr"r/s r)__repr__zSoupSieve.__repr__ksK = = =do = =k = =-1Z = = = r+) rirrrr r!rrr"r,)r8r"r#rA)r8r"r#r`)r&r'r#rr)r8r"r r,r#r)r8r"r r,r#ry)r#r)r1r2r3r4__annotations__ __slots__r*rrrr+rr.r3__str__ __classcell__)r"s@r)rr#s"77LLL$$$$JJJRI      $UUUU TTTT nnnn")))) ..... \\\\\     GGGGGr+r);r4 __future__rrrrrerrDrBrDtypingrr r r r r compilerrrvrxryrzrrrrrrrErFr rSEL_OUT_OF_RANGErr?rrrrrrrOrrrrrr DAYS_IN_WEEKr r7rr Immutablerpickle_registerr5r+r)r@s""""""  IIIIIIIIIIIIIIIIIIrz.)) BJ ' '    ) / NR^ + 2. . > >    G H H "*B C C 2:B C C "*A B B "*S T Tbjk  =>>      """"""""(^ ^ ^ ^ ^ ^ ^ ^ B mmmmmmmm`@d@d@d@d@d|@d@d@dF PPPPP PPPf9r+