a
    xd                     @   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   H/var/www/html/Ranjet/env/lib/python3.9/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rTt|}| jrt | jd tr| jd  |7  < t| jd | jd< d S n.| jrt | jd tr| jd  r| j  |r| j| 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 ]4\}}t|trB| | 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r2dS | j|jkrtt| jD ]N}| j| \}}|j| \}}|d u rx|}|d u r|}||ks||krL dS qL| j|jkS )Nr   F)r#   r   lenr   ranger   )r   r   r$   attrvalueZ
other_attrZother_valuer   r   r	   __eq__:   s    zElement.__eq__c                 C   s   t | jg| jR S r   )hashr   r   r   r   r   r	   __hash__N   s    zElement.__hash__Tc                 C   s   t |ts| |krdS t |tr0| j|jkr0dS d}| jD ]^}t |trvt |tr|rf|||7 }q||v r dS q:||j||d7 }|s:|r:|  S q:|S )N   r   count)r   r   RootElementr   r0   _count)r   r   r0   r$   r%   r   r   r	   r2   Q   s$    





zElement._countc                 C   s   | j |dddkS )NFr/   r   r2   r   r   r   r	   __contains__h   s    zElement.__contains__c                 C   s   | j |ddS )NTr/   r3   r   r   r   r	   r0   k   s    zElement.countc                 C   s
   | j | S r   r   )r   keyr   r   r	   __getitem__n   s    zElement.__getitem__c                 C   s   d| j  }| jD ]*\}}|r.|d||f 7 }q|d| 7 }q| jrt|d7 }|ddd | jD 7 }|d| j  7 }n|d	7 }|S )
Nz<%sz %s="%s"z %sz>
 c                 s   s   | ]}t |V  qd S r   r   .0cr   r   r	   	<genexpr>z       z"Element.__str__.<locals>.<genexpr>z
</%s>>)r   r   r   join)r   outputr5   r)   r   r   r	   __str__q   s    
zElement.__str__c                 C   s   t | S r   r8   r,   r   r   r	   __repr__   s    zElement.__repr__N)T)__name__
__module____qualname__r   r   r    r*   r-   r2   r4   r0   r6   rA   rB   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      s    zRootElement.__init__c                 C   s   d dd | jD S )Nr7   c                 s   s   | ]}t |V  qd S r   r8   r9   r   r   r	   r<      r=   z&RootElement.__str__.<locals>.<genexpr>)r?   r   r,   r   r   r	   rA      s    zRootElement.__str__)rC   rD   rE   r   rA   __classcell__r   r   rG   r	   r1      s   r1   c                   @   s   e Zd ZdS )HTMLParseErrorN)rC   rD   rE   r   r   r   r	   rJ      s   rJ   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>   trackhrmetaframebaseinputareabrembedcolimgparamlinksourceZspacerwbrc                    s"   t    t | _g | _i | _d S r   )rF   r   r1   root	open_tagselement_positionsr,   rG   r   r	   r      s    
zParser.__init__c                 C   s   t ||  d S r   )rJ   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)r]   r^   r#   ra   offset)r   positionr   r   r   r	   format_position   s    

zParser.format_positionc                 C   s   | j r| j d S | jS d S r   )r\   r[   r,   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   sL   dd |D }t ||}| j| || jvr:| j| |  | j|< d S )Nc              
   S   sB   g | ]:\}}|d kr6|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>)r?   r   r   split)r:   r   r)   r   r   r	   
<listcomp>   s   $z*Parser.handle_starttag.<locals>.<listcomp>)r   re   r   rg   r\   r^   r]   )r   ri   rj   r   r   r   r	   rf      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))r\   r`   rd   r   r   )r   ri   r   r   r   r	   rh      s    

zParser.handle_endtagc                 C   s   | j | d S r   )re   r   )r   datar   r   r	   handle_data   s    zParser.handle_data)NN)rC   rD   rE   rg   r   r`   rd   propertyre   rk   rf   rh   rp   rI   r   r   rG   r	   rK      s   
	
rK   c                 C   sR   t  }||  |  |j}|  t|jdkrNt|jd tsN|jd }|S )a  
    Take a string that contains *valid* 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   )	rK   feedcloser[   r    r&   r   r   r   )htmlparserdocumentr   r   r	   
parse_html   s    

rw   N)__doc__html.parserr   Zdjango.utils.regex_helperr   r   r
   r   r1   	ExceptionrJ   rK   rw   r   r   r   r	   <module>   s   sE