o
    V=ñ^¢9  ã                   @   s  d Z ddlmZmZmZ ddlZddlZddlZzddlm	Z	 W n e
y/   ddlm	Z	 Y nw ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZmZ dZe d¡Ze d¡jZG dd„ deƒZG dd„ deƒZdd„ Z dd„ Z!G dd„ dej"ƒZ"dS )aÃ  Module for supporting the lxml.etree library. The idea here is to use as much
of the native library as possible, without using fragile hacks like custom element
names that break between releases. The downside of this is that we cannot represent
all possible trees; specifically the following are known to cause problems:

Text or comments as siblings of the root element
Docypes with no name

When any of these things occur, we emit a DataLossWarning
é    )Úabsolute_importÚdivisionÚunicode_literalsN)ÚMutableMappingé   )Úbaseé   )ÚDataLossWarning)Ú	constants)Úetree)Ú	_ihatexml)ÚPY3Úbinary_typeTz{([^}]*)}(.*)Zasdc                   @   s   e Zd Zdd„ ZdS )ÚDocumentTypec                 C   s   || _ || _|| _d S ©N)ÚnameÚpublicIdÚsystemId)Úselfr   r   r   © r   úB/usr/lib/python3/dist-packages/html5lib/treebuilders/etree_lxml.pyÚ__init__)   s   
zDocumentType.__init__N)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   (   s    r   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ ZeeƒZdS )ÚDocumentc                 C   s   d | _ g | _d S r   )Ú_elementTreeÚ_childNodes©r   r   r   r   r   0   s   
zDocument.__init__c                 C   s.   | j  ¡ }| j  ¡  ¡ D ]}q| |j¡ d S r   )r   ÚgetrootZitersiblingsZaddnextÚ_element)r   ÚelementZlastr   r   r   ÚappendChild4   s   
zDocument.appendChildc                 C   ó   | j S r   )r   r   r   r   r   Ú_getChildNodes;   ó   zDocument._getChildNodesN)r   r   r   r   r"   r$   ÚpropertyZ
childNodesr   r   r   r   r   /   s
    r   c                    s6   g ‰t jdd‰ d‡ ‡‡fdd„	‰ˆ| dƒ d ˆ¡S )NT©ZpreventDoubleDashCommentsr   c                    sD  t | dƒsŸt | dƒrgˆ d¡ | jjr<| jjs"| jjs"d| jj }nd| jj| jj| jjf }ˆ dd|d  |f ¡ |  ¡ }| ¡ d urP| ¡ }| ¡ d usF|d ureˆ||d ƒ | 	¡ }|d usTd S d S t
| tƒsqt
| tƒrŒt
| tƒstjd	 dksJ ‚ˆ d
d| | f ¡ d S ˆ d¡ | D ]	}ˆ||d ƒ q“d S | jtkrÊˆ dd| | jf ¡ t | dƒrÆ| jrÈˆ d
d| | jf ¡ d S d S d S t
| tjƒsÒJ ‚tj | j¡}|d urü| d¡}| d¡}tj| }ˆ dd| |ˆ  |¡f ¡ nˆ dd| ˆ  | j¡f ¡ t | dƒrcg }| j ¡ D ]2\}	}
t |	¡}|d ur=| ¡ \}}	ˆ  |	¡}	tj| }d||	f }nˆ  |	¡}| ||
f¡ qt|ƒD ]\}	}
ˆ dd|d  |	|
f ¡ qO| jruˆ d
d|d  | jf ¡ |d7 }| D ]}ˆ||ƒ q{t | dƒrž| jr ˆ d
d|d  | jf ¡ d S d S d S )NÚtagr   z	#documentú<!DOCTYPE %s>z<!DOCTYPE %s "%s" "%s">z|%s%sú r   r   z|%s"%s"z#document-fragmentz|%s<!-- %s -->Útailr   z
|%s<%s %s>z|%s<%s>Úattribz%s %sz
|%s%s="%s") ÚhasattrÚappendÚdocinfoÚinternalDTDZ	public_idZ
system_urlÚ	root_namer   ZgetpreviousZgetnextÚ
isinstanceÚstrÚbytesÚsysÚversion_infor(   Úcomment_typeÚtextr+   r   Z_ElementÚetree_buildersÚ
tag_regexpÚmatchÚgroupr
   ÚprefixesÚfromXmlNamer,   ÚitemsÚgroupsÚsorted)r!   ÚindentÚdtd_strZnext_elementZnsmatchÚnsr(   ÚprefixÚ
attributesr   ÚvalueZattr_stringÚchild©ÚinfosetFilterÚrvÚserializeElementr   r   rL   E   s†   


ÿýÿþ
ÿ
ÿ



ÿ
ÿ




  ÿz(testSerializer.<locals>.serializeElementÚ
)r   )r   ÚInfosetFilterÚjoin©r!   r   rI   r   ÚtestSerializerA   s
   
