o
    V=ñ^Ý"  ã                   @   s    d dl mZmZmZ zd dlmZ W n ey!   d dlmZ Y nw d dlm	Z	m
Z
 d dlZddlmZ ddlmZ dd	lmZ dd
lmZ dd„ ZeeƒZdS )é    )Úabsolute_importÚdivisionÚunicode_literals)ÚMutableMapping)ÚminidomÚNodeNé   )Úbaseé   )Ú	constants)Ú
namespaces)ÚmoduleFactoryFactoryc                    sV   ˆ‰G dd„ dt ƒ‰ G ‡ ‡fdd„dtjƒ‰G ‡‡‡‡fdd„dtjƒ}dd„ ‰tƒ S )	Nc                   @   sL   e 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 )zgetDomBuilder.<locals>.AttrListc                 S   s
   || _ d S ©N©Úelement©Úselfr   © r   ú;/usr/lib/python3/dist-packages/html5lib/treebuilders/dom.pyÚ__init__   ó   
z(getDomBuilder.<locals>.AttrList.__init__c                 S   ó   t | jj ¡ ƒS r   )Úiterr   Ú
attributesÚkeys©r   r   r   r   Ú__iter__   ó   z(getDomBuilder.<locals>.AttrList.__iter__c                 S   s2   t |tƒrt‚| jj |¡}||_|| jj|< d S r   )Ú
isinstanceÚtupleÚNotImplementedErrorr   ÚownerDocumentZcreateAttributeÚvaluer   )r   Únamer"   Úattrr   r   r   Ú__setitem__   s
   
z+getDomBuilder.<locals>.AttrList.__setitem__c                 S   s   t | jjƒS r   )Úlenr   r   r   r   r   r   Ú__len__#   s   z'getDomBuilder.<locals>.AttrList.__len__c                 S   r   r   )Úlistr   r   Úitemsr   r   r   r   r)   &   r   z%getDomBuilder.<locals>.AttrList.itemsc                 S   r   r   )r(   r   r   Úvaluesr   r   r   r   r*   )   r   z&getDomBuilder.<locals>.AttrList.valuesc                 S   s   t |tƒrt‚| jj| jS r   )r   r   r    r   r   r"   ©r   r#   r   r   r   Ú__getitem__,   ó   
z+getDomBuilder.<locals>.AttrList.__getitem__c                 S   s   t |tƒrt‚| jj|= d S r   )r   r   r    r   r   r+   r   r   r   Ú__delitem__2   r-   z+getDomBuilder.<locals>.AttrList.__delitem__N)Ú__name__Ú
__module__Ú__qualname__r   r   r%   r'   r)   r*   r,   r.   r   r   r   r   ÚAttrList   s    r2   c                       sŒ   e Zd Zdd„ Zedd„ ƒZdd„ Zddd	„Zd
d„ Zdd„ Z	dd„ Z
‡ fdd„Zdd„ ZeeeƒZ‡fdd„Zdd„ Zdd„ ZeeƒZdS )z"getDomBuilder.<locals>.NodeBuilderc                 S   s   t j | |j¡ || _d S r   )r	   r   r   ÚnodeNamer   r   r   r   r   r   9   s   
z+getDomBuilder.<locals>.NodeBuilder.__init__c                 S   s   t | jdƒr
| jjpd S )NÚnamespaceURI)Úhasattrr   r4   r   r   r   r   Ú<lambda>=   s    ÿz+getDomBuilder.<locals>.NodeBuilder.<lambda>c                 S   s   | |_ | j |j¡ d S r   )Úparentr   ÚappendChild©r   Únoder   r   r   r8   @   s   z.getDomBuilder.<locals>.NodeBuilder.appendChildNc                 S   s6   | j j |¡}|r| j  ||j ¡ d S | j  |¡ d S r   )r   r!   ÚcreateTextNodeÚinsertBeforer8   )r   Údatar<   Útextr   r   r   Ú
insertTextD   s   z-getDomBuilder.<locals>.NodeBuilder.insertTextc                 S   s   | j  |j |j ¡ | |_d S r   )r   r<   r7   )r   r:   ZrefNoder   r   r   r<   K   s   
z/getDomBuilder.<locals>.NodeBuilder.insertBeforec                 S   s&   |j j| j kr| j  |j ¡ d |_d S r   )r   Z
parentNodeÚremoveChildr7   r9   r   r   r   r@   O   s   
z.getDomBuilder.<locals>.NodeBuilder.removeChildc                 S   s>   | j  ¡ r| j j}| j  |¡ |j  |¡ | j  ¡ sg | _d S r   )r   ÚhasChildNodesZ
firstChildr@   r8   Ú
childNodes)r   Z	newParentÚchildr   r   r   ÚreparentChildrenT   s   

