B
    ï¥à`X=  ã               @   s¦  d Z dZddlT ddlmZmZ ddlmZ ddlmZmZ ddlm	Z	 ddlm
Z
mZ dd	lZejd	d
… dkr|edd	ƒ‚[yddlmZ W n ek
r¬   edd	ƒ‚Y nX eedƒsÂedd	ƒ‚ddlmZmZmZ ejZejZydd	lZW n ek
r   dd„ ZY nX dd	lZejZ[[G dd„ dƒZG dd„ dejƒZG dd„ dej ejƒZ!dd„ Z"e#dkr¢dd	l$Z%e"ƒ Z&e& 'e%j(j )¡ ¡ e& *e%j( +¡ ¡ e& ,d¡ d	S )z]
SAX driver for the pyexpat C module.  This driver works with
pyexpat.__version__ == '2.22'.
z0.20é    )Ú*)Úfeature_validationÚfeature_namespaces)Úfeature_namespace_prefixes)Úfeature_external_gesÚfeature_external_pes)Úfeature_string_interning)Úproperty_xml_stringÚproperty_interning_dictNé   Zjavazexpat not available in Java)Úexpatzexpat not supportedÚParserCreate)Ú	xmlreaderÚsaxutilsÚhandlerc             C   s   | S )N© )Úor   r   ú)/usr/lib/python3.7/xml/sax/expatreader.pyÚ_mkproxy'   s    r   c               @   s   e Zd ZdS )Ú_ClosedParserN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   .   s   r   c               @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚExpatLocatorz¼Locator for use with the ExpatParser class.

    This uses a weak reference to the parser object to avoid creating
    a circular reference between the parser and the content handler.
    c             C   s   t |ƒ| _d S )N)r   Ú_ref)ÚselfÚparserr   r   r   Ú__init__9   s    zExpatLocator.__init__c             C   s   | j }|jd krd S |jjS )N)r   Ú_parserÚErrorColumnNumber)r   r   r   r   r   ÚgetColumnNumber<   s    
zExpatLocator.getColumnNumberc             C   s   | j }|jd krdS |jjS )Né   )r   r   ÚErrorLineNumber)r   r   r   r   r   ÚgetLineNumberB   s    
zExpatLocator.getLineNumberc             C   s   | j }|d krd S |j ¡ S )N)r   Ú_sourceÚgetPublicId)r   r   r   r   r   r%   H   s    zExpatLocator.getPublicIdc             C   s   | j }|d krd S |j ¡ S )N)r   r$   ÚgetSystemId)r   r   r   r   r   r&   N   s    zExpatLocator.getSystemIdN)	r   r   r   Ú__doc__r   r    r#   r%   r&   r   r   r   r   r   3   s   r   c               @   s  e Zd ZdZdCdd„Zdd„ Zdd	„ Zd
d„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdDdd„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd d!„ Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Zd<d=„ Z d>d?„ Z!d@dA„ Z"dBS )EÚExpatParserz$SAX driver for the pyexpat C module.r   éìÿ  c             C   sF   t j | |¡ t  ¡ | _d | _|| _d | _d| _g | _	d| _
d | _d S )Nr   )r   ÚIncrementalParserr   ZInputSourcer$   r   Ú_namespacesÚ_lex_handler_propÚ_parsingÚ_entity_stackÚ_external_gesÚ
_interning)r   ZnamespaceHandlingÚbufsizer   r   r   r   Z   s    
zExpatParser.__init__c             C   sV   t  |¡}|| _y*|  ¡  | j t| ƒ¡ tj 	| |¡ W n   |  
¡  ‚ Y nX dS )z3Parse an XML document from a URL or an InputSource.N)r   Úprepare_input_sourcer$   ÚresetÚ_cont_handlerZsetDocumentLocatorr   r   r*   ÚparseÚ_close_source)r   Úsourcer   r   r   r5   g   s    
zExpatParser.parsec             C   s    |  ¡ d k	r| j |  ¡ ¡ d S )N)r&   r   ZSetBase)r   r7   r   r   r   ÚprepareParserw   s    zExpatParser.prepareParserc             C   s    t j | |¡ | jr|  ¡  d S )N)r   r*   ÚsetContentHandlerr-   Ú_reset_cont_handler)r   r   r   r   r   r9   }   s    zExpatParser.setContentHandlerc             C   sP   |t kr| jS |tkr | jd k	S |tttfkr2dS |tkr@| jS t	d| ƒ‚d S )Nr   zFeature '%s' not recognized)
r   r+   r   r0   r   r   r   r   r/   ÚSAXNotRecognizedException)r   Únamer   r   r   Ú
getFeature‚   s    
zExpatParser.getFeaturec             C   s¦   | j rtdƒ‚|tkr|| _n„|tkr.|| _nt|tkrT|rL| jd krRi | _q¢d | _nN|tkrj|r¢tdƒ‚n8|t	kr€|r¢tdƒ‚n"|t
kr–|r¢tdƒ‚ntd| ƒ‚d S )Nz!Cannot set features while parsingz!expat does not support validationz/expat does not read external parameter entitiesz(expat does not report namespace prefixeszFeature '%s' not recognized)r-   ÚSAXNotSupportedExceptionr   r+   r   r/   r   r0   r   r   r   r;   )r   r<   Ústater   r   r   Ú
setFeatureŽ   s2    
zExpatParser.setFeaturec             C   sd   |t jkr| jS |tkr| jS |tkrT| jrLt| jdƒrB| j ¡ S t	dƒ‚nt
dƒ‚t	d| ƒ‚d S )NÚGetInputContextz=This version of expat does not support getting the XML stringz.XML string cannot be returned when not parsingzProperty '%s' not recognized)r   Úproperty_lexical_handlerr,   r
   r0   r	   r   ÚhasattrrA   r;   r>   )r   r<   r   r   r   ÚgetProperty¬   s    

zExpatParser.getPropertyc             C   sV   |t jkr || _| jrR|  ¡  n2|tkr0|| _n"|tkrFtd| ƒ‚nt	d| ƒ‚d S )NzProperty '%s' cannot be setzProperty '%s' not recognized)
r   rB   r,   r-   Ú_reset_lex_handler_propr
   r0   r	   r>   r;   )r   r<   Úvaluer   r   r   ÚsetProperty¾   s    


zExpatParser.setPropertyc          
   C   sz   | j s|  ¡  d| _ | j ¡  y| j ||¡ W nD tjk
rt } z$tt 	|j
¡|| ƒ}| j |¡ W d d }~X Y nX d S )Nr!   )r-   r3   r4   ZstartDocumentr   ZParser   ÚerrorZSAXParseExceptionZErrorStringÚcodeZ_err_handlerZ
fatalError)r   ÚdataÚisFinalÚeÚexcr   r   r   ÚfeedÎ   s    
zExpatParser.feedc             C   sB   | j }z| ¡ }|d k	r | ¡  W d | ¡ }|d k	r<| ¡  X d S )N)r$   ZgetCharacterStreamÚcloseZgetByteStream)r   r7   Úfiler   r   r   r6   ß   s    zExpatParser._close_sourcec             C   sˆ   | j s| jd kst| jtƒr d S z(| jddd | j ¡  d| _d | _W d d| _| jd k	rztƒ }| jj|_| jj	|_	|| _|  
¡  X d S )NÚ r!   )rK   r   )r.   r   Ú
isinstancer   rN   r4   ZendDocumentr-   r   r"   r6   )r   r   r   r   r   rO   ê   s    




zExpatParser.closec             C   s   | j j| j_| j j| j_d S )N)r4   ÚprocessingInstructionr   ZProcessingInstructionHandlerÚ
charactersZCharacterDataHandler)r   r   r   r   r:   ÿ   s    zExpatParser._reset_cont_handlerc             C   s`   | j }| j}|d kr4d |_d |_d |_d |_d |_n(|j|_|j|_|j	|_| j
|_|j|_d S )N)r,   r   ZCommentHandlerZStartCdataSectionHandlerZEndCdataSectionHandlerZStartDoctypeDeclHandlerZEndDoctypeDeclHandlerÚcommentZ
startCDATAZendCDATAÚstart_doctype_declZendDTD)r   Zlexr   r   r   r   rE     s    z#ExpatParser._reset_lex_handler_propc             C   sú   | j r>tj| j ¡ d| jd| _d| j_| j| j_	| j
| j_n,tj| j ¡ | jd| _| j| j_	| j| j_|  ¡  | j| j_| j| j_| j| j_| j| j_d | _| jr®|  ¡  | j| j_y| j| j_W n tk
rÚ   Y nX | j tj ¡ d| _!g | _"d S )Nú )Úinternr!   r   )#r+   r   r   r$   ZgetEncodingr0   r   Znamespace_prefixesÚstart_element_nsZStartElementHandlerÚend_element_nsZEndElementHandlerÚstart_elementÚend_elementr:   Úunparsed_entity_declZUnparsedEntityDeclHandlerÚnotation_declZNotationDeclHandlerÚstart_namespace_declZStartNamespaceDeclHandlerÚend_namespace_declZEndNamespaceDeclHandlerZ_decl_handler_propr,   rE   Úexternal_entity_refZExternalEntityRefHandlerÚskipped_entity_handlerZSkippedEntityHandlerÚAttributeErrorZSetParamEntityParsingZ*XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONEr-   r.   )r   r   r   r   r3     s6    







