U
    ¼Ê¦i‹ ã                   @   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`„Z4dedadb„Z5dS )fac  Simple implementation of the Level 1 DOM.

Namespaces and other minor Level 2 features are also supported.

parse("foo.xml")

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

Todo:
=====
 * convenience methods for getting elements and text.
 * more testing
 * bring some of the writer and linearizer code into conformance with this
        interface
 * SAX 2 namespaces
é    N)ÚEMPTY_NAMESPACEÚEMPTY_PREFIXÚXMLNS_NAMESPACEÚdomreg)Ú*)ÚDOMImplementationLSÚ
DocumentLSc                   @   sà   e Zd ZdZdZdZdZdZeZ	dd„ Z
d2dd„Zd3dd	„Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Z dS )4ÚNodeNc                 C   s   dS )NT© ©Úselfr
   r
   ú%/usr/lib/python3.8/xml/dom/minidom.pyÚ__bool__+   s    zNode.__bool__c                 C   s   |   dd|¡S ©NÚ )Útoprettyxml)r   Úencodingr
   r
   r   Útoxml.   s    z
Node.toxmlú	Ú
c                 C   sx   |d krt  ¡ }nt jt  ¡ |ddd�}| jtjkrH|  |d|||¡ n|  |d||¡ |d krh| ¡ S | 	¡  ¡ S d S )NÚxmlcharrefreplacer   )r   ÚerrorsÚnewliner   )
ÚioÚStringIOÚTextIOWrapperÚBytesIOÚnodeTyper	   ÚDOCUMENT_NODEÚwritexmlÚgetvalueÚdetach)r   ÚindentÚnewlr   Úwriterr
   r
   r   r   1   s    

ýzNode.toprettyxmlc                 C   s
   t | jƒS ©N)ÚboolÚ
childNodesr   r
   r
   r   ÚhasChildNodesC   s    zNode.hasChildNodesc                 C   s   | j S r%   ©r'   r   r
   r
   r   Ú_get_childNodesF   s    zNode._get_childNodesc                 C   s   | j r| j d S d S ©Nr   r)   r   r
   r
   r   Ú_get_firstChildI   s    zNode._get_firstChildc                 C   s   | j r| j d S d S ©Néÿÿÿÿr)   r   r
   r
   r   Ú_get_lastChildM   s    zNode._get_lastChildc                 C   s
  |j | jkr,t|jƒD ]}|  ||¡ q|S |j | jkrTtj dt	|ƒt	| ƒf ¡‚|j
d k	rj|j
 |¡ |d kr~|  |¡ nˆz| j |¡}W n tk
r¬   tj ¡ ‚Y nX |j tk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Úcr=   Únoder
   r
   r   r4   Q   s8    ÿ

zNode.insertBeforec                 C   s�   |j | jkr*t|jƒD ]}|  |¡ q|S |j | jkrTtj dt	|ƒt	| ƒf ¡‚n|j t
krft| ƒ |jd k	r||j |¡ t| |ƒ d |_|S ©Nr0   )r   r2   r3   r'   r<   r5   r6   r7   r8   r9   r@   rA   r:   r;   Ú_append_childrC   )r   rH   rG   r
   r
   r   r<   q   s    ÿ


zNode.appendChildc                 C   s  |j | jkr(|j}|  |¡ |  ||¡S |j | jkrPtj dt	|ƒt	| ƒf ¡‚||kr\d S |j
d k	rr|j
 |¡ z| j |¡}W n tk
r    tj ¡ ‚Y nX || j|< | |_
d |_
|j tksÌ|j tkrÔt| ƒ |j|_|j|_d |_d |_|jrþ||j_|j�r||j_|S rI   )r   r2   rC   r;   r4   r5   r6   r7   r8   r9   r:   r'   r=   r>   r?   r@   rA   rD   )r   rE   ÚoldChildrF   r=   r
   r
   r   ÚreplaceChild‚   s@    
ÿ


ÿzNode.replaceChildc                 C   s€   z| j  |¡ W n tk
r.   tj ¡ ‚Y nX |jd k	rD|j|j_|jd k	rX|j|j_d  |_|_|jt	krvt
| ƒ d |_|S r%   )r'   Úremover>   r6   r7   r?   rC   rD   r   r@   rA   r:   ©r   rK   r
   r
   r   r;   ¢   s    




zNode.removeChildc                 C   sÒ   g }| j D ]´}|jtjkr |jsJ|r0|j|d _|jr@|j|j_| ¡  q¾|r”|d j|jkr”|d }|j|j |_|j|_|jrŠ||j_| ¡  q¾| |¡ q
| |¡ |jtj	kr
| 
¡  q
|| j d d …< d S r-   )r'   r   r	   Ú	TEXT_NODEÚdatarC   rD   ÚunlinkÚappendÚELEMENT_NODEÚ	normalize)r   ÚLÚchildrH   r
   r
   r   rT   ²   s*    





zNode.normalizec                 C   s   t | || jp| ƒS r%   )Ú_clone_nodeÚownerDocument)r   Údeepr
   r
   r   Ú	cloneNodeÍ   s    zNode.cloneNodec                 C   s   | j j ||¡S r%   )rX   ÚimplementationÚ
hasFeature©r   ÚfeatureÚversionr
   r
   r   ÚisSupportedÐ   s    zNode.isSupportedc                 C   s   d S r%   r
   r   r
   r
   r   Ú_get_localNameÓ   s    zNode._get_localNamec                 C   s   | |kS r%   r
   ©r   Úotherr
   r
   r   Ú
isSameNodeÙ   s    zNode.isSameNodec                 C   s   |   |d ¡r| S d S d S r%   )r`   ©r   r^   r
   r
   r   ÚgetInterfaceÜ   s    zNode.getInterfacec              	   C   s0   z| j | d W S  ttfk
r*   Y d S X d S r+   )Ú
_user_dataÚAttributeErrorÚKeyError©r   Úkeyr
   r
   r   ÚgetUserDataæ   s    zNode.getUserDatac                 C   sn   d }z
| j }W n tk
r,   i }|| _ Y nX ||krB|| d }|d kr^d }|d k	rj||= n||f||< |S r+   )rg   rh   )r   rk   rP   ÚhandlerÚoldÚdr
   r
   r   ÚsetUserDataì   s    
zNode.setUserDatac                 C   sD   t | dƒr@t| j ¡ ƒD ]&\}\}}|d k	r| |||||¡ qd S )Nrg   )ÚhasattrÚlistrg   ÚitemsZhandle)r   Ú	operationÚsrcZdstrk   rP   rm   r
   r
   r   Ú_call_user_data_handlerþ   s    
zNode._call_user_data_handlerc                 C   s>   d  | _ | _| jr.| jD ]}| ¡  qtƒ | _d | _d | _d S r%   )r:   rX   r'   rQ   ÚNodeListrD   rC   )r   rV   r
   r
   r   rQ     s    

zNode.unlinkc                 C   s   | S r%   r
   r   r
   r
   r   Ú	__enter__  s    zNode.__enter__c                 C   s   |   ¡  d S r%   )rQ   )r   ZetZevÚtbr
   r
   r   Ú__exit__  s    zNode.__exit__)N)r   r   N)!Ú__name__Ú
