
][\                @   s1  d  Z  d d l Z d d l Z d d l m Z m Z m Z m Z d d l Td d l	 m
 Z
 m Z e j j j e j j j f Z Gd d   d e j j  Z e e d d	 d
 e e d d	 d e e d d	 d d d   Z d d   Z d d   Z d d   Z d d   Z Gd d   d e  Z Gd d   d e  Z e e d d	 d e e d d	 d e e d  d	 d! Gd" d#   d# e  Z e e d$ d	 d% e Z Gd& d'   d' e  Z e d d  Z Gd( d)   d) e  Z e e d* d	 d+ e e d d	 d, d- d.   Z Gd/ d0   d0  Z  Gd1 d2   d2 e  e  Z! Gd3 d4   d4 e  e  Z" e e" d$ d	 d5 Gd6 d7   d7 e"  Z# e e# d8 d	 d9 e e# d: d	 d; d< d=   Z$ d> d?   Z% Gd@ dA   dA e"  Z& GdB dC   dC e#  Z' GdD dE   dE e  Z( e e( d$ d	 dF GdG dH   dH  Z) GdI dJ   dJ e) e  e  Z* GdK dL   dL e) e  Z+ GdM dN   dN e) e  e  Z, GdO dP   dP e
  Z- GdQ dR   dR e  Z. dS dT   Z/ GdU dV   dV e e  Z0 e e0 dW d	 dX dY dZ   Z1 d[ d\   Z2 d] d^   Z3 d d d_ d`  Z4 d da db  Z5 d dc dd  Z6 d S)eac  Simple implementation of the Level 1 DOM.

Namespaces and other minor Level 2 features are also supported.

parse("foo.xml")

parseString("<foo><bar/></foo>")

Todo:
=====
 * convenience methods for getting elements and text.
 * more testing
 * bring some of the writer and linearizer code into conformance with this
        interface
 * SAX 2 namespaces
    N)EMPTY_NAMESPACEEMPTY_PREFIXXMLNS_NAMESPACEdomreg)*)DOMImplementationLS
DocumentLSc               @   sT  e  Z d  Z d Z d Z d Z d Z d Z e Z	 d d   Z
 d d d  Z d d d d d	  Z d
 d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d  d!   Z d" d#   Z d$ d%   Z d& d'   Z d( d)   Z d* d+   Z d, d-   Z d. d/   Z d0 d1   Z  d S)2NodeNc             C   s   d S)NT )selfr
   r
   %/usr/lib/python3.4/xml/dom/minidom.py__bool__+   s    zNode.__bool__c             C   s   |  j  d d |  S)N )toprettyxml)r   encodingr
   r
   r   toxml.   s    z
Node.toxml	
c             C   s   | d  k r t  j   } n' t  j t  j   d | d d d d } |  j t j k rp |  j | d | | |  n |  j | d | |  | d  k r | j   S| j	   j   Sd  S)Nr   errorsxmlcharrefreplacenewliner   r   )
ioStringIOTextIOWrapperBytesIOnodeTyper	   DOCUMENT_NODEwritexmlgetvaluedetach)r   indentnewlr   writerr
   r
   r   r   1   s    	
zNode.toprettyxmlc             C   s   t  |  j  S)N)bool
childNodes)r   r
   r
   r   hasChildNodesC   s    zNode.hasChildNodesc             C   s   |  j  S)N)r$   )r   r
   r
   r   _get_childNodesF   s    zNode._get_childNodesc             C   s   |  j  r |  j  d Sd  S)Nr   )r$   )r   r
   r
   r   _get_firstChildI   s    	zNode._get_firstChildc             C   s   |  j  r |  j  d Sd  S)N   )r$   )r   r
   r
   r   _get_lastChildM   s    	zNode._get_lastChildc             C   sx  | j  |  j k r@ x' t | j  D] } |  j | |  q" W| S| j  |  j k r} t j j d t	 |  t	 |   f   n  | j
 d  k	 r | j
 j |  n  | d  k r |  j |  n y |  j j |  } Wn! t k
 r t j j    Yn X| j  t k rt |   n  |  j j | |  | | _ | | _ | rb|  j | d } | | _ | | _ n	 d  | _ |  | _
 | S)Nz%s cannot be child of %sr(   )r   DOCUMENT_FRAGMENT_NODEtupler$   insertBefore_child_node_typesxmldomHierarchyRequestErrrepr
parentNoderemoveChildappendChildindex
ValueErrorNotFoundErr_nodeTypes_with_children_clear_id_cacheinsertnextSiblingpreviousSibling)r   newChildrefChildcr6   noder
   r
   r   r-   Q   s6    	"					zNode.insertBeforec             C   s   | j  |  j k r= x$ t | j  D] } |  j |  q" W| S| j  |  j k rz t j j d t	 |  t	 |   f   n | j  t
 k r t |   n  | j d  k	 r | j j |  n  t |  |  d  | _ | S)Nz%s cannot be child of %s)r   r+   r,   r$   r5   r.   r/   r0   r1   r2   r9   r:   r3   r4   _append_childr<   )r   rA   r@   r
   r
   r   r5   q   s    	"	zNode.appendChildc             C   s  | j  |  j k r8 | j } |  j |  |  j | |  S| j  |  j k ru t j j d t	 |  t	 |   f   n  | | k r d  S| j
 d  k	 r | j
 j |  n  y |  j j |  } Wn! t k
 r t j j    Yn X| |  j | <|  | _
 d  | _
 | j  t k s| j  t k r+t |   n  | j | _ | j | _ d  | _ d  | _ | j rm| | j _ n  | j r| | j _ n  | S)Nz%s cannot be child of %s)r   r+   r<   r4   r-   r.   r/   r0   r1   r2   r3   r$   r6   r7   r8   r9   r:   r=   )r   r>   oldChildr?   r6   r
   r
   r   replaceChild   s<    		"						zNode.replaceChildc             C   s   y |  j  j |  Wn! t k
 r7 t j j    Yn X| j d  k	 rY | j | j _ n  | j d  k	 rz | j | j _ n  d  | _ | _ | j t	 k r t
 |   n  d  | _ | S)N)r$   remover7   r/   r0   r8   r<   r=   r   r9   r:   r3   )r   rC   r
   r
   r   r4      s    	zNode.removeChildc             C   s3  g  } x|  j  D]} | j t j k r | j sr | rJ | j | d _ n  | j re | j | j _ n  | j   q| r | d j | j k r | d } | j | j | _ | j | _ | j r | | j _ n  | j   q| j |  q | j |  | j t j	 k r | j
   q q W| |  j  d  d   <d  S)Nr(   r)   r)   r)   )r$   r   r	   	TEXT_NODEdatar<   r=   unlinkappendELEMENT_NODE	normalize)r   LchildrA   r
   r
   r   rK      s*    		
	zNode.normalizec             C   s   t  |  | |  j p |   S)N)_clone_nodeownerDocument)r   deepr
   r
   r   	cloneNode   s    zNode.cloneNodec             C   s   |  j  j j | |  S)N)rO   implementation
hasFeature)r   featureversionr
   r
   r   isSupported   s    zNode.isSupportedc             C   s   d  S)Nr
   )r   r
   r
   r   _get_localName   s    zNode._get_localNamec             C   s
   |  | k S)Nr
   )r   otherr
   r
   r   
isSameNode   s    zNode.isSameNodec             C   s   |  j  | d   r |  Sd  Sd  S)N)rV   )r   rT   r
   r
   r   getInterface   s    zNode.getInterfacec             C   s6   y |  j  | d SWn t t f k
 r1 d  SYn Xd  S)Nr   )
_user_dataAttributeErrorKeyError)r   keyr
   r
   r   getUserData   s    zNode.getUserDatac             C   s   d  } y |  j  } Wn! t k
 r6 i  } | |  _  Yn X| | k rT | | d } n  | d  k r d  } | d  k	 r | | =q n | | f | | <| S)Nr   )r[   r\   )r   r^   rG   handlerolddr
   r
   r   setUserData   s    zNode.setUserDatac             C   sj   t  |  d  rf xT t |  j j    D]: \ } \ } } | d  k	 r% | j | | | | |  q% q% Wn  d  S)Nr[   )hasattrlistr[   itemsZhandle)r   	operationsrcZdstr^   rG   r`   r
   r
   r   _call_user_data_handler   s    (zNode._call_user_data_handlerc             C   s\   d  |  _  |  _ |  j rF x |  j D] } | j   q# Wt   |  _ n  d  |  _ d  |  _ d  S)N)r3   rO   r$   rH   NodeListr=   r<   )r   rM   r
   r
   r   rH     s    		zNode.unlinkc             C   s   |  S)Nr
   )r   r
   r
   r   	__enter__  s    zNode.__enter__c             C   s   |  j    d  S)N)rH   )r   ZetZevtbr
   r
   r   __exit__  s    zNode.__exit__)!__name__
