U
    `)                    @   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
   %/usr/lib/python3.8/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
childNodesr   r
   r
   r   hasChildNodesC   s    zNode.hasChildNodesc                 C   s   | j S r%   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 Nr)   r   r
   r
   r   _get_lastChildM   s    zNode._get_lastChildc                 C   s
  |j | jkr,t|jD ]}| || q|S |j | jkrTtjdt	|t	| f |j
d k	rj|j
| |d kr~| | nz| j|}W n tk
r   tj Y nX |j tkrt|  | j|| ||_||_|r| j|d  }||_||_nd |_| |_
|S )N%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cr=   noder
   r
   r   r4   Q   s8    

zNode.insertBeforec                 C   s   |j | jkr*t|jD ]}| | q|S |j | jkrTtjdt	|t	| f n|j t
krft|  |jd k	r||j| t| | d |_|S Nr0   )r   r2   r3   r'   r<   r5   r6   r7   r8   r9   r@   rA   r:   r;   _append_childrC   )r   rH   rG   r
   r
   r   r<   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
| z| 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 rI   )r   r2   rC   r;   r4   r5   r6   r7   r8   r9   r:   r'   r=   r>   r?   r@   rA   rD   )r   rE   oldChildrF   r=   r
   r
   r   replaceChild   s@    



zNode.replaceChildc                 C   s   z| 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 r%   )r'   remover>   r6   r7   r?   rC   rD   r   r@   rA   r:   r   rK   r
   r
   r   r;      s    




zNode.removeChildc                 C   s   g }| j D ]}|jtjkr|jsJ|r0|j|d _|jr@|j|j_|  q|r|d j|jkr|d }|j|j |_|j|_|jr||j_|  q|| q
|| |jtj	kr
|
  q
|| j d d < d S r-   )r'   r   r	   	TEXT_NODEdatarC   rD   unlinkappendELEMENT_NODE	normalize)r   LchildrH   r
   r
   r   rT      s*    





zNode.normalizec                 C   s   t | || jp| S r%   )_clone_nodeownerDocument)r   deepr
   r
   r   	cloneNode   s    zNode.cloneNodec                 C   s   | j j||S r%   )rX   implementation
hasFeaturer   featureversionr
   r
   r   isSupported   s    zNode.isSupportedc                 C   s   d S r%   r
   r   r
   r
   r   _get_localName   s    zNode._get_localNamec                 C   s   | |kS r%   r
   r   otherr
   r
   r   
isSameNode   s    zNode.isSameNodec                 C   s   |  |d r| S d S d S r%   )r`   r   r^   r
   r
   r   getInterface   s    zNode.getInterfacec              	   C   s0   z| j | d W S  ttfk
r*   Y d S X d S r+   )
_user_dataAttributeErrorKeyErrorr   keyr
   r
   r   getUserData   s    zNode.getUserDatac                 C   sn   d }z
| j }W n tk
r,   i }|| _ Y nX ||krB|| d }|d kr^d }|d k	rj||= n||f||< |S r+   )rg   rh   )r   rk   rP   handlerolddr
   r
   r   setUserData   s    
zNode.setUserDatac                 C   sD   t | dr@t| j D ]&\}\}}|d k	r|||||| qd S )Nrg   )hasattrlistrg   itemsZhandle)r   	operationsrcZdstrk   rP   rm   r
   r
   r   _call_user_data_handler   s    
zNode._call_user_data_handlerc                 C   s>   d  | _ | _| jr.| jD ]}|  qt | _d | _d | _d S r%   )r:   rX   r'   rQ   NodeListrD   rC   )r   rV   r
   r
   r   rQ     s    

zNode.unlinkc                 C   s   | S r%   r
   r   r
   r
   r   	__enter__  s    zNode.__enter__c                 C   s   |    d S r%   )rQ   )r   ZetZevtbr
   r
   r   __exit__  s    zNode.__exit__)N)r   r   N)!__name__
