
    Mh"                     R   d Z ddlZddlZddlZddlmZ ddlmZ ddlm	Z	m
Z
mZmZmZ ddlmZ ddlmZ  G d	 d
e          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d de          Z G d d e          Z G d! d"e          Z G d# d$e          Z G d% d&e          Z g d'Z! G d( d)e          Z" G d* d+e          Z#dS ),a8  Tests for Beautiful Soup's tree traversal methods.

The tree traversal methods are the main advantage of using Beautiful
Soup over just using a parser.

Different parsers will build different Beautiful Soup trees given the
same markup, but all Beautiful Soup trees can be traversed with the
methods tested here.
    N)BeautifulSoup)builder_registry)!AttributeResemblesVariableWarningCDataCommentNavigableStringTag)SoupStrainer   )SoupTestc                   B    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
S )TestFindz&Basic tests of the find() method.
    c                 p    |                      d          }|                    d          j        dk    sJ d S )Nz <a>1</a><b>2</b><a>3</a><b>4</b>b2)soupfindstringselfr   s     S/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/bs4/tests/test_tree.pytest_find_tagzTestFind.test_find_tag"   s8    yy;<<yy~~$++++++    c                 h    |                      d          }|                    d          dk    sJ d S )Nu   <h1>Räksmörgås</h1>   Räksmörgåsr   )r   r   r   s     r   test_unicode_text_findzTestFind.test_unicode_text_find&   s9    yy122yyy00OCCCCCCr   c                     |                      d          }t          |           d|                    d          j        k    sJ d S )Nu&   <h1 id="Räksmörgås">here it is</h1>z
here it isr   id)r   strr   textr   s     r   test_unicode_attribute_findz$TestFind.test_unicode_attribute_find*   sG    yyABBD			tyyOy<<AAAAAAAr   c                 ~    |                      d          }dt          |                                          k    sJ dS )z)Test an optimization that finds all tags.<a>foo</a><b>bar</b>   Nr   lenfind_allr   s     r   test_find_everythingzTestFind.test_find_everything/   s;    yy/00C((((((((r   c                     |                      d          }dt          |                    d                    k    sJ dS )z;Test an optimization that finds all tags with a given name.z<a>foo</a><b>bar</b><a>baz</a>r&   aNr'   r   s     r   test_find_everything_with_namez'TestFind.test_find_everything_with_name4   s?    yy9::Cc**++++++++r   c                 6   |                      d          }d|                                j        k    sJ d|                    d                                          j        k    sJ d|                    d                                          j        k    sJ d S )Nz<div></div><p></p>divpr   r   namefind_previous_siblingfind_next_siblingr   s     r   test_find_with_no_argumentsz$TestFind.test_find_with_no_arguments9   s    yy-..		(((((		#<<>>CCCCCdii&&88::???????r   c                 6   |                      d          }d|                                j        k    sJ d|                    d                                          j        k    sJ d|                    d                                          j        k    sJ d S )N"text<div>text</div>text<p>text</p>r/   r0   r1   r   s     r   +test_find_with_no_arguments_only_finds_tagsz4TestFind.test_find_with_no_arguments_only_finds_tags?   s    yy=>>		(((((		#<<>>CCCCCdii&&88::???????r   c                     |                      d          }d|                    d           j        k    sJ d |                    d           k    sJ d S )Nr7   r0   c                     | j         dk    S )Nr0   r2   ts    r   <lambda>zETestFind.test_find_with_function_can_only_find_tags.<locals>.<lambda>G   s    !&#+ r   c                     | dk    S )Nr"    r<   s    r   r>   zETestFind.test_find_with_function_can_only_find_tags.<locals>.<lambda>H   s
    1f9 r   )r   r   r2   r   s     r   *test_find_with_function_can_only_find_tagsz3TestFind.test_find_with_function_can_only_find_tagsE   s_    yy=>>dii 5 566;;;;;tyy!4!455555555r   N)__name__
__module____qualname____doc__r   r   r#   r*   r-   r5   r8   rA   r@   r   r   r   r      s         , , ,D D DB B B
) ) )
, , ,
@ @ @@ @ @6 6 6 6 6r   r   c                   6    e Zd ZdZd Zd Zd Zd Zd Zd Z	dS )	TestFindAllz%Basic tests of the find_all() method.c                 p   |                      d          }dt          |j                                                  k    sJ dt          |                    d                                                    k    sJ dt          |                    d                                                    k    sJ d S )Nz/<body>text<div>text</div>text<p>text</p></body>r&   r   r0   r/   )r   r(   bodyr)   r   find_previous_siblingsfind_next_siblingsr   s     r   /test_find_all_with_no_arguments_only_finds_tagsz;TestFindAll.test_find_all_with_no_arguments_only_finds_tagsM   s    yyJKKC	**,,------C		#==??@@@@@@C		%((;;==>>>>>>>>r   c                 F   |                      d          }|                    d          dgk    sJ |                    ddg          ddgk    sJ |                    t          j        d                    g dk    sJ |                    d          g dk    sJ dS )	z'You can search the tree for text nodes.u   <html>Foo<b>bar</b>»</html>barr   Fooz.*)rO   rN      »TN)r   r)   recompiler   s     r   test_find_all_text_nodesz$TestFindAll.test_find_all_text_nodesS   s    yy9::}}E}**ug5555 }}UEN}33u~EEEE}}BJt$4$4}559O9O9OOOOO}}D}))-C-C-CCCCCCCr   c                    |                      d          }|                     |                    dd          g d           |                     |                    dd          dg           |                     |                    dd          g d	           |                     |                    dd
          g d	           dS )z7You can limit the number of items returned by find_all.z(<a>1</a><a>2</a><a>3</a><a>4</a><a>5</a>r,      limit)1r   3r   rX   
   )rX   r   rY   45r   Nr   assert_selectsr)   r   s     r   test_find_all_limitzTestFindAll.test_find_all_limit`   s    yyCDDDMM#QM77IIIDMM#QM77#???DMM#RM88:S:S:STTT 	DMM#QM779R9R9RSSSSSr   c                     |                      d          }|                      |dd          dg           |                     |                    d          dg           d S )	Nz!<a>1</a><b>2<a id='foo'>3</a></b>r,   r   rV   rX   foor   rY   )r   r^   r   r   s     r   %test_calling_a_tag_is_calling_findallz1TestFindAll.test_calling_a_tag_is_calling_findallj   sg    yy<==DDA...666DFFeF,,se44444r   c                 V   |                      d          }g }|                    |           t          j        d          5 }g |                    |          k    sJ |\  }|j        t          k    sJ t          |j                  }|dk    sJ 	 d d d            d S # 1 swxY w Y   d S )N<a></a>TrecordzLIgnoring nested list [[...]] to avoid the possibility of infinite recursion.)	r   appendwarningscatch_warningsr)   filename__file__r!   message)r   r   selfrefwwarningmsgs         r   Ttest_find_all_with_self_referential_data_structure_does_not_cause_infinite_recursionz`TestFindAll.test_find_all_with_self_referential_data_structure_does_not_cause_infinite_recursiono   s    yy##w $D111 	Qw//////IW#x////go&&Cab b b b b	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   ABB"%B"c                    |                      d          }|                    d          }t          |d          sJ |                    d          }t          |d          sJ |                    d          }t          |d          sJ dS )z%All find_all calls return a ResultSetrd   r,   sourceTra   r   N)r   r)   hasattrr   r   results      r   test_find_all_resultsetz#TestFindAll.test_find_all_resultset   s    yy##s##vx(((((t$$vx(((((e,,vx(((((((r   N)
rB   rC   rD   rE   rL   rS   r_   rb   rq   rw   r@   r   r   rG   rG   J   sz        //? ? ?D D DT T T5 5 5
  (
) 
) 
) 
) 
)r   rG   c                       e Zd Zd ZdS )TestFindAllBasicNamespacesc                     |                      d          }d|                    d          j        k    sJ d|                    ddi          j        k    sJ d S )Nz0<mathml:msqrt>4</mathml:msqrt><a svg:fill="red">r[   zmathml:msqrtr,   zsvg:fillredattrs)r   r   r   r2   r   s     r   test_find_by_namespaced_namez7TestFindAllBasicNamespaces.test_find_by_namespaced_name   sa    yyKLLdii//66666diiz5&9i::???????r   N)rB   rC   rD   r~   r@   r   r   ry   ry      s(        @ @ @ @ @r   ry   c                   V    e Zd ZdZddZd Zd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zd ZdS )TestFindAllByNamez&Test ways of finding tags by tag name.returnNc                 :    |                      d          | _        d S )Nz<a>First tag.</a>
                                  <b>Second tag.</b>
                                  <c>Third <a>Nested tag.</a> tag.</c>r   treer   s    r   setup_methodzTestFindAllByName.setup_method   s#    II J K K			r   c                 f    |                      | j                            d          ddg           d S Nr,   
First tag.Nested tag.r^   r   r)   r   s    r   test_find_all_by_tag_namez+TestFindAllByName.test_find_all_by_tag_name   s3    DI..s33lM5RSSSSSr   c                 T   |                      | j                            dd          dg           |                      | j                            dd          ddg           |                      | j                            dt          j        d                    ddg           d S )Nr,   r   r   Tr   tagr^   r   r)   rQ   rR   r   s    r   test_find_all_by_name_and_textz0TestFindAllByName.test_find_all_by_name_and_text   s    Is<88<.	
 	
 	
 	Is400<2O	
 	
 	
 	Is2:e+<+<===)	
 	
 	
 	
 	
