o
    f,
                    @   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Z5dfdcddZ6dS )gac  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      dS )NT selfr   r   &/usr/lib/python3.10/xml/dom/minidom.py__bool__+      zNode.__bool__c                 C   s   |  dd||S N )toprettyxml)r   encoding
standaloner   r   r   toxml.      z
Node.toxml	
c                 C   sv   |d u r	t  }nt jt  |ddd}| jtjkr%| |d|||| n| |d|| |d u r5| S |	  S )Nxmlcharrefreplacer   )r   errorsnewliner   )
ioStringIOTextIOWrapperBytesIOnodeTyper	   DOCUMENT_NODEwritexmlgetvaluedetach)r   indentnewlr   r   writerr   r   r   r   1   s   

zNode.toprettyxmlc                 C   
   t | jS N)bool
childNodesr   r   r   r   hasChildNodesD      
zNode.hasChildNodesc                 C      | j S r*   r,   r   r   r   r   _get_childNodesG      zNode._get_childNodesc                 C      | j r| j d S d S Nr   r0   r   r   r   r   _get_firstChildJ      
zNode._get_firstChildc                 C   r3   Nr0   r   r   r   r   _get_lastChildN   r6   zNode._get_lastChildc                 C   s  |j | jkrt|jD ]}| || q|S |j | jvr*tjdt	|t	| f |j
d ur5|j
| |d u r@| | |S z| j|}W n tyT   tj w |j tv r^t|  | 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crG   noder   r   r   r>   R   s<   



zNode.insertBeforec                 C   s   |j | jkrt|jD ]}| | q|S |j | jvr)tjdt	|t	| f |j t
v r2t|  |jd ur=|j| t| | d |_|S Nr:   )r!   r<   r=   r,   rF   r?   r@   rA   rB   rC   rJ   rK   rD   rE   _append_childrM   )r   rR   rQ   r   r   r   rF   r   s   


zNode.appendChildc                 C   s
  |j | jkr|j}| | | ||S |j | jvr(tjdt	|t	| f ||u r.d S |j
d ur9|j
| z| j|}W n tyM   tj w || j|< | |_
d |_
|j tv sc|j tv rgt|  |j|_|j|_d |_d |_|jr|||j_|jr||j_|S rS   )r!   r<   rM   rE   r>   r?   r@   rA   rB   rC   rD   r,   rG   rH   rI   rJ   rK   rN   )r   rO   oldChildrP   rG   r   r   r   replaceChild   s@   





zNode.replaceChildc                 C   sz   z| j | W n ty   tj w |jd ur|j|j_|jd ur)|j|j_d  |_|_|jt	v r8t
|  d |_|S r*   )r,   removerH   r@   rA   rI   rM   rN   r!   rJ   rK   rD   r   rU   r   r   r   rE      s   





zNode.removeChildc                 C   s   g }| j D ]Z}|jtjkrP|js%|r|j|d _|jr |j|j_|  q|rJ|d j|jkrJ|d }|j|j |_|j|_|jrE||j_|  q|| q|| |jtj	kr_|
  q|| j d d < d S r7   )r,   r!   r	   	TEXT_NODEdatarM   rN   unlinkappendELEMENT_NODE	normalize)r   LchildrR   r   r   r   r^      s,   