zExpatParser.resetc             C   s   | j d krd S | j jS )N)r   r   )r   r   r   r   r    ;  s    
zExpatParser.getColumnNumberc             C   s   | j d krdS | j jS )Nr!   )r   r"   )r   r   r   r   r#   @  s    
zExpatParser.getLineNumberc             C   s
   | j  ¡ S )N)r$   r%   )r   r   r   r   r%   E  s    zExpatParser.getPublicIdc             C   s
   | j  ¡ S )N)r$   r&   )r   r   r   r   r&   H  s    zExpatParser.getSystemIdc             C   s   | j  |t|ƒ¡ d S )N)r4   ZstartElementÚAttributesImpl)r   r<   Úattrsr   r   r   r[   L  s    zExpatParser.start_elementc             C   s   | j  |¡ d S )N)r4   Z
endElement)r   r<   r   r   r   r\   O  s    zExpatParser.end_elementc             C   sð   |  ¡ }t|ƒdkrd |f}n&t|ƒdkr<|d |d f}nt|ƒ}i }i }xˆ| ¡ D ]|\}}|  ¡ }t|ƒ}	|	dkr„|}
d |f}n>|	dkr²d|d |d f }
|d |d f}n|d }
t|ƒ}|||< |
||< qVW | j |d t||ƒ¡ d S )Nr!   é   r   z%s:%sé   )ÚsplitÚlenÚtupleÚitemsr4   ZstartElementNSÚAttributesNSImpl)r   r<   re   ÚpairZnewattrsZqnamesZanamerF   ÚpartsÚlengthZqnameZapairr   r   r   rY   R  s.    


