U
    e#                     @   s   d Z ddlZddlmZ ddlmZ edZdddd	d
ddddddddddddddddddddh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 ]+ZallowfullscreenasyncZ	autofocusZautoplaycheckedZcontrolsdefaultzdefer disabledZformnovalidateZhiddenZismapZ	itemscopeloopZmultipleZmutedZnomoduleZ
novalidateopenZplaysinlinereadonlyrequiredreversedselectedZ	truespeedc                 C   s   t d| S )N )ASCII_WHITESPACEsub)string r   F/var/www/html/htmlvenv/lib/python3.8/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krT|rN||kr`d }n|d kr`d}|||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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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 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f| j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||k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)r*   r+   RootElementr%   r@   _countlen)r&   r/   r@   r8   Zelem_child_idxr9   Z
elem_childr   r   r   rB   t   s2    



zElement._countc                 C   s   | j |dddkS )NFr?   r   rB   r.   r   r   r   __contains__   s    zElement.__contains__c                 C   s   | j |ddS )NTr?   rD   r.   r   r   r   r@      s    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 k	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   r*   r+   htmlescaper   cr   r   r   
<listcomp>   s   z#Element.__str__.<locals>.<listcomp>z
</%s>>)r"   r    r%   r   )r&   outputrF   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@   rG   rP   rQ   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'      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   rH   rK   r   r   r   rM      s     z'RootElement.__str__.<locals>.<listcomp>)r   r%   r<   r   r   r   rP      s    zRootElement.__str__)rR   rS   rT   r'   rP   __classcell__r   r   rV   r   rA      s   rA   c                   @   s   e Zd ZdS )HTMLParseErrorN)rR   rS   rT   r   r   r   r   rY      s   rY   c                       s~   e Zd Zddddddddd	d
ddddddh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 )#ParserZareabasebrcolembedhrZimginputlinkmetaparamsourcetrackZwbrframeZspacerc                    s"   t    t | _g | _i | _d S r   )rU   r'   rA   root	open_tagselement_positionsr<   rV   r   r   r'      s    
zParser.__init__c                 C   s   t ||  d S r   )rY   getpos)r&   msgr   r   r   error   s    zParser.errorNc                 C   s@   |s|r| j | }|d kr"|  }t|dr8|j|jf}d| S )NlinenozLine %d, Column %d)ri   rj   r7   rm   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(   )rh   rg   r<   r   r   r   current   s    
zParser.currentc                 C   s$   |  || || jk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kr4| j| |  | j|< d S r   )r#   r$   rq   r   rs   rh   rj   ri   )r&   ru   rv   r/   r   r   r   rr      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))rh   rl   rp   r-   r"   )r&   ru   r/   r   r   r   rt     s    

zParser.handle_endtagc                 C   s   | j | d S r   )rq   r   )r&   datar   r   r   handle_data  s    zParser.handle_data)NN)rR   rS   rT   rs   r'   rl   rp   propertyrq   rw   rr   rt   ry   rX   r   r   rV   r   rZ      s4   
	
rZ   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.
    r>   r   )	rZ   feedcloserg   r4   rC   r%   r*   r+   )rI   parserZdocumentr   r   r   
parse_html  s    

r~   )__doc__rI   html.parserr   Zdjango.utils.regex_helperr   r   r   r   r#   r$   rA   	ExceptionrY   rZ   r~   r   r   r   r   <module>   sJ   x
K