zNode.normalizec                 C   s   t | || jp| S r*   )_clone_nodeownerDocument)r   deepr   r   r   	cloneNode      zNode.cloneNodec                 C   s   | j j||S r*   )rb   implementation
hasFeaturer   featureversionr   r   r   isSupported   r   zNode.isSupportedc                 C      d S r*   r   r   r   r   r   _get_localName      zNode._get_localNamec                 C   s   | |u S r*   r   r   otherr   r   r   
isSameNode      zNode.isSameNodec                 C      |  |d r| S d S r*   )rk   r   ri   r   r   r   getInterface      zNode.getInterfacec              	   C   s*   z| j | d W S  ttfy   Y d S w r4   )
_user_dataAttributeErrorKeyErrorr   keyr   r   r   getUserData   s
   zNode.getUserDatac                 C   sn   d }z| j }W n ty   i }|| _ Y nw ||v r || d }|d u r/d }|d ur-||= |S ||f||< |S r4   )rw   rx   )r   r{   rZ   handlerolddr   r   r   setUserData   s    

zNode.setUserDatac                 C   sH   t | dr t| j D ]\}\}}|d ur|||||| qd S d S )Nrw   )hasattrlistrw   itemshandle)r   	operationsrcdstr{   rZ   r}   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*   )rD   rb   r,   r[   NodeListrN   rM   )r   r`   r   r   r   r[     s   


zNode.unlinkc                 C   s   | S r*   r   r   r   r   r   	__enter__  r   zNode.__enter__c                 C   s   |    d S r*   )r[   )r   etevtbr   r   r   __exit__     zNode.__exit__NN)r   r   NN)!__name__
__module____qualname__namespaceURIrD   rb   rM   rN   r   prefixr   r   r   r-   r1   r5   r9   r>   rF   rV   rE   r^   rd   rk   rm   rq   ru   r|   r   r   r[   r   r   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 r7   )r,   rN   rM   r\   rD   )r   rR   r,   lastr   r   r   rT     s   

rT   c                 C   s*   | d ur| j tjkrdS | j} | d usdS NTF)r!   r	   r"   rD   rR   r   r   r   _in_document'  s   r   c                 C   s:   |r| dd dd dd dd}| | d	S d	S )
zWrites datachars to writer.&z&amp;<z&lt;"z&quot;>z&gt;N)replacewrite)r(   rZ   r   r   r   _write_data/  s   r   c                 C   sD   | j D ]}|jtjkr|dks|j|kr|| t||| q|S Nr   )r,   r!   r	   r]   tagNamer\   _get_elements_by_tagName_helper)parentnamercrR   r   r   r   r   6  s   

r   c                 C   sX   | j D ]&}|jtjkr)|dks|j|kr"|dks|j|kr"|| t|||| q|S r   )r,   r!   r	   r]   r   r   r\   "_get_elements_by_tagName_ns_helper)r   nsURIr   r   rR   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*   )r   r,   r   r   r   r   __init__U  r   zDocumentFragment.__init__)r   r   r   r	   r<   r!   nodeName	nodeValue
attributesrD   r]   rY   CDATA_SECTION_NODEENTITY_REFERENCE_NODEPROCESSING_INSTRUCTION_NODECOMMENT_NODENOTATION_NODEr?   r   r   r   r   r   r   G  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,   
_localNamerb   ownerElementNFc                 C   s@   d | _ || _|| _|| _|d ur|| _t | _| jt  d S r*   )	r   r   r   r   r   r   r,   r\   Text)r   qNamer   r   r   r   r   r   r   c  s   zAttr.__init__c                 C   .   z| j W S  ty   | jddd  Y S w N:r;   r8   )r   rx   r   splitr   r   r   r   rm   r  
   zAttr._get_localNamec                 C   r/   r*   )	specifiedr   r   r   r   _get_specifiedx  r2   zAttr._get_specifiedc                 C   r/   r*   )r   r   r   r   r   	_get_name{  r2   zAttr._get_namec                 C   s"   || _ | jd urt| j d S d S r*   )r   r   rK   r   valuer   r   r   	_set_name~  s   
zAttr._set_namec                 C   r/   r*   )r   r   r   r   r   
_get_value  r2   zAttr._get_valuec                 C   s6   || _ || jd _| jd urt| j || jd _d S r4   )r   r,   rZ   r   rK   r   r   r   r   
_set_value  s
   

zAttr._set_valuec                 C   r/   r*   )r   r   r   r   r   _get_prefix  r2   zAttr._get_prefixc                 C   sd   | j }|dkr|r|tkrtjd|| _|d u r| j}nd|| jf }| jr-t| j || _	d S )Nxmlnsz5illegal use of 'xmlns' prefix for the wrong namespacez%s:%s)
r   r   r@   rA   NamespaceErrr   r   r   rK   r   )r   r   nsurinewNamer   r   r   _set_prefix  s   

zAttr._set_prefixc                 C   sv   | j }|d ur)|j| j= |j| j| jf= | jr)d| _| jd8  _| j j	d8  _	| j
D ]}|  q,| j
d d = d S )NFr;   )r   _attrsr   _attrsNSr   r   _is_id_magic_id_nodesrb   _magic_id_countr,   r[   )r   elemr`   r   r   r   r[     s   


zAttr.unlinkc                 C   sb   | j rdS | j}| j}|d u s|d u rdS ||}|d u r dS | jr+|| j| jS || jS r   )	r   rb   r   _get_elem_infor   isIdNSr   isIdr   r   r   r   infor   r   r   	_get_isId  s   
zAttr._get_isIdc                 C   sX   | j }| j}|d u s|d u rtS ||}|d u rtS | jr&|| j| jS || jS r*   )	rb   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   rY   r   r?   r   r   rm   r   r   r   propertyr   r   r   r   r   r   r   r   r   r[   r   r   r   r   r   r   r   Y  s0    

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   attrsattrsNSr   r   r   r   r     s   
zNamedNodeMap.__init__c                 C   r)   r*   )lenr   r   r   r   r   _get_length  r.   zNamedNodeMap._get_lengthc                 C   s.   z| t | j |  W S  ty   Y d S w r*   )r   r   keys
IndexErrorr   rG   r   r   r   item  s
   zNamedNodeMap.itemc                 C   s*   g }| j  D ]}||j|jf q|S r*   )r   valuesr\   r   r   r   r_   rR   r   r   r   r     s   zNamedNodeMap.itemsc                 C   s0   g }| j  D ]}||j|jf|jf q|S r*   )r   r   r\   r   r   r   r   r   r   r   itemsNS  s   zNamedNodeMap.itemsNSc                 C   s   t |tr
|| jv S || jv S r*   )
isinstancestrr   r   rz   r   r   r   __contains__     


zNamedNodeMap.__contains__c                 C   
   | j  S r*   )r   r   r   r   r   r   r     r.   zNamedNodeMap.keysc                 C   r   r*   )r   r   r   r   r   r   keysNS  r.   zNamedNodeMap.keysNSc                 C   r   r*   )r   r   r   r   r   r   r   
  r.   zNamedNodeMap.valuesNc                 C      | j ||S r*   r   get)r   r   r   r   r   r   r        zNamedNodeMap.getc                 C   s6   | j t|dd u rdS t| t|kt| t|k  S )Nr   r   )r   getattridro   r   r   r   _cmp  s    zNamedNodeMap._cmpc                 C   s   |  |dkS r4   r   ro   r   r   r   __eq__  r   zNamedNodeMap.__eq__c                 C   s   |  |dkS r4   r  ro   r   r   r   __ge__  r   zNamedNodeMap.__ge__c                 C   s   |  |dkS r4   r  ro   r   r   r   __gt__  r   zNamedNodeMap.__gt__c                 C   s   |  |dkS r4   r  ro   r   r   r   __le__!  r   zNamedNodeMap.__le__c                 C   s   |  |dk S r4   r  ro   r   r   r   __lt__$  r   zNamedNodeMap.__lt__c                 C   s   t |tr
