o
    þÞh¥"  ã                   @   sš   d Z ddlZddlmZ ddlmZ ddlmZ edƒZh d£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.é    N)Ú
HTMLParser)ÚVOID_ELEMENTS)Ú_lazy_re_compilez[\t\n\f\r ]+>   údefer ÚloopÚopenÚasyncÚismapÚmutedÚhiddenÚcheckedÚdefaultÚautoplayÚcontrolsÚdisabledÚmultipleÚnomoduleÚreadonlyÚrequiredÚreversedÚselectedÚ	autofocusÚ	itemscopeÚ	truespeedÚ
novalidateÚplaysinlineÚformnovalidateÚallowfullscreenc                 C   s   t  d| ¡S )Nú )ÚASCII_WHITESPACEÚsub)Ústring© r"   úP/var/www/html/premium_crap/venv/lib/python3.10/site-packages/django/test/html.pyÚnormalize_whitespace-   s   r$   c                 C   st   g }| D ]3\}}|dkr|rd  tdd„ t |¡D ƒƒ¡}|tv r*|r'||kr)d }n|d u r0d}| ||f¡ q|S )NÚclassr   c                 s   s   � | ]}|r|V  qd S ©Nr"   )Ú.0Úvaluer"   r"   r#   Ú	<genexpr>8   s   € z'normalize_attributes.<locals>.<genexpr>Ú )ÚjoinÚsortedr   ÚsplitÚBOOLEAN_ATTRIBUTESÚappend)Ú
attributesÚ
normalizedÚnamer(   r"   r"   r#   Únormalize_attributes1   s   ÿ€r3   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&   )r2   r,   r0   Úchildren)Úselfr2   r0   r"   r"   r#   Ú__init__G   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$   r5   ÚisspaceÚpopr/   ©r6   Úelementr"   r"   r#   r/   L   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 r8   )r:   r;   Úrstripr=   ©r5   ©Úrstrip_last_elementr"   r#   rC   ]   s   z-Element.finalize.<locals>.rstrip_last_elementÚfinalize)r5   Ú	enumerater:   r;   ÚstripÚhasattrrD   )r6   ÚiÚchildr"   rB   r#   rD   \   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 )Nr2   F)rG   r2   r0   r5   r>   r"   r"   r#   Ú__eq__l   s
   zElement.__eq__c                 C   s   t | jg| j¢R ƒS r&   )Úhashr2   r0   ©r6   r"   r"   r#   Ú__hash__s   s   zElement.__hash__Tc                 C   sì   t |tƒs| |krdS t |tƒr| j|jkrdS d}d}| jD ]T}t |tƒr=t |tƒr<|r5|| |¡7 }q||v r< dS q||j||d�7 }|sN|rN|  S t |tƒrs|jrs|j| }||krq|d7 }|t|jƒkrp|d7 }d}qd}q|S )Né   r   ©Úcount)r:   r;   ÚRootElementr5   rP   Ú_countÚlen)r6   r?   rP   rH   Úelem_child_idxrI   Ú
elem_childr"   r"   r#   rR   v   s8   


€
€€zElement._countc                 C   s   | j |dd�dkS )NFrO   r   ©rR   r>   r"   r"   r#   Ú__contains__�   ó   zElement.__contains__c                 C   s   | j |dd�S )NTrO   rV   r>   r"   r"   r#   rP       ó   zElement.countc                 C   s
   | j | S r&   rA   )r6   Úkeyr"   r"   r#   Ú__getitem__£   s   
zElement.__getitem__c                 C   s†   d| j  }| jD ]\}}|d u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>
r*   c                 S   ó(   g | ]}t |tƒrt |¡nt|ƒ‘qS r"   ©r:   r;   ÚhtmlÚescape©r'   Úcr"   r"   r#   Ú
<listcomp>°   s    ÿÿz#Element.__str__.<locals>.<listcomp>z
</%s>ú>)r2   r0   r5   r+   )r6   ÚoutputrZ   r(   r"   r"   r#   Ú__str__¦   s    
þÿÿzElement.__str__c                 C   s   t | ƒS r&   )r;   rL   r"   r"   r#   Ú__repr__º   s   zElement.__repr__N)T)Ú__name__Ú
__module__Ú__qualname__r7   r/   rD   rJ   rM   rR   rW   rP   r[   re   rf   r"   r"   r"   r#   r4   F   s    
'r4   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )rQ   c                    s   t ƒ  d d¡ d S )Nr"   )Úsuperr7   rL   ©Ú	__class__r"   r#   r7   ¿   rX   zRootElement.__init__c                 C   s   d  dd„ | jD ƒ¡S )Nr*   c                 S   r\   r"   r]   r`   r"   r"   r#   rb   Ä   s   ( z'RootElement.__str__.<locals>.<listcomp>)r+   r5   rL   r"   r"   r#   re   Â   s   ÿzRootElement.__str__)rg   rh   ri   r7   re   Ú__classcell__r"   r"   rk   r#   rQ   ¾   s    rQ   c                   @   s   e Zd ZdS )ÚHTMLParseErrorN)rg   rh   ri   r"   r"   r"   r#   rn   È   s    rn   c                       sZ   e 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‡  ZS )ÚParserc                    s"   t ƒ  ¡  tƒ | _g | _i | _d S r&   )rj   r7   rQ   ÚrootÚ	open_tagsÚelement_positionsrL   rk   r"   r#   r7   Í   s   

zParser.__init__c                 C   s   t ||  ¡ ƒ‚r&   )rn   Úgetpos)r6   Úmsgr"   r"   r#   ÚerrorÓ   rY   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)rr   rs   rG   rv   Úoffset)r6   Úpositionr?   r"   r"   r#   Úformat_positionÖ   s   

zParser.format_positionc                 C   s   | j r| j d S | jS r8   )rq   rp   rL   r"   r"   r#   Úcurrentß   s   
zParser.currentc                 C   s&   |   ||¡ |tvr|  |¡ d S d S r&   )Úhandle_starttagr   Úhandle_endtag)r6   ÚtagÚattrsr"   r"   r#   Úhandle_startendtagæ   s   ÿzParser.handle_startendtagc                 C   sD   t |ƒ}t||ƒ}| j |¡ |tvr| j |¡ |  ¡ | j|< d S r&   )r3   r4   rz   r/   r   rq   rs   rr   )r6   r}   r~   r?   r"   r"   r#   r{   ë   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))rq   ru   ry   r=   r2   )r6   r}   r?   r"   r"   r#   r|   ó   s   

ÿ
ûzParser.handle_endtagc                 C   s   | j  |¡ d S r&   )rz   r/   )r6   Údatar"   r"   r#   Úhandle_dataþ   s   zParser.handle_data)NN)rg   rh   ri   r7   ru   ry   Úpropertyrz   r   r{   r|   r�   rm   r"   r"   rk   r#   ro   Ì   s    
	
ro   c                 C   sR   t ƒ }| | ¡ | ¡  |j}| ¡  t|jƒdkr't|jd tƒs'|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.
    rN   r   )	ro   ÚfeedÚcloserp   rD   rS   r5   r:   r;   )r^   ÚparserÚdocumentr"   r"   r#   Ú
parse_html  s   

r‡   )Ú__doc__r^   Úhtml.parserr   Údjango.utils.htmlr   Údjango.utils.regex_helperr   r   r.   r$   r3   r4   rQ   Ú	Exceptionrn   ro   r‡   r"   r"   r"   r#   Ú<module>   s    x
6