r   c                 n    |                      | j        j                            d          dg           d S )Nr,   r   )r^   r   cr)   r   s    r   !test_find_all_on_non_root_elementz3TestFindAllByName.test_find_all_on_non_root_element   s2    DIK0055GGGGGr   c                 \    |                      |                     d          ddg           d S r   )r^   r   r   s    r   %test_calling_element_invokes_find_allz7TestFindAllByName.test_calling_element_invokes_find_all   s-    DIIcNN\=,IJJJJJr   c                     |                      | j                            t          d                    ddg           d S r   )r^   r   r)   r
   r   s    r   test_find_all_by_tag_strainerz/TestFindAllByName.test_find_all_by_tag_strainer   sF    I|C0011L-3P	
 	
 	
 	
 	
r   c                 j    |                      | j                            ddg          g d           d S )Nr,   r   r   zSecond tag.r   r   r   s    r   test_find_all_by_tag_namesz,TestFindAllByName.test_find_all_by_tag_names   sD    ISz**,X,X,X	
 	
 	
 	
 	
r   c                 l    |                      | j                            ddd          g d           d S )NT)r,   r   r   r   r   s    r   test_find_all_by_tag_dictz+TestFindAllByName.test_find_all_by_tag_dict   sH    IT5566888	
 	
 	
 	
 	
r   c                     |                      | j                            t          j        d                    g d           d S )Nz^[ab]$r   r   r   s    r   test_find_all_by_tag_rez)TestFindAllByName.test_find_all_by_tag_re   sJ    Irz(3344888	
 	
 	
 	
 	
r   c                     d }|                      d          }|                     |                    |          ddg           d S )Nc                 >    | j         |                     d          k    S Nr    )r2   getr   s    r   id_matches_namezRTestFindAllByName.test_find_all_with_tags_matching_method.<locals>.id_matches_name   s    8swwt}},,r   z<a id="a">Match 1.</a>
                            <a id="1">Does not match.</a>
                            <b id="b">Match 2.</a>zMatch 1.zMatch 2.r]   )r   r   r   s      r   'test_find_all_with_tags_matching_methodz9TestFindAllByName.test_find_all_with_tags_matching_method   sZ    	- 	- 	- yy 6 7 7 	DMM/::Z<TUUUUUr   c                 J   |                      d          }|                    dd          }|                    dt          j        d                    }|                    dddg          \  }}d|j        k    sJ d|j        k    sJ d|j        k    sJ d|j        k    sJ d S )NzH<div class='a b'>1</div><div class='a c'>2</div><div class='a d'>3</div>r/   za dza brY   rX   )r   r   rQ   rR   r)   r   )r   r   r1r2r3r4s         r   %test_find_with_multi_valued_attributez7TestFindAllByName.test_find_with_multi_valued_attribute   s    yyV
 
 YYue$$YYubj0011uuen55Bbibibibir   r   N)rB   rC   rD   rE   r   r   r   r   r   r   r   r   r   r   r   r@   r   r   r   r      s        00K K K K
T T T
 
 
H H HK K K
 
 


 
 


 
 

 
 

V 
V 
V
  
  
  
  
 r   r   c                   n    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd ZdS )TestFindAllByAttributec                     |                      d          }|                     |                    d          ddg           d S )Nz
                         <a id="first">Matching a.</a>
                         <a id="second">
                          Non-matching <b id="first">Matching b.</b>a.
                         </a>firstr   zMatching a.zMatching b.r]   r   r   s     r   test_find_all_by_attribute_namez6TestFindAllByAttribute.test_find_all_by_attribute_name   sM     yy ! " "
 	DMMWM55}7UVVVVVr   c                    d                     d          }d                     d          }|                     |          }|j        g|                    |          k    sJ |j        g|                    |                    d                    k    sJ |j        gs J |                    |dg                      d S )Nu   םולשutf8u   <a title="םולש"></a>)titlezsomething else)encoder   r,   r)   decode)r   peacedatar   s       r   %test_find_all_by_utf8_attribute_valuez<TestFindAllByAttribute.test_find_all_by_utf8_attribute_value   s    !!&)))0088yyx4==u=555555x4==u||F/C/C=DDDDDDxGGe5E-FGGGGGGGr   c                 :   |                      d          }|                     |                    d          dg           |                     |                    ddi          dg           |                     |                    dd	i          d
g           d S )Na0  
                         <a name="name1" class="class1">Name match.</a>
                         <a name="name2" class="class2">Class match.</a>
                         <a name="name3" class="class3">Non-match.</a>
                         <name1>A tag called 'name1'.</name1>
                         name1r;   zA tag called 'name1'.r2   r|   zName match.classclass2zClass match.r]   r   s     r   test_find_all_by_attribute_dictz6TestFindAllByAttribute.test_find_all_by_attribute_dict   s     yy    	DMMwM77:Q9RSSSDMM0AMBB]OTTTDMM(0CMDD~FVWWWWWr   c                    |                      d          }|                     |                    dd          dg           |                     |                    dd          dg           |                     |                    dd	          dg           |                     |                    dd          dg           |                     |                    d
          ddg           |                     |                    dd          dg           |                     |                    dd	          dg           d S )Nz
                         <a class="1">Class 1.</a>
                         <a class="2">Class 2.</a>
                         <b class="1">Class 1.</b>
                         <c class="3 4">Class 3 and 4.</c>
                         r,   rX   class_zClass 1.r   rY   zClass 3 and 4.r[   r|   r]   r   s     r   test_find_all_by_classz-TestFindAllByAttribute.test_find_all_by_class  s?   yy    	DMM#cM::ZLIIIDMM#cM::=M<NOOODMM#cM::=M<NOOO 	DMM#s33j\BBBDMMM44z:6NOOODMM#s336F5GHHHDMM#s336F5GHHHHHr   c                    |                      d          }|                    dt          j        d                    }|                     |dg           |                    dt          j        d                    }|                     |dg           |                    dt          j        d                    }|                     |dg           d S )Nz#<gar class='foo bar'>Found it</gar>garor   Found itr,   zo b)r   r)   rQ   rR   r^   )r   r   fs      r   0test_find_by_class_when_multiple_classes_presentzGTestFindAllByAttribute.test_find_by_class_when_multiple_classes_present   s    yy>??MM%