__module__Ú__qualname__ÚnamespaceURIr:   rX   rC   rD   r   Úprefixr   r   r   r(   r*   r,   r/   r4   r<   rL   r;   rT   rZ   r`   ra   rd   rf   rl   rp   rv   rQ   rx   rz   r
   r
   r
   r   r	   "   s:   

  
r	   Ú
firstChildzFirst child node, or None.)ÚdocÚ	lastChildzLast child node, or None.Ú	localNamez"Namespace-local name of this node.c                 C   s2   | j }|r|d }||_||_| |¡ | |_d S r-   )r'   rD   rC   rR   r:   )r   rH   r'   Zlastr
   r
   r   rJ     s    
rJ   c                 C   s6   |r2|  dd¡  dd¡  dd¡  dd¡}|  |¡ d	S )
zWrites datachars to writer.ú&z&amp;ú<z&lt;ú"z&quot;ú>z&gt;N)ÚreplaceÚwrite)r$   rP   r
   r
   r   Ú_write_data'  s     ÿ ÿrŠ   c                 C   sD   | j D ]8}|jtjkr2|dks(|j|kr2| |¡ t|||ƒ q|S ©Nr   )r'   r   r	   rS   ÚtagNamerR   Ú_get_elements_by_tagName_helper)ÚparentÚnameÚrcrH   r
   r
   r   r�   .  s    
ÿÿ
r�   c                 C   sX   | j D ]L}|jtjkr|dks(|j|krD|dks:|j|krD| |¡ t||||ƒ q|S r‹   )r'   r   r	   rS   rƒ   r~   rR   Ú"_get_elements_by_tagName_ns_helper)rŽ   ZnsURIrƒ   r�   rH   r
   r
   r   r‘   6  s    
ÿÿ
r‘   c                   @   sJ   e Zd ZejZdZdZdZdZ	ej
ejejejejejejfZdd„ ZdS )ÚDocumentFragmentz#document-fragmentNc                 C   s   t ƒ | _d S r%   )rw   r'   r   r
   r
   r   Ú__init__M  s    zDocumentFragment.__init__)r{   r|   r}   r	   r2   r   ÚnodeNameÚ	nodeValueÚ
attributesr:   rS   rO   ÚCDATA_SECTION_NODEÚENTITY_REFERENCE_NODEÚPROCESSING_INSTRUCTION_NODEÚCOMMENT_NODEÚNOTATION_NODEr5   r“   r
   r
   r
   r   r’   ?  s   úr’   c                   @   s¼   e Zd ZdZejZdZdZdZ	ej
ejfZeddfdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zeeeƒ ZZdd„ Zdd„ Zeeeƒ ZZdd„ Zdd„ ZeeeƒZdd„ Zdd„ Zdd„ ZdS )ÚAttr)Ú_nameÚ_valuer~   Ú_prefixr'   Ú
_localNamerX   ÚownerElementNFc                 C   s8   d | _ d | _|| _|| _|| _tƒ | _| j tƒ ¡ d S r%   )	r¡   rX   r�   r~   rŸ   rw   r'   rR   ÚText)r   ÚqNamer~   rƒ   r   r
   r
   r   r“   [  s    zAttr.__init__c                 C   s4   z| j W S  tk
r.   | j dd¡d  Y S X d S ©Nú:r1   r.   )r    rh   r”   Úsplitr   r
   r
   r   ra   i  s    zAttr._get_localNamec                 C   s   | j S r%   )Ú	specifiedr   r
   r
   r   Ú_get_specifiedo  s    zAttr._get_specifiedc                 C   s   | j S r%   )r�   r   r
   r
   r   Ú	_get_namer  s    zAttr._get_namec                 C   s   || _ | jd k	rt| jƒ d S r%   )r�   r¡   rA   ©r   Úvaluer
   r
   r   Ú	_set_nameu  s    
zAttr._set_namec                 C   s   | j S r%   )rž   r   r
   r
   r   Ú
_get_value|  s    zAttr._get_valuec                 C   s6   || _ || jd _| jd k	r&t| jƒ || jd _d S r+   )rž   r'   rP   r¡   rA   rª   r
   r
   r   Ú
_set_value  s
    

zAttr._set_valuec                 C   s   | j S r%   )rŸ   r   r
   r
   r   Ú_get_prefixˆ  s    zAttr._get_prefixc                 C   sd   | j }|dkr&|r&|tkr&tj d¡‚|| _|d kr<| j}nd|| jf }| jrZt| jƒ || _	d S )NÚxmlnsz5illegal use of 'xmlns' prefix for the wrong namespacez%s:%s)
r~   r   r6   r7   ÚNamespaceErrrŸ   rƒ   r¡   rA   r�   )r   r   ZnsuriZnewNamer
   r
   r   Ú_set_prefix‹  s    ÿ
zAttr._set_prefixc                 C   sv   | j }|d k	rR|j| j= |j| j| jf= | jrRd| _| jd8  _| j j	d8  _	| j
D ]}| ¡  qX| j
d d …= d S )NFr1   )r¡   Ú_attrsr”   Ú_attrsNSr~   rƒ   Ú_is_idÚ_magic_id_nodesrX   Ú_magic_id_countr'   rQ   )r   ÚelemrV   r
   r
   r   rQ   œ  s    


zAttr.unlinkc                 C   sf   | j r
dS | j}| j}|d ks&|d kr*dS | |¡}|d kr@dS | jrV| | j| j¡S | | j¡S d S ©NTF)	rµ   rX   r¡   Ú_get_elem_infor~   ÚisIdNSrƒ   ÚisIdr”   ©r   r�   r¸   Úinfor
   r
   r   Ú	_get_isId­  s    
zAttr._get_isIdc                 C   s\   | j }| j}|d ks|d kr tS | |¡}|d kr6tS | jrL| | j| j¡S | | j¡S d S r%   )	rX   r¡   Ú_no_typerº   r~   ÚgetAttributeTypeNSrƒ   ÚgetAttributeTyper”   r½   r
   r
   r   Ú_get_schemaType½  s    
zAttr._get_schemaType) r{   r|   r}   Ú	__slots__r	   ÚATTRIBUTE_NODEr   r–   r§   rµ   rO   r˜   r5   r   r“   ra   r¨   r©   r¬   Úpropertyr”   r�   r­   r®   r•   r«   r¯   r²   r   rQ   r¿   rÃ   r
   r
   r
   r   rœ   Q  s.   ÿ

rœ   r¼   z True if this attribute is an ID.z'Namespace-local name of this attribute.Ú
schemaTypezSchema type for this attribute.c                   @   sò   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zd:dd„ZeZdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Z dS );ÚNamedNodeMapa  The attribute list is a transient interface to the underlying
    dictionaries.  Mutations here will change the underlying element's
    dictionary.

    Ordering is imposed artificially and does not reflect the order of
    attributes as found in an input document.
    ©r³   r´   Ú_ownerElementc                 C   s   || _ || _|| _d S r%   rÉ   )r   ÚattrsZattrsNSr¡   r
   r
   r   r“   Û  s    zNamedNodeMap.__init__c                 C   s
   t | jƒS r%   )Úlenr³   r   r
   r
   r   Ú_get_lengthà  s    zNamedNodeMap._get_lengthc                 C   s4   z| t | j ¡ ƒ|  W S  tk
r.   Y d S X d S r%   )rr   r³   ÚkeysÚ
IndexError©r   r=   r
   r
   r   Úitemã  s    zNamedNodeMap.itemc                 C   s*   g }| j  ¡ D ]}| |j|jf¡ q|S r%   )r³   ÚvaluesrR   r”   r«   ©r   rU   rH   r
   r
   r   rs   é  s    zNamedNodeMap.itemsc                 C   s0   g }| j  ¡ D ]}| |j|jf|jf¡ q|S r%   )r³   rÒ   rR   r~   rƒ   r«   rÓ   r
   r
   r   ÚitemsNSï  s    zNamedNodeMap.itemsNSc                 C   s"   t |tƒr|| jkS || jkS d S r%   )Ú
isinstanceÚstrr³   r´   rj   r
   r
   r   Ú__contains__õ  s    

zNamedNodeMap.__contains__c                 C   s
   | j  ¡ S r%   )r³   rÎ   r   r
   r
   r   rÎ   û  s    zNamedNodeMap.keysc                 C   s
   | j  ¡ S r%   )r´   rÎ   r   r
   r
   r   ÚkeysNSþ  s    zNamedNodeMap.keysNSc                 C   s
   | j  ¡ S r%   )r³   rÒ   r   r
   r
   r   rÒ     s    zNamedNodeMap.valuesNc                 C   s   | j  ||¡S r%   ©r³   Úget)r   r�   r«   r
   r
   r   rÚ     s    zNamedNodeMap.getc                 C   s:   | j t|dd ƒkrdS t| ƒt|ƒkt| ƒt|ƒk  S d S )Nr³   r   )r³   ÚgetattrÚidrb   r
   r
   r   Ú_cmp	  s    zNamedNodeMap._cmpc                 C   s   |   |¡dkS r+   ©rÝ   rb   r
   r
   r   Ú__eq__  s    zNamedNodeMap.__eq__c                 C   s   |   |¡dkS r+   rÞ   rb   r
   r
   r   Ú__ge__  s    zNamedNodeMap.__ge__c                 C   s   |   |¡dkS r+   rÞ   rb   r
   r
   r   Ú__gt__  s    zNamedNodeMap.__gt__c                 C   s   |   |¡dkS r+   rÞ   rb   r
   r
   r   Ú__le__  s    zNamedNodeMap.__le__c                 C   s   |   |¡dk S r+   rÞ   rb   r
   r
   r   Ú__lt__  s    zNamedNodeMap.__lt__c                 C   s"   t |tƒr| j| S | j| S d S r%   )rÕ   r3   r´   r³   )r   Úattname_or_tupler
   r
   r   Ú__getitem__  s    

zNamedNodeMap.__getitem__c                 C   sv   t |tƒrRz| j| }W n0 tk
rH   t|ƒ}| jj|_|  |¡ Y nX ||_n t |tƒsdt	dƒ‚|}|  |¡ d S )Nz%value must be a string or Attr object)
rÕ   rÖ   r³   ri   rœ   rÊ   rX   ÚsetNamedItemr«   Ú	TypeError)r   Úattnamer«   rH   r
   r
   r   Ú__setitem__%  s    


zNamedNodeMap.__setitem__c                 C   s(   z| j | W S  tk
r"   Y d S X d S r%   )r³   ri   ©r   r�   r
   r
   r   ÚgetNamedItem4  s    zNamedNodeMap.getNamedItemc                 C   s,   z| j ||f W S  tk
r&   Y d S X d S r%   )r´   ri   ©r   r~   rƒ   r
   r
   r   ÚgetNamedItemNS:  s    zNamedNodeMap.getNamedItemNSc                 C   sX   |   |¡}|d k	rJt| jƒ | j|j= | j|j|jf= t|dƒrFd |_	|S t
j ¡ ‚d S ©Nr¡   )rë   rA   rÊ   r³   r”   r´   r~   rƒ   rq   r¡   r6   r7   r?   ©r   r�   Únr
   r
   r   ÚremoveNamedItem@  s    



zNamedNodeMap.removeNamedItemc                 C   sZ   |   ||¡}|d k	rLt| jƒ | j|j|jf= | j|j= t|dƒrHd |_	|S t
j ¡ ‚d S rî   )rí   rA   rÊ   r´   r~   rƒ   r³   r”   rq   r¡   r6   r7   r?   ©r   r~   rƒ   rð   r
   r
   r   ÚremoveNamedItemNSL  s    


zNamedNodeMap.removeNamedItemNSc                 C   st   t |tƒs&tj dt|ƒt| ƒf ¡‚| j |j¡}|r@| 	¡  || j|j< || j
|j|jf< | j|_t|jƒ |S rI   )rÕ   rœ   r6   r7   r8   r9   r³   rÚ   r�   rQ   r´   r~   rƒ   rÊ   r¡   rA   )r   rH   rn   r
   r
   r   ræ   X  s    
ÿ
zNamedNodeMap.setNamedItemc                 C   s
   |   |¡S r%   )ræ   ©r   rH   r
   r
   r   ÚsetNamedItemNSe  s    zNamedNodeMap.setNamedItemNSc                 C   s   | | }t |jƒ | ¡  d S r%   )rA   r¡   rQ   )r   rä   rH   r
   r
   r   Ú__delitem__h  s    
zNamedNodeMap.__delitem__c                 C   s   | j | j| jfS r%   rÉ   r   r
   r
   r   Ú__getstate__m  s    zNamedNodeMap.__getstate__c                 C   s   |\| _ | _| _d S r%   rÉ   ©r   Ústater
   r
   r   Ú__setstate__p  s    zNamedNodeMap.__setstate__)N)!r{   r|   r}   Ú__doc__rÄ   r“   rÍ   rÑ   rs   rÔ   r×   rÎ   rØ   rÒ   rÚ   Ú__len__rÝ   rß   rà   rá   râ   rã   rå   ré   rë   rí   rñ   ró   ræ   rõ   rö   r÷   rú   r
   r
   r
   r   rÈ   Ð  s<   
rÈ   Zlengthz$Number of nodes in the NamedNodeMap.c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚTypeInfo©Ú	namespacer�   c                 C   s   || _ || _d S r%   rþ   )r   rÿ   r�   r
   r
   r   r“   |  s    zTypeInfo.__init__c                 C   s2   | j rd| jj| j| j f S d| jj| jf S d S )Nz<%s %r (from %r)>z<%s %r>)rÿ   Ú	__class__r{   r�   r   r
   r
   r   Ú__repr__€  s
    ÿzTypeInfo.__repr__c                 C   s   | j S r%   )r�   r   r
   r
   r   r©   ‡  s    zTypeInfo._get_namec                 C   s   | j S r%   )rÿ   r   r
   r
   r   Ú_get_namespaceŠ  s    zTypeInfo._get_namespaceN)r{   r|   r}   rÄ   r“   r  r©   r  r
   r
   r
   r   rý   y  s
   rý   c                   @   s   e Zd ZdZejZdZeZ	dZ
ejejejejejejfZeddfdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZeZdd„ Zdd„ Z d d!„ Z!e!Z"d"d#„ Z#d$d%„ Z$d&d'„ Z%d(d)„ Z&d*d+„ Z'd9d-d.„Z(d/d0„ Z)d1d2„ Z*d3d4„ Z+d5d6„ Z,d7d8„ Z-dS ):ÚElement)rX   r:   rŒ   r”   r   r~   r    r'   r³   r´   rC   rD   Nr   c                 C   sH   d | _ d | _| | _| _|| _|| _tƒ | _d  | _| _	d | _
d | _d S r%   )rX   r:   rŒ   r”   r   r~   rw   r'   rC   rD   r³   r´   )r   rŒ   r~   r   rƒ   r
   r
   r   r“      s    
zElement.__init__c                 C   s   | j d kri | _ i | _d S r%   )r³   r´   r   r
   r
   r   Ú_ensure_attributesµ  s    
zElement._ensure_attributesc                 C   s4   z| j W S  tk
r.   | j dd¡d  Y S X d S r¤   )r    rh   rŒ   r¦   r   r
   r
   r   ra   º  s    zElement._get_localNamec                 C   s   | j S r%   ©rŒ   r   r
   r
   r   Ú_get_tagNameÀ  s    zElement._get_tagNamec                 C   s@   | j d k	r&t| j  ¡ ƒD ]}| ¡  qd | _ d | _t | ¡ d S r%   )r³   rr   rÒ   rQ   r´   r	   )r   Úattrr
   r
   r   rQ   Ã  s    

zElement.unlinkc                 C   s8   | j d krdS z| j | jW S  tk
r2   Y dS X d S r   )r³   r«   ri   )r   rè   r
   r
   r   ÚgetAttributeË  s    
zElement.getAttributec                 C   s<   | j d krdS z| j ||f jW S  tk
r6   Y dS X d S r   )r´   r«   ri   rì   r
   r
   r   ÚgetAttributeNSÓ  s    
zElement.getAttributeNSc                 C   sV   |   |¡}|d kr4t|ƒ}||_| j|_|  |¡ n||jkrR||_|jrRt| ƒ d S r%   )ÚgetAttributeNoderœ   r«   rX   ÚsetAttributeNoder¼   rA   )r   rè   r«   r  r
   r
   r   ÚsetAttributeÛ  s    

zElement.setAttributec                 C   s€   t |ƒ\}}|  ||¡}|d krHt||||ƒ}||_| j|_|  |¡ n4||jkrf||_|jrft| ƒ |j|kr|||_||_	d S r%   )
Ú_nssplitÚgetAttributeNodeNSrœ   r«   rX   r  r¼   rA   r   r”   )r   r~   ÚqualifiedNamer«   r   Ú	localnamer  r
   r
   r   ÚsetAttributeNSç  s    

zElement.setAttributeNSc                 C   s   | j d krd S | j  |¡S r%   rÙ   )r   Úattrnamer
   r
   r   r
  ø  s    
zElement.getAttributeNodec                 C   s   | j d krd S | j  ||f¡S r%   )r´   rÚ   rì   r
   r
   r   r  ý  s    
zElement.getAttributeNodeNSc                 C   sš   |j d | fkrtj d¡‚|  ¡  | j |jd ¡}|d k	rD|  |¡ | j	 |j
|jfd ¡}|d k	rt||k	rt|  |¡ t| |ƒ ||k	rŠ|S ||k	r–|S d S )Nzattribute node already owned)r¡   r6   r7   ZInuseAttributeErrr  r³   rÚ   r�   ÚremoveAttributeNoder´   r~   rƒ   Ú_set_attribute_node)r   r  Zold1Zold2r
   r
   r   r    s    


zElement.setAttributeNodec                 C   sP   | j d krtj ¡ ‚z| j| }W n tk
r@   tj ¡ ‚Y nX |  |¡ d S r%   )r´   r6   r7   r?   r³   ri   r  )r   r�   r  r
   r
   r   ÚremoveAttribute  s    

zElement.removeAttributec                 C   sT   | j d krtj ¡ ‚z| j ||f }W n tk
rD   tj ¡ ‚Y nX |  |¡ d S r%   )r´   r6   r7   r?   ri   r  )r   r~   rƒ   r  r
   r
   r   ÚremoveAttributeNS   s    

zElement.removeAttributeNSc                 C   s^   |d krt j ¡ ‚z| j|j  W n tk
r@   t j ¡ ‚Y nX t| ƒ | ¡  | j|_|S r%   )	r6   r7   r?   r³   r�   ri   rA   rQ   rX   rô   r
   r
   r   r  )  s    
zElement.removeAttributeNodec                 C   s   | j d krdS || j kS ©NF©r³   rê   r
   r
   r   ÚhasAttribute9  s    
zElement.hasAttributec                 C   s   | j d krdS ||f| j kS r  )r´   rì   r
   r
   r   ÚhasAttributeNS>  s    
zElement.hasAttributeNSc                 C   s   t | |tƒ ƒS r%   ©r�   rw   rê   r
   r
   r   ÚgetElementsByTagNameC  s    zElement.getElementsByTagNamec                 C   s   t | ||tƒ ƒS r%   ©r‘   rw   rì   r
   r
   r   ÚgetElementsByTagNameNSF  s       ÿzElement.getElementsByTagNameNSc                 C   s   d| j t| ƒf S )Nz<DOM Element: %s at %#x>)rŒ   rÜ   r   r
   r
   r   r  J  s    zElement.__repr__r   c                 C   sü   |  |d | j ¡ |  ¡ }| ¡ D ],}|  d| ¡ t||| jƒ |  d¡ q$| jrê|  d¡ t| jƒdkr | jd jt	j
t	jfkr | jd  |ddd¡ n4|  |¡ | jD ]}| ||| ||¡ q°|  |¡ |  d| j|f ¡ n|  d	| ¡ d S )
Nr…   z %s="r†   r‡   r1   r   r   z</%s>%sz/>%s)r‰   rŒ   Ú_get_attributesrÎ   rŠ   r«   r'   rÌ   r   r	   rO   r—   r   )r   r$   r"   Ú	addindentr#   rË   Za_namerH   r
   r
   r   r   M  s*    

 ÿÿ


zElement.writexmlc                 C   s   |   ¡  t| j| j| ƒS r%   )r  rÈ   r³   r´   r   r
   r
   r   r  h  s    zElement._get_attributesc                 C   s   | j r
dS dS d S r¹   r  r   r
   r
   r   ÚhasAttributesl  s    zElement.hasAttributesc                 C   s   |   |¡}|  |¡ d S r%   )r
  ÚsetIdAttributeNode)r   r�   ÚidAttrr
   r
   r   ÚsetIdAttributet  s    
zElement.setIdAttributec                 C   s   |   ||¡}|  |¡ d S r%   )r  r"  )r   r~   rƒ   r#  r
   r
   r   ÚsetIdAttributeNSx  s    zElement.setIdAttributeNSc                 C   sj   |d ks|   |j¡stj ¡ ‚t| ƒd k	r4tj ¡ ‚|jsfd|_|  jd7  _| j	 j
d7  _
t| ƒ d S )NTr1   )rd   r¡   r6   r7   r?   Ú_get_containing_entrefÚNoModificationAllowedErrrµ   r¶   rX   r·   rA   )r   r#  r
   r
   r   r"  |  s    

zElement.setIdAttributeNode)r   r   r   ).r{   r|   r}   rÄ   r	   rS   r   r•   rÀ   rÇ   r¶   r™   rš   rO   r—   r˜   r5   r   r“   r  ra   r  rQ   r  r	  r  r  r
  r  r  ZsetAttributeNodeNSr  r  r  ZremoveAttributeNodeNSr  r  r  r  r  r   r  r!  r$  r%  r"  r
   r
   r
   r   r  �  sT   ûÿ
		
r  r–   z*NamedNodeMap of attributes on the element.z%Namespace-local name of this element.c                 C   s8   t | ƒ |  ¡  || j|j< || j|j|jf< | |_d S r%   )rA   r  r³   r�   r´   r~   rƒ   r¡   )Úelementr  r
   r
   r   r  �  s
    r  c                   @   sf   e Zd ZdZdZdZeƒ ZdZdZ	dd„ Z
dd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )Ú	Childlessz�Mixin that makes childless-ness easy to implement and avoids
    the complexity of the Node methods that deal with children.
    r
   Nc                 C   s   d S r%   r
   r   r
   r
   r   r,   £  s    zChildless._get_firstChildc                 C   s   d S r%   r
   r   r
   r
   r   r/   ¦  s    zChildless._get_lastChildc                 C   s   t j | jd ¡‚d S )Nz nodes cannot have children©r6   r7   r8   r”   rô   r
   r
   r   r<   ©  s    ÿzChildless.appendChildc                 C   s   dS r  r
   r   r
   r
   r   r(   ­  s    zChildless.hasChildNodesc                 C   s   t j | jd ¡‚d S ©Nz nodes do not have childrenr*  ©r   rE   rF   r
   r
   r   r4   °  s    ÿzChildless.insertBeforec                 C   s   t j | jd ¡‚d S r+  )r6   r7   r?   r”   rN   r
   r
   r   r;   ´  s    ÿzChildless.removeChildc                 C   s   d S r%   r
   r   r
   r
   r   rT   ¸  s    zChildless.normalizec                 C   s   t j | jd ¡‚d S r+  r*  ©r   rE   rK   r
   r
   r   rL   ¼  s    ÿzChildless.replaceChild)r{   r|   r}   rû   rÄ   r–   ZEmptyNodeListr'   r€   r‚   r,   r/   r<   r(   r4   r;   rT   rL   r
   r
   r
   r   r)  ˜  s   r)  c                   @   s\   e Zd ZejZdZdd„ Zdd„ Zdd„ Z	e
ee	ƒZdd	„ Zd
d„ Ze
eeƒZddd„ZdS )ÚProcessingInstruction©ÚtargetrP   c                 C   s   || _ || _d S r%   r/  )r   r0  rP   r
   r
   r   r“   Å  s    zProcessingInstruction.__init__c                 C   s   | j S r%   ©rP   r   r
   r
   r   Ú_get_nodeValueÊ  s    z$ProcessingInstruction._get_nodeValuec                 C   s
   || _ d S r%   r1  rª   r
   r
   r   Ú_set_nodeValueÌ  s    z$ProcessingInstruction._set_nodeValuec                 C   s   | j S r%   ©r0  r   r
   r
   r   Ú_get_nodeNameÑ  s    z#ProcessingInstruction._get_nodeNamec                 C   s
   || _ d S r%   r4  rª   r
   r
   r   Ú_set_nodeNameÓ  s    z#ProcessingInstruction._set_nodeNamer   c                 C   s   |  d|| j| j|f ¡ d S )Nz%s<?%s %s?>%s)r‰   r0  rP   ©r   r$   r"   r   r#   r
   r
   r   r   ×  s    zProcessingInstruction.writexmlN)r   r   r   )r{   r|   r}   r	   r™   r   rÄ   r“   r2  r3  rÆ   r•   r5  r6  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)Ú_datarX   r:   rD   rC   c                 C   s,   d  | _ | _d  | _| _d| _t | ¡ d S r   )rX   r:   rD   rC   r9  r	   r“   r   r
   r
   r   r“   Þ  s    zCharacterData.__init__c                 C   s
   t | jƒS r%   )rÌ   rP   r   r
   r
   r   rÍ   ä  s    zCharacterData._get_lengthc                 C   s   | j S r%   ©r9  r   r
   r
   r   Ú	_get_dataè  s    zCharacterData._get_datac                 C   s
   || _ d S r%   r:  ©r   rP   r
   r
   r   Ú	_set_dataê  s    zCharacterData._set_datac                 C   s6   | j }t|ƒdkrd}nd}d| jj|dd… |f S )Né
   z...r   z<DOM %s node "%r%s">r   )rP   rÌ   r   r{   )r   rP   Z	dotdotdotr
   r
   r   r  ï  s     
 ÿzCharacterData.__repr__c                 C   sT   |dk rt j d¡‚|t| jƒkr.t j d¡‚|dk rBt j d¡‚| j||| … S ©Nr   úoffset cannot be negativeú#offset cannot be beyond end of dataúcount cannot be negative©r6   r7   ÚIndexSizeErrrÌ   rP   ©r   ÚoffsetÚcountr
   r
   r   ÚsubstringDataø  s    zCharacterData.substringDatac                 C   s   | j | | _ d S r%   r1  )r   Úargr
   r
   r   Ú
appendData  s    zCharacterData.appendDatac                 C   sZ   |dk rt j d¡‚|t| jƒkr.t j d¡‚|rVd| jd |… || j|d … f | _d S )Nr   r@  rA  ú%s%s%srC  )r   rF  rI  r
   r
   r   Ú
insertData  s      ÿzCharacterData.insertDatac                 C   sl   |dk rt j d¡‚|t| jƒkr.t j d¡‚|dk rBt j d¡‚|rh| jd |… | j|| d …  | _d S r?  rC  rE  r
   r
   r   Ú
deleteData  s    zCharacterData.deleteDatac                 C   sr   |dk rt j d¡‚|t| jƒkr.t j d¡‚|dk rBt j d¡‚|rnd| jd |… || j|| d … f | _d S )Nr   r@  rA  rB  rK  rC  )r   rF  rG  rI  r
   r
   r   ÚreplaceData  s      ÿzCharacterData.replaceDataN)r{   r|   r}   rÄ   r“   rÍ   rü   r;  r=  rÆ   rP   r•   r  rH  rJ  rL  rM  rN  r
   r
   r
   r   r8  Û  s   			
r8  zLength of the string data.c                   @   sH   e Zd ZdZejZdZdZdd„ Z	ddd„Z
d	d
„ Zdd„ Zdd„ ZdS )r¢   r
   z#textNc                 C   s’   |dk s|t | jƒkr"tj d¡‚|  ¡ }| j|d … |_| j|_| j}| jr~| | jj	kr~|d krp| j 
|¡ n| j ||¡ | jd |… | _|S )Nr   zillegal offset value)rÌ   rP   r6   r7   rD  r   rX   rC   r:   r'   r<   r4   )r   rF  ZnewTextÚnextr
   r
   r   Ú	splitText,  s    zText.splitTextr   c                 C   s   t |d|| j|f ƒ d S )NrK  )rŠ   rP   r7  r
   r
   r   r   ;  s    zText.writexmlc                 C   s„   | j g}| j}|d k	rB|jtjtjfkrB| d|j ¡ |j}qqBq| j}|d k	rz|jtjtjfkrz| |j ¡ |j}qHqzqHd 	|¡S )Nr   r   )
rP   rD   r   r	   rO   r—   rB   rC   rR   Újoin)r   rU   rð   r
   r
   r   Ú_get_wholeText@  s    zText._get_wholeTextc                 C   sž   | j }| j}|d k	r@|jtjtjfkr@|j}| |¡ |}qq@q| j}|sT| | ¡ |d k	rˆ|jtjtjfkrˆ|j}| |¡ |}qTqˆqT|r–|| _| S d S d S r%   )	r:   rD   r   r	   rO   r—   r;   rC   rP   )r   ZcontentrŽ   rð   rO  r
   r
   r   ÚreplaceWholeTextR  s*    


zText.replaceWholeTextc                 C   sF   | j  ¡ rdS t| ƒ}|d kr"dS | j |¡}|d kr:dS | ¡ S d S r  )rP   ÚstripÚ_get_containing_elementrX   rº   ÚisElementContent)r   r¸   r¾   r
   r
   r   Ú!_get_isWhitespaceInElementContentn  s    
z&Text._get_isWhitespaceInElementContent)r   r   r   )r{   r|   r}   rÄ   r	   rO   r   r”   r–   rP  r   rR  rS  rW  r
   r
   r
   r   r¢   %  s   
r¢   ZisWhitespaceInElementContentzKTrue iff this text node contains only whitespace and is in element content.Z	wholeTextz.The text of all logically-adjacent text nodes.c                 C   s*   | j }|d k	r&|jtjkr|S |j }qd S r%   )r:   r   r	   rS   ©rH   rG   r
   r
   r   rU  �  s    rU  c                 C   s*   | j }|d k	r&|jtjkr|S |j }qd S r%   )r:   r   r	   r˜   rX  r
   r
   r   r&  ‰  s    r&  c                   @   s(   e Zd ZejZdZdd„ Zddd„ZdS )	ÚCommentz#commentc                 C   s   t  | ¡ || _d S r%   )r8  r“   r9  r<  r
   r
   r   r“   –  s    
zComment.__init__r   c                 C   s,   d| j krtdƒ‚| d|| j |f ¡ d S )Nz--z%'--' is not allowed in a comment nodez%s<!--%s-->%s)rP   r>   r‰   r7  r
   r
   r   r   š  s    
zComment.writexmlN)r   r   r   )	r{   r|   r}   r	   rš   r   r”   r“   r   r
   r
   r
   r   rY  ’  s   rY  c                   @   s$   e Zd ZdZejZdZddd„ZdS )ÚCDATASectionr
   z#cdata-sectionr   c                 C   s,   | j  d¡dkrtdƒ‚| d| j  ¡ d S )Nz]]>r   z$']]>' not allowed in a CDATA sectionz<![CDATA[%s]]>)rP   Úfindr>   r‰   r7  r
   r
   r   r   ¦  s    zCDATASection.writexmlN)r   r   r   )	r{   r|   r}   rÄ   r	   r—   r   r”   r   r
   r
   r
   r   rZ     s   rZ  c                   @   sz   e Zd ZdZddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚReadOnlySequentialNamedNodeMap©Ú_seqr
   c                 C   s
   || _ d S r%   r]  )r   Úseqr
   r
   r   r“   ¯  s    z'ReadOnlySequentialNamedNodeMap.__init__c                 C   s
   t | jƒS r%   ©rÌ   r^  r   r
   r
   r   rü   ³  s    z&ReadOnlySequentialNamedNodeMap.__len__c                 C   s
   t | jƒS r%   r`  r   r
   r
   r   rÍ   ¶  s    z*ReadOnlySequentialNamedNodeMap._get_lengthc                 C   s"   | j D ]}|j|kr|  S qd S r%   )r^  r”   rï   r
   r
   r   rë   ¹  s    

z+ReadOnlySequentialNamedNodeMap.getNamedItemc                 C   s,   | j D ] }|j|kr|j|kr|  S qd S r%   )r^  r~   rƒ   rò   r
   r
   r   rí   ¾  s    
