o
    Ti#                     @   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 ]+>   selectedzdefer ZhiddenasyncopenZcontrolsZ	truespeedZmutedreadonlyZallowfullscreenZ	itemscopeZformnovalidateZismapcheckeddefaultdisabledloopZautoplayZmultipleZplaysinlinereversedZnomoduleZ	autofocusrequiredZ
novalidatec                 C   s   t d| S )N )ASCII_WHITESPACEsub)string r   P/var/www/html/evchargy.com/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>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(   )r*   r+   rstripr-   r%   rstrip_last_elementr   r   r3   [   s   z-Element.finalize.<locals>.rstrip_last_elementfinalize)r%   	enumerater*   r+   striphasattrr4   )r&   ichildr   r2   r   r4   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)r7   r"   r    r%   r.   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)r*   r+   RootElementr%   r@   _countlen)r&   r/   r@   r8   Zelem_child_idxr9   Z
elem_childr   r   r   rB   t   s8   



zElement._countc                 C   s   | j |dddkS )NFr?   r   rB   r.   r   r   r   __contains__      zElement.__contains__c                 C   s   | j |ddS )NTr?   rD   r.   r   r   r   r@         zElement.countc                 C   s
   | j | S r   r1   )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&   outputrH   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   r4   r:   r=   rB   rE   r@   rI   rS   rT   r   r   r   r   r$   D   s    
'r$   c                       s$   e Zd Z fddZdd Z  ZS )rA   c                    s   t  d d d S )Nr   )superr'   r<   	__class__r   r   r'      rF   zRootElement.__init__c                 C   s   d dd | jD S )Nr   c                 S   rJ   r   rK   rN   r   r   r   rP      s   ( z'RootElement.__str__.<locals>.<listcomp>)r   r%   r<   r   r   r   rS      s   zRootElement.__str__)rU   rV   rW   r'   rS   __classcell__r   r   rY   r   rA      s    rA   c                   @   s   e Zd ZdS )HTMLParseErrorN)rU   rV   rW   r   r   r   r   r\      s    r\   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>   paramsourceZareaframetrackZembedmetaZspacerZwbrinputbrhrZimgbasecollinkc                    s"   t    t | _g | _i | _d S r   )rX   r'   rA   root	open_tagselement_positionsr<   rY   r   r   r'      s   

zParser.__init__c                 C   s   t ||  r   )r\   getpos)r&   msgr   r   r   error   rG   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)rk   rl   r7   ro   offset)r&   positionr/   r   r   r   format_position   s   

zParser.format_positionc                 C   s   | j r| j d S | jS r(   )rj   ri   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   sF   t |}t||}| j| || jvr| j| |  | j|< d S r   )r#   r$   rs   r   ru   rj   rl   rk   )r&   rw   rx   r/   r   r   r   rt      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))rj   rn   rr   r-   r"   )r&   rw   r/   r   r   r   rv     s   


zParser.handle_endtagc                 C   s   | j | d S r   )rs   r   )r&   datar   r   r   handle_data  s   zParser.handle_data)NN)rU   rV   rW   ru   r'   rn   rr   propertyrs   ry   rt   rv   r{   r[   r   r   rY   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closeri   r4   rC   r%   r*   r+   )rL   parserZdocumentr   r   r   
parse_html  s   

r   )__doc__rL   html.parserr   Zdjango.utils.regex_helperr   r   r   r   r#   r$   rA   	Exceptionr\   r]   r   r   r   r   r   <module>   s    x
K