o
    [h"                     @   s   d Z ddlZddlm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)VOID_ELEMENTS)_lazy_re_compilez[\t\n\f\r ]+>   Z
novalidateZmultiplerequiredcheckedZplaysinlineasyncselectedZautoplayZcontrolsZ	truespeedZformnovalidateZnomoduleZallowfullscreenzdefer readonlyloopdefaultZ	autofocusZmutedreverseddisabledopenZ	itemscopeZismapZhiddenc                 C   s   t d| S )N )ASCII_WHITESPACEsub)string r   w/home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/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>8   s    z'normalize_attributes.<locals>.<genexpr> )joinsortedr   splitBOOLEAN_ATTRIBUTESappend)
attributes
normalizednamer   r   r   r   normalize_attributes1   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__G   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    L   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   r4   ]   s   z-Element.finalize.<locals>.rstrip_last_elementfinalize)r&   	enumerater+   r,   striphasattrr5   )r'   ichildr   r3   r   r5   \   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)r8   r#   r!   r&   r/   r   r   r   __eq__l   s
   zElement.__eq__c                 C   s   t | jg| jR S r   )hashr#   r!   r'   r   r   r   __hash__s   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&   rA   _countlen)r'   r0   rA   r9   Zelem_child_idxr:   Z
elem_childr   r   r   rC   v   s8   



zElement._countc                 C   s   | j |dddkS )NFr@   r   rC   r/   r   r   r   __contains__      zElement.__contains__c                 C   s   | j |ddS )NTr@   rE   r/   r   r   r   rA         zElement.countc                 C   s
   | j | S r   r2   )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   r+   r,   htmlescaper   cr   r   r   
<listcomp>   s    z#Element.__str__.<locals>.<listcomp>z
</%s>>)r#   r!   r&   r   )r'   outputrI   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    r5   r;   r>   rC   rF   rA   rJ   rT   rU   r   r   r   r   r%   F   s    
'r%   c                       s$   e Zd Z fddZdd Z  ZS )rB   c                    s   t  d d d S )Nr   )superr(   r=   	__class__r   r   r(      rG   zRootElement.__init__c                 C   s   d dd | jD S )Nr   c                 S   rK   r   rL   rO   r   r   r   rQ      s   ( z'RootElement.__str__.<locals>.<listcomp>)r   r&   r=   r   r   r   rT      s   zRootElement.__str__)rV   rW   rX   r(   rT   __classcell__r   r   rZ   r   rB      s    rB   c                   @   s   e Zd ZdS )HTMLParseErrorN)rV   rW   rX   r   r   r   r   r]      s    r]   c                       sZ   e Z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 )Parserc                    s"   t    t | _g | _i | _d S r   )rY   r(   rB   root	open_tagselement_positionsr=   rZ   r   r   r(      s   

zParser.__init__c                 C   s   t ||  r   )r]   getpos)r'   msgr   r   r   error   rH   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)ra   rb   r8   re   offset)r'   positionr0   r   r   r   format_position   s   

zParser.format_positionc                 C   s   | j r| j d S | jS r)   )r`   r_   r=   r   r   r   current   s   
zParser.currentc                 C   s&   |  || |tvr| | d S d S r   )handle_starttagr   handle_endtag)r'   tagattrsr   r   r   handle_startendtag   s   zParser.handle_startendtagc                 C   sD   t |}t||}| j| |tvr| j| |  | j|< d S r   )r$   r%   ri   r    r   r`   rb   ra   )r'   rl   rm   r0   r   r   r   rj      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`   rd   rh   r.   r#   )r'   rl   r0   r   r   r   rk      s   


zParser.handle_endtagc                 C   s   | j | d S r   )ri   r    )r'   datar   r   r   handle_data   s   zParser.handle_data)NN)rV   rW   rX   r(   rd   rh   propertyri   rn   rj   rk   rp   r\   r   r   rZ   r   r^      s    
	
r^   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   )	r^   feedcloser_   r5   rD   r&   r+   r,   )rM   parserZdocumentr   r   r   
parse_html  s   

ru   )__doc__rM   html.parserr   Zdjango.utils.htmlr   Zdjango.utils.regex_helperr   r   r   r   r$   r%   rB   	Exceptionr]   r^   ru   r   r   r   r   <module>   s    x
6