a
    $i%                     @   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yf   dd ZY n0 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   V/var/www/staging/api/virtual_environments/venv/lib/python3.9/site-packages/lxml/sax.py_GenericAlias   s    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   s8   | d dkr,d| v r,t | dd  ddS d | fS d 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 rBtj	}|| _
d S N)r   __init___root_root_siblings_element_stack_default_ns_ns_mapping_new_mappingsr   ZElement_makeelement)selfZ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   s   d S r   r   )r'   locatorr   r   r   setDocumentLocator<   s    z,ElementTreeContentHandler.setDocumentLocatorc                 C   s   d S r   r   r(   r   r   r   startDocument?   s    z'ElementTreeContentHandler.startDocumentc                 C   s   d S r   r   r(   r   r   r   endDocumentB   s    z%ElementTreeContentHandler.endDocumentc                 C   sP   || j |< z| j| | W n ty<   |g| j|< Y n0 |d u rL|| _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 N)r$   popr#   )r'   r1   Zns_uri_listr   r   r   endPrefixMappingN   s    
z*ElementTreeContentHandler.endPrefixMappingc                 C   s4   |\}}|rd| }n| j r,d| j |f }n|}|S )N{%s}%s)r#   )r'   Zns_name_tuplens_uri
local_nameel_tagr   r   r   	_buildTagT   s    
z#ElementTreeContentHandler._buildTagc                 C   s   |  |}|rli }z| }W n ty8   | }Y n0 |D ]*\}}|d rXd| }	n|d }	|||	< q>nd }| j}
| jd u r| ||| j }| _| jrt	|dr| jD ]}|
| q| jd d = nt|
d ||| j}|
| | j  d S )Nr   r8   r   addpreviousr5   )r<   	iteritemsAttributeErroritemsr"   r    r&   r%   r!   hasattrr=   r   r/   clear)r'   ns_nameqname
attributesZel_nameattrsZiter_attributesZ
name_tuplevalue	attr_nameZelement_stackelementsiblingr   r   r   startElementNS^   s4    





z(ElementTreeContentHandler.startElementNSc                 C   s6   t ||}| jd u r"| j| n| jd | d S r4   )r   r    r!   r/   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"   r6   r<   r   r   )r'   rC   rD   rI   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>       z:ElementTreeContentHandler.startElement.<locals>.<dictcomp>)r@   rK   )r'   namerE   r   r   r   startElement   s    z&ElementTreeContentHandler.startElementc                 C   s   |  d |f| d S r   )rP   )r'   rV   r   r   r   
endElement   s    z$ElementTreeContentHandler.endElementc                 C   sN   | j d }z|d }W n" ty8   |jp,d| |_Y n0 |jpBd| |_d S )Nr5    )r"   
IndexErrortexttail)r'   rM   Z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__)N)N)N)r   r   r   r   r   r)   propertyr   r,   r-   r.   r3   r7   r<   rK   rO   rP   rW   rX   r]   ZignorableWhitespacer^   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0 || _|| _ddlm} || _|i i | _d S )Nr   )AttributesNSImpl)Zgetrootr?   _element_content_handlerZxml.sax.xmlreaderra   _attr_class_empty_attributes)r'   element_or_treecontent_handlerrI   Z
attr_classr   r   r   r      s    
zElementTreeProducer.__init__c                 C   s   | j   | j}t|drjg }| }t|dd tu rJ|| | }q&|d d d D ]}| |i  qX| |i  t|dr|	 }t|dd tu r| |i  |	 }q| j 
  d S )Ngetpreviousr   r5   getnext)rc   r-   rb   rA   rh   getattrr   r/   _recursive_saxifyri   r.   )r'   rI   ZsiblingsrJ   r   r   r   saxify   s"    





zElementTreeProducer.saxifyc                 C   s  | j }|j}|tu s|tu rL|tu r4||j|j |j}|rH|| d S |j	}g }||kr|
 D ]$\}}	|||	krf|||	f qf|
 }
|
ri }i }|
D ]8\}}t|}|||< | j|d |d |d dd||< q| ||}n| j}t|\}	}| j|	|||jdd}|D ]\}}||| q||	|f|| |j}|rX|| |D ]}| || q\||	|f| |D ]\}}|| q|j}|r|| d S )Nr   r   T)preferred_prefixis_attributeF)rn   )rc   r   r   r   rO   rL   r[   r\   r]   nsmapr@   getr/   r   _build_qnamerd   re   r1   r3   rK   rk   rP   r7   )r'   rI   Zparent_nsmaprg   r   r\   Zelement_nsmapZnew_prefixesr1   r9   attribsZattr_valuesZattr_qnamesZattr_ns_namerG   Zattr_ns_tupleZsax_attributesr:   rD   r2   r[   childr   r   r   rk      sd    


z%ElementTreeProducer._recursive_saxifyc                    sv    d u r|S |s$| | kr$|}n: fdd| D }t|dkrN|d n|rZt|nd }|d u rj|S |d | S )Nc                    s$   g | ]\}}|d ur| kr|qS r   r   )rQ   pfxr2   r9   r   r   
<listcomp>	  s   z4ElementTreeProducer._build_qname.<locals>.<listcomp>r   r   :)rp   r@   lenmin)r'   r9   r:   ro   rm   rn   r1   
candidatesr   ru   r   rq     s    
z ElementTreeProducer._build_qnameN)r   r   r   r   r   rl   rk   rq   r   r   r   r   r`      s
   6r`   c                 C   s   t | | S )zlOne-shot helper to generate SAX events from an XML tree and fire
    them against a SAX ContentHandler.
    )r`   rl   )rf   rg   r   r   r   rl     s    rl   N)r   Zxml.sax.handlerr   Zlxmlr   Z
lxml.etreer   r   r   r   typesr   r   ImportErrorZ	LxmlErrorr   r   r   r`   rl   r   r   r   r   <module>   s   s