__module____qualname__namespaceURIr3   rO   r<   r=   r   prefixr   r   r   r%   r&   r'   r*   r-   r5   rD   r4   rK   rQ   rV   rW   rY   rZ   r_   rc   ri   rH   rk   rm   r
   r
   r
   r   r	   "   s:     
r	   
firstChilddoczFirst child node, or None.	lastChildzLast child node, or None.	localNamez"Namespace-local name of this node.c             C   sH   |  j  } | r. | d } | | _ | | _ n  | j |  |  | _ d  S)Nr(   r)   )r$   r=   r<   rI   r3   )r   rA   r$   lastr
   r
   r   rB     s    	
	rB   c             C   s6   x/ |  d  k	 r1 |  j  t j k r% d S|  j }  q Wd S)NTF)r   r	   r   r3   )rA   r
   r
   r   _in_document&  s
    rx   c             C   sP   | rL | j  d d  j  d d  j  d d  j  d d  } |  j |  n  d	 S)
zWrites datachars to writer.&z&amp;<z&lt;"z&quot;>z&gt;N)replacewrite)r"   rG   r
   r
   r   _write_data.  s    6r   c             C   se   x^ |  j  D]S } | j t j k rM | d k s= | j | k rM | j |  n  t | | |  q
 W| S)Nr   )r$   r   r	   rJ   tagNamerI   _get_elements_by_tagName_helper)parentnamercrA   r
   r
   r   r   5  s    r   c             C   s   x |  j  D]t } | j t j k r
 | d k s= | j | k rh | d k sX | j | k rh | j |  n  t | | | |  q
 q
 W| S)Nr   )r$   r   r	   rJ   rv   rq   rI   "_get_elements_by_tagName_ns_helper)r   ZnsURIrv   r   rA   r
   r
   r   r   =  s    r   c               @   sm   e  Z d  Z e j Z d Z d Z d Z d Z	 e j
 e j e j e j e j e j e j f Z d d   Z d S)DocumentFragmentz#document-fragmentNc             C   s   t    |  _ d  S)N)rj   r$   )r   r
   r
   r   __init__T  s    zDocumentFragment.__init__)rn   ro   rp   r	   r+   r   nodeName	nodeValue
attributesr3   rJ   rF   CDATA_SECTION_NODEENTITY_REFERENCE_NODEPROCESSING_INSTRUCTION_NODECOMMENT_NODENOTATION_NODEr.   r   r
   r
   r
   r   r   F  s   	r   c               @   s  e  Z d  Z d# Z e j Z d	 Z d
 Z d
 Z	 e j
 e j f Z e d	 d	 d d  Z d d   Z d d   Z d d   Z d d   Z e e e  Z Z d d   Z d d   Z e e e  Z Z d d   Z d d   Z e e e  Z d d   Z d d    Z d! d"   Z d	 S)$Attr_name_valuerq   _prefixr$   
_localNamerO   ownerElementNFc             C   sG   d  |  _  | |  _ | |  _ | |  _ t   |  _ |  j j t    d  S)N)r   r   rq   r   rj   r$   rI   Text)r   qNamerq   rv   rr   r
   r
   r   r   b  s    				zAttr.__init__c             C   s;   y |  j  SWn) t k
 r6 |  j j d d  d SYn Xd  S)N:r(   r)   )r   r\   r   split)r   r
   r
   r   rW   o  s    zAttr._get_localNamec             C   s   |  j  S)N)	specified)r   r
   r
   r   _get_specifiedu  s    zAttr._get_specifiedc             C   s   |  j  S)N)r   )r   r
   r
   r   	_get_namex  s    zAttr._get_namec             C   s,   | |  _  |  j d  k	 r( t |  j  n  d  S)N)r   r   r:   )r   valuer
   r
   r   	_set_name{  s    	zAttr._set_namec             C   s   |  j  S)N)r   )r   r
   r
   r   
_get_value  s    zAttr._get_valuec             C   sL   | |  _  | |  j d _ |  j d  k	 r8 t |  j  n  | |  j d _ d  S)Nr   )r   r$   rG   r   r:   )r   r   r
   r
   r   
