U
     5øip"  ã                   @   s´   d Z ddlmZ ddlmZ edƒZddddd	d
dddddddddddddddddddhZd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 ]+ZallowfullscreenÚasyncÚ	autofocusÚautoplayÚcheckedÚcontrolsÚdefaultzdefer ÚdisabledZformnovalidateÚhiddenÚismapÚ	itemscopeZloopÚmultipleZmutedZnomoduleZ
novalidateÚopenZplaysinlineÚreadonlyÚrequiredÚreversedÚselectedZ	truespeedc                 C   s   t  d| ¡S )Nú )ÚASCII_WHITESPACEÚsub)Ústring© r   ú4/tmp/pip-unpacked-wheel-gcyiijx6/django/test/html.pyÚnormalize_whitespace   s    r   c                 C   st   g }| D ]f\}}|dkr:|r:d  tdd„ t |¡D ƒƒ¡}|tkrT|rN||kr`d }n|d kr`d}| ||f¡ q|S )NÚclassr   c                 s   s   | ]}|r|V  qd S ©Nr   )Ú.0Úvaluer   r   r   Ú	<genexpr>!   s     z'normalize_attributes.<locals>.<genexpr>Ú )ÚjoinÚsortedr   ÚsplitÚBOOLEAN_ATTRIBUTESÚappend)Ú
attributesÚ
normalizedÚnamer   r   r   r   Únormalize_attributes   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 r   )r(   r"   r&   Úchildren)Úselfr(   r&   r   r   r   Ú__init__1   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Úpopr%   ©r,   Úelementr   r   r   r%   6   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.   )r0   r1   Úrstripr3   ©r+   ©Úrstrip_last_elementr   r   r9   G   s    z-Element.finalize.<locals>.rstrip_last_elementÚfinalize)r+   Ú	enumerater0   r1   ÚstripÚhasattrr:   )r,   ÚiÚchildr   r8   r   r:   F   s    


zElement.finalizec                 C   s6   t |dƒr| j|jkrdS | j|jkr*dS | j|jkS )Nr(   F)r=   r(   r&   r+   r4   r   r   r   Ú__eq__V   s
    zElement.__eq__c                 C   s   t | jf| j˜ƒS r   )Úhashr(   r&   ©r,   r   r   r   Ú__hash__]   s    zElement.__hash__Tc                 C   sì   t |tƒs| |krdS t |tƒr0| j|jkr0dS d}d}| jD ]¨}t |tƒrzt |tƒræ|rj|| |¡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>|S )Né   r   ©Úcount)r0   r1   ÚRootElementr+   rF   Ú_countÚlen)r,   r5   rF   r>   Zelem_child_idxr?   Z
elem_childr   r   r   rH   `   s2    



zElement._countc                 C   s   | j |dd�dkS )NFrE   r   ©rH   r4   r   r   r   Ú__contains__‡   s    zElement.__contains__c                 C   s   | j |dd�S )NTrE   rJ   r4   r   r   r   rF   Š   s    zElement.countc                 C   s
   | j | S r   r7   )r,   Úkeyr   r   r   Ú__getitem__�   s    zElement.__getitem__c                 C   s„   d| j  }| jD ].\}}|d k	r2|d||f 7 }q|d| 7 }q| jrx|d7 }|d dd„ | jD ƒ¡7 }|d| j  7 }n|d	7 }|S )
Nz<%sz %s="%s"z %sz>
r    c                 s   s   | ]}t |ƒV  qd S r   ©r1   ©r   Úcr   r   r   r   ™   s     z"Element.__str__.<locals>.<genexpr>z
</%s>ú>)r(   r&   r+   r!   )r,   ÚoutputrL   r   r   r   r   Ú__str__�   s    
zElement.__str__c                 C   s   t | ƒS r   rN   rB   r   r   r   Ú__repr__Ÿ   s    zElement.__repr__N)T)Ú__name__Ú
__module__Ú__qualname__r-   r%   r:   r@   rC   rH   rK   rF   rM   rS   rT   r   r   r   r   r*   0   s   
'r*   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )rG   c                    s   t ƒ  d d¡ d S )Nr   )Úsuperr-   rB   ©Ú	__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 r   rN   rO   r   r   r   r   ¨   s     z&RootElement.__str__.<locals>.<genexpr>)r!   r+   rB   r   r   r   rS   §   s    zRootElement.__str__)rU   rV   rW   r-   rS   Ú__classcell__r   r   rY   r   rG   £   s   rG   c                   @   s   e Zd ZdS )ÚHTMLParseErrorN)rU   rV   rW   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 r   )rX   r-   rG   ÚrootÚ	open_tagsÚelement_positionsrB   rY   r   r   r-   ¸   s    
zParser.__init__c                 C   s   t ||  ¡ ƒ‚d S r   )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)ro   rp   r=   rs   Úoffset)r,   Úpositionr5   r   r   r   Úformat_positionÁ   s    

zParser.format_positionc                 C   s   | j r| j d S | jS d S r.   )rn   rm   rB   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   sF   t |ƒ}t||ƒ}| j |¡ || jkr4| j |¡ |  ¡ | j|< d S r   )r)   r*   rw   r%   ry   rn   rp   ro   )r,   r{   r|   r5   r   r   r   rx   Ö   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))rn   rr   rv   r3   r(   )r,   r{   r5   r   r   r   rz   Þ   s     ÿ

 ÿzParser.handle_endtagc                 C   s   | j  |¡ d S r   )rw   r%   )r,   Údatar   r   r   Úhandle_dataé   s    zParser.handle_data)NN)rU   rV   rW   ry   r-   rr   rv   Úpropertyrw   r}   rx   rz   r   r[   r   r   rY   r   r]   ¯   s4                ü
	
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.
    rD   r   )	r]   ÚfeedÚcloserm   r:   rI   r+   r0   r1   )ÚhtmlÚparserÚdocumentr   r   r   Ú
parse_htmlí   s    

r†   N)Ú__doc__Úhtml.parserr   Zdjango.utils.regex_helperr   r   r$   r   r)   r*   rG   Ú	Exceptionr\   r]   r†   r   r   r   r   Ú<module>   sH                       ú
s>