
    <e                        d Z ddlZddlZddlZ G d dej        j                  Z G d de          Z G d de          Z	 G d	 d
ej
                  Z G d de          Z G d de          Zedk    r ej                     dS dS )zTests for HTMLParser.py.    Nc                   V    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S )EventCollectorc                 t    g | _         | j         j        | _        t          j        j        j        | g|R i | d S N)eventsappendhtmlparser
HTMLParser__init__)selfargskws      +/usr/lib/python3.11/test/test_htmlparser.pyr   zEventCollector.__init__
   sA    k(':t:::r:::::    c                     g }d }| j         D ]N}|d         }||cxk    rdk    r n nd|d         d         |d         z   f|d<   n|                    |           |}O|| _         |S )Nr   data   )r   r   )r   Lprevtypeeventtypes        r   
get_eventszEventCollector.get_events   s     [ 	 	E8Dx))))6)))))2qE!H!45"HHr   c                 6    |                      d||f           d S )Nstarttagr   r   tagattrss      r   handle_starttagzEventCollector.handle_starttag    s!    Ze,-----r   c                 6    |                      d||f           d S )Nstartendtagr   r   s      r   handle_startendtagz!EventCollector.handle_startendtag#   s!    ]C/00000r   c                 4    |                      d|f           d S )Nendtagr   )r   r   s     r   handle_endtagzEventCollector.handle_endtag&   s    XsO$$$$$r   c                 4    |                      d|f           d S )Ncommentr   r   r   s     r   handle_commentzEventCollector.handle_comment+       Y%&&&&&r   c                 4    |                      d|f           d S )Ncharrefr   r*   s     r   handle_charrefzEventCollector.handle_charref.   r,   r   c                 4    |                      d|f           d S )Nr   r   r*   s     r   handle_datazEventCollector.handle_data1       VTN#####r   c                 4    |                      d|f           d S )Ndeclr   r*   s     r   handle_declzEventCollector.handle_decl4   r2   r   c                 4    |                      d|f           d S )N	entityrefr   r*   s     r   handle_entityrefzEventCollector.handle_entityref7   s    [$'(((((r   c                 4    |                      d|f           d S )Npir   r*   s     r   	handle_pizEventCollector.handle_pi:   s    T4L!!!!!r   c                 4    |                      d|f           d S )Nunknown declr   )r   r4   s     r   unknown_declzEventCollector.unknown_decl=   s    ^T*+++++r   N)__name__
__module____qualname__r   r   r!   r$   r'   r+   r/   r1   r5   r8   r;   r>    r   r   r   r      s        ; ; ;
  ". . .1 1 1% % %
' ' '' ' '$ $ $$ $ $) ) )" " ", , , , ,r   r   c                       e Zd Zd ZdS )EventCollectorExtrac                     t                               | ||           |                     d|                                 f           d S )Nstarttag_text)r   r!   r   get_starttag_textr   s      r   r!   z#EventCollectorExtra.handle_starttagC   sC    &&tS%888_d&<&<&>&>?@@@@@r   N)r?   r@   rA   r!   rB   r   r   rD   rD   A   s(        A A A A Ar   rD   c                       e Zd Zd Zd ZdS )EventCollectorCharrefsc                 0    |                      d           d S Nz6This should never be called with convert_charrefs=Truefailr*   s     r   r/   z%EventCollectorCharrefs.handle_charrefJ       		JKKKKKr   c                 0    |                      d           d S rK   rL   r*   s     r   r8   z'EventCollectorCharrefs.handle_entityrefM   rN   r   N)r?   r@   rA   r/   r8   rB   r   r   rI   rI   H   s:        L L LL L L L Lr   rI   c                   "    e Zd Zd ZddZd ZdS )TestCaseBasec                 "    t          d          S NFconvert_charrefs)r   r   s    r   get_collectorzTestCaseBase.get_collectorS   s    u5555r   Nc                 t   ||                                  }|}|D ]}|                    |           |                                 |                                }||k    rW|                     dt          |          z   dz   t          j        |          z   dz   t          j        |          z              d S d S )Nz6received events did not match expected events
Source:
z
Expected:
z
Received:
)rW   feedcloser   rM   reprpprintpformat)r   sourceexpected_events	collectorr
   sr   s          r   
