o
    „ó·iù#  ã                   @   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 ]+>   ZformnovalidateZ	truespeedÚcontrolsÚmultipleÚloopzdefer Ú	itemscopeZplaysinlineÚrequiredÚismapÚdefaultÚopenZ
novalidateZallowfullscreenÚasyncÚ	autofocusÚselectedÚhiddenZmutedÚautoplayÚreadonlyÚreversedÚcheckedÚdisabledZnomodulec                 C   s   t  d| ¡S )Nú )ÚASCII_WHITESPACEÚsub)Ústring© r   úVC:\Users\psant\Downloads\PAF backend\school\venv\Lib\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   ÿ€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__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   r,   ÚisspaceÚpopr&   ©r-   Ú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 r/   )r1   r2   Úrstripr4   ©r,   ©Úrstrip_last_elementr   r   r:   [   s   z-Element.finalize.<locals>.rstrip_last_elementÚfinalize)r,   Ú	enumerater1   r2   ÚstripÚhasattrr;   )r-   ÚiÚchildr   r9   r   r;   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 )Nr)   F)r>   r)   r'   r,   r5   r   r   r   Ú__eq__j   s
   zElement.__eq__c                 C   s   t | jg| j¢R ƒS r   )Úhashr)   r'   ©r-   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)r1   r2   ÚRootElementr,   rG   Ú_countÚlen)r-   r6   rG   r?   Zelem_child_idxr@   Z
elem_childr   r   r   rI   t   s8   


€
€€zElement._countc                 C   s   | j |dd�dkS )NFrF   r   ©rI   r5   r   r   r   Ú__contains__›   ó   zElement.__contains__c                 C   s   | j |dd�S )NTrF   rK   r5   r   r   r   rG   ž   ó   zElement.countc                 C   s
   | j | S r   r8   )r-   Ú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   ©r1   r2   ÚhtmlÚescape©r   Úcr   r   r   Ú
<listcomp>®   s    ÿÿz#Element.__str__.<locals>.<listcomp>z
</%s>ú>)r)   r'   r,   r"   )r-   ÚoutputrO   r   r   r   r   Ú__str__¤   s    
þÿÿzElement.__str__c                 C   s   t | ƒS r   )r2   rC   r   r   r   Ú__repr__¸   s   zElement.__repr__N)T)Ú__name__Ú
__module__Ú__qualname__r.   r&   r;   rA   rD   rI   rL   rG   rP   rZ   r[   r   r   r   r   r+   D   s    
'r+   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )rH   c                    s   t ƒ  d d¡ d S )Nr   )Úsuperr.   rC   ©Ú	__class__r   r   r.   ½   rM   zRootElement.__init__c                 C   s   d  dd„ | jD ƒ¡S )Nr!   c                 S   rQ   r   rR   rU   r   r   r   rW   Â   s   ( z'RootElement.__str__.<locals>.<listcomp>)r"   r,   rC   r   r   r   rZ   À   s   ÿzRootElement.__str__)r\   r]   r^   r.   rZ   Ú__classcell__r   r   r`   r   rH   ¼   s    rH   c                   @   s   e Zd ZdS )ÚHTMLParseErrorN)r\   r]   r^   r   r   r   r   rc   Æ   s    rc   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>   ÚhrÚsourceÚlinkÚbaseÚmetaÚwbrZspacerÚparamÚinputÚframeÚembedÚbrÚareaÚcolÚimgÚtrackc                    s"   t ƒ  ¡  tƒ | _g | _i | _d S r   )r_   r.   rH   ÚrootÚ	open_tagsÚelement_positionsrC   r`   r   r   r.   à   s   

zParser.__init__c                 C   s   t ||  ¡ ƒ‚r   )rc   Úgetpos)r-   Úmsgr   r   r   Úerroræ   rN   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)rv   rw   r>   rz   Úoffset)r-   Úpositionr6   r   r   r   Úformat_positioné   s   

zParser.format_positionc                 C   s   | j r| j d S | jS r/   )ru   rt   rC   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   sF   t |ƒ}t||ƒ}| j |¡ || jvr| j |¡ |  ¡ | j|< d S r   )r*   r+   r~   r&   r€   ru   rw   rv   )r-   r‚   rƒ   r6   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))ru   ry   r}   r4   r)   )r-   r‚   r6   r   r   r   r�     s   

ÿ
ûzParser.handle_endtagc                 C   s   | j  |¡ d S r   )r~   r&   )r-   Údatar   r   r   Úhandle_data  s   zParser.handle_data)NN)r\   r]   r^   r€   r.   ry   r}   Úpropertyr~   r„   r   r�   r†   rb   r   r   r`   r   rd   Ê   s    
	
rd   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.
    rE   r   N)	rd   ÚfeedÚclosert   r;   rJ   r,   r1   r2   )rS   ÚparserÚdocumentr   r   r   Ú
parse_html  s   

rŒ   )Ú__doc__rS   Úhtml.parserr   Zdjango.utils.regex_helperr   r   r%   r   r*   r+   rH   Ú	Exceptionrc   rd   rŒ   r   r   r   r   Ú<module>   s    x
K