B
    2*\                @   s  d Z ddlZddlZddlmZmZmZmZ ddlT ddl	m
Z
mZ ejjjejjjfZG d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G dd deZG dd deZeeddd
 eeddd
 eed d!d
 G d"d# d#eZeed$d%d
 eZG d&d' d'eZeddZG d(d) d)eZeed*d+d
 eedd,d
 d-d. ZG d/d0 d0Z G d1d2 d2e eZ!G d3d4 d4e eZ"ee"d$d5d
 G d6d7 d7e"Z#ee#d8d9d
 ee#d:d;d
 d<d= Z$d>d? Z%G d@dA dAe"Z&G dBdC dCe#Z'G dDdE dEeZ(ee(d$dFd
 G dGdH dHZ)G dIdJ dJe)e eZ*G dKdL dLe)eZ+G dMdN dNe)e eZ,G dOdP dPe
Z-G dQdR dReZ.dSdT Z/G dUdV dVeeZ0ee0dWdXd
 dYdZ Z1d[d\ Z2d]d^ Z3ded_d`Z4dfdadbZ5dgdcddZ6dS )hac  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               @   s   e Zd ZdZdZdZdZdZeZ	dd Z
d2ddZd3d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d0d1 Z dS )4NodeNc             C   s   dS )NT )selfr
   r
   :C:\ALexclude\prg\programme\Python37\Lib\xml\dom\minidom.py__bool__+   s    zNode.__bool__c             C   s   |  dd|S )N )toprettyxml)r   encodingr
   r
   r   toxml.   s    z
Node.toxml	
c             C   sx   |d krt  }nt jt  |ddd}| jtjkrH| |d||| n| |d|| |d krh| S |	  S d S )Nxmlcharrefreplacer   )r   errorsnewliner   )
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 S d S )Nr   )r$   )r   r
   r
   r   _get_firstChildI   s    zNode._get_firstChildc             C   s   | j r| j d S d S )N)r$   )r   r
   r
   r   _get_lastChildM   s    zNode._get_lastChildc             C   s  |j | jkr0xt|jD ]}| || qW |S |j | jkrXtjdt	|t	| f |j
d k	rn|j
| |d kr| | ny| j|}W n tk
r   tj Y nX |j tkrt|  | j|| ||_||_|r| j|d  }||_||_nd |_| |_
|S )Nz%s cannot be child of %s   )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 ]}| | qW |S |j | jkrXtjdt	|t	| f n|j t
krjt|  |jd k	r|j| 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r(|j}| | | ||S |j | jkrPtjdt	|t	| f ||kr\d S |j
d k	rr|j
| y| j|}W n tk
r   tj Y nX || j|< | |_
d |_
|j tks|j tkrt|  |j|_|j|_d |_d |_|jr||j_|jr||j_|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 | W n tk
r.   tj Y nX |jd k	rD|j|j_|jd k	rX|j|j_d  |_|_|jt	krvt
|  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   s   g }x| j D ]}|jtjkr|jsL|r2|j|d _|jrB|j|j_|  q|r|d j|jkr|d }|j|j |_|j|_|jr||j_|  q|| q|| |jtj	kr|
  qW || j d d < d S )Nr(   )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||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   |  |d r| S d S d S )N)rV   )r   rT   r
   r
   r   getInterface   s    zNode.getInterfacec          	   C   s,   y| j | d S  ttfk
r&   d S X d S )Nr   )
_user_dataAttributeErrorKeyError)r   keyr
   r
   r   getUserData   s    zNode.getUserDatac             C   sn   d }y
| j }W n tk
r,   i }|| _ Y nX ||krB|| d }|d kr^d }|d k	rj||= n||f||< |S )Nr   )r[   r\   )r   r^   rG   handlerolddr
   r
   r   setUserData   s    
zNode.setUserDatac             C   sH   t | drDx8t| j D ]&\}\}}|d k	r|||||| qW d S )Nr[   )hasattrlistr[   itemshandle)r   	operationsrcdstr^   rG   r`   r
   r
   r   _call_user_data_handler   s    
zNode._call_user_data_handlerc             C   sB   d  | _ | _| jr2x| jD ]}|  qW t | _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   |    d S )N)rH   )r   etZevtbr
   r
   r   __exit__  s    zNode.__exit__)N)r   r   N)!__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   rk   rH   rm   rp   r
   r
   r
   r   r	   "   s:   

  
