a
    (ñ»j¢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0 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   úFE:\soccer\ml_env\Lib\site-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   ÚelementÚlastr   r   r   ÚappendChild4   s    
zDocument.appendChildc                 C   s   | j S r   )r   r   r   r   r   Ú_getChildNodes;   s    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                    s,  t | dƒ�s,t | dƒrºˆ d¡ | jjrz| jjsF| jjsFd| jj }nd| jj| jj| jjf }ˆ dd|d  |f ¡ |  ¡ }| ¡ d ur˜| ¡ }q‚|d ur¸ˆ||d ƒ | 	¡ }q˜nnt
| tƒsÐt
| tƒ�rt
| tƒsìtjd	 dksìJ ‚ˆ d
d| | f ¡ n$ˆ d¡ | D ]}ˆ||d ƒ �q�nü| jtk�r€ˆ dd| | jf ¡ t | dƒ�r(| j�r(ˆ d
d| | jf ¡ �n¨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ƒ�r¶g }| j ¡ D ]d\}	}
t |	¡}|d u�rj| ¡ \}}	ˆ  |	¡}	tj| }d||	f }n
ˆ  |	¡}| ||
f¡ �q t|ƒD ]&\}	}
ˆ dd|d  |	|
f ¡ �qŽ| j�rÚˆ d
d|d  | jf ¡ |d7 }| D ]}ˆ||ƒ �qæt | dƒ�r(| j�r(ˆ d
d|d  | jf ¡ 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_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ƒsH| jjr:| jjr$| jj}nd| jj }ˆ  |¡ ˆ|  ¡ ƒ nœ| jtkrfˆ  d| j	f ¡ n~| j
s€ˆ  d| jf ¡ n.d dd„ | j
 ¡ D ƒ¡}ˆ  d| j|f ¡ | j	rÀˆ  | j	¡ | D ]}ˆ|ƒ qÄˆ  d	| jf ¡ t | d
ƒ�r| j�rˆ  | j¡ 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.   r/   Ú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                    s4   t |tƒr&d|d ˆ  |d ¡f }n
ˆ  |¡}|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   s   t | jjjƒS r   )Úiterr    r+   r   r   r   r   Ú__iter__Ý   s    z1TreeBuilder.__init__.<locals>.Attributes.__iter__c                 S   s   t | jjjƒS r   )Úlenr    r+   r   r   r   r   Ú__len__à   s    z0TreeBuilder.__init__.<locals>.Attributes.__len__c                 S   s   | j j j ¡ S r   )r    r+   Úclearr   r   r   r   rl   ã   s    z.TreeBuilder.__init__.<locals>.Attributes.clearN)r   r   r   r   r`   rd   rf   rg   ri   rk   rl   r   r_   r   r   Ú
AttributesÆ   s   rm   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   rn   ©rm   ÚbuilderrJ   r   r   r   ç   s    
z.TreeBuilder.__init__.<locals>.Element.__init__c                    s$   ˆ   |¡| _|  | j| j¡| j_d S r   )ro   Ú_nameZ_getETreeTagZ
_namespacer    r'   )r   r   r_   r   r   Ú_setNameì   s    ÿz.TreeBuilder.__init__.<locals>.Element._setNamec                    s   ˆ   | j¡S r   )r>   rt   r   r_   r   r   Ú_getNameñ   s    z.TreeBuilder.__init__.<locals>.Element._getNamec                 S   s   | j S r   )rq   r   r   r   r   Ú_getAttributesö   s    z4TreeBuilder.__init__.<locals>.Element._getAttributesc                 S   s   | j }| ¡  | |¡ d S r   )rF   rl   Úupdate)r   rG   rF   r   r   r   Ú_setAttributesù   s    z4TreeBuilder.__init__.<locals>.Element._setAttributesNc                    s   ˆ  |¡}ˆ j | ||¡ d S r   )ZcoerceCharactersrp   Ú
insertText)r   ÚdataZinsertBefore©rs   rJ   r   r   rz      s    
z0TreeBuilder.__init__.<locals>.Element.insertTextc                 S   s0   t | ƒ| j| jƒ}| jjr,|jj | jj¡ |S r   )Útyper   rn   r    r+   rx   r[   r   r   r   Ú	cloneNode  s    z/TreeBuilder.__init__.<locals>.Element.cloneNode)N)r   r   r   r   ru   rv   r%   r   rw   ry   rF   rz   r~   r   rr   r   r   rp   æ   s   

rp   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  s    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   rp   r€   ÚelementClassÚcommentClassr   rY   r   )r   r„   rZ   rp   r€   r   rr   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   #  s    zTreeBuilder.testSerializerc                 C   s   t r| jjS | jj ¡ S d 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rB| |j¡ |S )Nr   )ÚopenElementsr    r8   r-   ÚextendÚlistr*   )r   Úfragmentr!   r   r   r   ÚgetFragment,  s    zTreeBuilder.getFragmentc                 C   sh   |d }|d }|d }|s0t  dt¡ d | _n4| j |¡}||krPt  dt¡ |  |||¡}|| _d S )Nr   r   r   z#lxml cannot represent empty doctypez%lxml cannot represent non-xml doctype)ÚwarningsÚwarnr	   rT   rJ   ro   Ú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 rô| j jsJ ‚|d| j j 7 }| j jd us>| j jd urÐ|d| j | j jpRd¡ 7 }| j jrÈ| j j}| d¡dkrž| d¡dkržt dt	¡ | 
dd¡}| d¡dkrº|d	| 7 }qÐ|d
| 7 }n|d7 }|d7 }| j j|d krôt dt	¡ |d7 }t |¡}| jD ] }|  |d ¡}| |j¡ �q|  ¡ | _| ¡ | j_|d }| d| j¡}|d u �rj|}	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{   rn   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_tokenÚcommentr   rn   Z	etree_tagZroot_elementr   r   r   Ú
insertRootQ  sP    
ÿÿ



zTreeBuilder.insertRoot)F)N)N)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__Ú
__future__r   r   r   r’   Úrer5   Úcollections.abcr   ÚImportErrorÚcollectionsrW   r   r
   r	   r   r9   r   Z
lxml.etreeÚsixr   r   rZ   Úcompiler:   r€   r'   r7   Úobjectr   r   rQ   rX   rY   r   r   r   r   Ú<module>   s.   
O)