a
    äze ‡  ã                   @   s’   d dl Zd dlZd dlZG dd„ dejjƒZG dd„ deƒZG dd„ deƒZG dd	„ d	ej	ƒZ
G d
d„ de
ƒZG dd„ de
ƒZedkrŽe ¡  dS )é    Nc                   @   sl   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚEventCollectorc                 O   s0   g | _ | j j| _tjjj| g|¢R i |¤Ž d S ©N)ÚeventsÚappendÚhtmlÚparserÚ
HTMLParserÚ__init__)ÚselfÚargsÚkw© r   ú*/usr/lib/python3.9/test/test_htmlparser.pyr	   
   s    
zEventCollector.__init__c                 C   sj   g }d }| j D ]P}|d }||  kr.dkrPn nd|d d |d  f|d< n
| |¡ |}q|| _ |S )Nr   Údataéÿÿÿÿé   )r   r   )r
   ÚLZprevtypeÚeventÚtyper   r   r   Ú
get_events   s    

zEventCollector.get_eventsc                 C   s   |   d||f¡ d S )NÚstarttag©r   ©r
   ÚtagÚattrsr   r   r   Úhandle_starttag    s    zEventCollector.handle_starttagc                 C   s   |   d||f¡ d S )NÚstartendtagr   r   r   r   r   Úhandle_startendtag#   s    z!EventCollector.handle_startendtagc                 C   s   |   d|f¡ d S )NÚendtagr   )r
   r   r   r   r   Úhandle_endtag&   s    zEventCollector.handle_endtagc                 C   s   |   d|f¡ d S )NÚcommentr   ©r
   r   r   r   r   Úhandle_comment+   s    zEventCollector.handle_commentc                 C   s   |   d|f¡ d S )NÚcharrefr   r!   r   r   r   Úhandle_charref.   s    zEventCollector.handle_charrefc                 C   s   |   d|f¡ d S )Nr   r   r!   r   r   r   Úhandle_data1   s    zEventCollector.handle_datac                 C   s   |   d|f¡ d S )NÚdeclr   r!   r   r   r   Úhandle_decl4   s    zEventCollector.handle_declc                 C   s   |   d|f¡ d S )NÚ	entityrefr   r!   r   r   r   Úhandle_entityref7   s    zEventCollector.handle_entityrefc                 C   s   |   d|f¡ d S )NÚpir   r!   r   r   r   Ú	handle_pi:   s    zEventCollector.handle_pic                 C   s   |   d|f¡ d S )Núunknown declr   )r
   r&   r   r   r   Úunknown_decl=   s    zEventCollector.unknown_declN)Ú__name__Ú
__module__Ú__qualname__r	   r   r   r   r   r"   r$   r%   r'   r)   r+   r-   r   r   r   r   r      s   r   c                   @   s   e Zd Zdd„ ZdS )ÚEventCollectorExtrac                 C   s$   t  | ||¡ |  d|  ¡ f¡ d S )NÚstarttag_text)r   r   r   Zget_starttag_textr   r   r   r   r   C   s    z#EventCollectorExtra.handle_starttagN)r.   r/   r0   r   r   r   r   r   r1   A   s   r1   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚEventCollectorCharrefsc                 C   s   |   d¡ d S ©Nz6This should never be called with convert_charrefs=True©Úfailr!   r   r   r   r$   J   s    z%EventCollectorCharrefs.handle_charrefc                 C   s   |   d¡ d S r4   r5   r!   r   r   r   r)   M   s    z'EventCollectorCharrefs.handle_entityrefN)r.   r/   r0   r$   r)   r   r   r   r   r3   H   s   r3   c                   @   s&   e Zd Zdd„ Zddd„Zdd„ ZdS )	ÚTestCaseBasec                 C   s
   t ddS ©NF©Úconvert_charrefs)r   ©r
   r   r   r   Úget_collectorS   s    zTestCaseBase.get_collectorNc                 C   sr   |d u r|   ¡ }|}|D ]}| |¡ q| ¡  | ¡ }||krn|  dt|ƒ d t |¡ d t |¡ ¡ d S )Nz6received events did not match expected events