_run_checkzTestCaseBase._run_checkV   s    **,,I 	 	AKKNNNN""$$_$$II $&*6ll3%&(.(G(GH && )/v(>(>? @ @ @ @ @ %$r   c                 P    |                      ||t          d                     d S rS   )rb   rD   )r   r^   r   s      r   _run_check_extrazTestCaseBase._run_check_extrad   s9    +UCCC	E 	E 	E 	E 	Er   r   )r?   r@   rA   rW   rb   rd   rB   r   r   rQ   rQ   Q   sO        6 6 6@ @ @ @E E E E Er   rQ   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d Zd Zd Zd Zd Zd Zd ZdS )HTMLParserTestCasec                 b    |                      ddg           |                      ddg           d S )Nz<?processing instruction>)r:   zprocessing instructionz<?processing instruction ?>)r:   zprocessing instruction ?rb   rV   s    r    test_processing_instruction_onlyz3HTMLParserTestCase.test_processing_instruction_onlyk   sP    3,6 	 	 	 	5.8 	 	 	 	 	r   c                 d    |                      ddddddg fddddddd	d
dgfdddddddg           d S )Nz
<!DOCTYPE html PUBLIC 'foo'>
<HTML>&entity;&#32;
<!--comment1a
-></foo><bar>&lt;<?pi?></foo<bar
comment1b-->
<Img sRc='Bar' isMAP>sample
text
&#x201C;
<!--comment2a-- --comment2b-->
</Html>
)r   
)r4   zDOCTYPE html PUBLIC 'foo'r   r	   )r7   entity)r.   32)r)   z4comment1a
-></foo><bar>&lt;<?pi?></foo<bar
comment1bimg)srcBar)ismapN)r   zsample
text
)r.   x201C)r)   zcomment2a-- --comment2br&   r	   rh   rV   s    r   test_simple_htmlz#HTMLParserTestCase.test_simple_htmls   st      )I9:*#	 	 	 	 	r   c                 x    |                      dddg fddg           |                      dgddg fddg           d S )	Nz<p>&#bad;</p>r   p)r   z&#bad;r&   rv   z<div>&#bad;</div>divr&   rx   rh   rV   s    r   test_malformatted_charrefz,HTMLParserTestCase.test_malformatted_charref   sl    b!*
 	 	 	 	,-#0
 	 	 	 	 	r   c                 6    |                      dddg           d S )Nz&entityref foo)r7   r7   )r   z foorh   rV   s    r   test_unclosed_entityrefz*HTMLParserTestCase.test_unclosed_entityref   s0    (&+ 	 	 	 	 	r   c                 F    |                      dddg fddg fddg           d S )Nz<a><b></a></b>r   abr&   r~   r&   r   rh   rV   s    r   test_bad_nestingz#HTMLParserTestCase.test_bad_nesting   sF     	(b!b!	+ 	 	 	 	 	r   c                 4    |                      ddg           d S )N#this text & contains & ampersands &)r   r   rh   rV   s    r   test_bare_ampersandsz'HTMLParserTestCase.test_bare_ampersands   s.    =;@ 	 	 	 	 	r   c                 4    |                      ddg           d S )N.this < text > contains < bare>pointy< brackets)r   r   rh   rV   s    r   test_bare_pointy_bracketsz,HTMLParserTestCase.test_bare_pointy_brackets   s.    HFK 	 	 	 	 	r   c                 r    |                      ddddgfg           |                      ddddgfg           d S )N	<a b='<'>r   r~   r   <	<a b='>'>r   >rh   rV   s    r   test_starttag_end_boundaryz-HTMLParserTestCase.test_starttag_end_boundary   sH    :sZL*I)JKKK:sZL*I)JKKKKKr   c                 t   dddgfg}|                      dg|           |                      ddg|           |                      ddg|           |                      d	d
