
    h"                         S r SSKrSSKJr  SSKJr  SSKJr  \" S5      r1 Skr	S r
S	 r " S
 S5      r " S S\5      r " S S\5      r " S S\5      rS rg)zCompare two HTML documents.    N)
HTMLParser)VOID_ELEMENTS)_lazy_re_compilez[\t\n\f\r ]+>   loopopenasyncismapmutedhiddencheckeddefaultautoplaycontrolsdisabledmultiplenomodulereadonlyrequiredreversedselected	autofocus	itemscope	truespeed
novalidateplaysinlineformnovalidateallowfullscreendefer c                 .    [         R                  SU 5      $ )N )ASCII_WHITESPACEsub)strings    B/var/www/html/env/lib/python3.13/site-packages/django/test/html.pynormalize_whitespacer%   -   s    V,,    c           	         / nU  Hv  u  p#US:X  a;  U(       a4  SR                  [        S [        R                  U5       5       5      5      nU[        ;   a  U(       a  X2:X  a  S nOUc  SnUR                  X#45        Mx     U$ )Nclassr    c              3   6   #    U  H  o(       d  M  Uv   M     g 7fN ).0values     r$   	<genexpr>'normalize_attributes.<locals>.<genexpr>8   s     Q*G5uu*Gs   
	 )joinsortedr!   splitBOOLEAN_ATTRIBUTESappend)
