B
    CVvgL!  ã               @   sv   d Z ddlmZ ddl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
G dd„ deƒZdd„ ZdS )zCompare two HTML documents.é    )Ú
HTMLParser)Ú_lazy_re_compilez[\t\n\f\r ]+c             C   s   t  d| ¡S )Nú )ÚASCII_WHITESPACEÚsub)Ústring© r   ú4/tmp/pip-install-o3oxmrkh/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ƒr| j|jkrdS t| jƒt|jƒkr2dS | j|jkržx^tt| jƒƒD ]L}| j| \}}|j| \}}|d krz|}|d kr†|}||ks–||krNdS qNW | j|jkS )Nr   F)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| j˜ƒS )N)Úhashr   r   )r   r   r   r	   Ú__hash__K   s    zElement.__hash__Tc             C   sê   t |tƒs| |krdS t |tƒr0| j|jkr0dS d}d}x¬| jD ]¢}t |tƒrzt |tƒrâ|rl|| |¡7 }qâ||krâdS q@||j||d�7 }|s˜|r˜|S t |tƒr@|jr@|j| }||krÞ|d7 }|t|jƒkrâ|d7 }d}q@d}q@W |S )Né   r   )Úcount)r   r   ÚRootElementr   r)   Ú_countr!   )r   r   r)   r   Zelem_child_idxr    Z
elem_childr   r   r	   r+   N   s2    


zElement._countc             C   s   | j |dd�dkS )NF)r)   r   )r+   )r   r   r   r   r	   Ú__contains__u   s    zElement.__contains__c             C   s   | j |dd�S )NT)r)   )r+   )r   r   r   r   r	   r)   x   s    zElement.countc             C   s
   | j | S )N)r   )r   Úkeyr   r   r	   Ú__getitem__{   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   )Ú.0Úcr   r   r	   ú	<genexpr>‡   s    z"Element.__str__.<locals>.<genexpr>z
</%s>ú>)r   r   r   Újoin)r   Úoutputr-   r$   r   r   r	   Ú__str__~   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+   r,   r)   r.   r6   r7   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 )Nr/   c             s   s   | ]}t |ƒV  qd S )N)r   )r0   r1   r   r   r	   r2   –   s    z&RootElement.__str__.<locals>.<genexpr>)r4   r   )r   r   r   r	   r6   •   s    zRootElement.__str__)r8   r9   r:   r   r6   Ú__classcell__r   r   )r<   r	   r*   ‘   s   r*   c               @   s   e Zd ZdS )ÚHTMLParseErrorN)r8   r9   r:   r   r   r   r	   r>   ™   s   r>   c                   s~   e Zd Zddddddddd	d
ddddddhZ‡ f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‡  ZS )#ÚParserÚareaÚbaseÚbrÚcolÚembedÚhrÚimgÚinputÚlinkÚmetaÚparamÚsourceÚtrackÚwbrÚframeZspacerc                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)rQ   rR   r   rU   Ú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   )rP   rO   )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   sB   g | ]:\}}|d kr6|d  tdd„ t |¡D ƒƒ¡fn||f‘qS )Úclassr   c             s   s   | ]}|r|V  qd S )Nr   )r0   r$   r   r   r	   r2   È   s    z4Parser.handle_starttag.<locals>.<listcomp>.<genexpr>)r4   r   r   Úsplit)r0   r   r$   r   r   r	   ú
<listcomp>È   s   z*Parser.handle_starttag.<locals>.<listcomp>)r   rY   r   r[   rP   rR   rQ   )r   r]   r^   r   r   r   r	   rZ   Ä   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))rP   rT   rX   r   r   )r   r]   r   r   r   r	   r\   Ó   s    
zParser.handle_endtagc             C   s   | j  |¡ d S )N)rY   r   )r   Údatar   r   r	   Úhandle_dataÞ   s    zParser.handle_data)NN)r8   r9   r:   r[   r   rT   rX   ÚpropertyrY   r_   rZ   r\   rd   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 )zü
    Take a string that contains 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ÚcloserO   r   r!   r   r   r   )ÚhtmlÚparserÚdocumentr   r   r	   Ú
parse_htmlâ   s    

rk   N)Ú__doc__Úhtml.parserr   Zdjango.utils.regex_helperr   r   r
   r   r*   Ú	Exceptionr>   r?   rk   r   r   r   r	   Ú<module>   s    E