g|           |                      ddg|           |                      ddg|           dddgfg}|                      dg|           |                      ddg|           |                      ddg|           |                      d	dg|           |                      ddg|           |                      ddg|           dg}|                      ddg|           |                      ddg|           |                      ddg|           |                      ddg|           |                      dd g|           |                      d!d"g|           |                      d#d$g|           |                      d%d&g|           |                      d'd(g|           |                      d)dg|           |                      ddg|           d S )*Nr   r~   r   r   z<a zb='<'>z<a bz='<'>z<a b=z'<'>z<a b='<z'>z<a b='<'r   r   r   zb='>'>z='>'>z'>'>z<a b='>z<a b='>')r)   abc z
<!--abc-->r   z	!--abc--><!z--abc-->z<!-z-abc-->z<!--zabc-->z<!--azbc-->z<!--abzc-->z<!--abcz-->z<!--abc-z->z	<!--abc--rh   r   outputs     r   test_buffer_artefactsz(HTMLParserTestCase.test_buffer_artefacts   sk   sZL12v...)6222)6222&)6222D)6222S)6222sZL12v...)6222)6222&)6222D)6222S)6222$%\*F333k*F333z*F333	*F333*F333'*F3336*F333E*F333T*F333c*F333r*F33333r   c                 V    g d}|D ]!}|                      d|z  dd|z   fg           "d S )N)
HTMLzOHTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"z[HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"zbhtml PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"zfhtml PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"zYmath PUBLIC "-//W3C//DTD MathML 2.0//EN" "http://www.w3.org/Math/DTD/mathml2/mathml2.dtd"zhtml PUBLIC "-//W3C//DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1//EN" "http://www.w3.org/2002/04/xhtml-math-svg/xhtml-math-svg.dtd"zWsvg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"z'html PUBLIC "-//IETF//DTD HTML 2.0//EN"z,html PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"z<!DOCTYPE %s>r4   zDOCTYPE rh   )r   dtdsdtds      r   test_valid_doctypesz&HTMLParserTestCase.test_valid_doctypes   sc    @ @ @$  	: 	:COOOc1$j3&678: : : :	: 	:r   c                     |                      dddg fg           |                      dddg fdg           |                      dddg fddd	gfdg           d S )
Nz<p/>r#   rv   z<p></p>r   rw   z<p><img src='foo' /></p>rn   )ro   foorh   rV   s    r   test_startendtagz#HTMLParserTestCase.test_startendtag   s    C$! 	 	 	 		b!$ 	 	 	 	2b!EN#345 	 	 	 	 	r   c                 H    d}|                      |ddddgfd|fg           d S )Nz <foo:bar   
   one="1"	two=2   >r   zfoo:bar)one1)two2rF   )rd   )r   ra   s     r   test_get_starttag_textz)HTMLParserTestCase.test_get_starttag_text  sG    4a\<$@Aa "" 	# 	# 	# 	# 	#r   c           	          g d}g d}|D ]R}|D ]M}|                                 }d                    ||          }|                     |d|g fd|fd|fg           NSd S )N)z*<!-- not a comment --> &not-an-entity-ref;z<not a='start tag'>z<a href="" /> <p> <span></span>zfoo = "</scr" + "ipt>";zfoo = "</SCRIPT" + ">";zfoo = <
/script> z*<!-- document.write("</scr" + "ipt>"); -->z
//<![CDATA[
document.write('<s'+'cript type="text/javascript" src="http://www.example.org/r='+new Date().getTime()+'"><\/s'+'cript>');
//]]>z 
<!-- //
var foo = 3.14;
// -->
zfoo = "</sty" + "le>";u   <!-- ☃ -->)scriptstyleSCRIPTSTYLEScriptStylez <{element}>{content}</{element}>elementcontentr   r   r&   )lowerformatrb   )r   contentselementsr   r   element_lowerra   s          r   test_cdata_contentz%HTMLParserTestCase.test_cdata_content	  s    
 
 
( MLL 	@ 	@G# @ @ '6==gGN > P PZ$C%+W$5%-}$=$? @ @ @ @	@	@ 	@r   c                     G d dt                     }d}dD ]k}|                                                                }d                    ||          }|                     |d|g fd|fd	|fg |d
                     ld S )Nc                       e Zd Zd ZdS )BHTMLParserTestCase.test_cdata_with_closing_tags.<locals>.Collectorc                     | j         S r   )r   rV   s    r   r   zMHTMLParserTestCase.test_cdata_with_closing_tags.<locals>.Collector.get_events.  s
    {"r   N)r?   r@   rA   r   rB   r   r   	Collectorr   -  s#        # # # # #r   r   z<!-- not a comment --> &not-an-entity-ref;
                  <a href="" /> </p><p> <span></span></style>
                  '</script' + '>')z scriptzscript z script z
