
    (ph                        % S r SrSSKrSSKrSSKrSSKrSSKrSSKJr  SSK	J
r
JrJrJrJrJrJrJrJrJr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJrJrJ r J!r!J"r"   SSK#J$r$  Sr%\RN                  RQ                  S5      SLr) SSK*r+Sr,\+RZ                  R\                  r.\r/\"\   \0S'   Sr1\2\0S'    " S S\35      r4 " S S\45      r5 " S S\55      r6 " S S\55      r7 " S S\65      r8g! \& a    Sr% Nf = f! \& a    Sr,Sr. Ncf = f)zHelper classes for tests.MIT    N)BeautifulSoup)
AttributeValueListCharsetMetaAttributeValueCommentContentMetaAttributeValueDoctypePageElementPYTHON_SPECIFIC_ENCODINGSScript
StylesheetTag)SoupStrainer)XMLParsedAsHTMLWarning)_IncomingMarkup)TreeBuilder)HTMLParserTreeBuilder)AnyIterableOptionalTupleType)SelectorSyntaxErrorTFhtml5lib)r   default_builderu-
  A bare string
<!DOCTYPE xsl:stylesheet SYSTEM "htmlent.dtd">
<!DOCTYPE xsl:stylesheet PUBLIC "htmlent.dtd">
<div><![CDATA[A CDATA section where it doesn't belong]]></div>
<div><svg><![CDATA[HTML5 does allow CDATA sections in SVG]]></svg></div>
<div>A <meta> tag</div>
<div>A <br> tag that supposedly has contents.</br></div>
<div>AT&T</div>
<div><textarea>Within a textarea, markup like <b> tags and <&<&amp; should be treated as literal</textarea></div>
<div><script>if (i < 2) { alert("<b>Markup within script tags should be treated as literal.</b>"); }</script></div>
<div>This numeric entity is missing the final semicolon: <x t="pi&#241ata"></div>
<div><a href="http://example.com/</a> that attribute value never got closed</div>
<div><a href="foo</a>, </a><a href="bar">that attribute value was closed by the subsequent tag</a></div>
<! This document starts with a bogus declaration ><div>a</div>
<div>This document contains <!an incomplete declaration <div>(do you see it?)</div>
<div>This document ends with <!an incomplete declaration
<div><a style={height:21px;}>That attribute value was bogus</a></div>
<! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">The doctype is invalid because it contains extra whitespace
<div><table><td nowrap>That boolean attribute had no value</td></table></div>
<div>Here's a nonexistent entity: &#foo; (do you see it?)</div>
<div>This document ends before the entity finishes: &gt
<div><p>Paragraphs shouldn't contain block display elements, but this one does: <dl><dt>you see?</dt></p>
<b b="20" a="1" b="10" a="2" a="3" a="4">Multiple values for the same attribute.</b>
<div><table><tr><td>Here's a table</td></tr></table></div>
<div><table id="1"><tr><td>Here's a nested table:<table id="2"><tr><td>foo</td></tr></table></td></div>
<div>This tag contains nothing but whitespace: <b>    </b></div>
<div><blockquote><p><b>This p tag is cut off by</blockquote></p>the end of the blockquote tag</div>
<div><table><div>This table contains bare markup</div></table></div>
<div><div id="1">
 <a href="link1">This link is never closed.
</div>
<div id="2">
 <div id="3">
   <a href="link2">This link is closed.</a>
  </div>
</div></div>
<div>This document contains a <!DOCTYPE surprise>surprise doctype</div>
<div><a><B><Cd><EFG>Mixed case tags are folded to lowercase</efg></CD></b></A></div>
<div><our☃>Tag name contains Unicode characters</our☃></div>
<div><a ☃="snowman">Attribute name contains Unicode characters</a></div>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
BAD_DOCUMENTc                       \ rS rSr\S\\   4S j5       rS\S\	S\
4S jrS\S\	S\4S jr SS	\S
\\   SS4S jjr\rS\SS4S jr SS\S\S\\   4S jjrS\\   S\\   SS4S jrS\\   S\\   SS4S jrSrg)SoupTeste   returnc                     [         $ N)r   selfs    E/var/www/html/venv/lib/python3.13/site-packages/bs4/tests/__init__.pyr   SoupTest.default_builderf   s        markupkwargsc                 V    UR                  SU R                  5      n[        U4SU0UD6$ )z*Build a Beautiful Soup object from markup.builder)popr   r   )r$   r(   r)   r+   s       r%   soupSoupTest.soupj   s-    **Y(<(<=V?W???r'   c                 D    U R                   " S0 UD6R                  U5      $ )zKTurn an HTML fragment into a document.

The details depend on the builder.
 )r   test_fragment_to_document)r$   r(   r)   s      r%   document_forSoupTest.document_foro   s#    
 ##-f-GGOOr'   Nto_parsecompare_parsed_toc                    U R                   n[        XS9nUc  [        U[        5      (       d   eUnUR	                  5       U R                  U5      :X  d   e[        S [        UR                  R                  5       5       5       5      (       d   eUR                  /UR                   Vs/ s H  oUR                  PM     sn:X  d   egs  snf )zYParse some markup using Beautiful Soup and verify that