z-ReadOnlySequentialNamedNodeMap.getNamedItemNSc                 C   s4   t |tƒr| j|Ž }n
|  |¡}|d kr0t|ƒ‚|S r%   )rÕ   r3   rí   rë   ri   )r   Zname_or_tuplerH   r
   r
   r   rå   Ã  s    

z*ReadOnlySequentialNamedNodeMap.__getitem__c                 C   s4   |dk rd S z| j | W S  tk
r.   Y d S X d S r+   )r^  rÏ   rÐ   r
   r
   r   rÑ   Ì  s    z#ReadOnlySequentialNamedNodeMap.itemc                 C   s   t j d¡‚d S ©Nz"NamedNodeMap instance is read-only©r6   r7   r'  rê   r
   r
   r   rñ   Ô  s    ÿz.ReadOnlySequentialNamedNodeMap.removeNamedItemc                 C   s   t j d¡‚d S ra  rb  rì   r
   r
   r   ró   Ø  s    ÿz0ReadOnlySequentialNamedNodeMap.removeNamedItemNSc                 C   s   t j d¡‚d S ra  rb  rô   r
   r
   r   ræ   Ü  s    ÿz+ReadOnlySequentialNamedNodeMap.setNamedItemc                 C   s   t j d¡‚d S ra  rb  rô   r
   r
   r   rõ   à  s    ÿz-ReadOnlySequentialNamedNodeMap.setNamedItemNSc                 C   s   | j gS r%   r]  r   r
   r
   r   r÷   ä  s    z+ReadOnlySequentialNamedNodeMap.__getstate__c                 C   s   |d | _ d S r+   r]  rø   r
   r
   r   rú   ç  s    z+ReadOnlySequentialNamedNodeMap.__setstate__N)r
   )r{   r|   r}   rÄ   r“   rü   rÍ   rë   rí   rå   rÑ   rñ   ró   ræ   rõ   r÷   rú   r
   r
   r
   r   r\  ¬  s   
	r\  z&Number of entries in the NamedNodeMap.c                   @   s,   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	S )