scriptzscript
z
script
z<script>{content}</{element}>r   r   r   r&   FrT   r`   )r   r   stripr   rb   )r   r   r   r   r   ra   s         r   test_cdata_with_closing_tagsz/HTMLParserTestCase.test_cdata_with_closing_tags(  s    
	# 	# 	# 	# 	# 	# 	# 	#&> 	I 	IG#MMOO1133M/66w?F 7 H HAOOA]B ?!' 1!)= 9 ; '0i&G&G&G  I I I I	I 	Ir   c                 >    d}g d}|                      ||           d S )Nz<!-- I'm a valid comment --><!--me too!--><!------><!----><!----I have many hyphens----><!-- I have a > in the middle --><!-- and I have -- in the middle! -->))r)   z I'm a valid comment )r)   zme too!)r)   z--r)   r   )r)   z--I have many hyphens--)r)   z I have a > in the middle )r)   z and I have -- in the middle! rh   r   r	   expecteds      r   test_commentsz HTMLParserTestCase.test_comments>  s9    8C C C 	h'''''r   c                 >    d}g d}|                      ||           d S )Nzs<!--[if IE & !(lte IE 8)]>aren't<![endif]--><!--[if IE 8]>condcoms<![endif]--><!--[if lte IE 7]>pretty?<![endif]-->))r)   z%[if IE & !(lte IE 8)]>aren't<![endif])r)   z[if IE 8]>condcoms<![endif])r)   z[if lte IE 7]>pretty?<![endif]rh   r   s      r   test_condcomsz HTMLParserTestCase.test_condcomsO  s9    8C C C 	h'''''r   c           
         d }|                       |            j                   g d}dddgfddg}|D ]5}|                     d                    |          | |            	           6d
ddg dfd
dd
g}|D ]5}|                     d                    |          | |            	           6|D ]d}d                    |gdz            }d
ddg fd|fdd
ddg fd|fdd
g	}|                     d                    ||          | |            	           ed}t          dt          |                    D ]5}|                     |d |         d|d |         fg |            	           6|                     ddg |            	           d S )Nc                      t                      S r   )rI   rB   r   r   <lambda>z:HTMLParserTestCase.test_convert_charrefs.<locals>.<lambda>Z  s    244 r   )z&quot;z&#34;z&#x22;z&quotz&#34z&#x22r   r~   )hrefzfoo"zar)r   za"zr   z<a href="foo{0}zar">a{0}z</a>r   )r   "))xr   )yz"X)zzX"z*{0}<a x="{0}" y="{0}X" z="X{0}">{0}</a>{0}X   r   r   )r&   r   r   )r&   r   z/{1}<script>{0}</script>{1}<style>{0}</style>{1}z&quo &# &#xr   no charrefs here)r   r   )
assertTruerU   rb   r   joinrangelen)r   r`   charrefsr   r.   textr	   r   s           r   test_convert_charrefsz(HTMLParserTestCase.test_convert_charrefsX  sG   44			4555JJJ':&;<#_6 	= 	=GOO;BB7KK$		  = = = = "&L&L&LM!?MC   	= 	=GOO ))/$		  = = = =   		= 		=G88WIaK((D%#Xr2VTN,m#Wb1FD>+]	<H
 OO 44:F44I4I$		  = = = = q#d))$$ 	3 	3AOOD!HRaR'9&:&/ikk  3 3 3 3 	*-I,J"+)++ 	 	/ 	/ 	/ 	/ 	/r   c                 T    |                      ddddgfdddddd	gfd
dddg	           d S )NzF<html <html>te>>xt&a<<bc</a></html>
<img src="URL><//img></html</html>r   r	   )z<htmlN)r   zte>>xt)r7   r~   )r   r   zbc<)r~   Nrs   )r   z
<img src="URL>)r)   z/img)r&   zhtml<rh   rV   s    r   test_tolerant_parsingz(HTMLParserTestCase.test_tolerant_parsing  sZ     ='/1BC..)'>.8//	?1
	2 
	2 
	2 
	2 
	2r   c                 6   |                      dg            |                      ddg           |                      ddg           |                      ddg           |                      dd	d