F
rQ   c                    s$   g ‰ ‡ ‡fdd„‰ˆ| ƒ d  ˆ ¡S )z4Serialize an element and its child nodes to a stringc                    s  t | dƒs$| jjr| jjr| jj}nd| jj }ˆ  |¡ ˆ|  ¡ ƒ nN| jtkr3ˆ  d| j	f ¡ n?| j
s@ˆ  d| jf ¡ nd dd„ | j
 ¡ D ƒ¡}ˆ  d| j|f ¡ | j	r`ˆ  | j	¡ | D ]}ˆ|ƒ qbˆ  d	| jf ¡ t | d
ƒr‚| jr„ˆ  | j¡ d S d S d S )Nr(   r)   z	<!--%s-->z<%s>r*   c                 S   s   g | ]
\}}d ||f ‘qS )z%s="%s"r   )Ú.0r   rG   r   r   r   Ú
<listcomp>¦   s    ÿz6tostring.<locals>.serializeElement.<locals>.<listcomp>z<%s %s>z</%s>r+   )r-   r/   r0   Údoctyper1   r.   r   r(   r7   r8   r,   rO   r?   r+   )r!   rC   ÚattrrH   ©rK   rL   r   r   rL   ”   s.   




ÿ
ÿz"tostring.<locals>.serializeElementÚ )rO   rP   r   rV   r   Útostring   s    
rX   c                       sz   e Zd ZeZeZdZdZeZ	e
Zddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Zddd„Zd‡ fdd„	Zdd„ Z‡  ZS )ÚTreeBuilderNFc                    sŠ   t jt|d‰tjdd ‰| _|| _G ‡fdd„dtƒ‰ G ‡ ‡‡fdd„dˆjƒ}G ‡‡fdd	„d	ˆj	ƒ}|| _
|| _tj | |¡ d S )
N)ÚfullTreeTr'   c                       sP   e Zd Zdd„ Z‡ fdd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )z(TreeBuilder.__init__.<locals>.Attributesc                 S   s
   || _ d S r   )r    ©r   r!   r   r   r   r   Ç   s   
z1TreeBuilder.__init__.<locals>.Attributes.__init__c                    s6   t |tƒrd|d ˆ  |d ¡f }|S ˆ  |¡}|S )Nú{%s}%sr   r   )r2   ÚtupleZcoerceAttribute)r   Úkeyr   ©rJ   r   r   Ú
_coerceKeyÊ   s
   

ÿz3TreeBuilder.__init__.<locals>.Attributes._coerceKeyc                 S   s0   | j j j|  |¡ }tst|tƒr| d¡}|S )NÚascii)r    r,   r`   r   r2   r   Údecode©r   r^   rG   r   r   r   Ú__getitem__Ñ   s   
z4TreeBuilder.__init__.<locals>.Attributes.__getitem__c                 S   s   || j j j|  |¡< d S r   ©r    r,   r`   rc   r   r   r   Ú__setitem__×   s   z4TreeBuilder.__init__.<locals>.Attributes.__setitem__c                 S   s   | j j j|  |¡= d S r   re   )r   r^   r   r   r   Ú__delitem__Ú   s   z4TreeBuilder.__init__.<locals>.Attributes.__delitem__c                 S   ó   t | jjjƒS r   )Úiterr    r,   r   r   r   r   Ú__iter__Ý   ó   z1TreeBuilder.__init__.<locals>.Attributes.__iter__c                 S   rh   r   )Úlenr    r,   r   r   r   r   Ú__len__à   rk   z0TreeBuilder.__init__.<locals>.Attributes.__len__c                 S   s   | j j j ¡ S r   )r    r,   Úclearr   r   r   r   rn   ã   rk   z.TreeBuilder.__init__.<locals>.Attributes.clearN)r   r   r   r   r`   rd   rf   rg   rj   rm   rn   r   r_   r   r   Ú
AttributesÆ   s    ro   c                       sp   e Zd Z‡ ‡‡fdd„Z‡fdd„Z‡fdd„ZeeeƒZdd„ Zd	d
„ Z	eee	ƒZ
d‡‡fdd„	Zdd„ ZdS )z%TreeBuilder.__init__.<locals>.Elementc                    s*   ˆ  |¡}ˆjj| ||d ˆ | ƒ| _d S )N)Ú	namespace)ÚcoerceElementÚElementr   Ú_attributes)r   r   rp   ©ro   ÚbuilderrJ   r   r   r   ç   s   
z.TreeBuilder.__init__.<locals>.Element.__init__c                    s$   ˆ   |¡| _|  | j| j¡| j_d S r   )rq   Ú_nameZ_getETreeTagZ
_namespacer    r(   )r   r   r_   r   r   Ú_setNameì   s   ÿz.TreeBuilder.__init__.<locals>.Element._setNamec                    s   ˆ   | j¡S r   )r>   rv   r   r_   r   r   Ú_getNameñ   s   z.TreeBuilder.__init__.<locals>.Element._getNamec                 S   r#   r   )rs   r   r   r   r   Ú_getAttributesö   r%   z4TreeBuilder.__init__.<locals>.Element._getAttributesc                 S   s   | j }| ¡  | |¡ d S r   )rF   rn   Úupdate)r   rG   rF   r   r   r   Ú_setAttributesù   s   z4TreeBuilder.__init__.<locals>.Element._setAttributesNc                    s   ˆ  |¡}ˆ j | ||¡ d S r   )ZcoerceCharactersrr   Ú
insertText)r   ÚdataZinsertBefore©ru   rJ   r   r   r|      s   
z0TreeBuilder.__init__.<locals>.Element.insertTextc                 S   s0   t | ƒ| j| jƒ}| jjr|jj | jj¡ |S r   )Útyper   rp   r    r,   rz   r[   r   r   r   Ú	cloneNode  s   z/TreeBuilder.__init__.<locals>.Element.cloneNoder   )r   r   r   r   rw   rx   r&   r   ry   r{   rF   r|   r€   r   rt   r   r   rr   æ   s    

rr   c                       s8   e Zd Z‡ ‡fdd„Z‡fdd„Zdd„ ZeeeƒZdS )z%TreeBuilder.__init__.<locals>.Commentc                    s   ˆ  |¡}ˆ j | |¡ d S r   )ÚcoerceCommentÚCommentr   ©r   r}   r~   r   r   r     s   
z.TreeBuilder.__init__.<locals>.Comment.__init__c                    s   ˆ   |¡}|| j_d S r   )r   r    r8   rƒ   r_   r   r   Ú_setData  s   
z.TreeBuilder.__init__.<locals>.Comment._setDatac                 S   s   | j jS r   )r    r8   r   r   r   r   Ú_getData  ó   z.TreeBuilder.__init__.<locals>.Comment._getDataN)r   r   r   r   r„   r…   r&   r}   r   r~   r   r   r‚   
  s
    r‚   )r9   ZgetETreeModuler   r   rN   rJ   ÚnamespaceHTMLElementsr   rr   r‚   ÚelementClassÚcommentClassr   rY   r   )r   r‡   rZ   rr   r‚   r   rt   r   r   Á   s    $zTreeBuilder.__init__c                 C   s$   t j | ¡ | j| _g | _d | _d S r   )r   rY   ÚresetÚinsertCommentInitialÚinsertCommentÚinitial_commentsrT   r   r   r   r   rŠ     s   