ý
z3getDomBuilder.<locals>.NodeBuilder.reparentChildrenc                    s
   ˆ | j ƒS r   r   r   )r2   r   r   ÚgetAttributes[   r   z0getDomBuilder.<locals>.NodeBuilder.getAttributesc                 S   sz   |r9t | ¡ ƒD ]2\}}t|tƒr1|d d ur"|d d |d  }n|d }| j |d ||¡ q| j ||¡ qd S d S )Nr   ú:r   r
   )r(   r)   r   r   r   ZsetAttributeNSZsetAttribute)r   r   r#   r"   ZqualifiedNamer   r   r   ÚsetAttributes^   s   
ÿÿöz0getDomBuilder.<locals>.NodeBuilder.setAttributesc                    s   ˆ | j  d¡ƒS )NF)r   Ú	cloneNoder   ©ÚNodeBuilderr   r   rH   m   r   z,getDomBuilder.<locals>.NodeBuilder.cloneNodec                 S   s
   | j  ¡ S r   )r   rA   r   r   r   r   Ú
hasContentp   r   z-getDomBuilder.<locals>.NodeBuilder.hasContentc                 S   s$   | j d u rtd | jfS | j | jfS )NZhtml)Ú	namespacer   r#   r   r   r   r   ÚgetNameTuples   s   
z/getDomBuilder.<locals>.NodeBuilder.getNameTupler   )r/   r0   r1   r   ÚpropertyrL   r8   r?   r<   r@   rD   rE   rG   r   rH   rK   rM   Z	nameTupler   )r2   rJ   r   r   rJ   8   s    

