o
    ˜¨Êhù#  ã                   @   sŽ   d Z ddl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)Ú_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!   úB/var/www/html/env/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>6   s   € z'normalize_attributes.<locals>.<genexpr>Ú )ÚjoinÚsortedr   ÚsplitÚBOOLEAN_ATTRIBUTESÚappend)Ú
attributesÚ
normalizedÚnamer'   r!   r!   r"   Únormalize_attributes/   s   ÿ€r2   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%   )r1   r+   r/   Úchildren)Úselfr1   r/   r!   r!   r"   Ú__init__E   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#   r4   ÚisspaceÚpopr.   ©r5   Úelementr!   r!   r"   r.   J   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 r7   )r9   r:   Úrstripr<   ©r4   ©Úrstrip_last_elementr!   r"   rB   [   s   z-Element.finalize.<locals>.rstrip_last_elementÚfinalize)r4   Ú	enumerater9   r:   ÚstripÚhasattrrC   )r5   ÚiÚchildr!   rA   r"   rC   Z   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 )Nr1   F)rF   r1   r/   r4   r=   r!   r!   r"   Ú__eq__j   s
   zElement.__eq__c                 C   s   t | jg| j¢R ƒS r%   )Úhashr1   r/   ©r5   r!   r!   r"   Ú__hash__q   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)r9   r:   ÚRootElementr4   rO   Ú_countÚlen)r5   r>   rO   rG   Úelem_child_idxrH   Ú
elem_childr!   r!   r"   rQ   t   s8   


€
€€zElement._countc                 C   s   | j |dd�dkS )NFrN   r   ©rQ   r=   r!   r!   r"   Ú__contains__›   ó   zElement.__contains__c                 C   s   | j |dd�S )NTrN   rU   r=   r!   r!   r"   rO   ž   ó   zElement.countc                 C   s
   | j | S r%   r@   )r5   Ú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!   ©r9   r:   ÚhtmlÚescape©r&   Úcr!   r!   r"   Ú
<listcomp>®   s    ÿÿz#Element.__str__.<locals>.<listcomp>z
</%s>ú>)r1   r/   r4   r*   )r5   ÚoutputrY   r'   r!   r!   r"   Ú__str__¤   s    
þÿÿzElement.__str__c                 C   s   t | ƒS r%   )r:   rK   r!   r!   r"   Ú__repr__¸   s   zElement.__repr__N)T)Ú__name__Ú
__module__Ú__qualname__r6   r.   rC   rI   rL   rQ   rV   rO   rZ   rd   re   r!   r!   r!   r"   r3   D   s    
'r3   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )rP   c                    s   t ƒ  d d¡ d S )Nr!   )Úsuperr6   rK   ©Ú	__class__r!   r"   r6   ½   rW   zRootElement.__init__c                 C   s   d  dd„ | jD ƒ¡S )Nr)   c                 S   r[   r!   r\   r_   r!   r!   r"   ra   Â   s   ( z'RootElement.__str__.<locals>.<listcomp>)r*   r4   rK   r!   r!   r"   rd   À   s   ÿzRootElement.__str__)rf   rg   rh   r6   rd   Ú__classcell__r!   r!   rj   r"   rP   ¼   s    rP   c                   @   s   e Zd ZdS )ÚHTMLParseErrorN)rf   rg   rh   r!   r!   r!   r"   rm   Æ   s    rm   c                       sb   e Zd Zh 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 )ÚParser>   ÚbrÚhrÚcolÚimgÚwbrÚareaÚbaseÚlinkÚmetaÚembedÚframeÚinputÚparamÚtrackÚsourceÚspacerc                    s"   t ƒ  ¡  tƒ | _g | _i | _d S r%   )ri   r6   rP   ÚrootÚ	open_tagsÚelement_positionsrK   rj   r!   r"   r6   à   s   

zParser.__init__c                 C   s   t ||  ¡ ƒ‚r%   )rm   Úgetpos)r5   Úmsgr!   r!   r"   Úerroræ   rX   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‚   rF   r…   Úoffset)r5   Úpositionr>   r!   r!   r"   Úformat_positioné   s   

zParser.format_positionc                 C   s   | j r| j d S | jS r7   )r€   r   rK   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)r5   ÚtagÚattrsr!   r!   r"   Úhandle_startendtagù   s   
ÿzParser.handle_startendtagc                 C   sF   t |ƒ}t||ƒ}| j |¡ || jvr| j |¡ |  ¡ | j|< d S r%   )r2   r3   r‰   r.   r‹   r€   r‚   r�   )r5   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))r€   r„   rˆ   r<   r1   )r5   r�   r>   r!   r!   r"   rŒ     s   

ÿ
ûzParser.handle_endtagc                 C   s   | j  |¡ d S r%   )r‰   r.   )r5   Údatar!   r!   r"   Úhandle_data  s   zParser.handle_data)NN)rf   rg   rh   r‹   r6   r„   rˆ   Úpropertyr‰   r�   rŠ   rŒ   r‘   rl   r!   r!   rj   r"   rn   Ê   s    
	
rn   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.
    rM   r   )	rn   ÚfeedÚcloser   rC   rR   r4   r9   r:   )r]   ÚparserÚdocumentr!   r!   r"   Ú
parse_html  s   

r—   )Ú__doc__r]   Úhtml.parserr   Údjango.utils.regex_helperr   r   r-   r#   r2   r3   rP   Ú	Exceptionrm   rn   r—   r!   r!   r!   r"   Ú<module>   s    x
K