o
    |¨ÊhW$  ã                   @   s€   d Z ddlmZ ddlmZ ddlmZmZ ddlmZm	Z	 G dd„ dej
ƒZdd	„ ZG d
d„ deƒZG dd„ dƒZdd„ ZdS )a?  
SAX-based adapter to copy trees from/to the Python standard library.

Use the `ElementTreeContentHandler` class to build an ElementTree from
SAX events.

Use the `ElementTreeProducer` class or the `saxify()` function to fire
the SAX events of an ElementTree against a SAX ContentHandler.

See https://lxml.de/sax.html
é    )ÚContentHandler)Úetree)ÚElementTreeÚ
SubElement)ÚCommentÚProcessingInstructionc                   @   s   e Zd ZdZdS )ÚSaxErrorzGeneral SAX error.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__© r   r   ú:/var/www/html/env/lib/python3.10/site-packages/lxml/sax.pyr      s    r   c                 C   s,   | d dkrt | dd …  dd¡ƒS d | fS )Nr   Ú{é   Ú})ÚtupleÚsplit)Útagr   r   r   Ú	_getNsTag   s   r   c                   @   s˜   e Zd ZdZd dd„Zdd„ Zeeejd�Zdd	„ Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zd dd„Zdd„ Zdd„ Zd dd„Zdd„ Zdd„ ZeZdS )!ÚElementTreeContentHandlerz/Build an lxml ElementTree from SAX events.
    Nc                 C   sL   t  | ¡ d | _g | _g | _d | _d d gi| _i | _|d u r!tj	}|| _
d S ©N)r   Ú__init__Ú_rootÚ_root_siblingsÚ_element_stackÚ_default_nsÚ_ns_mappingÚ_new_mappingsr   ÚElementÚ_makeelement)ÚselfÚmakeelementr   r   r   r   %   s   

z"ElementTreeContentHandler.__init__c                 C   s
   t | jƒS )z=Contains the generated ElementTree after parsing is finished.)r   r   ©r!   r   r   r   Ú
_get_etree1   s   
z$ElementTreeContentHandler._get_etree)Údocc                 C   ó   d S r   r   )r!   Úlocatorr   r   r   ÚsetDocumentLocator7   ó   z,ElementTreeContentHandler.setDocumentLocatorc                 C   r&   r   r   r#   r   r   r   ÚstartDocument:   r)   z'ElementTreeContentHandler.startDocumentc                 C   r&   r   r   r#   r   r   r   ÚendDocument=   r)   z%ElementTreeContentHandler.endDocumentc                 C   sT   || j |< z
| j|  |¡ W n ty   |g| j|< Y nw |d u r(|| _d S d S r   )r   r   ÚappendÚKeyErrorr   )r!   ÚprefixÚurir   r   r   ÚstartPrefixMapping@   s   
ÿ
ÿz,ElementTreeContentHandler.startPrefixMappingc                 C   s,   | j | }| ¡  |d u r|d | _d S d S ©Néÿÿÿÿ)r   Úpopr   )r!   r.   Úns_uri_listr   r   r   ÚendPrefixMappingI   s
   
ÿz*ElementTreeContentHandler.endPrefixMappingc                 C   s8   |\}}|rd| }|S | j rd| j |f }|S |}|S )Nú{%s}%s)r   )r!   Úns_name_tupleÚns_uriÚ
local_nameÚel_tagr   r   r   Ú	_buildTagO   s   üÿz#ElementTreeContentHandler._buildTagc                 C   sö   |   |¡}|r6i }z| ¡ }W n ty   | ¡ }Y nw |D ]\}}|d r,d| }	n|d }	|||	< qnd }| j}
| jd u re|  ||| j¡ }| _| jr^t	|dƒr^| jD ]}| 
|¡ qV| jd d …= n
t|
d ||| jƒ}|
 |¡ | j ¡  d S )Nr   r6   r   Úaddpreviousr2   )r;   Ú	iteritemsÚAttributeErrorÚitemsr   r   r    r   r   Úhasattrr<   r   r,   Úclear)r!   Úns_nameÚqnameÚ
attributesÚel_nameÚattrsÚiter_attributesÚ
name_tupleÚvalueÚ	attr_nameÚelement_stackÚelementÚsiblingr   r   r   ÚstartElementNSY   s8   
ÿ

û
ÿ

ÿ
z(ElementTreeContentHandler.startElementNSc                 C   s8   t ||ƒ}| jd u r| j |¡ d S | jd  |¡ d S r1   )r   r   r   r,   r   )r!   ÚtargetÚdataÚpir   r   r   ÚprocessingInstructionz   s   

z/ElementTreeContentHandler.processingInstructionc                 C   s.   | j  ¡ }|  |¡}||jkrtd| ƒ‚d S )NzUnexpected element closed: )r   r3   r;   r   r   )r!   rB   rC   rL   r:   r   r   r   ÚendElementNS�   s
   


