o
    !§Ñh®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{([^}]*)}(.*)Úasdc                   @   s   e Zd Zdd„ ZdS )ÚDocumentTypec                 C   s   || _ || _|| _d S ©N)ÚnameÚpublicIdÚsystemId)Úselfr   r   r   © r   úN/usr/lib/python3/dist-packages/pip/_vendor/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   ÚgetrootÚitersiblingsÚaddnextÚ_element)r   ÚelementÚ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(   ÚpropertyÚ
childNodesr   r   r   r   r   /   s
    r   c                    s6   g ‰t jdd�‰ d‡ ‡‡fdd„	‰ˆ| dƒ d ˆ¡S )NT©Ú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ÚinternalDTDÚ	public_idÚ
system_urlÚ	root_namer    ÚgetpreviousÚgetnextÚ
isinstanceÚstrÚbytesÚsysÚversion_infor.   Úcomment_typeÚtextr1   r   Ú_ElementÚetree_buildersÚ
tag_regexpÚmatchÚgroupr
   ÚprefixesÚfromXmlNamer2   ÚitemsÚgroupsÚsorted)r$   ÚindentÚdtd_strÚnext_elementÚnsmatchÚnsr.   ÚprefixÚ
attributesr   ÚvalueÚattr_stringÚchild©ÚinfosetFilterÚrvÚserializeElementr   r   rZ   E   s†   


ÿýÿþ
ÿ
ÿ



ÿ
ÿ




  ÿz(testSerializer.<locals>.serializeElementÚ
)r   )r   ÚInfosetFilterÚjoin©r$   r   rW   r   ÚtestSerializerA   s
   
F
r_   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>r0   c                 S   s   g | ]
\}}d ||f ‘qS )z%s="%s"r   )Ú.0r   rT   r   r   r   Ú
<listcomp>¦   s    ÿz6tostring.<locals>.serializeElement.<locals>.<listcomp>z<%s %s>z</%s>r1   )r3   r5   r6   Údoctyper9   r4   r    r.   rA   rB   r2   r]   rJ   r1   )r$   rN   ÚattrrV   ©rY   rZ   r   r   rZ   ”   s.   




ÿ
ÿz"tostring.<locals>.serializeElementÚ )r]   r^   r   rd   r   Útostring�   s    
rf   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   )r<   ÚtupleÚcoerceAttribute)r   Úkeyr   ©rX   r   r   Ú
_coerceKeyÊ   s
   

ÿz3TreeBuilder.__init__.<locals>.Attributes._coerceKeyc                 S   s0   | j j j|  |¡ }tst|tƒr| d¡}|S )NÚascii)r#   r2   ro   r   r<   r   Údecode©r   rm   rT   r   r   r   Ú__getitem__Ñ   s   
z4TreeBuilder.__init__.<locals>.Attributes.__getitem__c                 S   s   || j j j|  |¡< d S r   ©r#   r2   ro   rr   r   r   r   Ú__setitem__×   s   z4TreeBuilder.__init__.<locals>.Attributes.__setitem__c                 S   s   | j j j|  |¡= d S r   rt   )r   rm   r   r   r   Ú__delitem__Ú   s   z4TreeBuilder.__init__.<locals>.Attributes.__delitem__c                 S   ó   t | jjjƒS r   )Úiterr#   r2   r   r   r   r   Ú__iter__Ý   ó   z1TreeBuilder.__init__.<locals>.Attributes.__iter__c                 S   rw   r   )Úlenr#   r2   r   r   r   r   Ú__len__à   rz   z0TreeBuilder.__init__.<locals>.Attributes.__len__c                 S   s   | j j j ¡ S r   )r#   r2   Úclearr   r   r   r   r}   ã   rz   z.TreeBuilder.__init__.<locals>.Attributes.clearN)r   r   r   r   ro   rs   ru   rv   ry   r|   r}   r   rn   r   r   Ú
AttributesÆ   s    r~   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   r   ©r~   ÚbuilderrX   r   r   r   ç   s   
z.TreeBuilder.__init__.<locals>.Element.__init__c                    s$   ˆ   |¡| _|  | j| j¡| j_d S r   )r€   Ú_nameÚ_getETreeTagÚ
_namespacer#   r.   )r   r   rn   r   r   Ú_setNameì   s   ÿz.TreeBuilder.__init__.<locals>.Element._setNamec                    s   ˆ   | j¡S r   )rI   r…   r   rn   r   r   Ú_getNameñ   s   z.TreeBuilder.__init__.<locals>.Element._getNamec                 S   r'   r   )r‚   r   r   r   r   Ú_getAttributesö   r)   z4TreeBuilder.__init__.<locals>.Element._getAttributesc                 S   s   | j }| ¡  | |¡ d S r   )rS   r}   Úupdate)r   rT   rS   r   r   r   Ú_setAttributesù   s   z4TreeBuilder.__init__.<locals>.Element._setAttributesNc                    s   ˆ  |¡}ˆ j | ||¡ d S r   )ÚcoerceCharactersr�   Ú
insertText)r   ÚdataÚinsertBefore©r„   rX   r   r   rŽ      s   
z0TreeBuilder.__init__.<locals>.Element.insertTextc                 S   s0   t | ƒ| j| jƒ}| jjr|jj | jj¡ |S r   )Útyper   r   r#   r2   r‹   ri   r   r   r   Ú	cloneNode  s   z/TreeBuilder.__init__.<locals>.Element.cloneNoder   )r   r   r   r   rˆ   r‰   r*   r   rŠ   rŒ   rS   rŽ   r“   r   rƒ   r   r   r�   æ   s    