attributes
normalizednamer-   s       r$   normalize_attributesr9   1   s    J!7?u HHQ*:*@*@*GQQE %%EM]E4-( "  r&   c                   Z    \ rS rSrS rS rS rS rS rSS jr	S r
S	 rS
 rS rS rSrg)ElementF   c                 >    Xl         [        U5      U l        / U l        g r*   )r8   r2   r6   children)selfr8   r6   s      r$   __init__Element.__init__G   s    	 ,r&   c                 J   [        U[        5      (       a|  [        U5      nU R                  (       a_  [        U R                  S   [        5      (       a=  U R                  S==   U-  ss'   [        U R                  S   5      U R                  S'   g OoU R                  (       a^  [        U R                  S   [        5      (       a<  U R                  S   R	                  5       (       a  U R                  R                  5         U(       a  U R                  R                  U5        g g N)
isinstancestrr%   r>   isspacepopr5   r?   elements     r$   r5   Element.appendL   s    gs##*73G}}DMM",=s!C!Cb!W,!$8r9J$Kb!]] $--+S11dmmB6G6O6O6Q6Q!!#MM  ) r&   c                    ^ U4S jmT" U R                   5        [        U R                   5       H\  u  p[        U[        5      (       a  UR	                  5       U R                   U'   M9  [        US5      (       d  ML  UR                  5         M^     g )Nc                    > U (       aP  [        U S   [        5      (       a8  U S   R                  5       U S'   U S   (       d  U R                  5         T" U 5      n U $ rC   )rE   rF   rstriprH   )r>   rstrip_last_elements    r$   rO   -Element.finalize.<locals>.rstrip_last_element]   sK    Jx|S99'|224|LLN28<HOr&   finalize)r>   	enumeraterE   rF   striphasattrrQ   )r?   ichildrO   s      @r$   rQ   Element.finalize\   sc    	 	DMM*!$--0HA%%%#(;;=a 
++ 	 1r&   c                     [        US5      (       a  U R                  UR                  :w  a  gU R                  UR                  :w  a  gU R                  UR                  :H  $ )Nr8   F)rT   r8   r6   r>   rI   s     r$   __eq__Element.__eq__l   sK    w''499+D??g000}} 0 000r&   c                 H    [        U R                  /U R                  Q75      $ r*   )hashr8   r6   r?   s    r$   __hash__Element.__hash__s   s    TYY1122r&   c                    [        U[        5      (       d  X:X  a  g[        U[        5      (       a  U R                  UR                  :X  a  gSnSnU R                   H  n[        U[        5      (       a<  [        U[        5      (       a%  U(       a  X5R	                  U5      -  nMI  X;   a    gMR  MT  X5R                  XS9-  nU(       d  U(       a  Us  $ [        U[        5      (       d  M  UR                  (       d  M  UR                  U   nXe:X  a)  US-  nU[        UR                  5      :X  a	  US-  nSnM  M  SnM     U$ )N   r   count)rE   rF   RootElementr>   rc   _countlen)r?   rJ   rc   rU   elem_child_idxrV   
elem_childs          r$   re   Element._countv   s    '3''DOg{++AQAQ0Q]]E %%%gs++[[11 )  * , \\'\77H
 g{338H8H8H!(!1!1.!AJ!*&!+)S1A1A-BBFA-.N C
 *+; #< r&   c                 (    U R                  USS9S:  $ )NFrb   r   re   rI   s     r$   __contains__Element.__contains__   s    {{7%{0144r&   c                 "    U R                  USS9$ )NTrb   rk   rI   s     r$   rc   Element.count   s    {{7${//r&   c                      U R                   U   $ r*   )r>   )r?   keys     r$   __getitem__Element.__getitem__   s    }}S!!r&   c           
         SU R                   -  nU R                   H   u  p#Ub  USU< SU< S3-  nM  USU-  -  nM"     U R                  (       a|  US-  nUSR                  U R                   Vs/ s H9  n[	        U[
        5      (       a  [        R                  " U5      O
[        U5      PM;     sn5      -  nUSU R                   -  -  nU$ US	-  nU$ s  snf )
Nz<%sr    z=""z %sz>
r0   z
</%s>>)r8   r6   r>   r1   rE   rF   htmlescape)r?   outputrq   r-   cs        r$   __str__Element.__str__   s    "//JC U33%#+%	 *
 ==eOFbgg "]]* '1C&8&8DKKNc!fD* F i$))++F  cMFs   0A C
c                     [        U 5      $ r*   )rF   r]   s    r$   __repr__Element.__repr__   s    4yr&   )r6   r>   r8   N)T)__name__
__module____qualname____firstlineno__r@   r5   rQ   rY   r^   re   rl   rc   rr   r{   r~   __static_attributes__r+   r&   r$   r;   r;   F   s:    
* ! 13%N50"(r&   r;   c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )rd      c                 &   > [         TU ]  S S5        g )Nr+   )superr@   r?   	__class__s    r$   r@   RootElement.__init__   s    r"r&   c           	          SR                  U R                   Vs/ s H9  n[        U[        5      (       a  [        R
                  " U5      O
[        U5      PM;     sn5      $ s  snf )Nr0   )r1   r>   rE   rF   rw   rx   )r?   rz   s     r$   r{   RootElement.__str__   sI    wwGK}}U}!z!S11T[[^s1v=}U
 	
Us   A A!r+   )r   r   r   r   r@   r{   r   __classcell__r   s   @r$   rd   rd      s    #
 
r&   rd   c                       \ rS rSrSrg)HTMLParseError   r+   N)r   r   r   r   r   r+   r&   r$   r   r      s    r&   r   c                   `   ^  \ rS rSrU 4S jrS rSS jr\S 5       rS r	S r
S rS	 rS
rU =r$ )Parser   c                 \   > [         TU ]  5         [        5       U l        / U l        0 U l        g r*   )r   r@   rd   root	open_tagselement_positionsr   s    r$   r@   Parser.__init__   s&    M	!#r&   c                 4    [        XR                  5       5      er*   )r   getpos)r?   msgs     r$   errorParser.error   s    S++-00r&   c                     U(       d  U(       a  U R                   U   nUc  U R                  5       n[        US5      (       a  UR                  UR                  4nSU-  $ )NlinenozLine %d, Column %d)r   r   rT   r   offset)r?   positionrJ   s      r$   format_positionParser.format_position   sR    G--g6H{{}H8X&&7H#h..r&   c                 Z    U R                   (       a  U R                   S   $ U R                  $ rC   )r   r   r]   s    r$   currentParser.current   s"    >>>>"%%99r&   c                 ^    U R                  X5        U[        ;  a  U R                  U5        g g r*   )handle_starttagr   handle_endtag)r?   tagattrss      r$   handle_startendtagParser.handle_startendtag   s+    S(m#s# $r&   c                     [        U5      n[        X5      nU R                  R                  U5        U[        ;  a  U R
                  R                  U5        U R                  5       U R                  U'   g r*   )r9   r;   r   r5   r   r   r   r   )r?   r   r   rJ   s       r$   r   Parser.handle_starttag   sX    $U+#%G$m#NN!!'**.++-w'r&   c                    U R                   (       d(  U R                  SU< SU R                  5       < S35        U R                   R                  5       nUR                  U:w  af  U R                   (       d(  U R                  SU< SU R                  5       < S35        U R                   R                  5       nUR                  U:w  a  Me  g g )NzUnexpected end tag `z` ())r   r   r   rH   r8   )r?   r   rJ   s      r$   r   Parser.handle_endtag   s    ~~JJd>R>R>TUV..$$&llc!>>

694;O;O;QR nn((*G llc!r&   c                 :    U R                   R                  U5        g r*   )r   r5   )r?   datas     r$   handle_dataParser.handle_data   s    D!r&   )r   r   r   )NN)r   r   r   r   r@   r   r   propertyr   r   r   r   r   r   r   r   s   @r$   r   r      s?    $1/  $
8	+" "r&   r   c                 (   [        5       nUR                  U 5        UR                  5         UR                  nUR	                  5         [        UR                  5      S:X  a1  [        UR                  S   [        5      (       d  UR                  S   nU$ )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.
ra   r   )	r   feedcloser   rQ   rf   r>   rE   rF   )rw   parserdocuments      r$   
parse_htmlr     st     XF
KK
LLN{{H
8":h6G6G6JC+P+P$$Q'Or&   )__doc__rw   html.parserr   django.utils.htmlr   django.utils.regex_helperr   r!   r4   r%   r9   r;   rd   	Exceptionr   r   r   r+   r&   r$   <module>r      sj    !  " + 6
 $O4  <-*u up
' 
	Y 	3"Z 3"lr&   