o
    üÞhê%  ã                   @   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	 zddl
mZ W n ey3   dd„ ZY nw 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ÚProcessingInstruction)ÚGenericAliasc                 C   s   | j › d|j › d�S )Nú[ú])Ú__name__©ÚclsÚitem© r   úH/var/www/html/premium_crap/venv/lib/python3.10/site-packages/lxml/sax.pyÚ_GenericAlias   ó   r   c                   @   s   e Zd ZdZdS )ÚSaxErrorzGeneral SAX error.
    N)r   Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r      s    r   c                 C   s4   | d dkrd| v 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 d!„ 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_etree6   s   
z$ElementTreeContentHandler._get_etree)Údocc                 C   ó   d S r   r   )r)   Úlocatorr   r   r   ÚsetDocumentLocator<   ó   z,ElementTreeContentHandler.setDocumentLocatorc                 C   r.   r   r   r+   r   r   r   ÚstartDocument?   r1   z'ElementTreeContentHandler.startDocumentc                 C   r.   r   r   r+   r   r   r   ÚendDocumentB   r1   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   ÚstartPrefixMappingE   s   
ÿ
ÿz,ElementTreeContentHandler.startPrefixMappingc                 C   s,   | j | }| ¡  |d u r|d | _d S d S ©Néÿÿÿÿ)r%   Úpopr$   )r)   r6   Úns_uri_listr   r   r   ÚendPrefixMappingN   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   Ú	_buildTagT   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   r>   r   Úaddpreviousr:   )rC   Ú	iteritemsÚAttributeErrorÚitemsr#   r!   r(   r&   r"   ÚhasattrrD   r   r4   Úclear)r)   Úns_nameÚqnameÚ
attributesÚel_nameÚattrsÚiter_attributesÚ
name_tupleÚvalueÚ	attr_nameÚelement_stackÚelementÚsiblingr   r   r   ÚstartElementNS^   s8   
ÿ

û
ÿ

ÿ
z(ElementTreeContentHandler.startElementNSc                 C   s8   t ||ƒ}| jd u r| j |¡ d S | jd  |¡ d S r9   )r   r!   r"   r4   r#   )r)   ÚtargetÚdataÚpir   r   r   ÚprocessingInstruction   s   

z/ElementTreeContentHandler.processingInstructionc                 C   s.   | j  ¡ }|  |¡}||jkrtd| ƒ‚d S )NzUnexpected element closed: )r#   r;   rC   r   r   )r)   rJ   rK   rT   rB   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>)rG   rV   )r)   ÚnamerL   r   r   r   ÚstartElementŒ   s   z&ElementTreeContentHandler.startElementc                 C   s   |   d |f|¡ d S r   )r[   )r)   r`   r   r   r   Ú
endElement‘   r   z$ElementTreeContentHandler.endElementc                 C   sP   | j d }z|d }W n ty   |jpd| |_Y d S w |jp"d| |_d S )Nr:   Ú )r#   Ú
IndexErrorÚtextÚtail)r)   rX   Úlast_elementr   r   r   Ú
characters”   s   
þz$ElementTreeContentHandler.charactersc                 C   s
   t | |ƒS r   )r   r   r   r   r   Ú__class_getitem__¢   s   
z+ElementTreeContentHandler.__class_getitem__r   )r   r   r   r   r    r,   Úpropertyr   r0   r2   r3   r8   r=   rC   rV   rZ   r[   ra   rb   rh   ÚignorableWhitespaceri   r   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)ÚgetrootrF   Ú_elementÚ_content_handlerÚxml.sax.xmlreaderrm   Ú_attr_classÚ_empty_attributes)r)   Úelement_or_treeÚcontent_handlerrT   Ú
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   r:   Úgetnext)rp   r2   ro   rH   rw   Úgetattrr   r4   Ú_recursive_saxifyrx   r3   )r)   rT   ÚsiblingsrU   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)r~   )rp   r   r   r   rZ   rW   re   rf   rh   ÚnsmaprG   Úgetr4   r   Ú_build_qnamerr   rs   r6   r8   rV   rz   r[   r=   )r)   rT   Úparent_nsmapru   r   rf   Úelement_nsmapÚnew_prefixesr6   r@   ÚattribsÚattr_valuesÚattr_qnamesÚattr_ns_namerQ   Úattr_ns_tupleÚsax_attributesrA   rK   r7   re   Úchildr   r   r   rz   Ë   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   )r\   Úpfxr7   ©r@   r   r   Ú
<listcomp>	  s
    ÿz4ElementTreeProducer._build_qname.<locals>.<listcomp>r   r   ú:)r€   rG   ÚlenÚmin)r)   r@   rA   r   r}   r~   r6   Ú
candidatesr   r�   r   r�     s   
ÿýz ElementTreeProducer._build_qnameN)r   r   r   r   r    r|   rz   r�   r   r   r   r   rl   ¦   s    6rl   c                 C   s   t | |ƒ ¡ S )zlOne-shot helper to generate SAX events from an XML tree and fire
    them against a SAX ContentHandler.
    )rl   r|   )rt   ru   r   r   r   r|     s   r|   N)r   Úxml.sax.handlerr   Úlxmlr   Ú
lxml.etreer   r   r   r   Útypesr   r   ÚImportErrorÚ	LxmlErrorr   r   r   rl   r|   r   r   r   r   Ú<module>   s    þs