
    h                         d Z ddlmZ ddlmZ  e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.    )
HTMLParser)_lazy_re_compilez[\t\n\f\r ]+c                 .    t         j                  d|       S )N )ASCII_WHITESPACEsub)strings    S/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/test/html.pynormalize_whitespacer      s    V,,    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 N)namesorted
attributeschildren)selfr   r   s      r
   __init__zElement.__init__   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popappendr   elements     r
   r   zElement.append   s    gs#*73G}}dmmB/5MM"%0%(<T]]2=N(ODMM"%]] $--+S1==$,,.MM%%'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   )r   r   rstripr   )r   rstrip_last_elements    r
   r$   z-Element.finalize.<locals>.rstrip_last_element*   sI    hrlC0#+B<#6#6#8HRL#B< #6x#@Or   finalize)r   	enumerater   r   striphasattrr%   )r   ichildr$   s      @r
   r%   zElement.finalize)   sd    	 	DMM*!$--0 	!HAu%%#(;;=a 
+ 		!r   c                    t        |d      r| j                  |j                  k7  ryt        | j                        t        |j                        k7  ry| j                  |j                  k7  r[t	        t        | j                              D ]:  }| j                  |   \  }}|j                  |   \  }}||}||}||k7  s||k7  s: y | j
                  |j
                  k(  S )Nr   F)r(   r   lenr   ranger   )r   r    r)   attrvalue
other_attrother_values          r
   __eq__zElement.__eq__:   s    w'499+Dt3w'9'9#::??g000 3t/0 !"ooa0e*1*<*<Q*?'
K= E&",K:%+)= ! }} 0 000r   c                 H    t        | j                  g| j                        S r   )hashr   r   r   s    r
   __hash__zElement.__hash__N   s    TYY1122r   c                 h   t        |t              s| |k(  ryt        |t              r| j                  |j                  k(  ryd}| j                  D ]`  }t        |t              r/t        |t              s$|r||j	                  |      z  };||v s@ y||j                  ||      z  }|r[|s^|c S  |S )N   r   count)r   r   RootElementr   r:   _count)r   r    r:   r)   r*   s        r
   r<   zElement._countQ   s    '3'wg{+}} 0 00]] 	E %%gs+U[[11 E) U\\'\77H	 r   c                 .    | j                  |d      dkD  S )NFr9   r   r<   r   s     r
   __contains__zElement.__contains__h   s    {{7%{0144r   c                 (    | j                  |d      S )NTr9   r>   r   s     r
   r:   zElement.countk   s    {{7${//r   c                      | j                   |   S r   )r   )r   keys     r
   __getitem__zElement.__getitem__n   s    }}S!!r   c                    d| j                   z  }| j                  D ]  \  }}|r|d|d|dz  }|d|z  z  } | j                  r>|dz  }|dj                  d | j                  D              z  }|d	| j                   z  z  }|S |d
z  }|S )Nz<%sr   z=""z %sz>
 c              3   2   K   | ]  }t        |        y wr   r   .0cs     r
   	<genexpr>z"Element.__str__.<locals>.<genexpr>z   s     <c!f<   z
</%s>>)r   r   r   join)r   outputrB   r/   s       r
   __str__zElement.__str__q   s    "// 	&JCU33%#+%		&
 ==eOFbgg<dmm<<<Fi$))++F  cMFr   c                     t        |       S r   rH   r5   s    r
   __repr__zElement.__repr__   s    4yr   N)T)__name__
__module____qualname__r   r   r%   r2   r6   r<   r?   r:   rC   rQ   rS    r   r
   r   r      s9    
*$!"1(3.50"r   r   c                   $     e Zd Z fdZd Z xZS )r;   c                 &    t         |   d d       y )NrW   )superr   r   	__class__s    r
   r   zRootElement.__init__   s    r"r   c                 F    dj                  d | j                  D              S )NrF   c              3   2   K   | ]  }t        |        y wr   rH   rI   s     r
   rL   z&RootElement.__str__.<locals>.<genexpr>   s     5!s1v5rM   )rO   r   r5   s    r
   rQ   zRootElement.__str__   s    ww5t}}555r   )rT   rU   rV   r   rQ   __classcell__r\   s   @r
   r;   r;      s    #6r   r;   c                       e Zd Zy)HTMLParseErrorN)rT   rU   rV   rW   r   r
   rb   rb      s    r   rb   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   )rZ   r   r;   root	open_tagselement_positionsr[   s    r
   r   zParser.__init__   s&    M	!#r   c                 6    t        || j                               r   )rb   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)rx   rz   r(   r~   offset)r   positionr    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   )rw   rv   r5   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                    |D cg c]D  \  }}|dk(  r6|dj                  t        d t        j                  |      D                    fn||fF }}}t	        ||      }| j
                  j                  |       || j                  vr| j                  j                  |       | j                         | j                  |<   y c c}}w )Nclassr   c              3   &   K   | ]	  }|s|  y wr   rW   )rJ   r/   s     r
   rL   z)Parser.handle_starttag.<locals>.<genexpr>   s     "]UW\5"]s   )rO   r   r   splitr   r   r   r   rw   rz   rx   )r   r   r   r   r/   r    s         r
   r   zParser.handle_starttag   s      %	
 e w 388F"]6F6L6LU6S"]]^_
 
 #u%G$d,,,NN!!'**.++-w'
s   A	C 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` ())rw   r|   r   r   r   )r   r   r    s      r
   r   zParser.handle_endtag   s    ~~JJT))+- ...$$&llc!>>

--/1 2nn((*G	 llc!r   c                 :    | j                   j                  |       y r   )r   r   )r   datas     r
   handle_datazParser.handle_data   s    D!r   )NN)rT   rU   rV   r   r   r|   r   propertyr   r   r   r   r   r_   r`   s   @r
   rd   rd      sB    $1/  $
8	+"r   rd   c                    t               }|j                  |        |j                          |j                  }|j	                          t        |j                        dk(  r,t        |j                  d   t              s|j                  d   }|S )a  
    Take a string that contains *valid* 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.
    r8   r   )	rd   feedcloserv   r%   r,   r   r   r   )htmlparserdocuments      r
   
parse_htmlr      sr     XF
KK
LLN{{H
8"(++A.4((+HOr   N)__doc__html.parserr   django.utils.regex_helperr   r   r   r   r;   	Exceptionrb   rd   r   rW   r   r
   <module>r      sY    ! " 6
 $O4 -p pf6' 6	Y 	B"Z B"Jr   