B
    ª0H[’  ã               @   sh   d Z ddlZddlmZmZ e d¡Zdd„ ZG dd„ dƒZG d	d
„ d
eƒZ	G dd„ deƒZ
dd„ ZdS )zCompare two HTML documents.é    N)ÚHTMLParseErrorÚ
HTMLParserz\s+c             C   s   t  d| ¡S )Nú )Ú
WHITESPACEÚsub)Ústring© r   úTC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\test\html.pyÚnormalize_whitespace
   s    r
   c               @   sf   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zddd„Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ ZdS )ÚElementc             C   s   || _ t|ƒ| _g | _d S )N)ÚnameÚsortedÚ
attributesÚchildren)Úselfr   r   r   r   r	   Ú__init__   s    
zElement.__init__c             C   s–   t |tƒrTt|ƒ}| jr‚t | jd tƒr‚| jd  |7  < t| jd ƒ| jd< d S n.| jr‚t | jd tƒr‚| jd  ¡ r‚| j ¡  |r’| j |¡ d S )Néÿÿÿÿ)Ú
isinstanceÚstrr
   r   ÚisspaceÚpopÚappend)r   Úelementr   r   r	   r      s    

zElement.appendc                s^   ‡ fdd„‰ ˆ | j ƒ xBt| j ƒD ]4\}}t|tƒrD| ¡ | j |< q"t|dƒr"| ¡  q"W d S )Nc                s>   | r:t | d tƒr:| d  ¡ | d< | d s:|  ¡  ˆ | ƒ} | S )Nr   )r   r   Úrstripr   )r   )Úrstrip_last_elementr   r	   r   '   s    z-Element.finalize.<locals>.rstrip_last_elementÚfinalize)r   Ú	enumerater   r   ÚstripÚhasattrr   )r   ÚiÚchildr   )r   r	   r   &   s    	


zElement.finalizec             C   sÀ   t |dƒsdS t |dƒr(| j|jkr(dS t| jƒt|jƒkr@dS | j|jkr¬x^tt| jƒƒD ]L}| j| \}}|j| \}}|d krˆ|}|d kr”|}||ks¤||kr\dS q\W | j|jkr¼dS dS )Nr   FT)r   r   Úlenr   Úranger   )r   r   r   ÚattrÚvalueZ
other_attrZother_valuer   r   r	   Ú__eq__7   s&    
zElement.__eq__c             C   s    t | jftdd„ | jD ƒƒ ƒS )Nc             s   s   | ]
}|V  qd S )Nr   )Ú.0Úar   r   r	   ú	<genexpr>P   s    z#Element.__hash__.<locals>.<genexpr>)Úhashr   Útupler   )r   r   r   r	   Ú__hash__O   s    zElement.__hash__Tc             C   sœ   t |tƒs| |krdS t |tƒr0| j|jkr0dS d}xb| jD ]X}t |tƒrvt |tƒr”|rh|| |¡7 }q”||kr”dS q<||j||d�7 }|s<|r<|S q<W |S )Né   r   )Úcount)r   r   ÚRootElementr   r-   Ú_count)r   r   r-   r   r    r   r   r	   r/   R   s$    



zElement._countc             C   s   | j |dd�dkS )NF)r-   r   )r/   )r   r   r   r   r	   Ú__contains__i   s    zElement.__contains__c             C   s   | j |dd�S )NT)r-   )r/   )r   r   r   r   r	   r-   l   s    zElement.countc             C   s
   | j | S )N)r   )r   Úkeyr   r   r	   Ú__getitem__o   s    zElement.__getitem__c             C   s„   d| j  }x4| jD ]*\}}|r0|d||f 7 }q|d| 7 }qW | jrx|d7 }|d dd„ | jD ƒ¡7 }|d| j  7 }n|d	7 }|S )
