B
    n&=[*7                 @   s   d Z ddlmZmZmZ ddlZddl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
lmZ ddl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   )base   )DataLossWarning)	constants)etree)	_ihatexmlTz{([^}]*)}(.*)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   ?lib/python3.7/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 )N)_elementTree_childNodes)r   r   r   r   r   *   s    zDocument.__init__c             C   s   | j  |j d S )N)r   getrootZaddnext_element)r   elementr   r   r   appendChild.   s    zDocument.appendChildc             C   s   | j S )N)r   )r   r   r   r   _getChildNodes1   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)preventDoubleDashCommentsr   c                sD  t | ds8t | 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  |  }x| d k	r| }qW x|d k	r||d  |	 }qW nrt
| tst
| trt
| tstjd	 dkstd
d| | f  n(d x| D ]}||d  qW n| jtkrdd| | jf  t | dr@| jr@d
d| | jf  nt
| tjsttj| j}|d k	r|d}|d}tj| }dd| | |f  ndd|  | jf  t | drg }xr| j D ]d\}	}
t|	}|d k	rx| \}}	 |	}	tj| }d||	f }n
 |	}|||
f q.W x2t |D ]&\}	}
dd|d  |	|
f  qW | jrd
d|d  | jf  |d7 }x| D ]}|| qW t | dr@| jr@d
d|d  | jf  d S )Ntagr   z	#documentz<!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_infoAssertionErrorr!   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   rD   ;   st    













"
z(testSerializer.<locals>.serializeElement
)r   )r   InfosetFilterjoin)r   r   )rB   rC   rD   r   testSerializer7   s
    F
rH   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	 x| D ]}| qW  d	| jf  t | d
r| jr | j d S )Nr!   z<!DOCTYPE %s>z	<!--%s-->z<%s>r"   c             S   s   g | ]\}}d ||f qS )z%s="%s"r   ).0r   r@   r   r   r   
<listcomp>   s   z6tostring.<locals>.serializeElement.<locals>.<listcomp>z<%s %s>z</%s>r#   )r%   r'   r(   doctyper)   r&   r   r!   r0   r1   r$   rG   r8   r#   )r   r<   attrrA   )rC   rD   r   r   rD      s*    





z"tostring.<locals>.serializeElement )rG   )r   r   )rC   rD   r   tostring   s     rN   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)fullTreeT)r    c                   s&   e Zd Zd fdd	Z fddZdS )z(TreeBuilder.__init__.<locals>.AttributesNc                sv   |d kri }|| _ t| | xR|  D ]F\}}t|trVd|d  |d f }n
 |}|| j j j|< q(W d S )Nz{%s}%sr   r   )r   dictr   r8   r*   tuplecoerceAttributer$   )r   r   r@   keyr   )rB   r   r   r      s    

z1TreeBuilder.__init__.<locals>.Attributes.__init__c                sP   t | || t|tr4d|d  |d f }n
 |}|| jjj|< d S )Nz{%s}%sr   r   )rQ   __setitem__r*   rR   rS   r   r$   )r   rT   r@   r   )rB   r   r   rU      s
    