g fg           |                      ddg           |                      ddg           |                      ddg           |                      ddg           |                      ddg           |                      ddg           |                      ddg           |                      dd	dg fg           |                      dd	dg fg           |                      dddg fg           |                      dd	dg fg           |                      d ddg fg           d S )!Nz</>z</$>)r)   $</)r   r   </a)r   r   z<a<a>r   a<az</a<a>)r&   r   r   )r   r   <a)r   r   <a foo='bar')r   r   <a foo='bar)r   r   
<a foo='>')r   r   	<a foo='>)r   r   z<a$>za$z<a$b>za$bz<a$b/>r#   z<a$b  >z<a$b  />rh   rV   s    r   test_starttag_junk_charsz+HTMLParserTestCase.test_starttag_junk_chars  s   r"""!1 2333~.///0111:ub"9!:;;;#4"5666~.///~.///)A(BCCC(?'@AAA'=&>???&;%<===*dB!7 8999:ub"9!:;;;M5"#=">???	Z$;#<===
mUB%?$@AAAAAr   c           
      <   |                      ddddgfg           d}ddg dfg}|                      ||           d}ddg d	fd
dg d	fg}|                      ||           d}d
dg fd
dg fd
dg fd
dg fddg fddg fddg fddg fg}|                      ||           d S )Nz<a foo="var"/>r#   r~   )r   varzj<img width=902 height=250px src="/sites/default/files/images/homepage/foo.jpg" /*what am I doing here*/ />rn   ))width902)height250px)ro   z,/sites/default/files/images/homepage/foo.jpg)z*whatN)amN)iN)doingN)zhere*Nz9<a / /foo/ / /=/ / /bar/ / /><a / /foo/ / /=/ / /bar/ / >))r   N)=N)barNr   zD<meta><meta / ><meta // ><meta / / ><meta/><meta /><meta //><meta//>metarh   r   s      r   test_slashes_in_starttagz+HTMLParserTestCase.test_slashes_in_starttag  s#   (M3@P+Q*RSSS. 5/ / /
  	h'''/ C!L!L!LMIIIJ
 	h'''3 $z62&>$z62&>FB'-)DFB'-)D	
 	h'''''r   c                 4    |                      ddg           d S )Nz<!DOCTYPE foo $ >)r4   zDOCTYPE foo $ rh   rV   s    r   test_declaration_junk_charsz.HTMLParserTestCase.test_declaration_junk_chars  s!    +.H-IJJJJJr   c                 4    |                      ddg           d S )Nz"<!spacer type="block" height="25">)r)   zspacer type="block" height="25"rh   rV   s    r   test_illegal_declarationsz,HTMLParserTestCase.test_illegal_declarations  s0    <GH	J 	J 	J 	J 	Jr   c                 |    d}ddg fdddg fdddg fdddg fdddg fdddg fddg fg}|                      ||           d S )Nzn<br></label</p><br></div end tmAd-leaderBoard><br></<h4><br></li class="unit"><br></li
						</ul><br></><br>r   br)r&   zlabel<ry   )r)   z<h4)r&   lirh   r   s      r   test_invalid_end_tagsz(HTMLParserTestCase.test_invalid_end_tags  s    Mr*(r*%r*&r*$r*$r*r*#,$ 	h'''''r   c                 H    d}ddg fdddg}|                      ||           d S )Nz(<b>This</b attr=">"> confuses the parserr   r   )r   Thisr   )r   z"> confuses the parserrh   r   s      r   test_broken_invalid_end_tagz.HTMLParserTestCase.test_broken_invalid_end_tag  s?    
 :b)$#68 	h'''''r   c                     d}dddgfddg fddddgfd	d
dddg fdddg fddddg}|                      ||           d}ddg dfddg fddddgfd	d
g}|                      ||           d S )Nz[<div style=""    ><b>The <a href="some_url">rain</a> <br /> in <span>Spain</span></b></div>r   rx   r   r   r   )r   zThe r~   )r   some_url)r   rainr   r    r#   r   )r   z in span)r   Spainr&   r  r   ry   z><div style="", foo = "bar" ><b>The <a href="some_url">rain</a>)r   ,N)r   r   rh   r   s      r   $test_correct_detection_of_start_tagsz7HTMLParserTestCase.test_correct_detection_of_start_tags  s    9 0b!345D"%$
  	h'''O L L LMb!345
 	h'''''r   c                 j    ddgfddgfdg dfddd	gfg}|D ]\  }}|                      ||           d S )
