
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
'YL!                 @   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eZdd ZdS )aI  
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 http://codespeak.net/lxml/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   /usr/lib64/python3.6/sax.pyr      s   r   c             C   s0   | d dkr$t | dd  j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S )#ElementTreeContentHandlerz/Build an lxml ElementTree from SAX events.
    Nc             C   sL   t j|  d | _g | _g | _d | _d d gi| _i | _|d k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_etree.   s    z$ElementTreeContentHandler._get_etree)docc             C   s   d S )Nr   )r   Zlocatorr   r   r   setDocumentLocator4   s    z,ElementTreeContentHandler.setDocumentLocatorc             C   s   d S )Nr   )r   r   r   r   startDocument7   s    z'ElementTreeContentHandler.startDocumentc             C   s   d S )Nr   )r   r   r   r   endDocument:   s    z%ElementTreeContentHandler.endDocumentc             C   sR   || j |< y| j| j| W n  tk
r>   |g| j|< Y nX |d krN|| _d S )N)r   r   appendKeyErrorr   )r   prefixurir   r   r   startPrefixMapping=   s    
z,ElementTreeContentHandler.startPrefixMappingc             C   s(   | j | }|j  |d kr$|d | _d S )Nr   )r   popr   )r   r'   Zns_uri_listr   r   r   endPrefixMappingF   s    
z*ElementTreeContentHandler.endPrefixMappingc             C   s4   |\}}|rd| }n| j r,d| j |f }n|}|S )Nz{%s}%s)r   )r   Zns_name_tuplens_uri
local_nameel_tagr   r   r   	_buildTagL   s    
z#ElementTreeContentHandler._buildTagc             C   s   | j |}|rri }y|j }W n tk
r:   |j }Y nX x8|D ]*\}}|d r\d| }	n|d }	|||	< qBW nd }| j}
| jd kr| j||| j }| _| jrt	|drx| jD ]}|j
| qW | jd d = nt|
d ||| j}|
j| | jj  d S )Nr   z{%s}%sr   addpreviousr*   )r0   Z	iteritemsAttributeErroritemsr   r   r   r   r   hasattrr1   r   r%   clear)r   ns_nameqname
attributesZel_nameZattrsZiter_attributesZ
name_tuplevalueZ	attr_nameZelement_stackelementsiblingr   r   r   startElementNSV   s0    





z(ElementTreeContentHandler.startElementNSc             C   s6   t ||}| jd kr"| jj| n| jd j| d S )Nr   r*   )r   r   r   r%   r   )r   targetdataZpir   r   r   processingInstructionw   s    

z/ElementTreeContentHandler.processingInstructionc             C   s.   | j j }| j|}||jkr*td| d S )NzUnexpected element closed: )r   r+   r0   r   r   )r   r6   r7   r:   r/   r   r   r   endElementNS~   s    


z&ElementTreeContentHandler.endElementNSc             C   s0   |rt dd |j D }| jd |f|| d S )Nc             S   s   g | ]\}}d |f|fqS )Nr   ).0kvr   r   r   
<listcomp>   s    z:ElementTreeContentHandler.startElement.<locals>.<listcomp>)dictr3   r<   )r   namer8   r   r   r   startElement   s    z&ElementTreeContentHandler.startElementc             C   s   | j d |f| d S )N)r@   )r   rF   r   r   r   
endElement   s    z$ElementTreeContentHandler.endElementc             C   sP   | j d }y|d }|jpd| |_W n$ tk
rJ   |jp>d| |_Y nX d S )Nr    r*   r*   )r   tail
IndexErrortext)r   r>   Zlast_elementr   r   r   
characters   s    
z$ElementTreeContentHandler.characters)N)N)N)r	   r
   r   r   r   r    propertyr   r"   r#   r$   r)   r,   r0   r<   r?   r@   rG   rH   rM   Z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   sT   y|j  }W n tk
r$   |}Y nX || _|| _ddlm} || _|i i | _d S )Nr   )AttributesNSImpl)Zgetrootr2   _element_content_handlerZxml.sax.xmlreaderrP   _attr_class_empty_attributes)r   element_or_treecontent_handlerr:   Z
attr_classr   r   r   r      s    
zElementTreeProducer.__init__c             C   s   | j j  | j}t|drrg }|j }x&t|dd tkrL|j| |j }q(W x"|d d d D ]}| j|i  q^W | j|i  t|dr|j	 }x(t|dd tkr| j|i  |j	 }qW | j j
  d S )Ngetpreviousr   r   getnextr*   )rR   r#   rQ   r4   rW   getattrr   r%   _recursive_saxifyrX   r$   )r   r:   Zsiblingsr;   r   r   r   saxify   s"    



zElementTreeProducer.saxifyc             C   sx  | j }|j}|tks|tkrJ|tkr4|j|j|j |jrF|j|j d S g }| j	}|j
 }|ri }i }	x:|D ]2\}
}t|
}|||< ||d |d |||	|< qnW | j||	}n| j}t|\}}|||||}x|D ]\}}|j|| qW |j||f|| |jr|j|j x|D ]}| j|| qW |j||f| x|D ]\}}|j| qHW |jrt|j|j d S )Nr   r   )rR   r   r   r   r?   r=   rL   rJ   rM   _build_qnamer3   r   rS   rT   r)   r<   rZ   r@   r,   )r   r:   prefixesrV   r   new_prefixesZbuild_qnameZattribsZattr_valuesZattr_qnamesZattr_ns_namer9   Zattr_ns_tupleZsax_attributesr-   r.   r7   r'   r(   Zchildr   r   r   rZ      sJ    

z%ElementTreeProducer._recursive_saxifyc             C   s\   |d kr|S y|| }W n6 t k
rN   dt|  }||< |j||f Y nX |d | S )Nzns%02d:)r&   lenr%   )r   r-   r.   r]   r^   r'   r   r   r   r\      s    z ElementTreeProducer._build_qnameN)r	   r
   r   r   r   r[   rZ   r\   r   r   r   r   rO      s
   +rO   c             C   s   t | |j S )zlOne-shot helper to generate SAX events from an XML tree and fire
    them against a SAX ContentHandler.
    )rO   r[   )rU   rV   r   r   r   r[      s    r[   N)r   Zxml.sax.handlerr   Zlxmlr   Z
lxml.etreer   r   r   r   Z	LxmlErrorr   r   r   objectrO   r[   r   r   r   r   <module>   s   |Z