Source:
z
Expected:
z
Received:
)r<   ÚfeedÚcloser   r6   ÚreprÚpprintZpformat)r
   ÚsourceZexpected_eventsÚ	collectorr   Úsr   r   r   r   Ú
_run_checkV   s&    ÿþþýýzTestCaseBase._run_checkc                 C   s   |   ||tdd¡ d S r8   )rD   r1   )r
   rA   r   r   r   r   Ú_run_check_extrad   s    ÿzTestCaseBase._run_check_extra)N)r.   r/   r0   r<   rD   rE   r   r   r   r   r7   Q   s   
r7   c                   @   sô   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ Zd;S )<ÚHTMLParserTestCasec                 C   s    |   ddg¡ |   ddg¡ d S )Nz<?processing instruction>)r*   zprocessing instructionz<?processing instruction ?>)r*   zprocessing instruction ?©rD   r;   r   r   r   Ú test_processing_instruction_onlyk   s    ÿÿz3HTMLParserTestCase.test_processing_instruction_onlyc                 C   sB   |   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   Ú
)r&   zDOCTYPE html PUBLIC 'foo'r   r   )r(   Úentity)r#   Z32)r    z4comment1a
-></foo><bar>&lt;<?pi?></foo<bar
comment1bÚimg)ÚsrcZBar)ZismapN)r   zsample
text
)r#   Zx201C)r    zcomment2a-- --comment2b©r   r   rG   r;   r   r   r   Útest_simple_htmls   s(    ïõz#HTMLParserTestCase.test_simple_htmlc                 C   s6   |   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   rO   z<div>&#bad;</div>Údiv©r   rQ   rG   r;   r   r   r   Útest_malformatted_charref“   s    ýýz,HTMLParserTestCase.test_malformatted_charrefc                 C   s   |   dddg¡ d S )Nz&entityref foo)r(   r(   )r   z foorG   r;   r   r   r   Útest_unclosed_entityref    s    þz*HTMLParserTestCase.test_unclosed_entityrefc                 C   s$   |   dddg fddg fddg¡ d S )Nz<a><b></a></b>r   ÚaÚb©r   rU   ©r   rV   rG   r;   r   r   r   Útest_bad_nesting¦   s    üz#HTMLParserTestCase.test_bad_nestingc                 C   s   |   ddg¡ d S )Nú#this text & contains & ampersands &)r   rZ   rG   r;   r   r   r   Útest_bare_ampersands±   s    ÿz'HTMLParserTestCase.test_bare_ampersandsc                 C   s   |   ddg¡ d S )Nú.this < text > contains < bare>pointy< brackets)r   r\   rG   r;   r   r   r   Útest_bare_pointy_brackets¶   s    ÿz,HTMLParserTestCase.test_bare_pointy_bracketsc                 C   s0   |   ddddgfg¡ |   ddddgfg¡ d S )Nú	<a b='<'>r   rU   ©rV   ú<ú	<a b='>'>©rV   ú>rG   r;   r   r   r   Útest_starttag_end_boundary»   s    z-HTMLParserTestCase.test_starttag_end_boundaryc                 C   s’  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   rU   r_   r^   z<a zb='<'>z<a bz='<'>z<a b=z'<'>z<a b='<z'>z<a b='<'rc   rb   ra   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--rG   ©r
   Úoutputr   r   r   Útest_buffer_artefacts¿   s4    z(HTMLParserTestCase.test_buffer_artefactsc                 C   s0   g d¢}|D ]}|   d| dd| fg¡ qd S )N)
Z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"z‚html 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>r&   zDOCTYPE rG   )r
   ZdtdsZdtdr   r   r   Útest_valid_doctypesÝ   s
    
