
?[Y                 @   s   d  Z  d d l m Z d d l Z d d l m Z d d l m Z m Z d d l	 m
 Z
 m Z e j d  Z d d	   Z e Gd
 d   d e   Z e Gd d   d e   Z Gd d   d e  Z d d   Z d S)z
Comparing two html documents.
    )unicode_literalsN)six)
force_textpython_2_unicode_compatible)HTMLParseError
HTMLParserz\s+c             C   s   t  j d |   S)N )
WHITESPACEsub)string r   ?/home/kubikplay/www/django_dtb/build/Django/django/test/html.pynormalize_whitespace   s    r   c               @   s   e  Z d  Z d d   Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z d d d  Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d S)Elementc             C   s%   | |  _  t |  |  _ g  |  _ d  S)N)namesorted
attributeschildren)selfr   r   r   r   r   __init__   s    	zElement.__init__c             C   s   t  | t j  r t |  } t |  } |  j r t  |  j d t j  r~ |  j d | 7<t |  j d  |  j d <d  Sq nK |  j r t  |  j d t j  r |  j d j   r |  j j   q q n  | r |  j j |  n  d  S)N   r   r   r   r   r   )	
isinstancer   string_typesr   r   r   isspacepopappend)r   elementr   r   r   r      s    	
	zElement.appendc                s     f d d       |  j   xa t |  j   D]P \ } } t | t j  rc | j   |  j  | <q/ t | d  r/ | j   q/ q/ Wd  S)Nc                s]   |  rY t  |  d t j  rY |  d j   |  d <|  d sV |  j     |   }  qV qY n  |  S)Nr   r   r   r   r   )r   r   r   rstripr   )r   )rstrip_last_elementr   r   r   /   s    

z-Element.finalize.<locals>.rstrip_last_elementfinalize)r   	enumerater   r   r   striphasattrr    )r   ichildr   )r   r   r    .   s    	zElement.finalizec             C   s  t  | d  s d St  | d  r8 |  j | j k r8 d St |  j  t | j  k rZ d S|  j | j k r x t t |  j   D]r } |  j | \ } } | j | \ } } | d  k r | } n  | d  k r | } n  | | k s | | k r d Sq Wn  |  j | j k rd Sd S)Nr   FT)r#   r   lenr   ranger   )r   r   r$   attrvalueZ
other_attrZother_valuer   r   r   __eq__?   s&    !		zElement.__eq__c             C   s*   t  |  j f t d d   |  j D   S)Nc             s   s   |  ] } | Vq d  S)Nr   ).0ar   r   r   	<genexpr>X   s    z#Element.__hash__.<locals>.<genexpr>)hashr   tupler   )r   r   r   r   __hash__W   s    zElement.__hash__c             C   s   |  j  |  S)N)r*   )r   r   r   r   r   __ne__Z   s    zElement.__ne__Tc             C   s   t  | t j  s% |  | k r% d Sn  d } x |  j D] } t  | t j  r t  | t j  r | r{ | | j |  7} q | | k r d Sq q5 | | j | d | 7} | r5 | r5 | Sq5 W| S)Nr   r   count)r   r   r   r   r2   _count)r   r   r2   r$   r%   r   r   r   r3   ]   s    
zElement._countc             C   s   |  j  | d d d k S)Nr2   Fr   )r3   )r   r   r   r   r   __contains__q   s    zElement.__contains__c             C   s   |  j  | d d S)Nr2   T)r3   )r   r   r   r   r   r2   t   s    zElement.countc             C   s   |  j  | S)N)r   )r   keyr   r   r   __getitem__w   s    zElement.__getitem__c             C   s   d |  j  } xB |  j D]7 \ } } | r@ | d | | f 7} q | d | 7} q W|  j r | d 7} | d j d d   |  j D  7} | d |  j  7} n
 | d	 7} | S)
Nz<%sz %s="%s"z %sz>
 c             s   s   |  ] } t  j |  Vq d  S)N)r   	text_type)r+   cr   r   r   r-      s    z"Element.__str__.<locals>.<genexpr>z
