
    Evg"                         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 Z
d	 Z G d
 d          Z G d de          Z G d de          Z G d de          Z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                 8    t                               d|           S )N )ASCII_WHITESPACEsub)strings    M/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/django/test/html.pynormalize_whitespacer%   -   s    V,,,    c           	         g }| D ]\  }}|dk    rF|rDd                     t          d t                              |          D                                 }|t          v r|r||k    rd }n|d}|                    ||f           |S )Nclassr    c              3      K   | ]}||V  	d S N ).0values     r$   	<genexpr>z'normalize_attributes.<locals>.<genexpr>8   s'      QQ5QuQQQQQQr&    )joinsortedr!   splitBOOLEAN_ATTRIBUTESappend)
attributes
normalizednamer-   s       r$   normalize_attributesr8   1   s    J! ) )e7??u? HHQQ*:*@*@*G*GQQQQQ E %%% ETMM]E4-((((r&   c                   R    e Zd Zd Zd Zd Zd Zd ZddZd Z	d	 Z
d
 Zd Zd ZdS )Elementc                 J    || _         t          |          | _        g | _        d S r*   )r7   r1   r5   children)selfr7   r5   s      r$   __init__zElement.__init__G   s#    	 ,,r&   c                 
   t          |t                    rpt          |          }| j        rYt          | j        d         t                    r9| j        dxx         |z  cc<   t          | j        d                   | j        d<   d S n_| j        rXt          | j        d         t                    r8| j        d                                         r| j                                         |r| j                            |           d S d S N)
isinstancestrr%   r<   isspacepopr4   r=   elements     r$   r4   zElement.appendL   s   gs## 	$*733G} DM",=s!C!C b!!!W,!!!$8r9J$K$Kb!] 	$ $-+S11 $dmB6G6O6O6Q6Q $!!### 	*M  )))))	* 	*r&   c                    fd | j                    t          | j                   D ][\  }}t          |t                    r|                                | j         |<   7t          |d          r|                                 \d S )Nc                     | r_t          | d         t                    rD| d                                         | d<   | d         s|                                   |           } | S r@   )rB   rC   rstriprE   )r<   rstrip_last_elements    r$   rK   z-Element.finalize.<locals>.rstrip_last_element]   sg     =Jx|S99 ='|2244| =LLNNN228<<HOr&   finalize)r<   	enumeraterB   rC   striphasattrrL   )r=   ichildrK   s      @r$   rL   zElement.finalize\   s    	 	 	 	 	 	DM***!$-00 	! 	!HAu%%% !#(;;==a  
++ !   		! 	!r&   c                     t          |d          r| j        |j        k    rdS | j        |j        k    rdS | j        |j        k    S )Nr7   F)rO   r7   r5   r<   rF   s     r$   __eq__zElement.__eq__l   sL    w'' 	49+D+D5?g0005} 000r&   c                 <    t          | j        g| j        R           S r*   )hashr7   r5   r=   s    r$   __hash__zElement.__hash__s   s    TY111222r&   Tc                 4   t          |t                    s| |k    rdS t          |t                    r| j        |j        k    rdS d}d}| j        D ]}t          |t                    r8t          |t                    r"|r||                    |          z  }G||v r dS O||                    ||          z  }|s|r|c S t          |t                    rA|j        r:|j        |         }||k    r%|dz  }|t          |j                  k    r|dz  }d}d}|S )N   r   count)rB   rC   RootElementr<   r[   _countlen)r=   rG   r[   rP   elem_child_idxrQ   
elem_childs          r$   r]   zElement._countv   sa   '3'' 	DGOO1g{++ 	AQ0Q0Q1] 	+ 	+E %%% +gs++ ! !U[[111 E)) qq U\\'\777  HHH
 g{33 +8H +!(!1.!AJ!U**&!+)S1A-B-BBBFA-.N *+r&   c                 8    |                      |d          dk    S )NFrZ   r   r]   rF   s     r$   __contains__zElement.__contains__   s    {{7%{00144r&   c                 0    |                      |d          S )NTrZ   rb   rF   s     r$   r[   zElement.count   s    {{7${///r&   c                     | j         |         S r*   )r<   )r=   keys     r$   __getitem__zElement.__getitem__   s    }S!!r&   c                     d| j         z  }| j        D ]\  }}||d|d|dz  }|d|z  z  }| j        r:|dz  }|d                    d | j        D                       z  }|d	| j         z  z  }n|d
z  }|S )Nz<%sr    z=""z %sz>
r/   c                 ~    g | ]:}t          |t                    rt          j        |          nt          |          ;S r+   rB   rC   htmlescaper,   cs     r$   
<listcomp>z#Element.__str__.<locals>.<listcomp>   sI        '1C&8&8DDKNNNc!ff  r&   z
</%s>>)r7   r5   r<   r0   )r=   outputrf   r-   s       r$   __str__zElement.__str__   s    "/ 	& 	&JC UUU33%#+%= 
	eOFbgg !]    F i$)++FFcMFr&   c                      t          |           S r*   )rC   rV   s    r$   __repr__zElement.__repr__   s    4yyr&   N)T)__name__