z4TreeBuilder.__init__.<locals>.Attributes.__setitem__)N)r   r   r   r   rU   r   )rB   r   r   
Attributes   s   rV   c                   sx   e Zd Z fddZfddZfddZeeeZdd Z fd	d
Z	eee	Z
dfdd	ZfddZdS )z%TreeBuilder.__init__.<locals>.Elementc                s*    |}jj| ||d  | | _d S )N)	namespace)coerceElementElementr   _attributes)r   r   rW   )rV   builderrB   r   r   r      s    
z.TreeBuilder.__init__.<locals>.Element.__init__c                s$     || _| | j| j| j_d S )N)rX   _nameZ_getETreeTagZ
_namespacer   r!   )r   r   )rB   r   r   _setName   s    z.TreeBuilder.__init__.<locals>.Element._setNamec                s     | jS )N)r7   r\   )r   )rB   r   r   _getName   s    z.TreeBuilder.__init__.<locals>.Element._getNamec             S   s   | j S )N)rZ   )r   r   r   r   _getAttributes   s    z4TreeBuilder.__init__.<locals>.Element._getAttributesc                s    | || _ d S )N)rZ   )r   r?   )rV   r   r   _setAttributes   s    z4TreeBuilder.__init__.<locals>.Element._setAttributesNc                s    |} j| || d S )N)ZcoerceCharactersrY   
insertText)r   dataZinsertBefore)r[   rB   r   r   ra      s    
z0TreeBuilder.__init__.<locals>.Element.insertTextc                s    j | | d S )N)rY   r   )r   rA   )r[   r   r   r      s    z1TreeBuilder.__init__.<locals>.Element.appendChild)N)r   r   r   r   r]   r^   r   r   r_   r`   r?   ra   r   r   )rV   r[   rB   r   r   rY      s   

rY   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 )N)coerceCommentCommentr   )r   rb   )r[   rB   r   r   r      s    
z.TreeBuilder.__init__.<locals>.Comment.__init__c                s     |}|| j_d S )N)rc   r   r1   )r   rb   )rB   r   r   _setData   s    
z.TreeBuilder.__init__.<locals>.Comment._setDatac             S   s   | j jS )N)r   r1   )r   r   r   r   _getData   s    z.TreeBuilder.__init__.<locals>.Comment._getDataN)r   r   r   r   re   rf   r   rb   r   )r[   rB   r   r   rd      s   rd   )r2   ZgetETreeModuler
   r   rF   rB   namespaceHTMLElementsrQ   rY   rd   elementClasscommentClassr   rO   r   )r   rg   rP   rY   rd   r   )rV   r[   rB   r   r      s    zTreeBuilder.__init__c             C   s$   t j|  | j| _g | _d | _d S )N)r   rO   resetinsertCommentInitialinsertCommentinitial_commentsrK   )r   r   r   r   rj     s    zTreeBuilder.resetc             C   s   t |S )N)rH   )r   r   r   r   r   rH   	  s    zTreeBuilder.testSerializerc             C   s   t r| jjS | jj S d S )N)rP   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   r1   r&   extendlistr#   )r   Z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   rK   rB   rX   doctypeClass)r   tokenr   r   r   ZcoercedNamerK   r   r   r   insertDoctype  s    zTreeBuilder.insertDoctypec             C   s6   |d ks|| j kst| j jd ks&t| j| d S )N)rn   r/   r   rm   r&   )r   rb   parentr   r   r   rk   ,  s    z TreeBuilder.insertCommentInitialc                sB   || j kr,| j j d jtkr,tdt tt	| 
|| d S )Nz@lxml cannot represent adjacent comments beyond the root elements)rn   r   r   r!   r0   rt   ru   r   superrO   rl   )r   rb   ry   )	__class__r   r   insertCommentMain1  s    
zTreeBuilder.insertCommentMainc             C   s  d}| j r| j jst|d| j j 7 }| j jd k	s>| j jd k	r|d| j| j jpRd 7 }| j jr| j j}|ddkr|ddkrt	dt
 |dd}|ddkr|d	| 7 }q|d
| 7 }n|d7 }|d7 }| j j|d krt	dt
 |d7 }t|}x*| jD ] }| |d }||j qW |  | _| | j_|d }|d| j}|d krn|}	nd||f }	|	|_| ||}
||
_| jj|
 | j|
 | j| _d S )NrM   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/>rb   rW   z{%s}%s)rK   r   r/   r   r   rB   ZcoercePubidfindrt   ru   r   replacer
   Z
fromstringrm   ri   Zaddpreviousr   documentClassrn   Zgetroottreer   getZdefaultNamespacer!   rh   r   r&   rp   r}   rl   )r   rw   ZdocStrZsysidrootcomment_tokencommentr   rW   Z	etree_tagZroot_elementr   r   r   
insertRoot7  sL    


zTreeBuilder.insertRoot)F)N)N)r   r   r   r   r   r   rv   rh   ri   ZfragmentClassr
   implementationr   rj   rH   ro   rs   rx   rk   r}   r   __classcell__r   r   )r|   r   rO      s   
L

rO   )__doc__Z
__future__r   r   r   rt   rer-   rM   r   r	   r   r
   r2   r   Z
lxml.etreerP   compiler3   rd   r!   r0   objectr   r   rH   rN   rO   r   r   r   r   <module>
   s$   
O)