r	   
firstChildzFirst child node, or None.)doc	lastChildzLast child node, or None.	localNamez"Namespace-local name of this node.c             C   s2   | j }|r|d }||_||_|| | |_d S )Nr(   )r$   r=   r<   rI   r3   )r   rA   r$   Zlastr
   r
   r   rB     s    
rB   c             C   s(   x"| d k	r"| j tjkrdS | j} qW dS )NTF)r   r	   r   r3   )rA   r
   r
   r   _in_document&  s
    

rz   c             C   s6   |r2| dd dd dd dd}| | 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    r   c             C   sH   xB| j D ]8}|jtjkr4|dks*|j|kr4|| 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\   xV| j D ]L}|jtjkr|dks*|j|krF|dks<|j|krF|| t|||| qW |S )Nr   )r$   r   r	   rJ   ry   rt   rI   "_get_elements_by_tagName_ns_helper)r   ZnsURIry   r   rA   r
   r
   r   r   =  s    
r   c               @   sJ   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)rl   r$   )r   r
   r
   r   __init__T  s    zDocumentFragment.__init__)rq   rr   rs   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f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_valuert   _prefixr$   
_localNamerO   ownerElementNFc             C   s2   d | _ || _|| _|| _t | _| jt  d S )N)r   r   rt   r   rl   r$   rI   Text)r   qNamert   ry   ru   r
   r
   r   r   b  s    zAttr.__init__c             C   s.   y| j S  tk
r(   | jddd S X d 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 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   s6   || _ || jd _| jd k	r&t| j || 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   sd   | j }|dkr&|r&|tkr&tjd|| _|d kr<| j}nd|| jf }| jrZt| j || _	d S )Nxmlnsz5illegal use of 'xmlns' prefix for the wrong namespacez%s:%s)
rt   r   r/   r0   NamespaceErrr   ry   r   r:   r   )r   ru   ZnsuriZnewNamer
   r
   r   _set_prefix  s    
zAttr._set_prefixc             C   sz   | j }|d k	rR|j| j= |j| j| jf= | jrRd| _| jd8  _| j j	d8  _	x| j
D ]}|  qZW | j
d d = d S )NFr*   )r   _attrsr   _attrsNSrt   ry   _is_id_magic_id_nodesrO   _magic_id_countr$   rH   )r   elemrM   r
   r
   r   rH     s    
zAttr.unlinkc             C   sf   | j r
dS | j}| j}|d ks&|d kr*dS ||}|d kr@dS | jrV|| j| jS || jS d S )NTF)	r   rO   r   _get_elem_infort   isIdNSry   isIdr   )r   rw   r   infor
   r
   r   	_get_isId  s    
zAttr._get_isIdc             C   s\   | j }| j}|d ks|d kr tS ||}|d kr6tS | jrL|| j| jS || jS d S )N)	rO   r   _no_typer   rt   getAttributeTypeNSry   getAttributeTyper   )r   rw   r   r   r
   r
   r   _get_schemaType  s    
zAttr._get_schemaType) rq   rr   rs   	__slots__r	   ATTRIBUTE_NODEr   r   r   r   rF   r   r.   r   r   rW   r   r   r   propertyr   r   r   r   r   r   r   r   ru   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               @   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: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d.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 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   s0   y| t | j |  S  tk
r*   d S X d S )N)re   r   keys
IndexError)r   r6   r
   r
   r   item  s    zNamedNodeMap.itemc             C   s.   g }x$| j  D ]}||j|jf qW |S )N)r   valuesrI   r   r   )r   rL   rA   r
   r
   r   rf     s    zNamedNodeMap.itemsc             C   s4   g }x*| j  D ]}||j|jf|jf qW |S )N)r   r   rI   rt   ry   r   )r   rL   rA   r
   r
   r   itemsNS  s    zNamedNodeMap.itemsNSc             C   s"   t |tr|| jkS || jkS d S )N)
isinstancestrr   r   )r   r^   r
   r
   r   __contains__  s    