| j| S | j| S r*   )r   r=   r   r   )r   attname_or_tupler   r   r   __getitem__'  r   zNamedNodeMap.__getitem__c                 C   sv   t |tr)z| j| }W n ty#   t|}| jj|_| | Y nw ||_d S t |ts2t	d|}| | d S )Nz%value must be a string or Attr object)
r   r   r   ry   r   r   rb   setNamedItemr   	TypeError)r   attnamer   rR   r   r   r   __setitem__.  s   



zNamedNodeMap.__setitem__c                 C   s"   z| j | W S  ty   Y d S w r*   )r   ry   r   r   r   r   r   getNamedItem=  s
   zNamedNodeMap.getNamedItemc                 C   s&   z| j ||f W S  ty   Y d S w r*   )r   ry   r   r   r   r   r   r   getNamedItemNSC  s
   zNamedNodeMap.getNamedItemNSc                 C   sT   |  |}|d ur%t| j | j|j= | j|j|jf= t|dr#d |_	|S t
j Nr   )r  rK   r   r   r   r   r   r   r   r   r@   rA   rI   r   r   nr   r   r   removeNamedItemI  s   




zNamedNodeMap.removeNamedItemc                 C   sV   |  ||}|d ur&t| j | j|j|jf= | j|j= t|dr$d |_	|S t
j r  )r  rK   r   r   r   r   r   r   r   r   r@   rA   rI   r   r   r   r  r   r   r   removeNamedItemNSU  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 rS   )r   r   r@   rA   rB   rC   r   r   r   r[   r   r   r   r   r   rK   )r   rR   r~   r   r   r   r	  a  s   

zNamedNodeMap.setNamedItemc                 C   s
   |  |S r*   )r	  r   rR   r   r   r   setNamedItemNSn  r.   zNamedNodeMap.setNamedItemNSc                 C   s   | | }t |j |  d S r*   )rK   r   r[   )r   r  rR   r   r   r   __delitem__q  s   
zNamedNodeMap.__delitem__c                 C   s   | j | j| jfS r*   r   r   r   r   r   __getstate__v  r   zNamedNodeMap.__getstate__c                 C   s   |\| _ | _| _d S r*   r   r   stater   r   r   __setstate__y  s   zNamedNodeMap.__setstate__r*   )!r   r   r   __doc__r   r   r   r   r   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      || _ || _d S r*   r"  )r   r#  r   r   r   r   r        
zTypeInfo.__init__c                 C   s.   | j rd| jj| j| j f S d| jj| jf S )Nz<%s %r (from %r)>z<%s %r>)r#  	__class__r   r   r   r   r   r   __repr__  s
   zTypeInfo.__repr__c                 C   r/   r*   )r   r   r   r   r   r     r2   zTypeInfo._get_namec                 C   r/   r*   )r#  r   r   r   r   _get_namespace  r2   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)rb   rD   r   r   r   r   r   r,   r   r   rM   rN   Nr   c                 C   sB   d | _ | | _| _|| _|| _t | _d  | _| _d | _	d | _
d S r*   )rD   r   r   r   r   r   r,   rM   rN   r   r   )r   r   r   r   r   r   r   r   r     s   

zElement.__init__c                 C   s   | j d u ri | _ i | _d S d S r*   )r   r   r   r   r   r   _ensure_attributes  s   

zElement._ensure_attributesc                 C   r   r   )r   rx   r   r   r   r   r   r   rm     r   zElement._get_localNamec                 C   r/   r*   r   r   r   r   r   _get_tagName  r2   zElement._get_tagNamec                 C   s@   | j d urt| j  D ]}|  qd | _ d | _t|  d S r*   )r   r   r   r[   r   r	   )r   attrr   r   r   r[     s   

zElement.unlinkc                 C   s2   | j du rdS z| j | jW S  ty   Y dS w )a  Returns the value of the specified attribute.

        Returns the value of the element's attribute named attname as
        a string. An empty string is returned if the element does not
        have such an attribute. Note that an empty string may also be
        returned as an explicitly given attribute value, use the
        hasAttribute method to distinguish these two cases.
        Nr   )r   r   ry   )r   r  r   r   r   getAttribute  s   
	zElement.getAttributec                 C   s6   | j d u rdS z	| j ||f jW S  ty   Y dS w r   )r   r   ry   r  r   r   r   getAttributeNS  s   