__module____qualname__namespaceURIr:   rX   rC   rD   r   prefixr   r   r   r(   r*   r,   r/   r4   r<   rL   r;   rT   rZ   r`   ra   rd   rf   rl   rp   rv   rQ   rx   rz   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 r-   )r'   rD   rC   rR   r:   )r   rH   r'   Zlastr
   r
   r   rJ     s    
rJ   c                 C   s$   | d k	r | j tjkrdS | j} q dS NTF)r   r	   r   r:   rH   r
   r
   r   _in_document&  s
    r   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$   rP   r
   r
   r   _write_data.  s      r   c                 C   sD   | j D ]8}|jtjkr2|dks(|j|kr2|| t||| q|S Nr   )r'   r   r	   rS   tagNamerR   _get_elements_by_tagName_helper)parentnamercrH   r
   r
   r   r   5  s    

r   c                 C   sX   | j D ]L}|jtjkr|dks(|j|krD|dks:|j|krD|| t|||| q|S r   )r'   r   r	   rS   r   r~   rR   "_get_elements_by_tagName_ns_helper)r   ZnsURIr   r   rH   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 r%   )rw   r'   r   r
   r
   r   __init__T  s    zDocumentFragment.__init__)r{   r|   r}   r	   r2   r   nodeName	nodeValue
attributesr:   rS   rO   CDATA_SECTION_NODEENTITY_REFERENCE_NODEPROCESSING_INSTRUCTION_NODECOMMENT_NODENOTATION_NODEr5   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_valuer~   _prefixr'   
_localNamerX   ownerElementNFc                 C   s2   d | _ || _|| _|| _t | _| jt  d S r%   )r   r   r~   r   rw   r'   rR   Text)r   qNamer~   r   r   r
   r
   r   r   b  s    zAttr.__init__c                 C   s4   z| j W S  tk
r.   | jddd  Y S X d S N:r1   r.   )r   rh   r   splitr   r
   r
   r   ra   o  s    zAttr._get_localNamec                 C   s   | j S r%   )	specifiedr   r
   r
   r   _get_specifiedu  s    zAttr._get_specifiedc                 C   s   | j S r%   )r   r   r
   r
   r   	_get_namex  s    zAttr._get_namec                 C   s   || _ | jd k	rt| j d S r%   )r   r   rA   r   valuer
   r
   r   	_set_name{  s    
zAttr._set_namec                 C   s   | j S r%   )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 r+   )r   r'   rP   r   rA   r   r
   r
   r   
_set_value  s
    

zAttr._set_valuec                 C   s   | j S r%   )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)
r~   r   r6   r7   NamespaceErrr   r   r   rA   r   )r   r   ZnsuriZnewNamer
   r
   r   _set_prefix  s    
zAttr._set_prefixc                 C   sv   | j }|d k	rR|j| j= |j| j| jf= | jrRd| _| jd8  _| j j	d8  _	| j
D ]}|  qX| j
d d = d S )NFr1   )r   _attrsr   _attrsNSr~   r   _is_id_magic_id_nodesrX   _magic_id_countr'   rQ   )r   elemrV   r
   r
   r   rQ     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 r   )	r   rX   r   _get_elem_infor~   isIdNSr   isIdr   r   r   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 r%   )	rX   r   _no_typer   r~   getAttributeTypeNSr   getAttributeTyper   r   r
   r
   r   _get_schemaType  s    
zAttr._get_schemaType) r{   r|   r}   	__slots__r	   ATTRIBUTE_NODEr   r   r   r   rO   r   r5   r   r   ra   r   r   r   propertyr   r   r   r   r   r   r   r   r   rQ   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 r%   r   )r   attrsZattrsNSr   r
   r
   r   r     s    zNamedNodeMap.__init__c                 C   s
   t | jS r%   )lenr   r   r
   r
   r   _get_length  s    zNamedNodeMap._get_lengthc                 C   s4   z| t | j |  W S  tk
r.   Y d S X d S r%   )rr   r   keys
IndexErrorr   r=   r
   r
   r   item  s    zNamedNodeMap.itemc                 C   s*   g }| j  D ]}||j|jf q|S r%   )r   valuesrR   r   r   r   rU   rH   r
   r
   r   rs     s    zNamedNodeMap.itemsc                 C   s0   g }| j  D ]}||j|jf|jf q|S r%   )r   r   rR   r~   r   r   r   r
   r
   r   itemsNS  s    zNamedNodeMap.itemsNSc                 C   s"   t |tr|| jkS || jkS d S r%   )
isinstancestrr   r   rj   r
   r
   r   __contains__  s    

zNamedNodeMap.__contains__c                 C   s
   | j  S r%   )r   r   r   r
   r
   r   r     s    zNamedNodeMap.keysc                 C   s
   | j  S r%   )r   r   r   r
   r
   r   keysNS  s    zNamedNodeMap.keysNSc                 C   s
   | j  S r%   )r   r   r   r
   r
   r   r     s    zNamedNodeMap.valuesNc                 C   s   | j ||S r%   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idrb   r
   r
   r   _cmp  s    zNamedNodeMap._cmpc                 C   s   |  |dkS r+   r   rb   r
   r
   r   __eq__  s    zNamedNodeMap.__eq__c                 C   s   |  |dkS r+   r   rb   r
   r
   r   __ge__  s    zNamedNodeMap.__ge__c                 C   s   |  |dkS r+   r   rb   r
   r
   r   __gt__  s    zNamedNodeMap.__gt__c                 C   s   |  |dkS r+   r   rb   r
   r
   r   __le__  s    zNamedNodeMap.__le__c                 C   s   |  |dk S r+   r   rb   r
   r
   r   __lt__!  s    zNamedNodeMap.__lt__c                 C   s"   t |tr| j| S | j| S d S r%   )r   r3   r   r   )r   attname_or_tupler
   r
   r   __getitem__$  s    

zNamedNodeMap.__getitem__c                 C   sv   t |trRz| 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   ri   r   r   rX   setNamedItemr   	TypeError)r   attnamer   rH   r
   r
   r   __setitem__+  s    


zNamedNodeMap.__setitem__c                 C   s(   z| j | W S  tk
r"   Y d S X d S r%   )r   ri   r   r   r
   r
   r   getNamedItem:  s    zNamedNodeMap.getNamedItemc                 C   s,   z| j ||f W S  tk
r&   Y d S X d S r%   )r   ri   r   r~   r   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   rA   r   r   r   r   r~   r   rq   r   r6   r7   r?   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 r   )r   rA   r   r   r~   r   r   r   rq   r   r6   r7   r?   r   r~   r   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 rI   )r   r   r6   r7   r8   r9   r   r   r   rQ   r   r~   r   r   r   rA   )r   rH   rn   r
   r
   r   r   ^  s    

zNamedNodeMap.setNamedItemc                 C   s
   |  |S r%   )r   r   rH   r
   r
   r   setNamedItemNSk  s    zNamedNodeMap.setNamedItemNSc                 C   s   | | }t |j |  d S r%   )rA   r   rQ   )r   r   rH   r
   r
   r   __delitem__n  s    
zNamedNodeMap.__delitem__c                 C   s   | j | j| jfS r%   r   r   r
   r
   r   __getstate__s  s    zNamedNodeMap.__getstate__c                 C   s   |\| _ | _| _d S r%   r   r   stater
   r
   r   __setstate__v  s    zNamedNodeMap.__setstate__)N)!r{   r|   r}   __doc__r   r   r   r   rs   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   Z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 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__r{   r   r   r
   r
   r   __repr__  s
    zTypeInfo.__repr__c                 C   s   | j S r%   )r   r   r
   r
   r   r     s    zTypeInfo._get_namec                 C   s   | j S r%   )r  r   r
   r
   r   _get_namespace  s    zTypeInfo._get_namespaceN)r{   r|   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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)rX   r:   r   r   r   r~   r   r'   r   r   rC   rD   Nr   c                 C   sB   d | _ | | _| _|| _|| _t | _d  | _| _d | _	d | _
d S r%   )r:   r   r   r   r~   rw   r'   rC   rD   r   r   )r   r   r~   r   r   r
   r
   r   r     s    
zElement.__init__c                 C   s   | j d kri | _ i | _d S r%   )r   r   r   r
   r
   r   _ensure_attributes  s    
zElement._ensure_attributesc                 C   s4   z| j W S  tk
r.   | jddd  Y S X d S r   )r   rh   r   r   r   r
   r
   r   ra     s    zElement._get_localNamec                 C   s   | j S r%   r   r   r
   r
   r   _get_tagName  s    zElement._get_tagNamec                 C   s@   | j d k	r&t| j  D ]}|  qd | _ d | _t|  d S r%   )r   rr   r   rQ   r   r	   )r   attrr
   r
   r   rQ     s    

zElement.unlinkc                 C   s8   | j d krdS z| j | jW S  tk
r2   Y dS X d S r   )r   r   ri   )r   r   r
   r
   r   getAttribute  s    
zElement.getAttributec                 C   s<   | j d krdS z| j ||f jW S  tk
r6   Y dS X d S r   )r   r   ri   r   r
   r
   r   getAttributeNS  s    
zElement.getAttributeNSc                 C   sV   |  |}|d kr4t|}||_| j|_| | n||jkrR||_|jrRt|  d S r%   )getAttributeNoder   r   rX   setAttributeNoder   rA   )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 r%   )
_nssplitgetAttributeNodeNSr   r   rX   r  r   rA   r   r   )r   r~   qualifiedNamer   r   	localnamer	  r
   r
   r   setAttributeNS  s    

zElement.setAttributeNSc                 C   s   | j d krd S | j |S r%   r   )r   attrnamer
   r
   r   r    s    
zElement.getAttributeNodec                 C   s   | j d krd S | j ||fS r%   )r   r   r   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   r6   r7   ZInuseAttributeErrr  r   r   r   removeAttributeNoder   r~   r   _set_attribute_node)r   r	  Zold1Zold2r
   r
   r   r    s    


zElement.setAttributeNodec                 C   sP   | j d krtj z| j| }W n tk
r@   tj Y nX | | d S r%   )r   r6   r7   r?   r   ri   r  )r   r   r	  r
   r
   r   removeAttribute  s    

zElement.removeAttributec                 C   sT   | j d krtj z| j ||f }W n tk
rD   tj Y nX | | d S r%   )r   r6   r7   r?   ri   r  )r   r~   r   r	  r
   r
   r   removeAttributeNS%  s    

zElement.removeAttributeNSc                 C   s^   |d krt j z| j|j  W n tk
r@   t j Y nX t|  |  | j|_|S r%   )	r6   r7   r?   r   r   ri   rA   rQ   rX   r   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   hasAttribute>  s    
zElement.hasAttributec                 C   s   | j d krdS ||f| j kS r  )r   r   r
   r
   r   hasAttributeNSC  s    
zElement.hasAttributeNSc                 C   s   t | |t S r%   r   rw   r   r
   r
   r   getElementsByTagNameH  s    zElement.getElementsByTagNamec                 C   s   t | ||t S r%   r   rw   r   r
   r
   r   getElementsByTagNameNSK  s       zElement.getElementsByTagNameNSc                 C   s   d| j t| f S )Nz<DOM Element: %s at %#x>)r   r   r   r
   r
   r   r  O  s    zElement.__repr__r   c                 C   s   | |d | j  |  }| D ],}| d|  t||| j | d q$| jr| d t| jdkr| jd jt	j
t	jfkr| jd |ddd n4| | | jD ]}|||| || q| | | d| j|f  n| d	|  d S )
Nr   z %s="r   r   r1   r   r   z</%s>%sz/>%s)r   r   _get_attributesr   r   r   r'   r   r   r	   rO   r   r   )r   r$   r"   	addindentr#   r   Za_namerH   r
   r
   r   r   R  s*    

 


zElement.writexmlc                 C   s   |    t| j| j| S r%   )r  r   r   r   r   r
   r
   r   r!  m  s    zElement._get_attributesc                 C   s   | j r
dS dS d S r   r  r   r
   r
   r   hasAttributesq  s    zElement.hasAttributesc                 C   s   |  |}| | d S r%   )r  setIdAttributeNode)r   r   idAttrr
   r
   r   setIdAttributey  s    
zElement.setIdAttributec                 C   s   |  ||}| | d S r%   )r  r$  )r   r~   r   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 )NTr1   )rd   r   r6   r7   r?   _get_containing_entrefNoModificationAllowedErrr   r   rX   r   rA   )r   r%  r
   r
   r   r$    s    

zElement.setIdAttributeNode)r   r   r   ).r{   r|   r}   r   r	   rS   r   r   r   r   r   r   r   rO   r   r   r5   r   r   r  ra   r  rQ   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   s8   t |  |   || j|j< || j|j|jf< | |_d S r%   )rA   r  r   r   r   r~   r   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 r%   r
   r   r
   r
   r   r,     s    zChildless._get_firstChildc                 C   s   d S r%   r
   r   r
   r
   r   r/     s    zChildless._get_lastChildc                 C   s   t j| jd d S )Nz nodes cannot have childrenr6   r7   r8   r   r   r
   r
   r   r<     s    zChildless.appendChildc                 C   s   dS r  r
   r   r
   r
   r   r(     s    zChildless.hasChildNodesc                 C   s   t j| jd d S Nz nodes do not have childrenr,  r   rE   rF   r
   r
   r   r4     s    zChildless.insertBeforec                 C   s   t j| jd d S r-  )r6   r7   r?   r   rN   r
   r
   r   r;     s    zChildless.removeChildc                 C   s   d S r%   r
   r   r
   r
   r   rT     s    zChildless.normalizec                 C   s   t j| jd d S r-  r,  r   rE   rK   r
   r
   r   rL     s    zChildless.replaceChild)r{   r|   r}   r   r   r   ZEmptyNodeListr'   r   r   r,   r/   r<   r(   r4   r;   rT   rL   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targetrP   c                 C   s   || _ || _d S r%   r1  )r   r2  rP   r
   r
   r   r     s    zProcessingInstruction.__init__c                 C   s   | j S r%   rP   r   r
   r
   r   _get_nodeValue  s    z$ProcessingInstruction._get_nodeValuec                 C   s
   || _ d S r%   r3  r   r
   r
   r   _set_nodeValue  s    z$ProcessingInstruction._set_nodeValuec                 C   s   | j S r%   r2  r   r
   r
   r   _get_nodeName  s    z#ProcessingInstruction._get_nodeNamec                 C   s
   || _ d S r%   r6  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   r2  rP   r   r$   r"   r"  r#   r
   r
   r   r     s    zProcessingInstruction.writexmlN)r   r   r   )r{   r|   r}   r	   r   r   r   r   r4  r5  r   r   r7  r8  r   r   r
   r
   r
   r   r0    s   

r0  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)_datarX   r:   rD   rC   c                 C   s,   d  | _ | _d  | _| _d| _t|  d S r   )rX   r:   rD   rC   r;  r	   r   r   r
   r
   r   r     s    zCharacterData.__init__c                 C   s
   t | jS r%   )r   rP   r   r
   r
   r   r     s    zCharacterData._get_lengthc                 C   s   | j S r%   r;  r   r
   r
   r   	_get_data  s    zCharacterData._get_datac                 C   s
   || _ d S r%   r<  r   rP   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   )rP   r   r  r{   )r   rP   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   offset cannot be negative#offset cannot be beyond end of datacount cannot be negativer6   r7   IndexSizeErrr   rP   r   offsetcountr
   r
   r   substringData  s    zCharacterData.substringDatac                 C   s   | j | | _ d S r%   r3  )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   rB  rC  %s%s%srE  )r   rH  rK  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 rA  rE  rG  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   rB  rC  rD  rM  rE  )r   rH  rI  rK  r
   r
   r   replaceData  s      zCharacterData.replaceDataN)r{   r|   r}   r   r   r   r   r=  r?  r   rP   r   r  rJ  rL  rN  rO  rP  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   rP   r6   r7   rF  r  rX   rC   r:   r'   r<   r4   )r   rH  ZnewTextnextr
   r
   r   	splitText1  s    zText.splitTextr   c                 C   s   t |d|| j|f  d S )NrM  )r   rP   r9  r
   r
   r   r   @  s    zText.writexmlc                 C   s   | j g}| j}|d k	rB|jtjtjfkrB|d|j  |j}qqBq| j}|d k	rz|jtjtjfkrz||j  |j}qHqzqHd	|S )Nr   r   )
rP   rD   r   r	   rO   r   rB   rC   rR   join)r   rU   r   r
   r
   r   _get_wholeTextE  s    zText._get_wholeTextc                 C   s   | j }| j}|d k	r@|jtjtjfkr@|j}|| |}qq@q| j}|sT||  |d k	r|jtjtjfkr|j}|| |}qTqqT|r|| _| S d S d S r%   )	r:   rD   r   r	   rO   r   r;   rC   rP   )r   Zcontentr   r   rQ  r
   r
   r   replaceWholeTextW  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 r  )rP   strip_get_containing_elementrX   r   isElementContent)r   r   r   r
   r
   r   !_get_isWhitespaceInElementContents  s    
z&Text._get_isWhitespaceInElementContent)r   r   r   )r{   r|   r}   r   r	   rO   r   r   r   rR  r   rT  rU  rY  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 }|d k	r&|jtjkr|S |j }qd S r%   )r:   r   r	   rS   rH   rG   r
   r
   r   rW    s    rW  c                 C   s*   | j }|d k	r&|jtjkr|S |j }qd S r%   )r:   r   r	   r   rZ  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 r%   )r:  r   r;  r>  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)rP   r>   r   r9  r
   r
   r   r     s    
zComment.writexmlN)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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]]>)rP   findr>   r   r9  r
   r
   r   r     s    zCDATASection.writexmlN)r   r   r   )	r{   r|   r}   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 r%   r_  )r   seqr
   r
   r   r     s    z'ReadOnlySequentialNamedNodeMap.__init__c                 C   s
   t | jS r%   r   r`  r   r
   r
   r   r     s    z&ReadOnlySequentialNamedNodeMap.__len__c                 C   s
   t | jS r%   rb  r   r
   r
   r   r     s    z*ReadOnlySequentialNamedNodeMap._get_lengthc                 C   s"   | j D ]}|j|kr|  S qd S r%   )r`  r   r   r
   r
   r   r     s    

z+ReadOnlySequentialNamedNodeMap.getNamedItemc                 C   s,   | j D ] }|j|kr|j|kr|  S qd S r%   )r`  r~   r   r   r
   r
   r   r     s    
z-ReadOnlySequentialNamedNodeMap.getNamedItemNSc                 C   s4   t |tr| j| }n
| |}|d kr0t||S r%   )r   r3   r   r   ri   )r   Zname_or_tuplerH   r
   r
   r   r     s    

z*ReadOnlySequentialNamedNodeMap.__getitem__c                 C   s4   |dk rd S z| j | W S  tk
r.   Y d S X d S r+   )r`  r   r   r
   r
   r   r     s    z#ReadOnlySequentialNamedNodeMap.itemc                 C   s   t jdd S Nz"NamedNodeMap instance is read-onlyr6   r7   r)  r   r
   r
   r   r     s    z.ReadOnlySequentialNamedNodeMap.removeNamedItemc                 C   s   t jdd S rc  rd  r   r
   r
   r   r     s    z0ReadOnlySequentialNamedNodeMap.removeNamedItemNSc                 C   s   t jdd S rc  rd  r   r
   r
   r   r     s    z+ReadOnlySequentialNamedNodeMap.setNamedItemc                 C   s   t jdd S rc  rd  r   r
   r
   r   r     s    z-ReadOnlySequentialNamedNodeMap.setNamedItemNSc                 C   s   | j gS r%   r_  r   r
   r
   r   r     s    z+ReadOnlySequentialNamedNodeMap.__getstate__c                 C   s   |d | _ d S r+   r_  r   r
   r
   r   r     s    z+ReadOnlySequentialNamedNodeMap.__setstate__N)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&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 r%   rf  )r   rg  rh  r
   r
   r   _identified_mixin_init  s    z!Identified._identified_mixin_initc                 C   s   | j S r%   )rg  r   r
   r
   r   _get_publicId  s    zIdentified._get_publicIdc                 C   s   | j S r%   )rh  r   r
   r
   r   _get_systemId  s    zIdentified._get_systemIdN)r{   r|   r}   r   r   ri  rj  rk  r
   r
   r
   r   re    s
   re  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 r%   )r^  entities	notationsr  r   r   )r   r  r   r  r
   r
   r   r   
  s    zDocumentType.__init__c                 C   s   | j S r%   )internalSubsetr   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