zNamedNodeMap.__contains__c             C   s
   | j  S )N)r   r   )r   r
   r
   r   r     s    zNamedNodeMap.keysc             C   s
   | j  S )N)r   r   )r   r
   r
   r   keysNS  s    zNamedNodeMap.keysNSc             C   s
   | j  S )N)r   r   )r   r
   r
   r   r     s    zNamedNodeMap.valuesNc             C   s   | j ||S )N)r   get)r   r   r   r
   r
   r   r   
  s    zNamedNodeMap.getc             C   s:   | j t|dd krdS t| t|kt| t|k  S d S )Nr   r   )r   getattrid)r   rX   r
   r
   r   _cmp  s    zNamedNodeMap._cmpc             C   s   |  |dkS )Nr   )r   )r   rX   r
   r
   r   __eq__  s    zNamedNodeMap.__eq__c             C   s   |  |dkS )Nr   )r   )r   rX   r
   r
   r   __ge__  s    zNamedNodeMap.__ge__c             C   s   |  |dkS )Nr   )r   )r   rX   r
   r
   r   __gt__  s    zNamedNodeMap.__gt__c             C   s   |  |dkS )Nr   )r   )r   rX   r
   r
   r   __le__  s    zNamedNodeMap.__le__c             C   s   |  |dk S )Nr   )r   )r   rX   r
   r
   r   __lt__!  s    zNamedNodeMap.__lt__c             C   s"   t |tr| j| S | j| S d S )N)r   r,   r   r   )r   attname_or_tupler
   r
   r   __getitem__$  s    

zNamedNodeMap.__getitem__c             C   sv   t |trRy| j| }W n0 tk
rH   t|}| jj|_| | Y nX ||_n t |tsdt	d|}| | 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 | S  tk
r   d S X d S )N)r   r]   )r   r   r
   r
   r   getNamedItem:  s    
zNamedNodeMap.getNamedItemc             C   s(   y| j ||f S  tk
r"   d S X d S )N)r   r]   )r   rt   ry   r
   r
   r   getNamedItemNS@  s    zNamedNodeMap.getNamedItemNSc             C   sX   |  |}|d k	rJt| j | j|j= | j|j|jf= t|drFd |_	|S t
j d S )Nr   )r   r:   r   r   r   r   rt   ry   rd   r   r/   r0   r8   )r   r   nr
   r
   r   removeNamedItemF  s    



zNamedNodeMap.removeNamedItemc             C   sZ   |  ||}|d k	rLt| j | j|j|jf= | j|j= t|drHd |_	|S t
j d S )Nr   )r   r:   r   r   rt   ry   r   r   rd   r   r/   r0   r8   )r   rt   ry   r   r
   r
   r   removeNamedItemNSR  s    


zNamedNodeMap.removeNamedItemNSc             C   st   t |ts&tjdt|t| f | j|j}|r@|	  || 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   rt   ry   r   r   r:   )r   rA   ra   r
   r
   r   r   ^  s    

zNamedNodeMap.setNamedItemc             C   s
   |  |S )N)r   )r   rA   r
   r
   r   setNamedItemNSk  s    zNamedNodeMap.setNamedItemNSc             C   s   | | }t |j |  d S )N)r:   r   rH   )r   r   rA   r
   r
   r   __delitem__n  s    
zNamedNodeMap.__delitem__c             C   s   | j | j| jfS )N)r   r   r   )r   r
   r
   r   __getstate__s  s    zNamedNodeMap.__getstate__c             C   s   |\| _ | _| _d S )N)r   r   r   )r   stater
   r
   r   __setstate__v  s    zNamedNodeMap.__setstate__)N)!rq   rr   rs   __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     s<   
r   lengthz$Number of nodes in the NamedNodeMap.c               @   s0   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   s2   | j rd| jj| j| j f S d| jj| jf S d S )Nz<%s %r (from %r)>z<%s %r>)r   	__class__rq   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)rq   rr   rs   r   r   r   r   r   r
   r
   r
   r   r     s
   r   c               @   s   e Zd Zd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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eZdd Zdd Z d d! Z!e!Z"d"d# Z#d$d% Z$d&d' Z%d(d) Z&d*d+ Z'd9d-d.Z(d/d0 Z)d1d2 Z*d3d4 Z+d5d6 Z,d7d8 Z-dS ):Element)rO   r3   r   r   ru   rt   r   r$   r   r   r<   r=   Nr   c             C   sB   d | _ | | _| _|| _|| _t | _d  | _| _d | _	d | _
d S )N)r3   r   r   ru   rt   rl   r$   r<   r=   r   r   )r   r   rt   ru   ry   r
   r
   r   r     s    
zElement.__init__c             C   s   | j d kri | _ i | _d S )N)r   r   )r   r
   r
   r   _ensure_attributes  s    
zElement._ensure_attributesc             C   s.   y| j S  tk
r(   | jddd S X d 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   sD   | j d k	r*xt| j  D ]}|  qW d | _ d | _t|  d S )N)r   re   r   rH   r   r	   )r   attrr
   r
   r   rH     s    
zElement.unlinkc             C   s4   | j d krdS y| j | jS  tk
r.   dS X d S )Nr   )r   r   r]   )r   r   r
   r
   r   getAttribute  s    
