3
(h                 @   s   d Z ddlmZ ddlZddlmZ ddlmZmZ ddl	m
Z
mZ ejdZdd	 ZeG d
d deZeG dd deZG dd deZdd ZdS )z
Comparing two html documents.
    )unicode_literalsN)six)
force_textpython_2_unicode_compatible)HTMLParseError
HTMLParserz\s+c             C   s   t jd| S )N )
WHITESPACEsub)string r   4/tmp/pip-install-q3hcpn_q/Django/django/test/html.pynormalize_whitespace   s    r   c               @   sn   e Zd Zd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jr`t|}t|}| jrt | jd tjr| jd  |7  < t| jd | jd< d S n0| jrt | jd tjr| jd j r| jj  |r| jj| d S )N   r   r   r   r   r   )	
isinstancer   string_typesr   r   r   isspacepopappend)r   elementr   r   r   r      s    
zElement.appendc                s`    fdd  | j  xDt| j D ]6\}}t|tjrF|j | j |< q"t|dr"|j  q"W d S )Nc                s@   | r<t | d tjr<| d j | d< | d s<| j   | } | S )Nr   r   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   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rx^tt| jD ]L}| j| \}}|j| \}}|d kr|}|d kr|}||ks||kr\dS q\W | j|jkrdS dS )Nr   FT)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tdd | jD  S )Nc             s   s   | ]
}|V  qd S )Nr   ).0ar   r   r   	<genexpr>X   s    z#Element.__hash__.<locals>.<genexpr>)hashr   tupler   )r   r   r   r   __hash__W   s    zElement.__hash__c             C   s   | j | S )N)r*   )r   r   r   r   r   __ne__Z   s    zElement.__ne__Tc             C   s   t |tjs| |krdS d}xh| jD ]^}t |tjrbt |tjr|rT||j|7 }q||krdS q$||j||d7 }| r$|r$|S q$W |S )Nr   r   )count)r   r   r   r   r2   _count)r   r   r2   r$   r%   r   r   r   r3   ]   s    
zElement._countc             C   s   | j |dddkS )NF)r2   r   )r3   )r   r   r   r   r   __contains__q   s    zElement.__contains__c             C   s   | j |ddS )NT)r2   )r3   )r   r   r   r   r   r2   t   s    zElement.countc             C   s
   | j | S )N)r   )r   keyr   r   r   __getitem__w   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 j|V  qd S )N)r   	text_type)r+   cr   r   r   r-      s    z"Element.__str__.<locals>.<genexpr>z
</%s>z />)r   r   r   join)r   outputr5   r)   r   r   r   __str__z   s    
zElement.__str__c             C   s
   t j| S )N)r   r8   )r   r   r   r   __repr__   s    zElement.__repr__N)T)__name__
__module____qualname__r   r   r    r*   r0   r1   r3   r4   r2   r6   r<   r=   r   r   r   r   r      s   
r   c                   s$   e Zd Z fddZdd Z  ZS )RootElementc                s   t t| jd f  d S )N)superrA   r   )r   )	__class__r   r   r      s    zRootElement.__init__c             C   s   dj dd | jD S )Nr7   c             s   s   | ]}t j|V  qd S )N)r   r8   )r+   r9   r   r   r   r-      s    z&RootElement.__str__.<locals>.<genexpr>)r:   r   )r   r   r   r   r<      s    zRootElement.__str__)r>   r?   r@   r   r<   __classcell__r   r   )rC   r   rA      s   rA   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metaspacerlinkframebasecolc             C   s"   t j|  t | _g | _i | _d S )N)r   r   rA   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)rR   rS   r#   rV   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   )rQ   rP   )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   s8   g | ]0\}}|d kr,|dj t|jdfn||fqS )classr   )r:   r   split)r+   r   r)   r   r   r   
<listcomp>   s   z*Parser.handle_starttag.<locals>.<listcomp>)r   rZ   r   r\   rQ   rS   rR   )r   r^   r_   r   r   r   r   r[      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))rQ   rU   rY   r   r   )r   r^   r   r   r   r   r]      s    
zParser.handle_endtagc             C   s   | j j| d S )N)rZ   r   )r   datar   r   r   handle_data   s    zParser.handle_datac             C   s   | j jd|  d S )Nz&%s;)rZ   r   )r   r   r   r   r   handle_charref   s    zParser.handle_charrefc             C   s   | j jd|  d S )Nz&%s;)rZ   r   )r   r   r   r   r   handle_entityref   s    zParser.handle_entityref)
rF   rG   rH   rI   rJ   rK   rL   rM   rN   rO   )NN)r>   r?   r@   r\   r   rU   rY   propertyrZ   r`   r[   r]   re   rf   rg   r   r   r   r   rE      s    
	rE   c             C   sT   t  }|j|  |j  |j}|j  t|jdkrPt|jd tj	sP|jd }|S )a  
    Takes a string that contains *valid* HTML and turns 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   )
rE   feedcloserP   r    r&   r   r   r   r   )htmlparserdocumentr   r   r   
parse_html   s    

rn   )__doc__
__future__r   reZdjango.utilsr   Zdjango.utils.encodingr   r   Zdjango.utils.html_parserr   r   compiler	   r   objectr   rA   rE   rn   r   r   r   r   <module>   s   
xH