ó
;gQc           @   s­   d  Z  d d l m Z d d l m Z d d l m Z m Z d d l m Z m	 Z	 d e j
 f d     YZ d   Z d	 e f d
     YZ d e f d     YZ d   Z d S(   sI  
SAX-based adapter to copy trees from/to the Python standard library.

Use the `ElementTreeContentHandler` class to build an ElementTree from
SAX events.

Use the `ElementTreeProducer` class or the `saxify()` function to fire
the SAX events of an ElementTree against a SAX ContentHandler.

See http://codespeak.net/lxml/sax.html
i˙˙˙˙(   t   ContentHandler(   t   etree(   t   ElementTreet
   SubElement(   t   Commentt   ProcessingInstructiont   SaxErrorc           B   s   e  Z d  Z RS(   s   General SAX error.
    (   t   __name__t
   __module__t   __doc__(    (    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyR      s   c         C   s8   |  d d k r* t  |  d j d d   Sd  |  f Sd  S(   Ni    t   {i   t   }(   t   tuplet   splitt   None(   t   tag(    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt	   _getNsTag   s    t   ElementTreeContentHandlerc           B   s°   e  Z d  Z d d  Z d   Z e e d e j Z d   Z d   Z	 d   Z
 d   Z d   Z d	   Z d d
  Z d   Z d   Z d d  Z d   Z d   Z e Z RS(   s/   Build an lxml ElementTree from SAX events.
    c         C   se   d  |  _ g  |  _ g  |  _ d  |  _ i d  g d  6|  _ i  |  _ | d  k rX t j } n  | |  _	 d  S(   N(
   R   t   _roott   _root_siblingst   _element_stackt   _default_nst   _ns_mappingt   _new_mappingsR   t   Elementt   _makeelement(   t   selft   makeelement(    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt   __init__!   s    					c         C   s   t  |  j  S(   s=   Contains the generated ElementTree after parsing is finished.(   R   R   (   R   (    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt
   _get_etree,   s    t   docc         C   s   d  S(   N(    (   R   t   locator(    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt   setDocumentLocator2   s    c         C   s   d  S(   N(    (   R   (    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt   startDocument5   s    c         C   s   d  S(   N(    (   R   (    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt   endDocument8   s    c         C   se   | |  j  | <y |  j | j |  Wn! t k
 rH | g |  j | <n X| d  k ra | |  _ n  d  S(   N(   R   R   t   appendt   KeyErrorR   R   (   R   t   prefixt   uri(    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt   startPrefixMapping;   s    c         C   s7   |  j  | } | j   | d  k r3 | d |  _ n  d  S(   Ni˙˙˙˙(   R   t   popR   R   (   R   R%   t   ns_uri_list(    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt   endPrefixMappingD   s    
c         C   sH   | \ } } | r d | } n% |  j  r> d |  j  | f } n | } | S(   Ns   {%s}%s(   R   (   R   t   ns_name_tuplet   ns_urit
   local_namet   el_tag(    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt	   _buildTagJ   s    	c         C   sM  |  j  |  } | r i  } y | j   } Wn t k
 rJ | j   } n XxH | D]7 \ } } | d ru d | }	 n
 | d }	 | | |	 <qR Wn d  } |  j }
 |  j d  k r|  j | | |  j  } |  _ |  j	 r	t
 | d  r	x! |  j	 D] } | j |  qď Wn  |  j	 2n t |
 d | | |  j  } |
 j |  |  j j   d  S(   Ni    s   {%s}%si   t   addpreviousi˙˙˙˙(   R/   t	   iteritemst   AttributeErrort   itemsR   R   R   R   R   R   t   hasattrR0   R   R#   t   clear(   R   t   ns_namet   qnamet
   attributest   el_namet   attrst   iter_attributest
   name_tuplet   valuet	   attr_namet   element_stackt   elementt   sibling(    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt   startElementNST   s0    

	
c         C   sI   t  | |  } |  j d  k r1 |  j j |  n |  j d j |  d  S(   Ni˙˙˙˙(   R   R   R   R   R#   R   (   R   t   targett   datat   pi(    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt   processingInstructionu   s    c         C   sD   |  j  j   } |  j |  } | | j k r@ t d |   n  d  S(   Ns   Unexpected element closed: (   R   R(   R/   R   R   (   R   R6   R7   R@   R.   (    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt   endElementNS|   s    c         C   s]   | r@ t  g  | j   D] \ } } d  | f | f ^ q  } n  |  j d  | f | |  d  S(   N(   t   dictR3   R   RB   (   R   t   nameR8   t   kt   v(    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt   startElement   s    7c         C   s   |  j  d  | f |  d  S(   N(   RG   R   (   R   RI   (    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt
   endElement   s    c         C   s_   |  j  d } y$ | d } | j p& d | | _ Wn' t k
 rZ | j pM d | | _ n Xd  S(   Ni˙˙˙˙t    (   R   t   tailt
   IndexErrort   text(   R   RD   t   last_element(    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt
   characters   s    
N(   R   R   R	   R   R   R   t   propertyR   R    R!   R"   R'   R*   R/   RB   RF   RG   RL   RM   RS   t   ignorableWhitespace(    (    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyR      s"   								
!				
t   ElementTreeProducerc           B   s2   e  Z d  Z d   Z d   Z d   Z d   Z RS(   s5   Produces SAX events for an element and children.
    c         C   sk   y | j    } Wn t k
 r) | } n X| |  _ | |  _ d d l m } | |  _ | i  i   |  _ d  S(   Ni˙˙˙˙(   t   AttributesNSImpl(   t   getrootR2   t   _elementt   _content_handlert   xml.sax.xmlreaderRW   t   _attr_classt   _empty_attributes(   R   t   element_or_treet   content_handlerR@   t
   attr_class(    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyR      s    
			c         C   s  |  j  j   |  j } t | d  r  g  } | j   } x5 t | d d   t k rn | j |  | j   } q: Wx. | d  d  d  D] } |  j	 | i   q Wn  |  j	 | i   t | d  r	| j
   } x; t | d d   t k r|  j	 | i   | j
   } qÎ Wn  |  j  j   d  S(   Nt   getpreviousR   i˙˙˙˙t   getnext(   RZ   R!   RY   R4   Ra   t   getattrR   R   R#   t   _recursive_saxifyRb   R"   (   R   R@   t   siblingsRA   (    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt   saxify§   s"    	c         C   s  |  j  } | j } | t k s* | t k ro | t k rO | j | j | j  n  | j rk | j | j  n  d  Sg  } |  j	 } | j
   } | r˙ i  } i  }	 xK | D]C \ }
 } t |
  } | | | <| | d | d | |  |	 | <qŁ W|  j | |	  } n	 |  j } t |  \ } } | | | | |  } x$ | D] \ } } | j | |  q6W| j | | f | |  | j r| j | j  n  x | D] } |  j | |  qW| j | | f |  x! | D] \ } } | j |  qÉW| j r| j | j  n  d  S(   Ni    i   (   RZ   R   R   R   RF   RC   RQ   RO   RS   t   _build_qnameR3   R   R\   R]   R'   RB   Rd   RG   R*   (   R   R@   t   prefixesR_   R   t   new_prefixest   build_qnamet   attribst   attr_valuest   attr_qnamest   attr_ns_nameR=   t   attr_ns_tuplet   sax_attributesR,   R-   R7   R%   R&   t   child(    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyRd   ž   sJ    				
"	
		c         C   si   | d  k r | Sy | | } Wn< t k
 r\ d t |  } | | <| j | | f  n X| d | S(   Ns   ns%02dt   :(   R   R$   t   lenR#   (   R   R,   R-   Rh   Ri   R%   (    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyRg   é   s    (   R   R   R	   R   Rf   Rd   Rg   (    (    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyRV      s
   			+c         C   s   t  |  |  j   S(   sl   One-shot helper to generate SAX events from an XML tree and fire
    them against a SAX ContentHandler.
    (   RV   Rf   (   R^   R_   (    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyRf   ó   s    N(   R	   t   xml.sax.handlerR    t   lxmlR   t
   lxml.etreeR   R   R   R   t	   LxmlErrorR   R   R   t   objectRV   Rf   (    (    (    s,   /usr/lib/python2.7/dist-packages/lxml/sax.pyt   <module>   s   	{Z