3 �L�j�I�@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_text�szHTMLParser.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_mode�szHTMLParser.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;]zs  z!HTMLParser.parse_html_declarationrcCsD|j}|jd|d�}|dkr"dS|r<|j||d|��|dS)Nrr.rr0r0)rr1�handle_comment)r rFZreportr�posr r r rN1szHTMLParser.parse_bogus_commentcCsH|j}tj||d�}|sdS|j�}|j||d|��|j�}|S)Nr.rr0)r�picloser4r5� handle_pirB)r rFrr9rGr r r r==szHTMLParser.parse_picCs�d|_|j|�}|dkr|S|j}|||�|_g}tj||d�}|j�}|jd�j�|_}x�||k�r$t j||�}|s~P|jddd�\} } } | s�d} n^| dd�dko�| d d�kns�| dd�dko�| d d�kn�r�| dd �} | �rt | �} |j | j�| f�|j�}qbW|||�j �} | d k�r�|j �\} }d |jk�r�| |jjd �} t|j�|jjd �}n|t|j�}|j|||��|S| jd��r�|j||�n"|j||�||jk�r�|j|�|S)Nrrr.rK�'�"r�/>� r0r0r0)rrV)r"�check_for_whole_start_tagr�tagfind_tolerantr9rBr@r$r�attrfind_tolerantrr�stripZgetpos�countrr2r6�endswith�handle_startendtag�handle_starttag�CDATA_CONTENT_ELEMENTSr))r rF�endposr�attrsr9rH�tag�mZattrname�restZ attrvaluerB�lineno�offsetr r r r:IsP   (*         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!r0r0r0)r�locatestarttagend_tolerantr9rBr7�AssertionError)r rFrrdrG�nextr r r rX|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.rKzrr0)r� endendtagr4rB� endtagfindr9rr6rYrNr@r$r1� handle_endtagr*)r rFrr9rOZ namematchZtagnamer(r r r r;�s6      zHTMLParser.parse_endtagcCs|j||�|j|�dS)N)r_rn)r rcrbr r r r^�s zHTMLParser.handle_startendtagcCsdS)Nr )r rcrbr r r r_�szHTMLParser.handle_starttagcCsdS)Nr )r rcr r r rn�szHTMLParser.handle_endtagcCsdS)Nr )r rIr r r rA�szHTMLParser.handle_charrefcCsdS)Nr )r rIr r r rD�szHTMLParser.handle_entityrefcCsdS)Nr )r rr r r r6�szHTMLParser.handle_datacCsdS)Nr )r rr r r rP�szHTMLParser.handle_commentcCsdS)Nr )r Zdeclr r r rM�szHTMLParser.handle_declcCsdS)Nr )r rr r r rS�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 rr r!r"r#r)r*rr>rNr=r:rXr;r^r_rnrArDr6rPrMrSrorr r r r r?s8  z  3"()rxr%rqrZhtmlr�__all__r&rrErCr?r8rRZ commentcloserYrZ�VERBOSErirlrmrrr r r r �s(