Na&)r   r	  za&b)r   abza&b )r   r~   r7   r   r   za&b;r  r  rh   )r   r   r	   r   s       r   test_EOF_in_charrefz&HTMLParserTestCase.test_EOF_in_charref  st     N#$^$%GGGHm%789	
 # 	, 	,ND(OOD(++++	, 	,r   c                 >    d}g d}|                      ||           d S )Nz<! not really a comment ><! not a comment either --><! -- close enough --><!><!<-- this was an empty comment><!!! another bogus comment !!!>))r)   z not really a comment )r)   z not a comment either --)r)   z -- close enough --r   )r)   z<-- this was an empty comment)r)   z!! another bogus comment !!!rh   r   s      r   test_broken_commentsz'HTMLParserTestCase.test_broken_comments  s6    2

 
 
 	h'''''r   c                 z    d}dddddddgfdd	dd
dgfddddg fdddddd
dgfdg}|                      ||           d S )Nz<![if !(IE)]>broken condcom<![endif]><![if ! IE]><link href="favicon.tiff"/><![endif]><![if !IE 6]><img src="firefox.png" /><![endif]><![if !ie 6]><b>foo</b><![endif]><![if (!IE)|(lt IE 9)]><img src="mammoth.bmp" /><![endif]>)r=   zif !(IE))r   zbroken condcom)r=   endif)r=   zif ! IEr#   link)r   zfavicon.tiff)r=   zif !IE 6rn   )ro   zfirefox.png)r=   zif !ie 6r   r   )r   r   r   )r=   zif (!IE)|(lt IE 9))ro   zmammoth.bmprh   r   s      r   test_broken_condcomsz'HTMLParserTestCase.test_broken_condcoms,  s    M )&%'F%=$>?%(E$:#;<%(b!%2E$:#;<%#
& 	h'''''r   c                     t          d          }|                    d           |                     |                                dddg fddd	g           d S )
NTrT   zfoo <a>link</a> bar &amp; baz)r   zfoo r   r~   )r   r  r   )r   z
 bar & baz)r   rY   assertEqualr   )r   r
   s     r   "test_convert_charrefs_dropped_textz5HTMLParserTestCase.test_convert_charrefs_dropped_textM  sr      6663444
C46F46	
 	
 	
 	
 	
r   N) r?   r@   rA   ri   rt   rz   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  rB   r   r   rf   rf   i   s           @    	 	 	  
  
