B
    È S] ã               @   sü  d Z ddlZddlZddlmZmZmZmZ ddlT ddl	m
Z
mZ ejjjejjjfZG dd„ dejjƒZeedd	d
 eeddd
 eeddd
 dd„ Zdd„ Zdd„ Zdd„ Zdd„ ZG dd„ deƒZG dd„ deƒZeeddd
 eeddd
 eed d!d
 G d"d#„ d#eƒZeed$d%d
 eZG d&d'„ d'eƒZeddƒZG d(d)„ d)eƒZeed*d+d
 eedd,d
 d-d.„ ZG d/d0„ d0ƒZ G d1d2„ d2e eƒZ!G d3d4„ d4e eƒZ"ee"d$d5d
 G d6d7„ d7e"ƒZ#ee#d8d9d
 ee#d:d;d
 d<d=„ Z$d>d?„ Z%G d@dA„ dAe"ƒZ&G dBdC„ dCe#ƒZ'G dDdE„ dEeƒZ(ee(d$dFd
 G dGdH„ dHƒZ)G dIdJ„ dJe)e eƒZ*G dKdL„ dLe)eƒZ+G dMdN„ dNe)e eƒZ,G dOdP„ dPe
ƒZ-G dQdR„ dReƒZ.dSdT„ Z/G dUdV„ dVeeƒZ0ee0dWdXd
 dYdZ„ Z1d[d\„ Z2d]d^„ Z3ded_d`„Z4dfdadb„Z5dgdcdd„Z6dS )hac  Simple implementation of the Level 1 DOM.

Namespaces and other minor Level 2 features are also supported.

parse("foo.xml")

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

Todo:
=====
 * convenience methods for getting elements and text.
 * more testing
 * bring some of the writer and linearizer code into conformance with this
        interface
 * SAX 2 namespaces
é    N)ÚEMPTY_NAMESPACEÚEMPTY_PREFIXÚXMLNS_NAMESPACEÚdomreg)Ú*)ÚDOMImplementationLSÚ
DocumentLSc               @   sà   e Zd ZdZdZdZdZdZeZ	dd„ Z
d2dd„Zd3dd	„Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Z dS )4ÚNodeNc             C   s   dS )NT© )Úselfr
   r
   ú lib/python3.7/xml/dom/minidom.pyÚ__bool__+   s    zNode.__bool__c             C   s   |   dd|¡S )NÚ )Útoprettyxml)r   Úencodingr
   r
   r   Útoxml.   s    z
Node.toxmlú	Ú
c             C   sx   |d krt  ¡ }nt jt  ¡ |ddd}| jtjkrH|  |d|||¡ n|  |d||¡ |d krh| ¡ S | 	¡  ¡ S d S )NÚxmlcharrefreplacer   )r   ÚerrorsÚnewliner   )
ÚioÚStringIOÚTextIOWrapperÚBytesIOÚnodeTyper	   ÚDOCUMENT_NODEÚwritexmlÚgetvalueÚdetach)r   ÚindentÚnewlr   Úwriterr
   r
   r   r   1   s    

zNode.toprettyxmlc             C   s
   t | jƒS )N)ÚboolÚ
childNodes)r   r
   r
   r   ÚhasChildNodesC   s    zNode.hasChildNodesc             C   s   | j S )N)r$   )r   r
   r
   r   Ú_get_childNodesF   s    zNode._get_childNodesc             C   s   | j r| j d S d S )Nr   )r$   )r   r
   r
   r   Ú_get_firstChildI   s    zNode._get_firstChildc             C   s   | j r| j d S d S )Néÿÿÿÿ)r$   )r   r
   r
   r   Ú_get_lastChildM   s    zNode._get_lastChildc             C   s  |j | jkr0xt|jƒD ]}|  ||¡ qW |S |j | jkrXtj dt	|ƒt	| ƒf ¡‚|j
d k	rn|j
 |¡ |d kr‚|  |¡ nˆy| j |¡}W n tk
r°   tj ¡ ‚Y nX |j tkrÄt| ƒ | j ||¡ ||_||_|rþ| j|d  }||_||_nd |_| |_
|S )Nz%s cannot be child of %sé   )r   ÚDOCUMENT_FRAGMENT_NODEÚtupler$   ÚinsertBeforeÚ_child_node_typesÚxmlÚdomÚHierarchyRequestErrÚreprÚ
parentNodeÚremoveChildÚappendChildÚindexÚ
ValueErrorÚNotFoundErrÚ_nodeTypes_with_childrenÚ_clear_id_cacheÚinsertÚnextSiblingÚpreviousSibling)r   ÚnewChildÚrefChildÚcr6   Únoder
   r
   r   r-   Q   s6    

zNode.insertBeforec             C   s”   |j | jkr.xt|jƒD ]}|  |¡ qW |S |j | jkrXtj dt	|ƒt	| ƒf ¡‚n|j t
krjt| ƒ |jd k	r€|j |¡ t| |ƒ d |_|S )Nz%s cannot be child of %s)r   r+   r,   r$   r5   r.   r/   r0   r1   r2   r9   r:   r3   r4   Ú_append_childr<   )r   rA   r@   r
   r
   r   r5   q   s    


zNode.appendChildc             C   s  |j | jkr(|j}|  |¡ |  ||¡S |j | jkrPtj dt	|ƒt	| ƒf ¡‚||kr\d S |j
d k	rr|j
 |¡ y| j |¡}W n tk
r    tj ¡ ‚Y nX || j|< | |_
d |_
|j tksÌ|j tkrÔt| ƒ |j|_|j|_d |_d |_|jrþ||j_|jr||j_|S )Nz%s cannot be child of %s)r   r+   r<   r4   r-   r.   r/   r0   r1   r2   r3   r$   r6   r7   r8   r9   r:   r=   )r   r>   ÚoldChildr?   r6   r
   r
   r   ÚreplaceChild‚   s<    




zNode.replaceChildc             C   s€   y| j  |¡ W n tk
r.   tj ¡ ‚Y nX |jd k	rD|j|j_|jd k	rX|j|j_d  |_|_|jt	krvt
| ƒ d |_|S )N)r$   Úremover7   r/   r0   r8   r<   r=   r   r9   r:   r3   )r   rC   r
   r
   r   r4   ¢   s    




zNode.removeChildc             C   sÖ   g }x¾| j D ]´}|jtjkr¢|jsL|r2|j|d _|jrB|j|j_| ¡  qÀ|r–|d j|jkr–|d }|j|j |_|j|_|jrŒ||j_| ¡  qÀ| |¡ q| |¡ |jtj	kr| 
¡  qW || j d d …< d S )Nr(   )r$   r   r	   Ú	TEXT_NODEÚdatar<   r=   ÚunlinkÚappendÚELEMENT_NODEÚ	normalize)r   ÚLÚchildrA   r
   r
   r   rK   ²   s*    



zNode.normalizec             C   s   t | || jp| ƒS )N)Ú_clone_nodeÚownerDocument)r   Údeepr
   r
   r   Ú	cloneNodeÍ   s    zNode.cloneNodec             C   s   | j j ||¡S )N)rO   ÚimplementationÚ
hasFeature)r   ÚfeatureÚversionr
   r
   r   ÚisSupportedÐ   s    zNode.isSupportedc             C   s   d S )Nr
   )r   r
   r
   r   Ú_get_localNameÓ   s    zNode._get_localNamec             C   s   | |kS )Nr
   )r   Úotherr
   r
   r   Ú
isSameNodeÙ   s    zNode.isSameNodec             C   s   |   |d ¡r| S d S d S )N)rV   )r   rT   r
   r
   r   ÚgetInterfaceÜ   s    zNode.getInterfacec          	   C   s,   y| j | d S  ttfk
r&   d S X d S )Nr   )Ú
_user_dataÚAttributeErrorÚKeyError)r   Úkeyr
   r
   r   ÚgetUserDataæ   s    zNode.getUserDatac             C   sn   d }y
| j }W n tk
r,   i }|| _ Y nX ||krB|| d }|d kr^d }|d k	rj||= n||f||< |S )Nr   )r[   r\   )r   r^   rG   ÚhandlerÚoldÚdr
   r
   r   ÚsetUserDataì   s    
zNode.setUserDatac             C   sH   t | dƒrDx8t| j ¡ ƒD ]&\}\}}|d k	r| |||||¡ qW d S )Nr[   )ÚhasattrÚlistr[   ÚitemsZhandle)r   Ú	operationÚsrcÚdstr^   rG   r`   r
   r
   r   Ú_call_user_data_handlerþ   s    
