o
    j%                     @   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   I/var/www/html/Deteccion_Ine/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   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      d S r   r   )r(   Zlocatorr   r   r   setDocumentLocator<      z,ElementTreeContentHandler.setDocumentLocatorc                 C   r,   r   r   r)   r   r   r   startDocument?   r.   z'ElementTreeContentHandler.startDocumentc                 C   r,   r   r   r)   r   r   r   endDocumentB   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   startPrefixMappingE   s   

z,ElementTreeContentHandler.startPrefixMappingc                 C   s,   | j | }|  |d u r|d | _d S d S N)r%   popr$   )r(   r3   Z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(   Z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   addpreviousr7   )r>   	iteritemsAttributeErroritemsr#   r!   r'   r&   r"   hasattrr?   r   r1   clear)r(   ns_nameqname
attributesZel_nameattrsZiter_attributesZ
name_tuplevalue	attr_nameZ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 r6   )r   r!   r"   r1   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#   r8   r>   r   r   )r(   rE   rF   rK   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>)rB   rM   )r(   namerG   r   r   r   startElement   s   z&ElementTreeContentHandler.startElementc                 C   s   |  d |f| d S r   )rR   )r(   rW   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 )Nr7    )r#   
IndexErrortexttail)r(   rO   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__r   )r   r   r   r   r    r*   propertyr   r-   r/   r0   r5   r9   r>   rM   rQ   rR   rX   rY   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w || _|| _ddlm} || _|i i | _d S )Nr   )AttributesNSImpl)ZgetrootrA   _element_content_handlerZxml.sax.xmlreaderrb   _attr_class_empty_attributes)r(   element_or_treecontent_handlerrK   Z
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   r7   getnext)rd   r/   rc   rC   ri   getattrr   r1   _recursive_saxifyrj   r0   )r(   rK   ZsiblingsrL   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)ro   )rd   r   r   r   rQ   rN   r\   r]   r^   nsmaprB   getr1   r   _build_qnamere   rf   r3   r5   rM   rl   rR   r9   )r(   rK   Zparent_nsmaprh   r   r]   Zelement_nsmapZnew_prefixesr3   r;   attribsZattr_valuesZattr_qnamesZattr_ns_namerI   Zattr_ns_tupleZsax_attributesr<   rF   r4   r\   childr   r   r   rl      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   )rS   pfxr4   r;   r   r   
<listcomp>	  s
    z4ElementTreeProducer._build_qname.<locals>.<listcomp>r   r   :)rq   rB   lenmin)r(   r;   r<   rp   rn   ro   r3   
candidatesr   rv   r   rr     s   
z ElementTreeProducer._build_qnameN)r   r   r   r   r    rm   rl   rr   r   r   r   r   ra      s    6ra   c                 C   s   t | | S )zlOne-shot helper to generate SAX events from an XML tree and fire
    them against a SAX ContentHandler.
    )ra   rm   )rg   rh   r   r   r   rm     s   rm   N)r   Zxml.sax.handlerr   Zlxmlr   Z
lxml.etreer   r   r   r   typesr   r   ImportErrorZ	LxmlErrorr   r   r   ra   rm   r   r   r   r   <module>   s    s