zElement.getAttributeNSc                 C   s`   |  |}|d u rt|}||_| j|_| | d S ||jkr,||_|jr.t|  d S d S d S r*   )getAttributeNoder   r   rb   setAttributeNoder   rK   )r   r  r   r-  r   r   r   setAttribute  s   

zElement.setAttributec                 C   s   t |\}}| ||}|d u r%t||||}||_| j|_| | d S ||jkr4||_|jr4t|  |j|krA||_||_	d S d S r*   )
_nssplitgetAttributeNodeNSr   r   rb   r1  r   rK   r   r   )r   r   qualifiedNamer   r   	localnamer-  r   r   r   setAttributeNS  s   


zElement.setAttributeNSc                 C   s   | j d u rd S | j |S r*   r   )r   attrnamer   r   r   r0    s   
zElement.getAttributeNodec                 C   s   | j d u rd S | j ||fS r*   )r   r   r  r   r   r   r4    s   
zElement.getAttributeNodeNSc                 C   s   |j d | fvrtjd|   | j|jd }|d ur"| | | j	|j
|jfd }|d ur:||ur:| | t| | ||urE|S ||urK|S d S )Nzattribute node already owned)r   r@   rA   InuseAttributeErrr*  r   r   r   removeAttributeNoder   r   r   _set_attribute_node)r   r-  old1old2r   r   r   r1    s   


zElement.setAttributeNodec                 C   sJ   | j d u r
tj z| j| }W n ty   tj w | | d S r*   )r   r@   rA   rI   r   ry   r:  )r   r   r-  r   r   r   removeAttribute'  s   


zElement.removeAttributec                 C   sN   | j d u r
tj z	| j ||f }W n ty   tj w | | d S r*   )r   r@   rA   rI   ry   r:  )r   r   r   r-  r   r   r   removeAttributeNS0  s   


zElement.removeAttributeNSc                 C   sX   |d u r	t j z| j|j  W n ty   t j w t|  |  | j|_|S r*   )	r@   rA   rI   r   r   ry   rK   r[   rb   r  r   r   r   r:  9  s   

zElement.removeAttributeNodec                 C   s   | j du rdS || j v S )zChecks whether the element has an attribute with the specified name.

        Returns True if the element has an attribute with the specified name.
        Otherwise, returns False.
        NFr   r  r   r   r   hasAttributeI  s   

zElement.hasAttributec                 C   s   | j d u rdS ||f| j v S NF)r   r  r   r   r   hasAttributeNSS  s   
zElement.hasAttributeNSc                 C      t | |t S )zReturns all descendant elements with the given tag name.

        Returns the list of all descendant elements (not direct children
        only) with the specified tag name.
        r   r   r  r   r   r   getElementsByTagNameX  s   zElement.getElementsByTagNamec                 C      t | ||t S r*   r   r   r  r   r   r   getElementsByTagNameNS`     
zElement.getElementsByTagNameNSc                 C   s   d| j t| f S )Nz<DOM Element: %s at %#x>)r   r   r   r   r   r   r'  d  re   zElement.__repr__r   c                 C   s   | |d | j  |  }| D ]}| d|  t||| j | d q| jrv| d t| jdkrP| jd jt	j
t	jfv rP| jd |ddd n| | | jD ]}|||| || qX| | | d| j|f  d
S | d	|  d
S )zWrite an XML element to a file-like object

        Write the element to the writer object that must provide
        a write method (e.g. a file or StringIO object).
        r   z %s="r   r   r;   r   r   z</%s>%sz/>%sN)r   r   _get_attributesr   r   r   r,   r   r!   r	   rY   r   r#   )r   r(   r&   	addindentr'   r   a_namerR   r   r   r   r#   g  s&   	




zElement.writexmlc                 C   s   |    t| j| j| S r*   )r*  r   r   r   r   r   r   r   rK    s   zElement._get_attributesc                 C   s   | j rdS dS r   r@  r   r   r   r   hasAttributes  s   zElement.hasAttributesc                 C   s   |  |}| | d S r*   )r0  setIdAttributeNode)r   r   idAttrr   r   r   setIdAttribute  s   
zElement.setIdAttributec                 C   s   |  ||}| | d S r*   )r4  rO  )r   r   r   rP  r   r   r   setIdAttributeNS  s   zElement.setIdAttributeNSc                 C   sn   |d u s
|  |jstj t| d urtj |js5d|_|  jd7  _| j	 j
d7  _
t|  d S d S )NTr;   )rq   r   r@   rA   rI   _get_containing_entrefNoModificationAllowedErrr   r   rb   r   rK   )r   rP  r   r   r   rO    s   

zElement.setIdAttributeNoder   r   r   ).r   r   r   r   r	   r]   r!   r   r   r   r   r   r   rY   r   r   r?   r   r   r*  rm   r,  r[   r.  r/  r2  r7  r0  r4  r1  setAttributeNodeNSr>  r?  r:  removeAttributeNodeNSrA  rC  rF  rI  r'  r#   rK  rN  rQ  rR  rO  r   r   r   r   r)    sV    
		

 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*   )rK   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   rl   r*   r   r   r   r   r   r5     r   zChildless._get_firstChildc                 C   rl   r*   r   r   r   r   r   r9     r   zChildless._get_lastChildc                 C      t j| jd )Nz nodes cannot have childrenr@   rA   rB   r   r  r   r   r   rF        zChildless.appendChildc                 C   r
   rB  r   r   r   r   r   r-     r   zChildless.hasChildNodesc                 C   rZ  Nz nodes do not have childrenr[  r   rO   rP   r   r   r   r>     r\  zChildless.insertBeforec                 C   rZ  r]  )r@   rA   rI   r   rX   r   r   r   rE     r\  zChildless.removeChildc                 C   rl   r*   r   r   r   r   r   r^     rn   zChildless.normalizec                 C   rZ  r]  r[  r   rO   rU   r   r   r   rV     r\  zChildless.replaceChild)r   r   r   r  r   r   EmptyNodeListr,   r   r   r5   r9   rF   r-   r>   rE   r^   rV   r   r   r   r   rY    s    rY  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targetrZ   c                 C   r$  r*   rb  )r   rc  rZ   r   r   r   r     r%  zProcessingInstruction.__init__c                 C   r/   r*   rZ   r   r   r   r   _get_nodeValue  r2   z$ProcessingInstruction._get_nodeValuec                 C   
   || _ d S r*   rd  r   r   r   r   _set_nodeValue  r.   z$ProcessingInstruction._set_nodeValuec                 C   r/   r*   rc  r   r   r   r   _get_nodeName  r2   z#ProcessingInstruction._get_nodeNamec                 C   rf  r*   rh  r   r   r   r   _set_nodeName  r.   z#ProcessingInstruction._set_nodeNamer   c                 C   s   | d|| j| j|f  d S )Nz%s<?%s %s?>%s)r   rc  rZ   r   r(   r&   rL  r'   r   r   r   r#     s   zProcessingInstruction.writexmlNrU  )r   r   r   r	   r   r!   r   r   re  rg  r   r   ri  rj  r   r#   r   r   r   r   ra    s    