Ú
Identifiedz@Mix-in class that supports the publicId and systemId attributes.©ÚpublicIdÚsystemIdc                 C   s   || _ || _d S r%   rd  )r   re  rf  r
   r
   r   Ú_identified_mixin_initó  s    z!Identified._identified_mixin_initc                 C   s   | j S r%   )re  r   r
   r
   r   Ú_get_publicId÷  s    zIdentified._get_publicIdc                 C   s   | j S r%   )rf  r   r
   r
   r   Ú_get_systemIdú  s    zIdentified._get_systemIdN)r{   r|   r}   rû   rÄ   rg  rh  ri  r
   r
   r
   r   rc  î  s
   rc  c                   @   sH   e Zd ZejZdZdZdZdZ	dZ
dd„ Zdd„ Zdd„ Zdd	d
„ZdS )ÚDocumentTypeNc                 C   s2   t ƒ | _t ƒ | _|r&t|ƒ\}}|| _| j| _d S r%   )r\  ÚentitiesÚ	notationsr  r�   r”   )r   r  r   r  r
   r
   r   r“     s    zDocumentType.__init__c                 C   s   | j S r%   )ÚinternalSubsetr   r
   r
   r   Ú_get_internalSubset  s    z DocumentType._get_internalSubsetc                 C   sî   | j d krætd ƒ}| j|_| j|_tjjj}|rÔg |j_	g |j