__module____qualname__r>   r4   rL   rS   rW   r]   rc   r[   rg   rs   ru   r+   r&   r$   r:   r:   F   s          
* * * ! ! ! 1 1 13 3 3% % % %N5 5 50 0 0" " "  (    r&   r:   c                   $     e Zd Z fdZd Z xZS )r\   c                 L    t                                          d d           d S )Nr+   )superr>   r=   	__class__s    r$   r>   zRootElement.__init__   s#    r"""""r&   c                 J    d                     d | j        D                       S )Nr/   c                 ~    g | ]:}t          |t                    rt          j        |          nt          |          ;S r+   rk   rn   s     r$   rp   z'RootElement.__str__.<locals>.<listcomp>   s9    UUU!z!S11=T[^^^s1vvUUUr&   )r0   r<   rV   s    r$   rs   zRootElement.__str__   s+    wwUUt}UUU
 
 	
r&   )rv   rw   rx   r>   rs   __classcell__r}   s   @r$   r\   r\      sG        # # # # #
 
 
 
 
 
 
r&   r\   c                       e Zd ZdS )HTMLParseErrorN)rv   rw   rx   r+   r&   r$   r   r      s        Dr&   r   c                   Z     e Zd Z fdZd Zd
dZed             Zd Zd Z	d Z
d	 Z xZS )Parserc                     t                                                       t                      | _        g | _        i | _        d S r*   )r{   r>   r\   root	open_tagselement_positionsr|   s    r$   r>   zParser.__init__   s9    MM	!#r&   c                 F    t          ||                                           r*   )r   getpos)r=   msgs     r$   errorzParser.error   s    S$++--000r&   Nc                     |s|r| j         |         }||                                 }t          |d          r|j        |j        f}d|z  S )NlinenozLine %d, Column %d)r   r   rO   r   offset)r=   positionrG   s      r$   format_positionzParser.format_position   s\     	7G 	7-g6H{{}}H8X&& 	87H#h..r&   c                 8    | j         r| j         d         S | j        S r@   )r   r   rV   s    r$   currentzParser.current   s!    > 	>"%%9r&   c                 r    |                      ||           |t          vr|                     |           d S d S r*   )handle_starttagr   handle_endtag)r=   tagattrss      r$   handle_startendtagzParser.handle_startendtag   sE    S%(((m##s##### $#r&   c                     t          |          }t          ||          }| j                            |           |t          vr| j                            |           |                                 | j        |<   d S r*   )r8   r:   r   r4   r   r   r   r   )r=   r   r   rG   s       r$   r   zParser.handle_starttag   sp    $U++#u%%G$$$m##N!!'****.++--w'''r&   c                 n   | j         s.|                     d|d|                                 d           | j                                         }|j        |k    r[| j         s.|                     d|d|                                 d           | j                                         }|j        |k    Yd S d S )NzUnexpected end tag `z` ())r   r   r   rE   r7   )r=   r   rG   s      r$   r   zParser.handle_endtag   s    ~ 	WJJJd>R>R>T>T>T>TUVVV.$$&&lc!!> 


69cc4;O;O;Q;Q;Q;QR   n((**G lc!!!!!!r&   c                 :    | j                             |           d S r*   )r   r4   )r=   datas     r$   handle_datazParser.handle_data   s    D!!!!!r&   )NN)rv   rw   rx   r>   r   r   propertyr   r   r   r   r   r   r   s   @r$   r   r      s        $ $ $ $ $1 1 1/ / / /   X$ $ $
8 8 8	+ 	+ 	+" " " " " " "r&   r   c                 4   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.
    rY   r   )	r   feedcloser   rL   r^   r<   rB   rC   )rl   parserdocuments      r$   
parse_htmlr     s     XXF
KK
LLNNN{H
8"":h6G6JC+P+P"$Q'Or&   )__doc__rl   html.parserr   django.utils.htmlr   django.utils.regex_helperr   r!   r3   r%   r8   r:   r\   	Exceptionr   r   r   r+   r&   r$   <module>r      sV   ! !  " " " " " " + + + + + + 6 6 6 6 6 6
 $#O44    <- - -  *u u u u u u u up
 
 
 
 
' 
 
 
	 	 	 	 	Y 	 	 	3" 3" 3" 3" 3"Z 3" 3" 3"l    r&   