3M88A
|,,,MM%
3M88A
|,,, MM%
5(9(9M::A
|,,,,,r   c                 `   |                      d          }|                     |                    dt          j        d                    dg           d }|                     |                    d|          g            d }|                     |                    d|          dg           d S )Nz<a class='bar'>Found it</a>r,   bar   c                 (    t          |           dk    S NrU   r(   values    r   big_attribute_valueznTestFindAllByAttribute.test_find_all_with_non_dictionary_for_attrs_finds_by_class.<locals>.big_attribute_value3  s    u::>!r   c                 (    t          |           dk    S r   r   r   s    r   small_attribute_valuezpTestFindAllByAttribute.test_find_all_with_non_dictionary_for_attrs_finds_by_class.<locals>.small_attribute_value8  s    u::?"r   r   r^   r)   rQ   rR   )r   r   r   r   s       r   :test_find_all_with_non_dictionary_for_attrs_finds_by_classzQTestFindAllByAttribute.test_find_all_with_non_dictionary_for_attrs_finds_by_class.  s    yy677DMM#rz$/?/?@@:,OOO	" 	" 	" 	DMM#/BCCRHHH	# 	# 	# 	DMM#/DEE
|TTTTTr   c                    |                      d          }|                    d          \  }}||gsJ |                    dd                      |gsJ |                    dd                      |g|                    dd          k    sJ |g|                    dd          k    sJ g |                    dd          k    sJ d S )Nz*<a class="foo bar"></a><a class="foo"></a>r,   ra   rN   zfoo barr   zbar foor   r)   )r   r   r,   a2s       r   :test_find_all_with_string_for_attrs_finds_multiple_classeszQTestFindAllByAttribute.test_find_all_with_string_for_attrs_finds_multiple_classes=  s    yyEFFc""22w11c511111s--DMM#u----- sdmmC	m::::::sdmmC333333T]]3	22222222r   c                     |                      d          }t          ddi          }|                     |                    |          dg           d S )Nzi
                         <a id="first">Match.</a>
                         <a id="second">Non-match.</a>r    r   r|   zMatch.)r   r
   r^   r)   )r   r   strainers      r   'test_find_all_by_attribute_soupstrainerz>TestFindAllByAttribute.test_find_all_by_attribute_soupstrainerI  sZ    yy : ; ;  tWo666DMM(33hZ@@@@@r   c                     |                      d          }|                     |                    dd           dg           d S )N<a id="1">ID present.</a>
                            <a>No ID present.</a>
                            <a id="">ID is empty.</a>r,   r   zNo ID present.r]   r   s     r   $test_find_all_with_missing_attributez;TestFindAllByAttribute.test_find_all_with_missing_attributeQ  sN     yy 9 : : 	DMM#$M77:J9KLLLLLr   c                     |                      d          }|                     |                    d          ddg           d S )Nr   Tr   zID present.zID is empty.r]   r   s     r   $test_find_all_with_defined_attributez;TestFindAllByAttribute.test_find_all_with_defined_attributeY  sM     yy 9 : : 	DMMTM22]N4STTTTTr   c                     |                      d          }ddg}|                     |                    d          |           |                     |                    d          |           d S )Nz[<a id=1>Unquoted attribute.</a>
                            <a id="1">Quoted attribute.</a>zUnquoted attribute.zQuoted attribute.r   r   rX   r]   )r   r   expecteds      r   $test_find_all_with_numeric_attributez;TestFindAllByAttribute.test_find_all_with_numeric_attributea  sw    yy ? @ @ *+>?DMMQM//:::DMMSM118<<<<<r   c                     |                      d          }|                     |                    g d          ddg           |                     |                    g           g            d S )Nz<a id="1">1</a>
                            <a id="2">2</a>
                            <a id="3">3</a>
                            <a>No ID.</a>)rX   rY   r[   r   rX   rY   r]   r   s     r   (test_find_all_with_list_attribute_valuesz?TestFindAllByAttribute.test_find_all_with_list_attribute_valuesj  sv     yy - . . 	DMM___M==SzJJJ 	DMMRM00"55555r   c                     |                      d          }|                     |                    t          j        d                    ddg           d S )Nz<a id="a">One a.</a>
                            <a id="aa">Two as.</a>
                            <a id="ab">Mixed as and bs.</a>
                            <a id="b">One b.</a>
                            <a>No ID.</a>z^a+$r   zOne a.zTwo as.r   r   s     r   5test_find_all_with_regular_expression_attribute_valuezLTestFindAllByAttribute.test_find_all_with_regular_expression_attribute_valuev  sW     yy - . . 	DMMRZ-?-?M@@8YBWXXXXXr   c                     |                      d          }|j        }|g|                    dd          k    sJ g |                    dd          k    sJ d S )Nz<b>foo</b><b>bar</b><a>foo</a>r,   ra   r   rN   r   r,   r)   r   r   r,   s      r   'test_find_by_name_and_containing_stringz>TestFindAllByAttribute.test_find_by_name_and_containing_string  se    yy9::FsdmmCm666666T]]3u]55555555r   c                     |                      d          }|                    d          |                    dd          k    sJ d S )Nz"<a>foo</a><a><b><c>foo</c></b></a>r,   ra   r   r   r   s     r   =test_find_by_name_and_containing_string_when_string_is_buriedzTTestFindAllByAttribute.test_find_by_name_and_containing_string_when_string_is_buried  sG    yy=>>}}S!!T]]3u]%E%EEEEEEEr   c                     |                      d          }|j        }|g|                    dd          k    sJ g |                    dd          k    sJ d S )Nz"<b id="1">foo</b><a id="2">foo</a>r&   ra   )r    r   r   rN   r   r   s      r   ,test_find_by_attribute_and_containing_stringzCTestFindAllByAttribute.test_find_by_attribute_and_containing_string  se    yy=>>Fsdmmqm777777T]]a]66666666r   N)rB   rC   rD   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r@   r   r   r   r      s"       W W WH H HX X X$I I I(- - -U U U
3 
3 
3A A AM M MU U U= = =
6 
6 
6
Y 
Y 
Y6 6 6F F F7 7 7 7 7r   r   c                       e Zd ZdZd ZdS )
TestSmoothzTest Tag.smooth.c                 R   |                      d          }|j        }|                    d           |                    d           |                    t          d                     |                    t          d                     |                    d           |                                 }t          ||d          }|                    d           |                    d	           |                    |           d |j        j        u sJ d
t          |j	                  k    sJ |
                                 dt          |j	                  k    sJ d|j	        d         k    sJ d|j        j        k    sJ d|j	        d         k    sJ d|j	        d         k    sJ d S )Nz<div>a</div>r   r   z	Comment 1z	Comment 2dspanrX   r         abcr   12r   r&   )r   r/   rg   r   default_builderr	   r   r   r(   contentssmooth)r   r   r/   builderr   s        r   test_smoothzTestSmooth.test_smooth  s   yy((h

3

3

7;''(((

7;''(((

3&&((4&))CC

4 sx&&&&C%%%%%%

C%%%%%%
 Q'''' sx&&&&
 cl1o----cl1o------r   N)rB   rC   rD   rE   r   r@   r   r   r   r     s)        &. &. &. &. &.r   r   c                       e Zd ZdZd ZdS )	TestIndexzTest Tag.indexc                 6   |                      d          }|j        }t          |j                  D ] \  }}||                    |          k    sJ !t          j        t                    5  |                    d           d d d            d S # 1 swxY w Y   d S )Nah  <div>
                            <a>Identical</a>
                            <b>Not identical</b>
                            <a>Identical</a>

                            <c><d>Identical with child</d></c>
                            <b>Also not identical</b>
                            <c><d>Identical with child</d></c>
                            </div>r   )r   r/   	enumerater   indexpytestraises
ValueError)r   r   r/   ielements        r   
test_indexzTestIndex.test_index  s    yy & ' ' h#CL11 	+ 	+JAw		'*******]:&& 	 	JJqMMM	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   +BBBN)rB   rC   rD   rE   r	  r@   r   r   r   r     s)            r   r   c                   P    e Zd ZdZddZd Zd Zd Zd Zd	 Z	d
 Z
d Zd Zd ZdS )TestParentOperationsz;Test navigation and searching through an element's parents.r   Nc                 \    |                      d          | _        | j        j        | _        d S )Na<  <ul id="empty"></ul>
                                 <ul id="top">
                                  <ul id="middle">
                                   <ul id="bottom">
                                    <b id="start">Start here</b>
                                   </ul>
                                  </ul>)r   r   r   startr   s    r   r   z!TestParentOperations.setup_method  s-    II + , ,	 Y[


r   c                     | j         j        d         dk    sJ | j         j        j        d         dk    sJ | j         j        j        j        d         dk    sJ d S )Nr    bottommiddletop)r  parentr   s    r   test_parentz TestParentOperations.test_parent  sb    z &(2222z '-9999z '.t4======r   c                 N    | j         j        d         }|j        | j         k    sJ d S )Nr   )r   r   r  )r   top_tags     r   %test_parent_of_top_tag_is_soup_objectz:TestParentOperations.test_parent_of_top_tag_is_soup_object  s,    )$Q'~******r   c                 &    d | j         j        u sJ d S N)r   r  r   s    r   test_soup_object_has_no_parentz3TestParentOperations.test_soup_object_has_no_parent  s    ty'''''''r   c                 
   |                      | j                            d          g d           |                      | j                            dd          dg           | j                            d          g k    sJ d S )Nulr  r  r  r  r   r  )assert_selects_idsr  find_parentsr   s    r   test_find_parentsz&TestParentOperations.test_find_parents  s    J##D))+F+F+F	
 	
 	
 	
 7 7 7 J JXJWWWz&&'&22b888888r   c                     | j                             dd          d         dk    sJ | j                             d          J d S )Nr  r  r   r    r  )r  find_parentr   s    r   test_find_parentz%TestParentOperations.test_find_parent  sR    z%%du%55d;uDDDDz%%%1199999r   c                 `    | j                             d          }|j        j        dk    sJ d S )N
Start herer   r   )r   r   r  r2   r   r"   s     r   test_parent_of_text_elementz0TestParentOperations.test_parent_of_text_element  s3    y~~\~22{3&&&&&&r   c                 ~    | j                             d          }|                    d          d         dk    sJ d S )Nr$  r   r  r    r  )r   r   r!  r%  s     r   test_text_element_find_parentz2TestParentOperations.test_text_element_find_parent  sA    y~~\~22%%d+x777777r   c                 F    d | j         j        D             }|g dk    sJ d S )Nc                 4    g | ]}|d|j         v |d         S r   r|   .0r  s     r   
<listcomp>z>TestParentOperations.test_parent_generator.<locals>.<listcomp>  8     
 
 
!dfl&:&: 4L&:&:&:r   r  )r  parents)r   r/  s     r   test_parent_generatorz*TestParentOperations.test_parent_generator  sE    
 
*,
 
 

 555555555r   c                 F    d | j         j        D             }|g dk    sJ d S )Nc                 4    g | ]}|d|j         v |d         S r   r|   r+  s     r   r-  zGTestParentOperations.test_self_and_parent_generator.<locals>.<listcomp>  r.  r   )r  r  r  r  )r  self_and_parents)r   resultss     r   test_self_and_parent_generatorz3TestParentOperations.test_self_and_parent_generator  sE    
 
*5
 
 

 >>>>>>>>>r   r   )rB   rC   rD   rE   r   r  r  r  r  r"  r&  r(  r0  r5  r@   r   r   r  r    s        EE! ! ! !> > >