rJ   c                       s‚   e Zd Z‡ fdd„Z‡ ‡fdd„Zd‡fdd„	Z‡fdd	„Z‡fd
d„Zdd„ Z‡fdd„Z	dd„ Z
dd„ Zddd„Z”ZdZdS )z"getDomBuilder.<locals>.TreeBuilderc                    s   ˆ   ¡  d d d ¡| _t | ¡S r   )ÚgetDOMImplementationZcreateDocumentÚdomÚweakrefÚproxyr   )ÚDomr   r   ÚdocumentClass|   s   
z0getDomBuilder.<locals>.TreeBuilder.documentClassc                    sV   |d }|d }|d }ˆ   ¡ }| |||¡}| j ˆ|ƒ¡ ˆ tkr)| j|_d S d S )Nr#   ÚpublicIdÚsystemId)rO   ZcreateDocumentTypeZdocumentr8   r   rP   r!   )r   Útokenr#   rU   rV   ZdomimplZdoctype)rS   rJ   r   r   ÚinsertDoctype€   s   ÿz0getDomBuilder.<locals>.TreeBuilder.insertDoctypeNc                    s<   |d u r| j d u r| j |¡}ˆ |ƒS | j ||¡}ˆ |ƒS r   )ZdefaultNamespacerP   ZcreateElementZcreateElementNS)r   r#   rL   r:   rI   r   r   ÚelementClass‹   s
   þz/getDomBuilder.<locals>.TreeBuilder.elementClassc                    s   ˆ | j  |¡ƒS r   )rP   ZcreateComment)r   r=   rI   r   r   ÚcommentClass“   r   z/getDomBuilder.<locals>.TreeBuilder.commentClassc                    s   ˆ | j  ¡ ƒS r   )rP   ZcreateDocumentFragmentr   rI   r   r   ÚfragmentClass–   ó   z0getDomBuilder.<locals>.TreeBuilder.fragmentClassc                 S   s   | j  |j¡ d S r   )rP   r8   r   r9   r   r   r   r8   ™   s   z.getDomBuilder.<locals>.TreeBuilder.appendChildc                    s   ˆ |ƒS r   r   r   )ÚtestSerializerr   r   r]   œ   s   z1getDomBuilder.<locals>.TreeBuilder.testSerializerc                 S   s   | j S r   )rP   r   r   r   r   ÚgetDocumentŸ   s   z.getDomBuilder.<locals>.TreeBuilder.getDocumentc                 S   s   t j | ¡jS r   )r	   ÚTreeBuilderÚgetFragmentr   r   r   r   r   r`   ¢   r\   z.getDomBuilder.<locals>.TreeBuilder.getFragmentc                 S   sr   |}|| krt j | ||¡ d S t| jdƒr-tj| jjvr-t| jjƒ| j_| jj 	tj¡ | j 
| j |¡¡ d S )NÚ_child_node_types)r	   r_   r?   r5   rP   r   Ú	TEXT_NODEra   r(   Úappendr8   r;   )r   r=   r7   r   r   r   r?   ¥   s   z-getDomBuilder.<locals>.TreeBuilder.insertTextr   )r/   r0   r1   rT   rX   rY   rZ   r[   r8   r]   r^   r`   r?   Úimplementationr#   r   )rS   ÚDomImplementationrJ   r]   r   r   r_   {   s    
r_   c                    s0   |   ¡  g ‰ d‡ ‡fdd„	‰ˆ| dƒ d ˆ ¡S )Nr   c                    s   | j tjkr@| jr5| js| jr(| jpd}| jpd}ˆ  dd| | j||f ¡ nÇˆ  dd| | jf ¡ nºˆ  dd| f ¡ n¯| j tjkrLˆ  d¡ n£| j tjkrXˆ  d¡ n—| j tj	krkˆ  dd| | j
f ¡ n„| j tjkr~ˆ  d	d| | j
f ¡ nqt| d
ƒr”| jd ur”dtj| j | jf }n| j}ˆ  dd| |f ¡ |  ¡ rïg }tt| jƒƒD ](}| j |¡}|j}|j}|j}	|	rÍdtj|	 |jf }n|j}| ||f¡ q¯t|ƒD ]\}}ˆ  dd|d  ||f ¡ qÜ|d7 }| jD ]}
ˆ|
|ƒ qöd S )NÚ z|%s<!DOCTYPE %s "%s" "%s">ú z|%s<!DOCTYPE %s>z|%s<!DOCTYPE >z	#documentz#document-fragmentz|%s<!-- %s -->z|%s"%s"r4   z%s %sz|%s<%s>z
|%s%s="%s"r
   )ZnodeTyper   ZDOCUMENT_TYPE_NODEr#   rU   rV   rc   ZDOCUMENT_NODEZDOCUMENT_FRAGMENT_NODEZCOMMENT_NODEZ	nodeValuerb   r5   r4   r   Úprefixesr3   ZhasAttributesÚranger&   r   Úitemr"   Z	localNameÚsortedrB   )r   ÚindentrU   rV   r#   r   Úir$   r"   ÚnsrC   ©ZrvÚserializeElementr   r   rp   ¹   sV   

ÿ
ÿÿ
ÿz?getDomBuilder.<locals>.testSerializer.<locals>.serializeElementÚ
)r   )Ú	normalizeÚjoinr   r   ro   r   r]   µ   s
   
.
z%getDomBuilder.<locals>.testSerializer)r   r	   r   r_   Úlocals)re   r_   r   )r2   rS   re   rJ   r]   r   ÚgetDomBuilder   s   $C:6ru   )Z
__future__r   r   r   Zcollections.abcr   ÚImportErrorÚcollectionsZxml.domr   r   rQ   rf   r	   r   r   Z_utilsr   ru   ZgetDomModuler   r   r   r   Ú<module>   s    ÿ _