o
    éT•jŽ	 ã                   @   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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-d.„ d.ƒZG d/d0„ d0eeƒZ G d1d2„ d2eeƒZ!ee!d"d3d
� G d4d5„ d5e!ƒZ"ee"d6d7d
� ee"d8d9d
� d:d;„ Z#d<d=„ Z$G d>d?„ d?e!ƒZ%G d@dA„ dAe"ƒZ&G dBdC„ dCeƒZ'ee'd"dDd
� G dEdF„ dFƒZ(G dGdH„ dHe(eeƒZ)G dIdJ„ dJe(eƒZ*G dKdL„ dLe(eeƒZ+G dMdN„ dNe
ƒZ,G dOdP„ dPeƒZ-dQdR„ Z.G dSdT„ dTeeƒZ/ee/dUdVd
� dWdX„ Z0dYdZ„ Z1d[d\„ Z2dcd]d^„Z3ddd_d`„Z4dddadb„Z5dS )eac  Simple implementation of the Level 1 DOM.

Namespaces and other minor Level 2 features are also supported.

parse("foo.xml")

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

Todo:
=====
 * convenience methods for getting elements and text.
 * more testing
 * bring some of the writer and linearizer code into conformance with this
        interface
 * SAX 2 namespaces
é    N)ÚEMPTY_NAMESPACEÚEMPTY_PREFIXÚXMLNS_NAMESPACEÚdomreg)Ú*)ÚDOMImplementationLSÚ
DocumentLSc                   @   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   ©Néÿÿÿÿr0   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:   |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¤   /  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¨   7  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__N  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ª   @  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   sF   d | _ d | _|| _|| _|| _|d ur|| _tƒ | _| j t	ƒ ¡ d S r*   )
r¹   rb   rµ   r”   r·   r¸   r‰   r,   r\   ÚText)r   ÚqNamer”   r™   r•   r   r   r   r«   \  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   l  ó
   ÿzAttr._get_localNamec                 C   r/   r*   )Ú	specifiedr   r   r   r   Ú_get_specifiedr  r2   zAttr._get_specifiedc                 C   r/   r*   )rµ   r   r   r   r   Ú	_get_nameu  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_namex  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 ©NTF)	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´   R  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   ÚgetNamedItem7  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   ÚgetNamedItemNS=  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   ÚremoveNamedItemC  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   ÚremoveNamedItemNSO  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  [  s   
ÿ
zNamedNodeMap.setNamedItemc                 C   s
   |   |¡S r*   )r  ©r   rR   r   r   r   ÚsetNamedItemNSh  r.   zNamedNodeMap.setNamedItemNSc                 C   s   | | }t |jƒ | ¡  d S r*   )rK   r¹   r[   )r   r  rR   r   r   r   Ú__delitem__k  s   
zNamedNodeMap.__delitem__c                 C   s   | j | j| jfS r*   rå   r   r   r   r   Ú__getstate__p  r   zNamedNodeMap.__getstate__c                 C   s   |\| _ | _| _d S r*   rå   ©r   Ústater   r   r   Ú__setstate__s  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   sH   d | _ d | _| | _| _|| _|| _tƒ | _d  | _| _	d | _
d | _d S r*   )rb   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   r/  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   r.    s   
zElement.getAttributeNodec                 C   s   | j d u rd S | j  ||f¡S r*   )rÐ   rú   r  r   r   r   r2    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   r/    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   r8  )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   r8  )r   r”   r™   r+  r   r   r   ÚremoveAttributeNS+  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   r8  4  s   

ÿzElement.removeAttributeNodec                 C   s   | j du rdS || j v S )z¾Checks 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   ÚhasAttributeD  s   

zElement.hasAttributec                 C   s   | j d u rdS ||f| j v S ©NF)rÐ   r  r   r   r   ÚhasAttributeNSN  s   
zElement.hasAttributeNSc                 C   ó   t | |tƒ ƒS )z¶Returns 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   ÚgetElementsByTagNameS  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%  _  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 )z®Write 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#   b  s&   	

ÿ


zElement.writexmlc                 C   s   |   ¡  t| j| j| ƒS r*   )r(  rä   rÏ   rÐ   r   r   r   r   rI  ‚  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*   )r.  ÚsetIdAttributeNode)r   r¦   ÚidAttrr   r   r   ÚsetIdAttributeŽ  s   
zElement.setIdAttributec                 C   s   |   ||¡}|  |¡ d S r*   )r2  rM  )r   r”   r™   rN  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   rN  r   r   r   rM  –  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-  r0  r5  r.  r2  r/  ÚsetAttributeNodeNSr<  r=  r8  ÚremoveAttributeNodeNSr?  rA  rD  rG  r%  r#   rI  rL  rO  rP  rM  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   r9  §  s
   
r9  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 )Ú	Childlessz�Mixin 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
   r@  r   r   r   r   r   r-   Ç  r   zChildless.hasChildNodesc                 C   rX  ©Nz nodes do not have childrenrY  ©r   rO   rP   r   r   r   r>   Ê  rZ  zChildless.insertBeforec                 C   rX  r[  )r@   rA   rI   r¬   rX   r   r   r   rE   Î  rZ  zChildless.removeChildc                 C   rl   r*   r   r   r   r   r   r^   Ò  rn   zChildless.normalizec                 C   rX  r[  rY  ©r   rO   rU   r   r   r   rV   Ö  rZ  zChildless.replaceChild)r‘   r’   r“   r  rà   r®   ÚEmptyNodeListr,   r–   r˜   r5   r9   rF   r-   r>   rE   r^   rV   r   r   r   r   rW  ²  s    rW  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*   r`  )r   ra  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*   rb  rÄ   r   r   r   Ú_set_nodeValueæ  r.   z$ProcessingInstruction._set_nodeValuec                 C   r/   r*   ©ra  r   r   r   r   Ú_get_nodeNameë  r2   z#ProcessingInstruction._get_nodeNamec                 C   rd  r*   rf  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    ra  rZ   ©r   r(   r&   rJ  r'   r   r   r   r#   ñ  s   zProcessingInstruction.writexmlNrS  )r‘   r’   r“   r	   r±   r!   rà   r«   rc  re  râ   r­   rg  rh  r¬   r#   r   r   r   r   r_  Û  s    

r_  c                   @   sr   e Zd ZdZdd„ Zdd„ ZeZdd„ Zdd	„ Ze	eeƒ Z
Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚCharacterData)Ú_datarb   rD   rN   rM   c                 C   s,   d  | _ | _d  | _| _d| _t | ¡ d S r   )rb   rD   rN   rM   rk  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*   ©rk  r   r   r   r   Ú	_get_data  r2   zCharacterData._get_datac                 C   rd  r*   rl  ©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*   rb  )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   rs  rt  ú%s%s%srv  )r   ry  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 rr  rv  rx  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   rs  rt  ru  r~  rv  )r   ry  rz  r|  r   r   r   ÚreplaceData1  s   ÿÿzCharacterData.replaceDataN)r‘   r’   r“   rà   r«   rê   r  rm  ro  râ   rZ   r­   r%  r{  r}  r  r€  r�  r   r   r   r   rj  õ  s    			
rj  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   rw  r$  rb   rM   rD   r,   rF   r>   )r   ry  ÚnewTextÚnextr   r   r   Ú	splitTextF  s   zText.splitTextr   c                 C   s   t |d|| j|f ƒ d S )Nr~  )r¡   rZ   ri  r   r   r   r#   U  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_wholeTextZ  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   ÚreplaceWholeTextl  s.   
ú