zElement.getAttributec             C   s8   | j d krdS y| j ||f jS  tk
r2   dS X d S )Nr   )r   r   r]   )r   rt   ry   r
   r
   r   getAttributeNS  s    
zElement.getAttributeNSc             C   sV   |  |}|d kr4t|}||_| j|_| | n||jkrR||_|jrRt|  d S )N)getAttributeNoder   r   rO   setAttributeNoder   r:   )r   r   r   r   r
   r
   r   setAttribute  s    

zElement.setAttributec             C   s   t |\}}| ||}|d krHt||||}||_| j|_| | n4||jkrf||_|jrft|  |j|kr|||_||_	d S )N)
_nssplitgetAttributeNodeNSr   r   rO   r   r   r:   ru   r   )r   rt   qualifiedNamer   ru   	localnamer   r
   r
   r   setAttributeNS  s    

zElement.setAttributeNSc             C   s   | j d krd S | j |S )N)r   r   )r   Zattrnamer
   r
   r   r     s    
zElement.getAttributeNodec             C   s   | j d krd S | j ||fS )N)r   r   )r   rt   ry   r
   r
   r   r     s    
zElement.getAttributeNodeNSc             C   s   |j d | fkrtjd|   | j|jd }|d k	rD| | | j	|j
|jfd }|d k	rt||k	rt| | t| | ||k	r|S ||k	r|S d S )Nzattribute node already owned)r   r/   r0   ZInuseAttributeErrr   r   r   r   removeAttributeNoder   rt   ry   _set_attribute_node)r   r   Zold1Zold2r
   r
   r   r     s    


zElement.setAttributeNodec             C   sP   | j d krtj y| j| }W n tk
r@   tj Y nX | | d S )N)r   r/   r0   r8   r   r]   r   )r   r   r   r
   r
   r   removeAttribute  s    

zElement.removeAttributec             C   sT   | j d krtj y| j ||f }W n tk
rD   tj Y nX | | d S )N)r   r/   r0   r8   r]   r   )r   rt   ry   r   r
   r
   r   removeAttributeNS%  s    

zElement.removeAttributeNSc             C   s^   |d krt j y| j|j  W n tk
r@   t j Y nX t|  |  | j|_d S )N)	r/   r0   r8   r   r   r]   r:   rH   rO   )r   rA   r
   r
   r   r   .  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   rt   ry   r
   r
   r   hasAttributeNSB  s    
zElement.hasAttributeNSc             C   s   t | |t S )N)r   rl   )r   r   r
   r
   r   getElementsByTagNameG  s    zElement.getElementsByTagNamec             C   s   t | ||t S )N)r   rl   )r   rt   ry   r
   r
   r   getElementsByTagNameNSJ  s    zElement.getElementsByTagNameNSc             C   s   d| j t| f S )Nz<DOM Element: %s at %#x>)r   r   )r   r
   r
   r   r   N  s    zElement.__repr__r   c       	      C   s  | |d | j  |  }t| }x4|D ],}| d|  t||| j | d q.W | jr| d t| jdkr| jd j	t
jkr| jd |ddd n8| | x"| jD ]}|||| || qW | | | d| j|f  n| d	|  d S )
Nr|   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   Q  s$    



zElement.writexmlc             C   s   |    t| j| j| S )N)r   r   r   r   )r   r
   r
   r   r   l  s    zElement._get_attributesc             C   s   | j r
dS dS d S )NTF)r   )r   r
   r
   r   hasAttributesp  s    zElement.hasAttributesc             C   s   |  |}| | d S )N)r   setIdAttributeNode)r   r   idAttrr
   r
   r   setIdAttributex  s    
zElement.setIdAttributec             C   s   |  ||}| | d S )N)r   r  )r   rt   ry   r  r
   r
   r   setIdAttributeNS|  s    zElement.setIdAttributeNSc             C   sj   |d ks|  |jstj t| d k	r4tj |jsfd|_|  jd7  _| j	 j
d7  _
t|  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)r   r   r   ).rq   rr   rs   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     sP   		
r   r   z*NamedNodeMap of attributes on the element.z%Namespace-local name of this element.c             C   s8   t |  |   || j|j< || j|j|jf< | |_d S )N)r:   r   r   r   r   rt   ry   r   )elementr   r
   r
   r   r     s
    r   c               @   sf   e Zd ZdZd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.
    r
   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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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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d d S )Nz nodes do not have children)r/   r0   r1   r   )r   r>   rC   r
   r
   r   rD     s    zChildless.replaceChild)rq   rr   rs   r   r   r   ZEmptyNodeListr$   rv   rx   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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   | 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)r   r   r   )rq   rr   rs   r	   r   r   r   r   r  r  r   r   r  r  r   r   r
   r
   r
   r   r    s   

