
Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­Â�Â­
<!DOCTYPE html>
<html>
3
ct„je ã               @   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/lib64/python3.6/xml/dom/minidom.pyÚ__bool__+   s    zNode.__bool__c             C   s   | j dd|ƒS )NÚ )Útoprettyxml)r   Úencodingr
   r
   r   Útoxml.   s    z
Node.toxmlú	Ú
c             C   sx   |d krt jƒ }nt jt jƒ |ddd�}| jtjkrH| j|d|||ƒ n| j|d||ƒ |d krh|jƒ S |j	ƒ jƒ 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 ]}| j||ƒ qW |S |j | jkrXtjjdt	|ƒt	| ƒf ƒ‚|j
d k	rn|j
j|ƒ |d kr‚| j|ƒ nˆy| jj|ƒ}W n tk
r°   tjjƒ ‚Y nX |j tkrÄt| ƒ | jj||ƒ ||_||_|rþ| j|d  }||_||_nd |_| |_
|S )Nz%s cannot be child of %sr(   )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 ]}| j|ƒ qW |S |j | jkrXtjjdt	|ƒt	| ƒf ƒ‚n|j t
krjt| ƒ |jd k	r€|j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}| j|ƒ | j||ƒS |j | jkrPtjjdt	|ƒt	| ƒf ƒ‚||kr\d S |j
d k	rr|j
j|ƒ y| jj|ƒ}W n tk
r    tj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 j|ƒ W n tk
r.   tj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_|jƒ  qÀ|r–|d j|jkr–|d }|j|j |_|j|_|jrŒ||j_|jƒ  qÀ|j|ƒ q|j|ƒ |jtj	kr|j
ƒ  qW || j d d …< d S )Nr(   r)   r)   r)   )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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   | j |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jƒ ƒD ]&\}\}}|d k	r|j|||||ƒ 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 ]}|jƒ  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   | j ƒ  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 }||_||_|j|ƒ | |_d S )Nr(   r)   )r$   r=   r<   rI   r3   )r   rA   r$   Zlastr
   r
   r   rB     s    
rB   c             C   s6   |r2|j ddƒj ddƒj ddƒj ddƒ}| j|ƒ 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|j|ƒ t|||ƒ qW |S )Nr   )r$   r   r	   rJ   ÚtagNamerI   Ú_get_elements_by_tagName_helper)ÚparentÚnameÚrcrA   r
   r
   r   r€   .  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|j|ƒ 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„   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 )N)rk   r$   )r   r
   r
   r   Ú__init__M  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…   ?  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   s8   d | _ d | _|| _|| _|| _tƒ | _| jjtƒ ƒ d S )N)	r”   rO   r�   rr   r’   rk   r$   rI   ÚText)r   ÚqNamerr   rw   rs   r
   r
   r   r†   [  s    zAttr.__init__c             C   s.   y| j S  tk
r(   | jjddƒd S X d S )Nú:r(   r)   )r“   r\   r‡   Úsplit)r   r
   r
   r   rW   i  s    zAttr._get_localNamec             C   s   | j S )N)Ú	specified)r   r
   r
   r   Ú_get_specifiedo  s    zAttr._get_specifiedc             C   s   | j S )N)r�   )r   r
   r
   r   Ú	_get_namer  s    zAttr._get_namec             C   s   || _ | jd k	rt| jƒ d S )N)r�   r”   r:   )r   Úvaluer
   r
   r   Ú	_set_nameu  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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 ]}|jƒ  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 |j|ƒ}|d kr@dS | jrV|j| j| jƒS |j| 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 |j|ƒ}|d kr6tS | jrL|j| j| jƒS |j| 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)r�   r‘   rr   r’   r$   r“   rO   r”   ) 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�   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d0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ 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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 jƒ D ]}|j|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 jƒ D ]}|j|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 jƒ S )N)r¤   r¼   )r   r
   r
   r   r¼   û  s    zNamedNodeMap.keysc             C   s
   | j jƒ S )N)r¥   r¼   )r   r
   r
   r   ÚkeysNSþ  s    zNamedNodeMap.keysNSc             C   s
   | j jƒ S )N)r¤   r¿   )r   r
   r
   r   r¿     s    zNamedNodeMap.valuesNc             C   s   | j 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   | j |ƒdkS )Nr   )rÈ   )r   rX   r
   r
   r   Ú__eq__  s    zNamedNodeMap.__eq__c             C   s   | j |ƒdkS )Nr   )rÈ   )r   rX   r
   r
   r   Ú__ge__  s    zNamedNodeMap.__ge__c             C   s   | j |ƒdkS )Nr   )rÈ   )r   rX   r
   r
   r   Ú__gt__  s    zNamedNodeMap.__gt__c             C   s   | j |ƒdkS )Nr   )rÈ   )r   rX   r
   r
   r   Ú__le__  s    zNamedNodeMap.__le__c             C   s   | j |ƒ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|_| j|ƒ Y nX ||_n t |tƒsdt	dƒ‚|}| j|ƒ 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   ÚgetNamedItem4  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   | j |ƒ}|d k	rJt| jƒ | j|j= | j|j|jf= t|dƒrFd |_	|S t