+ + +( ( (9 9 9: : :' ' '8 8 86 6 6? ? ? ? ?r   r  c                       e Zd ZddZdS )ProximityTestr   Nc                 :    |                      d          | _        d S )Nz<html id="start"><head id="headtag"></head><body id="bodytag"><b id="1">One</b><b id="2">Two</b><b id="3">Three</b></body></html>r   r   s    r   r   zProximityTest.setup_method  s!    II P
 
			r   r   rB   rC   rD   r   r@   r   r   r7  r7    s(        
 
 
 
 
 
r   r7  c                   J     e Zd Zd fdZd Zd Zd Zd Zd Zd	 Z	d
 Z
 xZS )TestNextOperationsr   Nc                 x    t          t          |                                            | j        j        | _        d S r  )superr;  r   r   r   r  r   	__class__s    r   r   zTestNextOperations.setup_method  s/     $''44666Y[


r   c                 d    | j         j        dk    sJ | j         j        j        d         dk    sJ d S )NOner    r   )r  next_elementr   s    r   	test_nextzTestNextOperations.test_next   s<    z&%////z&3D9S@@@@@@r   c                 N    | j                             d          }|j        J d S NThreer   )r   r   rB  )r   lasts     r   test_next_of_last_item_is_nonez1TestNextOperations.test_next_of_last_item_is_none$  s,    y~~W~-- (((((r   c                 "    | j         j        J d S r  )r   rB  r   s    r   test_next_of_root_is_nonez,TestNextOperations.test_next_of_root_is_none(  s    y%-----r   c                     |                      | j                            d          ddg           | j                            d           |                      | j                            d          dg           d S )Nr   TworF  rU   r   )r^   r  find_all_nextr   s    r   test_find_all_nextz%TestNextOperations.test_find_all_next,  sw    DJ44S99E7;KLLL
  A &&&DJ444::WIFFFFFr   c                     | j                             d          d         dk    sJ | j                             d          dk    sJ d S )Nr   r    r   rF  r   )r  	find_nextr   s    r   test_find_nextz!TestNextOperations.test_find_next1  sR    z##C((.#5555z##7#33w>>>>>>r   c                     | j                             d          }|                    d          j        dk    sJ |                     |                    d          ddg           d S )NrA  r   r   rL  rF  )r   r   rP  r   r^   rM  r%  s     r   test_find_next_for_text_elementz2TestNextOperations.test_find_next_for_text_element5  sf    y~~U~++~~c"")U2222D..s33eW5EFFFFFr   c                     | j                             d          }d |j        D             }|\  }}|d         dk    sJ |dk    sJ d |j        D             }|dd          |k    sJ |d	         |k    sJ d S )
NrL  r   c                     g | ]}|S r@   r@   r,  nodes     r   r-  z;TestNextOperations.test_next_generators.<locals>.<listcomp><  s    ;;;td;;;r   r    rY   rF  c                     g | ]}|S r@   r@   rV  s     r   r-  z;TestNextOperations.test_next_generators.<locals>.<listcomp>B  s    EEEtEEEr   r   r   )r   r   next_elementsself_and_next_elements)r   r  
successorsr   r   successors2s         r   test_next_generatorsz'TestNextOperations.test_next_generators:  s    	e,,;;u':;;;
"X4yC7""""EE(DEEE122*,,,,1~&&&&&&r   r   )rB   rC   rD   r   rC  rH  rJ  rN  rQ  rS  r]  __classcell__r?  s   @r   r;  r;    s        ! ! ! ! ! !A A A) ) ). . .G G G
? ? ?G G G

' 
' 
' 
' 
' 
' 
'r   r;  c                   J     e Zd Zd fdZd Zd Zd Zd Zd Zd	 Z	d
 Z
 xZS )TestPreviousOperationsr   Nc                     t          t          |                                            | j                            d          | _        d S rE  )r=  ra  r   r   r   endr>  s    r   r   z#TestPreviousOperations.setup_methodH  s;    $d++88:::9>>>11r   c                 d    | j         j        d         dk    sJ | j         j        j        dk    sJ d S )Nr    rY   rL  )rc  previous_elementr   s    r   test_previousz$TestPreviousOperations.test_previousL  s<    x(.#5555x(9UBBBBBBr   c                 L    | j                             d          }|j        J d S )Nhtml)r   r   re  )r   r   s     r   #test_previous_of_first_item_is_nonez:TestPreviousOperations.test_previous_of_first_item_is_noneP  s*    	v&&%-----r   c                 "    | j         j        J d S r  )r   re  r   s    r   test_previous_of_root_is_nonez4TestPreviousOperations.test_previous_of_root_is_noneT  s    y)11111r   c                     |                      | j                            d          g d           |                      | j                            d          dg           d S )Nr   rF  rL  rA  r   r   rA  )r^   rc  find_all_previousr   s    r   test_find_all_previousz-TestPreviousOperations.test_find_all_previousX  sb     	DH66s;;=T=T=TUUUDH66!6<<ugFFFFFr   c                     | j                             d          d         dk    sJ | j                             d          dk    sJ d S )Nr   r    rY   rA  r   )rc  find_previousr   s    r   test_find_previousz)TestPreviousOperations.test_find_previous_  sR    x%%c**40C7777x%%U%33u<<<<<<r   c                     | j                             d          }|                    d          j        dk    sJ |                     |                    d          g d           d S )NrF  r   r   rm  )r   r   rq  r   r^   rn  r%  s     r   #test_find_previous_for_text_elementz:TestPreviousOperations.test_find_previous_for_text_elementc  sj    y~~W~--!!#&&-8888D223779P9P9PQQQQQr   c                     | j                             dd          }|                     |j        g d           |                     |j        g d           d S )Nr   rA  r   )bodytagheadtagr  )rX   rv  rw  r  )r   r   r  previous_elementsself_and_previous_elements)r   r  s     r   test_previous_generatorsz/TestPreviousOperations.test_previous_generatorsh  s_    	s511 79X9X9XYYY @BfBfBfgggggr   r   )rB   rC   rD   r   rf  ri  rk  ro  rr  rt  rz  r^  r_  s   @r   ra  ra  G  s        2 2 2 2 2 2C C C. . .2 2 2G G G= = =R R R
h h h h h h hr   ra  c                       e Zd ZddZdS )SiblingTestr   Nc                     d}t          j        d                              d|          }|                     |          | _        d S )Na  <html>
                    <span id="1">
                     <span id="1.1"></span>
                    </span>
                    <span id="2">
                     <span id="2.1"></span>
                    </span>
                    <span id="3">
                     <span id="3.1"></span>
                    </span>
                    <span id="4"></span>
                    </html>z\n\s* )rQ   rR   subr   r   )r   markups     r   r   zSiblingTest.setup_methodo  sA     H%%))"f55IIf%%			r   r   r9  r@   r   r   r|  r|  n  s(        & & & & & &r   r|  c                   J     e Zd Zd fdZd Zd Zd Zd Zd Zd	 Z	d
 Z
 xZS )TestNextSiblingr   Nc                     t          t          |                                            | j                            d          | _        d S )NrX   r   )r=  r  r   r   r   r  r>  s    r   r   zTestNextSibling.setup_method  s:    ot$$11333Y^^s^++


r   c                 "    | j         j        J d S r  )r   next_siblingr   s    r   !test_next_sibling_of_root_is_nonez1TestNextSibling.test_next_sibling_of_root_is_none  s    y%-----r   c                     | j         j        d         dk    sJ | j         j        j        d         dk    sJ | j         j        d         dk    sJ d S )Nr    r   rY   1.1)r  r  rB  r   s    r   test_next_siblingz!TestNextSibling.test_next_sibling  s^    z&t,3333z&3D9S@@@@ z&t,555555r   c                     | j         j        j        J | j                             d          }|j        J | j                             d          }|j        J d S )Nr  r   r[   )r   rh  r  r   )r   nested_span	last_spans      r   test_next_sibling_may_not_existz/TestNextSibling.test_next_sibling_may_not_exist  sc    y~*222innn..'///INNcN**	%-----r   c                 R    | j                             d          d         dk    sJ d S )Nr   r    r   )r  r4   r   s    r   test_find_next_siblingz&TestNextSibling.test_find_next_sibling  s.    z++F33D9S@@@@@@r   c                     |                      | j                            d          g d           |                      | j                            d          dg           d S )Nr   r   rY   r[   rY   r   )r  r  rK   r   s    r   test_next_siblingsz"TestNextSibling.test_next_siblings  s]    
 = =f E EWWW
 = = = E EuMMMMMr   c                     |                      | j        j        g d           |                      | j        j        g d           d S )Nr  )rX   r   rY   r[   )r  r  next_siblingsself_and_next_siblingsr   s    r   test_next_siblings_generatorsz-TestNextSibling.test_next_siblings_generators  sI    
 8///JJJ
 ACWCWCWXXXXXr   c                 `   |                      d          }|                    d          }|j        j        dk    sJ |j        j        dk    sJ |                     |                    d          dg           |                    d          dk    sJ |                    d          J d S )NFoo<b>bar</b>bazrO   r   r   bazrN   nonesuch)r   r   r  r2   r^   rK   r4   r   r   r  s      r   "test_next_sibling_for_text_elementz2TestNextSibling.test_next_sibling_for_text_element  s    yy+,,			''!&#----!.%7777E44S99E7CCC&&e&44====&&j&99AAAAAr   r   )rB   rC   rD   r   r  r  r  r  r  r  r  r^  r_  s   @r   r  r    s        , , , , , ,. . .6 6 6. . .A A AN N N
Y Y YB B B B B B Br   r  c                   J     e Zd Zd fdZd Zd Zd Zd Zd Zd	 Z	d
 Z
 xZS )TestPreviousSiblingr   Nc                     t          t          |                                            | j                            d          | _        d S )Nr[   r   )r=  r  r   r   r   rc  r>  s    r   r   z TestPreviousSibling.setup_method  s;    !4((557779>>S>))r   c                 "    | j         j        J d S r  )r   previous_siblingr   s    r   %test_previous_sibling_of_root_is_nonez9TestPreviousSibling.test_previous_sibling_of_root_is_none  s    y)11111r   c                     | j         j        d         dk    sJ | j         j        j        d         dk    sJ | j         j        d         dk    sJ d S )Nr    rY   r   z3.1)rc  r  re  r   s    r   test_previous_siblingz)TestPreviousSibling.test_previous_sibling  s^    x(.#5555x(9$?3FFFF x(.%777777r   c                     | j         j        j        J | j                             d          }|j        J | j                             d          }|j        J d S )Nr  r   rX   )r   rh  r  r   )r   r  
first_spans      r   #test_previous_sibling_may_not_existz7TestPreviousSibling.test_previous_sibling_may_not_exist  sc    y~.666innn..+333Y^^s^++
*22222r   c                 R    | j                             d          d         dk    sJ d S )Nr   r    rY   )rc  r3   r   s    r   test_find_previous_siblingz.TestPreviousSibling.test_find_previous_sibling  s.    x--f55d;sBBBBBBr   c                     |                      | j                            d          g d           |                      | j                            d          dg           d S )Nr   rY   r   rX   rX   r   )r  rc  rJ   r   s    r   test_previous_siblingsz*TestPreviousSibling.test_previous_siblings  sf    H++F33___	
 	
 	
 	 ? ?3 ? G G#OOOOOr   c                     |                      | j        j        g d           |                      | j        j        g d           d S )Nr  )r[   rY   r   rX   )r  rc  previous_siblingsself_and_previous_siblingsr   s    r   !test_previous_siblings_generatorsz5TestPreviousSibling.test_previous_siblings_generators  sI     :OOOLLL CEYEYEYZZZZZr   c                 `   |                      d          }|                    d          }|j        j        dk    sJ |j        j        dk    sJ |                     |                    d          dg           |                    d          dk    sJ |                    d          J d S )Nr  r  r   r   rO   rN   r  )r   r   r  r2   r^   rJ   r3   r  s      r   &test_previous_sibling_for_text_elementz:TestPreviousSibling.test_previous_sibling_for_text_element  s    yy+,,			''%*c1111%6%????E88==wGGG**%*88EAAAA****==EEEEEr   r   )rB   rC   rD   r   r  r  r  r  r  r  r  r^  r_  s   @r   r  r    s        * * * * * *2 2 28 8 83 3 3C C CP P P[ [ [F F F F F F Fr   r  c                   .   e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zej                            dd d g          d             Zej                            dd dgd dgf          d              Zd! Zd" Zd# Z d$ Z!d% Z"d& Z#d' Z$d( Z%d) Z&d* Z'd+ Z(d, Z)d- Z*d. Z+d/ Z,d0 Z-d1 Z.d2 Z/d3 Z0d4 Z1d5 Z2d6 Z3d7 Z4ej                            d8g d9          d:             Z5d; Z6d< Z7d= Z8d> Z9d? Z:d@S )ATestTreeModificationc                 v   |                      d          }d|j        d<   |                                |                     d          k    sJ |j        d= |                                |                     d          k    sJ d|j        d<   |                                |                     d          k    sJ d S )	Nz<a id="1"></a>r&   r    z<a id="2"></a>rd   ra   id2z<a id2="foo"></a>)r   r,   r   document_forr   s     r   test_attribute_modificationz0TestTreeModification.test_attribute_modification  s    yy)**t{{}} 1 12B C CCCCCF4L{{}} 1 1) < <<<<<u{{}} 1 12E F FFFFFFFr   c                 d    t          j        d                      }|                     d|          }t          ||d          }t          ||d          }d|d<   |j                            d|           |j                            d	|           |j                                        d
k    sJ d S )Nrh  z<body></body>r   r,   olzhttp://foo.com/hrefr   r   s4   <body><a href="http://foo.com/"></a><ol></ol></body>)r   lookupr   r	   rI   insertr   )r   r   r   r,   r  s        r   test_new_tag_creationz*TestTreeModification.test_new_tag_creation  s    1")&1133yy'y::gs##w%%%&		A	BIFG G G G G Gr   c                 >   d}|                      |          }|                    d          }|j        }|                    d                              |j                   |j        |k    sJ |                                |                     d          k    sJ d S )NzT<p id="1">Don't leave me <b>here</b>.</p>
                <p id="2">Don't leave!</p>r   r   zD<p id="1">Don't leave me .</p>
<p id="2">Don't leave!<b>here</b></p>)r   r   r   rg   r  r   r  )r   docr   second_parabolds        r   !test_append_to_contents_moves_tagz6TestTreeModification.test_append_to_contents_moves_tag  s    /yy~~ii3i''v 			S	  ((( {k)))){{}} 1 1X!
 !
 
 
 
 
 
 
r   c                 d   |                      d          }|                    d          }|                    |                    d                    }|j        dk    sJ |                    d|                    d                    \  }|j        dk    sJ |                    d          }|dk    sJ |                    dd          }|ddgk    sJ |                    d	d
          }|d	d
gk    sJ |                    ddg          }|ddgk    sJ |	                                dk    sJ d S )Nz<html></html>rh  headr   r   r\   rY   r[   67893456789)
r   r   rg   new_tagr2   r  insert_beforeinsert_afterextendget_text)	r   r   rh  r  r   text5text34text67text89s	            r   &test_insertion_returns_inserted_thingsz;TestTreeModification.test_insertion_returns_inserted_things
  sE   yy))yy  {{4<<//00yF""""++ag!6!677zW$$$$S!!||||$$S#..#s######C--#s####sCj))#s####~~9,,,,,,r   c                     d}|                      |          }|j        }|                    |j                  }||k    sJ d S )Nz<a></a><b><c></c></b>)r   r,   replace_withr   r   r"   r   r,   new_as        r   1test_replace_with_returns_thing_that_was_replacedzFTestTreeModification.test_replace_with_returns_thing_that_was_replaced  sA    &yyFtv&&Ezzzzzzr   c                 z    d}|                      |          }|j        }|                                }||k    sJ d S )N<a><b></b><c></c></a>)r   r,   unwrapr  s        r   +test_unwrap_returns_thing_that_was_replacedz@TestTreeModification.test_unwrap_returns_thing_that_was_replaced$  s;    &yyF

