a
    Lcòfù#  ã                   @   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 ]+>   ÚdisabledZformnovalidateZ	truespeedZmutedÚrequiredÚselectedÚcontrolsÚmultipleÚautoplayZallowfullscreenZplaysinlineZ
novalidatezdefer ÚcheckedÚloopÚdefaultÚasyncZnomoduleÚreadonlyÚ	itemscopeÚhiddenÚismapÚ	autofocusÚreversedÚopenc                 C   s   t  d| ¡S )Nú )ÚASCII_WHITESPACEÚsub)Ústring© r   úM/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/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v rT|rN||kr`d }n|d u r`d}| ||f¡ q|S )NÚclassr   c                 s   s   | ]}|r|V  qd S ©Nr   )Ú.0Úvaluer   r   r   Ú	<genexpr>6   ó    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ƒ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'   J   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 r0   )r2   r3   Úrstripr5   ©r-   ©Úrstrip_last_elementr   r   r;   [   s    z-Element.finalize.<locals>.rstrip_last_elementÚfinalize)r-   Ú	enumerater2   r3   ÚstripÚhasattrr<   )r.   ÚiÚchildr   r:   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-   r6   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ƒr0| j|jkr0dS d}d}| jD ]¨}t |tƒrzt |tƒræ|rj|| |¡7 }qæ||v 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)r2   r3   ÚRootElementr-   rH   Ú_countÚlen)r.   r7   rH   r@   Zelem_child_idxrA   Z
elem_childr   r   r   rJ   t   s2    



zElement._countc                 C   s   | j |dd�dkS )NFrG   r   ©rJ   r6   r   r   r   Ú__contains__›   s    zElement.__contains__c                 C   s   | j |dd�S )NTrG   rL   r6   r   r   r   rH   ž   s    zElement.countc                 C   s
   | j | S r   r9   )r.   Úkeyr   r   r   Ú__getitem__¡   s    zElement.__getitem__c                 C   s„   d| j  }| jD ].\}}|d u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(   g | ] }t |tƒrt |¡nt|ƒ‘qS r   ©r2   r3   ÚhtmlÚescape©r   Úcr   r   r   Ú
<listcomp>®   s   ÿz#Element.__str__.<locals>.<listcomp>z
</%s>ú>)r*   r(   r-   r#   )r.   ÚoutputrN   r   r   r   r   Ú__str__¤   s    
þÿzElement.__str__c                 C   s   t | ƒS r   )r3   rD   r   r   r   Ú__repr__¸   s    zElement.__repr__N)T)Ú__name__Ú
__module__Ú__qualname__r/   r'   r<   rB   rE   rJ   rM   rH   rO   rX   rY   r   r   r   r   r,   D   s   
'r,   c                       s$   e Zd Z‡ fdd„Zdd„ Z‡  ZS )rI   c                    s   t ƒ  d d¡ d S )Nr   )Úsuperr/   rD   ©Ú	__class__r   r   r/   ½   s    zRootElement.__init__c                 C   s   d  dd„ | jD ƒ¡S )Nr"   c                 S   s(   g | ] }t |tƒrt |¡nt|ƒ‘qS r   rP   rS   r   r   r   rU   Â   r!   z'RootElement.__str__.<locals>.<listcomp>)r#   r-   rD   r   r   r   rX   À   s    ÿzRootElement.__str__)rZ   r[   r\   r/   rX   Ú__classcell__r   r   r^   r   rI   ¼   s   rI   c                   @   s   e Zd ZdS )ÚHTMLParseErrorN)rZ   r[   r\   r   r   r   r   ra   Æ   s   ra   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>   ÚareaÚmetaÚhrÚinputÚframeÚlinkÚbrÚparamÚsourceÚtrackÚbaseÚcolZspacerÚimgÚwbrÚembedc                    s"   t ƒ  ¡  tƒ | _g | _i | _d S r   )r]   r/   rI   ÚrootÚ	open_tagsÚelement_positionsrD   r^   r   r   r/   à   s    
zParser.__init__c                 C   s   t ||  ¡ ƒ‚d S r   )ra   Úgetpos)r.   Úmsgr   r   r   Úerroræ   s    zParser.errorNc                 C   s@   |s|r| j | }|d u r"|  ¡ }t|dƒr8|j|jf}d| S )NÚlinenozLine %d, Column %d)rt   ru   r?   rx   Úoffset)r.   Úpositionr7   r   r   r   Úformat_positioné   s    

zParser.format_positionc                 C   s   | j r| j d S | jS d S r0   )rs   rr   rD   r   r   r   Úcurrentò   s    
zParser.currentc                 C   s$   |   ||¡ || jv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vr4| j |¡ |  ¡ | j|< d S r   )r+   r,   r|   r'   r~   rs   ru   rt   )r.   r€   r�   r7   r   r   r   r}   þ   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))rs   rw   r{   r5   r*   )r.   r€   r7   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)rZ   r[   r\   r~   r/   rw   r{   Úpropertyr|   r‚   r}   r   r„   r`   r   r   r^   r   rb   Ê   s   
	
rb   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.
    rF   r   )	rb   ÚfeedÚcloserr   r<   rK   r-   r2   r3   )rQ   ÚparserÚdocumentr   r   r   Ú
parse_html  s    

rŠ   )Ú__doc__rQ   Úhtml.parserr   Zdjango.utils.regex_helperr   r   r&   r   r+   r,   rI   Ú	Exceptionra   rb   rŠ   r   r   r   r   Ú<module>   s   x
K