_set_value  s
    	zAttr._set_valuec             C   s   |  j  S)N)r   )r   r
   r
   r   _get_prefix  s    zAttr._get_prefixc             C   s   |  j  } | d k r? | r? | t k r? t j j d   q? n  | |  _ | d  k r` |  j } n d | |  j f } |  j r t |  j  n  | |  _	 d  S)Nxmlnsz5illegal use of 'xmlns' prefix for the wrong namespacez%s:%s)
rq   r   r/   r0   NamespaceErrr   rv   r   r:   r   )r   rr   ZnsuriZnewNamer
   r
   r   _set_prefix  s    				zAttr._set_prefixc             C   s   |  j  } | d  k	 rq | j |  j =| j |  j |  j f =|  j rq d |  _ | j d 8_ |  j j	 d 8_	 qq n  x |  j
 D] } | j   q{ W|  j
 d  d   =d  S)NFr(   )r   _attrsr   _attrsNSrq   rv   _is_id_magic_id_nodesrO   _magic_id_countr$   rH   )r   elemrM   r
   r
   r   rH     s    			zAttr.unlinkc             C   s   |  j  r d S|  j } |  j } | d  k s7 | d  k r; d S| j |  } | d  k rZ d S|  j ry | j |  j |  j  S| j |  j  Sd  S)NTF)	r   rO   r   _get_elem_inforq   isIdNSrv   isIdr   )r   rt   r   infor
   r
   r   	_get_isId  s    				zAttr._get_isIdc             C   s   |  j  } |  j } | d  k s* | d  k r. t S| j |  } | d  k rM t S|  j rl | j |  j |  j  S| j |  j  Sd  S)N)	rO   r   _no_typer   rq   getAttributeTypeNSrv   getAttributeTyper   )r   rt   r   r   r
   r
   r   _get_schemaType  s    			zAttr._get_schemaType)z_namez_valueznamespaceURIz_prefixz
childNodesz
_localNamezownerDocumentzownerElement) rn   ro   rp   	__slots__r	   ATTRIBUTE_NODEr   r   r   r   rF   r   r.   r   r   rW   r   r   r   propertyr   r   r   r   r   r   r   r   rr   rH   r   r   r
   r
   r
   r   r   X  s.    	r   r   z True if this attribute is an ID.z'Namespace-local name of this attribute.
schemaTypezSchema type for this attribute.c               @   su  e  Z d  Z d Z d> Z d d   Z d d   Z d	 d
   Z d d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d d  Z e Z d d   Z d d   Z d d   Z d  d!   Z d" d#   Z d$ d%   Z d& d'   Z d( d)   Z d* d+   Z d, d-   Z d. d/   Z d0 d1   Z d2 d3   Z d4 d5   Z d6 d7   Z d8 d9   Z d: d;   Z  d< d=   Z! d S)?NamedNodeMapa  The attribute list is a transient interface to the underlying
    dictionaries.  Mutations here will change the underlying element's
    dictionary.

    Ordering is imposed artificially and does not reflect the order of
    attributes as found in an input document.
    r   r   _ownerElementc             C   s   | |  _  | |  _ | |  _ d  S)N)r   r   r   )r   attrsZattrsNSr   r
   r
   r   r     s    		zNamedNodeMap.__init__c             C   s   t  |  j  S)N)lenr   )r   r
   r
   r   _get_length  s    zNamedNodeMap._get_lengthc             C   s<   y |  t  |  j j    | SWn t k
 r7 d  SYn Xd  S)N)re   r   keys
IndexError)r   r6   r
   r
   r   item  s    zNamedNodeMap.itemc             C   s=   g  } x0 |  j  j   D] } | j | j | j f  q W| S)N)r   valuesrI   r   r   )r   rL   rA   r
   r
   r   rf     s    zNamedNodeMap.itemsc             C   sF   g  } x9 |  j  j   D]( } | j | j | j f | j f  q W| S)N)r   r   rI   rq   rv   r   )r   rL   rA   r
   r
   r   itemsNS  s    &zNamedNodeMap.itemsNSc             C   s-   t  | t  r | |  j k S| |  j k Sd  S)N)
isinstancestrr   r   )r   r^   r
   r
   r   __contains__  s    zNamedNodeMap.__contains__c             C   s   |  j  j   S)N)r   r   )r   r
   r
   r   r     s    zNamedNodeMap.keysc             C   s   |  j  j   S)N)r   r   )r   r
   r
   r   keysNS  s    zNamedNodeMap.keysNSc             C   s   |  j  j   S)N)r   r   )r   r
   r
   r   r     s    zNamedNodeMap.valuesNc             C   s   |  j  j | |  S)N)r   get)r   r   r   r
   r
   r   r   
  s    zNamedNodeMap.getc             C   sO   |  j  t | d d   k r d St |   t |  k t |   t |  k  Sd  S)Nr   r   )r   getattrid)r   rX   r
   r
   r   _cmp  s    zNamedNodeMap._cmpc             C   s   |  j  |  d k S)Nr   )r   )r   rX   r
   r
   r   __eq__  s    zNamedNodeMap.__eq__c             C   s   |  j  |  d k S)Nr   )r   )r   rX   r
   r
   r   __ge__  s    zNamedNodeMap.__ge__c             C   s   |  j  |  d k S)Nr   )r   )r   rX   r
   r
   r   __gt__  s    zNamedNodeMap.__gt__c             C   s   |  j  |  d k S)Nr   )r   )r   rX   r
   r
   r   __le__  s    zNamedNodeMap.__le__c             C   s   |  j  |  d k  S)Nr   )r   )r   rX   r
   r
   r   __lt__!  s    zNamedNodeMap.__lt__c             C   s   |  j  |  d k S)Nr   )r   )r   rX   r
   r
   r   __ne__$  s    zNamedNodeMap.__ne__c             C   s)   t  | t  r |  j | S|  j | Sd  S)N)r   r,   r   r   )r   attname_or_tupler
   r
   r   __getitem__'  s    zNamedNodeMap.__getitem__c             C   s   t  | t  ri y |  j | } Wn: t k
 r\ t |  } |  j j | _ |  j |  Yn X| | _ n1 t  | t  s t	 d   n  | } |  j |  d  S)Nz%value must be a string or Attr object)
r   r   r   r]   r   r   rO   setNamedItemr   	TypeError)r   attnamer   rA   r
   r
   r   __setitem__.  s    zNamedNodeMap.__setitem__c             C   s,   y |  j  | SWn t k
 r' d  SYn Xd  S)N)r   r]   )r   r   r
   r
   r   getNamedItem=  s    zNamedNodeMap.getNamedItemc             C   s2   y |  j  | | f SWn t k
 r- d  SYn Xd  S)N)r   r]   )r   rq   rv   r
   r
   r   getNamedItemNSC  s    zNamedNodeMap.getNamedItemNSc             C   s}   |  j  |  } | d  k	 rj t |  j  |  j | j =|  j | j | j f =t | d  rf d  | _	 n  | St
 j j    d  S)Nr   )r   r:   r   r   r   r   rq   rv   rd   r   r/   r0   r8   )r   r   nr
   r
   r   removeNamedItemI  s    zNamedNodeMap.removeNamedItemc             C   s   |  j  | |  } | d  k	 rm t |  j  |  j | j | j f =|  j | j =t | d  ri d  | _	 n  | St
 j j    d  S)Nr   )r   r:   r   r   rq   rv   r   r   rd   r   r/   r0   r8   )r   rq   rv   r   r
   r
   r   removeNamedItemNSU  s    zNamedNodeMap.removeNamedItemNSc             C   s   t  | t  s: t j j d t |  t |   f   n  |  j j | j  } | rb | j	   n  | |  j | j <| |  j
 | j | j f <|  j | _ t | j  | S)Nz%s cannot be child of %s)r   r   r/   r0   r1   r2   r   r   r   rH   r   rq   rv   r   r   r:   )r   rA   ra   r
   r
   r   r   a  s    	"zNamedNodeMap.setNamedItemc             C   s   |  j  |  S)N)r   )r   rA   r
   r
   r   setNamedItemNSn  s    zNamedNodeMap.setNamedItemNSc             C   s%   |  | } t  | j  | j   d  S)N)r:   r   rH   )r   r   rA   r
   r
   r   __delitem__q  s    
zNamedNodeMap.__delitem__c             C   s   |  j  |  j |  j f S)N)r   r   r   )r   r
   r
   r   __getstate__v  s    zNamedNodeMap.__getstate__c             C   s   | \ |  _  |  _ |  _ d  S)N)r   r   r   )r   stater
   r
   r   __setstate__y  s    zNamedNodeMap.__setstate__)z_attrsz_attrsNSz_ownerElement)"rn   ro   rp   __doc__r   r   r   r   rf   r   r   r   r   r   r   __len__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   r     s>   r   Zlengthz$Number of nodes in the NamedNodeMap.c               @   sF   e  Z d  Z d Z d d   Z d d   Z d d   Z d	 d
   Z d S)TypeInfo	namespacer   c             C   s   | |  _  | |  _ d  S)N)r   r   )r   r   r   r
   r
   r   r     s    	zTypeInfo.__init__c             C   s,   |  j  r d |  j |  j  f Sd |  j Sd  S)Nz<TypeInfo %r (from %r)>z<TypeInfo %r>)r   r   )r   r
   r
   r   __repr__  s    	zTypeInfo.__repr__c             C   s   |  j  S)N)r   )r   r
   r
   r   r     s    zTypeInfo._get_namec             C   s   |  j  S)N)r   )r   r
   r
   r   _get_namespace  s    zTypeInfo._get_namespaceN)z	namespacezname)rn   ro   rp   r   r   r   r   r   r
   r
   r
   r   r     s
   r   c               @   s  e  Z d  Z dD Z e j Z d Z e Z	 d Z
 e j e j e j e j e j e j f Z e d d d d  Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d    Z d! d"   Z d# d$   Z d% d&   Z e Z d' d(   Z d) d*   Z  d+ d,   Z! e! Z" d- d.   Z# d/ d0   Z$ d1 d2   Z% d3 d4   Z& d5 d6   Z' d7 d7 d7 d8 d9  Z( d: d;   Z) d< d=   Z* d> d?   Z+ d@ dA   Z, dB dC   Z- d S)EElementrO   r3   r   r   rr   rq   r   r$   r   r   r<   r=   Nr   c             C   s]   d  |  _  | |  _ |  _ | |  _ | |  _ t   |  _ d  |  _ |  _ d  |  _	 d  |  _
 d  S)N)r3   r   r   rr   rq   rj   r$   r<   r=   r   r   )r   r   rq   rr   rv   r
   r
   r   r     s    			
	zElement.__init__c             C   s(   |  j  d  k r$ i  |  _  i  |  _ n  d  S)N)r   r   )r   r
   r
   r   _ensure_attributes  s    	zElement._ensure_attributesc             C   s;   y |  j  SWn) t k
 r6 |  j j d d  d SYn Xd  S)Nr   r(   r)   )r   r\   r   r   )r   r
   r
   r   rW     s    zElement._get_localNamec             C   s   |  j  S)N)r   )r   r
   r
   r   _get_tagName  s    zElement._get_tagNamec             C   s_   |  j  d  k	 r< x* t |  j  j    D] } | j   q% Wn  d  |  _  d  |  _ t j |   d  S)N)r   re   r   rH   r   r	   )r   attrr
   r
   r   rH     s    		zElement.unlinkc             C   sB   |  j  d  k r d Sy |  j  | j SWn t k
 r= d SYn Xd  S)Nr   )r   r   r]   )r   r   r
   r
   r   getAttribute  s    zElement.getAttributec             C   sH   |  j  d  k r d Sy |  j  | | f j SWn t k
 rC d SYn Xd  S)Nr   )r   r   r]   )r   rq   rv   r
   r
   r   getAttributeNS  s    zElement.getAttributeNSc             C   s   |  j  |  } | d  k rL t |  } | | _ |  j | _ |  j |  n1 | | j k r} | | _ | j r} t |   q} n  d  S)N)getAttributeNoder   r   rO   setAttributeNoder   r:   )r   r   r   r   r
   r
   r   setAttribute  s    			zElement.setAttributec             C   s   t  |  \ } } |  j | |  } | d  k rj t | | | |  } | | _ |  j | _ |  j |  nU | | j k r | | _ | j r t |   q n  | j | k r | | _ | | _	 n  d  S)N)
_nssplitgetAttributeNodeNSr   r   rO   r   r   r:   rr   r   )r   rq   qualifiedNamer   rr   	localnamer   r
   r
   r   setAttributeNS  s    				zElement.setAttributeNSc             C   s#   |  j  d  k r d  S|  j  j |  S)N)r   r   )r   Zattrnamer
   r
   r   r     s    zElement.getAttributeNodec             C   s)   |  j  d  k r d  S|  j  j | | f  S)N)r   r   )r   rq   rv   r
   r
   r   r     s    zElement.getAttributeNodeNSc             C   s   | j  d  |  f k r* t j j d   n  |  j   |  j j | j d   } | d  k	 rh |  j |  n  |  j	 j | j
 | j f d   } | d  k	 r | | k	 r |  j |  n  t |  |  | | k	 r | S| | k	 r | Sd  S)Nzattribute node already owned)r   r/   r0   ZInuseAttributeErrr   r   r   r   removeAttributeNoder   rq   rv   _set_attribute_node)r   r   Zold1Zold2r
   r
   r   r   	  s    
!zElement.setAttributeNodec             C   sg   |  j  d  k r! t j j    n  y |  j | } Wn! t k
 rU t j j    Yn X|  j |  d  S)N)r   r/   r0   r8   r   r]   r   )r   r   r   r
   r
   r   removeAttribute  s    zElement.removeAttributec             C   sm   |  j  d  k r! t j j    n  y |  j  | | f } Wn! t k
 r[ t j j    Yn X|  j |  d  S)N)r   r/   r0   r8   r]   r   )r   rq   rv   r   r
   r
   r   removeAttributeNS'  s    zElement.removeAttributeNSc             C   sx   | d  k r t  j j    n  y |  j | j Wn! t k
 rS t  j j    Yn Xt |   | j   |  j | _ d  S)N)	r/   r0   r8   r   r   r]   r:   rH   rO   )r   rA   r
   r
   r   r   0  s    

zElement.removeAttributeNodec             C   s    |  j  d  k r d S| |  j  k S)NF)r   )r   r   r
   r
   r   hasAttribute?  s    zElement.hasAttributec             C   s&   |  j  d  k r d S| | f |  j  k S)NF)r   )r   rq   rv   r
   r
   r   hasAttributeNSD  s    zElement.hasAttributeNSc             C   s   t  |  | t    S)N)r   rj   )r   r   r
   r
   r   getElementsByTagNameI  s    zElement.getElementsByTagNamec             C   s   t  |  | | t    S)N)r   rj   )r   rq   rv   r
   r
   r   getElementsByTagNameNSL  s    zElement.getElementsByTagNameNSc             C   s   d |  j  t |   f S)Nz<DOM Element: %s at %#x>)r   r   )r   r
   r
   r   r   P  s    zElement.__repr__r   c       	      C   sW  | j  | d |  j  |  j   } t | j    } x@ | D]8 } | j  d |  t | | | j  | j  d  q= W|  j rB| j  d  t |  j  d k r |  j d j	 t
 j k r |  j d j | d d d  nH | j  |  x+ |  j D]  } | j | | | | |  q W| j  |  | j  d |  j | f  n | j  d	 |  d  S)
Nrz   z %s="r{   r|   r(   r   r   z</%s>%sz/>%s)r~   r   _get_attributessortedr   r   r   r$   r   r   r	   rF   r   )	r   r"   r    	addindentr!   r   Za_namesZa_namerA   r
   r
   r   r   S  s$    	 zElement.writexmlc             C   s    |  j    t |  j |  j |   S)N)r   r   r   r   )r   r
   r
   r   r   n  s    
zElement._get_attributesc             C   s   |  j  r d Sd Sd  S)NTF)r   )r   r
   r
   r   hasAttributesr  s    	zElement.hasAttributesc             C   s    |  j  |  } |  j |  d  S)N)r   setIdAttributeNode)r   r   idAttrr
   r
   r   setIdAttributez  s    zElement.setIdAttributec             C   s#   |  j  | |  } |  j |  d  S)N)r   r   )r   rq   rv   r  r
   r
   r   setIdAttributeNS~  s    zElement.setIdAttributeNSc             C   s   | d  k s |  j  | j  r1 t j j    n  t |   d  k	 rU t j j    n  | j s d | _ |  j d 7_ |  j	 j
 d 7_
 t |   n  d  S)NTr(   )rY   r   r/   r0   r8   _get_containing_entrefNoModificationAllowedErrr   r   rO   r   r:   )r   r  r
   r
   r   r     s    		zElement.setIdAttributeNode)zownerDocumentz
parentNodeztagNameznodeNamezprefixznamespaceURIz
_localNamez
childNodesz_attrsz_attrsNSznextSiblingzpreviousSibling).rn   ro   rp   r   r	   rJ   r   r   r   r   r   r   r   rF   r   r   r.   r   r   r   rW   r   rH   r   r   r   r   r   r   r   ZsetAttributeNodeNSr   r   r   ZremoveAttributeNodeNSr   r   r   r   r   r   r   r   r  r  r   r
   r
   r
   r   r     sT     			r   r   z*NamedNodeMap of attributes on the element.z%Namespace-local name of this element.c             C   sJ   t  |   |  j   | |  j | j <| |  j | j | j f <|  | _ d  S)N)r:   r   r   r   r   rq   rv   r   )elementr   r
   r
   r   r     s
    

r   c               @   s   e  Z d  Z d Z f  Z d Z e   Z d Z d Z	 d d   Z
 d d   Z d d   Z d	 d
   Z d d   Z d d   Z d d   Z d d   Z d S)	ChildlesszMixin that makes childless-ness easy to implement and avoids
    the complexity of the Node methods that deal with children.
    Nc             C   s   d  S)Nr
   )r   r
   r
   r   r'     s    zChildless._get_firstChildc             C   s   d  S)Nr
   )r   r
   r
   r   r*     s    zChildless._get_lastChildc             C   s   t  j j |  j d   d  S)Nz nodes cannot have children)r/   r0   r1   r   )r   rA   r
   r
   r   r5     s    	zChildless.appendChildc             C   s   d S)NFr
   )r   r
   r
   r   r%     s    zChildless.hasChildNodesc             C   s   t  j j |  j d   d  S)Nz nodes do not have children)r/   r0   r1   r   )r   r>   r?   r
   r
   r   r-     s    	zChildless.insertBeforec             C   s   t  j j |  j d   d  S)Nz nodes do not have children)r/   r0   r8   r   )r   rC   r
   r
   r   r4     s    	zChildless.removeChildc             C   s   d  S)Nr
   )r   r
   r
   r   rK     s    zChildless.normalizec             C   s   t  j j |  j d   d  S)Nz nodes do not have children)r/   r0   r1   r   )r   r>   rC   r
   r
   r   rD     s    	zChildless.replaceChild)rn   ro   rp   r   r   r   ZEmptyNodeListr$   rs   ru   r'   r*   r5   r%   r-   r4   rK   rD   r
   r
   r
   r   r    s   	r  c               @   s   e  Z d  Z e j Z d Z d d   Z d d   Z d d   Z	 e
 e e	  Z d	 d
   Z d d   Z e
 e e  Z d d d d d  Z d S)ProcessingInstructiontargetrG   c             C   s   | |  _  | |  _ d  S)N)r	  rG   )r   r	  rG   r
   r
   r   r     s    	zProcessingInstruction.__init__c             C   s   |  j  S)N)rG   )r   r
   r
   r   _get_nodeValue  s    z$ProcessingInstruction._get_nodeValuec             C   s   | |  _  d  S)N)rG   )r   r   r
   r
   r   _set_nodeValue  s    z$ProcessingInstruction._set_nodeValuec             C   s   |  j  S)N)r	  )r   r
   r
   r   _get_nodeName  s    z#ProcessingInstruction._get_nodeNamec             C   s   | |  _  d  S)N)r	  )r   r   r
   r
   r   _set_nodeName  s    z#ProcessingInstruction._set_nodeNamer   c             C   s'   | j  d | |  j |  j | f  d  S)Nz%s<?%s %s?>%s)r~   r	  rG   )r   r"   r    r   r!   r
   r
   r   r     s    zProcessingInstruction.writexmlN)ztargetzdata)rn   ro   rp   r	   r   r   r   r   r
  r  r   r   r  r  r   r   r
   r
   r
   r   r    s   	r  c               @   s   e  Z d  Z d Z d d   Z d d	   Z e Z d
 d   Z d d   Z e	 e e  Z
 Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d S)CharacterData_datarO   r3   r=   r<   c             C   s:   d  |  _  |  _ d  |  _ |  _ d |  _ t j |   d  S)Nr   )rO   r3   r=   r<   r  r	   r   )r   r
   r
   r   r     s    	zCharacterData.__init__c             C   s   t  |  j  S)N)r   rG   )r   r
   r
   r   r     s    zCharacterData._get_lengthc             C   s   |  j  S)N)r  )r   r
   r
   r   	_get_data  s    zCharacterData._get_datac             C   s   | |  _  d  S)N)r  )r   rG   r
   r
   r   	_set_data  s    zCharacterData._set_datac             C   sK   |  j  } t |  d k r$ d } n d } d |  j j | d d  | f S)N
   z...r   z<DOM %s node "%r%s">r   )rG   r   	__class__rn   )r   rG   Z	dotdotdotr
   r
   r   r     s    		zCharacterData.__repr__c             C   s   | d k  r! t  j j d   n  | t |  j  k rK t  j j d   n  | d k  rl t  j j d   n  |  j | | |  S)Nr   zoffset cannot be negativez#offset cannot be beyond end of datazcount cannot be negative)r/   r0   IndexSizeErrr   rG   )r   offsetcountr
   r
   r   substringData  s    zCharacterData.substringDatac             C   s   |  j  | |  _  d  S)N)rG   )r   argr
   r
   r   
appendData  s    zCharacterData.appendDatac             C   s   | d k  r! t  j j d   n  | t |  j  k rK t  j j d   n  | r d |  j d  |  | |  j | d   f |  _ n  d  S)Nr   zoffset cannot be negativez#offset cannot be beyond end of dataz%s%s%s)r/   r0   r  r   rG   )r   r  r  r
   r
   r   
insertData
  s    zCharacterData.insertDatac             C   s   | d k  r! t  j j d   n  | t |  j  k rK t  j j d   n  | d k  rl t  j j d   n  | r |  j d  |  |  j | | d   |  _ n  d  S)Nr   zoffset cannot be negativez#offset cannot be beyond end of datazcount cannot be negative)r/   r0   r  r   rG   )r   r  r  r
   r
   r   
deleteData  s    zCharacterData.deleteDatac             C   s   | d k  r! t  j j d   n  | t |  j  k rK t  j j d   n  | d k  rl t  j j d   n  | r d |  j d  |  | |  j | | d   f |  _ n  d  S)Nr   zoffset cannot be negativez#offset cannot be beyond end of datazcount cannot be negativez%s%s%s)r/   r0   r  r   rG   )r   r  r  r  r
   r
   r   replaceData  s    zCharacterData.replaceDataN)z_datazownerDocumentz
parentNodezpreviousSiblingznextSibling)rn   ro   rp   r   r   r   r   r  r  r   rG   r   r   r  r  r  r  r  r
   r
   r
   r   r    s   			
r  zLength of the string data.c               @   sp   e  Z d  Z f  Z e j Z d Z d Z d d   Z	 d d d d d  Z
 d d	   Z d
 d   Z d d   Z d S)r   z#textNc             C   s   | d k  s! | t  |  j  k r6 t j j d   n  |  j   } |  j | d   | _ |  j | _ |  j } |  j r |  |  j j	 k r | d  k r |  j j
 |  q |  j j | |  n  |  j d  |  |  _ | S)Nr   zillegal offset value)r   rG   r/   r0   r  r  rO   r<   r3   r$   r5   r-   )r   r  ZnewTextnextr
   r
   r   	splitText2  s    !	zText.splitTextr   c             C   s!   t  | d | |  j | f  d  S)Nz%s%s%s)r   rG   )r   r"   r    r   r!   r
   r
   r   r   A  s    zText.writexmlc             C   s   |  j  g } |  j } xK | d  k	 rb | j t j t j f k r^ | j d | j   | j } q Pq W|  j } xH | d  k	 r | j t j t j f k r | j | j   | j } qo Pqo Wd j	 |  S)Nr   r   )
rG   r=   r   r	   rF   r   r;   r<   rI   join)r   rL   r   r
   r
   r   _get_wholeTextF  s    		zText._get_wholeTextc             C   s   |  j  } |  j } xK | d  k	 r_ | j t j t j f k r[ | j } | j |  | } q Pq W|  j } | s | j |   n  xK | d  k	 r | j t j t j f k r | j } | j |  | } q Pq W| r | |  _ |  Sd  Sd  S)N)	r3   r=   r   r	   rF   r   r4   r<   rG   )r   Zcontentr   r   r  r
   r
   r   replaceWholeTextX  s*    								zText.replaceWholeTextc             C   s_   |  j  j   r d St |   } | d  k r/ d S|  j j |  } | d  k rQ d S| j   Sd  S)NF)rG   strip_get_containing_elementrO   r   isElementContent)r   r   r   r
   r
   r   !_get_isWhitespaceInElementContentt  s    z&Text._get_isWhitespaceInElementContent)rn   ro   rp   r   r	   rF   r   r   r   r  r   r   r!  r%  r
   r
   r
   r   r   +  s   	r   ZisWhitespaceInElementContentzKTrue iff this text node contains only whitespace and is in element content.Z	wholeTextz.The text of all logically-adjacent text nodes.c             C   s?   |  j  } x/ | d  k	 r: | j t j k r. | S| j  } q Wd  S)N)r3   r   r	   rJ   )rA   r@   r
   r
   r   r#    s    	r#  c             C   s?   |  j  } x/ | d  k	 r: | j t j k r. | S| j  } q Wd  S)N)r3   r   r	   r   )rA   r@   r
   r
   r   r    s    	r  c               @   s@   e  Z d  Z e j Z d Z d d   Z d d d d d  Z d S)Commentz#commentc             C   s   t  j |   | |  _ d  S)N)r  r   r  )r   rG   r
   r
   r   r     s    zComment.__init__r   c             C   s?   d |  j  k r t d   n  | j d | |  j  | f  d  S)Nz--z%'--' is not allowed in a comment nodez%s<!--%s-->%s)rG   r7   r~   )r   r"   r    r   r!   r
   r
   r   r     s    zComment.writexmlN)	rn   ro   rp   r	   r   r   r   r   r   r
   r
   r
   r   r&    s   	r&  c               @   s:   e  Z d  Z f  Z e j Z d Z d d d d d  Z d S)CDATASectionz#cdata-sectionr   c             C   s?   |  j  j d  d k r' t d   n  | j d |  j   d  S)Nz]]>r   z$']]>' not allowed in a CDATA sectionz<![CDATA[%s]]>)rG   findr7   r~   )r   r"   r    r   r!   r
   r
   r   r     s    zCDATASection.writexmlN)	rn   ro   rp   r   r	   r   r   r   r   r
   r
   r
   r   r'    s   	r'  c               @   s   e  Z d  Z d Z f  d d  Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d S)ReadOnlySequentialNamedNodeMap_seqc             C   s   | |  _  d  S)N)r*  )r   seqr
   r
   r   r     s    z'ReadOnlySequentialNamedNodeMap.__init__c             C   s   t  |  j  S)N)r   r*  )r   r
   r
   r   r     s    z&ReadOnlySequentialNamedNodeMap.__len__c             C   s   t  |  j  S)N)r   r*  )r   r
   r
   r   r     s    z*ReadOnlySequentialNamedNodeMap._get_lengthc             C   s+   x$ |  j  D] } | j | k r
 | Sq
 Wd  S)N)r*  r   )r   r   r   r
   r
   r   r     s    z+ReadOnlySequentialNamedNodeMap.getNamedItemc             C   s:   x3 |  j  D]( } | j | k r
 | j | k r
 | Sq
 Wd  S)N)r*  rq   rv   )r   rq   rv   r   r
   r
   r   r     s    z-ReadOnlySequentialNamedNodeMap.getNamedItemNSc             C   sO   t  | t  r! |  j |   } n |  j |  } | d  k rK t |   n  | S)N)r   r,   r   r   r]   )r   Zname_or_tuplerA   r
   r
   r   r     s    z*ReadOnlySequentialNamedNodeMap.__getitem__c             C   s<   | d k  r d  Sy |  j  | SWn t k
 r7 d  SYn Xd  S)Nr   )r*  r   )r   r6   r
   r
   r   r     s    z#ReadOnlySequentialNamedNodeMap.itemc             C   s   t  j j d   d  S)Nz"NamedNodeMap instance is read-only)r/   r0   r  )r   r   r
   r
   r   r     s    	z.ReadOnlySequentialNamedNodeMap.removeNamedItemc             C   s   t  j j d   d  S)Nz"NamedNodeMap instance is read-only)r/   r0   r  )r   rq   rv   r
   r
   r   r     s    	z0ReadOnlySequentialNamedNodeMap.removeNamedItemNSc             C   s   t  j j d   d  S)Nz"NamedNodeMap instance is read-only)r/   r0   r  )r   rA   r
   r
   r   r     s    	z+ReadOnlySequentialNamedNodeMap.setNamedItemc             C   s   t  j j d   d  S)Nz"NamedNodeMap instance is read-only)r/   r0   r  )r   rA   r
   r
   r   r     s    	z-ReadOnlySequentialNamedNodeMap.setNamedItemNSc             C   s
   |  j  g S)N)r*  )r   r
   r
   r   r     s    z+ReadOnlySequentialNamedNodeMap.__getstate__c             C   s   | d |  _  d  S)Nr   )r*  )r   r   r
   r
   r   r     s    z+ReadOnlySequentialNamedNodeMap.__setstate__N)z_seq)rn   ro   rp   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r
   r
   r
   r   r)    s   	r)  z&Number of entries in the NamedNodeMap.c               @   s@   e  Z d  Z d Z d Z d d   Z d d   Z d d	   Z d
 S)
Identifiedz@Mix-in class that supports the publicId and systemId attributes.publicIdsystemIdc             C   s   | |  _  | |  _ d  S)N)r-  r.  )r   r-  r.  r
   r
   r   _identified_mixin_init  s    	z!Identified._identified_mixin_initc             C   s   |  j  S)N)r-  )r   r
   r
   r   _get_publicId  s    zIdentified._get_publicIdc             C   s   |  j  S)N)r.  )r   r
   r
   r   _get_systemId   s    zIdentified._get_systemIdN)zpublicIdzsystemId)rn   ro   rp   r   r   r/  r0  r1  r
   r
   r
   r   r,    s
   r,  c               @   sp   e  Z d  Z e j Z d Z d Z d Z d Z	 d Z
 d d   Z d d   Z d d   Z d d d d	 d
  Z d S)DocumentTypeNc             C   sL   t    |  _ t    |  _ | r< t |  \ } } | |  _ n  |  j |  _ d  S)N)r)  entities	notationsr   r   r   )r   r   rr   r   r
   r
   r   r     s    zDocumentType.__init__c             C   s   |  j  S)N)internalSubset)r   r
   r
   r   _get_internalSubset  s    z DocumentType._get_internalSubsetc             C   s\  |  j  d  k rTt d   } |  j | _ |  j | _ t j j j } | r=g  | j _	 g  | j
 _	 xU |  j
 j	 D]G } t | j | j | j  } | j
 j	 j |  | j | | |  qm Wx |  j j	 D]q } t | j | j | j | j  } | j | _ | j | _ | j | _ | j j	 j |  | j | | |  q Wn  |  j | |  |  | Sd  Sd  S)N)rO   r2  r   r   r/   r0   UserDataHandlerNODE_CLONEDr3  r*  r4  Notationr-  r.  rI   ri   EntitynotationNameactualEncodingr   rU   )r   rP   clonerg   r   notationeentityr
   r
   r   rQ     s.    zDocumentType.cloneNoder   c             C   s   | j  d  | j  |  j  |  j rL | j  d | |  j | |  j f  n& |  j rr | j  d | |  j f  n  |  j d  k	 r | j  d  | j  |  j  | j  d  n  | j  d |  d  S)Nz
<!DOCTYPE z%s  PUBLIC '%s'%s  '%s'z%s  SYSTEM '%s'z []r|   )r~   r   r-  r.  r5  )r   r"   r    r   r!   r
   r
   r   r   1  s    			zDocumentType.writexml)rn   ro   rp   r	   DOCUMENT_TYPE_NODEr   r   r   r-  r.  r5  r   r6  rQ   r   r
   r
   r
   r   r2    s   	r2  c               @   s   e  Z d  Z d Z e j Z d Z d Z d Z	 d Z
 d d   Z d d   Z d d   Z d d	   Z d
 d   Z d d   Z d d   Z d d   Z d S)r:  Nc             C   s2   | |  _  | |  _ t   |  _ |  j | |  d  S)N)r   r;  rj   r$   r/  )r   r   r-  r.  r>  r
   r
   r   r   H  s    		zEntity.__init__c             C   s   |  j  S)N)r<  )r   r
   r
   r   _get_actualEncodingN  s    zEntity._get_actualEncodingc             C   s   |  j  S)N)r   )r   r
   r
   r   _get_encodingQ  s    zEntity._get_encodingc             C   s   |  j  S)N)rU   )r   r
   r
   r   _get_versionT  s    zEntity._get_versionc             C   s   t  j j d   d  S)Nz(cannot append children to an entity node)r/   r0   r1   )r   r>   r
   r
   r   r5   W  s    	zEntity.appendChildc             C   s   t  j j d   d  S)Nz+cannot insert children below an entity node)r/   r0   r1   )r   r>   r?   r
   r
   r   r-   [  s    	zEntity.insertBeforec             C   s   t  j j d   d  S)Nz*cannot remove children from an entity node)r/   r0   r1   )r   rC   r
   r
   r   r4   _  s    	zEntity.removeChildc             C   s   t  j j d   d  S)Nz)cannot replace children of an entity node)r/   r0   r1   )r   r>   rC   r
   r
   r   rD   c  s    	zEntity.replaceChild)rn   ro   rp   r   r	   ZENTITY_NODEr   r   r<  r   rU   r   rC  rD  rE  r5   r-   r4   rD   r
   r
   r
   r   r:  ?  s   	r:  c               @   s+   e  Z d  Z e j Z d Z d d   Z d S)r9  Nc             C   s   | |  _  |  j | |  d  S)N)r   r/  )r   r   r-  r.  r
   r
   r   r   k  s    	zNotation.__init__)rn   ro   rp   r	   r   r   r   r   r
   r
   r
   r   r9  g  s   	r9  c            	   @   sj   e  Z d  Z d d d d d d d d g Z d d	   Z d
 d   Z d d   Z d d   Z d d   Z d S)DOMImplementationcore1.02.0Nr/   ls-load3.0c             C   s.   | d k r d  } n  | j    | f |  j k S)Nr   )lower	_features)r   rT   rU   r
   r
   r   rS   {  s    	zDOMImplementation.hasFeaturec       	      C   sK  | r* | j  d  k	 r* t j j d   n  |  j   } | d  k oW | d  k oW | d  k } | r} | r} t j j d   n  | rt |  \ } } | d k r | d k r t j j d   n  | r | r t j j d   n  | j | |  } | r| j	 |  n  | j	 |  n  | r5| | _  | _
 n  | | _ |  | _ | S)Nz(doctype object owned by another DOM treezElement with no namer/   z$http://www.w3.org/XML/1998/namespacezillegal use of 'xml' prefixz(illegal use of prefix without namespaces)r3   r/   r0   WrongDocumentErr_create_documentZInvalidCharacterErrr   r   createElementNSr5   rO   doctyperR   )	r   rq   r   rQ  rt   Zadd_root_elementrr   r   r  r
   r
   r   createDocument  s4    				z DOMImplementation.createDocumentc             C   s"   t  |  } | | _ | | _ | S)N)r2  r-  r.  )r   r   r-  r.  rQ  r
   r
   r   createDocumentType  s    		z$DOMImplementation.createDocumentTypec             C   s   |  j  | d   r |  Sd  Sd  S)N)rS   )r   rT   r
   r
   r   rZ     s    zDOMImplementation.getInterfacec             C   s   t    S)N)Document)r   r
   r
   r   rO    s    z"DOMImplementation._create_document)rG  rH  )rG  rI  )rG  N)xmlrH  )rU  rI  )rU  N)rJ  rK  )rJ  N)	rn   ro   rp   rM  rS   rR  rS  rZ   rO  r
   r
   r
   r   rF  p  s   	-rF  c               @   s   e  Z d  Z d Z d Z d d   Z d d   Z d d   Z d	 d
   Z d d   Z	 d d   Z
 d d   Z d d   Z d d   Z d S)ElementInfozObject that represents content-model information for an element.

    This implementation is not expected to be used in practice; DOM
    builders should provide implementations which do the right thing
    using information available to it.

    r   c             C   s   | |  _  d  S)N)r   )r   r   r
   r
   r   r     s    zElementInfo.__init__c             C   s   t  S)N)r   )r   anamer
   r
   r   r     s    zElementInfo.getAttributeTypec             C   s   t  S)N)r   )r   rq   rv   r
   r
   r   r     s    zElementInfo.getAttributeTypeNSc             C   s   d S)NFr
   )r   r
   r
   r   r$    s    zElementInfo.isElementContentc             C   s   d S)zQReturns true iff this element is declared to have an EMPTY
        content model.Fr
   )r   r
   r
   r   isEmpty  s    zElementInfo.isEmptyc             C   s   d S)z7Returns true iff the named attribute is a DTD-style ID.Fr
   )r   rW  r
   r
   r   r     s    zElementInfo.isIdc             C   s   d S)z<Returns true iff the identified attribute is a DTD-style ID.Fr
   )r   rq   rv   r
   r
   r   r     s    zElementInfo.isIdNSc             C   s   |  j  S)N)r   )r   r
   r
   r   r     s    zElementInfo.__getstate__c             C   s   | |  _  d  S)N)r   )r   r   r
   r
   r   r     s    zElementInfo.__setstate__N)ztagName)rn   ro   rp   r   r   r   r   r   r$  rX  r   r   r   r   r
   r
   r
   r   rV    s   rV  c             C   sZ   |  j  t j k r+ |  j j   d  |  _ n+ t |   rV |  j j j   d  |  j _ n  d  S)N)r   r	   r   	_id_cacheclear_id_search_stackrx   rO   )rA   r
   r
   r   r:     s    r:   c               @   s0  e  Z d  Z dM Z e j e j e j e j f Z	 e
   Z e j Z d Z d Z d Z d Z d Z Z d Z d Z d Z d Z d Z d Z d Z d	 Z d
 d   Z d d   Z d d   Z d d   Z d d   Z  d d   Z! d d   Z" d d   Z# d d   Z$ d d   Z% d d   Z& d  d!   Z' d" d#   Z( d$ d%   Z) d& d'   Z* d( d)   Z+ d* d+   Z, d, d-   Z- d. d/   Z. d0 d1   Z/ d2 d3   Z0 d4 d5   Z1 d6 d7   Z2 d8 d9   Z3 d: d;   Z4 d< d=   Z5 d> d?   Z6 d@ dA   Z7 dB dC   Z8 dD dE   Z9 dF dG   Z: dH dH dH d dI dJ  Z; dK dL   Z< d S)NrT  
_elem_inforQ  r[  r$   rY  z	#documentNFr   c             C   s4   d  |  _  t   |  _ i  |  _ i  |  _ d  |  _ d  S)N)rQ  rj   r$   r\  rY  r[  )r   r
   r
   r   r     s
    			zDocument.__init__c             C   s7   | j  r | j  | j f } n	 | j } |  j j |  S)N)rq   rv   r   r\  r   )r   r  r^   r
   r
   r   r     s    		zDocument._get_elem_infoc             C   s   |  j  S)N)r<  )r   r
   r
   r   rC    s    zDocument._get_actualEncodingc             C   s   |  j  S)N)rQ  )r   r
   r
   r   _get_doctype  s    zDocument._get_doctypec             C   s   |  j  S)N)documentURI)r   r
   r
   r   _get_documentURI"  s    zDocument._get_documentURIc             C   s   |  j  S)N)r   )r   r
   r
   r   rD  %  s    zDocument._get_encodingc             C   s   |  j  S)N)errorHandler)r   r
   r
   r   _get_errorHandler(  s    zDocument._get_errorHandlerc             C   s   |  j  S)N)
standalone)r   r
   r
   r   _get_standalone+  s    zDocument._get_standalonec             C   s   |  j  S)N)strictErrorChecking)r   r
   r
   r   _get_strictErrorChecking.  s    z!Document._get_strictErrorCheckingc             C   s   |  j  S)N)rU   )r   r
   r
   r   rE  1  s    zDocument._get_versionc             C   s   | j  |  j k r= t j j d t |  t |   f   n  | j d  k	 r_ | j j |  n  | j  t j	 k r |  j
   r t j j d   n  t j |  |  S)Nz%s cannot be child of %sz two document elements disallowed)r   r.   r/   r0   r1   r2   r3   r4   r	   rJ   _get_documentElementr5   )r   rA   r
   r
   r   r5   4  s    	"	zDocument.appendChildc             C   sp   y |  j  j |  Wn! t k
 r7 t j j    Yn Xd  | _ | _ d  | _ |  j	 | k rl d  |  _	 n  | S)N)
r$   rE   r7   r/   r0   r8   r<   r=   r3   documentElement)r   rC   r
   r
   r   r4   D  s    	zDocument.removeChildc             C   s.   x' |  j  D] } | j t j k r
 | Sq
 Wd  S)N)r$   r   r	   rJ   )r   rA   r
   r
   r   rf  P  s    zDocument._get_documentElementc             C   s9   |  j  d  k	 r( |  j  j   d  |  _  n  t j |   d  S)N)rQ  rH   r	   )r   r
   r
   r   rH   U  s    zDocument.unlinkc             C   s  | s
 d  S|  j  j d  d  d   } |  j | _ |  j | _ |  j | _ x |  j D] } t | | |  } | j j |  s t	  | j j
 |  | j t j k r | j d  k s t	  n3 | j t j k r | j d  k s t	  | | _ n  | | _ qP W|  j t j j j |  |  | S)N)rR   rR  r   rb  rU   r$   rN   rO   rY   AssertionErrorrI   r   r	   r   rg  rB  rQ  r3   ri   r/   r0   r7  r8  )r   rP   r=  r   Z
childcloner
   r
   r   rQ   [  s&    
zDocument.cloneNodec             C   s   t    } |  | _ | S)N)r   rO   )r   rb   r
   r
   r   createDocumentFragmentp  s    		zDocument.createDocumentFragmentc             C   s   t  |  } |  | _ | S)N)r   rO   )r   r   r?  r
   r
   r   createElementu  s    	zDocument.createElementc             C   s=   t  | t  s t d   n  t   } | | _ |  | _ | S)Nznode contents must be a string)r   r   r   r   rG   rO   )r   rG   tr
   r
   r   createTextNodez  s    			zDocument.createTextNodec             C   s=   t  | t  s t d   n  t   } | | _ |  | _ | S)Nznode contents must be a string)r   r   r   r'  rG   rO   )r   rG   r@   r
   r
   r   createCDATASection  s    			zDocument.createCDATASectionc             C   s   t  |  } |  | _ | S)N)r&  rO   )r   rG   r@   r
   r
   r   createComment  s    	zDocument.createCommentc             C   s   t  | |  } |  | _ | S)N)r  rO   )r   r	  rG   pr
   r
   r   createProcessingInstruction  s    	z$Document.createProcessingInstructionc             C   s"   t  |  } |  | _ d | _ | S)Nr   )r   rO   r   )r   r   ar
   r
   r   createAttribute  s    		zDocument.createAttributec             C   s1   t  |  \ } } t | | |  } |  | _ | S)N)r   r   rO   )r   rq   r   rr   rv   r?  r
   r
   r   rP    s    	zDocument.createElementNSc             C   s=   t  |  \ } } t | | | |  } |  | _ d | _ | S)Nr   )r   r   rO   r   )r   rq   r   rr   rv   rq  r
   r
   r   createAttributeNS  s
    		zDocument.createAttributeNSc             C   s"   t  | | | |  } |  | _ | S)N)r:  rO   )r   r   r-  r.  r;  r?  r
   r
   r   _create_entity  s    	zDocument._create_entityc             C   s   t  | | |  } |  | _ | S)N)r9  rO   )r   r   r-  r.  r   r
   r
   r   _create_notation  s    	zDocument._create_notationc             C   s0  | |  j  k r |  j  | S|  j p) |  j s0 d  S|  j } | d  k r] |  j g } | |  _ n
 | sg d  Sd  } x| r+| j   } | j d d   | j D  |  j |  } | rxa| j	 j
   D] } | j r&| j | j | j  r| |  j  | j <| j | k r| } q#| j s#Pq#qq | j | j  rp| |  j  | j <| j | k r`| } q| j sPqq | j r | |  j  | j <| j | k r| } q| j d k rPqq q WnZ | j rxN | j	 j
   D]: } | j r| |  j  | j <| j | k r| } qqqWn  | d  k	 rp Pqp qp W| S)Nc             S   s%   g  |  ] } | j  t k r |  q Sr
   )r   r9   ).0rM   r
   r
   r   