_	| j
j	D ]2}t|j|j|jƒ}|j
j	 |¡ | |||¡ qH| jj	D ]N}t|j|j|j|jƒ}|j|_|j|_|j|_|jj	 |¡ | |||¡ q„|  || |¡ |S d S d S r%   )rX   rj  r�   r”   r6   r7   ÚUserDataHandlerÚNODE_CLONEDrk  r^  rl  ÚNotationre  rf  rR   rv   ÚEntityÚnotationNameÚactualEncodingr   r_   )r   rY   Úclonert   rð   ÚnotationÚeÚentityr
   r
   r   rZ     s0    

ÿzDocumentType.cloneNoder   c                 C   sŽ   |  d¡ |  | j¡ | jr8|  d|| j|| jf ¡ n| jrR|  d|| jf ¡ | jd k	r||  d¡ |  | j¡ |  d¡ |  d| ¡ d S )Nz
<!DOCTYPE z%s  PUBLIC '%s'%s  '%s'z%s  SYSTEM '%s'z [ú]r‡   )r‰   r�   re  rf  rm  r7  r
   r
   r   r   +  s    
ÿ


zDocumentType.writexml)r   r   r   )r{   r|   r}   r	   ÚDOCUMENT_TYPE_NODEr   r•   r�   re  rf  rm  r“   rn  rZ   r   r
   r
   r
   r   rj  ý  s   rj  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 )rr  Nc                 C   s$   || _ || _tƒ | _|  ||¡ d S r%   )r”   rs  rw   r'   rg  )r   r�   re  rf  rv  r
   r
   r   r“   B  s    zEntity.__init__c                 C   s   | j S r%   ©rt  r   r
   r
   r   Ú_get_actualEncodingH  s    zEntity._get_actualEncodingc                 C   s   | j S r%   ©r   r   r
   r
   r   Ú_get_encodingK  s    zEntity._get_encodingc                 C   s   | j S r%   ©r_   r   r
   r
   r   Ú_get_versionN  s    zEntity._get_versionc                 C   s   t j d¡‚d S )Nz(cannot append children to an entity node©r6   r7   r8   )r   rE   r
   r
   r   r<   Q  s    ÿzEntity.appendChildc                 C   s   t j d¡‚d S )Nz+cannot insert children below an entity noder�  r,  r
   r
   r   r4   U  s    ÿzEntity.insertBeforec                 C   s   t j d¡‚d S )Nz*cannot remove children from an entity noder�  rN   r
   r
   r   r;   Y  s    ÿzEntity.removeChildc                 C   s   t j d¡‚d S )Nz)cannot replace children of an entity noder�  r-  r
   r
   r   rL   ]  s    ÿzEntity.replaceChild)r{   r|   r}   r–   r	   ZENTITY_NODEr   r•   rt  r   r_   r“   r|  r~  r€  r<   r4   r;   rL   r
   r
   r
   r   rr  9  s   rr  c                   @   s   e Zd ZejZdZdd„ ZdS )rq  Nc                 C   s   || _ |  ||¡ d S r%   )r”   rg  )r   r�   re  rf  r
   r
   r   r“   e  s    zNotation.__init__)r{   r|   r}   r	   r›   r   r•   r“   r
   r
   r
   r   rq  a  s   rq  c                   @   sH   e Zd ZddddddddgZd	d