L L L4 4 4<: : :0  # # #@ @ @>I I I,( ( ("( ( (%/ %/ %/R2 2 2B B B&( ( (>K K KJ J J( ( (4
( 
( 
(( ( (B, , ,( ( ( ( ( (B

 

 

 

 

r   rf   c                   t    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S )AttributesTestCasec                     ddg dfg}|                      d|           |                      d|           |                      d|           |                      d|           d S )Nr   r~   ))r   v)cr  )dr  )eNz<a b='v' c="v" d=v e>z<a  b = 'v' c = "v" d = v e>z<a
b
=
'v'
c
=
"v"
d
=
v
e>z<a	b	=	'v'	c	=	"v"	d	=	v	e>rh   r   s     r   test_attr_syntaxz#AttributesTestCase.test_attr_syntax\  sv    sMMM
N
 	3V<<<:FCCCCVLLLCVLLLLLr   c                     |                      dddg dfg           |                      dddddgfg           |                      ddd	d
gfg           |                      ddddgfg           d S )Nz'<a b='xxx
	xxx' c="yyy	
yyy" d='	xyz
'>r   r~   ))r   zxxx
	xxx)r  zyyy	
yyy)r  z	xyz
z<a b='' c="">)r   r   )r  r   z<e a=rgb(1,2,3)>r  )r~   z
rgb(1,2,3)z<a href=mailto:xyz@example.com>)r   zmailto:xyz@example.comrh   rV   s    r   test_attr_valuesz#AttributesTestCase.test_attr_valuese  s    K$c ,> ,> ,> ? @	A 	A 	A 	+$cIy+ABC	E 	E 	E 	*$c,?+@AB	D 	D 	D 	-# BCDE	G 	G 	G 	G 	Gr   c                     |                      dddddgfg           |                      ddddd	gfg           |                      d
dddd	gfg           d S )Nu!   <img src=/foo/bar.png alt=中文>r   rn   )ro   z/foo/bar.png)altu   中文u+   <a title='テスト' href='テスト.html'>r~   )titleu	   テスト)r   u   テスト.htmlu+   <a title="テスト" href="テスト.html">rh   rV   s    r   test_attr_nonasciiz%AttributesTestCase.test_attr_nonasciit  s    5%"9"9"; < =	> 	> 	> 	K# ? C E F G	H 	H 	H 	K# ? C E F G	H 	H 	H 	H 	Hr   c                 <    |                      ddddgfg           d S )Nz!<a b='&amp;&gt;&lt;&quot;&apos;'>r   r~   )r   z&><"'rh   rV   s    r   test_attr_entity_replacementz/AttributesTestCase.test_attr_entity_replacement  s5    /#012	4 	4 	4 	4 	4r   c                 >    |                      dddg dfg           d S )Nz<a a.b='v' c:d=v e-f=v>r   r~   ))za.br  )zc:dr  )ze-fr  rh   rV   s    r   test_attr_funky_namesz(AttributesTestCase.test_attr_funky_names  s>    %#IIIJK	M 	M 	M 	M 	Mr   c                 <    |                      ddddgfg           d S )Nz0<html foo='&euro;&amp;&#97;&#x61;&unsupported;'>r   r	   )r   u   €&aa&unsupported;rh   rV   s    r   test_entityrefs_in_attributesz0AttributesTestCase.test_entityrefs_in_attributes  s;    >&#D"EFG	I 	I 	I 	I 	Ir   c                 P    |                      ddddgfdddgfdddgfg           d S )	Nz<a $><b $=%><c \=/>r   r~   )r   Nr   )r   %r  )\/rh   rV   s    r   test_attr_funky_names2z)AttributesTestCase.test_attr_funky_names2  sN    "#}-#
|,#}-/	0 	0 	0 	0 	0r   c                     dD ]\}|                      d|z  dddgfg           |                      d|z  dddgfg           |                      d|z  dddgfg           ]d S )N)&z&amp;z&#38;z&#x26;z<a href="%s">r   r~   )r   r1  z<a href='%s'>z<a href=%s>rh   )r   rl   s     r    test_entities_in_attribute_valuez3AttributesTestCase.test_entities_in_attribute_value  s    7 	B 	BFOOOf4(#?@B B BOOOf4(#?@B B BOOMF2(#?@B B B B	B 	Br   c                 r    d}dddgfdddddgfddddd	gfd
ddddgfddg}|                      ||           d S )Nz<a href=test'style='color:red;bad1'>test - bad1</a><a href=test'+style='color:red;ba2'>test - bad2</a><a href=test'&nbsp;style='color:red;bad3'>test - bad3</a><a href = test'&nbsp;style='color:red;bad4'  >test - bad4</a>r   r~   )r   ztest'style='color:red;bad1')r   ztest - bad1r   )r   ztest'+style='color:red;ba2')r   ztest - bad2)r   u   test' style='color:red;bad3')r   ztest - bad3)r   u   test' style='color:red;bad4')r   ztest - bad4rh   r   s      r   test_malformed_attributesz,AttributesTestCase.test_malformed_attributes  s~    L 	 FGH#_FGH#_JKL#_JKL#_	
 	h'''''r   c                     |                      dddg fddddgfdg           |                      d	ddg fdddd
gfdg           d S )Nz<x><y z=""o"" /></x>r   r   r#   r   )r   r   )zo""N)r&   r   z<x><y z="""" /></x>)z""Nrh   rV   s    r   "test_malformed_adjacent_attributesz5AttributesTestCase.test_malformed_adjacent_attributes  s    .$c2.*C)]1KL+-	. 	. 	. 	-$c2.*C)\1JK+-	. 	. 	. 	. 	.r   c                 v    |                      dddddgfg           |                      dddddgfg           d S )	Nz<a width="100%"cellspacing=0>r   r~   r   z100%cellspacing0z<a id="foo"class="bar">)idr   classr   rh   rV   s    r   test_adjacent_attributesz+AttributesTestCase.test_adjacent_attributes  st    7$c,.ABD E	F 	F 	F 	1$c(/:< =	> 	> 	> 	> 	>r   c                 <    |                      ddddgfg           d S )Nz<a v=>r   r~   )r  r   rh   rV   s    r   test_missing_attribute_valuez/AttributesTestCase.test_missing_attribute_value  s3    $cI;78	: 	: 	: 	: 	:r   c                 <    |                      ddddgfg           d S )Nz-<a href=javascript:popup('/popup/help.html')>r   r~   )r   z$javascript:popup('/popup/help.html')rh   rV   s    r   test_javascript_attribute_valuez2AttributesTestCase.test_javascript_attribute_value  sA    G$cKLN O	P 	P 	P 	P 	Pr   c                 @    |                      ddddgfddg           d S )Nz-<a href='http://www.example.org/">;'>spam</a>r   r~   )r   zhttp://www.example.org/">;)r   spamr   rh   rV   s    r   test_end_tag_in_attribute_valuez2AttributesTestCase.test_end_tag_in_attribute_value  s@    H$cBCE)?<	= 	= 	= 	= 	=r   c                     d}ddg fddddgfddg dfdd	g fdd
dgfdddgfddddgfdddgfdddddddgfdddgfddddg}|                      ||           d S )Nz<html><body bgcolor=d0ca90 text='181008'><table cellspacing=0 cellpadding=1 width=100% ><tr><td align=left><font size=-1>- <a href=/rabota/><span class=en> software-and-i</span></a>- <a href='/1/'><span class=en> library</span></a></table>r   r	   body)bgcolord0ca90)r   181008table)r9  )cellpaddingr   r8  trtd)alignleftfont)sizez-1)r   z- r~   )r   z/rabota/r  )r>  en)r   z software-and-ir  r   )r   z/1/)r   z library)r&   rL  rh   r   s      r   test_with_unquoted_attributesz0AttributesTestCase.test_with_unquoted_attributes  s    M $"79K!LMOOOQr" 123.!12Z/C.DE/!235PZ.?@/!235I1D
 	h'''''r   c                     d}dddgfddddgfddddgfddg d	fdddd