ra  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)_datarb   rD   rN   rM   c                 C   s,   d  | _ | _d  | _| _d| _t|  d S r   )rb   rD   rN   rM   rm  r	   r   r   r   r   r   r     s   zCharacterData.__init__c                 C   r)   r*   )r   rZ   r   r   r   r   r     r.   zCharacterData._get_lengthc                 C   r/   r*   rm  r   r   r   r   	_get_data  r2   zCharacterData._get_datac                 C   rf  r*   rn  r   rZ   r   r   r   	_set_data	  r.   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   )rZ   r   r&  r   )r   rZ   	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 r!t jd| j|||  S Nr   offset cannot be negative#offset cannot be beyond end of datacount cannot be negativer@   rA   IndexSizeErrr   rZ   r   offsetcountr   r   r   substringData  s   zCharacterData.substringDatac                 C   s   | j | | _ d S r*   rd  )r   argr   r   r   
appendData   r   zCharacterData.appendDatac                 C   s^   |dk r
t jd|t| jkrt jd|r-d| jd | || j|d  f | _d S d S )Nr   ru  rv  %s%s%srx  )r   r{  r~  r   r   r   
insertData#  s   zCharacterData.insertDatac                 C   sp   |dk r
t jd|t| jkrt jd|dk r!t jd|r6| jd | | j|| d   | _d S d S rt  rx  rz  r   r   r   
deleteData,  s   &zCharacterData.deleteDatac                 C   sv   |dk r
t jd|t| jkrt jd|dk r!t jd|r9d| jd | || j|| d  f | _d S d S )Nr   ru  rv  rw  r  rx  )r   r{  r|  r~  r   r   r   replaceData6  s   zCharacterData.replaceDataN)r   r   r   r   r   r   r  ro  rq  r   rZ   r   r'  r}  r  r  r  r  r   r   r   r   rl    s    			
rl  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	v r?|d u r8| j
| n| j|| | jd | | _|S )Nr   zillegal offset value)r   rZ   r@   rA   ry  r&  rb   rM   rD   r,   rF   r>   )r   r{  newTextnextr   r   r   	splitTextK  s   zText.splitTextr   c                 C   s   t |d|| j|f  d S )Nr  )r   rZ   rk  r   r   r   r#   Z  s   zText.writexmlc                 C   s   | j g}| j}|d ur$|jtjtjfv r|d|j  |j}nn|d us| j}|d urC|jtjtjfv r>||j  |j}nn|d us+d	|S )Nr   r   )
rZ   rN   r!   r	   rY   r   rL   rM   r\   join)r   r_   r  r   r   r   _get_wholeText_  s    
zText._get_wholeTextc                 C   s   | j }| j}|d ur#|jtjtjfv r|j}|| |}nn|d us
| j}|s-||  |d urJ|jtjtjfv rE|j}|| |}nn|d us1|rQ|| _| S d S r*   )	rD   rN   r!   r	   rY   r   rE   rM   rZ   )r   contentr   r  r  r   r   r   replaceWholeTextq  s.   


zText.replaceWholeTextc                 C   sB   | j  rdS t| }|d u rdS | j|}|d u rdS | S rB  )rZ   strip_get_containing_elementrb   r   isElementContent)r   r   r   r   r   r   !_get_isWhitespaceInElementContent  s   
z&Text._get_isWhitespaceInElementContentrU  )r   r   r   r   r	   rY   r!   r   r   r  r#   r  r  r  r   r   r   r   r   D  s    
r   isWhitespaceInElementContentzKTrue iff this text node contains only whitespace and is in element content.	wholeTextz.The text of all logically-adjacent text nodes.c                 C   0   | j }|d ur|jtjkr|S |j }|d usd S r*   )rD   r!   r	   r]   rR   rQ   r   r   r   r       r  c                 C   r  r*   )rD   r!   r	   r   r  r   r   r   rS    r  rS  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*   )rl  r   rm  rp  r   r   r   r     s   

zComment.__init__r   c                 C   s,   d| j v r	td|d|| j |f  d S )Nz--z%'--' is not allowed in a comment nodez%s<!--%s-->%s)rZ   rH   r   rk  r   r   r   r#     s   
zComment.writexmlNrU  )	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]]>)rZ   findrH   r   rk  r   r   r   r#     s   zCDATASection.writexmlNrU  )	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   rf  r*   r  )r   seqr   r   r   r     s   
z'ReadOnlySequentialNamedNodeMap.__init__c                 C   r)   r*   r   r  r   r   r   r   r    r.   z&ReadOnlySequentialNamedNodeMap.__len__c                 C   r)   r*   r  r   r   r   r   r     r.   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 u rt||S r*   )r   r=   r  r  ry   )r   name_or_tuplerR   r   r   r   r    s   