zNode._call_user_data_handlerc             C   sB   d  | _ | _| jr2x| jD ]}| ¡  qW tƒ | _d | _d | _d S )N)r3   rO   r$   rH   ÚNodeListr=   r<   )r   rM   r
   r
   r   rH     s    zNode.unlinkc             C   s   | S )Nr
   )r   r
   r
   r   Ú	__enter__  s    zNode.__enter__c             C   s   |   ¡  d S )N)rH   )r   ZetZevÚtbr
   r
   r   Ú__exit__  s    zNode.__exit__)N)r   r   N)!Ú__name__Ú
__module__Ú__qualname__ÚnamespaceURIr3   rO   r<   r=   r   Úprefixr   r   r   r%   r&   r'   r)   r-   r5   rD   r4   rK   rQ   rV   rW   rY   rZ   r_   rc   rj   rH   rl   rn   r
   r
   r
   r   r	   "   s:   

  
r	   Ú
firstChildzFirst child node, or None.)ÚdocÚ	lastChildzLast child node, or None.Ú	localNamez"Namespace-local name of this node.c             C   s2   | j }|r|d }||_||_| |¡ | |_d S )Nr(   )r$   r=   r<   rI   r3   )r   rA   r$   Zlastr
   r
   r   rB     s    
rB   c             C   s(   x"| d k	r"| j tjkrdS | j} qW dS )NTF)r   r	   r   r3   )rA   r
   r
   r   Ú_in_document&  s
    