ÿz&ElementTreeContentHandler.endElementNSc                 C   s,   |rdd„ |  ¡ D ƒ}|  d |f||¡ d S )Nc                 S   s   i | ]	\}}d |f|“qS r   r   )Ú.0ÚkÚvr   r   r   Ú
<dictcomp>‰   s    z:ElementTreeContentHandler.startElement.<locals>.<dictcomp>)r?   rN   )r!   ÚnamerD   r   r   r   ÚstartElement‡   s   z&ElementTreeContentHandler.startElementc                 C   s   |   d |f|¡ d S r   )rS   )r!   rX   r   r   r   Ú
endElementŒ   s   z$ElementTreeContentHandler.endElementc                 C   sN   | j d }z|d }|jpd| |_W d S  ty&   |jpd| |_Y d S w )Nr2   Ú )r   ÚtailÚ
IndexErrorÚtext)r!   rP   Úlast_elementr   r   r   Ú
characters�   s   
þz$ElementTreeContentHandler.charactersr   )r	   r
   r   r   r   r$   Úpropertyr   r(   r*   r+   r0   r5   r;   rN   rR   rS   rY   rZ   r`   ÚignorableWhitespacer   r   r   r   r   "   s$    
	

!

r   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚElementTreeProducerz5Produces SAX events for an element and children.
    c                 C   sR   z|  ¡ }W n ty   |}Y nw || _|| _ddlm} || _|i i ƒ| _d S )Nr   )ÚAttributesNSImpl)Úgetrootr>   Ú_elementÚ_content_handlerÚxml.sax.xmlreaderrd   Ú_attr_classÚ_empty_attributes)r!   Úelement_or_treeÚcontent_handlerrL   Ú
attr_classr   r   r   r   Ÿ   s   ÿzElementTreeProducer.__init__c                 C   sØ   | j  ¡  | j}t|dƒr<g }| ¡ }t|dd ƒtu r,| |¡ | ¡ }t|dd ƒtu s|d d d… D ]}|  |i ¡ q3|  |i ¡ t|dƒre| 	¡ }t|dd ƒtu re|  |i ¡ | 	¡ }t|dd ƒtu sS| j  
¡  d S )NÚgetpreviousr   r2   Úgetnext)rg   r*   rf   r@   rn   Úgetattrr   r,   Ú_recursive_saxifyro   r+   )r!   rL   ÚsiblingsrM   r   r   r   Úsaxifyª   s&   


þ
þzElementTreeProducer.saxifyc                 C   s®  | j }|j}|tu s|tu r&|tu r| |j|j¡ |j}|r$| |¡ d S |j	}g }||krF| 
¡ D ]\}}	| |¡|	krE| ||	f¡ q3| 
¡ }
|
rvi }i }|
D ]\}}t|ƒ}|||< | j|d |d |d dd�||< qR|  ||¡}n| j}t|ƒ\}	}| j|	|||jdd�}|D ]
\}}| ||¡ qŒ| |	|f||¡ |j}|rª| |¡ |D ]}|  ||¡ q¬| |	|f|¡ |D ]	\}}| |¡ q¿|j}|rÕ| |¡ d S d S )Nr   r   T)Úpreferred_prefixÚis_attributeF)ru   )rg   r   r   r   rR   rO   r^   r\   r`   Únsmapr?   Úgetr,   r   Ú_build_qnameri   rj   r.   r0   rN   rq   rS   r5   )r!   rL   Úparent_nsmaprl   r   r\   Úelement_nsmapÚnew_prefixesr.   r8   ÚattribsÚattr_valuesÚattr_qnamesÚattr_ns_namerI   Úattr_ns_tupleÚsax_attributesr9   rC   r/   r^   Úchildr   r   r   rq   Á   sh   ÿ
€þÿ
ÿ
ÿz%ElementTreeProducer._recursive_saxifyc                    sv   ˆ d u r|S |s|  |¡ˆ kr|}n‡ fdd„| ¡ D ƒ}t|ƒdkr'|d n|r-t|ƒnd }|d u r5|S |d | S )Nc                    s$   g | ]\}}|d ur|ˆ kr|‘qS r   r   )rT   Úpfxr/   ©r8   r   r   Ú
<listcomp>ÿ   s
    ÿz4ElementTreeProducer._build_qname.<locals>.<listcomp>r   r   ú:)rw   r?   ÚlenÚmin)r!   r8   r9   rv   rt   ru   r.   Ú
candidatesr   r„   r   rx   ÷   s   
ÿýz ElementTreeProducer._build_qnameN)r	   r
   r   r   r   rs   rq   rx   r   r   r   r   rc   œ   s    6rc   c                 C   s   t | |ƒ ¡ S )zlOne-shot helper to generate SAX events from an XML tree and fire
    them against a SAX ContentHandler.
    )rc   rs   )rk   rl   r   r   r   rs     s   rs   N)r   Úxml.sax.handlerr   Úlxmlr   Ú
lxml.etreer   r   r   r   Ú	LxmlErrorr   r   r   rc   rs   r   r   r   r   Ú<module>   s   zs