jjƒ ‚d S )Nr”   )rÔ   r:   r¸   r¤   r‡   r¥   rr   rw   rd   r”   r/   r0   r8   )r   r‚   Únr
   r
   r   ÚremoveNamedItem@  s    



zNamedNodeMap.removeNamedItemc             C   sZ   | j ||ƒ}|d k	rLt| jƒ | j|j|jf= | j|j= t|dƒrHd |_	|S t
jjƒ ‚d S )Nr”   )rÕ   r:   r¸   r¥   rr   rw   r¤   r‡   rd   r”   r/   r0   r8   )r   rr   rw   rÖ   r
   r
   r   ÚremoveNamedItemNSL  s    


zNamedNodeMap.removeNamedItemNSc             C   st   t |tƒs&tjjdt|ƒt| ƒf ƒ‚| jj|jƒ}|r@|j	ƒ  || 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Ð   X  s    

zNamedNodeMap.setNamedItemc             C   s
   | j |ƒS )N)rÐ   )r   rA   r
   r
   r   ÚsetNamedItemNSe  s    zNamedNodeMap.setNamedItemNSc             C   s   | | }t |jƒ |jƒ  d S )N)r:   r”   rH   )r   rÎ   rA   r
   r
   r   Ú__delitem__h  s    
zNamedNodeMap.__delitem__c             C   s   | j | j| jfS )N)r¤   r¥   r¸   )r   r
   r
   r   Ú__getstate__m  s    zNamedNodeMap.__getstate__c             C   s   |\| _ | _| _d S )N)r¤   r¥   r¸   )r   Ústater
   r
   r   Ú__setstate__p  s    zNamedNodeMap.__setstate__)r¤   r¥   r¸   )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·   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 )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)rá   r‚   )ro   rp   rq   r³   r†   rã   r›   rä   r
   r
   r
   r   rà   y  s
   rà   c               @   s   e Zd ZdDZ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/d0„ Z$d1d2„ Z%d3d4„ Z&d5d6„ Z'dEd8d9„Z(d:d;„ Z)d<d=„ Z*d>d?„ Z+d@dA„ Z,dBdC„ Z-dS )FÚElementrO   r3   r   r‡   rs   rr   r“   r$   r¤   r¥   r<   r=   Nr   c             C   sH   d | _ d | _| | _| _|| _|| _tƒ | _d  | _| _	d | _
d | _d S )N)rO   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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 jƒ ƒD ]}|jƒ  qW d | _ d | _tj| ƒ 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   | j |ƒ}|d kr4t|ƒ}||_| j|_| 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 |ƒ\}}| j||ƒ}|d krHt||||ƒ}||_| j|_| 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 j|ƒS )N)r¤   rÅ   )r   Zattrnamer
   r
   r   rë   ø  s    
zElement.getAttributeNodec             C   s   | j d krd S | j 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jdƒ‚| jƒ  | jj|jd ƒ}|d k	rD| j|ƒ | j	j|j
|jfd ƒ}|d k	rt||k	rt| j|ƒ 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jƒ ‚y| j| }W n tk
r@   tjjƒ ‚Y nX | j|ƒ 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jƒ ‚y| j ||f }W n tk
rD   tjjƒ ‚Y nX | j|ƒ 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jƒ ‚y| j|j  W n tk
r@   t jjƒ ‚Y nX t| ƒ |jƒ  | 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   ÚhasAttribute8  s    
zElement.hasAttributec             C   s   | j d krdS ||f| j kS )NF)r¥   )r   rr   rw   r
   r
   r   ÚhasAttributeNS=  s    