z*ReadOnlySequentialNamedNodeMap.__getitem__c                 C   s.   |dk rd S z| j | W S  ty   Y d S w r4   )r  r   r   r   r   r   r     s   z#ReadOnlySequentialNamedNodeMap.itemc                 C      t jdNz"NamedNodeMap instance is read-onlyr@   rA   rT  r  r   r   r   r       z.ReadOnlySequentialNamedNodeMap.removeNamedItemc                 C   r  r  r  r  r   r   r   r    r  z0ReadOnlySequentialNamedNodeMap.removeNamedItemNSc                 C   r  r  r  r  r   r   r   r	    r  z+ReadOnlySequentialNamedNodeMap.setNamedItemc                 C   r  r  r  r  r   r   r   r    r  z-ReadOnlySequentialNamedNodeMap.setNamedItemNSc                 C   s   | j gS r*   r  r   r   r   r   r    rr   z+ReadOnlySequentialNamedNodeMap.__getstate__c                 C   s   |d | _ d S r4   r  r  r   r   r   r    r   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   r$  r*   r  )r   r  r  r   r   r   _identified_mixin_init  r%  z!Identified._identified_mixin_initc                 C   r/   r*   )r  r   r   r   r   _get_publicId  r2   zIdentified._get_publicIdc                 C   r/   r*   )r  r   r   r   r   _get_systemId  r2   zIdentified._get_systemIdN)r   r   r   r  r   r  r  r  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 r*   )r  entities	notationsr3  r   r   )r   r5  r   r6  r   r   r   r   $  s   zDocumentType.__init__c                 C   r/   r*   )internalSubsetr   r   r   r   _get_internalSubset,  r2   z DocumentType._get_internalSubsetc                 C   s   | j d u rstd }| j|_| j|_tjjj}|rjg |j_	g |j
_	| j
j	D ]}t|j|j|j}|j
j	| |||| q$| jj	D ]'}t|j|j|j|j}|j|_|j|_|j|_|jj	| |||| qB| || | |S d S r*   )rb   r  r   r   r@   rA   UserDataHandlerNODE_CLONEDr  r  r  Notationr  r  r\   r   EntitynotationNameactualEncodingr   rj   )r   rc   cloner   r  notationeentityr   r   r   rd   /  s0   

zDocumentType.cloneNoder   c                 C   s   | d | | j | jr| d|| j|| jf  n| jr)| d|| jf  | jd ur>| d | | j | d | d|  d S )Nz
<!DOCTYPE z%s  PUBLIC '%s'%s  '%s'z%s  SYSTEM '%s'z []r   )r   r   r  r  r  rk  r   r   r   r#   J  s   



zDocumentType.writexmlrU  )r   r   r   r	   DOCUMENT_TYPE_NODEr!   r   r   r  r  r  r   r  rd   r#   r   r   r   r   r    s    r  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 r*   )r   r  r   r,   r  )r   r   r  r  r  r   r   r   r   a  s   zEntity.__init__c                 C   r/   r*   r  r   r   r   r   _get_actualEncodingg  r2   zEntity._get_actualEncodingc                 C   r/   r*   r   r   r   r   r   _get_encodingj  r2   zEntity._get_encodingc                 C   r/   r*   rj   r   r   r   r   _get_versionm  r2   zEntity._get_versionc                 C   r  )Nz(cannot append children to an entity noder@   rA   rB   )r   rO   r   r   r   rF   p  r  zEntity.appendChildc                 C   r  )Nz+cannot insert children below an entity noder  r^  r   r   r   r>   t  r  zEntity.insertBeforec                 C   r  )Nz*cannot remove children from an entity noder  rX   r   r   r   rE   x  r  zEntity.removeChildc                 C   r  )Nz)cannot replace children of an entity noder  r_  r   r   r   rV   |  r  zEntity.replaceChild)r   r   r   r   r	   ENTITY_NODEr!   r   r  r   rj   r   r  r  r  rF   r>   rE   rV   r   r   r   r   r  X  s    r  c                   @   s   e Zd ZejZdZdd ZdS )r  Nc                 C   s   || _ | || d S r*   )r   r  )r   r   r  r  r   r   r   r     s   zNotation.__init__)r   r   r   r	   r   r!   r   r   r   r   r   r   r    s    r  c                   @   s<   e Zd Zg d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)r@   r  )r@   r  )r@   N)ls-loadz3.0)r  Nc                 C   s   |dkrd }|  |f| jv S r   )lower	_featuresrh   r   r   r   rg     s   zDOMImplementation.hasFeaturec           	      C   s   |r|j d urtjd|  }|d u o|d u o|d u  }|s(|r(tjd|rZt|\}}|dkr>|dkr>tjd|rH|sHtjd|||}|rU|	| |	| |rb| |_ |_
||_| |_|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)rD   r@   rA   WrongDocumentErr_create_documentInvalidCharacterErrr3  r   createElementNSrF   rb   doctyperf   )	r   r   r5  r  r   add_root_elementr   r6  rX  r   r   r   createDocument  s<   