</%s>z />)r   r   r   join)r   outputr5   r)   r   r   r   __str__z   s    	
#
zElement.__str__c             C   s   t  j |   S)N)r   r8   )r   r   r   r   __repr__   s    zElement.__repr__N)__name__
__module____qualname__r   r   r    r*   r0   r1   r3   r4   r2   r6   r<   r=   r   r   r   r   r      s   r   c                   s.   e  Z d  Z   f d d   Z d d   Z   S)RootElementc                s   t  t |   j d  f   d  S)N)superrA   r   )r   )	__class__r   r   r      s    zRootElement.__init__c             C   s   d j  d d   |  j D  S)Nr7   c             s   s   |  ] } t  j |  Vq d  S)N)r   r8   )r+   r9   r   r   r   r-      s    z&RootElement.__str__.<locals>.<genexpr>)r:   r   )r   r   r   r   r<      s    zRootElement.__str__)r>   r?   r@   r   r<   r   r   )rC   r   rA      s   rA   c            
   @   s   e  Z d  Z d  Z d d   Z d d   Z d d d d  Z e d d    Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d S)!Parserbrhrinputimgmetaspacerlinkframebasecolc             C   s/   t  j |   t   |  _ g  |  _ i  |  _ d  S)N)r   r   rA   root	open_tagselement_positions)r   r   r   r   r      s    	zParser.__init__c             C   s   t  | |  j     d  S)N)r   getpos)r   msgr   r   r   error   s    zParser.errorNc             C   sd   | r | r |  j  | } n  | d  k r8 |  j   } n  t | d  r\ | j | j f } n  d | S)NlinenozLine %d, Column %d)rQ   rR   r#   rU   offset)r   positionr   r   r   r   format_position   s    zParser.format_positionc             C   s   |  j  r |  j  d S|  j Sd  S)Nr   r   )rP   rO   )r   r   r   r   current   s    	zParser.currentc             C   s3   |  j  | |  | |  j k r/ |  j |  n  d  S)N)handle_starttagSELF_CLOSING_TAGShandle_endtag)r   tagattrsr   r   r   handle_startendtag   s    zParser.handle_startendtagc             C   sk   d d   | D } t  | |  } |  j j |  | |  j k rT |  j j |  n  |  j   |  j | <d  S)Nc             S   sR   g  |  ]H \ } } | d  k rB | d j  t | j d    f n	 | | f  q S)classr   )r:   r   split)r+   r   r)   r   r   r   
<listcomp>   s   	z*Parser.handle_starttag.<locals>.<listcomp>)r   rY   r   r[   rP   rR   rQ   )r   r]   r^   r   r   r   r   rZ      s    	
zParser.handle_starttagc             C   s   |  j  s) |  j d | |  j   f  n  |  j  j   } xK | j | k r |  j  ss |  j d | |  j   f  n  |  j  j   } q; Wd  S)NzUnexpected end tag `%s` (%s))rP   rT   rX   r   r   )r   r]   r   r   r   r   r\      s    				zParser.handle_endtagc             C   s   |  j  j |  d  S)N)rY   r   )r   datar   r   r   handle_data   s    zParser.handle_datac             C   s   |  j  j d |  d  S)Nz&%s;)rY   r   )r   r   r   r   r   handle_charref   s    zParser.handle_charrefc             C   s   |  j  j d |  d  S)Nz&%s;)rY   r   )r   r   r   r   r   handle_entityref   s    zParser.handle_entityref)
zbrzhrzinputzimgzmetarJ   zlinkzframezbasezcol)r>   r?   r@   r[   r   rT   rX   propertyrY   r_   rZ   r\   rd   re   rf   r   r   r   r   rD      s    	rD   c             C   sx   t    } | j |   | j   | j } | j   t | j  d k rt t | j d t j	  st | j d } qt n  | S)a  
    Takes a string that contains *valid* HTML and turns 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.
    r   r   )
rD   feedcloserO   r    r&   r   r   r   r   )htmlparserdocumentr   r   r   
parse_html   s    	
	
rm   )__doc__
__future__r   reZdjango.utilsr   Zdjango.utils.encodingr   r   Zdjango.utils.html_parserr   r   compiler	   r   objectr   rA   rD   rm   r   r   r   r   <module>   s   xH