the output markup is as expected.
r+   Nc              3   *   #    U  H	  oS :H  v   M     g7f)r   Nr0   ).0vs     r%   	<genexpr>'SoupTest.assert_soup.<locals>.<genexpr>   s     G#Fa6#Fs   )r   r   
isinstancestrdecoder2   alllistopen_tag_countervaluesROOT_TAG_NAMEtagStackname)r$   r4   r5   r+   objxs         r%   assert_soupSoupTest.assert_soupv   s     &&H6$h,,,, ( zz|t001BCCCC G4(<(<(C(C(E#FGGGGG !!"s||&D|!vv|&DDDD&Ds   +C	elementc                     SnUR                    H.  nU(       a"  X2R                  :X  d   eX#R                  :X  d   eUnM0     g)ziEnsure that next_element and previous_element are properly
set for all descendants of the given element.
N)descendantsnext_elementprevious_element)r$   rK   earlieres       r%   assertConnectednessSoupTest.assertConnectedness   sE     $$A00000"4"4444G	 %r'   el_recursive_callc           	         SnUR                   c  UR                  b!   SR                  XR                  S5      5       eUR                  b!   SR                  XR                  S5      5       eUR                  b!   SR                  XR                  S5      5       eSnSnSn[        UR                  5      S-
  nUR                   GH|  nSnUS:X  a  UR                   b  UR                  UL d!   SR                  XR                  U5      5       eUR                  UL d!   SR                  XUR                  U5      5       eUR                  b!   SR                  XUR                  S5      5       eGO(UR                  UR                  US-
     L d1   S	R                  XUR                  UR                  US-
     5      5       eUR                  US-
     R                  UL dB   S
R                  UR                  US-
     UR                  US-
     R                  U5      5       eUbt  UR                  UL d5   SR                  XUR                  XeR                   R                  5      5       eUR                  UL d!   SR                  XfR                  U5      5       e[        U[        5      (       aV  UR                  (       aE  U R                  US5      nUc   eUR                  b!   S
R                  X3R                  S5      5       eUb  UnOUnXG:X  a.  UR                  b!   S
R                  XUR                  S5      5       eUS-  nGM     Ub  UOUnUc  UnU(       d  Ub  Un Uc0  UR                  b!   SR                  XUR                  S5      5       e gUR                  bF  UR                  UR                  L d+   SR                  XUR                  UR                  5      5       e gUR                   nM  U$ )z.Ensure proper linkage throughout the document.Nz3Bad previous_element
NODE: {}
PREV: {}
EXPECTED: {}z3Bad previous_sibling
NODE: {}
PREV: {}
EXPECTED: {}z/Bad next_sibling
NODE: {}
NEXT: {}
EXPECTED: {}r      z/Bad next_element
NODE: {}
NEXT: {}
EXPECTED: {}z2Bad previous_sibling
NODE: {}
PREV {}
EXPECTED: {}z1Bad previous_sibling
NODE: {}
PREV {}
EXPECTED {}z-Bad next_sibling
NODE: {}
NEXT {}
EXPECTED {}z=Bad previous_element
NODE: {}
PREV {}
EXPECTED {}
CONTENTS {}z-Bad next_element
NODE: {}
NEXT {}
EXPECTED {}T)parentrO   formatprevious_siblingnext_siblinglencontentsrN   r=   r   linkage_validator)	r$   rT   rU   
descendantidxchild
last_childlast_idxtargets	            r%   r^   SoupTest.linkage_validator   sR    
 99##+GNN''+
 ##+GNN''+
 'CJJOOT'
 
r{{#a'[[EJ ax99(50KRROOU0
 .."4OVV55r4
 ..6NUU55t6 **bkk#'.BBIPP112;;sQw3GB
 KKa(55>ELLKKa("++cAg*>*K*KU>
 )..*<Zaa55z<<CXCX<
 #//58IPP"$;$;U8
 %%%%..!33E4@
!--- ++3ELL 7 73 %'
"
 &&.ELL--t. 1HCQ !T )4
%=E5#4$&F>**2IPP1142   ((4**f.A.AAIPP1163F3FA     * Lr'   tagsshould_matchc                 R    U Vs/ s H  o3R                   PM     snU:X  d   egs  snf )zMake sure that the given tags have the correct text.

This is used in tests that define a bunch of tags, each
containing a single string, and then select certain strings by
some mechanism.
Nstringr$   rf   rg   tags       r%   assert_selectsSoupTest.assert_selects   s&     '++ds

d+|;;;+s   $c                 D    U Vs/ s H  o3S   PM	     snU:X  d   egs  snf )zMake sure that the given tags have the correct IDs.

This is used in tests that define a bunch of tags, each
containing a single string, and then select certain strings by
some mechanism.
idNr0   rk   s       r%   assert_selects_idsSoupTest.assert_selects_ids)  s&     &**TcD	T*l:::*s   r0   r"   )F)__name__
__module____qualname____firstlineno__propertyr   r   r   r   r   r   r-   r>   r2   r   rI   assertSoupEqualsr   rR   boolr
   r^   r   rm   rq   __static_attributes__r0   r'   r%   r   r   e   s   k!2  @? @c @m @
P3 P# P# P MQE'E<DSME	E4 #	3 	4 	 05AA(,A	+	AF<8C= < <RV <	;SM	;19#	;		;r'   r   c            	           \ rS rSr\R
                  R                  SS0 \" S/S9SS/0/5      S 5       r\R
                  R                  S\" S/S	9SS/0/5      S
 5       r	S r
S rS rS rSrg)TreeBuilderSmokeTesti5  multi_valued_attributesNclass)b*notclassc                 P    SnU R                  X!S9nUR                  S   S:X  d   eg )NzC<html xmlns="http://www.w3.org/1999/xhtml"><a class="a b c"></html>r}   r~   za b cr-   ar$   r}   r(   r-   s       r%   test_attribute_not_multi_valued4TreeBuilderSmokeTest.test_attribute_not_multi_valued8  s0     WyyyQvvg')))r'   )r   c                 T    SnU R                  X!S9nUR                  S   / SQ:X  d   eg )Nz<a class="a b c">r   r~   )r   r   cr   r   s       r%   test_attribute_multi_valued0TreeBuilderSmokeTest.test_attribute_multi_valued@  s/     %yyyQvvg/111r'   c                 P    SnU R                  U5        SnU R                  U5        g )Nz<![if word]>content<![endif]>z<!DOCTYPE html]ff>)r-   r$   r(   s     r%   test_invalid_doctype)TreeBuilderSmokeTest.test_invalid_doctypeH  s&     1		&%		&r'   c                 |    SnU R                  U[        SS9S9n[        S UR                   5       5      (       a   eg )Nz<!DOCTYPE html>
<html>
</html>html)rF   
parse_onlyc              3   B   #    U  H  n[        U[        5      v   M     g 7fr"   )r=   r	   )r9   rH   s     r%   r;   =TreeBuilderSmokeTest.test_doctype_filtered.<locals>.<genexpr>S  s     H7G!z!W--7Gs   )r-   r   anyrM   r$   r(   r-   s      r%   test_doctype_filtered*TreeBuilderSmokeTest.test_doctype_filteredP  s>    3yyLf,EyFHt7G7GHHHHHHr'   c                     " S S[         5      nSnU R                  US9nU R                  X#S9nUR                  n[	        UR
                  U5      (       d   eSUS   :X  d   eSUS	'   SUS	   :X  d   eS
nXeR                  5       :X  d   eg )Nc                   4   ^  \ rS rSrS\S\4U 4S jjrSrU =r$ )NTreeBuilderSmokeTest.test_custom_attribute_dict_class.<locals>.MyAttributeDictiV  keyvaluec                 &   > [         TU ]  US5        g )N
OVERRIDDEN)super__setitem__)r$   r   r   	__class__s      r%   r   ZTreeBuilderSmokeTest.test_custom_attribute_dict_class.<locals>.MyAttributeDict.__setitem__W  s     #C6r'   r0   )	rs   rt   ru   rv   r>   r   r   rz   __classcell__r   s   @r%   MyAttributeDictr   V  s    7s 73 7 7r'   r   "<a attr1="val1" attr2="val2">f</a>)attribute_dict_classr7   r   attr1Tattr3zA<a attr1="OVERRIDDEN" attr2="OVERRIDDEN" attr3="OVERRIDDEN">f</a>)dictr   r-   r   r=   attrsr?   )r$   r   r(   r+   r-   rl   expects          r%    test_custom_attribute_dict_class5TreeBuilderSmokeTest.test_custom_attribute_dict_classU  s    	7d 	7 6&&O&Lyyy1ff#))_5555s7|+++Gs7|+++T%%%r'   c                      " S S[         5      nU R                  S[        S/5      0US9nSnU R                  X2S9nUR                  nUS   S	:X  d   eUS   S
S/:X  d   e[        US   U5      (       d   eg )Nc                   (   ^  \ rS rSrU 4S jrSrU =r$ )_TreeBuilderSmokeTest.test_custom_attribute_value_list_class.<locals>.MyCustomAttributeValueListii  c                 H   > [         TU ]  " U0 UD6  U R                  S5        g )Nextra)r   __init__append)r$   argsr)   r   s      r%   r   hTreeBuilderSmokeTest.test_custom_attribute_value_list_class.<locals>.MyCustomAttributeValueList.__init__j  s!     $1&1G$r'   r0   )rs   rt   ru   rv   r   rz   r   r   s   @r%   MyCustomAttributeValueListr   i  s    % %r'   r   r   attr2)r}   attribute_value_list_classr   r7   r   val1val2r   )r   r   setr-   r   r=   )r$   r   r+   r(   r-   rl   s         r%   &test_custom_attribute_value_list_class;TreeBuilderSmokeTest.test_custom_attribute_value_list_classh  s    	%); 	%
 &&%(#wi.$9'A ' 
 6yyy1ff7|v%%%7|0000#g,(BCCCCr'   r0   )rs   rt   ru   rv   pytestmarkparametrizer   r   r   r   r   r   r   rz   r0   r'   r%   r|   r|   5  s     [[!D"dgY.?#
|AT#U**
 [[!DG9$5gY7G#H22
I
&&Dr'   r|   c            	          \ rS rSrSrS rS rS rS rS\	SS	4S
 jr
 SIS\	S\	S\\\4   4S jjrS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS r S r!S  r"S! r#S" r$S# r%S$ r&S% r'S& r(S' r)S( r*S) r+S* r,S+ r-S, r.S- r/S. r0S/ r1S0 r2S1 r3S2 r4S3 r5S4 r6S5 r7S6 r8S7 r9S8 r:S9 r;S: r<S; r=S< r>S= r?S> r@S? rAS@ rBSA rCSB rDSC rESD rFSE rGSF rHSG rISHrJg	)JHTMLTreeBuilderSmokeTestiz  a/  A basic test of a treebuilder's competence.

Any HTML treebuilder, present or future, should be able to pass
these tests. With invalid markup, there's room for interpretation,
and different parsers can handle it differently. But with the
markup in these tests, there's not much room for interpretation.
c                     S H6  nU R                  S5      nUR                  U5      nUR                  SL a  M6   e   U R                  SS5        U R                  SS5        g)z]Verify that all HTML4 and HTML5 empty element (aka void element) tags
are handled correctly.
)areabasebrcolembedhrimginputkeygenlinkmenuitemmetaparamsourcetrackwbrspacerframe Tz<br/><br/><br/>z<br /><br /><br />N)r-   new_tagis_empty_elementrI   )r$   rF   r-   r   s       r%   test_empty_element_tags0HTMLTreeBuilderSmokeTest.test_empty_element_tags  se    
D( 99R=Dll4(G++t333-
0 	*,=>-/@Ar'   c                    U R                  S5      n[        UR                  R                  [        5      (       d   e[        UR
                  R                  [        5      (       d   eU R                  S5      n[        UR                  R                  [        5      (       d   eUR                  R                  S:X  d   e[        UR                  R                  [        5      (       d   eg )Nz7<style>Some CSS</style><script>Some Javascript</script>z<style><!--Some CSS--></style>z<!--Some CSS-->)r-   r=   stylerj   r   scriptr   r$   r-   s     r%   test_special_string_containers7HTMLTreeBuilderSmokeTest.test_special_string_containers  s    yyRS$**++Z8888$++,,f5555yy9:$**++Z8888 zz  $5555$**++Z8888r'   c                    U R                  S5      n[        R                  " U[        R                  5      n[        R                  " U5      nUR
                  [        :X  d   eUR                  5       UR                  5       :X  d   eg )N<a><b>foo</a>)r-   pickledumpsHIGHEST_PROTOCOLloadsr   r   r?   r$   treedumpedloadeds       r%   !test_pickle_and_unpickle_identity:HTMLTreeBuilderSmokeTest.test_pickle_and_unpickle_identity  sd     yy)dF$;$;<f%=000}}$++-///r'   c                     SnU R                  U5      n[        R                  " U[        R                  5      n[        R                  " U5      nUR
                  R                  SL d   eg )Nz
<!DOCTYPE html>
<html lang="en">
<head><title>blabla</title></head>
<body><?xml encoding="utf-8" ?><html></html></body>
</html>
F)r-   r   r   r   r   r+   is_xml)r$   r(   r-   pickleds       r%   #test_pickle_and_unpickle_bad_markup<HTMLTreeBuilderSmokeTest.test_pickle_and_unpickle_bad_markup  sU     yy ,,tV%<%<=||G$||""e+++r'   doctype_fragmentr    Nc                 $   U R                  U5      u  p#UR                  S   nUR                  [        :X  d   eXA:X  d   eUR	                  S5      S[        U5       U:X  d   eUR                  c   eUR                  R                  S   S:X  d   eg)z8Assert that a given doctype string is handled correctly.r   utf8Nfoo_document_with_doctyper]   r   r	   encoder\   pr$   r   doctype_strr-   doctypes        r%   assertDoctypeHandled-HTMLTreeBuilderSmokeTest.assertDoctypeHandled  s     778HI --"  G+++***{{6"#5S%56+EEE vv!!!vvq!U***r'   doctype_stringc                 j    SU< SU< S3nUS-   nU R                  U5      nUR                  S5      U4$ )z5Generate and parse a document with the given doctype.z<! >z
<p>foo</p>r   r-   r   )r$   r   r  r  r(   r-   s         r%   r   /HTMLTreeBuilderSmokeTest._document_with_doctype  s;     !/0@A>)yy ~~f%t++r'   c                 H    U R                  S5        U R                  S5        g)z?Make sure normal, everyday HTML doctypes are handled correctly.r   z4html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"Nr  r#   s    r%   test_normal_doctypes-HTMLTreeBuilderSmokeTest.test_normal_doctypes  s!    !!&)!!B	
r'   c                 p    U R                  S5      nUR                  S   nSUR                  5       :X  d   eg )Nz
<!DOCTYPE>r   r   )r-   r]   strip)r$   r-   r  s      r%   test_empty_doctype+HTMLTreeBuilderSmokeTest.test_empty_doctype  s2    yy&--"W]]_$$$r'   c                    S H  nU R                  SU5      u  p#UR                  S   nUR                  [        :X  d   eUS:X  d   eUR	                  S5      S [        U5       S:X  d   eUR                  R                  S   S:X  a  M   e   g )N)r  DocTyper   r   r   s   <!DOCTYPE html>r   r   r   s        r%   test_mixed_case_doctype0HTMLTreeBuilderSmokeTest.test_mixed_case_doctype  s     6 $ ; ;FDT UK mmA&G$$///f$$$;;v&'9[)9:>PPPP 66??1%... !7r'   c                 *    SnU R                  U5        g )Nznhtml PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"r  )r$   r  s     r%   test_public_doctype_with_url5HTMLTreeBuilderSmokeTest.test_public_doctype_with_url  s     C!!'*r'   c                 &    U R                  S5        g )Nz$foo SYSTEM "http://www.example.com/"r  r#   s    r%   test_system_doctype,HTMLTreeBuilderSmokeTest.test_system_doctype  s    !!"HIr'   c                 &    U R                  S5        g )Nz#xsl:stylesheet SYSTEM "htmlent.dtd"r  r#   s    r%   test_namespaced_system_doctype7HTMLTreeBuilderSmokeTest.test_namespaced_system_doctype      !!"GHr'   c                 &    U R                  S5        g )Nz#xsl:stylesheet PUBLIC "htmlent.dtd"r  r#   s    r%   test_namespaced_public_doctype7HTMLTreeBuilderSmokeTest.test_namespaced_public_doctype  r  r'   c                    Sn[         R                  " SS9 nU R                  U5      nSSS5        WR                  S5      R	                  SS5      UR	                  SS5      :X  d   eW/ :X  d   eg! , (       d  f       NN= f)zJA real XHTML document should come out more or less the same as it went in.   <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>Hello.</title></head>
<body>Goodbye.</body>
</html>TrecordNutf-8   
r'   )warningscatch_warningsr-   r   replacer$   r(   wr-   s       r%   test_real_xhtml_document1HTMLTreeBuilderSmokeTest.test_real_xhtml_document  st     $$D1Q99V$D 2{{7#++E376>>%QT;UUUU Bww 21s   A11
A?c                     Sn[         R                  " SS9 nU R                  U5      nS S S 5        S[        WR	                  S5      5      :X  d   e/ W:X  d   eg ! , (       d  f       N7= f)Ns.   <ns1:foo>content</ns1:foo><ns1:foo/><ns2:foo/>Tr%     zns1:foo)r)  r*  r-   r\   find_allr,  s       r%   test_namespaced_html-HTMLTreeBuilderSmokeTest.test_namespaced_html  sa     G$$D1Q99V$D 2 Ci01111 Qww 21s   A
A(c                 \   Sn[         R                  " SS9 nU R                  U5      nUR                  R                  S:X  d   e S S S 5        Wu  n[        UR                  [        5      (       d   e[        UR                  5      [        R                  :X  d   eg ! , (       d  f       N]= f)Ns7   <?xml version="1.0" encoding="utf-8"?><tag>string</tag>Tr%  rj   )
r)  r*  r-   rl   rj   r=   messager   r>   MESSAGE)r$   r(   r-  r-   warnings        r%   test_detect_xml_parsed_as_html7HTMLTreeBuilderSmokeTest.test_detect_xml_parsed_as_html$  s     P$$D1Q99V$D88??h... 2 	'//+ABBBB7??#'='E'EEEE 21s   .B
B+c                     SnU R                  U5      nXR                  5       :X  d   eSnU R                  U5      nXR                  S5      :X  d   eg )Nz<?PITarget PIContent?>s   <?PITarget PIContent?>r   )r-   r?   r   r   s      r%   test_processing_instruction4HTMLTreeBuilderSmokeTest.test_processing_instruction4  sQ    
 .yy &&&.yy V,,,,r'   c                 D    [         R                  " U R                  5        g)zMake sure you can copy the tree builder.

