U ¬Dx`{Òã@s„dZddlmZddlmZddlZddlmZddlZddlm Z ddl Z e  d¡Z e  d ¡Z d Zd Zd Zd ZdZdZdZdZdZdZejejBZejejBZejejddœZe  d¡Ze  d¡Z e  d¡Z!e  d¡Z"e  d¡Z#e  d¡Z$e  d¡Z%dZ&dZ'dZ(dZ)d Z*d!Z+d"Z,Gd#d$„d$e-ƒZ.Gd%d&„d&e-ƒZ/Gd'd(„d(e-ƒZ0Gd)d*„d*e-ƒZ1Gd+d,„d,e/e1ƒZ2Gd-d.„d.ej3ƒZ4e 5e4¡dS)/z CSS matcher.é)Údatetimeé)ÚutilN)Ú css_types)ÚSequencez[^ ]z [^ ]+ú ú>ú~ú+z: z:>z:~z:+zhttp://www.w3.org/1999/xhtmlz$http://www.w3.org/XML/1998/namespace)ZltrÚrtlÚautoz0^(?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@s eZdZdZdd„Zdd„ZdS)Ú _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. cCs |g|_dS)ú Initialize.N)Úcontents)ÚselfÚelement©rú:/tmp/pip-target-zr53vnty/lib/python/soupsieve/css_match.pyÚ__init__Dsz_FakeParent.__init__cCs t|jƒS)zLength.)Úlenr©rrrrÚ__len__Isz_FakeParent.__len__N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rr!rrrrr;src@sjeZdZdZedd„ƒZedd„ƒZedd„ƒZedd „ƒZ ed d „ƒZ ed d „ƒZ edd„ƒZ edd„ƒZ edd„ƒZedd„ƒZedd„ƒZdd„Zdd„ZdAdd„ZdBd!d"„ZdCd#d$„ZdDd%d&„Zed'd(„ƒZed)d*„ƒZed+d,„ƒZedEd-d.„ƒZedFd/d0„ƒZed1d2„ƒZed3d4„ƒZed5d6„ƒZedGd7d8„ƒZed9d:„ƒZ ed;d<„ƒZ!dHd=d>„Z"dId?d@„Z#dS)JÚ _DocumentNavz#Navigate a Beautiful Soup document.cCs | |¡std t|ƒ¡ƒ‚dS)z%Check if valid input tag or document.zdn|d}|rNdnd} d|krf|kršnn0||krš|j|} || 7}|r’| | ¡rj| VqjdS)z Get children.rNréÿÿÿÿ)rIrrr') rr@ÚstartÚreverseÚtagsrOÚlastÚindexÚendÚincrÚnoderrrÚ get_children¨s  z_DocumentNav.get_childrenccs®|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.NrR)rIZ descendantsr'Ú next_siblingrZ next_element)rr@rUrOZ next_goodÚchildr'Z last_childrrrÚget_descendants»s*    z_DocumentNav.get_descendantscCs$|j}|r |dk r | |¡r d}|S)z Get parent.N)rMrI)rr@rOrMrrrrKÚsz_DocumentNav.get_parentcCs|jS)úGet tag.)rEr?rrrÚ get_tag_nameâsz_DocumentNav.get_tag_namecCs|jS)ú Get prefix.)Úprefixr?rrrÚget_prefix_nameèsz_DocumentNav.get_prefix_namecCs|jS)zGet namespace `URI`.)Ú namespacer?rrrÚget_uriîsz_DocumentNav.get_uricCs(|j}|r$| |¡s$|dk r$|j}q|S)zGet next sibling tag.N)r\r'©r+r@rUÚsiblingrrrÚget_nextôsz_DocumentNav.get_nextcCs(|j}|r$| |¡s$|dk r$|j}q|S)zGet previous sibling tag.N)Zprevious_siblingr'rfrrrÚ get_previousýsz_DocumentNav.get_previouscCs|rt|dƒnd}|o|tkS)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`. rdN)ÚgetattrÚNS_XHTML)r@ÚnsrrrÚ has_html_nss z_DocumentNav.has_html_nscCst|ddƒt|ddƒfS)z7Return namespace and attribute name without the prefix.rdNrE)rj)r@Ú attr_namerrrÚsplit_namespacesz_DocumentNav.split_namespacecCsx|dkr dSt|tƒr|St|tƒr.| d¡St|tƒrpg}|D]*}t|tƒrZ| |¡q@| | |¡¡q@|St|ƒS)z6Normalize the value to be a string or list of strings.NÚÚutf8)r.ÚstrÚbytesÚdecoderÚappendÚnormalize_value)r+ÚvalueÚ new_valueÚvrrrrvs      z_DocumentNav.normalize_valuecCsj|}|jr6z| |j|¡}Wqftk r2YqfXn0|j ¡D]$\}}t |¡|kr@| |¡}qfq@|S)zGet attribute by name.)rBrvÚattrsÚKeyErrorÚitemsrrF)r+r@rEÚdefaultrwÚkryrrrÚget_attribute_by_name8s z"_DocumentNav.get_attribute_by_nameccs(|j ¡D]\}}|| |¡fVq dS)zIterate attributes.N)rzr|rv)r+r@r~ryrrrÚiter_attributesIsz_DocumentNav.iter_attributescCs&| |dg¡}t|tƒr"t |¡}|S)z Get classes.Úclass)rr.rrÚ RE_NOT_WSÚfindall)r+r@ÚclassesrrrÚ get_classesPs  z_DocumentNav.get_classescs$d ‡fdd„ˆj|d|dDƒ¡S)z Get text.rpcsg|]}ˆ |¡r|‘qSr©r>©Ú.0rZr rrÚ ]s z)_DocumentNav.get_text..F)rUrO)Újoinr^©rr@rOrr rÚget_textYsÿz_DocumentNav.get_textcs‡fdd„ˆj||dDƒS)z Get Own Text.csg|]}ˆ |¡r|‘qSrr†r‡r rrr‰cs z-_DocumentNav.get_own_text..©rO)rQr‹rr rÚ get_own_text`sz_DocumentNav.get_own_text)F)NFTF)TF)F)T)T)N)F)F)$r"r#r$r%Ú classmethodr-Ú staticmethodr2r'r5r7r9r:r=r>rArCrIrNrQr[r^rKr`rcrerhrirmrorvrr€r…rŒrŽrrrrr&Osj                           r&c@sdeZdZdZedd„ƒZedd„ƒZedd„ƒZedd „ƒZed d „ƒZ ed d „ƒZ e dd„ƒZ dS)ÚInputsz-Class for parsing and validating input items.cCs^t}|tkr:|ddkr$|ddks0|ddkr4tnt}n |tkrFt}d|koX|kSS)z Validate day.r rédir)Ú LONG_MONTHÚFEBÚFEB_LEAP_MONTHÚ FEB_MONTHÚ MONTHS_30Ú SHORT_MONTH)ÚyearÚmonthÚdayZmax_daysrrrÚ validate_dayis .zInputs.validate_daycCsBt d dd|¡d¡ ¡d}|dkr*d}d|ko<|kSS)zValidate week.z{}-{}-{}é rz%m-%d-%Yré5)rÚstrptimer)Ú isocalendar)r™ÚweekZmax_weekrrrÚ validate_weektszInputs.validate_weekcCsd|kodkSS)zValidate month.rrr)ršrrrÚvalidate_month}szInputs.validate_monthcCsd|kS)zValidate year.rr)r™rrrÚ validate_yearƒszInputs.validate_yearcCsd|kodkSS)zValidate hour.rér)ÚhourrrrÚ validate_hour‰szInputs.validate_hourcCsd|kodkSS)zValidate minutes.ré;r)ÚminutesrrrÚvalidate_minutesszInputs.validate_minutesc Csrd}|dkrzt |¡}|rvt| d¡dƒ}t| d¡dƒ}t| d¡dƒ}| |¡rv| |¡rv| |||¡rv|||f}nô|dkrÐt |¡}|rÌt| d¡dƒ}t| d¡dƒ}| |¡rÌ| |¡rÌ||f}nž|dkr0t |¡}|rnt| d¡dƒ}t| d¡dƒ}| |¡rn|  ||¡rn||f}n>|dkrŒt  |¡}|rnt| d ¡dƒ} t| d ¡dƒ} |  | ¡rn|  | ¡rn| | f}nâ|d krFt  |¡}|rnt| d¡dƒ}t| d¡dƒ}t| d¡dƒ}t| d ¡dƒ} t| d ¡dƒ} | |¡rn| |¡rn| |||¡rn|  | ¡rn|  | ¡rn|||| | f}n(|d krnt |¡}|rnt| d ¡ƒ}|S)zParse the input value.NÚdater™é ršr›r¡Útimer¦r©údatetime-local)ÚnumberÚrangerw)ÚRE_DATEÚmatchÚintÚgroupr¤r£rœÚRE_MONTHÚRE_WEEKr¢ÚRE_TIMEr§rªÚ RE_DATETIMEÚRE_NUMÚfloat) r+ÚityperwÚparsedÚmr™ršr›r¡r¦r©rrrÚ parse_value•sl "          ÿÿ ÿþþ  zInputs.parse_valueN) r"r#r$r%rrœr¢r£r¤r§rªrr¾rrrrr‘fs      r‘c@sDeZdZdZdd„Zdd„Zdd„Zdd „Zd d „Zd d „Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„Zdd„ZdQdd „Zd!d"„Zd#d$„Zd%d&„Zd'd(„Zd)d*„Zd+d,„Zd-d.„Zd/d0„Zd1d2„Zd3d4„Zd5d6„Zd7d8„Zd9d:„Zd;d<„Z d=d>„Z!d?d@„Z"dAdB„Z#dCdD„Z$dEdF„Z%dRdHdI„Z&dJdK„Z'dLdM„Z(dNdO„Z)dPS)SÚ_MatchzPerform CSS matching.c CsØ| |¡||_g|_g|_g|_||_|dkr4in||_||_d|_|}|  |¡}|rh|}|  |¡}qTd}|  |¡s||}n|  |¡D] }|}q”q†||_ ||k r¦|n||_ | |¡|_| |¡|_|j pÐ|j|_dS)rNF)r-r,Úcached_meta_langÚcached_default_formsÚcached_indeterminate_formsÚ selectorsÚ namespacesÚflagsÚiframe_restrictrKr2r[rJÚscopermÚhas_html_namespacerCÚis_xmlrL) rrÃrÇrÄrÅÚdocrMrJr]rrrrÎs2      z_Match.__init__cCs |jp |jS)z3Check if namespaces are supported in the HTML type.)rÉrÈr rrrÚsupports_namespacesñsz_Match.supports_namespacescCs(| ¡r d}| |¡}|r$|}nt}|S)zGet tag namespace.rp)rËrerk)rr@rdrlrrrÚ get_tag_nsös z_Match.get_tag_nscCs| |¡tkS)z"Check if tag is in HTML namespace.)rÌrkrHrrrrGsz_Match.is_html_tagcCs&| |¡}|dk r"|js"t |¡S|S)r_N)r`rÉrrF©rr@rErrrÚget_tags z_Match.get_tagcCs&| |¡}|dk r"|js"t |¡S|S)raN)rcrÉrrF)rr@rbrrrÚ get_prefix s z_Match.get_prefixc CsÀ|j|ddD]¬}| |¡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©rUÚdirrpN)ÚbdiÚscriptÚstyleÚtextarearD©ÚALÚRÚLrÙ)r[r'ÚDIR_MAPÚgetrrFrrÎrGÚ find_bidir=Ú unicodedataÚ bidirectionalÚctÚ SEL_DIR_LTRÚ SEL_DIR_RTL)rr@rZÚ directionrwÚcÚbidirrrrÜs*  ÿþý    z_Match.find_bidic Csìd}t d|¡ ¡}| d¡}| ¡ d¡}t|ƒ}d}d}||} ||} | dkr`| | kr`d}|d7}|d7}|rè||krè||} z ||} Wntk r¬d}YqpYnX| sºd}qpn$| | krÌ|d7}nt| ƒdkrÞd}qp|d7}qp|S)zFilter the language tags.Tú-rÚ*Fr)Ú RE_WILD_STRIPÚsubrFÚsplitrÚ IndexError) rZ lang_rangeZlang_tagr²ÚrangesZsubtagsÚlengthÚrindexZsindexÚrÚsrrrÚextended_language_filter7s<       z_Match.extended_language_filterc 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 |¡kr qì|}qqì|S)z3Match attribute name and return value if it exists.Nræ)rËrÄrÛr€rorÉrrF) rr@Úattrrbrwrlr~ryrdrErrrÚmatch_attribute_namejs6 ($z_Match.match_attribute_namecCsžd}| |¡}|j d¡}|jdkr(dn|j |jd¡}|jdkrX|dk rX||krXd}nB|jdk rv|jdkrv|rvd}n$|jrš|jdkrš|dks–||kršd}|S)z#Match the namespace of the element.TrpNFræ)rÌrÄrÛrb)rr@r,r²rdÚdefault_namespaceZtag_nsrrrÚmatch_namespacešs$  ÿþþþz_Match.match_namespacecCsˆd}|r„|D]v}| ||j|j¡}|jr4|jr4|jn|j}t|tƒrNd |¡}|dkr`d}q„q |dkrlq q |  |¡dkr d}q„q |S)zMatch attributes.TrNF) ròÚ attributerbrÉZxml_type_patternÚpatternr.ÚlistrŠr²)rr@Ú attributesr²ÚarwrörrrÚmatch_attributes¯s   z_Match.match_attributescCs>|js|jdk rt |j¡n|j}|dk o:|| |¡dfk S)zMatch tag name.Nræ)rÉrErrFrÎ)rr@r,rErrrÚ match_tagnameÃs"þz_Match.match_tagnamecCs0d}|dk r,| ||¡sd}| ||¡s,d}|S)zMatch the tag.TNF)rôrû)rr@r,r²rrrÚ match_tagÌs  z_Match.match_tagcCsêd}|djtkrJ|j||jd}|sæ|ræ| ||¡}|j||jd}q"nœ|djtkrz|j||jd}|ræ| ||¡}nl|djtkr´| |¡}|sæ|ræ| ||¡}| |¡}q’n2|djtkræ| |¡}|ræ|  |¡ræ| ||¡}|S)zMatch past relationship.Frr) Úrel_typeÚ REL_PARENTrKrÆÚmatch_selectorsÚREL_CLOSE_PARENTÚ REL_SIBLINGriÚREL_CLOSE_SIBLINGr')rr@ÚrelationÚfoundrMrgrrrÚmatch_past_relationsØs(     z_Match.match_past_relationsFcCs@d}|r|jn|j}|||jdD]}| ||¡}|r"q| ||¡}nl|djtkrx| |¡}|sª|rª| ||¡}| |¡}qVn2|djtkrª| |¡}|rª| |¡rª| ||¡}|S)zMatch future relationship.FrT) rýÚREL_HAS_PARENTrÚREL_HAS_CLOSE_PARENTÚREL_HAS_SIBLINGrhrÿÚREL_HAS_CLOSE_SIBLINGr')rr@rrrgrrrÚmatch_future_relationsûs    z_Match.match_future_relationscCs2d}|dj d¡r"| ||¡}n | ||¡}|S)z%Match relationship to other elements.Frú:)rýÚ startswithr r)rr@rrrrrÚmatch_relationss  z_Match.match_relationscCs,d}|D]}|| |dd¡krd}q(q|S)zMatch element's ID.TÚidrpF)r)rr@ÚidsrÚirrrÚmatch_ids z_Match.match_idcCs,| |¡}d}|D]}||krd}q(q|S)zMatch element's classes.TF)r…)rr@r„Zcurrent_classesrrãrrrÚ match_classes$s z_Match.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)rNrir'r>Ústripr7rh)rr@rNrgrrrÚ match_root/s8  ÿÿÿþ ÿÿÿþz_Match.match_rootcCs |j|kS)zMatch element as scope.)rÇrHrrrÚ match_scopeIsz_Match.match_scopecCs(| |¡| |¡ko&| |¡| |¡kS)z!Match tag type for `nth` matches.)rÎrÌ)rr@r]rrrÚmatch_nth_tag_typeNsþz_Match.match_nth_tag_typecCsd}|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Ä||krŠ|dkr(d|}|dk rê|dkrêqŠd}| |7} | r| | | n| }}d|}||krˆqŠq²||}|dk rH|dkrHqŠd}| |7} | rf| | | n| }}||}||kr„qŠ|}q²| }| dkrÐ|dkrÌ| }| |7} | rÀ| | | n| }}q˜d}|} | ræ| | | n| }}d|kr |dkrnnød}|j |||dkddD]Œ}||7}|  |¡sDq(|jr`| ||j¡s`q(|j rz|  ||¡szq(| d7} | |kr¢||krœd}nq¶||kr(q¶q(||krÄq|}| |7} | dkrÞq| rð| | | n| }||krîqqî|sqq|S)zMatch `nth` elements.TFNrrrR)rSrTrU) rÃrÿrKrArVrrùÚbÚnr[r'Zof_typer)rr@ÚnthÚmatchedrrMrVÚ last_indexrWZrelative_indexrùrÚvarÚcountZ count_incrZfactorÚidxZlast_idxÚadjustZdiff_lowZdiffZ diff_highZlowestr]rrrÚ match_nthVs                     z_Match.match_nthcCsLd}|j|ddD]4}| |¡r*d}qHq| |¡rt |¡rd}qHq|S)z)Check if element is empty (if requested).TFrÐ)r[r'r>Ú RE_NOT_EMPTYÚsearch)rr@Zis_emptyr]rrrÚ match_empty»s z_Match.match_emptycCs"d}|D]}| ||¡sd}q|S)zMatch selectors.TF)rÿ)rr@rÃr²ÚselrrrÚmatch_subselectorsÈs  z_Match.match_subselectorsc 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.TNrF)ZownrŽrLrŒÚtext) rr@Úcontainsr²rPZ contain_listrr)rãrrrÚmatch_containsÑs, z_Match.match_containsc Csúd}d}|j|dd}|rP|dkrP| |¡dkr@| |¡r@|}q|j|dd}qd}|jD]$\}}||krZd}||krzd}q€qZ|sö|j|ddD]b}| |¡} | dkr¬qö| dkr’| |dd¡} | r’t | ¡d kr’|j ||g¡||krðd}qöq’|S) úMatch default.FNTrÚform)ÚinputÚbuttonr*rpZsubmit) rKrÎrGrÁr^rrrFru) rr@r²r-rMÚ found_formÚfÚtr]rEryrrrÚ match_defaultís6  z_Match.match_defaultcsXd}ˆ |d¡}‡fdd„}||ƒ}d}ˆjD].\}}} ||kr.||kr.d}| dkrXd}q^q.|sTd} ˆj|ddD]À} | |kr„qvˆ | ¡} | dkr,d} d}d}ˆ | ¡D]|\}}t |¡dkrØt |¡d krØd} n0t |¡dkrô||krôd}nt |¡d krd}| r®|r®|r®|| ƒ|kr®d} q,q®| rvq8qv| sBd}ˆj |||g¡|S) r,FrEcs^d}ˆj|dd}|dkrZˆ |¡dkr8ˆ |¡r8|}qZ|}ˆj|dd}|dkr|}qZq|S)zFind this input's form.NTrr-)rKrÎrG)r@r-rMZ last_parentr rrÚget_parent_formsz3_Match.match_indeterminate..get_parent_formTrr.r*ZradioÚchecked)rrÂr^rÎr€rrFru)rr@r²rEr4r-r0r1rrr5r]Ztag_nameZis_radioÚcheckZhas_namer~ryrr rÚmatch_indeterminatesJ    z_Match.match_indeterminatecCs°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$|s|j r|j D]}||dkrô|d}qô|dkrl|jr2|rl|j dkrld}dD]X}d}|j||j dD]0}| |¡|krR| |¡rRd }|}q„qR|s:q”q:|rl|D]¶}| |¡rF| |¡d krF| |¡rFd}d}| |¡D]h\} } t | ¡d krt | ¡d krd }t | ¡d kr| }|rÜ|rÜ|}|j  ||f¡qFqÜ|ržqVqž|sl|j  |df¡|r¬|D]4}d}|D]}| ||¡r‚d }q‚|svq¬qv|S)zMatch languages.FNÚlangrrrÚhtml)r9ÚheadTÚmetaz http-equivzcontent-languagerP)rËrJrÈrmr€rorÉrrFÚNS_XMLrKrLrÀrEr[rÎrGr'rurð)rr@Zlangsr²Zhas_nsrJrÈrMZ found_langrVrmr~ryZattr_nsrñÚcacherr,r]Zc_langrPÚpatternsrörrrÚ match_langQs˜ ÿÿÿýýýü    $  (     z_Match.match_langc Cs,|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 krº|r4g} |j |d dD]} |  | ¡r |   | ¡q d | ¡} n| |dd¡} | r”| D]<} t | ¡} | dkrL| dkrttjntj}||kSqLtj|kS|r¤tj|kS| |j|d d|¡S|rÊ|dksÔ|d kr| |¡}|dk rð||kS|rtj|kS| |j|d d|¡S| |j|d d|¡S)zCheck directionality.FNrÑrp)Nrr.rÕrÒr*Útel)r)r%r@ÚurlÚemailrTrrwrÖrÙ)rßràrárGrÚrÛrrFrrNrÎrQr>rurŠrÝrÞÚ match_dirrKrÜ)rr@ZdirectionalityrârNrEZis_inputZ is_textareaZis_bdir»rwrZrãrärrrrC§sV              z_Match.match_dircCs^d}t | |d¡¡}| |dd¡}|dk r8t ||¡}| |dd¡}|dk rZt ||¡}|dkrn|dkrndS| |dd¡}|dk rt ||¡}|dk rH|dkrÐ|dk r¶||kr¶d}|sÎ|dk rÎ||krÎd}nx|d krH|dk r|dk r||kr||krH||krHd}n6|dk r*||kr*d}|sH|dk rH||krHd}|tj@rZ| 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. Fr*ÚminNÚmaxrw)r«r®ršr¡r¯r°Tr­)rrFrr‘r¾rßÚ SEL_IN_RANGE)rr@Ú conditionZ out_of_ranger»ÚmnZmxrwrrrÚ match_rangeæs8      z_Match.match_rangecCs4| |¡}| d¡dkp2| d¡dkp2| |¡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. rårRrN)rÎÚfindrÏrÍrrrÚ match_defineds   ÿ ýz_Match.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)rpÚ T)rŒ)rr@r²rPrrrÚmatch_placeholder_shown)s  z_Match.match_placeholder_shownc Cs6d}|j}|j}|r0|j}|j}dti|_d|_|r<|jr |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@|jr | ||j¡s q@|jr$| ||j¡s$q@| ||j¡s6q@|j t@rX| ||j t@¡sXq@|jrr|  ||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,¡sq@| }q q@|r2||_||_|S)z.Check if element matches one of the selectors.Fr9T)-Úis_notrLrÄrÆrkr.rßZ SelectorNullrür,rÅZ SEL_DEFINEDrKZSEL_ROOTrZ SEL_SCOPErZSEL_PLACEHOLDER_SHOWNrMr#rZ SEL_EMPTYr&rrr„rrúrøÚRANGESrIr8r?rÃr(rrZ SEL_DEFAULTr3ZSEL_INDETERMINATEr7Ú DIR_FLAGSrCr+r*) rr@rÃr²rNrLrÄrÆÚselectorrrrrÿ8sn      z_Match.match_selectorsrccsN|dkr d}| |j¡D]0}| |¡r|V|dk r|d8}|dkrqJqdS)z&Match all tags under the targeted tag.rN)r^r,r²)rÚlimitr]rrrÚselectŒs z _Match.selectcCs:|j}d}|dkr6|dk r6| |¡r*|}q | |¡}q |S)úMatch closest ancestor.N)r,r²rK)rÚcurrentÚclosestrrrrVšs  z_Match.closestcs‡fdd„ˆ ˆj¡DƒS)zFilter tag's children.cs$g|]}ˆ |¡sˆ |¡r|‘qSr)r:r²)rˆr,r rrr‰©s z!_Match.filter..)rQr,r rr rÚfilter¦sz _Match.filtercCs$| |¡ o"| |¡o"| ||j¡S©zMatch.)r2r'rÿrÃrHrrrr²«sz _Match.matchN)F)r)*r"r#r$r%rrËrÌrGrÎrÏrÜrðròrôrúrûrürrr rrrrrrr#r&r(r+r3r7r?rCrIrKrMrÿrSrVrWr²rrrrr¿ËsN# $30      e  '=V?.T  r¿c@seZdZdZdS)ÚCSSMatchz#The Beautiful Soup CSS match class.N)r"r#r$r%rrrrrY±srYcsdeZdZdZdZ‡fdd„Zdd„Zdd„Zd d „Zd d „Z ddd„Z ddd„Z dd„Z e Z ‡ZS)Ú SoupSievez-Compiled Soup Sieve selector matching object.)rörÃrÄÚcustomrÅÚ_hashcstt|ƒj|||||ddS)r)rörÃrÄr[rÅN)ÚsuperrZr)rrörÃrÄr[rÅ©Ú __class__rrrºs ûzSoupSieve.__init__cCst|j||j|jƒ |¡SrX)rYrÃrÄrÅr²©rr,rrrr²ÅszSoupSieve.matchcCst|j||j|jƒ ¡S)rT)rYrÃrÄrÅrVr`rrrrVÊszSoupSieve.closestcs8t |¡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)rYr:r²r‡r rrr‰Þs z$SoupSieve.filter..N)rYr'rÃrÄrÅrW)rÚiterablerr rrWÏs zSoupSieve.filtercCs|j|dd}|r|dSdS)zSelect a single tag.r)rRrN)rS)rr,rUrrrÚ select_oneàszSoupSieve.select_onercCst| ||¡ƒS)zSelect the specified tags.)r÷Úiselect)rr,rRrrrrSæszSoupSieve.selectccs*t|j||j|jƒ |¡D] }|VqdS)zIterate the specified tags.N)rYrÃrÄrÅrS)rr,rRr@rrrrcëszSoupSieve.iselectcCsd |j|j|j|j¡S)zRepresentation.zASoupSieve(pattern={!r}, namespaces={!r}, custom={!r}, flags={!r}))r)rörÄr[rÅr rrrÚ__repr__ñs üzSoupSieve.__repr__)r)r)r"r#r$r%Ú __slots__rr²rVrWrbrSrcrdÚ__str__Ú __classcell__rrr^rrZµs    rZ)6r%rrprÚrerrßrÝÚcollections.abcrr/Úcompiler$r‚rþrrrr r r r rkr<ràrárPrFZSEL_OUT_OF_RANGErOrÚr¹r·rµr¶r±r¸rçr—r”r˜r“r–r•Z DAYS_IN_WEEKÚobjectrr&r‘r¿rYZ ImmutablerZZpickle_registerrrrrÚsr        ý     ÿ emI