o
    uvXj>  ã                   @   st   d Z ddl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.é    N)Ú
HTMLParserz\s+c                 C   s   t  d| ¡S )Nú )Ú
WHITESPACEÚsub)Ústring© r   úM/var/www/html/myproject/venv/lib/python3.10/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ƒr*t|ƒ}| jr)t | jd tƒr)| jd  |7  < t| jd ƒ| jd< d S n| jrAt | jd tƒrA| jd  ¡ rA| j ¡  |rK| j |¡ d S 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 ]\}}t|tƒr!| ¡ | 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rdS | j|jkrNtt| jƒƒD ]'}| j| \}}|j| \}}|d u r<|}|d u rB|}||ksJ||krM dS q&| j|jkS )Nr   F)r"   r   Úlenr   Úranger   )r   r   r#   ÚattrÚvalueÚ
other_attrÚother_valuer   r   r   Ú__eq__6   s    ÿzElement.__eq__c                 C   s   t | jgdd„ | jD ƒ¢R ƒS )Nc                 s   s   � | ]}|V  qd S r   r   )Ú.0Úar   r   r   Ú	<genexpr>K   s   € z#Element.__hash__.<locals>.<genexpr>)Úhashr   r   ©r   r   r   r   Ú__hash__J   s   zElement.__hash__Tc                 C   sž   t |tƒs| |krdS t |tƒr| j|jkrdS d}| jD ]/}t |tƒr;t |tƒr:|r3|| |¡7 }q||v r: dS q||j||d�7 }|sL|rL|  S q|S )Né   r   ©Úcount)r   r   ÚRootElementr   r4   Ú_count)r   r   r4   r#   r$   r   r   r   r6   M   s(   




€€zElement._countc                 C   s   | j |dd�dkS )NFr3   r   ©r6   r   r   r   r   Ú__contains__d   ó   zElement.__contains__c                 C   s   | j |dd�S )NTr3   r7   r   r   r   r   r4   g   ó   zElement.countc                 C   s
   | j | S r   r   )r   Úkeyr   r   r   Ú__getitem__j   s   
zElement.__getitem__c                 C   s‚   d| j  }| jD ]\}}|r|d||f 7 }q|d| 7 }q| jr;|d7 }|d dd„ | jD ƒ¡7 }|d| j  7 }|S |d	7 }|S )
Nz<%sz %s="%s"z %sz>
Ú c                 s   ó   � | ]}t |ƒV  qd S r   ©r   ©r,   Úcr   r   r   r.   v   ó   € z"Element.__str__.<locals>.<genexpr>z
</%s>ú>)r   r   r   Újoin)r   Úoutputr;   r(   r   r   r   Ú__str__m   s   
ÿzElement.__str__c                 C   s   t | ƒS r   r?   r0   r   r   r   Ú__repr__|   s   zElement.__repr__N)T)Ú__name__Ú
__module__Ú__qualname__r   r   r   r+   r1   r6   r8   r4   r<   rF   rG   r   r   r   r   r
      s    
r
   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )r5   c                    s   t ƒ  d d¡ d S )Nr   )Úsuperr   r0   ©Ú	__class__r   r   r   �   r9   zRootElement.__init__c                 C   s   d  dd„ | jD ƒ¡S )Nr=   c                 s   r>   r   r?   r@   r   r   r   r.   …   rB   z&RootElement.__str__.<locals>.<genexpr>)rD   r   r0   r   r   r   rF   „   s   zRootElement.__str__)rH   rI   rJ   r   rF   Ú__classcell__r   r   rL   r   r5   €   s    r5   c                   @   s   e Zd ZdS )ÚHTMLParseErrorN)rH   rI   rJ   r   r   r   r   rO   ˆ   s    rO   c                       sn   e Zd Zd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dd„ Zdd„ Z‡  ZS )ÚParser)
ÚbrÚhrÚinputÚimgÚmetaÚspacerÚlinkÚframeÚbaseÚcolc                    s&   t ƒ jdd� tƒ | _g | _i | _d S )NF)Úconvert_charrefs)rK   r   r5   ÚrootÚ	open_tagsÚelement_positionsr0   rL   r   r   r   ’   s   
zParser.__init__c                 C   s   t ||  ¡ ƒ‚r   )rO   Úgetpos)r   Úmsgr   r   r   Úerror˜   r:   zParser.errorNc                 C   s@   |s	|r	| j | }|d u r|  ¡ }t|dƒr|j|jf}d| S )NÚlinenozLine %d, Column %d)r^   r_   r"   rb   Úoffset)r   Úpositionr   r   r   r   Úformat_position›   s   

zParser.format_positionc                 C   s   | j r| j d S | jS r   )r]   r\   r0   r   r   r   Úcurrent¤   s   
zParser.currentc                 C   s(   |   ||¡ || jvr|  |¡ d S 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vr| j |¡ |  ¡ | j|< d S )Nc              	   S   s8   g | ]\}}|d kr|d  t| d¡ƒ¡fn||f‘qS )Úclassr   )rD   r   Úsplit)r,   r   r(   r   r   r   Ú
<listcomp>³   s    þÿýz*Parser.handle_starttag.<locals>.<listcomp>)r
   rf   r   rh   r]   r_   r^   )r   rj   rk   r   r   r   r   rg   °   s   ü

zParser.handle_starttagc                 C   sh   | j s|  d||  ¡ f ¡ | j  ¡ }|j|kr2| j s&|  d||  ¡ f ¡ | j  ¡ }|j|ksd S d S )NzUnexpected end tag `%s` (%s))r]   ra   re   r   r   )r   rj   r   r   r   r   ri   ¿   s   ÿ

ÿ
üzParser.handle_endtagc                 C   s   | j  |¡ d S r   ©rf   r   )r   Údatar   r   r   Úhandle_dataÊ   s   zParser.handle_datac                 C   ó   | j  d| ¡ d S ©Nz&%s;rp   ©r   r   r   r   r   Úhandle_charrefÍ   ó   zParser.handle_charrefc                 C   rs   rt   rp   ru   r   r   r   Úhandle_entityrefÐ   rw   zParser.handle_entityref)NN)rH   rI   rJ   rh   r   ra   re   Úpropertyrf   rl   rg   ri   rr   rv   rx   rN   r   r   rL   r   rP   Œ   s    
	
rP   c                 C   sR   t ƒ }| | ¡ | ¡  |j}| ¡  t|jƒdkr't|jd tƒs'|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.
    r2   r   )	rP   ÚfeedÚcloser\   r   r%   r   r   r   )ÚhtmlÚparserÚdocumentr   r   r   Ú
parse_htmlÔ   s   

r   )Ú__doc__ÚreÚhtml.parserr   Úcompiler   r	   r
   r5   Ú	ExceptionrO   rP   r   r   r   r   r   Ú<module>   s    
sH