
     h#                         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dS )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                 8    t                               d|           S )N )ASCII_WHITESPACEsub)strings    O/var/www/surfInsights/venv3-11/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>6   s'      QQ5QuQQQQQQr%    )joinsortedr    splitBOOLEAN_ATTRIBUTESappend)
attributes
normalizednamer,   s       r#   normalize_attributesr7   /   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)   )r6   r0   r4   children)selfr6   r4   s      r#   __init__zElement.__init__E   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popr3   r<   elements     r#   r3   zElement.appendJ   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?   )rA   rB   rstriprD   )r;   rstrip_last_elements    r#   rJ   z-Element.finalize.<locals>.rstrip_last_element[   sg     =Jx|S99 ='|2244| =LLNNN228<<HOr%   finalize)r;   	enumeraterA   rB   striphasattrrK   )r<   ichildrJ   s      @r#   rK   zElement.finalizeZ   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 )Nr6   F)rN   r6   r4   r;   rE   s     r#   __eq__zElement.__eq__j   sL    w'' 	49+D+D5?g0005} 000r%   c                 <    t          | j        g| j        R           S r)   )hashr6   r4   r<   s    r#   __hash__zElement.__hash__q   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)rA   rB   RootElementr;   rZ   _countlen)r<   rF   rZ   rO   elem_child_idxrP   
elem_childs          r#   r\   zElement._countt   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 )NFrY   r   r\   rE   s     r#   __contains__zElement.__contains__   s    {{7%{00144r%   c                 0    |                      |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        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*   rA   rB   htmlescaper+   cs     r#   
<listcomp>z#Element.__str__.<locals>.<listcomp>   sI        '1C&8&8DDKNNNc!ff  r%   z
</%s>>)r6   r4   r;   r/   )r<   outputre   r,   s       r#   __str__zElement.__str__   s    "/ 	& 	&JC UUU33%#+%= 
	eOFbgg !]    F i$)++FFcMFr%   c                      t          |           S r)   )rB   rU   s    r#   __repr__zElement.__repr__   s    4yyr%   N)T)__name__
__module____qualname__r=   r3   rK   rR   rV   r\   rb   rZ   rf   rr   rt   r*   r%   r#   r9   r9   D   s          
* * * ! ! ! 1 1 13 3 3% % % %N5 5 50 0 0" " "  (    r%   r9   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*   rj   rm   s     r#   ro   z'RootElement.__str__.<locals>.<listcomp>   s9    UUU!z!S11=T[^^^s1vvUUUr%   )r/   r;   rU   s    r#   rr   zRootElement.__str__   s+    wwUUt}UUU
 
 	
r%   )ru   rv   rw   r=   rr   __classcell__r|   s   @r#   r[   r[      sG        # # # # #
 
 
 
 
 
 
r%   r[   c                       e Zd ZdS )HTMLParseErrorN)ru   rv   rw   r*   r%   r#   r   r      s        Dr%   r   c                   b     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 | _        d S r)   )rz   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   rN   r   offset)r<   positionrF   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   rU   s    r#   currentzParser.current   s!    > 	>"%%9r%   c                 r    |                      ||           || j        vr|                     |           d S d S r)   )handle_starttagSELF_CLOSING_TAGShandle_endtag)r<   tagattrss      r#   handle_startendtagzParser.handle_startendtag   sH    S%(((d,,,s##### -,r%   c                     t          |          }t          ||          }| j                            |           || j        vr| j                            |           |                                 | j        |<   d S r)   )r7   r9   r   r3   r   r   r   r   )r<   r   r   rF   s       r#   r   zParser.handle_starttag   ss    $U++#u%%G$$$d,,,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   rD   r6   )r<   r   rF   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   r3   )r<   datas     r#   handle_datazParser.handle_data  s    D!!!!!r%   )NN)ru   rv   rw   r   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.
    rX   r   )	r   feedcloser   rK   r]   r;   rA   rB   )rk   parserdocuments      r#   
parse_htmlr     s     XXF
KK
LLNNN{H
8"":h6G6JC+P+P"$Q'Or%   )__doc__rk   html.parserr   django.utils.regex_helperr   r    r2   r$   r7   r9   r[   	Exceptionr   r   r   r*   r%   r#   <module>r      sL   ! !  " " " " " " 6 6 6 6 6 6
 $#O44    <- - -  *u u u u u u u up
 
 
 
 
' 
 
 
	 	 	 	 	Y 	 	 	H" H" H" H" H"Z H" H" H"V    r%   