zElement.hasAttributeNSc             C   s   t | |tƒ ƒS )N)r€   rk   )r   r‚   r
   r
   r   ÚgetElementsByTagNameB  s    zElement.getElementsByTagNamec             C   s   t | ||tƒ ƒS )N)r„   rk   )r   rr   rw   r
   r
   r   ÚgetElementsByTagNameNSE  s    zElement.getElementsByTagNameNSc             C   s   d| j t| ƒf S )Nz<DOM Element: %s at %#x>)r   rÇ   )r   r
   r
   r   rã   I  s    zElement.__repr__r   c       	      C   s  |j |d | j ƒ | jƒ }t|jƒ ƒ}x4|D ],}|j d| ƒ t||| jƒ |j dƒ q.W | jrô|j dƒ t| jƒdkr¦| jd j	t
jkr¦| jd j|dddƒ n8|j |ƒ x"| jD ]}|j||| ||ƒ q¸W |j |ƒ |j d| j|f ƒ n|j d	| ƒ d S )
Nry   z %s="rz   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   L  s$    



zElement.writexmlc             C   s   | j ƒ  t| j| j| ƒS )N)ræ   r·   r¤   r¥   )r   r
   r
   r   rû   g  s    zElement._get_attributesc             C   s   | j r
dS dS d S )NTF)r¤   )r   r
   r
   r   ÚhasAttributesk  s    zElement.hasAttributesc             C   s   | j |ƒ}| j|ƒ d S )N)rë   ÚsetIdAttributeNode)r   r‚   ÚidAttrr
   r
   r   ÚsetIdAttributes  s    
zElement.setIdAttributec             C   s   | j ||ƒ}| j|ƒ d S )N)rï   rÿ   )r   rr   rw   r   r
   r
   r   ÚsetIdAttributeNSw  s    zElement.setIdAttributeNSc             C   sl   |d ks| j |jƒ r tjjƒ ‚t| ƒd k	r6tjjƒ ‚|jshd|_|  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)rO   r3   r   r‡   rs   rr   r“   r$   r¤   r¥   r<   r=   )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å   �  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|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f 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.
    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| 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| 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| 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| 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   |j 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  rG   )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j| ƒ 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jdƒ‚|t| jƒkr.t jjdƒ‚|dk rBt j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jdƒ‚|t| jƒkr.t j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jdƒ‚|t| jƒkr.t jjdƒ‚|dk rBt j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jdƒ‚|t| jƒkr.t jjdƒ‚|dk rBt j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)r  rO   r3   r=   r<   )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f 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•   z#textNc             C   s’   |dk s|t | jƒkr"tjjdƒ‚| jƒ }| j|d … |_| j|_| j}| jr~| | jj	kr~|d krp| jj
|ƒ n| j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   Ú	splitText+  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@|jd|j ƒ |j}qP qW | j}x4|d k	r€|jtjtjfkr||j|j ƒ |j}qNP qNW dj	|ƒS )Nr   r   )
rG   r=   r   r	   rF   rŠ   r;   r<   rI   Újoin)r   rL   rÖ   r
   r
   r   Ú_get_wholeText?  s    

zText._get_wholeTextc             C   s¦   | j }| j}x6|d k	rB|jtjtjfkr>|j}|j|ƒ |}qP qW | j}|sX|j| ƒ x6|d k	rŽ|jtjtjfkrŠ|j}|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   ÚreplaceWholeTextQ  s*    




zText.replaceWholeTextc             C   sF   | j jƒ rdS t| ƒ}|d kr"dS | jj|ƒ}|d kr:dS |jƒ S d S )NF)rG   ÚstripÚ_get_containing_elementrO   rª   ÚisElementContent)r   r©   r­   r
   r
   r   Ú!_get_isWhitespaceInElementContentm  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 j| ƒ || _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ƒ‚|j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f ZejZdZddd„ZdS )ÚCDATASectionz#cdata-sectionr   c             C   s,   | j jdƒdkrtdƒ‚|j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               @   s|   e Zd ZdZf 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dd„ ZdS )ÚReadOnlySequentialNamedNodeMapÚ_seqc             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
| j|ƒ}|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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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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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)r+  r,  )ro   rp   rq   rÞ   r³   r-  r.  r/  r
   r
   r
   r   r*  í  s
   r*  c               @   sH   e Zd ZejZdZdZdZdZ	dZ