zTreeBuilder.resetc                 C   s   t |ƒS r   )rQ   r[   r   r   r   rQ   #  r†   zTreeBuilder.testSerializerc                 C   s   t r| jjS | jj ¡ S r   )rZ   Údocumentr   r   r   r   r   r   ÚgetDocument&  s   zTreeBuilder.getDocumentc                 C   sF   g }| j d j}|jr| |j¡ | t|ƒ¡ |jr!| |j¡ |S )Nr   )ÚopenElementsr    r8   r.   ÚextendÚlistr+   )r   Zfragmentr!   r   r   r   ÚgetFragment,  s   zTreeBuilder.getFragmentc                 C   sj   |d }|d }|d }|st  dt¡ d | _d S | j |¡}||kr)t  dt¡ |  |||¡}|| _d S )Nr   r   r   z#lxml cannot represent empty doctypez%lxml cannot represent non-xml doctype)ÚwarningsÚwarnr	   rT   rJ   rq   ÚdoctypeClass)r   Útokenr   r   r   ZcoercedNamerT   r   r   r   ÚinsertDoctype6  s   

zTreeBuilder.insertDoctypec                 C   s6   |d u s|| j u sJ ‚| j jd u sJ ‚| j |¡ d S r   )rŽ   r   r   r.   ©r   r}   Úparentr   r   r   r‹   F  s   z TreeBuilder.insertCommentInitialc                    sB   || j kr| j j ¡ d jtkrt dt¡ tt	| ƒ 
||¡ d S )Néÿÿÿÿz@lxml cannot represent adjacent comments beyond the root elements)rŽ   r   r   r(   r7   r”   r•   r	   ÚsuperrY   rŒ   r™   ©Ú	__class__r   r   ÚinsertCommentMainK  s
   
ÿzTreeBuilder.insertCommentMainc                 C   s°  d}| j rz| j jsJ ‚|d| j j 7 }| j jd us| j jd urh|d| j | j jp)d¡ 7 }| j jrd| j j}| d¡dkrO| d¡dkrOt dt	¡ | 
dd¡}| d¡dkr]|d	| 7 }n|d
| 7 }n|d7 }|d7 }| j j|d krzt dt	¡ |d7 }t |¡}| jD ]}|  |d ¡}| |j¡ q†|  ¡ | _| ¡ | j_|d }| d| j¡}|d u r³|}	nd||f }	|	|_|  ||¡}
||
_| jj |
¡ | j |
¡ | j| _d S )NrW   z<!DOCTYPE %sz PUBLIC "%s" ú'r   ú"z6DOCTYPE system cannot contain single and double quotesZU00027z"%s"z'%s'z''ú>r   zGlxml cannot represent doctype with a different name to the root elementz$<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>r}   rp   r\   )rT   r   r   r   rJ   ZcoercePubidÚfindr”   r•   r	   Úreplacer   Z
fromstringr   r‰   Zaddpreviousr    ÚdocumentClassrŽ   Zgetroottreer   ÚgetZdefaultNamespacer(   rˆ   r   r.   r   rŸ   rŒ   )r   r—   ZdocStrZsysidÚrootÚcomment_tokenZcommentr   rp   Z	etree_tagZroot_elementr   r   r   Ú
insertRootQ  sP   
ÿÿ


zTreeBuilder.insertRoot)Fr   )r   r   r   r   r¥   r   r–   rˆ   r‰   ZfragmentClassr   Úimplementationr   rŠ   rQ   r   r“   r˜   r‹   rŸ   r©   Ú__classcell__r   r   r   r   rY   ¹   s     
\

rY   )#Ú__doc__Z
__future__r   r   r   r”   Úrer5   Zcollections.abcr   ÚImportErrorÚcollectionsrW   r   r
   r	   r   r9   r   Z
lxml.etreeZsixr   r   rZ   Úcompiler:   r‚   r(   r7   Úobjectr   r   rQ   rX   rY   r   r   r   r   Ú<module>   s2    ÿ
O)