r�   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#   rB   r–   rn   r   r   Ú_setData  s   
z.TreeBuilder.__init__.<locals>.Comment._setDatac                 S   s   | j jS r   )r#   rB   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•   )rD   ÚgetETreeModuler   r   r\   rX   ÚnamespaceHTMLElementsr   r�   r•   ÚelementClassÚcommentClassr   rg   r   )r   r›   rh   r�   r•   r   rƒ   r   r   Á   s    $zTreeBuilder.__init__c                 C   s$   t j | ¡ | j| _g | _d | _d S r   )r   rg   ÚresetÚinsertCommentInitialÚinsertCommentÚinitial_commentsrb   r   r   r   r   rž     s   
zTreeBuilder.resetc                 C   s   t |ƒS r   )r_   ri   r   r   r   r_   #  r™   zTreeBuilder.testSerializerc                 C   s   t r| jjS | jj ¡ S r   )rh   Ú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#   rB   r4   ÚextendÚlistr1   )r   Ú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	   rb   rX   r€   ÚdoctypeClass)r   Útokenr   r   r   ÚcoercedNamerb   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¡   r4   ©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.   rA   r©   rª   r	   Úsuperrg   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 )Nre   z<!DOCTYPE %sz PUBLIC "%s" ú'r   ú"z6DOCTYPE system cannot contain single and double quotesÚU00027z"%s"z'%s'z''ú>r   zGlxml cannot represent doctype with a different name to the root elementz$<THIS_SHOULD_NEVER_APPEAR_PUBLICLY/>r�   r   rj   )rb   r   r   r   rX   ÚcoercePubidÚfindr©   rª   r	   Úreplacer   Ú
fromstringr¡   r�   Úaddpreviousr#   ÚdocumentClassr¢   Úgetroottreer   ÚgetÚdefaultNamespacer.   rœ   r   r4   r¤   rµ   r    )r   r¬   ÚdocStrÚsysidÚrootÚcomment_tokenÚcommentr   r   Ú	etree_tagÚroot_elementr   r   r   Ú
insertRootQ  sN   ÿ


zTreeBuilder.insertRoot)Fr   )r   r   r   r   r¿   r   r«   rœ   r�   ÚfragmentClassr   Úimplementationr   rž   r_   r£   r¨   r®   rŸ   rµ   rÊ   Ú__classcell__r   r   r³   r   rg   ¹   s     
\

rg   )#Ú__doc__Ú
__future__r   r   r   r©   Úrer?   Úcollections.abcr   ÚImportErrorÚcollectionsre   r   r
   r	   r   rD   r   Ú
lxml.etreeÚpip._vendor.sixr   r   rh   ÚcompilerE   r•   r.   rA   Úobjectr   r   r_   rf   rg   r   r   r   r   Ú<module>   s2    ÿ
O)