z DOMImplementation.createDocumentc                 C   s   t |}||_||_|S r*   )r  r  r  )r   r5  r  r  r  r   r   r   createDocumentType     z$DOMImplementation.createDocumentTypec                 C   rs   r*   )rg   rt   r   r   r   ru     rv   zDOMImplementation.getInterfacec                 C   s   t  S r*   )Documentr   r   r   r   r    r2   z"DOMImplementation._create_documentN)	r   r   r   r  rg   r  r  ru   r  r   r   r   r   r    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   rf  r*   r+  r  r   r   r   r     r.   zElementInfo.__init__c                 C      t S r*   r   r   anamer   r   r   r     r   zElementInfo.getAttributeTypec                 C   r  r*   r  r  r   r   r   r     r   zElementInfo.getAttributeTypeNSc                 C   r
   rB  r   r   r   r   r   r    r   zElementInfo.isElementContentc                 C   r
   )zQReturns true iff this element is declared to have an EMPTY
        content model.Fr   r   r   r   r   isEmpty  s   zElementInfo.isEmptyc                 C   r
   )z7Returns true iff the named attribute is a DTD-style ID.Fr   r  r   r   r   r     rn   zElementInfo.isIdc                 C   r
   )z<Returns true iff the identified attribute is a DTD-style ID.Fr   r  r   r   r   r     rn   zElementInfo.isIdNSc                 C   r/   r*   r+  r   r   r   r   r    r2   zElementInfo.__getstate__c                 C   rf  r*   r+  r  r   r   r   r    r.   zElementInfo.__setstate__N)r   r   r   r  r   r   r   r   r  r  r   r   r  r  r   r   r   r   r    s    r  c                 C   sD   | j tjkr| j  d | _d S t| r | jj  d | j_d S d S r*   )r!   r	   r"   	_id_cacheclear_id_search_stackr   rb   r   r   r   r   rK     s   

rK   c                   @   sv  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  r   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   rX  r{   r   r   r   r   .  s   zDocument._get_elem_infoc                 C   r/   r*   r  r   r   r   r   r  5  r2   zDocument._get_actualEncodingc                 C   r/   r*   )r  r   r   r   r   _get_doctype8  r2   zDocument._get_doctypec                 C   r/   r*   )documentURIr   r   r   r   _get_documentURI;  r2   zDocument._get_documentURIc                 C   r/   r*   r  r   r   r   r   r  >  r2   zDocument._get_encodingc                 C   r/   r*   )errorHandlerr   r   r   r   _get_errorHandlerA  r2   zDocument._get_errorHandlerc                 C   r/   r*   )r   r   r   r   r   _get_standaloneD  r2   zDocument._get_standalonec                 C   r/   r*   )strictErrorCheckingr   r   r   r   _get_strictErrorCheckingG  r2   z!Document._get_strictErrorCheckingc                 C   r/   r*   r  r   r   r   r   r  J  r2   zDocument._get_versionc                 C   sj   |j | jvrtjdt|t| f |jd ur|j| |j tj	kr/| 
 r/tjdt| |S )Nr:   z two document elements disallowed)r!   r?   r@   rA   rB   rC   rD   rE   r	   r]   _get_documentElementrF   r  r   r   r   rF   M  s   
zDocument.appendChildc                 C   sP   z| j | W n ty   tj w d  |_|_d |_| j	|u r&d | _	|S r*   )
r,   rW   rH   r@   rA   rI   rM   rN   rD   documentElementrX   r   r   r   rE   ]  s   

zDocument.removeChildc                 C   s$   | j D ]}|jtjkr|  S qd S r*   )r,   r!   r	   r]   r  r   r   r   r  i  s
   
zDocument._get_documentElementc                 C   s(   | j d ur| j   d | _ t|  d S r*   )r  r[   r	   r   r   r   r   r[   n  s   

zDocument.unlinkc                 C   s   |sd S | j d d d }| j|_| j|_| j|_| jD ]7}t|||}|j|s+J |j	| |j
tjkr?|jd u s>J n|j
tjkrO|jd u sLJ ||_||_q| tjjj| | |S r*   )rf   r  r   r   rj   r,   ra   rb   rq   r\   r!   r	   r"   r  r  r  rD   r   r@   rA   r  r  )r   rc   r  r  
childcloner   r   r   rd   t  s(   
zDocument.cloneNodec                 C   s   t  }| |_|S r*   )r   rb   )r   r   r   r   r   createDocumentFragment  s   zDocument.createDocumentFragmentc                 C      t |}| |_|S r*   )r)  rb   )r   r   r  r   r   r   createElement     zDocument.createElementc                 C   (   t |ts	tdt }||_| |_|S Nznode contents must be a string)r   r   r
  r   rZ   rb   )r   rZ   tr   r   r   createTextNode     
zDocument.createTextNodec                 C   r  r  )r   r   r
  r  rZ   rb   r   rZ   rQ   r   r   r   createCDATASection  r  zDocument.createCDATASectionc                 C   r  r*   )r  rb   r  r   r   r   createComment  r  zDocument.createCommentc                 C   s   t ||}| |_|S r*   )ra  rb   )r   rc  rZ   pr   r   r   createProcessingInstruction  s   
z$Document.createProcessingInstructionc                 C   s   t |}| |_d|_|S r   )r   rb   r   )r   r   ar   r   r   createAttribute  r  zDocument.createAttributec                 C   s"   t |\}}t|||}| |_|S r*   )r3  r)  rb   )r   r   r5  r   r   r  r   r   r   r    s   zDocument.createElementNSc                 C   s*   t |\}}t||||}| |_d|_|S r   )r3  r   rb   r   )r   r   r5  r   r   r  r   r   r   createAttributeNS  s
   zDocument.createAttributeNSc                 C   s   t ||||}| |_|S r*   )r  rb   )r   r   r  r  r  r  r   r   r   _create_entity  s   zDocument._create_entityc                 C   s   t |||}| |_|S r*   )r  rb   )r   r   r  r  r  r   r   r   _create_notation  s   zDocument._create_notationc                 C   s~  || j v r
