3 ª fAEã@sÀdZddlZddlZddlZddlmZdgZejdƒZejdƒZ ejdƒZ ejdƒZ ejd ƒZ ejd ƒZ ejd ƒZejd ƒZejd ƒZejdejƒZejd ƒZejdƒZGdd„dejƒZdS)zA parser for HTML and XHTML.éN)ÚunescapeÚ HTMLParserz[&<]z &[a-zA-Z#]z%&([a-zA-Z][-.a-zA-Z0-9]*)[^a-zA-Z0-9]z)&#(?:[0-9]+|[xX][0-9a-fA-F]+)[^0-9a-fA-F]z <[a-zA-Z]ú>z--\s*>z+([a-zA-Z][^\t\n\r\f />\x00]*)(?:\s|/(?!>))*z]((?<=[\'"\s/])[^\s/>][^\s/=>]*)(\s*=+\s*(\'[^\']*\'|"[^"]*"|(?![\'"])[^>\s]*))?(?:\s|/(?!>))*aF <[a-zA-Z][^\t\n\r\f />\x00]* # tag name (?:[\s/]* # optional whitespace before attribute name (?:(?<=['"\s/])[^\s/>][^\s/=>]* # attribute name (?:\s*=+\s* # value indicator (?:'[^']*' # LITA-enclosed value |"[^"]*" # LIT-enclosed value |(?!['"])[^>\s]* # bare value ) (?:\s*,)* # possibly followed by a comma )?(?:\s|/(?!>))* )* )? \s* # trailing whitespace z#c@sèeZdZdZd:Zddœdd„Zdd „Zd d „Zd d „ZdZ dd„Z dd„Z dd„Z dd„Z dd„Zd;dd„Zdd„Zdd„Zd d!„Zd"d#„Zd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„Zd6d7„Zd8d9„ZdS)'.)Ú_HTMLParser__starttag_text)r r r r Úget_starttag_textwszHTMLParser.get_starttag_textcCs$|jƒ|_tjd|jtjƒ|_dS)Nz )ÚlowerrÚreÚcompileÚIr)r Úelemr r r Úset_cdata_mode{s zHTMLParser.set_cdata_modecCst|_d|_dS)N)rrr)r r r r Úclear_cdata_modeszHTMLParser.clear_cdata_modec CsL|j}d}t|ƒ}�xÂ||k�rÖ|jr||j r||jd|ƒ}|dkr¤|jdt||dƒƒ}|dkrvtjdƒj ||ƒ rvP|}n(|j j ||ƒ}|r˜|j ƒ}n |jr P|}||krä|jrÒ|j rÒ|j t |||…ƒƒn|j |||…ƒ|j||ƒ}||krúP|j}|d|ƒ�rLtj||ƒ�r&|j|ƒ} n„|d|ƒ�r>|j|ƒ} nl|d|ƒ�rV|j|ƒ} nT|d|ƒ�rn|j|ƒ} n<|d |ƒ�r†|j|ƒ} n$|d |k�r¨|j dƒ|d } nP| dk�r>|�s¼P|jd |d ƒ} | dk�rú|jd|d ƒ} | dk�r|d } n| d 7} |j�r,|j �r,|j t ||| …ƒƒn|j ||| …ƒ|j|| ƒ}q|d |ƒ�rðtj||ƒ}|�r´|jƒd d…} |j| ƒ|jƒ} |d| d ƒ�s¤| d } |j|| ƒ}qn:d||d…k�rì|j |||d …ƒ|j||d ƒ}Pq|d|ƒrtj||ƒ}|�rN|jd ƒ} |j| ƒ|jƒ} |d| d ƒ�s@| d } |j|| ƒ}qtj||ƒ}|�r¦|�r¢|jƒ||d…k�r¢|jƒ} | |k�r’|} |j||d ƒ}Pn,|d |k�rÐ|j dƒ|j||d ƒ}nPqqW|�r:||k�r:|j �r:|j�r|j �r|j t |||…ƒƒn|j |||…ƒ|j||ƒ}||d…|_dS)Nrú<ú&é"z[\s;]zÚ r(r(r()rrP)rÚcheck_for_whole_start_tagrÚtagfind_tolerantr2r;r9rrÚattrfind_tolerantrÚappendÚstripZgetposÚcountr)r+r/ÚendswithÚhandle_startendtagÚhandle_starttagÚCDATA_CONTENT_ELEMENTSr!)r r?ÚendposrÚattrsr2rBÚtagÚmZattrnameÚrestZ attrvaluer;ÚlinenoÚoffsetr r r r3-sP   (*         zHTMLParser.parse_starttagcCs¶|j}tj||ƒ}|rª|jƒ}|||d…}|dkr>|dS|dkr~|jd|ƒrZ|dS|jd|ƒrjd S||krv|S|dS|dkrŠd S|dkr–d S||kr¢|S|dStdƒ‚dS) Nrrú/z/>r&r z6abcdefghijklmnopqrstuvwxyz=/ABCDEFGHIJKLMNOPQRSTUVWXYZzwe should not get here!r(r(r()rÚlocatestarttagend_tolerantr2r;r0ÚAssertionError)r r?rr_rAÚnextr r r rR`s.   z$HTMLParser.check_for_whole_start_tagcCs|j}tj||dƒ}|sdS|jƒ}tj||ƒ}|sÀ|jdk rV|j|||…ƒ|Stj||dƒ}|s�|||d…dkr†|dS|j |ƒS|j dƒj ƒ}|j d|jƒƒ}|j |ƒ|dS|j dƒj ƒ}|jdk �rü||jk�rü|j|||…ƒ|S|j |j ƒƒ|jƒ|S)Nrr&rEzrr()rÚ endendtagr-r;Ú endtagfindr2rr/rSrHr9rr*Ú handle_endtagr")r r?rr2rIZ namematchZtagnamer r r r r4‚s6      zHTMLParser.parse_endtagcCs|j||ƒ|j|ƒdS)N)rZri)r r^r]r r r rYªs zHTMLParser.handle_startendtagcCsdS)Nr )r r^r]r r r rZ¯szHTMLParser.handle_starttagcCsdS)Nr )r r^r r r ri³szHTMLParser.handle_endtagcCsdS)Nr )r rCr r r r:·szHTMLParser.handle_charrefcCsdS)Nr )r rCr r r r=»szHTMLParser.handle_entityrefcCsdS)Nr )r rr r r r/¿szHTMLParser.handle_datacCsdS)Nr )r rr r r rJÃszHTMLParser.handle_commentcCsdS)Nr )r Zdeclr r r rGÇszHTMLParser.handle_declcCsdS)Nr )r rr r r rMËszHTMLParser.handle_picCsdS)Nr )r rr r r Ú unknown_declÎszHTMLParser.unknown_declcCstjdtdd�t|ƒS)NzZThe unescape method is deprecated and will be removed in 3.5, use html.unescape() instead.r&)Ú stacklevel)ÚwarningsÚwarnÚDeprecationWarningr)r Úsr r r rÒs zHTMLParser.unescape)rr)r)Ú__name__Ú __module__Ú __qualname__Ú__doc__r[r rrrrrr!r"rr7rHr6r3rRr4rYrZrir:r=r/rJrGrMrjrr r r r r?s8  z  3"()rsrrlrZhtmlrÚ__all__rrr>r<r8r1rLZ commentcloserSrTÚVERBOSErdrgrhrrr r r r Ús(