This is important because the builder is part of a
BeautifulSoup object, and we want to be able to copy that.
N)copydeepcopyr   r#   s    r%   test_deepcopy&HTMLTreeBuilderSmokeTest.test_deepcopyA  s     	d**+r'   c                     U R                  S5      nUR                  R                  (       a   e[        UR                  5      S:X  d   eg)zA <p> tag is never designated as an empty-element tag.

Even if the markup shows it as an empty-element tag, it
shouldn't be presented that way.
<p/><p></p>N)r-   r   r   r>   r   s     r%   !test_p_tag_is_never_empty_element:HTMLTreeBuilderSmokeTest.test_p_tag_is_never_empty_elementI  s;     yy 66****466{i'''r'   c                 p    U R                  SS5        U R                  SS5        U R                  SS5        g)zzA tag that's not closed by the end of the document should be closed.

This applies to all tags except empty-element tags.
<p>rE  z<b>z<b></b>z<br><br/>NrI   r#   s    r%   test_unclosed_tags_get_closed6HTMLTreeBuilderSmokeTest.test_unclosed_tags_get_closedS  s4    
 		*	*)r'   c                     U R                  S5      nUR                  R                  (       d   e[        UR                  5      S:X  d   eg)zA <br> tag is designated as an empty-element tag.

Some parsers treat <br></br> as one <br/> tag, some parsers as
two tags, but it should always be an empty-element tag.
z	<br></br>rJ  N)r-   r   r   r>   r   s     r%   #test_br_is_always_empty_element_tag<HTMLTreeBuilderSmokeTest.test_br_is_always_empty_element_tag]  s;     yy%ww''''477|w&&&r'   c                 &    U R                  S5        g )Nz<em><em></em></em>rK  r#   s    r%   test_nested_formatting_elements8HTMLTreeBuilderSmokeTest.test_nested_formatting_elementsg  s    -.r'   c                 ^    SnU R                  U5      nSUR                  S5      S   :X  d   eg )Nz<!DOCTYPE html>
<html>
<head>
<title>Ordinary HEAD element test</title>
</head>
<script type="text/javascript">
alert("Help!");
</script>
<body>
Hello, world!
</body>
</html>
ztext/javascriptr   type)r-   find)r$   r   r-   s      r%   test_double_head)HTMLTreeBuilderSmokeTest.test_double_headj  s4     yy DIIh$7$????r'   c                    SnU R                  U5        U R                  U5      nUR                  SS9nUR                  [        :X  d   eUR                  SS9nX4R
                  :X  d   eUR                  SS9nX5R                  :X  d   eg )Nz<p>foo<!--foobar-->baz</p>foobarri   r   baz)rI   r-   rV  r   r   rN   rO   )r$   r(   r-   commentr   r[  s         r%   test_comment%HTMLTreeBuilderSmokeTest.test_comment{  s    - yy ))8),  G+++ iiui%*****iiui%.....r'   c                 v   SnSnU R                  U5        U R                  U5        U R                  U5      nUR                  R                  5       U:X  d   eU R                  U5      nUR                  R                  5       U:X  d   eU R                  S5      nUR                  R                  5       S:X  d   eg)zoWhitespace must be preserved in <pre> and <textarea> tags,