zExpatParser.start_element_nsc             C   sV   |  ¡ }t|ƒdkrd |f}n&t|ƒdkr<|d |d f}nt|ƒ}| j |d ¡ d S )Nr!   rf   r   )rh   ri   rj   r4   ZendElementNS)r   r<   rm   r   r   r   rZ   t  s    
zExpatParser.end_element_nsc             C   s   | j  ||¡ d S )N)r4   rS   )r   ÚtargetrJ   r   r   r   Úprocessing_instruction€  s    z"ExpatParser.processing_instructionc             C   s   | j  |¡ d S )N)r4   rT   )r   rJ   r   r   r   Úcharacter_data„  s    zExpatParser.character_datac             C   s   | j  ||¡ d S )N)r4   ZstartPrefixMapping)r   ÚprefixZurir   r   r   r_   ‡  s    z ExpatParser.start_namespace_declc             C   s   | j  |¡ d S )N)r4   ZendPrefixMapping)r   rs   r   r   r   r`   Š  s    zExpatParser.end_namespace_declc             C   s   | j  |||¡ d S )N)r,   ZstartDTD)r   r<   ÚsysidÚpubidZhas_internal_subsetr   r   r   rV     s    zExpatParser.start_doctype_declc             C   s   | j  ||||¡ d S )N)Ú_dtd_handlerZunparsedEntityDecl)r   r<   Úbasert   ru   Znotation_namer   r   r   r]     s    z ExpatParser.unparsed_entity_declc             C   s   | j  |||¡ d S )N)rv   ZnotationDecl)r   r<   rw   rt   ru   r   r   r   r^   “  s    zExpatParser.notation_declc             C   s’   | j s
dS | j ||¡}t || j ¡ p*d¡}| j | j	| jf¡ | j	 
|¡| _	|| _ytj | |¡ W n
   dS | jd \| _	| _| jd= dS )Nr!   rQ   r   éÿÿÿÿ)r/   Z_ent_handlerZresolveEntityr   r2   r$   r&   r.   Úappendr   ZExternalEntityParserCreater   r*   r5   )r   Úcontextrw   rt   ru   r7   r   r   r   ra   –  s     
zExpatParser.external_entity_refc             C   s   |rd| }| j  |¡ d S )Nú%)r4   ZskippedEntity)r   r<   Zis_per   r   r   rb   ¬  s    z"ExpatParser.skipped_entity_handlerN)r   r)   )r   )#r   r   r   r'   r   r5   r8   r9   r=   r@   rD   rG   rN   r6   rO   r:   rE   r3   r    r#   r%   r&   r[   r\   rY   rZ   rq   rr   r_   r`   rV   r]   r^   ra   rb   r   r   r   r   r(   W   s@   

'"r(   c              O   s
   t | |ŽS )N)r(   )ÚargsÚkwargsr   r   r   Úcreate_parser´  s    r~   Ú__main__z:http://www.ibiblio.org/xml/examples/shakespeare/hamlet.xml)-r'   ÚversionZxml.sax._exceptionsZxml.sax.handlerr   r   r   r   r   r   r	   r
   ÚsysÚplatformZSAXReaderNotAvailableZxml.parsersr   ÚImportErrorrC   Zxml.saxr   r   r   rd   rl   Ú_weakrefr   ÚweakrefÚproxyr   ZLocatorr   r*   r(   r~   r   Zxml.sax.saxutilsZxmlÚpr9   ZsaxZXMLGeneratorZsetErrorHandlerZErrorHandlerr5   r   r   r   r   Ú<module>   sN   


$  _