úzText.replaceWholeTextc                 C   sB   | j  ¡ rdS t| ƒ}|d u rdS | j |¡}|d u rdS | ¡ S r@  )rZ   ÚstripÚ_get_containing_elementrb   rÖ   ÚisElementContent)r   rÔ   rÚ   r   r   r   Ú!_get_isWhitespaceInElementContentˆ  s   
z&Text._get_isWhitespaceInElementContentrS  )r‘   r’   r“   rà   r	   rY   r!   r¬   r®   r„  r#   r†  rˆ  rŒ  r   r   r   r   rº   ?  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   rQ  £  r‘  rQ  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*   )rj  r«   rk  rn  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    ri  r   r   r   r#   ´  s   
zComment.writexmlNrS  )	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    ri  r   r   r   r#   À  s   zCDATASection.writexmlNrS  )	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   rd  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   rR  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Ú	notationsr1  r¦   r¬   )r   r3  r•   r4  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©  ri  r   r   r   r#   E  s   
ÿ


zDocumentType.writexmlrS  )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«   \  s   zEntity.__init__c                 C   r/   r*   ©r°  r   r   r   r   Ú_get_actualEncodingb  r2   zEntity._get_actualEncodingc                 C   r/   r*   ©r   r   r   r   r   Ú_get_encodinge  r2   zEntity._get_encodingc                 C   r/   r*   ©rj   r   r   r   r   Ú_get_versionh  r2   zEntity._get_versionc                 C   r›  )Nz(cannot append children to an entity node©r@   rA   rB   )r   rO   r   r   r   rF   k  rž  zEntity.appendChildc                 C   r›  )Nz+cannot insert children below an entity noder½  r\  r   r   r   r>   o  rž  zEntity.insertBeforec                 C   r›  )Nz*cannot remove children from an entity noder½  rX   r   r   r   rE   s  rž  zEntity.removeChildc                 C   r›  )Nz)cannot replace children of an entity noder½  r]  r   r   r   rV   w  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®  S  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ÚInvalidCharacterErrr1  rË   ÚcreateElementNSrF   rb   Údoctyperf   )	r   r”   r3  rÊ  r—   Úadd_root_elementr•   r4  rV  r   r   r   ÚcreateDocument”  s<   ÿÿþÿ