even if that would mean not prettifying the markup.
z<pre>a   z</pre>
z <textarea> woo
woo  </textarea>
z<textarea></textarea>z<textarea></textarea>
N)rI   r-   preprettifytextarea)r$   
pre_markuptextarea_markupr-   s       r%   -test_preserved_whitespace_in_pre_and_textareaFHTMLTreeBuilderSmokeTest.test_preserved_whitespace_in_pre_and_textarea  s     *
>$)yy$xx  "j000yy)}}%%'?:::yy01}}%%'+DDDDr'   c                 v    SnU R                  U5        SnU R                  U5        SnU R                  U5        g)z+Inline elements can be nested indefinitely.z<b>Inside a B tag</b>z!<p>A <i>nested <b>tag</b></i></p>z/<p>A <a>doubly <i>nested <b>tag</b></i></a></p>NrK  )r$   b_tagnested_b_tagdouble_nested_b_tags       r%   test_nested_inline_elements4HTMLTreeBuilderSmokeTest.test_nested_inline_elements  s=    ':&O,-r'   c                     U R                  S5      nUR                  nUR                  R                  R                  S:X  d   eUR                  R                  S:X  d   eg)zBlock elements can be nested.z*<blockquote><p><b>Foo</b></p></blockquote>FooN)r-   
blockquoter   r   rj   )r$   r-   ro  s      r%    test_nested_block_level_elements9HTMLTreeBuilderSmokeTest.test_nested_block_level_elements  sN    yyEF__
||~~$$---||""e+++r'   c                 N    SnU R                  US5        U R                  S5        g)z$One table can go inside another one.z[<table id="1"><tr><td>Here's another table:<table id="2"><tr><td>foo</td></tr></table></td>zh<table id="1"><tr><td>Here's another table:<table id="2"><tr><td>foo</td></tr></table></td></tr></table>z{<table><thead><tr><td>Foo</td></tr></thead><tbody><tr><td>Bar</td></tr></tbody><tfoot><tr><td>Baz</td></tr></tfoot></table>NrK  r   s     r%   test_correctly_nested_tables5HTMLTreeBuilderSmokeTest.test_correctly_nested_tables  s9     	 	!	
 	;	
