a
    %ñ»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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   ú.E:\soccer\ml_env\Lib\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'   Z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'   r0   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r¼t	|dƒr¼| jD ]}| 
|¡ q¬| jd d …= nt|
d ||| jƒ}|
 |¡ | j ¡  d S )Nr   r7   r   Úaddpreviousr4   )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 r3   )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"   r5   r;   r   r   )r'   rB   rC   rH   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?   rJ   )r'   ÚnamerD   r   r   r   ÚstartElementŒ   s    z&ElementTreeContentHandler.startElementc                 C   s   |   d |f|¡ d S r   )rO   )r'   rU   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 )Nr4   Ú )r"   Ú
IndexErrorÚtextÚtail)r'   rL   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-   r2   r6   r;   rJ   rN   rO   rV   rW   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.xmlreaderr`   Ú_attr_classÚ_empty_attributes)r'   Úelement_or_treeÚcontent_handlerrH   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   r4   Úgetnext)rb   r,   ra   r@   rg   Úgetattrr   r.   Ú_recursive_saxifyrh   r-   )r'   rH   ZsiblingsrI   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| 
¡ }
|
rìi }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)rm   )rb   r   r   r   rN   rK   rZ   r[   r\   Únsmapr?   Úgetr.   r   Ú_build_qnamerc   rd   r0   r2   rJ   rj   rO   r6   )r'   rH   Zparent_nsmaprf   r   r[   Zelement_nsmapZnew_prefixesr0   r8   ÚattribsZattr_valuesZattr_qnamesZattr_ns_namerF   Zattr_ns_tupleZsax_attributesr9   rC   r1   rZ   Úchildr   r   r   rj   Ë   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   )rP   Úpfxr1   ©r8   r   r   Ú
<listcomp>	  s   ÿz4ElementTreeProducer._build_qname.<locals>.<listcomp>r   r   ú:)ro   r?   ÚlenÚmin)r'   r8   r9   rn   rl   rm   r0   Ú
candidatesr   rt   r   rp     s    
ÿýz ElementTreeProducer._build_qnameN)r   r   r   r   r   rk   rj   rp   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_   rk   )re   rf   r   r   r   rk     s    rk   N)r   Zxml.sax.handlerr   Zlxmlr   Z
lxml.etreer   r   r   r   Útypesr   r   ÚImportErrorZ	LxmlErrorr   r   r   r_   rk   r   r   r   r   Ú<module>   s   s