dd„ Zdd„ Zdd„ Zdd	d
„ZdS )ÚDocumentTypeNc             C   s2   t ƒ | _t ƒ | _|r&t|ƒ\}}|| _| j| _d S )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	j|ƒ |j|||ƒ qJW xZ| jj	D ]N}t|j|j|j|jƒ}|j|_|j|_|j|_|jj	j|ƒ |j|||ƒ qŠW | j|| |ƒ |S d S d S )N)rO   r0  r‚   r‡   r/   r0   ÚUserDataHandlerÚNODE_CLONEDr1  r(  r2  Ú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Ž   |j dƒ |j | jƒ | jr8|j d|| j|| jf ƒ n| jrR|j d|| jf ƒ | jd k	r||j dƒ |j | jƒ |j dƒ |j d| ƒ d S )Nz
<!DOCTYPE z%s  PUBLIC '%s'%s  '%s'z%s  SYSTEM '%s'z [ú]r{   )r}   r‚   r+  r,  r3  )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,  r3  r†   r4  rQ   r   r
   r
   r
   r   r0  ü  s   r0  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 )r8  Nc             C   s$   || _ || _tƒ | _| j||ƒ d S )N)r‡   r9  rk   r$   r-  )r   r‚   r+  r,  r<  r
   r
   r   r†   A  s    zEntity.__init__c             C   s   | j S )N)r:  )r   r
   r
   r   Ú_get_actualEncodingG  s    zEntity._get_actualEncodingc             C   s   | j S )N)r   )r   r
   r
   r   Ú_get_encodingJ  s    zEntity._get_encodingc             C   s   | j S )N)rU   )r   r
   r
   r   Ú_get_versionM  s    zEntity._get_versionc             C   s   t jjdƒ‚d S )Nz(cannot append children to an entity node)r/   r0   r1   )r   r>   r
   r
   r   r5   P  s    zEntity.appendChildc             C   s   t jjdƒ‚d S )Nz+cannot insert children below an entity node)r/   r0   r1   )r   r>   r?   r
   r
   r   r-   T  s    zEntity.insertBeforec             C   s   t jjdƒ‚d S )Nz*cannot remove children from an entity node)r/   r0   r1   )r   rC   r
   r
   r   r4   X  s    zEntity.removeChildc             C   s   t jjdƒ‚d S )Nz)cannot replace children of an entity node)r/   r0   r1   )r   r>   rC   r
   r
   r   rD   \  s    zEntity.replaceChild)ro   rp   rq   r‰   r	   ZENTITY_NODEr   rˆ   r:  r   rU   r†   rA  rB  rC  r5   r-   r4   rD   r
   r
   r
   r   r8  8  s   r8  c               @   s   e Zd ZejZdZdd„ ZdS )r7  Nc             C   s   || _ | j||ƒ d S )N)r‡   r-  )r   r‚   r+  r,  r
   r
   r   r†   d  s    zNotation.__init__)ro   rp   rq   r	   rŽ   r   rˆ   r†   r
   r
   r
   r   r7  `  s   r7  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ú2.0Nr/   úls-loadú3.0c             C   s   |dkrd }|j ƒ |f| jkS )Nr   )ÚlowerÚ	_features)r   rT   rU   r
   r
   r   rS   t  s    zDOMImplementation.hasFeaturec       	      C   sØ   |r|j d k	rtjjdƒ‚| jƒ }|d ko8|d ko8|d k }| rR|rRtjjdƒ‚|r¸t|ƒ\}}|dkr~|dkr~tjjdƒ‚|r”| r”tjjdƒ‚|j||ƒ}|r®|j	|ƒ |j	|ƒ |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ð   rO  ru   Zadd_root_elementrs   rñ   r  r
   r
   r   ÚcreateDocumenty  s4    




z DOMImplementation.createDocumentc             C   s   t |ƒ}||_||_|S )N)r0  r+  r,  )r   rð   r+  r,  rO  r
   r
   r   ÚcreateDocumentType¦  s    z$DOMImplementation.createDocumentTypec             C   s   | j |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   rM  µ  s    z"DOMImplementation._create_document)rE  rF  )rE  rG  )rE  N)r/   rF  )r/   rG  )r/   N)rH  rI  )rH  N)	ro   rp   rq   rK  rS   rP  rQ  rZ   rM  r
   r
   r
   r   rD  i  s   -rD  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   rT  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)r   )ro   rp   rq   rÞ   r³   r†   r±   r°   r"  rU  r¬   r«   rÛ   rÝ   r
   r
   r
   r   rS  ¸  s   rS  c             C   s<   | j tjkr| jjƒ  d | _n| jr8| jjjƒ  d | j_d S )N)r   r	   r   Ú	_id_cacheÚclearÚ_id_search_stackrO   )rA   r
   r
   r   r:   â  s    
r:   c               @   sr  e Zd ZdMZ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.d0d1„ Z/d2d3„ Z0d4d5„ Z1d6d7„ Z2d8d9„ Z3d:d;„ Z4d<d=„ Z5d>d?„ Z6d@dA„ Z7dBdC„ Z8dDdE„ Z9dFdG„ Z:dNdIdJ„Z;dKdL„ Z<dS )OrR  Ú
_elem_inforO  rX  r$   rV  z	#documentNFr   c             C   s$   d | _ tƒ | _i | _i | _d | _d S )N)rO  rk   r$   rY  rV  rX  )r   r
   r
   r   r†     s
    zDocument.__init__c             C   s&   |j r|j |jf}n|j}| jj|ƒS )N)rr   rw   r   rY  rÅ   )r   r  r^   r
   r
   r   rª     s    zDocument._get_elem_infoc             C   s   | j S )N)r:  )r   r
   r
   r   rA    s    zDocument._get_actualEncodingc             C   s   | j S )N)rO  )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   rB    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   rC  *  s    zDocument._get_versionc             C   sj   |j | jkr(tjjdt|ƒt| ƒf ƒ‚|jd k	r>|jj|ƒ |j tj	kr^| j
ƒ r^tjjdƒ‚tj| |ƒ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   -  s    
zDocument.appendChildc             C   sV   y| j j|ƒ W n tk
r.   tj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   =  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   rc  I  s    zDocument._get_documentElementc             C   s(   | j d k	r| j jƒ  d | _ tj| ƒ d S )N)rO  rH   r	   )r   r
   r
   r   rH   N  s    

zDocument.unlinkc             C   sÂ   |sd S | j jd d d ƒ}| j|_| j|_| j|_xx| jD ]n}t|||ƒ}|jj|ƒsXt	‚|jj
|ƒ |jtjkr€|jd ks t	‚n |jtjkr |jd ksšt	‚||_||_q8W | jtjjj| |ƒ |S )N)rR   rP  r   r_  rU   r$   rN   rO   rY   ÚAssertionErrorrI   r   r	   r   rd  r@  rO  r3   rj   r/   r0   r5  r6  )r   rP   r;  rÖ   Z
childcloner
   r
   r   rQ   T  s&    
zDocument.cloneNodec             C   s   t ƒ }| |_|S )N)r…   rO   )r   rb   r
   r
   r   ÚcreateDocumentFragmenti  s    zDocument.createDocumentFragmentc             C   s   t |ƒ}| |_|S )N)rå   rO   )r   r   r=  r
   r
   r   ÚcreateElementn  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   ÚcreateTextNodes  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   rN  “  s    zDocument.createElementNSc             C   s*   t |ƒ\}}t||||ƒ}| |_d|_|S )Nr   )rî   r�   rO   rœ   )r   rr   rð   rs   rw   rn  r
   r
   r   ÚcreateAttributeNS™  s
    zDocument.createAttributeNSc             C   s   t ||||ƒ}| |_|S )N)r8  rO   )r   r‚   r+  r,  r9  r=  r
   r
   r   Ú_create_entity£  s    zDocument._create_entityc             C   s   t |||ƒ}| |_|S )N)r7  rO   )r   r‚   r+  r,  rÖ   r
   r
   r   Ú_create_notation¨  s    zDocument._create_notationc             C   s”  || j kr| j | S | jp| js$d S | j}|d krB| jg}|| _n|sJd S d }�x>|�rŽ|jƒ }|jdd„ |jD ƒƒ | j|ƒ}|�r@x¶|j	j
ƒ D ]¨}|jrÒ|j|j|jƒrÐ|| j |j< |j|krÈ|}n|jsÐP q’|j|jƒ�r
|| j |j< |j|k� rþ|}n
|j�s:P q’|jr’|| j |j< |j|k�r.|}q’|jdkr’P q’W nB|j�r‚x8|j	j
ƒ D ]*}|j�rT|| j |j< |j|k�rT|}�qTW |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(   )rV  rY  r¨   rX  rd  Ú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 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jdƒ‚n|j tjkr2tjjdƒ‚t||| ƒS )Nzcannot import document nodesz!cannot import document type nodes)r   r	   r   r/   r0   ÚNotSupportedErrr@  rN   )r   rA   rP   r
   r
   r   Ú
importNodeñ  s
    zDocument.importNoder   c             C   sN   |d kr|j d| ƒ n|j d||f ƒ x| jD ]}|j||||ƒ 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jd| |j f ƒ‚|jtjtjfkr>tjjdƒ‚|t	kr¶d|kr€|j
ddƒ\}}|dkr´|tjjkr´tjjdƒ‚q¾|dkr¬|tjjkr¬|jtjkr¬tjjdƒ‚d }|}nd }d }|jtjkrê|j}|d k	rî|j}|j|ƒ nd }||_||_||_||_|jtjk�r||_n*||_|d k	�rF|j|ƒ |�rF|j|ƒ |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   rL  r   r	   rJ   r´   rz  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)rY  rO  rX  r$   rV  )r   r   r   N)=ro   rp   rq   r³   r	   rJ   rŒ   r�   r@  r.   rD  rR   r   r   r‡   rˆ   r‰   r3   r=   r<   r:  r   r_  rU   ra  r]  r[  r¨   r†   rª   rA  rZ  r\  rB  r^  r`  rb  rC  r5   r4   rc  rH   rQ   rf  rg  ri  rj  rk  rm  ro  rN  rp  rq  rr  ry  rù   rú   rV   r{  r   r|  r
   r
   r
   r   rR  ê  sh    	
:
rR  rd  z#Top-level element of this document.c             C   sì  | j j|ƒrtjjj}n
tjjj}| jtj	kr¬|j
| j| jƒ}x>| jjƒ D ]0}|j|j|j|jƒ |j|j|jƒ}|j|_qJW |r¨x$| jD ]}t|||ƒ}|j|ƒ qŠW �n"| jtjkrî|jƒ }|rêx$| jD ]}t|||ƒ}|j|ƒ qÌW �nà| jtjk�r|j| jƒ}�nÂ| jtjk�r*|j| jƒ}�n¤| jtjk�rL|j| j | jƒ}�n‚| jtj!k�rj|j"| jƒ}�nd| jtj#k�rš|j$| j| jƒ}d|_| j|_�n4| jtj%k�rº| j |k	�s¸t&‚tjjj}|j'j(| j)| j*| j+ƒ}||_ |�rÎg |j,_-g |j._-xR| j.j-D ]F}	t/|	j|	j*|	j+ƒ}
||
_ |j.j-j0|
ƒ t1|	dƒ�rþ|	j2||	|
ƒ �qþW x„| j,j-D ]b}t3|j|j*|j+|j4ƒ}|j5|_5|j6|_6|j7|_7||_ |j,j-j0|ƒ t1|dƒ�rR|j2|||ƒ �qRW ntjj8dt9| ƒ ƒ‚t1| dƒ�rè| j2|| |ƒ |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   r5  r6  ZNODE_IMPORTEDr   r	   rJ   rN  rr   r‡   r‰   r¿   rò   rœ   rï   rw   r™   r$   rN   r5   r+   rf  rF   ri  rG   rŠ   rj  rŒ   rm  r  r�   rk  r´   rp  r@  re  rR   rQ  r‚   r+  r,  r1  r(  r2  r7  rI   rd   rj   r8  r9  r:  r   rU   rz  r2   )rA   rP   ZnewOwnerDocumentrg   r;  rè   rn  rM   r@   rÖ   r<  r=  r>  r
   r
   r   rN   <  s~    