r'   c                     SnU R                  U5      nSS/UR                  S   :X  d   eUR                  UR                  SSS9:X  d   eg )Nz<div class=" foo bar	 "></a>r   barr~   divzfoo bar)class_)r-   rw  rV  r   s      r%   *test_multivalued_attribute_with_whitespaceCHTMLTreeBuilderSmokeTest.test_multivalued_attribute_with_whitespace  sS     0yy u~'!2222 xx499U99====r'   c                 j    SnU R                  U5      nS/UR                  R                  S   :X  d   eg )Nz1<table><div><div class="css"></div></div></table>cssr~   )r-   rw  r   s      r%   (test_deeply_nested_multivalued_attributeAHTMLTreeBuilderSmokeTest.test_deeply_nested_multivalued_attribute  s5     Eyy w$((,,w////r'   c                 X    SnU R                  U5      nSS/UR                  S   :X  d   eg )Nz<html class="a b"></html>r   r   r~   )r-   r   r   s      r%   "test_multivalued_attribute_on_html;HTMLTreeBuilderSmokeTest.test_multivalued_attribute_on_html  s2     -yy SzTYYw////r'   c                 (    U R                  SS5        g )Nz<a b="<a>"></a>z<a b="&lt;a&gt;"></a>rK  r#   s    r%   3test_angle_brackets_in_attribute_values_are_escapedLHTMLTreeBuilderSmokeTest.test_angle_brackets_in_attribute_values_are_escaped  s    *,CDr'   c                 (    U R                  SS5        g )Nz$<p>&bull; AT&T is in the s&p 500</p>u)   <p>• AT&amp;T is in the s&amp;p 500</p>rK  r#   s    r%   3test_strings_resembling_character_entity_referencesLHTMLTreeBuilderSmokeTest.test_strings_resembling_character_entity_references  s     	2:	
r'   c                 (    U R                  SS5        g )Nz<p>Bob&apos;s Bar</p>z<p>Bob's Bar</p>rK  r#   s    r%   test_apos_entity)HTMLTreeBuilderSmokeTest.test_apos_entity  s    #	
r'   c                 b    SnU R                  U5      nSUR                  R                  :X  d   eg )Nz%<p>&#147;Hello&#148; &#45;&#9731;</p>u   “Hello” -☃r-   r   rj   r   s      r%   *test_entities_in_foreign_document_encodingCHTMLTreeBuilderSmokeTest.test_entities_in_foreign_document_encoding  s-     9yy !TVV]]222r'   c                     SnU R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        g )Nu   <p id="piñata"></p>z<p id="pi&#241;ata"></p>z<p id="pi&#xf1;ata"></p>z<p id="pi&#Xf1;ata"></p>z<p id="pi&ntilde;ata"></p>rK  r$   r   s     r%   0test_entities_in_attributes_converted_to_unicodeIHTMLTreeBuilderSmokeTest.test_entities_in_attributes_converted_to_unicode  sK    H3V<3V<3V<5v>r'   c                     SnU R                  SU5        U R                  SU5        U R                  SU5        U R                  SU5        g )Nu   <p>piñata</p>z<p>pi&#241;ata</p>z<p>pi&#xf1;ata</p>z<p>pi&#Xf1;ata</p>z<p>pi&ntilde;ata</p>rK  r  s     r%   *test_entities_in_text_converted_to_unicodeCHTMLTreeBuilderSmokeTest.test_entities_in_text_converted_to_unicode  sK    B-v6-v6-v6/8r'   c                 (    U R                  SS5        g )Nz#<p>I said &quot;good day!&quot;</p>z<p>I said "good day!"</p>rK  r#   s    r%   ,test_quot_entity_converted_to_quotation_markEHTMLTreeBuilderSmokeTest.test_quot_entity_converted_to_quotation_mark  s    13N	
r'   c                 t    SnU R                  SU5        U R                  SU5        U R                  SU5        g )Nu   �z&#10000000000000;z&#x10000000000000;z&#1000000000;rK  r  s     r%   test_out_of_range_entity1HTMLTreeBuilderSmokeTest.test_out_of_range_entity  s9    ,,f5-v6&1r'   c                     U R                  S5      nSUR                  R                  R                  R                  :X  d   eSUR
                  R                  :X  d   eU R                  U5        g)zDMostly to prevent a recurrence of a bug in the html5lib treebuilder.z!<html><h2>
foo</h2><p></p></html>r   N)r-   h2rj   rN   rF   r   rR   r   s     r%   test_multipart_strings/HTMLTreeBuilderSmokeTest.test_multipart_strings  sW    yy=>dggnn1166666dffkk!!!  &r'   c                     SnU R                  U5      nSUR                  R                  5       :X  d   eSnU R                  U5      nSUR                  R                  5       :X  d   eg )Nz<p>a &nosuchentity b</p>z<p>a &amp;nosuchentity b</p>z<p>a &nosuchentity; b</p>z<p>a &amp;nosuchentity; b</p>)r-   r   r?   r   s      r%   test_invalid_html_entity1HTMLTreeBuilderSmokeTest.test_invalid_html_entity  sZ    
 ,yy -@@@,yy .$&&--/AAAr'   c                 ~    SnU R                  U5      nUR                  R                  c   eU R                  U5        g)8Prevent recurrence of a bug in the html5lib treebuilder.z?<html><head></head>
  <link></link>
  <body>foo</body>
</html>
N)r-   r   bodyrR   r$   contentr-   s      r%   #test_head_tag_between_head_and_body<HTMLTreeBuilderSmokeTest.test_head_tag_between_head_and_body,  s;    
 yy!yy~~)))  &r'   c                 `    SnU R                  U5      nU R                  UR                  5        g)r  z<!DOCTYPE html>
<html>
 <body>
   <article id="a" >
   <div><a href="1"></div>
   <footer>
     <a href="2"></a>
   </footer>
  </article>
  </body>