<listcomp>  s   	 z+Document.getElementById.<locals>.<listcomp>r(   )rY  r\  r   r[  rg  popextendr$   r   r   r   rq   r   rv   r   r   r   r   r   )r   r   stackresultrA   r   r   r
   r
   r   getElementById  sZ    					
						zDocument.getElementByIdc             C   s   t  |  | t    S)N)r   rj   )r   r   r
   r
   r   r     s    zDocument.getElementsByTagNamec             C   s   t  |  | | t    S)N)r   rj   )r   rq   rv   r
   r
   r   r     s    zDocument.getElementsByTagNameNSc             C   s   |  j  j | |  S)N)rR   rS   )r   rT   rU   r
   r
   r   rV     s    zDocument.isSupportedc             C   s^   | j  t j k r' t j j d   n' | j  t j k rN t j j d   n  t | | |   S)Nzcannot import document nodesz!cannot import document type nodes)r   r	   r   r/   r0   NotSupportedErrrB  rN   )r   rA   rP   r
   r
   r   
importNode  s
    zDocument.importNoder   c             C   se   | d  k r  | j  d |  n | j  d | | f  x' |  j D] } | j | | | |  qA Wd  S)Nz<?xml version="1.0" ?>z%<?xml version="1.0" encoding="%s"?>%s)r~   r$   r   )r   r"   r    r   r!   r   rA   r
   r
   r   r     s    	zDocument.writexmlc             C   s  | j  |  k	 r1 t j j d |  | j  f   n  | j t j t j f k ra t j j d   n  | t	 k rd | k r | j
 d d  \ } } | d k r| t j j k rt j j d   qq'| d k r| t j j k r| j t j k rt j j d   n  d  } | } n d  } d  } | j t j k rj| j } | d  k	 rp| j } | j |  qpn d  } | | _ | | _ | | _ | | _ | j t j k r| | _ n; | | _ | d  k	 r| j |  | r| j |  qn  | S)Nz?cannot rename nodes from other documents;
