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 ]+>   defer loopopenasyncismapmutedhiddencheckeddefaultautoplaycontrolsdisabledmultiplenomodulereadonlyrequiredreversedselected	autofocus	itemscope	truespeed
novalidateplaysinlineformnovalidateallowfullscreenc                 C   s   t d| S )N )ASCII_WHITESPACEsub)string r"   H/var/www/ecommerce/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   r3   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&   )r2   r,   r0   children)selfr2   r0   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$   r5   isspacepopr/   r6   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 r8   )r:   r;   rstripr=   r5   rstrip_last_elementr"   r#   rC   ]   s   z-Element.finalize.<locals>.rstrip_last_elementfinalize)r5   	enumerater:   r;   striphasattrrD   )r6   ichildr"   rB   r#   rD   \   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 )Nr2   F)rG   r2   r0   r5   r>   r"   r"   r#   __eq__l   s
   zElement.__eq__c                 C   s   t | jg| jR S r&   )hashr2   r0   r6   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;   RootElementr5   rP   _countlen)r6   r?   rP   rH   elem_child_idxrI   
elem_childr"   r"   r#   rR   v   s8   



zElement._countc                 C   s   | j |dddkS )NFrO   r   rR   r>   r"   r"   r#   __contains__      zElement.__contains__c                 C   s   | j |ddS )NTrO   rV   r>   r"   r"   r#   rP         zElement.countc                 C   s
   | j | S r&   rA   )r6   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>>)r2   r0   r5   r+   )r6   outputrZ   r(   r"   r"   r#   __str__   s    
zElement.__str__c                 C   s   t | S r&   )r;   rL   r"   r"   r#   __repr__   s   zElement.__repr__N)T)__name__
__module____qualname__r7   r/   rD   rJ   rM   rR   rW   rP   r[   re   rf   r"   r"   r"   r#   r4   F   s    
'r4   c                       s$   e Zd Z fddZdd Z  ZS )rQ   c                    s   t  d d d S )Nr"   )superr7   rL   	__class__r"   r#   r7      rX   zRootElement.__init__c                 C   s   d dd | jD S )Nr*   c                 S   r\   r"   r]   r`   r"   r"   r#   rb      s   ( z'RootElement.__str__.<locals>.<listcomp>)r+   r5   rL   r"   r"   r#   re      s   zRootElement.__str__)rg   rh   ri   r7   re   __classcell__r"   r"   rk   r#   rQ      s    rQ   c                   @   s   e Zd ZdS )HTMLParseErrorN)rg   rh   ri   r"   r"   r"   r#   rn      s    rn   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&   )rj   r7   rQ   root	open_tagselement_positionsrL   rk   r"   r#   r7      s   

zParser.__init__c                 C   s   t ||  r&   )rn   getpos)r6   msgr"   r"   r#   error   rY   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)rr   rs   rG   rv   offset)r6   positionr?   r"   r"   r#   format_position   s   

zParser.format_positionc                 C   s   | j r| j d S | jS r8   )rq   rp   rL   r"   r"   r#   current   s   
zParser.currentc                 C   s&   |  || |tvr| | d S d S r&   )handle_starttagr   handle_endtag)r6   tagattrsr"   r"   r#   handle_startendtag   s   zParser.handle_startendtagc                 C   sD   t |}t||}| j| |tvr| j| |  | j|< d S r&   )r3   r4   rz   r/   r   rq   rs   rr   )r6   r}   r~   r?   r"   r"   r#   r{      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))rq   ru   ry   r=   r2   )r6   r}   r?   r"   r"   r#   r|      s   


zParser.handle_endtagc                 C   s   | j | d S r&   )rz   r/   )r6   datar"   r"   r#   handle_data   s   zParser.handle_data)NN)rg   rh   ri   r7   ru   ry   propertyrz   r   r{   r|   r   rm   r"   r"   rk   r#   ro      s    
	
ro   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.
    rN   r   )	ro   feedcloserp   rD   rS   r5   r:   r;   )r^   parserdocumentr"   r"   r#   
parse_html  s   

r   )__doc__r^   html.parserr   django.utils.htmlr   django.utils.regex_helperr   r   r.   r$   r3   r4   rQ   	Exceptionrn   ro   r   r"   r"   r"   r#   <module>   s    x
6