ó
Ń7ec           @  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   Z e d	 e f d
     Y Z e d e f d     Y Z d e f d     YZ d   Z d S(   u   
Comparing two html documents.
i˙˙˙˙(   t   unicode_literalsN(   t   six(   t
   force_textt   python_2_unicode_compatible(   t   HTMLParseErrort
   HTMLParseru   \s+c         C  s   t  j d |   S(   Nu    (   t
   WHITESPACEt   sub(   t   string(    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   normalize_whitespace   s    t   Elementc           B  sw   e  Z d    Z d   Z d   Z d   Z d   Z d   Z e d  Z	 d   Z
 d   Z d	   Z d
   Z d   Z RS(   c         C  s%   | |  _  t |  |  _ g  |  _ d  S(   N(   t   namet   sortedt
   attributest   children(   t   selfR   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   __init__   s    	c         C  së   t  | t j  r t |  } t |  } |  j rÎ t  |  j d t j  r |  j d c | 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(   Ni˙˙˙˙(	   t
   isinstanceR   t   string_typesR   R	   R   t   isspacet   popt   append(   R   t   element(    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyR      s    	
	c           s     f d       |  j   xa t |  j   D]P \ } } t | t j  r` | 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(   Ni˙˙˙˙(   R   R   R   t   rstripR   (   R   (   t   rstrip_last_element(    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyR   /   s    

u   finalize(   R   t	   enumerateR   R   R   t   stript   hasattrt   finalize(   R   t   it   child(    (   R   s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyR   .   s    	c         C  s  t  | d  s t St  | d  r8 |  j | j k r8 t St |  j  t | j  k rZ t 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 t Sq Wn  |  j | j k rt St S(   Nu   name(	   R   t   FalseR   t   lenR   t   ranget   NoneR   t   True(   R   R   R   t   attrt   valuet
   other_attrt   other_value(    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   __eq__?   s&    !		c         C  s'   t  |  j f t d   |  j D   S(   Nc         s  s   |  ] } | Vq d  S(   N(    (   t   .0t   a(    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pys	   <genexpr>X   s    (   t   hashR   t   tupleR   (   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   __hash__W   s    c         C  s   |  j  |  S(   N(   R(   (   R   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   __ne__Z   s    c         C  së   t  | t j  s% |  | k r% d Sn  t  | t  rM |  j | j k rM d Sn  d } x |  j D] } t  | t j  rš t  | t j  ră | rŁ | | j |  7} qś | | k rś d Sqă q] | | j | d | 7} | r] | r] | Sq] W| S(   Ni   i    t   count(   R   R   R   t   RootElementR   R/   t   _count(   R   R   R/   R   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyR1   ]   s$    
c         C  s   |  j  | d t d k S(   NR/   i    (   R1   R   (   R   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   __contains__t   s    c         C  s   |  j  | d t S(   NR/   (   R1   R#   (   R   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyR/   w   s    c         C  s   |  j  | S(   N(   R   (   R   t   key(    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   __getitem__z   s    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   |  j D  7} | d |  j  7} n
 | d 7} | S(	   Nu   <%su    %s="%s"u    %su   >
u    c         s  s   |  ] } t  j |  Vq d  S(   N(   R   t	   text_type(   R)   t   c(    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pys	   <genexpr>   s    u   
</%s>u    />(   R   R   R   t   join(   R   t   outputR3   R%   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   __str__}   s    	
 
c         C  s   t  j |   S(   N(   R   R5   (   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   __repr__   s    (   t   __name__t
   __module__R   R   R   R(   R-   R.   R#   R1   R2   R/   R4   R9   R:   (    (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyR
      s   										R0   c           B  s   e  Z d    Z d   Z RS(   c         C  s   t  t |   j d  d  d  S(   N(    (   t   superR0   R   R"   (   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyR      s    c         C  s   d j  d   |  j D  S(   Nu    c         s  s   |  ] } t  j |  Vq d  S(   N(   R   R5   (   R)   R6   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pys	   <genexpr>   s    (   R7   R   (   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyR9      s    (   R;   R<   R   R9   (    (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyR0      s   	t   Parserc        
   B  st   e  Z d Z d
   Z d   Z d d d  Z e d    Z d   Z	 d   Z
 d   Z d   Z d   Z d   Z RS(   u   bru   hru   inputu   imgu   metau   spaceru   linku   frameu   baseu   colc         C  s/   t  j |   t   |  _ g  |  _ i  |  _ d  S(   N(   R   R   R0   t   roott	   open_tagst   element_positions(   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyR      s    	c         C  s   t  | |  j     d  S(   N(   R   t   getpos(   R   t   msg(    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   errorĽ   s    c         C  sd   | r | r |  j  | } n  | d  k r8 |  j   } n  t | d  r\ | j | j f } n  d | S(   Nu   linenou   Line %d, Column %d(   RA   R"   RB   R   t   linenot   offset(   R   t   positionR   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   format_position¨   s    c         C  s   |  j  r |  j  d S|  j Sd  S(   Ni˙˙˙˙(   R@   R?   (   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   currentą   s    	c         C  s3   |  j  | |  | |  j k r/ |  j |  n  d  S(   N(   t   handle_starttagt   SELF_CLOSING_TAGSt   handle_endtag(   R   t   tagt   attrs(    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   handle_startendtag¸   s    c         C  s­   g  | D]H \ } } | d k rC | d j  t | j d    f n	 | | f ^ q } t | |  } |  j j |  | |  j k r |  j j |  n  |  j   |  j	 | <d  S(   Nu   classu    (
   R7   R   t   splitR
   RI   R   RK   R@   RB   RA   (   R   RM   RN   R   R%   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyRJ   ˝   s    Rc         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(   Nu   Unexpected end tag `%s` (%s)(   R@   RD   RH   R   R   (   R   RM   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyRL   Ě   s    				c         C  s   |  j  j |  d  S(   N(   RI   R   (   R   t   data(    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   handle_data×   s    c         C  s   |  j  j d |  d  S(   Nu   &%s;(   RI   R   (   R   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   handle_charrefÚ   s    c         C  s   |  j  j d |  d  S(   Nu   &%s;(   RI   R   (   R   R   (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   handle_entityrefÝ   s    (
   u   bru   hru   inputu   imgu   metau   spaceru   linku   frameu   baseu   colN(   R;   R<   RK   R   RD   R"   RH   t   propertyRI   RO   RJ   RL   RR   RS   RT   (    (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyR>      s    								c         C  sx   t    } | j |   | j   | j } | j   t | j  d k rt t | j d t j	  st | j d } qt n  | S(   u  
    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.
    i   i    (
   R>   t   feedt   closeR?   R   R    R   R   R   R   (   t   htmlt   parsert   document(    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt
   parse_htmlá   s    	
	
(   t   __doc__t
   __future__R    t   ret   django.utilsR   t   django.utils.encodingR   R   t   django.utils.html_parserR   R   t   compileR   R	   t   objectR
   R0   R>   R[   (    (    (    s:   /usr/local/lib/python2.7/dist-packages/django/test/html.pyt   <module>   s   	{H