</html>
N)r-   rR   articler  s      r%   test_multiple_copies_of_a_tag6HTMLTreeBuilderSmokeTest.test_multiple_copies_of_a_tag7  s+     yy!  .r'   c                     SnU R                  U5      nXR                  5       :X  d   eSUR                  S   :X  d   eSUR                  S   :X  d   eSUR                  S   :X  d   eg)	zvParsers don't need to *understand* namespaces, but at the
very least they should not choke on namespaces or lose
data.s   <html xmlns="http://www.w3.org/1999/xhtml" xmlns:mathml="http://www.w3.org/1998/Math/MathML" xmlns:svg="http://www.w3.org/2000/svg"><head></head><body><mathml:msqrt>4</mathml:msqrt><b svg:fill="red"></b></body></html>http://www.w3.org/1999/xhtmlxmlns"http://www.w3.org/1998/Math/MathMLzxmlns:mathmlhttp://www.w3.org/2000/svgz	xmlns:svgN)r-   r   r   r   s      r%   test_basic_namespaces.HTMLTreeBuilderSmokeTest.test_basic_namespacesH  so    
 nyy &&&-71CCCC3tyy7PPPP+tyy/EEEEr'   c                 X    SnU R                  U5      nSS/UR                  S   :X  d   eg )Ns   <a class="foo bar">r   rv  r~   r   r   s      r%   -test_multivalued_attribute_value_becomes_listFHTMLTreeBuilderSmokeTest.test_multivalued_attribute_value_becomes_listT  s/    'yy u~000r'   c                 b    SnU R                  U5      nSUR                  R                  :X  d   eg )NuD   <html><head><meta encoding="euc-jp"></head><body>Sacré bleu!</body>   Sacré bleu!)r-   r  rj   r   s      r%   test_can_parse_unicode_document8HTMLTreeBuilderSmokeTest.test_can_parse_unicode_document`  s0     yyy 499#3#3333r'   c                 f    [        S5      nU R                  SUS9nUR                  5       S:X  d   eg)z2Parsers should be able to work with SoupStrainers.r   z&A <b>bold</b> <meta/> <i>statement</i>r   z<b>bold</b>N)r   r-   r?   )r$   strainerr-   s      r%   test_soupstrainer*HTMLTreeBuilderSmokeTest.test_soupstrainerh  s3    $yyAhyW{{}---r'   c                 (    U R                  SS5        g )Nz<foo attr='bar'></foo>z<foo attr="bar"></foo>rK  r#   s    r%   7test_single_quote_attribute_values_become_double_quotesPHTMLTreeBuilderSmokeTest.test_single_quote_attribute_values_become_double_quotesn  s    13KLr'   c                 *    SnU R                  U5        g )N'<foo attr='bar "brawls" happen'>a</foo>rK  )r$   texts     r%   7test_attribute_values_with_nested_quotes_are_left_alonePHTMLTreeBuilderSmokeTest.test_attribute_values_with_nested_quotes_are_left_aloneq  s    <r'   c                     SnU R                  U5      nSUR                  S'   U R                  UR                  R                  5       S5        g )Nr  zBrawls happen at "Bob's Bar"attrz:<foo attr="Brawls happen at &quot;Bob's Bar&quot;">a</foo>)r-   r   rI   r?   )r$   r  r-   s      r%   :test_attribute_values_with_double_nested_quotes_get_quotedSHTMLTreeBuilderSmokeTest.test_attribute_values_with_double_nested_quotes_get_quotedu  sA    <yy:HHOOM	
r'   c                 L    U R                  SS5        U R                  SS5        g )Nz+<this is="really messed up & stuff"></this>z/<this is="really messed up &amp; stuff"></this>z.<a href="http://example.org?a=1&b=2;3">foo</a>z2<a href="http://example.org?a=1&amp;b=2;3">foo</a>rK  r#   s    r%   .test_ampersand_in_attribute_value_gets_escapedGHTMLTreeBuilderSmokeTest.test_ampersand_in_attribute_value_gets_escaped~  s,    9=	

 	<@	
r'   c                 &    U R                  S5        g )Nz/<a href="http://example.org?a=1&amp;b=2;3"></a>rK  r#   s    r%   7test_escaped_ampersand_in_attribute_value_is_left_alonePHTMLTreeBuilderSmokeTest.test_escaped_ampersand_in_attribute_value_is_left_alone  s    JKr'   c                 .    SnSnU R                  X5        g )N-<p>&lt;&lt;sacr&eacute;&#32;bleu!&gt;&gt;</p>#   <p>&lt;&lt;sacré bleu!&gt;&gt;</p>rK  )r$   r  expecteds      r%   1test_entities_in_strings_converted_during_parsingJHTMLTreeBuilderSmokeTest.test_entities_in_strings_converted_during_parsing  s!     ?R 	 	(r'   c                 `    SnU R                  USS9nUR                  R                  S:X  d   eg )Ns   <p>Foo</p>zwindows-1252from_encodingu	   ‘Foo’r  )r$   quoter-   s      r%   )test_smart_quotes_converted_on_the_way_inBHTMLTreeBuilderSmokeTest.test_smart_quotes_converted_on_the_way_in  s:     &yyny=FFMMQR	
Rr'   c                 ^    U R                  S5      nUR                  R                  S:X  d   eg )Nz<a>&nbsp;&nbsp;</a>u     )r-   r   rj   r   s     r%   0test_non_breaking_spaces_converted_on_the_way_inIHTMLTreeBuilderSmokeTest.test_non_breaking_spaces_converted_on_the_way_in  s(    yy./vv}} 8888r'   c                     SnSR                  S5      nU R                  U5      nUR                  R                  S5      U:X  d   eg )Nr  r  r'  )r   r-   r   )r$   r  r  r-   s       r%   &test_entities_converted_on_the_way_out?HTMLTreeBuilderSmokeTest.test_entities_converted_on_the_way_out  sD    >Y``
 yyvv}}W%111r'   c                     SnUR                  S5      nU R                  U5      nUR                  S5      nUR                  SS5      nUR                  S5      nXE:X  d   eg )Nu   <html><head><meta content="text/html; charset=ISO-8859-1" http-equiv="Content-type"/></head><body><p>Sacré bleu!</p></body></html>z