expected %s,
found %sz8renameNode() only applies to element and attribute nodesr   r(   r   zillegal use of 'xmlns' prefixz$illegal use of the 'xmlns' attribute)rO   r/   r0   rN  r   r	   rJ   r   r}  r   r   r   r   r   r   r   rr   r   rq   r   r   r   r   r   )r   r   rq   r   rr   rv   r  Zis_idr
   r
   r   
renameNode
  sR    												zDocument.renameNode)z
_elem_infozdoctypez_id_search_stackz
childNodesz	_id_cache)=rn   ro   rp   r   r	   rJ   r   r   rB  r.   rF  rR   r   r   r   r   r   r3   r=   r<   r<  r   rb  rU   rd  r`  r^  r   r   r   rC  r]  r_  rD  ra  rc  re  rE  r5   r4   rf  rH   rQ   ri  rj  rl  rm  rn  rp  rr  rP  rs  rt  ru  r|  r   r   rV   r~  r   r  r
   r
   r
   r   rT    sh    		
	
:rT  rg  z#Top-level element of this document.c             C   s  |  j  j |  r$ t j j j } n t j j j } |  j t j	 k r | j
 |  j |  j  } xW |  j j   D]F } | j | j | j | j  | j | j | j  } | j | _ qm W| rx3 |  j D]% } t | | |  } | j |  q Wqn|  j t j k rS| j   } | rx3 |  j D]% } t | | |  } | j |  q$Wqn|  j t j k rz| j |  j  } nm|  j t j k r| j |  j  } nF|  j t j k r| j |  j  |  j  } n|  j t j! k r| j" |  j  } n|  j t j# k r7| j$ |  j |  j  } d | _ |  j | _ n|  j t j% k r|  j  | k	 s^t&  t j j j } | j' j( |  j) |  j* |  j+  } | | _  | rg  | j, _- g  | j. _- xp |  j. j- D]b }	 t/ |	 j |	 j* |	 j+  }
 | |
 _  | j. j- j0 |
  t1 |	 d  r|	 j2 | |	 |
  qqWx |  j, j- D] } t3 | j | j* | j+ | j4  } | j5 | _5 | j6 | _6 | j7 | _7 | | _  | j, j- j0 |  t1 | d  r5| j2 | |	 |  q5q5Wqn t j j8 d t9 |     t1 |  d  r|  j2 | |  |  n  | S)zo
    Clone a node and give it the new owner document.
    Called by Node.cloneNode and Document.importNode
    Tri   zCannot clone node %s):rO   rY   r/   r0   r7  r8  ZNODE_IMPORTEDr   r	   rJ   rP  rq   r   r   r   r   r   r   rv   r   r$   rN   r5   r+   ri  rF   rl  rG   r   rm  r   rp  r	  r   rn  r   rs  rB  rh  rR   rS  r   r-  r.  r3  r*  r4  r9  rI   rd   ri   r:  r;  r<  r   rU   r}  r2   )rA   rP   ZnewOwnerDocumentrg   r=  r   rq  rM   r@   r   r>  r?  r@  r
   r
   r   rN   C  s~    					 rN   c             C   s:   |  j  d d  } t |  d k r( | Sd  | d f Sd  S)Nr   r(      r   )r   r   )r   Zfieldsr
   r
   r   r     s    r   c             C   s<   |  | |   } | j    \ } } | j |  | j   | S)N)ZgetEventZ
expandNoderZ  )funcargskwargsZeventsZtoktypeZrootNoder
   r
   r   _do_pulldom_parse  s
    
r  c             C   sh   | d k r0 | r0 d d l  m } | j |   Sd d l  m } t | j |  f i | d 6| d 6 Sd S)z3Parse a file into a DOM by filename or file object.Nr   )expatbuilder)pulldomparserbufsize)xml.domr  parser  r  )filer  r  r  r  r
   r
   r   r    s    r  c             C   sZ   | d k r) d d l  m } | j |   Sd d l  m } t | j |  f i | d 6 Sd S)z&Parse a file into a DOM from a string.Nr   )r  )r  r  )r  r  parseStringr  r  )stringr  r  r  r
   r
   r   r    s    r  c             C   sa   |  rZ t  |  t  r' t j |   }  n  x0 |  D]% \ } } t j j | |  s. d  Sq. Wn  t j S)N)r   r   r   Z_parse_feature_stringrT  rR   rS   )Zfeaturesfvr
   r
   r   getDOMImplementation  s    r  )7r   r   r  r/   r   r   r   r   Zxml.dom.minicompatZxml.dom.xmlbuilderr   r   r0   r	   rJ   r   r9   ZdefpropertyrB   rx   r   r   r   r   r   objectr   ZAttributeListr   r   r   r   r  r  r  r   r#  r  r&  r'  r)  r,  r2  r:  r9  rF  rV  r:   rT  rN   r   r  r  r  r  r
   r
   r
   r   <module>   s   "

	y)GU	><(	O* OR

