o
    %e9                     @   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   S/var/www/html/venv/lib/python3.10/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   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st | 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rt
| tstjd	 dksJ d
d| | f  d S d | D ]	}||d  qd 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sJ 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 )Nz@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sixr   r   rh   compilerE   r   r.   rA   objectr   r   r_   rf   rg   r   r   r   r   <module>   s2    
O)