
    Hwg#                         d Z ddl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)_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    G/var/www/horilla/myenv/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>6   s     Q5uQs    )joinsortedr    splitBOOLEAN_ATTRIBUTESappend)
attributes
normalizednamer,   s       r#   normalize_attributesr7   /   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)   )r6   r0   r4   children)selfr6   r4   s      r#   __init__zElement.__init__E   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popr3   r<   elements     r#   r3   zElement.appendJ   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?   )rA   rB   rstriprD   )r;   rstrip_last_elements    r#   rJ   z-Element.finalize.<locals>.rstrip_last_element[   sH    Jx|S9'|224|LLN28<HOr%   finalize)r;   	enumeraterA   rB   striphasattrrK   )r<   ichildrJ   s      @r#   rK   zElement.finalizeZ   sd    	 	DMM*!$--0 	!HAu%%#(;;=a 
+ 		!r%   c                     t        |d      r| j                  |j                  k7  ry| j                  |j                  k7  ry| j                  |j                  k(  S )Nr6   F)rN   r6   r4   r;   rE   s     r#   __eq__zElement.__eq__j   sH    w'499+D??g000}} 0 000r%   c                 H    t        | j                  g| j                        S r)   )hashr6   r4   r<   s    r#   __hash__zElement.__hash__q   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)rA   rB   RootElementr;   rZ   _countlen)r<   rF   rZ   rO   elem_child_idxrP   
elem_childs          r#   r\   zElement._countt   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 )NFrY   r   r\   rE   s     r#   __contains__zElement.__contains__   s    {{7%{0144r%   c                 (    | j                  |d      S )NTrY   ra   rE   s     r#   rZ   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>>)r6   r4   r;   r/   rA   rB   htmlescape)r<   outputre   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)   )rB   rU   s    r#   __repr__zElement.__repr__   s    4yr%   N)T)__name__
__module____qualname__r=   r3   rK   rR   rV   r\   rb   rZ   rf   rn   rp   r*   r%   r#   r9   r9   D   s:    
* ! 13%N50"(r%   r9   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.   )r/   r;   rA   rB   rj   rk   )r<   rm   s     r#   rn   zRootElement.__str__   sB    wwGK}}U!z!S1T[[^s1v=U
 	
Us   7A)rq   rr   rs   r=   rn   __classcell__rx   s   @r#   r[   r[      s    #
r%   r[   c                       e Zd Zy)HTMLParseErrorN)rq   rr   rs   r*   r%   r#   r}   r}      s    r%   r}   c                   \     e Zd Zh dZ fdZd Zd
dZed        Zd Z	d Z
d Zd	 Z xZS )Parser>   brhrcolimgwbrareabaselinkmetaembedframeinputparamtracksourcespacerc                 \    t         |           t               | _        g | _        i | _        y r)   )rv   r=   r[   root	open_tagselement_positionsrw   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   rN   r   offset)r<   positionrF   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   rU   s    r#   currentzParser.current   s"    >>>>"%%99r%   c                 h    | j                  ||       || j                  vr| j                  |       y y r)   )handle_starttagSELF_CLOSING_TAGShandle_endtag)r<   tagattrss      r#   handle_startendtagzParser.handle_startendtag   s3    S%(d,,,s# -r%   c                     t        |      }t        ||      }| j                  j                  |       || j                  vr| j
                  j                  |       | j                         | j                  |<   y r)   )r7   r9   r   r3   r   r   r   r   )r<   r   r   rF   s       r#   r   zParser.handle_starttag   s`    $U+#u%G$d,,,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   rD   r6   )r<   r   rF   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   r3   )r<   datas     r#   handle_datazParser.handle_data  s    D!r%   )NN)rq   rr   rs   r   r=   r   r   propertyr   r   r   r   r   rz   r{   s   @r#   r   r      sB    ($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.
    rX   r   )	r   feedcloser   rK   r]   r;   rA   rB   )rj   parserdocuments      r#   
parse_htmlr     sq     XF
KK
LLN{{H
8":h6G6G6JC+P$$Q'Or%   )__doc__rj   html.parserr   django.utils.regex_helperr   r    r2   r$   r7   r9   r[   	Exceptionr}   r   r   r*   r%   r#   <module>r      si    !  " 6
 $O4  <-*u up
' 
	Y 	H"Z H"Vr%   