r  c               @   sr   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|  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   s6   | 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   r   rq   )r   rG   Z	dotdotdotr
   r
   r   r     s    zCharacterData.__repr__c             C   sT   |dk rt jd|t| jkr.t jd|dk rBt jd| 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   sZ   |dk rt jd|t| jkr.t jd|rVd| jd | || j|d  f | _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   sl   |dk rt jd|t| jkr.t jd|dk rBt jd|rh| jd | | j|| d   | _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   sr   |dk rt jd|t| jkr.t jd|dk rBt jd|rnd| jd | || j|| d  f | _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)rq   rr   rs   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               @   sH   e Zd ZdZejZdZdZdd Z	dddZ
d	d
 Zdd Zdd ZdS )r   r
   z#textNc             C   s   |dk s|t | jkr"tjd|  }| j|d  |_| j|_| j}| jr~| | jj	kr~|d krp| j
| n| j|| | 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   	splitText0  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   ?  s    zText.writexmlc             C   s   | j g}| j}x6|d k	rD|jtjtjfkr@|d|j  |j}qP qW | j}x4|d k	r|jtjtjfkr|||j  |j}qNP qNW d	|S )Nr   r   )
rG   r=   r   r	   rF   r   r;   r<   rI   join)r   rL   r   r
   r
   r   _get_wholeTextD  s    

zText._get_wholeTextc             C   s   | j }| j}x6|d k	rB|jtjtjfkr>|j}|| |}qP qW | j}|sX||  x6|d k	r|jtjtjfkr|j}|| |}qZP qZW |r|| _| S d S d S )N)	r3   r=   r   r	   rF   r   r4   r<   rG   )r   Zcontentr   r   r  r
   r
   r   replaceWholeTextV  s*    




zText.replaceWholeTextc             C   sF   | j  rdS t| }|d kr"dS | j|}|d kr:dS | S d S )NF)rG   strip_get_containing_elementrO   r   isElementContent)r   r   r   r
   r
   r   !_get_isWhitespaceInElementContentr  s    
z&Text._get_isWhitespaceInElementContent)r   r   r   )rq   rr   rs   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W d 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W d 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ZdS )	Commentz#commentc             C   s   t |  || _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|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)r   r   r   )	rq   rr   rs   r	   r   r   r   r   r   r
   r
   r
   r   r(    s   r(  c               @   s$   e Zd ZdZejZdZdddZdS )CDATASectionr
   z#cdata-sectionr   c             C   s,   | j ddkrtd|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)r   r   r   )	rq   rr   rs   r   r	   r   r   r   r   r
   r
   r
   r   r)    s   r)  c               @   sz   e Zd ZdZ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S )ReadOnlySequentialNamedNodeMap)_seqr
   c             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|S qW d S )N)r,  r   )r   r   r   r
   r
   r   r     s    
z+ReadOnlySequentialNamedNodeMap.getNamedItemc             C   s,   x&| j D ]}|j|kr|j|kr|S qW d S )N)r,  rt   ry   )r   rt   ry   r   r
   r
   r   r     s    z-ReadOnlySequentialNamedNodeMap.getNamedItemNSc             C   s4   t |tr| j| }n
| |}|d kr0t||S )N)r   r,   r   r   r]   )r   Zname_or_tuplerA   r
   r
   r   r     s    

z*ReadOnlySequentialNamedNodeMap.__getitem__c             C   s0   |dk rd S y
| j | S  tk
r*   d S X d S )Nr   )r,  r   )r   r6   r
   r
   r   r     s    
z#ReadOnlySequentialNamedNodeMap.itemc             C   s   t 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dd S )Nz"NamedNodeMap instance is read-only)r/   r0   r  )r   rt   ry   r
   r
   r   r     s    z0ReadOnlySequentialNamedNodeMap.removeNamedItemNSc             C   s   t 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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)r
   )rq   rr   rs   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/  r0  )r   r/  r0  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)r0  )r   r
   r
   r   _get_systemId  s    zIdentified._get_systemIdN)rq   rr   rs   r   r   r1  r2  r3  r
   r
   r
   r   r.    s
   r.  c               @   sH   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