„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚDOMImplementation)Úcoreú1.0)rƒ  ú2.0)rƒ  N)r6   r„  )r6   r…  )r6   N)úls-loadz3.0)r†  Nc                 C   s   |dkrd }|  ¡ |f| jkS r   )ÚlowerÚ	_featuresr]   r
   r
   r   r\   u  s    zDOMImplementation.hasFeaturec           	      C   sÔ   |r|j d k	rtj d¡‚|  ¡ }|d ko8|d ko8|d k }|sP|rPtj d¡‚|r´t|ƒ\}}|dkr||dkr|tj d¡‚|r�|s�tj d¡‚| ||¡}|rª| 	|¡ | 	|¡ |rÄ| |_ |_
||_| |_|S )Nz(doctype object owned by another DOM treezElement with no namer6   z$http://www.w3.org/XML/1998/namespacezillegal use of 'xml' prefixz(illegal use of prefix without namespaces)r:   r6   r7   ÚWrongDocumentErrÚ_create_documentZInvalidCharacterErrr  r±   ÚcreateElementNSr<   rX   Údoctyper[   )	r   r~   r  rŒ  r�   Zadd_root_elementr   r  r(  r
   r
   r   ÚcreateDocumentz  s>    ÿÿþÿÿ

z DOMImplementation.createDocumentc                 C   s   t |ƒ}||_||_|S r%   )rj  re  rf  )r   r  re  rf  rŒ  r
   r
   r   ÚcreateDocumentType§  s    z$DOMImplementation.createDocumentTypec                 C   s   |   |d ¡r| S d S d S r%   )r\   re   r
   r
   r   rf   ¯  s    zDOMImplementation.getInterfacec                 C   s   t ƒ S r%   )ÚDocumentr   r
   r
   r   rŠ  ¶  s    z"DOMImplementation._create_documentN)	r{   r|   r}   rˆ  r\   r�  rŽ  rf   rŠ  r
   r
   r
   r   r‚  j  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   s
   || _ d S r%   r  rê   r
   r
   r   r“   Ä  s    zElementInfo.__init__c                 C   s   t S r%   ©rÀ   ©r   Zanamer
   r
   r   rÂ   Ç  s    zElementInfo.getAttributeTypec                 C   s   t S r%   r‘  rì   r
   r
   r   rÁ   Ê  s    zElementInfo.getAttributeTypeNSc                 C   s   dS r  r
   r   r
   r
   r   rV  Í  s    zElementInfo.isElementContentc                 C   s   dS )zQReturns true iff this element is declared to have an EMPTY
        content model.Fr
   r   r
   r
   r   ÚisEmptyÐ  s    zElementInfo.isEmptyc                 C   s   dS )z7Returns true iff the named attribute is a DTD-style ID.Fr
   r’  r
   r
   r   r¼   Õ  s    zElementInfo.isIdc                 C   s   dS )z<Returns true iff the identified attribute is a DTD-style ID.Fr
   rì   r
   r
   r   r»   Ù  s    zElementInfo.isIdNSc                 C   s   | j S r%   r  r   r
   r
   r   r÷   Ý  s    zElementInfo.__getstate__c                 C   s
   || _ d S r%   r  rø   r
   r
   r   rú   à  s    zElementInfo.__setstate__N)r{   r|   r}   rû   rÄ   r“   rÂ   rÁ   rV  r“  r¼   r»   r÷   rú   r
   r
   r
   r   r�  ¹  s   r�  c                 C   s<   | j tjkr| j ¡  d | _n| jr8| jj ¡  d | j_d S r%   )r   r	   r   Ú	_id_cacheÚclearÚ_id_search_stackrX   )rH   r
   r
   r   rA   ã  s    