_	| j
j	D ]2}t|j|j|j}|j
j	| |||| qH| jj	D ]N}t|j|j|j|j}|j|_|j|_|j|_|jj	| |||| q| || | |S d S d S r%   )rX   rl  r   r   r6   r7   UserDataHandlerNODE_CLONEDrm  r`  rn  Notationrg  rh  rR   rv   EntitynotationNameactualEncodingr   r_   )r   rY   clonert   r   notationeentityr
   r
   r   rZ     s0    

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   rg  rh  ro  r9  r
   r
   r   r   0  s    



zDocumentType.writexml)r   r   r   )r{   r|   r}   r	   DOCUMENT_TYPE_NODEr   r   r   rg  rh  ro  r   rp  rZ   r   r
   r
   r
   r   rl    s   rl  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 )rt  Nc                 C   s$   || _ || _t | _| || d S r%   )r   ru  rw   r'   ri  )r   r   rg  rh  rx  r
   r
   r   r   G  s    zEntity.__init__c                 C   s   | j S r%   rv  r   r
   r
   r   _get_actualEncodingM  s    zEntity._get_actualEncodingc                 C   s   | j S r%   r   r   r
   r
   r   _get_encodingP  s    zEntity._get_encodingc                 C   s   | j S r%   r_   r   r
   r
   r   _get_versionS  s    zEntity._get_versionc                 C   s   t jdd S )Nz(cannot append children to an entity noder6   r7   r8   )r   rE   r
   r
   r   r<   V  s    zEntity.appendChildc                 C   s   t jdd S )Nz+cannot insert children below an entity noder  r.  r
   r
   r   r4   Z  s    zEntity.insertBeforec                 C   s   t jdd S )Nz*cannot remove children from an entity noder  rN   r
   r
   r   r;   ^  s    zEntity.removeChildc                 C   s   t jdd S )Nz)cannot replace children of an entity noder  r/  r
   r
   r   rL   b  s    zEntity.replaceChild)r{   r|   r}   r   r	   ZENTITY_NODEr   r   rv  r   r_   r   r~  r  r  r<   r4   r;   rL   r
   r
   r
   r   rt  >  s   rt  c                   @   s   e Zd ZejZdZdd ZdS )rs  Nc                 C   s   || _ | || d S r%   )r   ri  )r   r   rg  rh  r
   r
   r   r   j  s    zNotation.__init__)r{   r|   r}   r	   r   r   r   r   r
   r
   r
   r   rs  f  s   rs  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)core1.0)r  2.0)r  N)r6   r  )r6   r  )r6   N)ls-loadz3.0)r  Nc                 C   s   |dkrd }|  |f| jkS r   )lower	_featuresr]   r
   r
   r   r\   z  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 namer6   z$http://www.w3.org/XML/1998/namespacezillegal use of 'xml' prefixz(illegal use of prefix without namespaces)r:   r6   r7   WrongDocumentErr_create_documentZInvalidCharacterErrr  r   createElementNSr<   rX   doctyper[   )	r   r~   r  r  r   Zadd_root_elementr   r  r*  r
   r
   r   createDocument  s>    

z DOMImplementation.createDocumentc                 C   s   t |}||_||_|S r%   )rl  rg  rh  )r   r  rg  rh  r  r
   r
   r   createDocumentType  s    z$DOMImplementation.createDocumentTypec                 C   s   |  |d r| S d S d S r%   )r\   re   r
   r
   r   rf     s    zDOMImplementation.getInterfacec                 C   s   t  S r%   )Documentr   r
   r
   r   r    s    z"DOMImplementation._create_documentN)	r{   r|   r}   r  r\   r  r  rf   r  r
   r
   r
   r   r  o  s   
-r  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 r%   r  r   r
   r
   r   r     s    zElementInfo.__init__c                 C   s   t S r%   r   r   Zanamer
   r
   r   r     s    zElementInfo.getAttributeTypec                 C   s   t S r%   r  r   r
   r
   r   r     s    zElementInfo.getAttributeTypeNSc                 C   s   dS r  r
   r   r
   r
   r   rX    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  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   r
   r
   r   r     s    zElementInfo.isIdNSc                 C   s   | j S r%   r  r   r
   r
   r   r     s    zElementInfo.__getstate__c                 C   s
   || _ d S r%   r  r   r
   r
   r   r     s    zElementInfo.__setstate__N)r{   r|   r}   r   r   r   r   r   rX  r  r   r   r   r   r
   r
   r
   r   r    s   r  c                 C   s>   | j tjkr| j  d | _nt| r:| jj  d | j_d S r%   )r   r	   r   	_id_cacheclear_id_search_stackr   rX   r   r
   r
   r   rA     s    
rA   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 )Jr  )
_elem_infor  r  r'   r  z	#documentNFr   c                 C   s$   d | _ t | _i | _i | _d | _d S r%   )r  rw   r'   r  r  r  r   r
   r
   r   r     s
    zDocument.__init__c                 C   s&   |j r|j |jf}n|j}| j|S r%   )r~   r   r   r  r   )r   r*  rk   r
   r
   r   r     s    zDocument._get_elem_infoc                 C   s   | j S r%   r}  r   r
   r
   r   r~    s    zDocument._get_actualEncodingc                 C   s   | j S r%   )r  r   r
   r
   r   _get_doctype  s    zDocument._get_doctypec                 C   s   | j S r%   )documentURIr   r
   r
   r   _get_documentURI!  s    zDocument._get_documentURIc                 C   s   | j S r%   r  r   r
   r
   r   r  $  s    zDocument._get_encodingc                 C   s   | j S r%   )errorHandlerr   r
   r
   r   _get_errorHandler'  s    zDocument._get_errorHandlerc                 C   s   | j S r%   )
standaloner   r
   r
   r   _get_standalone*  s    zDocument._get_standalonec                 C   s   | j S r%   )strictErrorCheckingr   r
   r
   r   _get_strictErrorChecking-  s    z!Document._get_strictErrorCheckingc                 C   s   | j S r%   r  r   r
   r
   r   r  0  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 )Nr0   z two document elements disallowed)r   r5   r6   r7   r8   r9   r:   r;   r	   rS   _get_documentElementr<   r   r
   r
   r   r<   3  s    
zDocument.appendChildc                 C   sV   z| j | W n tk
r.   tj Y nX d  |_|_d |_| j	|krRd | _	|S r%   )
r'   rM   r>   r6   r7   r?   rC   rD   r:   documentElementrN   r
   r
   r   r;   C  s    
zDocument.removeChildc                 C   s$   | j D ]}|jtjkr|  S qd S r%   )r'   r   r	   rS   r   r
   r
   r   r  O  s    
zDocument._get_documentElementc                 C   s(   | j d k	r| j   d | _ t|  d S r%   )r  rQ   r	   r   r
   r
   r   rQ   T  s    

zDocument.unlinkc                 C   s   |sd S | j d d d }| j|_| j|_| j|_| jD ]n}t|||}|j|sVt	|j
| |jtjkr~|jd kst	n |jtjkr|jd kst	||_||_q6| tjjj| | |S r%   )r[   r  r   r  r_   r'   rW   rX   rd   AssertionErrorrR   r   r	   r   r  r|  r  r:   rv   r6   r7   rq  rr  )r   rY   rw  r   Z
childcloner
   r
   r   rZ   Z  s*    
 zDocument.cloneNodec                 C   s   t  }| |_|S r%   )r   rX   )r   ro   r
   r
   r   createDocumentFragmento  s    zDocument.createDocumentFragmentc                 C   s   t |}| |_|S r%   )r  rX   )r   r   ry  r
   r
   r   createElementt  s    zDocument.createElementc                 C   s(   t |tstdt }||_| |_|S Nznode contents must be a string)r   r   r   r   rP   rX   )r   rP   tr
   r
   r   createTextNodey  s    
zDocument.createTextNodec                 C   s(   t |tstdt }||_| |_|S r  )r   r   r   r\  rP   rX   r   rP   rG   r
   r
   r   createCDATASection  s    
zDocument.createCDATASectionc                 C   s   t |}| |_|S r%   )r[  rX   r  r
   r
   r   createComment  s    zDocument.createCommentc                 C   s   t ||}| |_|S r%   )r0  rX   )r   r2  rP   pr
   r
   r   createProcessingInstruction  s    
z$Document.createProcessingInstructionc                 C   s   t |}| |_d|_|S r   )r   rX   r   )r   r   ar
   r
   r   createAttribute  s    zDocument.createAttributec                 C   s"   t |\}}t|||}| |_|S r%   )r  r  rX   )r   r~   r  r   r   ry  r
   r
   r   r    s    zDocument.createElementNSc                 C   s*   t |\}}t||||}| |_d|_|S r   )r  r   rX   r   )r   r~   r  r   r   r  r
   r
   r   createAttributeNS  s
    zDocument.createAttributeNSc                 C   s   t ||||}| |_|S r%   )rt  rX   )r   r   rg  rh  ru  ry  r
   r
   r   _create_entity  s    zDocument._create_entityc                 C   s   t |||}| |_|S r%   )rs  rX   )r   r   rg  rh  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 }|r| }|dd |jD  | |}|rB|j	
 D ]}|jr||j|jr|| j |j< |j|kr|}n|js qq||jr
|| j |j< |j|kr|}n|js> qq|jr|| j |j< |j|kr.|}q|jdkr qqn>|jr|j	
 D ]*}|jrT|| j |j< |j|krT|}qT|d k	rNqqN|S )Nc                 S   s   g | ]}|j tkr|qS r
   )r   r@   ).0rV   r
   r
   r   
<listcomp>  s    
z+Document.getElementById.<locals>.<listcomp>r1   )r  r  r   r  r  popextendr'   r   r   r   r~   r   r   r   r   r   r   r   )r   r   stackresultrH   r   r	  r
   r
   r   getElementById  sZ    






zDocument.getElementByIdc                 C   s   t | |t S r%   r  r   r
   r
   r   r    s    zDocument.getElementsByTagNamec                 C   s   t | ||t S r%   r  r   r
   r
   r   r     s       zDocument.getElementsByTagNameNSc                 C   s   | j ||S r%   )r[   r\   r]   r
   r
   r   r`     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   r6   r7   NotSupportedErrr|  rW   )r   rH   rY   r
   r
   r   
