o
    hL!                     @   sv   d Z ddlm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.    )
HTMLParser)_lazy_re_compilez[\t\n\f\r ]+c                 C   s   t d| S )N )ASCII_WHITESPACEsub)string r   X/var/www/html/magazine_api/magazine_env/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valueZ
other_attrZother_valuer   r   r	   __eq__7   s    zElement.__eq__c                 C   s   t | jg| jR S r   )hashr   r   r   r   r   r	   __hash__K   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   RootElementr   r0   _countr&   )r   r   r0   r$   Zelem_child_idxr%   Z
elem_childr   r   r	   r2   N   s8   



zElement._countc                 C   s   | j |dddkS )NFr/   r   r2   r   r   r   r	   __contains__u      zElement.__contains__c                 C   s   | j |ddS )NTr/   r3   r   r   r   r	   r0   x      zElement.countc                 C   s
   | j | S r   r   )r   keyr   r   r	   __getitem__{   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   .0cr   r   r	   	<genexpr>       z"Element.__str__.<locals>.<genexpr>z
</%s>>)r   r   r   join)r   outputr7   r)   r   r   r	   __str__~   s   
zElement.__str__c                 C   s   t | S r   r;   r,   r   r   r	   __repr__   s   zElement.__repr__N)T)__name__
__module____qualname__r   r   r    r*   r-   r2   r4   r0   r8   rD   rE   r   r   r   r	   r      s    
'r   c                       s$   e Zd Z fddZdd Z  ZS )r1   c                    s   t  d d d S )Nr   )superr   r,   	__class__r   r	   r      r5   zRootElement.__init__c                 C   s   d dd | jD S )Nr9   c                 s   r:   r   r;   r<   r   r   r	   r?      r@   z&RootElement.__str__.<locals>.<genexpr>)rB   r   r,   r   r   r	   rD      s   zRootElement.__str__)rF   rG   rH   r   rD   __classcell__r   r   rJ   r	   r1      s    r1   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>   ZimgbrtrackinputZembedZareaZwbrframeZspacercolsourcemetalinkparambasehrc                    s"   t    t | _g | _i | _d S r   )rI   r   r1   root	open_tagselement_positionsr,   rJ   r   r	   r      s   

zParser.__init__c                 C   s   t ||  r   )rM   getpos)r   msgr   r   r	   error   r6   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#   r`   offset)r   positionr   r   r   r	   format_position   s   

zParser.format_positionc                 C   s   | j r| j d S | jS r   )r[   rZ   r,   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   sB   g | ]\}}|d kr|d tdd t|D fn||fqS )classr   c                 s   s    | ]}|r|V  qd S r   r   )r=   r)   r   r   r	   r?      r@   z4Parser.handle_starttag.<locals>.<listcomp>.<genexpr>)rB   r   r   split)r=   r   r)   r   r   r	   
<listcomp>   s    "z*Parser.handle_starttag.<locals>.<listcomp>)r   rd   r   rf   r[   r]   r\   )r   rh   ri   r   r   r   r	   re      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_   rc   r   r   )r   rh   r   r   r   r	   rg      s   


zParser.handle_endtagc                 C   s   | j | d S r   )rd   r   )r   datar   r   r	   handle_data   s   zParser.handle_data)NN)rF   rG   rH   rf   r   r_   rc   propertyrd   rj   re   rg   ro   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.
    r.   r   )	rN   feedcloserZ   r    r&   r   r   r   )htmlparserZdocumentr   r   r	   
parse_html   s   

ru   N)__doc__html.parserr   Zdjango.utils.regex_helperr   r   r
   r   r1   	ExceptionrM   rN   ru   r   r   r   r	   <module>   s     E