ÿz&HTMLParserTestCase.test_valid_doctypesc                 C   sN   |   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   rO   z<p></p>r   rP   z<p><img src='foo' /></p>rK   )rL   ÚfoorG   r;   r   r   r   Útest_startendtagõ   s    ÿþ
ýz#HTMLParserTestCase.test_startendtagc                 C   s&   d}|   |ddddgfd|fg¡ d S )Nz <foo:bar   
   one="1"	two=2   >r   zfoo:bar)ZoneÚ1)ZtwoÚ2r2   )rE   )r
   rC   r   r   r   Útest_get_starttag_text  s
    þz)HTMLParserTestCase.test_get_starttag_textc              	   C   s^   g d¢}g d¢}|D ]D}|D ]:}|  ¡ }dj||d}|  |d|g fd|fd|fg¡ qqd 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ÚstyleZSCRIPTZSTYLEZScriptZStylez <{element}>{content}</{element}>©ÚelementÚcontentr   r   r   )ÚlowerÚformatrD   )r
   ÚcontentsÚelementsru   rt   Úelement_lowerrC   r   r   r   Útest_cdata_content	  s    ÿþz%HTMLParserTestCase.test_cdata_contentc                 C   sf   G dd„ dt ƒ}d}dD ]H}| ¡  ¡ }dj||d}| j|d|g fd|fd	|fg|d
dd qd S )Nc                   @   s   e Zd Zdd„ ZdS )zBHTMLParserTestCase.test_cdata_with_closing_tags.<locals>.Collectorc                 S   s   | j S r   )r   r;   r   r   r   r   .  s    zMHTMLParserTestCase.test_cdata_with_closing_tags.<locals>.Collector.get_eventsN)r.   r/   r0   r   r   r   r   r   Ú	Collector-  s   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}>rs   r   r   r   Fr9   ©rB   )r   rv   Ústriprw   rD   )r
   r|   ru   rt   rz   rC   r   r   r   Útest_cdata_with_closing_tags(  s    ÿþýz/HTMLParserTestCase.test_cdata_with_closing_tagsc                 C   s   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    rf   )r    z--I have many hyphens--)r    z I have a > in the middle )r    z and I have -- in the middle! rG   ©r
   r   Úexpectedr   r   r   Útest_comments>  s    z HTMLParserTestCase.test_commentsc                 C   s   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]rG   r   r   r   r   Útest_condcomsO  s    z HTMLParserTestCase.test_condcomsc              
   C   sB  dd„ }|   |ƒ j¡ g d¢}dddgfddg}|D ]}| jd	 |¡||ƒ d
 q4dddg d¢fdddg}|D ]}| jd |¡||ƒ d
 qn|D ]X}d |gd ¡}dddg fd|fddddg fd|fddg	}| jd ||¡||ƒ d
 qd}tdt|ƒƒD ],}| j|d |… d|d |… fg|ƒ d
 qü| jddg|ƒ d
 d S )Nc                   S   s   t ƒ S r   )r3   r   r   r   r   Ú<lambda>Z  ó    z:HTMLParserTestCase.test_convert_charrefs.<locals>.<lambda>)z&quot;z&#34;z&#x22;z&quotz&#34z&#x22r   rU   )Úhrefzfoo"zar)r   za"zrW   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é   rq   r   )r   rq   rr   )r   rr   z/{1}<script>{0}</script>{1}<style>{0}</style>{1}z&quo &# &#xr   úno charrefs here)r   rŽ   )Z
assertTruer:   rD   rw   ÚjoinÚrangeÚlen)r
   rB   Zcharrefsr‚   r#   Útextr   r‰   r   r   r   Útest_convert_charrefsX  sR    