importNode  s
    zDocument.importNoder   c                 C   sJ   |d kr| d|  n| d||f  | jD ]}||||| q0d S )Nz<?xml version="1.0" ?>z%<?xml version="1.0" encoding="%s"?>%s)r   r'   r   )r   r$   r"   r"  r#   r   rH   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   r1   r   zillegal use of 'xmlns' prefixz$illegal use of the 'xmlns' attribute)rX   r6   r7   r  r   r	   rS   r   r  r   r   r   r   r   r   r  r   r   r~   r   r   r   r  r$  )r   r   r~   r   r   r   r*  Zis_idr
   r
   r   
renameNode	  sb    






zDocument.renameNode)r   r   r   N)=r{   r|   r}   r   r	   rS   r   r   r|  r5   r  r[   r   r   r   r   r   r:   rD   rC   rv  r   r  r_   r  r  r  r   r   r   r~  r  r  r  r  r  r  r  r<   r;   r  rQ   rZ   r  r  r  r  r  r  r  r  r  r  r  r  r  r   r`   r  r   r  r
   r
   r
   r   r    sj    	
:
r  r  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}| j D ]0}||j|j|j ||j|j}|j|_qH|r| jD ]}t|||}|| qn| jtjkr| }|r| jD ]}t|||}|| qn| jtjkr|| j}n| jtjkr|| j}n| jtjkr>|| j | j}nz| jtj!kr\|"| j}n\| jtj#kr|$| j| j}d|_| j|_n,| jtj%kr| j |k	st&tjjj}|j'(| j)| j*| j+}||_ |rg |j,_-g |j._-| j.j-D ]F}	t/|	j|	j*|	j+}
||
_ |j.j-0|
 t1|	dr|	2||	|
 q| j,j-D ]b}t3|j|j*|j+|j4}|j5|_5|j6|_6|j7|_7||_ |j,j-0| t1|dr>|2||| q>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
    Trv   zCannot clone node %s):rX   rd   r6   r7   rq  rr  ZNODE_IMPORTEDr   r	   rS   r  r~   r   r   r   r  r   r  r   r   r'   rW   r<   r2   r  rO   r  rP   r   r  r   r  r2  r   r  r   r  r|  r  r[   r  r   rg  rh  rm  r`  rn  rs  rR   rq   rv   rt  ru  rv  r   r_   r  r9   )rH   rY   ZnewOwnerDocumentrt   rw  r	  r  rV   rG   r   rx  ry  rz  r
   r
   r   rW   B  s    




  rW   c                 C   s,   |  dd}t|dkr|S d |d fS d S )Nr   r1      r   )r   r   )r  Zfieldsr
   r
   r   r    s    r  c                 C   s,   | ||}|  \}}|| |  |S r%   )ZgetEventZ
expandNoder  )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   s@   | r:t | trt| } | D ]\}}tj||s d S qtjS r%   )r   r   r   Z_parse_feature_stringr  r[   r\   )Zfeaturesfvr
   r
   r   getDOMImplementation  s    

r  )NN)N)N)7r   r   r  r6   r   r   r   r   Zxml.dom.minicompatZxml.dom.xmlbuilderr   r   r7   r	   rS   r   r@   ZdefpropertyrJ   r   r   r   r   r   r   objectr   ZAttributeListr   r   r  r  r+  r0  r:  r   rW  r(  r[  r\  r^  re  rl  rt  rs  r  r  rA   r  rW   r  r  r  r  r  r
   r
   r
   r   <module>   s    v
	y $
 x)GU	><(	O*  PR