Ezzzzzzr   c                    |                      d          }|j        }|                                 d |j        u sJ t	          j        t                    5  |                                 d d d            n# 1 swxY w Y   t	          j        t                    5  |                    |j	                   d d d            d S # 1 swxY w Y   d S )Nz<a><b>Foo</b></a><c>Bar</c>)
r   r,   extractr  r  r  r  r  r  r   r   s      r   Itest_replace_with_and_unwrap_give_useful_exception_when_tag_has_no_parentz^TestTreeModification.test_replace_with_and_unwrap_give_useful_exception_when_tag_has_no_parent+  s5   yy677F			qx]:&& 	 	HHJJJ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	]:&& 	# 	#NN46"""	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s$   A66A:=A:CC	Cc                     d}|                      |          }|j        }|j                            |          }||k    sJ |                                |                     |          k    sJ d S )Nz-<a><b></b><c>Foo<d></d></c></a><a><e></e></a>)r   r   r  r   r  )r   r"   r   r   rv   s        r   test_replace_tag_with_itselfz1TestTreeModification.test_replace_tag_with_itself5  sl    >yyF$$Q''{{{{{{}} 1 1$ 7 7777777r   c                     d}|                      |          }t          j        t                    5  |j                            |j                   d d d            d S # 1 swxY w Y   d S N<a><b></b></a>)r   r  r  r  r   r  r,   r   r"   r   s      r   1test_replace_tag_with_its_parent_raises_exceptionzFTestTreeModification.test_replace_tag_with_its_parent_raises_exception=  s    yy]:&& 	( 	(F'''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s    AA"%A"c                     d}|                      |          }t          j        t                    5  |j                            d|j                   d d d            d S # 1 swxY w Y   d S )Nr  r   )r   r  r  r  r,   r  r  s      r   ,test_insert_tag_into_itself_raises_exceptionzATestTreeModification.test_insert_tag_into_itself_raises_exceptionC  s    yy]:&& 	% 	%FMM!TV$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%s   !AA#&A#c                    |                      d          }|                    d|                    dd          |                    dd                    \  }}d|j        k    sJ d|j        k    sJ t	          |j                  \  }}}}d|j        k    sJ d|j        k    sJ d|j        k    sJ d|j        k    sJ d S )	N-<p>And now, a word:</p><p>And we're back.</p>r   r0   p2r   p3And now, a word:And we're back.)r   r  r  r   listchildren)r   r   r  r  p1p4s         r   test_insert_multiple_elementsz2TestTreeModification.test_insert_multiple_elementsI  s    yyHIIQS > >SY]@^@^__Bry    ry    dm,,BB!RY....ry    ry     BI------r   c                    |                      d          }d}|                      |          }|                    d|          \  }}d|j        k    sJ d|j        k    sJ |j        D ]}t	          |t
                    rJ t          |j                  \  }}}}d|j        k    sJ d|j        k    sJ d|j        k    sJ d|j        k    sJ dS )	zInserting one BeautifulSoup object into another actually inserts all
        of its children -- you'll never combine BeautifulSoup objects.
        r  z<p>p2</p><p>p3</p>r   r  r  r  r  N)r   r  r   descendants