iso-8859-1r'  z
ISO-8859-1)r   r-   r+  )r$   unicode_htmliso_latin_htmlr-   resultr  s         r%   test_real_iso_8859_document4HTMLTreeBuilderSmokeTest.test_real_iso_8859_document  sn    
 ~ &,,\: yy( W%
  ''g> ??7+ !!!r'   c                     SnUR                  S5      nU R                  U5      nUR                  S5      UR                  S5      :X  d   eUR                  S5      UR                  S5      :X  d   eg )Nsk   <html><head></head><body><pre>Shift-JISŃR[fBOꂽ{̃t@CłB</pre></body></html>	shift-jisr'  euc_jp)r?   r-   r   )r$   shift_jis_htmlr  r-   s       r%   test_real_shift_jis_document5HTMLTreeBuilderSmokeTest.test_real_shift_jis_document  sr    $ 	 &,,[9yy& {{7#|':':7'CCCC{{8$(;(;H(EEEEr'   c                     SnU R                  USS9nUR                  S;   d   eUR                  S5      UR                  S5      R                  S5      :X  d   eg )Ns   <html><head><title>Hebrew (ISO 8859-8) in Visual Directionality</title></head><body><h1>Hebrew (ISO 8859-8) in Visual Directionality</h1></body></html>	iso8859-8r  )r  z
iso-8859-8r'  )r-   original_encodingr   r?   )r$   hebrew_documentr-   s      r%   test_real_hebrew_document2HTMLTreeBuilderSmokeTest.test_real_hebrew_document  sg     EyyyD %%)DDDD{{7#"";/66w?
 	
 
r'   c                 .   SnSU-  nU R                  U5      nUR                  SSS05      nUS   nSU:X  d   e[        U[        5      (       d   eSUR	                  S	5      :X  d   eS
UR                  S	5      ;   d   eSUR                  S5      ;   d   eg )NzE<meta content="text/html; charset=x-sjis" http-equiv="Content-type"/>j<html><head>
%s
<meta http-equiv="Content-language" content="ja"/></head><body>Shift-JIS markup goes here.r   z
http-equivzContent-typer  ztext/html; charset=x-sjisztext/html; charset=utf8r   s   charset=utf8s   charset=shift-jisr  )r-   rV  r=   r   substitute_encodingr   )r$   meta_tagr  r-   parsed_metar  s         r%   'test_meta_tag_reflects_current_encoding@HTMLTreeBuilderSmokeTest.test_meta_tag_reflects_current_encoding  s     W 	7 	
 yy( ii~(FGi(*g555 '#<==== )G,G,G,OOOO +"4"4V"<<<<#{'9'9+'FFFFr'   c                 &   SnSU-  nU R                  U5      nUR                  SSS9nUS   nSU:X  d   e[        U[        5      (       d   eSUR	                  S5      :X  d   eS	UR                  S5      ;   d   eS
UR                  S5      ;   d   eg )Nz'<meta id="encoding" charset="x-sjis" />r  r   encoding)rp   charsetzx-sjisr   s   charset="utf8"s   charset="shift-jis"r  )r-   rV  r=   r   r  r   )r$   r  r  r-   r  r  s         r%   3test_html5_style_meta_tag_reflects_current_encodingLHTMLTreeBuilderSmokeTest.test_html5_style_meta_tag_reflects_current_encoding  s     =7 	
 yy( ii:i6i(7""" '#<==== 44V<<<< !K$6$6v$>>>>%););K)HHHHr'   c                     S HY  nU R                  U5      n[         H;  nUS;   a  M  UR                  U5      nSU;   d   eUR                  S5      U;  a  M;   e   M[     g )N)sB   <meta charset="utf8"></head><meta id="encoding" charset="utf-8" />idnambcsoem	undefinedstring_escapezstring-escapes   meta charset=""asciir-   r   r   r$   r(   r-   r  encodeds        r%   2test_python_specific_encodings_not_used_in_charsetKHTMLTreeBuilderSmokeTest.test_python_specific_encodings_not_used_in_charset&  sm    

F 99V$D5    ++h/)W444w/w>>> 6	
r'   c                     U R                  S5      nSUR                  S'   SUR                  R                  5       :X  d   eg )Nz<a>text</a>rv  r   z<a foo="bar">text</a>)r-   r   r?   )r$   datas     r%   5test_tag_with_no_attributes_can_have_attributes_addedNHTMLTreeBuilderSmokeTest.test_tag_with_no_attributes_can_have_attributes_added@  s5    yy'u&$&&--/999r'   c                 f    U R                  S5      nSUR                  R                  5       :X  d   eg )Nz0<body><div><p>text1</p></span>text2</div></body>z)<body><div><p>text1</p>text2</div></body>)r-   r  r?   r   s     r%   $test_closing_tag_with_no_opening_tag=HTMLTreeBuilderSmokeTest.test_closing_tag_with_no_opening_tagE  s.    
 yyKL:dii>N>N>PPPPr'   c                 P    U R                  [        5      nU R                  U5        gz3Test the worst case (currently) for linking issues.Nr-   r   r^   r   s     r%   test_worst_case(HTMLTreeBuilderSmokeTest.test_worst_caseM        yy&t$r'   r0   )DOCTYPE)Krs   rt   ru   rv   __doc__r   r   r   r   r>   r  r   bytesr   r   r  r  r  r  r  r  r!  r.  r3  r9  r<  rA  rF  rL  rO  rR  rW  r]  re  rk  rp  rs  ry  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  rz   r0   r'   r%   r   r   z  s   B>
90,+S +T +  <E, #,58,	um#	$,
%
/ +JII 	F -,(*'/@"/E$	.,
0
>00E


3?9

2'B	'/"
F14.M
	
L)
92"8F$

GFI<?4:
Q%r'   r   c                       \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rS rS rS rS rSrg)XMLTreeBuilderSmokeTestiT  c                     U R                  S5      n[        R                  " US5      n[        R                  " U5      nUR                  [
        :X  d   eUR                  5       UR                  5       :X  d   eg )Nr   r1  )r-   r   r   r   r   r   r?   r   s       r%   r   9XMLTreeBuilderSmokeTest.test_pickle_and_unpickle_identityU  s^     yy)dA&f%=000}}$++-///r'   c                 R    U R                  S5      nUR                  5       S:X  d   eg )N<root/>s.   <?xml version="1.0" encoding="utf-8"?>
<root/>r  r   s     r%   test_docstring_generated0XMLTreeBuilderSmokeTest.test_docstring_generated^  s%    yy#{{} RRRRr'   c                 V    SnU R                  U5      nXR                  S5      :X  d   eg )Ns,   <?xml version="1.0" encoding="utf8"?>
<foo/>r   r  r   s      r%   test_xml_declaration,XMLTreeBuilderSmokeTest.test_xml_declarationb  s*    Eyy V,,,,r'   c                     SnU R                  U5      n[         H;  nUS;   a  M  UR                  U5      nSU;   d   eUR                  S5      U;  a  M;   e   g )Ns   <?xml version="1.0"?>
<foo/>r  s   <?xml version="1.0"?>r	  r
  r  s        r%   :test_python_specific_encodings_not_used_in_xml_declarationRXMLTreeBuilderSmokeTest.test_python_specific_encodings_not_used_in_xml_declarationg  sf     6yy 1H   kk(+G+w666??7+7::: 2r'   c                 V    SnU R                  U5      nXR                  S5      :X  d   eg )Ns<   <?xml version="1.0" encoding="utf8"?>
<?PITarget PIContent?>r   r  r   s      r%   r<  3XMLTreeBuilderSmokeTest.test_processing_instruction~  s*    Uyy V,,,,r'   c                 X    SnU R                  U5      nUR                  S5      U:X  d   eg)zGA real XHTML document should come out *exactly* the same as it went in.r$  r'  Nr  r   s      r%   r.  0XMLTreeBuilderSmokeTest.test_real_xhtml_document  s0     yy {{7#v---r'   c                 T    SnU R                  U5      nXR                  5       :X  d   eg )Ns  <?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<parent xmlns="http://ns1/">
<child xmlns="http://ns2/" xmlns:ns3="http://ns3/">
<grandchild ns3:attr="value" xmlns="http://ns4/"/>
</child>
</parent>r  r$   docr-   s      r%   test_nested_namespaces.XMLTreeBuilderSmokeTest.test_nested_namespaces  s*     yy~kkm###r'   c                 r    Sn[        US5      nSUR                  l        UR                  5       nSU;   d   eg )Nz/
  <script type="text/javascript">
  </script>
zlxml-xmlzconsole.log("< < hey > > ");s   &lt; &lt; hey &gt; &gt;)r   r   rj   r   )r$   r3  r-   r  s       r%   5test_formatter_processes_script_tag_for_xml_documentsMXMLTreeBuilderSmokeTest.test_formatter_processes_script_tag_for_xml_documents  s>     S*- <++-)W444r'   c                 b    SnU R                  U5      nSUR                  R                  :X  d   eg )Nu?   <?xml version="1.0" encoding="euc-jp"><root>Sacré bleu!</root>r  r-   rootrj   r   s      r%   r  7XMLTreeBuilderSmokeTest.test_can_parse_unicode_document  s-    syy 499#3#3333r'   c                 b    SnU R                  U5      nSUR                  R                  :X  d   eg )NuB   ﻿<?xml version="1.0" encoding="euc-jp"><root>Sacré bleu!</root>r  r:  r   s      r%   1test_can_parse_unicode_document_begining_with_bomIXMLTreeBuilderSmokeTest.test_can_parse_unicode_document_begining_with_bom  s0     Gyy 499#3#3333r'   c                 `    SnU R                  U5      n[        UR                  5      U:X  d   eg )Nz<rss xmlns:dc="foo"><dc:creator>b</dc:creator><dc:date>2012-07-02T20:33:42Z</dc:date><dc:rights>c</dc:rights><image>d</image></rss>)r-   r>   rssr   s      r%   test_popping_namespaced_tag3XMLTreeBuilderSmokeTest.test_popping_namespaced_tag  s.     Wyy 488}&&&r'   c                 T    U R                  S5      nUR                  S5      S:X  d   eg )Nr$  latin1s/   <?xml version="1.0" encoding="latin1"?>
<root/>r  r   s     r%   (test_docstring_includes_correct_encoding@XMLTreeBuilderSmokeTest.test_docstring_includes_correct_encoding  s*    yy#KK!%XX	
Xr'   c                 X    SnU R                  U5      nUR                  S5      U:X  d   eg)z<A large XML document should come out the same as it went in.s4  <?xml version="1.0" encoding="utf-8"?>
<root>0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000</root>r'  Nr  r   s      r%   test_large_xml_document/XMLTreeBuilderSmokeTest.test_large_xml_document  s3     	
 yy {{7#v---r'   c                 J    U R                  SS5        U R                  S5        g )NrI  rD  z
<p>foo</p>rK  r#   s    r%   9test_tags_are_empty_element_if_and_only_if_they_are_emptyQXMLTreeBuilderSmokeTest.test_tags_are_empty_element_if_and_only_if_they_are_empty  s     '&r'   c                 n    SnU R                  U5      nUR                  nSUS   :X  d   eSUS   :X  d   eg )Nz<root xmlns:a="http://example.com/" xmlns:b="http://example.net/"><a:foo>This tag is in the a namespace</a:foo><b:foo>This tag is in the b namespace</b:foo></root>zhttp://example.com/zxmlns:azhttp://example.net/zxmlns:b)r-   r;  )r$   r(   r-   r;  s       r%   test_namespaces_are_preserved5XMLTreeBuilderSmokeTest.test_namespaces_are_preserved  sE     wyy yy$Y777$Y777r'   c                 `    SnU R                  U5      n[        UR                  5      U:X  d   eg )NzN<p xmlns:dc="http://purl.org/dc/elements/1.1/"><dc:date>20010504</dc:date></p>)r-   r>   r   r   s      r%   test_closing_namespaced_tag3XMLTreeBuilderSmokeTest.test_closing_namespaced_tag  s+    ayy 466{f$$$r'   c                 `    SnU R                  U5      n[        UR                  5      U:X  d   eg )Nzs<foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><bar xsi:schemaLocation="http://www.example.com"/></foo>r-   r>   r   r   s      r%   test_namespaced_attributes2XMLTreeBuilderSmokeTest.test_namespaced_attributes  s.     Gyy 488}&&&r'   c                 `    SnU R                  U5      n[        UR                  5      U:X  d   eg )Nz<foo xml:lang="fr">bar</foo>rU  r   s      r%   (test_namespaced_attributes_xml_namespace@XMLTreeBuilderSmokeTest.test_namespaced_attributes_xml_namespace  s+    /yy 488}&&&r'   c                     SnU R                  U5      nS[        UR                  S5      5      :X  d   eS[        UR                  S5      5      :X  d   eS[        UR                  S5      5      :X  d   e g )Na  <?xml version="1.0" encoding="utf-8"?>
<Document xmlns="http://example.com/ns0"
    xmlns:ns1="http://example.com/ns1"
    xmlns:ns2="http://example.com/ns2">
    <ns1:tag>foo</ns1:tag>
    <ns1:tag>bar</ns1:tag>
    <ns2:tag key="value">baz</ns2:tag>
</Document>
   rl   r1  zns1:tagrW   zns2:tag)r-   r\   r2  r2  s      r%   test_find_by_prefixed_name2XMLTreeBuilderSmokeTest.test_find_by_prefixed_name  sv     yy~ Ce,---- Ci01111Ci01111r'   c                     SnU R                  U5      nUR                  n[        R                  " U5      nUR                  UR                  :X  d   eg )Nzf<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:w="http://example.com/ns0"/>)r-   documentr?  prefix)r$   xmlr-   rl   	duplicates        r%   !test_copy_tag_preserves_namespace9XMLTreeBuilderSmokeTest.test_copy_tag_preserves_namespace  sH    2 yy~mmIIcN	 zzY-----r'   c                 P    U R                  [        5      nU R                  U5        gr  r  r   s     r%   r  'XMLTreeBuilderSmokeTest.test_worst_case  r  r'   r0   N)rs   rt   ru   rv   r   r%  r(  r+  r<  r.  r4  r7  r  r>  rB  rF  rI  rL  rO  rR  rV  rY  r]  rd  r  rz   r0   r'   r%   r   r   T  sl    0S-
;.-
	.	$
54
4
'

.'8%
'
'
=,	.%r'   r   c                   6    \ rS rSrSrS rS rS rS rS r	Sr
g	)
HTML5TreeBuilderSmokeTesti  z2Smoke test for a tree builder that supports HTML5.c                     g r"   r0   r#   s    r%   r.  2HTML5TreeBuilderSmokeTest.test_real_xhtml_document	  s     	r'   c                 b    SnU R                  U5      nSUR                  R                  :X  d   eg )Nz<a>r  )r-   r   	namespacer   s      r%   test_html_tags_have_namespace7HTML5TreeBuilderSmokeTest.test_html_tags_have_namespace  s-    yy -1A1AAAAr'   c                     SnU R                  U5      nSnX2R                  R                  :X  d   eX2R                  R                  :X  d   eg )Nz<svg><circle/></svg>r  )r-   svgrm  circler$   r(   r-   rm  s       r%   test_svg_tags_have_namespace6HTML5TreeBuilderSmokeTest.test_svg_tags_have_namespace  sF    'yy 0	HH.....KK11111r'   c                     SnU R                  U5      nSnX2R                  R                  :X  d   eX2R                  R                  :X  d   eg )Nz<math><msqrt>5</msqrt></math>r  )r-   mathrm  msqrtrs  s       r%   test_mathml_tags_have_namespace9HTML5TreeBuilderSmokeTest.test_mathml_tags_have_namespace  sF    0yy 8	II/////JJ00000r'   c                     SnU R                  U5      n[        UR                  S   [        5      (       d   eUR                  S   S:X  d   eSUR                  S   R                  R
                  :X  d   eg )Nz3<?xml version="1.0" encoding="utf-8"?><html></html>r   z$?xml version="1.0" encoding="utf-8"?r   )r-   r=   r]   r   rN   rF   r   s      r%   $test_xml_declaration_becomes_comment>HTML5TreeBuilderSmokeTest.test_xml_declaration_becomes_comment!  sl    Fyy $--*G4444}}Q#IIIIq)66;;;;;r'   r0   N)rs   rt   ru   rv   r  r.  rn  rt  ry  r|  rz   r0   r'   r%   ri  ri    s    <
B
21<r'   ri  )9r  __license__r   	importlibr?  r)  r   bs4r   bs4.elementr   r   r   r   r	   r
   r   r   r   r   
bs4.filterr   bs4.builderr   bs4._typingr   r   bs4.builder._htmlparserr   typingr   r   r   r   r   	soupsiever   SOUP_SIEVE_PRESENTImportErrorutil	find_specHTML5LIB_PRESENT
lxml.etreelxmlLXML_PRESENTetreeLXML_VERSIONr   __annotations__r   r>   objectr   r|   r   r   ri  r0   r'   r%   <module>r     s4             $ ( # 9 - >>++J7tC L::**L
 &;k" :"c "JM;v M;`BD8 BDJW%3 W%to%2 o%d < 8  <k&    LLs$   %C0 C> 0C;:C;>
D
D