rA   c                   @   sr  e Zd ZdZejejejejfZ	e
ƒ ZejZdZdZdZdZd ZZdZdZdZdZdZdZdZdZdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z dd„ Z!dd„ Z"dd„ Z#dd„ Z$dd„ Z%dd„ Z&dd„ Z'dd„ Z(d d!„ Z)d"d#„ Z*d$d%„ Z+d&d'„ Z,d(d)„ Z-d*d+„ Z.d,d-„ Z/d.d/„ Z0d0d1„ Z1d2d3„ Z2d4d5„ Z3d6d7„ Z4d8d9„ Z5d:d;„ Z6d<d=„ Z7d>d?„ Z8d@dA„ Z9dBdC„ Z:dIdEdF„Z;dGdH„ Z<dS )Jr�  )Ú
_elem_inforŒ  r–  r'   r”  z	#documentNFr   c                 C   s$   d | _ tƒ | _i | _i | _d | _d S r%   )rŒ  rw   r'   r—  r”  r–  r   r
   r
   r   r“     s
    zDocument.__init__c                 C   s&   |j r|j |jf}n|j}| j |¡S r%   )r~   rƒ   rŒ   r—  rÚ   )r   r(  rk   r
   r
   r   rº     s    zDocument._get_elem_infoc                 C   s   | j S r%   r{  r   r
   r
   r   r|    s    zDocument._get_actualEncodingc                 C   s   | j S r%   )rŒ  r   r
   r
   r   Ú_get_doctype  s    zDocument._get_doctypec                 C   s   | j S r%   )ÚdocumentURIr   r
   r
   r   Ú_get_documentURI  s    zDocument._get_documentURIc                 C   s   | j S r%   r}  r   r
   r
   r   r~    s    zDocument._get_encodingc                 C   s   | j S r%   )ÚerrorHandlerr   r
   r
   r   Ú_get_errorHandler"  s    zDocument._get_errorHandlerc                 C   s   | j S r%   )Ú
standaloner   r
   r
   r   Ú_get_standalone%  s    zDocument._get_standalonec                 C   s   | j S r%   )ÚstrictErrorCheckingr   r
   r
   r   Ú_get_strictErrorChecking(  s    z!Document._get_strictErrorCheckingc                 C   s   | j S r%   r  r   r
   r
   r   r€  +  s    zDocument._get_versionc                 C   sj   |j | jkr(tj dt|ƒt| ƒf ¡‚|jd k	r>|j |¡ |j tj	kr^|  
¡ r^tj d¡‚t | |¡S )Nr0   z two document elements disallowed)r   r5   r6   r7   r8   r9   r:   r;   r	   rS   Ú_get_documentElementr<   rô   r
   r
   r   r<   .  s    ÿ
ÿÿzDocument.appendChildc                 C   sV   z| j  |¡ W n tk
r.   tj ¡ ‚Y nX d  |_|_d |_| j	|krRd | _	|S r%   )
r'   rM   r>   r6   r7   r?   rC   rD   r:   ÚdocumentElementrN   r
   r
   r   r;   >  s    
zDocument.removeChildc                 C   s$   | j D ]}|jtjkr|  S qd S r%   )r'   r   r	   rS   rô   r
   r
   r   r¡  J  s    
zDocument._get_documentElementc                 C   s(   | j d k	r| j  ¡  d | _ t | ¡ d S r%   )rŒ  rQ   r	   r   r
   r
   r   rQ   O  s    

zDocument.unlinkc                 C   s¾   |sd S | j  d d d ¡}| j|_| j|_| j|_| jD ]n}t|||ƒ}|j |¡sVt	‚|j 
|¡ |jtjkr~|jd ksžt	‚n |jtjkrž|jd ks˜t	‚||_||_q6|  tjjj| |¡ |S r%   )r[   r�  r   r�  r_   r'   rW   rX   rd   ÚAssertionErrorrR   r   r	   r   r¢  rz  rŒ  r:   rv   r6   r7   ro  rp  )r   rY   ru  rð   Z
childcloner
   r
   r   rZ   U  s*    
 ÿzDocument.cloneNodec                 C   s   t ƒ }| |_|S r%   )r’   rX   )r   ro   r
   r
   r   ÚcreateDocumentFragmentj  s    zDocument.createDocumentFragmentc                 C   s   t |ƒ}| |_|S r%   )r  rX   )r   rŒ   rw  r
   r
   r   ÚcreateElemento  s    zDocument.createElementc                 C   s(   t |tƒstdƒ‚tƒ }||_| |_|S ©Nznode contents must be a string)rÕ   rÖ   rç   r¢   rP   rX   )r   rP   Útr
   r
   r   ÚcreateTextNodet  s    
zDocument.createTextNodec                 C   s(   t |tƒstdƒ‚tƒ }||_| |_|S r¦  )rÕ   rÖ   rç   rZ  rP   rX   ©r   rP   rG   r
   r
   r   ÚcreateCDATASection|  s    
zDocument.createCDATASectionc                 C   s   t |ƒ}| |_|S r%   )rY  rX   r©  r
   r
   r   ÚcreateComment„  s    zDocument.createCommentc                 C   s   t ||ƒ}| |_|S r%   )r.  rX   )r   r0  rP   Úpr
   r
   r   ÚcreateProcessingInstruction‰  s    
z$Document.createProcessingInstructionc                 C   s   t |ƒ}| |_d|_|S r   )rœ   rX   r«   )r   r£   Úar
   r
   r   ÚcreateAttributeŽ  s    zDocument.createAttributec                 C   s"   t |ƒ\}}t|||ƒ}| |_|S r%   )r  r  rX   )r   r~   r  r   rƒ   rw  r
   r
   r   r‹  ”  s    zDocument.createElementNSc                 C   s*   t |ƒ\}}t||||ƒ}| |_d|_|S r   )r  rœ   rX   r«   )r   r~   r  r   rƒ   r®  r
   r
   r   ÚcreateAttributeNSš  s
    zDocument.createAttributeNSc                 C   s   t ||||ƒ}| |_|S r%   )rr  rX   )r   r�   re  rf  rs  rw  r
   r
   r   Ú_create_entity¤  s    zDocument._create_entityc                 C   s   t |||ƒ}| |_|S r%   )rq  rX   )r   r�   re  rf  rð   r
   r
   r   Ú_create_notation©  s    zDocument._create_notationc                 C   s’  || j kr| j | S | js$| js$d S | j}|d krB| jg}|| _n|sJd S d }|�rŽ| ¡ }| dd„ |jD ƒ¡ |  |¡}|�rB|j	 