isinstancer   r  r  )	r   r   r"   	to_insertr  r  r  r  r  s	            r   1test_insert_beautifulsoup_object_inserts_childrenzFTestTreeModification.test_insert_beautifulsoup_object_inserts_childrenU  s     yyHII#IIdOO	Q	**Bry    ry    ! 	4 	4A!!]333333dm,,BB!RY....ry    ry     BI------r   c                     |                      d          }|j        }|                    dd           |j        \  }}|                    d           |                    d           d|j        j        k    sJ d S )Nz<p><a>one</a><b>three</b></p>r   twor~  three)r   r,   r  r   r  r   r   )r   r   r,   leftrights        r   3test_replace_with_maintains_next_element_throughoutzHTestTreeModification.test_replace_with_maintains_next_element_throughoutj  s    yy899F	E je"2 $&-''''''r   c                 &   |                      d          }|                    d                              d           |                    d          }|j        }|j        |k    sJ |j        |k    sJ |j        j        |k    sJ |j        J d S )Nz<b>Argh!</b>Argh!r   Hooray!)r   r   r  r   re  r  rB  )r   r   new_textr   s       r   test_replace_final_nodez,TestTreeModification.test_replace_final_nodex  s    yy((			!!..y99999I9..F(A----!####(5AAAA$,,,,,r   c                    |                      d          }|j                            dd           |                                |                     d          k    sJ |                    d          }|j        dk    sJ |j        j        |k    sJ |j        dk    sJ |j        j	        |k    sJ |j	        J |j        |j
        k    sJ d S )Nz<a><b>Argh!</b><c></c></a>r   r  z!<a><b>Argh!Hooray!</b><c></c></a>r   r  )r   r   r  r   r  r   re  rB  r  r  r   )r   r   r  s      r   test_consecutive_text_nodesz0TestTreeModification.test_consecutive_text_nodes  s     yy566a###{{}} 1 12U V VVVVV99I9..(G3333(5AAAA(G3333(5AAAA$,,,$......r   c                     |                      d          }|j                            dd           |j                            dd           ddg|j        j        k    sJ |j        j        d         j        dk    sJ d S )Nrd   r   rN   ra   )r   r,   r  r   rB  r   s     r   test_insert_stringz'TestTreeModification.test_insert_string  s{    yy##aau~0000vq!.%777777r   c                     |                      d          }|j                            d          }|dk    sJ |j                                        dk    sJ d S )Nz<b>1</b>r   z	<b>12</b>)r   r   rg   r   ru   s      r   test_appendz TestTreeModification.test_append  sT    yy$$s##}}}}v}}+------r   c                    |                                  }|                     d|          }t          ||d          }|                    dd           |j                            d|           |                                |                     d          k    sJ |j        }|j        |k    sJ |j	        |k    sJ |
                    d	          }|j        |k    sJ |j        |k    sJ |j        }|j        |k    sJ |j	        |k    sJ |
                    d	          }|j        |k    sJ |j        |k    sJ |j        |k    sJ d S )
Nz%<a><b>Find</b><c>lady!</c><d></d></a>r  magictagr   ther   z=<a><b>Find</b><magictag>the</magictag><c>lady!</c><d></d></a>Findr   )r   r   r	   r  r,   r   r  r   r  r  r   rB  re  r   r  )r   r   r   	magic_tagb_tagr   c_tagr  s           r   test_insert_tagz$TestTreeModification.test_insert_tag  s   &&((yy@'yRRgz22	E"""a###{{}} 1 1K!
 !
 
 
 
 

 !Y....)U2222zzz(( I----)T1111%....%2222nnEn**zY&&&&5((((%,,,,,,r   c                     d}|                      |          }|j                            d|j                   ||                                k    sJ d S )Nz<a>b<c></c>d</a>r   )r   r,   r  r   r   r   r   r   s      r   %test_insert_into_the_current_locationz:TestTreeModification.test_insert_into_the_current_location  sM    !yya   t{{}}$$$$$$r   c                     d}|                      |          }|j                            |j                   ||                                k    sJ d S r  )r   r,   rg   r   r   r  s      r   *test_append_child_thats_already_at_the_endz?TestTreeModification.test_append_child_thats_already_at_the_end  sK    yydft{{}}$$$$$$r   c                     d}|                      |          }|j        |j        |j        |j        |j        |j        g}|j                            |           d|	                                k    sJ d S )Nz1<a><b><c><d><e><f><g></g></f></e></d></c></b></a>z1<a><g></g><f></f><e></e><d></d><c></c><b></b></a>)
r   gr   er   r   r   r,   r  r   r   r   r   elementss       r   #test_extend_with_a_list_of_elementsz8TestTreeModification.test_extend_with_a_list_of_elements  sg    ByyFDFDFDFDFDFChBdkkmmSSSSSSr   c                     d}|                      |          }ddt          d          dg}|j                            |           d|                                k    sJ d S )Nrd   r   r   r   r  z<a>bcde</a>)r   r   r,   r  r   r  s       r   "test_extend_with_a_list_of_stringsz7TestTreeModification.test_extend_with_a_list_of_strings  s_    yyoc22C8h------r   get_tagsc                     | S r  r@   r   s    r   r>   zTestTreeModification.<lambda>  s    c r   c                     | j         S r  )r   r   s    r   r>   zTestTreeModification.<lambda>  s    s| r   c                 8   d}|                      |          }|                    dd          }|                    dd          } ||          }|                    |           d|                                k    sJ d|                                k    sJ d S )NzS<body><div id="d1"><a>1</a><a>2</a><a>3</a><a>4</a></div><div id="d2"></div></body>r/   d1r   d2z<div id="d1"></div>z3<div id="d2"><a>1</a><a>2</a><a>3</a><a>4</a></div>)r   r   r  r   )r   r!  r   r   r%  r&  tagss          r   &test_extend_with_another_tags_contentsz;TestTreeModification.test_extend_with_another_tags_contents  s    dyyYYuY&&YYuY&&x||
		$$		3333D		SSSSSSr   zstring_source,resultc                     | j         j        S r  )r,   r   r   s    r   r>   zTestTreeModification.<lambda>  s
    $&- r   z<a></a><b>1</b>c                     dS )Nabcder@   r*  s    r   r>   zTestTreeModification.<lambda>  s    ' r   z<a>1</a><b>abcde</b>c                 ~   d}|                      |          }t          j        d          5 } ||          }|j                            |           |j                                        |k    sJ |\  }|j        t          k    sJ t          |j
                  }|dk    sJ 	 d d d            d S # 1 swxY w Y   d S )Nz<div><a>1</a><b></b></div>Tre   zIA single non-Tag item was passed into Tag.extend. Use Tag.append instead.)r   rh   ri   r   r  r/   decode_contentsrj   rk   r!   rl   )	r   string_sourcerv   r   r   rn   r   ro   rp   s	            r   )test_extend_with_a_single_non_tag_elementz>TestTreeModification.test_extend_with_a_single_non_tag_element  s    ,yy$D111 
	Q"]4((FFMM&!!!8++--7777IW#x////go&&C^_ _ _ _ _
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	 
	s   A7B22B69B6c                     d}|                      |          }|j                            d|j                   d|                                k    sJ d S )Nz<a><b></b><c></c><d></d></a>r   z<a><d></d><b></b><c></c></a>)r   r,   r  r   r   r  s      r   $test_move_tag_to_beginning_of_parentz9TestTreeModification.test_move_tag_to_beginning_of_parent  sM    -yya   ->>>>>>r   c                     |                      d          }|j                            dd           t          |j                  dk    sJ d S )Nz<br/>r   Contentsz<br>Contents</br>)r   brr  r!   r   s     r   &test_insert_works_on_empty_element_tagz;TestTreeModification.test_insert_works_on_empty_element_tag  sK    
 yy!!q*%%%47||2222222r   c                 \   |                      d          }|j                            d           |j                            d           |                                |                     d          k    sJ |j                            |j                   |                                |                     d          k    sJ |j        }t          j        t                    5  |                    |           d d d            n# 1 swxY w Y   |	                                 t          j        t                    5  |                    d           d d d            n# 1 swxY w Y   |                      d          }|j                            |
                    d                     d S )	Nr%   BAZQUUXzQUUX<a>foo</a>BAZ<b>bar</b>QUUX<b>bar</b><a>foo</a>BAZnope<a>r,   )r   r   r  r,   r   r  r  r  r  r  r  r   r   r   s      r   test_insert_beforez'TestTreeModification.test_insert_before  s   yy/00U###V$$${{}} 1 12O P PPPPPTV$$${{}} 1 12O P PPPPP F]:&& 	 	OOA	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
		]:&& 	$ 	$OOF###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ yyT\\#../////$   #DD	D	=EE#&E#c                    |                      d          }|j                            ddd           |j                            ddd           |                                |                     d          k    sJ |j                            |j        d           |                                |                     d          k    sJ d S )Nr%   r8   r9  z$QUUX BAZ<a>foo</a>BAZ QUUX<b>bar</b>FOOz'QUUX BAZ<b>bar</b>FOO<a>foo</a>BAZ QUUX)r   r   r  r,   r   r  r   s     r   test_insert_multiple_beforez0TestTreeModification.test_insert_multiple_before$  s    yy/00UC000VS%000{{}} 1 12!
 !
 
 
 
 
 	TVU+++{{}} 1 15!
 !
 
 
 
 
 
 