ÿÿþÿþüÿþÿ
ÿz(HTMLParserTestCase.test_convert_charrefsc                 C   s2   |   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)r(   rU   )r   r`   zbc<)rU   NrM   )r   z
<img src="URL>)r    z/img)r   zhtml<rG   r;   r   r   r   Útest_tolerant_parsing  s    

÷ÿz(HTMLParserTestCase.test_tolerant_parsingc                 C   s  |   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˜   rg   )r   rg   ú<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  />rG   r;   r   r   r   Útest_starttag_junk_charsŽ  s"    z+HTMLParserTestCase.test_starttag_junk_charsc              
   C   sº   |   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   rU   )rl   Úvarzj<img width=902 height=250px src="/sites/default/files/images/homepage/foo.jpg" /*what am I doing here*/ />rK   ))ÚwidthZ902)ZheightZ250px)rL   z,/sites/default/files/images/homepage/foo.jpg)z*whatN)ÚamN)ÚiN)ZdoingN)zhere*Nz9<a / /foo/ / /=/ / /bar/ / /><a / /foo/ / /=/ / /bar/ / >))rl   N)ú=N)ÚbarNr   zD<meta><meta / ><meta // ><meta / / ><meta/><meta /><meta //><meta//>ÚmetarG   r   r   r   r   Útest_slashes_in_starttag¡  s$    þþüz+HTMLParserTestCase.test_slashes_in_starttagc                 C   s   |   ddg¡ d S )Nz<!DOCTYPE foo $ >)r&   zDOCTYPE foo $ rG   r;   r   r   r   Útest_declaration_junk_charsÀ  s    z.HTMLParserTestCase.test_declaration_junk_charsc                 C   s   |   ddg¡ d S )Nz"<!spacer type="block" height="25">)r    zspacer type="block" height="25"rG   r;   r   r   r   Útest_illegal_declarationsÃ  s    ÿz,HTMLParserTestCase.test_illegal_declarationsc                 C   sZ   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<rR   )r    z<h4)r   ZlirG   r   r   r   r   Útest_invalid_end_tagsÇ  s    ïz(HTMLParserTestCase.test_invalid_end_tagsc                 C   s&   d}ddg fdddg}|   ||¡ d S )Nz(<b>This</b attr=">"> confuses the parserr   rV   )r   ZThisrX   )r   z"> confuses the parserrG   r   r   r   r   Útest_broken_invalid_end_tagá  s    ýz.HTMLParserTestCase.test_broken_invalid_end_tagc                 C   sŽ   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   rQ   ©rr   rf   rV   )r   zThe rU   )r‡   Zsome_url)r   ZrainrW   ©r   ú r   r©   )r   z in Úspan)r   ZSpain©r   r¯   rX   rR   z><div style="", foo = "bar" ><b>The <a href="some_url">rain</a>)r¬   ©ú,N)rl   r¤   rG   r   r   r   r   Ú$test_correct_detection_of_start_tagsí  s4    

ò
úz7HTMLParserTestCase.test_correct_detection_of_start_tagsc                 C   sF   ddgfddgfdg d¢fddd	gfg}|D ]\}}|   ||¡ q,d S )
Núa&)r   r´   za&b)r   Úabza&b )©r   rU   ©r(   rV   r­   za&b;r¶   r·   rG   )r
   r   r   r‚   r   r   r   Útest_EOF_in_charref  s    

üz&HTMLParserTestCase.test_EOF_in_charrefc                 C   s   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 !!!rG   r   r   r   r   Útest_broken_comments  s    z'HTMLParserTestCase.test_broken_commentsc                 C   sX   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,   Zendif)r,   zif ! IEr   Úlink)r‡   zfavicon.tiff)r,   zif !IE 6rK   )rL   zfirefox.png)r,   zif !ie 6r   rV   )r   rl   rX   )r,   zif (!IE)|(lt IE 9))rL   zmammoth.bmprG   r   r   r   r   Útest_broken_condcoms,  s(    


ïz'HTMLParserTestCase.test_broken_condcomsc                 C   s8   t dd}| d¡ |  | ¡ dddg fddd	g¡ d S )
NTr9   zfoo <a>link</a> bar &amp; baz)r   zfoo r   rU   )r   rº   rW   )r   z
 bar & baz)r   r=   ÚassertEqualr   )r
   r   r   r   r   Ú"test_convert_charrefs_dropped_textM  s    

ÿþz5HTMLParserTestCase.test_convert_charrefs_dropped_textN) r.   r/   r0   rH   rN   rS   rT   rY   r[   r]   rd   rj   rk   rm   rp   r{   r   rƒ   r„   r“   r”   rž   r¦   r§   r¨   rª   r«   r³   r¸   r¹   r»   r½   r   r   r   r   rF   i   s:    	)!!rF   c                   @   s¤   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'S )(ÚAttributesTestCasec                 C   sD   ddg d¢fg}|   d|¡ |   d|¡ |   d|¡ |   d|¡ d S )Nr   rU   ))rV   Ú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>rG   rh   r   r   r   Útest_attr_syntax\  s    ÿz#AttributesTestCase.test_attr_syntaxc                 C   s`   |   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   rU   ))rV   zxxx
	xxx)rÀ   zyyy	
