ó
ù¢TQc           @  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
 d d l 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
   force_text(   t
   HTMLParsert   HTMLParseError(   t   six(   t   python_2_unicode_compatibleu   \s+c         C  s   t  j d |  ƒ S(   Nu    (   t
   WHITESPACEt   sub(   t   string(    (    s)   ../Django//lib/python/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)   ../Django//lib/python/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)   ../Django//lib/python/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)   ../Django//lib/python/django/test/html.pyR   0   s    

u   finalize(   R   t	   enumerateR   R   R   t   stript   hasattrt   finalize(   R   t   it   child(    (   R   s)   ../Django//lib/python/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)   ../Django//lib/python/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)   ../Django//lib/python/django/test/html.pys	   <genexpr>Y   s    (   t   hashR   t   tupleR   (   R   (    (    s)   ../Django//lib/python/django/test/html.pyt   __hash__X   s    c         C  s   |  j  | ƒ S(   N(   R(   (   R   R   (    (    s)   ../Django//lib/python/django/test/html.pyt   __ne__[   s    c         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(   Ni   i    t   count(   R   R   R   R   R/   t   _count(   R   R   R/   R   R   (    (    s)   ../Django//lib/python/django/test/html.pyR0   ^   s    
c         C  s   |  j  | d t ƒd k S(   NR/   i    (   R0   R   (   R   R   (    (    s)   ../Django//lib/python/django/test/html.pyt   __contains__r   s    c         C  s   |  j  | d t ƒS(   NR/   (   R0   R#   (   R   R   (    (    s)   ../Django//lib/python/django/test/html.pyR/   u   s    c         C  s   |  j  | S(   N(   R   (   R   t   key(    (    s)   ../Django//lib/python/django/test/html.pyt   __getitem__x   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)   ../Django//lib/python/django/test/html.pys	   <genexpr>„   s    u   
</%s>u    />(   R   R   R   t   join(   R   t   outputR2   R%   (    (    s)   ../Django//lib/python/django/test/html.pyt   __str__{   s    	
 
c         C  s   t  j |  ƒ S(   N(   R   R4   (   R   (    (    s)   ../Django//lib/python/django/test/html.pyt   __repr__Š   s    (   t   __name__t
   __module__R   R   R   R(   R-   R.   R#   R0   R1   R/   R3   R8   R9   (    (    (    s)   ../Django//lib/python/django/test/html.pyR
      s   										t   RootElementc           B  s   e  Z d  „  Z d „  Z RS(   c         C  s   t  t |  ƒ j d  d ƒ d  S(   N(    (   t   superR<   R   R"   (   R   (    (    s)   ../Django//lib/python/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   R4   (   R)   R5   (    (    s)   ../Django//lib/python/django/test/html.pys	   <genexpr>”   s    (   R6   R   (   R   (    (    s)   ../Django//lib/python/django/test/html.pyR8   “   s    (   R:   R;   R   R8   (    (    (    s)   ../Django//lib/python/django/test/html.pyR<   Ž   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   R<   t   roott	   open_tagst   element_positions(   R   (    (    s)   ../Django//lib/python/django/test/html.pyR   ›   s    	c         C  s   t  | |  j ƒ  ƒ ‚ d  S(   N(   R   t   getpos(   R   t   msg(    (    s)   ../Django//lib/python/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)   ../Django//lib/python/django/test/html.pyt   format_position¤   s    c         C  s   |  j  r |  j  d S|  j Sd  S(   Niÿÿÿÿ(   R@   R?   (   R   (    (    s)   ../Django//lib/python/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)   ../Django//lib/python/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    (
   R6   R   t   splitR
   RI   R   RK   R@   RB   RA   (   R   RM   RN   R   R%   R   (    (    s)   ../Django//lib/python/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)   ../Django//lib/python/django/test/html.pyRL   È   s    				c         C  s   |  j  j | ƒ d  S(   N(   RI   R   (   R   t   data(    (    s)   ../Django//lib/python/django/test/html.pyt   handle_dataÓ   s    c         C  s   |  j  j d | ƒ d  S(   Nu   &%s;(   RI   R   (   R   R   (    (    s)   ../Django//lib/python/django/test/html.pyt   handle_charrefÖ   s    c         C  s   |  j  j d | ƒ d  S(   Nu   &%s;(   RI   R   (   R   R   (    (    s)   ../Django//lib/python/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)   ../Django//lib/python/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
    equivilance. 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)   ../Django//lib/python/django/test/html.pyt
   parse_htmlÝ   s    	
	
(   t   __doc__t
   __future__R    t   ret   django.utils.encodingR   t   django.utils.html_parserR   R   t   django.utilsR   R   t   compileR   R	   t   objectR
   R<   R>   R[   (    (    (    s)   ../Django//lib/python/django/test/html.pyt   <module>   s   	xF