
    g"                         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y)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                 .    t         j                  d|       S )N )ASCII_WHITESPACEsub)strings    h/var/www/python.vincentserveurtest.ovh/public_html/venv/lib/python3.12/site-packages/django/test/html.pynormalize_whitespacer%   -   s    V,,    c           	          g }| D ]i  \  }}|dk(  r6|r4dj                  t        d t        j                  |      D                    }|t        v r
|r||k(  rd }n|d}|j                  ||f       k |S )Nclassr    c              3   &   K   | ]	  }|s|  y wN ).0values     r$   	<genexpr>z'normalize_attributes.<locals>.<genexpr>8   s     Q*G5u*Gs    )joinsortedr!   splitBOOLEAN_ATTRIBUTESappend)
attributes
normalizednamer-   s       r$   normalize_attributesr8   1   s    J!e7?u HHQ*:*@*@*GQQE %%ETM]E4-( "  r&   c                   P    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y)Elementc                 @    || _         t        |      | _        g | _        y r*   )r7   r1   r5   children)selfr7   r5   s      r$   __init__zElement.__init__G   s    	 ,r&   c                    t        |t              rqt        |      }| j                  rt        | j                  d   t              r| j                  dxx   |z  cc<   t        | j                  d         | j                  d<   y | j                  rTt        | j                  d   t              r7| j                  d   j	                         r| j                  j                          |r| j                  j                  |       y y N)
isinstancestrr%   r<   isspacepopr4   r=   elements     r$   r4   zElement.appendL   s    gs#*73G}}DMM",=s!Cb!W,!$8r9J$Kb!]] $--+S1dmmB6G6O6O6Q!!#MM  ) r&   c                    fd | j                          t        | j                         D ]P  \  }}t        |t              r|j	                         | j                   |<   4t        |d      sA|j                          R y )Nc                     | rFt        | d   t              r3| d   j                         | d<   | d   s| j                           |       } | S r@   )rB   rC   rstriprE   )r<   rstrip_last_elements    r$   rK   z-Element.finalize.<locals>.rstrip_last_element]   sH    Jx|S9'|224|LLN28<HOr&   finalize)r<   	enumeraterB   rC   striphasattrrL   )r=   ichildrK   s      @r$   rL   zElement.finalize\   s_    	 	DMM*!$--0HAu%%#(;;=a 
+ 	 1r&   c                     t        |d      r| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k(  S )Nr7   F)rO   r7   r5   r<   rF   s     r$   __eq__zElement.__eq__l   sH    w'499+D??g000}} 0 000r&   c                 H    t        | j                  g| j                        S r*   )hashr7   r5   r=   s    r$   __hash__zElement.__hash__s   s    TYY1122r&   c                    t        |t              s| |k(  ryt        |t              r| j                  |j                  k(  ryd}d}| j                  D ]  }t        |t              r/t        |t              s$|r||j	                  |      z  };||v s@ y||j                  ||      z  }|s|r|c S t        |t              sq|j                  s~|j                  |   }||k(  r&|dz  }|t        |j                        k(  s|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   s
   '3'DGOg{+AQAQ0Q]]E %%gs+U[[11 E)  U\\'\77H
 g{38H8H!(!1!1.!AJ!U*&!+)S1A1A-BBFA-.N *+; #< r&   c                 .    | j                  |d      dkD  S )NFrZ   r   r]   rF   s     r$   __contains__zElement.__contains__   s    {{7%{0144r&   c                 (    | j                  |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                  rs|dz  }|dj                  | j                  D cg c]2  }t	        |t
              rt        j                  |      n
t        |      4 c}      z  }|d| j                   z  z  }|S |d	z  }|S c c}w )
Nz<%sr    z=""z %sz>
r/   z
</%s>>)r7   r5   r<   r0   rB   rC   htmlescape)r=   outputrf   r-   cs        r$   __str__zElement.__str__   s    "//JC U33%#+%	 *
 ==eOFbgg "]]* '1C&8DKKNc!fD* F i$))++F  cMFs   &7C
c                     t        |       S r*   )rC   rV   s    r$   __repr__zElement.__repr__   s    4yr&   N)T)__name__
__module____qualname__r>   r4   rL   rS   rW   r]   rc   r[   rg   ro   rq   r+   r&   r$   r:   r:   F   s:    
* ! 13%N50"(r&   r:   c                   $     e Zd Z fdZd Z xZS )r\   c                 &    t         |   d d       y )Nr+   )superr>   r=   	__class__s    r$   r>   zRootElement.__init__   s    r"r&   c           	          dj                  | j                  D cg c]2  }t        |t              rt	        j
                  |      n
t        |      4 c}      S c c}w )Nr/   )r0   r<   rB   rC   rk   rl   )r=   rn   s     r$   ro   zRootElement.__str__   sF    wwGK}}U}!z!S1T[[^s1v=}U
 	
Us   7A)rr   rs   rt   r>   ro   __classcell__ry   s   @r$   r\   r\      s    #
r&   r\   c                       e Zd Zy)HTMLParseErrorN)rr   rs   rt   r+   r&   r$   r~   r~      s    r&   r~   c                   T     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 | _        y r*   )rw   r>   r\   root	open_tagselement_positionsrx   s    r$   r>   zParser.__init__   s&    M	!#r&   c                 6    t        || j                               r*   )r~   getpos)r=   msgs     r$   errorzParser.error   s    S$++-00r&   c                     |s|r| j                   |   }|| 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   sO    G--g6H{{}H8X&7H#h..r&   c                 P    | j                   r| j                   d   S | j                  S r@   )r   r   rV   s    r$   currentzParser.current   s"    >>>>"%%99r&   c                 \    | j                  ||       |t        vr| j                  |       y y r*   )handle_starttagr   handle_endtag)r=   tagattrss      r$   handle_startendtagzParser.handle_startendtag   s-    S%(m#s# $r&   c                     t        |      }t        ||      }| j                  j                  |       |t        vr| j
                  j                  |       | j                         | j                  |<   y r*   )r8   r:   r   r4   r   r   r   r   )r=   r   r   rG   s       r$   r   zParser.handle_starttag   sZ    $U+#u%G$m#NN!!'**.++-w'r&   c                 t   | j                   s&| j                  d|d| j                         d       | j                   j                         }|j                  |k7  r]| j                   s&| j                  d|d| j                         d       | j                   j                         }|j                  |k7  r\y y )NzUnexpected end tag `z` ())r   r   r   rE   r7   )r=   r   rG   s      r$   r   zParser.handle_endtag   s    ~~JJd>R>R>TUV..$$&llc!>>

694;O;O;QR nn((*G llc!r&   c                 :    | j                   j                  |       y r*   )r   r4   )r=   datas     r$   handle_datazParser.handle_data   s    D!r&   )NN)rr   rs   rt   r>   r   r   propertyr   r   r   r   r   r{   r|   s   @r$   r   r      s:    $1/  $
8	+"r&   r   c                    t               }|j                  |        |j                          |j                  }|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   )rk   parserdocuments      r$   
parse_htmlr     sq     XF
KK
LLN{{H
8":h6G6G6JC+P$$Q'Or&   )__doc__rk   html.parserr   django.utils.htmlr   django.utils.regex_helperr   r!   r3   r%   r8   r:   r\   	Exceptionr~   r   r   r+   r&   r$   <module>r      sj    !  " + 6
 $O4  <-*u up
' 
	Y 	3"Z 3"lr&   