3
gL!                 @   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 jd| S )N )ASCII_WHITESPACEsub)string r   N/var/www/tester-filtro-web/env/lib/python3.6/site-packages/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rt | jd tr| jd  |7  < t| jd | jd< d S n.| jrt | jd tr| jd j r| jj  |r| jj| d S )N   r   r   r   r   r   )
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 | j |< q"t|dr"|j  q"W d S )Nc                s>   | r:t | d tr:| d j | d< | d s:| j   | } | S )Nr   r   r   r   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 s| j|jkrdS t| jt|jkr4dS | j|jkrx^tt| jD ]L}| j| \}}|j| \}}|d kr||}|d kr|}||ks||krPdS qPW | 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 r| |krdS t |tr2| j|jkr2dS d}d}x| jD ]}t |tr|t |tr|rn||j|7 }q||krdS qB||j||d7 }| r|r|S t |trB|jrB|j| }||kr|d7 }|t|jkr|d7 }d}qBd}qBW |S )Nr   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j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  jd f  d S )N)superr   )r   )	__class__r   r	   r      s    zRootElement.__init__c             C   s   dj 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  j  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 || j d S )N)r>   getpos)r   msgr   r   r	   error   s    zParser.errorNc             C   sB   | r|r| j | }|d kr$| j }t|dr:|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   r   )rP   rO   )r   r   r   r	   current   s    
zParser.currentc             C   s$   | j || || jkr | j| 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| || jkr:| jj| | j | j|< d S )Nc             S   sB   g | ]:\}}|d kr6|dj tdd tj|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| jd|| j f  | j j }x4|j|krZ| j sN| jd|| j f  | j 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 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   sT   t  }|j|  |j  |j}|j  t|jdkrPt|jd t rP|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