| j | S | js| jsd S | j}|d u r!| jg}|| _n|s%d S d }|r| }|dd |jD  | |}|r|j	
 D ]S}|jre||j|jrd|| j |j< |j|kr_|}qD|jsd n4qD||jr|| j |j< |j|kry|}qD|js~ nqD|jr|| j |j< |j|kr|}qD|jdkr nqDn|jr|j	
 D ]}|jr|| j |j< |j|kr|}q|d ur	 |S |s)|S )Nc                 S   s   g | ]	}|j tv r|qS r   )r!   rJ   ).0r`   r   r   r   
<listcomp>  s    
z+Document.getElementById.<locals>.<listcomp>r;   )r  r  r   r  r  popextendr,   r   r   r   r   r   r   r   r   r   r   r   )r   r   stackresultrR   r   r-  r   r   r   getElementById  sf   







'zDocument.getElementByIdc                 C   rD  r*   rE  r  r   r   r   rF    r   zDocument.getElementsByTagNamec                 C   rG  r*   rH  r  r   r   r   rI  
  rJ  zDocument.getElementsByTagNameNSc                 C   r   r*   )rf   rg   rh   r   r   r   rk     r   zDocument.isSupportedc                 C   s<   |j tjkrtjd|j tjkrtjdt||| S )Nzcannot import document nodesz!cannot import document type nodes)r!   r	   r"   r@   rA   NotSupportedErrr  ra   )r   rR   rc   r   r   r   
importNode  s
   zDocument.importNoder   c           	      C   sx   g }|r| d| d |d ur| d|rdnd d |dd| d|  | jD ]
}||||| q/d S )	Nz
encoding="r   zstandalone="yesnoz<?xml version="1.0"  z?>)r\   r   r  r,   r#   )	r   r(   r&   rL  r'   r   r   declarationsrR   r   r   r   r#     s   
zDocument.writexmlc                 C   sF  |j | urtjd| |j f |jtjtjfvrtjd|t	kr[d|v r@|
dd\}}|dkr?|tjjkr?tjdn|dkrV|tjjkrV|jtjkrVtjdd }|}nd }d }|jtjkru|j}|d urt|j}|| nd }||_||_||_||_|jtjkr||_|S ||_|d ur|| |r|| |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)rb   r@   rA   r  r!   r	   r]   r   r  r   r   r   r   r   r   r:  r   r   r   r   r   r   r1  rO  )r   r  r   r   r   r   rX  is_idr   r   r   
renameNode(  sb   



zDocument.renameNode)r   r   r   NN)=r   r   r   r   r	   r]   r   r   r  r?   r  rf   r"   r!   r   r   r   rD   rN   rM   r  r   r   rj   r  r  r  r   r   r   r  r  r  r  r  r  r  r  rF   rE   r  r[   rd   r  r  r  r  r  r  r  r  r  r  r  r   rF  rI  rk   r  r#   r  r   r   r   r   r  
  sn    	
:
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rQ|
| j| j}| j D ]}||j|j|j ||j|j}|j|_q$|rP| jD ]}t|||}|| qBn| jtjkro| }|rn| 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}n| jtj!kr|"| j}n| jtj#kr|$| j| j}d|_| j|_n| jtj%krE| j |usJ tjjj}|j&'| j(| j)| j*}||_ |rDg |j+_,g |j-_,| j-j,D ]"}	t.|	j|	j)|	j*}
||
_ |j-j,/|
 t0|	dr|	1||	|
 q| j+j,D ]1}t2|j|j)|j*|j3}|j4|_4|j5|_5|j6|_6||_ |j+j,/| t0|drB|1||| qn
tj7dt8|  t0| dr\| 1|| | |S )zo
    Clone a node and give it the new owner document.
    Called by Node.cloneNode and Document.importNode
    Tr   zCannot clone node %s)9rb   rq   r@   rA   r  r  NODE_IMPORTEDr!   r	   r]   r  r   r   r   r   r7  r   r4  r   r   r,   ra   rF   r<   r  rY   r  rZ   r   r  r   r  rc  r   r  r   r  r  rf   r  r   r  r  r  r  r  r  r\   r   r   r  r  r  r   rj   r  rC   )rR   rc   newOwnerDocumentr   r  r-  r  r`   rQ   r  r  r  r  r   r   r   ra   a  s   





ra   c                 C   s(   |  dd}t|dkr|S d |d fS )Nr   r;      r   )r   r   )r5  fieldsr   r   r   r3    s   r3  c                 C   s0   | |i |}|  \}}|| |  |S r*   )getEvent
expandNoder  )funcargskwargseventstoktyperootNoder   r   r   _do_pulldom_parse  s
   
r  c                 C   sD   |du r|sddl m} || S ddl m} t|j| f||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   s>   |du rddl m} || S ddl m} t|j| fd|i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   _parse_feature_stringr  rf   rg   )featuresfvr   r   r   getDOMImplementation  s   

r%  r   r*   )7r  r   r  r@   r   r   r   r   xml.dom.minicompatxml.dom.xmlbuilderr   r   rA   r	   r]   r   rJ   defpropertyrT   r   r   r   r   r   r   objectr   AttributeListr!  r   r)  r;  rY  ra  rl  r   r  rS  r  r  r  r  r  r  r  r  r  rK   r  ra   r3  r  r  r  r%  r   r   r   r   <module>   s     w
	{ $
  )GU	><(	O*  UR