gfddddgfddddgfddddgfddddgfg	}|                      ||           d S )Nz<div class=bar,baz=asd><div class="bar",baz="asd"><div class=bar, baz=asd,><div class="bar", baz="asd",><div class="bar",><div class=,bar baz=,asd><div class=,"bar" baz=,"asd"><div ,class=bar ,baz=asd><div class,="bar" baz,="asd">r   rx   )r>  zbar,baz=asdr=  )z,bazasd)r>  zbar,)bazzasd,)r=  r  )rX  rW  r  r  )r>  z,bar)rX  z,asd)r>  z,"bar")rX  z,"asd")z,classr   )zclass,r   )zbaz,rW  rh   r   s      r   test_comma_between_attributesz0AttributesTestCase.test_comma_between_attributes  s    0 !9 ;<!1? CD!2O DE !> !> !> ?!1; ?@!2O DE!46G HI!2O DE!2O DE
 	h'''''r   c                 <    |                      ddddgfg           d S )Nz<form action=bogus|&#()value>r   form)actionzbogus|&#()valuerh   rV   s    r   -test_weird_chars_in_unquoted_attribute_valuesz@AttributesTestCase.test_weird_chars_in_unquoted_attribute_values  sA    7'!> ?A:B 	C 	C 	C 	C 	Cr   N)r?   r@   rA   r  r   r$  r&  r(  r*  r/  r2  r4  r6  r?  rA  rC  rF  rU  rY  r]  rB   r   r   r  r  Z  s-       M M MG G GH H H4 4 4
M M M
I I I0 0 0B B B( ( ((	. 	. 	.> > >: : :P P P
= = =( ( (0( ( (8C C C C Cr   r  __main__)__doc__html.parserr	   r\   unittestr
   r   r   rD   rI   TestCaserQ   rf   r  r?   mainrB   r   r   <module>rd     s          6, 6, 6, 6, 6,T[+ 6, 6, 6,rA A A A A. A A AL L L L L^ L L LE E E E E8$ E E E0n
 n
 n
 n
 n
 n
 n
 n
bzC zC zC zC zC zC zC zCx zHMOOOOO r   