ZdS )DocumentTypeNc             C   s2   t  | _t  | _|r&t|\}}|| _| j| _d S )N)r+  entities	notationsr   r   r   )r   r   ru   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d }| j|_| j|_tjjj}|rg |j_	g |j
_	x>| j
j	D ]2}t|j|j|j}|j
j	| |||| qJW xZ| jj	D ]N}t|j|j|j|j}|j|_|j|_|j|_|jj	| |||| qW | || | |S d S d S )N)rO   r4  r   r   r/   r0   UserDataHandlerNODE_CLONEDr5  r,  r6  Notationr/  r0  rI   rk   EntitynotationNameactualEncodingr   rU   )r   rP   clonerh   r   notationeentityr
   r
   r   rQ     s.    

zDocumentType.cloneNoder   c             C   s   | d | | j | jr8| d|| j|| jf  n| jrR| d|| jf  | jd k	r|| d | | j | d | d|  d S )Nz
<!DOCTYPE z%s  PUBLIC '%s'%s  '%s'z%s  SYSTEM '%s'z []r~   )r   r   r/  r0  r7  )r   r"   r    r  r!   r
   r
   r   r   /  s    



zDocumentType.writexml)r   r   r   )rq   rr   rs   r	   DOCUMENT_TYPE_NODEr   r   r   r/  r0  r7  r   r8  rQ   r   r
   r
   r
   r   r4    s   r4  c               @   sf   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   s$   || _ || _t | _| || d S )N)r   r=  rl   r$   r1  )r   r   r/  r0  r@  r
   r
   r   r   F  s    zEntity.__init__c             C   s   | j S )N)r>  )r   r
   r
   r   _get_actualEncodingL  s    zEntity._get_actualEncodingc             C   s   | j S )N)r   )r   r
   r
   r   _get_encodingO  s    zEntity._get_encodingc             C   s   | j S )N)rU   )r   r
   r
   r   _get_versionR  s    zEntity._get_versionc             C   s   t jdd S )Nz(cannot append children to an entity node)r/   r0   r1   )r   r>   r
   r
   r   r5   U  s    zEntity.appendChildc             C   s   t jdd S )Nz+cannot insert children below an entity node)r/   r0   r1   )r   r>   r?   r
   r
   r   r-   Y  s    zEntity.insertBeforec             C   s   t 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dd S )Nz)cannot replace children of an entity node)r/   r0   r1   )r   r>   rC   r
   r
   r   rD   a  s    zEntity.replaceChild)rq   rr   rs   r   r	   ZENTITY_NODEr   r   r>  r   rU   r   rE  rF  rG  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 )r;  Nc             C   s   || _ | || d S )N)r   r1  )r   r   r/  r0  r
   r
   r   r   i  s    zNotation.__init__)rq   rr   rs   r	   r   r   r   r   r
   r
   r
   r   r;  e  s   r;  c               @   sH   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)corez1.0)rI  z2.0)rI  N)r/   z1.0)r/   z2.0)r/   N)zls-loadz3.0)zls-loadNc             C   s   |dkrd }|  |f| jkS )Nr   )lower	_features)r   rT   rU   r
   r
   r   rS   y  s    zDOMImplementation.hasFeaturec       	      C   s   |r|j d k	rtjd|  }|d ko8|d ko8|d k }|sP|rPtjd|rt|\}}|dkr||dkr|tjd|r|stjd|||}|r|	| |	| |r| |_ |_
||_| |_|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   rt   r   rO  rw   Zadd_root_elementru   r   r	  r
   r
   r   createDocument~  s4    


z DOMImplementation.createDocumentc             C   s   t |}||_||_|S )N)r4  r/  r0  )r   r   r/  r0  rO  r
   r
   r   createDocumentType  s    z$DOMImplementation.createDocumentTypec             C   s   |  |d r| S d S d S )N)rS   )r   rT   r
   r
   r   rZ     s    zDOMImplementation.getInterfacec             C   s   t  S )N)Document)r   r
   r
   r   rM    s    z"DOMImplementation._create_documentN)	rq   rr   rs   rK  rS   rP  rQ  rZ   rM  r
   r
   r
   r   rH  n  s   -rH  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   rt   ry   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   rT  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   rt   ry   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)rq   rr   rs   r   r   r   r   r   r&  rU  r   r   r   r   r
   r
   r
   r   rS    s   rS  c             C   s>   | j tjkr| j  d | _nt| r:| jj  d | j_d S )N)r   r	   r   	_id_cacheclear_id_search_stackrz   rO   )rA   r
   r
   r   r:     s    