¡ D ]²}|jrÐ| |j|j¡rÎ|| j |j< |j|krÂ|}n|jsÎ �q€qŒ| |j¡�r
|| j |j< |j|krú|}n|j�s> �q€qŒ|jrŒ|| j |j< |j|k�r.|}qŒ|jdkrŒ �q€qŒn>|j�r€|j	 
¡ D ]*}|j�rT|| j |j< |j|k�rT|}�qT|d k	rN�qŽqN|S )Nc                 S   s   g | ]}|j tkr|‘qS r
   )r   r@   )Ú.0rV   r
   r
   r   Ú
<listcomp>Â  s    
ÿz+Document.getElementById.<locals>.<listcomp>r1   )r”  r—  r·   r–  r¢  ÚpopÚextendr'   rº   r–   rÒ   r~   r»   rƒ   r«   r¶   r¼   r�   rµ   )r   rÜ   ÚstackÚresultrH   r¾   r  r
   r
   r   ÚgetElementById®  sZ    






zDocument.getElementByIdc                 C   s   t | |tƒ ƒS r%   r  rê   r
   r
   r   r  è  s    zDocument.getElementsByTagNamec                 C   s   t | ||tƒ ƒS r%   r  rì   r
   r
   r   r  ë  s       ÿzDocument.getElementsByTagNameNSc                 C   s   | j  ||¡S r%   )r[   r\   r]   r
   r
   r   r`   ï  s    zDocument.isSupportedc                 C   s>   |j tjkrtj d¡‚n|j tjkr2tj d¡‚t||| ƒS )Nzcannot import document nodesz!cannot import document type nodes)r   r	   r   r6   r7   ÚNotSupportedErrrz  rW   )r   rH   rY   r
   r
   r   Ú
importNodeò  s
    zDocument.importNoder   c                 C   sJ   |d kr|  d| ¡ n|  d||f ¡ | jD ]}| ||||¡ q0d S )Nz<?xml version="1.0" ?>z%<?xml version="1.0" encoding="%s"?>%s)r‰   r'   r   )r   r$   r"   r   r#   r   rH   r
   r
   r   r   ù  s     ÿ
zDocument.writexmlc                 C   sJ  |j | k	r tj d| |j f ¡‚|jtjtjfkr>tj d¡‚|t	kr¶d|kr€| 
dd¡\}}|dkr´|tjjkr´tj d¡‚q¾|dkr¬|tjjkr¬|jtjkr¬tj d¡‚d }|}nd }d }|jtjkrê|j}|d k	rî|j}| |¡ nd }||_||_||_||_|jtjk�r||_n*||_|d k	�rF| |¡ |�rF| |¡ |S )Nz?cannot rename nodes from other documents;
expected %s,
found %sz8renameNode() only applies to element and attribute nodesr¥   r1   r°   zillegal use of 'xmlns' prefixz$illegal use of the 'xmlns' attribute)rX   r6   r7   r‰  r   r	   rS   rÅ   rº  r   r¦   r   r±   r¡   rµ   r  r   r    r~   r”   rŒ   r�   r  r"  )r   rð   r~   r�   r   rƒ   r(  Zis_idr
   r
   r   Ú
renameNode  sb    
ÿÿÿ
ÿÿ
ÿ
þÿ


zDocument.renameNode)r   r   r   N)=r{   r|   r}   rÄ   r	   rS   r™   rš   rz  r5   r‚  r[   r   r   r”   r•   r–   r:   rD   rC   rt  r   r�  r_   rŸ  r›  r™  r·   r“   rº   r|  r˜  rš  r~  rœ  rž  r   r€  r<   r;   r¡  rQ   rZ   r¤  r¥  r¨  rª  r«  r­  r¯  r‹  r°  r±  r²  r¹  r  r  r`   r»  r   r¼  r
   r
   r
   r   r�  ë  sj    ÿ	
:
r�  r¢  z#Top-level element of this document.c                 C   sÖ  | j  |¡rtjjj}n
tjjj}| jtj	kr¤| 
| j| j¡}| j ¡ D ]0}| |j|j|j¡ | |j|j¡}|j|_qH|r | jD ]}t|||ƒ}| |¡ q„�n| jtjkrâ| ¡ }|rÞ| jD ]}t|||ƒ}| |¡ qÂ�nÖ| jtjkrþ| | j¡}�nº| jtjk�r| | j¡}�nœ| jtjk�r>| | j | j¡}�nz| jtj!k�r\| "| j¡}�n\| jtj#k�rŒ| $| j| j¡}d|_| j|_�n,| jtj%k�r¤| j |k	�sªt&‚tjjj}|j' (| j)| j*| j+¡}||_ |�r¸g |j,_-g |j._-| j.j-D ]F}	t/|	j|	j*|	j+ƒ}
||
_ |j.j- 0|
¡ t1|	dƒ�rî|	 2||	|
¡ �qî| j,j-D ]b}t3|j|j*|j+|j4ƒ}|j5|_5|j6|_6|j7|_7||_ |j,j- 0|¡ t1|dƒ�r>| 2|||¡ �q>ntj 8dt9| ƒ ¡‚t1| dƒ�rÒ|  2|| |¡ |S )zo
    Clone a node and give it the new owner document.
    Called by Node.cloneNode and Document.importNode
    Trv   zCannot clone node %s):rX   rd   r6   r7   ro  rp  ZNODE_IMPORTEDr   r	   rS   r‹  r~   r”   r–   rÒ   r  r«   r  rƒ   r§   r'   rW   r<   r2   r¤  rO   r¨  rP   r—   rª  r™   r­  r0  rš   r«  rÅ   r°  rz  r£  r[   rŽ  r�   re  rf  rk  r^  rl  rq  rR   rq   rv   rr  rs  rt  r   r_   rº  r9   )rH   rY   ZnewOwnerDocumentrt   ru  r  r®  rV   rG   rð   rv  rw  rx  r
   r
   r   rW   =  sŒ    
ÿ


ÿÿ
  ÿÿrW   c                 C   s,   |   dd¡}t|ƒdkr|S d |d fS d S )Nr¥   r1   é   r   )r¦   rÌ   )r  Zfieldsr
   r
   r   r  �  s    r  c                 C   s,   | ||Ž}|  ¡ \}}| |¡ | ¡  |S r%   )ZgetEventZ
expandNoder•  )ÚfuncÚargsÚkwargsZeventsZtoktypeZrootNoder
   r
   r   Ú_do_pulldom_parse—  s
    

rÁ  c                 C   sH   |dkr"|s"ddl m} | | ¡S ddl m} t|j| f||dœƒS dS )z3Parse a file into a DOM by filename or file object.Nr   ©Úexpatbuilder©Úpulldom)ÚparserÚbufsize)Úxml.domrÃ  ÚparserÅ  rÁ  )ÚfilerÆ  rÇ  rÃ  rÅ  r
   r
   r   rÉ  ž  s    

ÿrÉ  c                 C   sB   |dkrddl m} | | ¡S ddl m} t|j| fd|iƒS dS )z&Parse a file into a DOM from a string.Nr   rÂ  rÄ  rÆ  )rÈ  rÃ  ÚparseStringrÅ  rÁ  )ÚstringrÆ  rÃ  rÅ  r
   r
   r   rË  ¨  s    

ÿrË  c                 C   s@   | r:t | tƒrt | ¡} | D ]\}}tj ||¡s d S qtjS r%   )rÕ   rÖ   r   Z_parse_feature_stringr�  r[   r\   )ZfeaturesÚfÚvr
   r
   r   ÚgetDOMImplementation²  s    

rÏ  )NN)N)N)6rû   r   rÈ  r6   r   r   r   r   Zxml.dom.minicompatZxml.dom.xmlbuilderr   r   r7   r	   rS   r˜   r@   ZdefpropertyrJ   rŠ   r�   r‘   r’   rœ   ÚobjectrÈ   ZAttributeListrý   rÀ   r  r  r)  r.  r8  r¢   rU  r&  rY  rZ  r\  rc  rj  rr  rq  r‚  r�  rA   r�  rW   r  rÁ  rÉ  rË  rÏ  r
   r
   r
   r   Ú<module>   sš   ÿ v	z $ÿ
 yÿÿ)GUÿÿ	>ÿ<(	O*  PÿR