r   c                 \   |                      d          }|j                            d           |j                            d           |                                |                     d          k    sJ |j                            |j                   |                                |                     d          k    sJ |j        }t          j        t                    5  |                    |           d d d            n# 1 swxY w Y   |	                                 t          j        t                    5  |                    d           d d d            n# 1 swxY w Y   |                      d          }|j        
                    |                    d                     d S )	Nr%   r8  r9  z<a>foo</a>QUUX<b>bar</b>BAZr:  r;  r<  r,   )r   r   r  r,   r   r  r  r  r  r  r  r  r=  s      r   test_insert_afterz&TestTreeModification.test_insert_after1  s   yy/00E"""F###{{}} 1 12O P PPPPPDF###{{}} 1 12O P PPPPP F]:&& 	 	NN1	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	
		]:&& 	# 	#NN6"""	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# yyT\\#../////r?  c                    |                      d          }|j                            ddd           |j                            ddd           |                                |                     d          k    sJ |j                            |j        d           |                                |                     d          k    sJ d S )Nr%   r8  rA  r9  z$<a>foo</a>QUUX BAZ<b>bar</b>BAZ QUUXzFOO z(QUUX BAZ<b>bar</b><a>foo</a>FOO BAZ QUUX)r   r   r  r,   r   r  r   s     r   test_insert_multiple_afterz/TestTreeModification.test_insert_multiple_afterI  s    yy/00E3///FC///{{}} 1 12!
 !
 
 
 
 
 	DFF+++{{}} 1 16!
 !
 
 
 
 
 
 
r   c                 *   |                      d          }|                    d          }|                    d          }t          j        t
                    5  |                    |           d d d            n# 1 swxY w Y   t          j        t                    5  |                    |           d d d            n# 1 swxY w Y   t          j        t
                    5  |                    |           d d d            d S # 1 swxY w Y   d S Nr~  r,   )r   r  
new_stringr  r  r  r  NotImplementedErrorr   r   r   r   s       r   :test_insert_after_raises_exception_if_after_has_no_meaningzOTestTreeModification.test_insert_after_raises_exception_if_after_has_no_meaningU  s   yy}}ll3$$]:&& 	% 	%$$$	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	% 	%].// 	# 	#c"""	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#]:&& 	" 	"S!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"6   A;;A?A?CCC%DDDc                 *   |                      d          }|                    d          }|                    d          }t          j        t
                    5  |                    |           d d d            n# 1 swxY w Y   t          j        t                    5  |                    |           d d d            n# 1 swxY w Y   t          j        t
                    5  |                    |           d d d            d S # 1 swxY w Y   d S rI  )r   r  rJ  r  r  r  r  rK  rL  s       r   Ftest_insert_before_raises_notimplementederror_if_before_has_no_meaningz[TestTreeModification.test_insert_before_raises_notimplementederror_if_before_has_no_meaning`  s   yy}}ll3$$]:&& 	& 	&  %%%	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&].// 	$ 	$s###	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$ 	$]:&& 	# 	#c"""	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#rN  c                 N   |                      d          }|                    d          \  }}|                    |           |                                |                     d          k    sJ |j        J |j        |j        k    sJ |j        dk    sJ |j        dk    sJ d S )Nz;<p>There's <b>no</b> business like <b>show</b> business</p>r   z0<p>There's  business like <b>no</b> business</p>noz	 business)	r   r)   r  r   r  r  r0   rB  r  )r   r   rR  shows       r   test_replace_withz&TestTreeModification.test_replace_withk  s    yyVWW==%%D"{{}} 1 1>!
 !
 
 
 
 
 {"""yDF""""$&&&&+------r   c                    t          d          }t          j        t                    5  |                    d           d d d            n# 1 swxY w Y   |                     d          j        }t          j        t                    5  |j                            |           d d d            n# 1 swxY w Y   t          j        t                    5  |j                            d|d           d d d            d S # 1 swxY w Y   d S )Nr,   r;   z
won't workr  string1string2)r	   r  r  r  r  r   r,   r   )r   a_tags     r   test_replace_with_errorsz-TestTreeModification.test_replace_with_errorsx  s   ]:&& 	- 	-|,,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 		*++-]:&& 	( 	(G  '''	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( ]:&& 	> 	>G  E9===	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	>s5   AAA
B11B58B5C??DDc                    d}|                      |          }|                    d          }d|_        |                    d          }|                    d          }d}|j                            ||||           |                                dk    sJ |j        j        |k    sJ |j        j        |k    sJ |j        j        |k    sJ |j        j        |k    sJ d S )Nr  r   zText In D Tagr  r   zRandom Textz;<a><b></b><d>Text In D Tag</d><e></e>Random Text<f></f></a>)r   r  r   r   r  r   r   rB  )r   r   r   d_tage_tagf_taga_strings          r   test_replace_with_multiplez/TestTreeModification.test_replace_with_multiple  s    &yyS!!&S!!S!! E5(E:::KKMMLM M M M v"e++++|(E1111!(H4444!.%777777r   c                     d}|                      |          }|j                            |j                   d|                                k    sJ d S )Nr  z<a><c></c></a>)r   r   r  r   r   r  s      r   test_replace_first_childz-TestTreeModification.test_replace_first_child  M    &yyDF###4;;==000000r   c                     d}|                      |          }|j                            |j                   d|                                k    sJ d S )Nr  r  )r   r   r  r   r   r  s      r   test_replace_last_childz,TestTreeModification.test_replace_last_child  rb  r   c                 r   |                      d          }|j        }|j        }|                    |           |                                |                     d          k    sJ |j        J |                    d          j        J |j	        J |j
        J |j        J |j        |j        k    sJ |j	        dk    sJ |j        j        |j        k    sJ |j
        J |                    d          }|j        }|j        |k    sJ |j
        |k    sJ |j	        |k    sJ |j        |k    sJ d S )NzQ<a>We<b>reserve<c>the</c><d>right</d></b></a><e>to<f>refuse</f><g>service</g></e>z-<a>We<f>refuse</f></a><e>to<g>service</g></e>r  r   Weto)r   r   r   r  r   r  r  r   rB  re  r  r  r,   r  r  )r   r   
remove_tagmove_tagto_textg_tags         r   test_nested_tag_replace_withz1TestTreeModification.test_nested_tag_replace_with  s   yyc
 
 V