z DOMImplementation.createDocumentc                 C   s   t |ƒ}||_||_|S r*   )r¦  r¡  r¢  )r   r3  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 )ÚElementInfoz÷Object 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   rd  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
   r@  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   rd  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   sB   | j tjkr| j ¡  d | _d S | jr| jj ¡  d | j_d S d S r*   )r!   r	   r"   Ú	_id_cacheÚclearÚ_id_search_stackrb   )rR   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   rV  r{   r   r   r   rÖ   )  s   zDocument._get_elem_infoc                 C   r/   r*   r·  r   r   r   r   r¸  0  r2   zDocument._get_actualEncodingc                 C   r/   r*   )rÊ  r   r   r   r   Ú_get_doctype3  r2   zDocument._get_doctypec                 C   r/   r*   )ÚdocumentURIr   r   r   r   Ú_get_documentURI6  r2   zDocument._get_documentURIc                 C   r/   r*   r¹  r   r   r   r   rº  9  r2   zDocument._get_encodingc                 C   r/   r*   )ÚerrorHandlerr   r   r   r   Ú_get_errorHandler<  r2   zDocument._get_errorHandlerc                 C   r/   r*   )r   r   r   r   r   Ú_get_standalone?  r2   zDocument._get_standalonec                 C   r/   r*   )ÚstrictErrorCheckingr   r   r   r   Ú_get_strictErrorCheckingB  r2   z!Document._get_strictErrorCheckingc                 C   r/   r*   r»  r   r   r   r   r¼  E  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   H  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   X  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â  d  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[   i  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   o  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*   )r_  rb   )r   ra  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*   )r1  r'  rb   )r   r”   r3  r•   r™   r³  r   r   r   rÉ  ®  s   zDocument.createElementNSc                 C   s*   t |ƒ\}}t||||ƒ}| |_d|_|S r   )r1  r´   rb   rÅ   )r   r”   r3  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   rB  r*   rC  r  r   r   r   rD    rû   zDocument.getElementsByTagNamec                 C   rE  r*   rF  r  r   r   r   rG    rH  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&   rJ  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Ñ   r8  r•   r¸   r”   r¬   r£   r¦   r/  rM  )r   r  r”   r¦   r•   r™   rV  Ú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þ  rD  rG  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sÉJ ‚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ï   r5  rÅ   r2  r™   rÁ   r,   ra   rF   r<   rå  rY   rì  rZ   r¯   rï  r±   rò  ra  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   \  s�   
ÿ

€
€ÿÿ

ÿ€ÿ€ra   c                 C   s(   |   dd¡}t|ƒdkr|S d |d fS )Nr¾   r;   é   r   )r¿   ré   )r3  Úfieldsr   r   r   r1  ®  s   r1  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*   )6r  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´   Úobjecträ   ÚAttributeListr  rÜ   r'  r9  rW  r_  rj  rº   rŠ  rQ  r’  r“  r•  rŸ  r¦  r®  r­  r¿  rÐ  rK   rÏ  ra   r1  r  r  r  r#  r   r   r   r   Ú<module>   sž    ÿ w	| $ÿ
  ÿÿ)GUÿÿ	>ÿ<(	O*  UÿR