rx   c             C   s6   |r2|  dd¡  dd¡  dd¡  dd¡}|  |¡ d	S )
zWrites datachars to writer.ú&z&amp;ú<z&lt;ú"z&quot;ú>z&gt;N)ÚreplaceÚwrite)r"   rG   r
   r
   r   Ú_write_data.  s    r   c             C   sH   xB| j D ]8}|jtjkr4|dks*|j|kr4| |¡ t|||ƒ qW |S )Nr   )r$   r   r	   rJ   ÚtagNamerI   Ú_get_elements_by_tagName_helper)ÚparentÚnameÚrcrA   r
   r
   r   r   5  s    
r   c             C   s\   xV| j D ]L}|jtjkr|dks*|j|krF|dks<|j|krF| |¡ t||||ƒ qW |S )Nr   )r$   r   r	   rJ   rw   rr   rI   Ú"_get_elements_by_tagName_ns_helper)r‚   ZnsURIrw   r„   rA   r
   r
   r   r…   =  s    
r…   c               @   sJ   e Zd ZejZdZdZdZdZ	ej
ejejejejejejfZdd„ ZdS )ÚDocumentFragmentz#document-fragmentNc             C   s   t ƒ | _d S )N)rk   r$   )r   r
   r
   r   Ú__init__T  s    zDocumentFragment.__init__)ro   rp   rq   r	   r+   r   ÚnodeNameÚ	nodeValueÚ
attributesr3   rJ   rF   ÚCDATA_SECTION_NODEÚENTITY_REFERENCE_NODEÚPROCESSING_INSTRUCTION_NODEÚCOMMENT_NODEÚNOTATION_NODEr.   r‡   r
   r
   r
   r   r†   F  s   r†   c               @   s¼   e Zd ZdZejZdZdZdZ	ej
ejfZeddfdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zeeeƒ ZZdd„ Zdd„ Zeeeƒ ZZdd„ Zdd„ ZeeeƒZdd„ Zdd„ Zdd„ ZdS )ÚAttr)Ú_nameÚ_valuerr   Ú_prefixr$   Ú
_localNamerO   ÚownerElementNFc             C   s2   d | _ || _|| _|| _tƒ | _| j tƒ ¡ d S )N)r•   r‘   rr   r“   rk   r$   rI   ÚText)r   ÚqNamerr   rw   rs   r
   r
   r   r‡   b  s    zAttr.__init__c             C   s.   y| j S  tk
r(   | j dd¡d S X d S )Nú:r*   r(   )r”   r\   rˆ   Úsplit)r   r
   r
   r   rW   o  s    zAttr._get_localNamec             C   s   | j S )N)Ú	specified)r   r
   r
   r   Ú_get_specifiedu  s    zAttr._get_specifiedc             C   s   | j S )N)r‘   )r   r
   r
   r   Ú	_get_namex  s    zAttr._get_namec             C   s   || _ | jd k	rt| jƒ d S )N)r‘   r•   r:   )r   Úvaluer
   r
   r   Ú	_set_name{  s    
zAttr._set_namec             C   s   | j S )N)r’   )r   r
   r
   r   Ú
_get_value‚  s    zAttr._get_valuec             C   s6   || _ || jd _| jd k	r&t| jƒ || jd _d S )Nr   )r’   r$   rG   r•   r:   )r   r   r
   r
   r   Ú
_set_value…  s
    

zAttr._set_valuec             C   s   | j S )N)r“   )r   r
   r
   r   Ú_get_prefixŽ  s    zAttr._get_prefixc             C   sd   | j }|dkr&|r&|tkr&tj d¡‚|| _|d kr<| j}nd|| jf }| jrZt| jƒ || _	d S )NÚxmlnsz5illegal use of 'xmlns' prefix for the wrong namespacez%s:%s)
rr   r   r/   r0   ÚNamespaceErrr“   rw   r•   r:   rƒ   )r   rs   ZnsuriZnewNamer
   r
   r   Ú_set_prefix‘  s    
zAttr._set_prefixc             C   sz   | j }|d k	rR|j| j= |j| j| jf= | jrRd| _| jd8  _| j j	d8  _	x| j
D ]}| ¡  qZW | j
d d …= d S )NFr*   )r•   Ú_attrsrˆ   Ú_attrsNSrr   rw   Ú_is_idÚ_magic_id_nodesrO   Ú_magic_id_countr$   rH   )r   ÚelemrM   r
   r
   r   rH   ¢  s    
zAttr.unlinkc             C   sf   | j r
dS | j}| j}|d ks&|d kr*dS | |¡}|d kr@dS | jrV| | j| j¡S | | j¡S d S )NTF)	r§   rO   r•   Ú_get_elem_inforr   ÚisIdNSrw   ÚisIdrˆ   )r   ru   rª   Úinfor
   r
   r   Ú	_get_isId³  s    
zAttr._get_isIdc             C   s\   | j }| j}|d ks|d kr tS | |¡}|d kr6tS | jrL| | j| j¡S | | j¡S d S )N)	rO   r•   Ú_no_typer«   rr   ÚgetAttributeTypeNSrw   ÚgetAttributeTyperˆ   )r   ru   rª   r®   r
   r
   r   Ú_get_schemaTypeÃ  s    
zAttr._get_schemaType) ro   rp   rq   Ú	__slots__r	   ÚATTRIBUTE_NODEr   rŠ   rš   r§   rF   rŒ   r.   r   r‡   rW   r›   rœ   rž   Úpropertyrˆ   rƒ   rŸ   r    r‰   r   r¡   r¤   rs   rH   r¯   r³   r
   r
   r
   r   r   X  s,   
r   r­   z True if this attribute is an ID.z'Namespace-local name of this attribute.Ú
schemaTypezSchema type for this attribute.c               @   sò   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zd:dd„ZeZdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Z dS );ÚNamedNodeMapa  The attribute list is a transient interface to the underlying
    dictionaries.  Mutations here will change the underlying element's
    dictionary.

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



