U
    8ÄT_û  ã                   @   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-unpacked-wheel-dv63caxw/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                    sZ   ‡ fdd„‰ ˆ | j ƒ t| j ƒD ]4\}}t|tƒrB| ¡ | j |< q t|dƒr | ¡  q d S )Nc                    s>   | r:t | d tƒr:| d  ¡ | d< | d s:|  ¡  ˆ | ƒ} | S r   )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œtt| jƒƒD ]N}| j| \}}|j| \}}|d krx|}|d kr„|}||ks”||krL dS qL| j|jkS )Nr   F)r#   r   Úlenr   Úranger   )r   r   r$   ÚattrÚvalueZ
other_attrZother_valuer   r   r	   Ú__eq__:   s    zElement.__eq__c                 C   s   t | jf| j˜ƒS r   )Úhashr   r   ©r   r   r   r	   Ú__hash__N   s    zElement.__hash__Tc                 C   sž   t |tƒs| |krdS t |tƒr0| j|jkr0dS d}| jD ]^}t |tƒrvt |tƒr˜|rf|| |¡7 }q˜||kr˜ dS q:||j||d�7 }|s:|r:|  S q:|S )Né   r   ©Úcount)r   r   ÚRootElementr   r0   Ú_count)r   r   r0   r$   r%   r   r   r	   r2   Q   s$    





zElement._countc                 C   s   | j |dd�dkS )NFr/   r   ©r2   r   r   r   r	   Ú__contains__h   s    zElement.__contains__c                 C   s   | j |dd�S )NTr/   r3   r   r   r   r	   r0   k   s    zElement.countc                 C   s
   | j | S r   r   )r   Úkeyr   r   r	   Ú__getitem__n   s    zElement.__getitem__c                 C   s€   d| j  }| jD ]*\}}|r.|d||f 7 }q|d| 7 }q| jrt|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 r   ©r   ©Ú.0Úcr   r   r	   Ú	<genexpr>z   s     z"Element.__str__.<locals>.<genexpr>z
</%s>ú>)r   r   r   Újoin)r   Úoutputr5   r)   r   r   r	   Ú__str__q   s    
zElement.__str__c                 C   s   t | ƒS r   r8   r,   r   r   r	   Ú__repr__€   s    zElement.__repr__N)T)Ú__name__Ú
__module__Ú__qualname__r   r   r    r*   r-   r2   r4   r0   r6   r@   rA   r   r   r   r	   r      s   
r   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )r1   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 )Nr7   c                 s   s   | ]}t |ƒV  qd S r   r8   r9   r   r   r	   r<   ‰   s     z&RootElement.__str__.<locals>.<genexpr>)r>   r   r,   r   r   r	   r@   ˆ   s    zRootElement.__str__)rB   rC   rD   r   r@   Ú__classcell__r   r   rF   r	   r1   „   s   r1   c                   @   s   e Zd ZdS )ÚHTMLParseErrorN)rB   rC   rD   r   r   r   r	   rI   Œ   s   rI   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 r   )rE   r   r1   ÚrootÚ	open_tagsÚelement_positionsr,   rF   r   r	   r   ™   s    
zParser.__init__c                 C   s   t ||  ¡ ƒ‚d S r   )rI   Ú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)r\   r]   r#   r`   Úoffset)r   Úpositionr   r   r   r	   Úformat_position¢   s    

zParser.format_positionc                 C   s   | j r| j d S | jS d S r   )r[   rZ   r,   r   r   r	   Úcurrent«   s    
zParser.currentc                 C   s$   |   ||¡ || jkr |  |¡ d S r   )Ú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 r   r   )r:   r)   r   r   r	   r<   »   s      z4Parser.handle_starttag.<locals>.<listcomp>.<genexpr>)r>   r   r   Úsplit)r:   r   r)   r   r   r	   Ú
<listcomp>º   s   þÿ$z*Parser.handle_starttag.<locals>.<listcomp>)r   rd   r   rf   r[   r]   r\   )r   rh   ri   r   r   r   r	   re   ·   s    ü

zParser.handle_starttagc                 C   s\   | j s|  d||  ¡ f ¡ | j  ¡ }|j|krX| j sL|  d||  ¡ f ¡ | j  ¡ }q&d S )NzUnexpected end tag `%s` (%s))r[   r_   rc   r   r   )r   rh   r   r   r   r	   rg   Æ   s     ÿ

 ÿzParser.handle_endtagc                 C   s   | j  |¡ d S r   )rd   r   )r   Údatar   r   r	   Úhandle_dataÑ   s    zParser.handle_data)NN)rB   rC   rD   rf   r   r_   rc   Úpropertyrd   rj   re   rg   ro   rH   r   r   rF   r	   rJ   �   s4                ü
	
rJ   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   )	rJ   ÚfeedÚcloserZ   r    r&   r   r   r   )ÚhtmlÚparserÚdocumentr   r   r	   Ú
parse_htmlÕ   s    

rv   N)Ú__doc__Úhtml.parserr   Zdjango.utils.regex_helperr   r   r
   r   r1   Ú	ExceptionrI   rJ   rv   r   r   r   r	   Ú<module>   s   sE