r:   c               @   sr  e Zd Zd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.d,d- Z/d.d/ Z0d0d1 Z1d2d3 Z2d4d5 Z3d6d7 Z4d8d9 Z5d:d; Z6d<d= Z7d>d? Z8d@dA Z9dBdC Z:dIdEdFZ;dGdH Z<dS )JrR  )
_elem_inforO  rX  r$   rV  z	#documentNFr   c             C   s$   d | _ t | _i | _i | _d | _d S )N)rO  rl   r$   rY  rV  rX  )r   r
   r
   r   r   
  s
    zDocument.__init__c             C   s&   |j r|j |jf}n|j}| j|S )N)rt   ry   r   rY  r   )r   r	  r^   r
   r
   r   r     s    zDocument._get_elem_infoc             C   s   | j S )N)r>  )r   r
   r
   r   rE    s    zDocument._get_actualEncodingc             C   s   | j S )N)rO  )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   rF  #  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   rG  /  s    zDocument._get_versionc             C   sj   |j | jkr(tjdt|t| f |jd k	r>|j| |j tj	kr^| 
 r^tjdt| |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   2  s    
zDocument.appendChildc             C   sV   y| j | W n tk
r.   tj Y nX d  |_|_d |_| j	|krRd | _	|S )N)
r$   rE   r7   r/   r0   r8   r<   r=   r3   documentElement)r   rC   r
   r
   r   r4   B  s    
zDocument.removeChildc             C   s$   x| j D ]}|jtjkr|S qW d S )N)r$   r   r	   rJ   )r   rA   r
   r
   r   rc  N  s    zDocument._get_documentElementc             C   s(   | j d k	r| j   d | _ t|  d S )N)rO  rH   r	   )r   r
   r
   r   rH   S  s    

zDocument.unlinkc             C   s   |sd S | j d d d }| j|_| j|_| j|_xx| jD ]n}t|||}|j|sXt	|j
| |jtjkr|jd kst	n |jtjkr|jd kst	||_||_q8W | tjjj| | |S )N)rR   rP  r   r_  rU   r$   rN   rO   rY   AssertionErrorrI   r   r	   r   rd  rD  rO  r3   rk   r/   r0   r9  r:  )r   rP   r?  r   Z
childcloner
   r
   r   rQ   Y  s&    
zDocument.cloneNodec             C   s   t  }| |_|S )N)r   rO   )r   rb   r
   r
   r   createDocumentFragmentn  s    zDocument.createDocumentFragmentc             C   s   t |}| |_|S )N)r   rO   )r   r   rA  r
   r
   r   createElements  s    zDocument.createElementc             C   s(   t |tstdt }||_| |_|S )Nznode contents must be a string)r   r   r   r   rG   rO   )r   rG   tr
   r
   r   createTextNodex  s    
zDocument.createTextNodec             C   s(   t |tstd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   s"   t |\}}t|||}| |_|S )N)r   r   rO   )r   rt   r   ru   ry   rA  r
   r
   r   rN    s    zDocument.createElementNSc             C   s*   t |\}}t||||}| |_d|_|S )Nr   )r   r   rO   r   )r   rt   r   ru   ry   rn  r
   r
   r   createAttributeNS  s
    zDocument.createAttributeNSc             C   s   t ||||}| |_|S )N)r<  rO   )r   r   r/  r0  r=  rA  r
   r
   r   _create_entity  s    zDocument._create_entityc             C   s   t |||}| |_|S )N)r;  rO   )r   r   r/  r0  r   r
   r
   r   _create_notation  s    zDocument._create_notationc             C   s  || j kr| j | S | js$| js$d S | j}|d krB| jg}|| _n|sJd S d }x<|r| }|dd |jD  | |}|r>x|j	
 D ]}|jr||j|jr|| j |j< |j|kr|}n|jsP q||jr|| j |j< |j|kr|}n
|js8P q|jr|| j |j< |j|kr,|}q|jdkrP qW nB|jrx8|j	
 D ]*}|jrR|| j |j< |j|krR|}qRW |d k	rRP qRW |S )Nc             S   s   g | ]}|j tkr|qS r
   )r   r9   ).0rM   r
   r
   r   
<listcomp>  s    z+Document.getElementById.<locals>.<listcomp>r*   )rV  rY  r   rX  rd  popextendr$   r   r   r   rt   r   ry   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   rl   )r   r   r
   r
   r   r     s    zDocument.getElementsByTagNamec             C   s   t | ||t S )N)r   rl   )r   rt   ry   r
   r
   r   r     s    zDocument.getElementsByTagNameNSc             C   s   | 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dn|j tjkr2tjdt||| S )Nzcannot import document nodesz!cannot import document type nodes)r   r	   r   r/   r0   NotSupportedErrrD  rN   )r   rA   rP   r
   r
   r   