rN   c             C   s,   | j 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,   | ||Ž}|j ƒ \}}|j|ƒ |jƒ  |S )N)ZgetEventZ
expandNoderW  )ÚfuncÚargsÚkwargsZeventsZtoktypeZrootNoder
   r
   r   Ú_do_pulldom_parse–  s
    

r�  c             C   sJ   |dkr$| r$ddl m} |j| ƒ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} |j| ƒ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j| ƒ} x"| D ]\}}tjj||ƒsd S qW tjS )N)rÁ   rÂ   r   Z_parse_feature_stringrR  rR   rS   )ZfeaturesÚfÚvr
   r
   r   ÚgetDOMImplementation±  s    

r�  )NN)N)N)6rÞ   r   r†  r/   r   r   r   r   Zxml.dom.minicompatZxml.dom.xmlbuilderr   r   r0   r	   rJ   r‹   r9   ZdefpropertyrB   r~   r€   r„   r…   r�   Úobjectr·   ZAttributeListrà   r¯   rå   rô   r  r  r  r•   r!  r  r$  r%  r'  r*  r0  r8  r7  rD  rS  r:   rR  rN   rî   r�  r‡  r‰  r�  r
   r
   r
   r   Ú<module>   sŠ    v	z $
 x)GU	><(	O*  PR