Nz<%sz %s="%s"z %sz>
Ú c             s   s   | ]}t |ƒV  qd S )N)r   )r&   Úcr   r   r	   r(   {   s    z"Element.__str__.<locals>.<genexpr>z
</%s>z />)r   r   r   Újoin)r   Úoutputr1   r$   r   r   r	   Ú__str__r   s    
zElement.__str__c             C   s   t | ƒS )N)r   )r   r   r   r	   Ú__repr__�   s    zElement.__repr__N)T)Ú__name__Ú
__module__Ú__qualname__r   r   r   r%   r+   r/   r0   r-   r2   r7   r8   r   r   r   r	   r      s   
r   c                   s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )r.   c                s   t ƒ  d d¡ d S )Nr   )Úsuperr   )r   )Ú	__class__r   r	   r   †   s    zRootElement.__init__c             C   s   d  dd„ | jD ƒ¡S )Nr3   c             s   s   | ]}t |ƒV  qd S )N)r   )r&   r4   r   r   r	   r(   Š   s    z&RootElement.__str__.<locals>.<genexpr>)r5   r   )r   r   r   r	   r7   ‰   s    zRootElement.__str__)r9   r:   r;   r   r7   Ú__classcell__r   r   )r=   r	   r.   …   s   r.   c               @   sf   e Zd ZdZdd„ Zdd„ Zddd„Zed	d
„ ƒZdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ ZdS )ÚParser)
ÚbrÚhrÚinputÚimgÚmetaZspacerÚlinkÚframeÚbaseÚcolc             C   s"   t  | ¡ tƒ | _g | _i | _d S )N)r   r   r.   ÚrootÚ	open_tagsÚelement_positions)r   r   r   r	   r   “   s    
zParser.__init__c             C   s   t ||  ¡ ƒ‚d S )N)r   Úgetpos)r   Úmsgr   r   r	   Úerror™   s    zParser.errorNc             C   s@   |s|r| j | }|d kr"|  ¡ }t|dƒr8|j|jf}d| S )NÚlinenozLine %d, Column %d)rK   rL   r   rO   Úoffset)r   Úpositionr   r   r   r	   Úformat_positionœ   s    

zParser.format_positionc             C   s   | j r| j d S | jS d S )Nr   )rJ   rI   )r   r   r   r	   Úcurrent¥   s    
zParser.currentc             C   s$   |   ||¡ || jkr |  |¡ d S )N)Úhandle_starttagÚSELF_CLOSING_TAGSÚhandle_endtag)r   ÚtagÚattrsr   r   r	   Úhandle_startendtag¬   s    
zParser.handle_startendtagc             C   sL   dd„ |D ƒ}t ||ƒ}| j |¡ || jkr:| j |¡ |  ¡ | j|< d S )Nc          	   S   s8   g | ]0\}}|d kr,|d  t| d¡ƒ¡fn||f‘qS )Úclassr   )r5   r   Úsplit)r&   r   r$   r   r   r	   ú
<listcomp>µ   s   z*Parser.handle_starttag.<locals>.<listcomp>)r   rS   r   rU   rJ   rL   rK   )r   rW   rX   r   r   r   r	   rT   ±   s    

zParser.handle_starttagc             C   s`   | j s|  d||  ¡ f ¡ | j  ¡ }x4|j|krZ| j sN|  d||  ¡ f ¡ | j  ¡ }q(W d S )NzUnexpected end tag `%s` (%s))rJ   rN   rR   r   r   )r   rW   r   r   r   r	   rV   À   s    
zParser.handle_endtagc             C   s   | j  |¡ d S )N)rS   r   )r   Údatar   r   r	   Úhandle_dataË   s    zParser.handle_datac             C   s   | j  d| ¡ d S )Nz&%s;)rS   r   )r   r   r   r   r	   Úhandle_charrefÎ   s    zParser.handle_charrefc             C   s   | j  d| ¡ d S )Nz&%s;)rS   r   )r   r   r   r   r	   Úhandle_entityrefÑ   s    zParser.handle_entityref)NN)r9   r:   r;   rU   r   rN   rR   ÚpropertyrS   rY   rT   rV   r^   r_   r`   r   r   r   r	   r?   �   s   
	r?   c             C   sR   t ƒ }| | ¡ | ¡  |j}| ¡  t|jƒdkrNt|jd tƒsN|jd }|S )a  
    Take a string that contains *valid* HTML and turn it into a Python object
    structure that can be easily compared against other HTML on semantic
    equivalence. Syntactical differences like which quotation is used on
    arguments will be ignored.
    r,   r   )	r?   ÚfeedÚcloserI   r   r!   r   r   r   )ÚhtmlÚparserÚdocumentr   r   r	   Ú
parse_htmlÕ   s    

rg   )Ú__doc__ÚreZdjango.utils.html_parserr   r   Úcompiler   r
   r   r.   r?   rg   r   r   r   r	   Ú<module>   s   
wH