6))){{}} 1 1;!
 !
 
 
 
 

  (((g..;CCC*222&...*222 $&(((((D0000$1TV;;;;$,,, ))4)((#u,,,,#u,,,,%0000%000000r   c                     |                      d          }|j                                         |j        J |j        j        dk    sJ d S )NzI
            <p>Unneeded <em>formatting</em> is unneeded</p>
            zUnneeded formatting is unneeded)r   emr  r0   r"   r   s     r   test_unwrapz TestTreeModification.test_unwrap  sU    yy    	wv{???????r   c                    |                      d          }|j                            |                    d                    }|                                dk    sJ |                                |                     d          k    sJ d S )NzI wish I was bold.r   <b>I wish I was bold.</b>)r   r   wrapr  r   r  )r   r   r   s      r   	test_wrapzTestTreeModification.test_wrap  s}    yy-..  c!2!233||~~!<<<<<{{}} 1 12M N NNNNNNNr   c                     |                      d          }|j        j                            |j                   |                                |                     d          k    sJ d S )Nz<b></b>I wish I was bold.rq  )r   r   r  rr  r   r  r   s     r   %test_wrap_extracts_tag_from_elsewherez:TestTreeModification.test_wrap_extracts_tag_from_elsewhere  s]    yy455  ((({{}} 1 12M N NNNNNNNr   c                    |                      d          }|j        j                            |j                   dt	          |j        j                  k    sJ |                                |                     d          k    sJ d S )Nz+<b>I like being bold.</b>I wish I was bold.r&   z+<b>I like being bold.I wish I was bold.</b>)r   r   r  rr  r(   r   r   r  r   s     r   &test_wrap_puts_new_contents_at_the_endz;TestTreeModification.test_wrap_puts_new_contents_at_the_end  s    yyFGG  (((C(((((({{}} 1 19!
 !
 
 
 
 
 
 
r   c                 d   |                      d          }t          |j        j                  dk    sJ |                    d                                          }|                                dk    sJ |                                dk    sJ t          |j        j                  dk    sJ |j        J |j        J |j	        j	        J |                    d	          }|                    d
	          }|j	        |k    sJ |j
        |k    sJ |j        |k    sJ |j        |k    sJ d S )NzR<html><body>Some content. <div id="nav">Nav crap</div> More content.</body></html>rU   navr   z6<html><body>Some content.  More content.</body></html>z<div id="nav">Nav crap</div>r&   zSome content. r   z More content.)r   r(   rI   r   r   r  r   r  re  rB  r  r  )r   r   	extracted	content_1	content_2s        r   test_extractz!TestTreeModification.test_extract  s_   yy`
 
 49%&&!++++III''//11	{{}} XXXXX!!%CCCCC 49%&&!++++''')111%2::: II%5I66	II%5I66	%2222%2222)Y6666)Y666666r   c                    |                      d          }|j        j        }|                    d          }|                    d          }|j                            |           |j                            |           |                                 |                                 ||j        j        k    sJ ||j        j        k    sJ d S )Nr%   ra   rN   )r   r,   r   rJ  rg   r   r  )r   r   foo_1foo_2bar_2s        r   4test_extract_distinguishes_between_identical_stringszITestTreeModification.test_extract_distinguishes_between_identical_strings  s    yy/00&&&&ee
 	%%%%%%%%%%r   c                     |                      d          fd                    d          D              dt          j                  k    sJ d S )Nzv
<html>
<head>
<script>foo</script>
</head>
<body>
 <script>bar</script>
 <a></a>
</body>
<script>baz</script>
</html>c                 B    g | ]}j                                         S r@   )scriptr  )r,  r  r   s     r   r-  zKTestTreeModification.test_extract_multiples_of_same_tag.<locals>.<listcomp>  s'    @@@1				@@@r   r  z<body>

<a></a>
</body>)r   r)   r!   rI   r   s    @r   "test_extract_multiples_of_same_tagz7TestTreeModification.test_extract_multiples_of_same_tag  sc    yy 
 
 
 	A@@@h(?(?@@@@+s49~~======r   c                     |                      d          }|                    d                                           d |                    d          u sJ d S )Nz<html>
<body>hi</body>
</html>rI   )r   r   r  r   s     r   Btest_extract_works_when_element_is_surrounded_by_identical_stringszWTestTreeModification.test_extract_works_when_element_is_surrounded_by_identical_strings  sU    yyABB		&!!###tyy((((((((r   c                 @   |                      d          }|j        }|j                                         t	          |j        j                  dk    sJ t          |d          sJ |j        }|                    d           dt	          |j                  k    sJ dS )zTag.clear()z4<p><a>String <em>Italicized</em></a> and another</p>r   r   T)	decomposeN)r   r,   r0   clearr(   r   rt   rn  )r   r   r,   rn  s       r   
test_clearzTestTreeModification.test_clear"  s    yyOPPF46?##q((((q*%%%%% T	$C$$$$$$$$r   zmethod_name,expected_result))r  9<div><em>child1</em><p id="start"></p><p>child3</p></div>)r  zH<div><em>child1</em><p id="start"><a>Second <em>child</em></a></p></div>)rY  r  )r  r  )rx  r~  )r  zF<div><p id="start"><a>Second <em>child</em></a></p><p>child3</p></div>)r/  r~  c                     |                      d          }t          |j        |          }|D ]}|                                 ||                                k    sJ d S )NzU<div><em>child1</em><p id='start'><a>Second <em>child</em></a></p><p>child3</p></div>)r   getattrr0   r  r   )r   method_nameexpected_resultr   iteratorr  s         r   test_extract_during_iterationz2TestTreeModification.test_extract_during_iteration0  sj    : yyc
 
 46;// 	 	AIIKKKK$++--//////r   c                    |                      d          }|                    d          \  }}|j        }|j        j        }||||fD ]}d|j        u sJ |                                 |||fD ]}d|j        u sJ d|j        u sJ d S )Nz;<p><a>String <em>Italicized</em></a></p><p>Another para</p>r0   FT)r   r)   r,   rn  r   
decomposedr  )r   r   r  r  r,   r"   r  s          r   test_decomposez#TestTreeModification.test_decomposeU  s    yyVWWs##BDu|b!T" 	) 	)AAL((((( 	a 	( 	(A1<'''''%%%%%%r   c                     |                      d          }|j        }|j        j        }d|j        u sJ |                                 d|j        u sJ d|                                k    sJ d S )Nz'<div><p>String 1</p><p>String 2</p></p>FTz!<div><p></p><p>String 2</p></div>)r   r/   r0   r   r  r  r   )r   r   r/   r"   s       r   test_decompose_stringz*TestTreeModification.test_decompose_stringe  sy    yyBCChu|''''t&&&&2cjjllBBBBBBr   c                     |                      d          }d|j        _        |j        j        dgk    sJ d|j        _        |j        j        dgk    sJ dS )zTag.string = 'string'z<a></a> <b><c></c></b>ra   rN   N)r   r,   r   r   r   r   s     r   test_string_setz$TestTreeModification.test_string_setn  sZ    yy122v5'))))v5'))))))r   c                     |                      d          }|j        j        |j        _        |j                                        dk    sJ d S )Nz<a><b>foo</b><c>bar</c>s   <a><b>bar</b><c>bar</c></a>)r   r   r   r   r,   r   r   s     r   /test_string_set_does_not_affect_original_stringzDTestTreeModification.test_string_set_does_not_affect_original_stringv  sC    yy233v}}"@@@@@@@r   c                     |                      d          }t          d          }||j        _        t	          |j        j        t                    sJ d S )Nrd   ra   )r   r   r,   r   r  )r   r   cdatas      r   )test_set_string_preserves_class_of_stringz>TestTreeModification.test_set_string_preserves_class_of_string{  sG    yy##e$&-///////r   N);rB   rC   rD   r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r	  r  r  r  r  r  r   r  markparametrizer(  r0  r2  r6  r>  rC  rE  rG  rM  rP  rT  rY  r_  ra  rd  rl  ro  rs  ru  rw  r}  r  r  r  r  r  r  r  r  r  r  r@   r   r   r  r    s       G G G
 
 

 
 
"- - -&    # # #8 8 8( ( (% % %
. 
. 
.. . .*( ( (- - -/ / /&8 8 8. . .- - -:% % %% % %T T T. . . [Z//;S;S)TUUT T VUT [''):;!!#9:	
   ? ? ?3 3 30 0 02
 
 
0 0 00

 

 

	" 	" 	"	# 	# 	#. . .> > >8 8 8$1 1 11 1 1#1 #1 #1J@ @ @O O OO O O

 
 
7 7 72& & & > > >) ) )
% % % [%	
 	
 	
 2
0 
03 2
0& & & C C C* * *A A A
0 0 0 0 0r   r  )r   r)   r!  r  rP  rM  rq  rn  r4   rK   r3   rJ   c                   V    e Zd Zej                            de          d             ZdS )TestDeprecatedArgumentsr  c                 4   |                      d          }t          |j        |          }t          j        d          5 } |d           |\  }|j        t          k    sJ t          |j                  }|dk    sJ 	 d d d            d S # 1 swxY w Y   d S )N<a>some</a><b>markup</b>Tre   r  )r"   zOThe 'text' argument to find()-type methods is deprecated. Use 'string' instead.)	r   r  r   rh   ri   rj   rk   r!   rl   r   r  r   methodrn   ro   rp   s          r   test_find_type_method_stringz4TestDeprecatedArguments.test_find_type_method_string  s    yy344--$D111 	QF!!!!IW#x////go&&Cde e e e e	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s    ?BBBN)rB   rC   rD   r  r  r  all_find_type_methodsr  r@   r   r   r  r    sB        [],ABB  CB  r   r  c                   V    e Zd Zej                            de          d             ZdS )TestWarningsr  c                 h   |                      d          }t          |j        |          }t          j        d          5 } |d           |\  }|j        t          k    sJ t          |j        t                    sJ t          |j                  }d|v sJ 	 d d d            d S # 1 swxY w Y   d S )Nr  Tre   u)_classzN'_class' is an unusual attribute name and is a common misspelling for 'class_')r   r  r   rh   ri   rj   rk   r  rl   r   r!   r  s          r   test_suspicious_syntax_warningz+TestWarnings.test_suspicious_syntax_warning  s   yy344--$D111 		QF#IW#x////go/PQQQQQgo&&C`    		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		s    AB''B+.B+N)rB   rC   rD   r  r  r  r  r  r@   r   r   r  r    sB        [],ABB  CB  r   r  )$rE   r  rQ   rh   bs4r   bs4.builderr   bs4.elementr   r   r   r   r	   
bs4.filterr
   r~  r   r   rG   ry   r   r   r   r   r  r7  r;  ra  r|  r  r  r  r  r  r  r@   r   r   <module>r     s     				        ( ( ( ( ( (              $ # # # # #     
*6 *6 *6 *6 *6x *6 *6 *6XC) C) C) C) C)( C) C) C)L@ @ @ @ @ @ @ @M  M  M  M  M  M  M  M `k7 k7 k7 k7 k7X k7 k7 k7\). ). ). ). ). ). ). ).X       (<? <? <? <? <?8 <? <? <?~
 
 
 
 
H 
 
 
)' )' )' )' )' )' )' )'X$h $h $h $h $h] $h $h $hN& & & & &( & & &(,B ,B ,B ,B ,Bk ,B ,B ,B^.F .F .F .F .F+ .F .F .Fb]
0 ]
0 ]
0 ]
0 ]
08 ]
0 ]
0 ]
0@        h        8     r   