importNode  s
    zDocument.importNoder   c             C   sN   |d kr| d|  n| d||f  x| jD ]}||||| q2W d 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   sJ  |j | k	r tjd| |j f |jtjtjfkr>tjd|t	krd|kr|
dd\}}|dkr|tjjkrtjdq|dkr|tjjkr|jtjkrtjdd }|}nd }d }|jtjkr|j}|d k	r|j}|| nd }||_||_||_||_|jtjkr||_n*||_|d k	rF|| |rF|| |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   rL  r   r	   rJ   r   rz  r   r   r   r   r   r   r   ru   r   rt   r   r   r   r   r  )r   r   rt   r   ru   ry   r	  Zis_idr
   r
   r   
renameNode  sR    



zDocument.renameNode)r   r   r   N)=rq   rr   rs   r   r	   rJ   r   r   rD  r.   rH  rR   r   r   r   r   r   r3   r=   r<   r>  r   r_  rU   ra  r]  r[  r   r   r   rE  rZ  r\  rF  r^  r`  rb  rG  r5   r4   rc  rH   rQ   rf  rg  ri  rj  rk  rm  ro  rN  rp  rq  rr  ry  r   r   rV   r{  r   r|  r
   r
   r
   r   rR    sf   	
:
rR  rd  z#Top-level element of this document.c             C   s  | j |rtjjj}n
tjjj}| jtj	kr|
| j| j}x>| j D ]0}||j|j|j ||j|j}|j|_qJW |rx$| jD ]}t|||}|| qW n"| jtjkr| }|rx$| jD ]}t|||}|| qW n| jtjkr|| j}n| jtjkr*|| j}n| jtjkrL|| j | j}n| jtj!krj|"| j}nd| jtj#kr|$| j| j}d|_| j|_n4| jtj%kr| j |k	st&tjjj}|j'(| j)| j*| j+}||_ |rg |j,_-g |j._-xR| j.j-D ]F}	t/|	j|	j*|	j+}
||
_ |j.j-0|
 t1|	dr|	2||	|
 qW x| j,j-D ]b}t3|j|j*|j+|j4}|j5|_5|j6|_6|j7|_7||_ |j,j-0| t1|drR|2||| qRW ntj8dt9|  t1| dr| 2|| | |S )zo
    Clone a node and give it the new owner document.
    Called by Node.cloneNode and Document.importNode
    Trk   zCannot clone node %s):rO   rY   r/   r0   r9  r:  ZNODE_IMPORTEDr   r	   rJ   rN  rt   r   r   r   r   r   r   ry   r   r$   rN   r5   r+   rf  rF   ri  rG   r   rj  r   rm  r  r   rk  r   rp  rD  re  rR   rQ  r   r/  r0  r5  r,  r6  r;  rI   rd   rk   r<  r=  r>  r   rU   rz  r2   )rA   rP   ZnewOwnerDocumentrh   r?  r   rn  rM   r@   r   r@  rA  rB  r
   r
   r   rN   A  s~    

rN   c             C   s,   |  dd}t|dkr|S d |d fS d S )Nr   r*      r   )r   r   )r   Zfieldsr
   r
   r   r     s    r   c             C   s,   | ||}|  \}}|| |  |S )N)ZgetEventZ
expandNoderW  )funcargskwargsZeventsZtoktypeZrootNoder
   r
   r   _do_pulldom_parse  s
    

r  c             C   sH   |dkr"|s"ddl m} || S ddl m} t|j| f||dS d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   sB   |dkrddl m} || S ddl m} t|j| fd|iS d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   sB   | r<t | trt| } x"| D ]\}}tj||sd S qW tjS )N)r   r   r   Z_parse_feature_stringrR  rR   rS   )Zfeaturesfvr
   r
   r   getDOMImplementation  s    

r  )NN)N)N)7r   r   r  r/   r   r   r   r   Zxml.dom.minicompatZxml.dom.xmlbuilderr   r   r0   r	   rJ   r   r9   ZdefpropertyrB   rz   r   r   r   r   r   objectr   ZAttributeListr   r   r   r   r
  r  r  r   r%  r  r(  r)  r+  r.  r4  r<  r;  rH  rS  r:   rR  rN   r   r  r  r  r  r
   r
   r
   r   <module>   s    v
	y $
 w)GU	><(	O*  PR