yyy)rÁ   z	xyz
z<a b='' c="">)rV   rf   )rÀ   rf   z<e a=rgb(1,2,3)>rÂ   )rU   z
rgb(1,2,3)z<a href=mailto:xyz@example.com>)r‡   zmailto:xyz@example.comrG   r;   r   r   r   Útest_attr_valuese  s    ÿÿÿþz#AttributesTestCase.test_attr_valuesc                 C   sL   |   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   rK   )rL   z/foo/bar.png)Zaltu   ä¸­æ–‡u+   <a title='ãƒ†ã‚¹ãƒˆ' href='ãƒ†ã‚¹ãƒˆ.html'>rU   )Útitleu	   ãƒ†ã‚¹ãƒˆ)r‡   u   ãƒ†ã‚¹ãƒˆ.htmlu+   <a title="ãƒ†ã‚¹ãƒˆ" href="ãƒ†ã‚¹ãƒˆ.html">rG   r;   r   r   r   Útest_attr_nonasciit  s$    ÿþÿþÿþz%AttributesTestCase.test_attr_nonasciic                 C   s   |   ddddgfg¡ d S )Nz!<a b='&amp;&gt;&lt;&quot;&apos;'>r   rU   )rV   z&><"'rG   r;   r   r   r   Útest_attr_entity_replacementƒ  s    þz/AttributesTestCase.test_attr_entity_replacementc                 C   s   |   dddg d¢fg¡ d S )Nz<a a.b='v' c:d=v e-f=v>r   rU   ))za.br¿   )zc:dr¿   )ze-fr¿   rG   r;   r   r   r   Útest_attr_funky_namesˆ  s    þz(AttributesTestCase.test_attr_funky_namesc                 C   s   |   ddddgfg¡ d S )Nz0<html foo='&euro;&amp;&#97;&#x61;&unsupported;'>r   r   )rl   u   â‚¬&aa&unsupported;rG   r;   r   r   r   Útest_entityrefs_in_attributes  s    þz0AttributesTestCase.test_entityrefs_in_attributesc                 C   s.   |   ddddgfdddgfdddgfg¡ d S )	Nz<a $><b $=%><c \=/>r   rU   )r•   NrV   )r•   ú%rÀ   )ú\ú/rG   r;   r   r   r   Útest_attr_funky_names2“  s    


þþz)AttributesTestCase.test_attr_funky_names2c                 C   s\   dD ]R}|   d| dddgfg¡ |   d| dddgfg¡ |   d| dddgfg¡ qd S )N)ú&z&amp;z&#38;z&#x26;z<a href="%s">r   rU   )r‡   rÎ   z<a href='%s'>z<a href=%s>rG   )r
   rJ   r   r   r   Ú test_entities_in_attribute_valueš  s    
ÿ
ÿ
ÿz3AttributesTestCase.test_entities_in_attribute_valuec                 C   sP   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   rU   )r‡   ztest'style='color:red;bad1')r   ztest - bad1rW   )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 - bad4rG   r   r   r   r   Útest_malformed_attributes¤  s    ÿ



ø
z,AttributesTestCase.test_malformed_attributesc                 C   sH   |   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‹   rf   )zo""N)r   r‰   z<x><y z="""" /></x>)z""NrG   r;   r   r   r   Ú"test_malformed_adjacent_attributes¸  s    þÿþÿz5AttributesTestCase.test_malformed_adjacent_attributesc                 C   s4   |   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   rU   ©r    z100%©ZcellspacingÚ0z<a id="foo"class="bar">)Úidrl   ©Úclassr¤   rG   r;   r   r   r   Útest_adjacent_attributesÄ  s    ÿÿÿÿz+AttributesTestCase.test_adjacent_attributesc                 C   s   |   ddddgfg¡ d S )Nz<a v=>r   rU   )r¿   rf   rG   r;   r   r   r   Útest_missing_attribute_valueÍ  s    ÿz/AttributesTestCase.test_missing_attribute_valuec                 C   s   |   ddddgfg¡ d S )Nz-<a href=javascript:popup('/popup/help.html')>r   rU   )r‡   z$javascript:popup('/popup/help.html')rG   r;   r   r   r   Útest_javascript_attribute_valueÑ  s
    ÿÿz2AttributesTestCase.test_javascript_attribute_valuec                 C   s   |   ddddgfddg¡ d S )Nz-<a href='http://www.example.org/">;'>spam</a>r   rU   )r‡   zhttp://www.example.org/">;)r   ZspamrW   rG   r;   r   r   r   Útest_end_tag_in_attribute_valueÖ  s    ÿþÿz2AttributesTestCase.test_end_tag_in_attribute_valuec                 C   sŽ   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)ZbgcolorZd0ca90)r’   Z181008Útable)rÓ   )Zcellpaddingrn   rÒ   ÚtrZtd)ZalignÚleftZfont)Úsizez-1)r   z- rU   )r‡   z/rabota/r¯   )r×   Úen)r   z software-and-ir°   rW   )r‡   z/1/)r   z library)r   rÝ   rG   r   r   r   r   Útest_with_unquoted_attributesÝ  s"    ÿ

óz0AttributesTestCase.test_with_unquoted_attributesc                 C   s‚   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   rQ   )r×   zbar,baz=asdrÖ   )z,bazÚasd)r×   zbar,)Úbazzasd,)rÖ   r±   )rä   rã   r±   r±   )r×   z,bar)rä   z,asd)r×   z,"bar")rä   z,"asd")z,classr¤   )zclass,r¤   )zbaz,rã   rG   r   r   r   r   Útest_comma_between_attributesõ  s    
öz0AttributesTestCase.test_comma_between_attributesc                 C   s   |   ddddgfg¡ d S )Nz<form action=bogus|&#()value>r   Zform)Úactionzbogus|&#()valuerG   r;   r   r   r   Ú-test_weird_chars_in_unquoted_attribute_values  s
    ÿÿz@AttributesTestCase.test_weird_chars_in_unquoted_attribute_valuesc                    sf   G dd„ dt ƒ‰ G ‡ fdd„dtjjƒ}|ƒ }|  ˆ ¡ | d¡ W d   ƒ n1 sX0    Y  d S )Nc                   @   s   e Zd ZdS )zWAttributesTestCase.test_invalid_keyword_error_exception.<locals>.InvalidMarkupExceptionN)r.   r/   r0   r   r   r   r   ÚInvalidMarkupException  s   rè   c                       s   e Zd Z‡ fdd„ZdS )zMAttributesTestCase.test_invalid_keyword_error_exception.<locals>.MyHTMLParserc                    s   ˆ |ƒ‚d S r   r   ©r
   Úmessage©rè   r   r   Úerror  s    zSAttributesTestCase.test_invalid_keyword_error_exception.<locals>.MyHTMLParser.errorN©r.   r/   r0   rì   r   rë   r   r   ÚMyHTMLParser  s   rî   ú<![invalid>)Ú	Exceptionr   r   r   ZassertRaisesr=   ©r
   rî   r   r   rë   r   Ú$test_invalid_keyword_error_exception  s
    z7AttributesTestCase.test_invalid_keyword_error_exceptionc                 C   s0   G dd„ dt jjƒ}|ƒ }|  | d¡d ¡ d S )Nc                   @   s   e Zd Zdd„ ZdS )zHAttributesTestCase.test_invalid_keyword_error_pass.<locals>.MyHTMLParserc                 S   s   d S r   r   ré   r   r   r   rì   &  s    zNAttributesTestCase.test_invalid_keyword_error_pass.<locals>.MyHTMLParser.errorNrí   r   r   r   r   rî   %  s   rî   rï   )r   r   r   r¼   r=   rñ   r   r   r   Útest_invalid_keyword_error_pass"  s    z2AttributesTestCase.test_invalid_keyword_error_passN)r.   r/   r0   rÃ   rÄ   rÆ   rÇ   rÈ   rÉ   rÍ   rÏ   rÐ   rÑ   rØ   rÙ   rÚ   rÛ   râ   rå   rç   rò   ró   r   r   r   r   r¾   Z  s&   	
	r¾   Ú__main__)Zhtml.parserr   r@   Zunittestr   r   r   r1   r3   ZTestCaser7   rF   r¾   r.   Úmainr   r   r   r   Ú<module>   s   9	   t S