o
    6Âµh<  ã                   @   s  d Z dZdZddlZddlZejd dk r,e e¡d ZeefZ	e 
d¡d Zdd	„ ZneZ	d
d	„ ZddlT ddlmZmZ ddlmZmZmZmZmZmZmZmZmZmZ zddlZW n eym   ede ¡ d  ƒ‚w G dd„ dej ƒZ G dd„ dej!ƒZ"dd„ Z#dS )aí   A SAX2 driver for libxml2, on top of it's XmlReader API

USAGE
    # put this file (drv_libxml2.py) in PYTHONPATH
    import xml.sax
    reader = xml.sax.make_parser(["drv_libxml2"])
    # ...and the rest is standard python sax.

CAVEATS
    - Lexical handlers are supported, except for start/endEntity
      (waiting for XmlReader.ResolveEntity) and start/endDTD
    - Error callbacks are not exactly synchronous, they tend
      to be invoked before the corresponding content callback,
      because the underlying reader interface parses
      data by chunks of 512 bytes
    
TODO
    - search for TODO
    - some ErrorHandler events (warning)
    - some ContentHandler events (setDocumentLocator, skippedEntity)
    - EntityResolver (using libxml2.?)
    - DTDHandler (if/when libxml2 exposes such node types)
    - DeclHandler (if/when libxml2 exposes such node types)
    - property_xml_string?
    - feature_string_interning?
    - Incremental parser
    - additional performance tuning:
      - one might cache callbacks to avoid some name lookups
      - one might implement a smarter way to pass attributes to startElement
        (some kind of lazy evaluation?)
      - there might be room for improvement in start/endPrefixMapping
      - other?

u    StÃ©phane Bidoul <sbi@skynet.be>z0.3é    Né   Úutf8é   c                 C   s   | d u r| S t | ƒd S )Nr   )Ú_decoder©Ús© r   ú-/usr/lib/python3/dist-packages/drv_libxml2.pyÚ_d1   s   r
   c                 C   s   | S ©Nr   r   r   r   r	   r
   9   s   )Ú*)Ú	xmlreaderÚsaxutils)
Úfeature_namespacesÚfeature_namespace_prefixesÚfeature_string_interningÚfeature_validationÚfeature_external_gesÚfeature_external_pesÚproperty_lexical_handlerÚproperty_declaration_handlerÚproperty_dom_nodeÚproperty_xml_stringz+libxml2 not available: import error was: %sc                   @   s8   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ ZdS )ÚLocatorz4SAX Locator adapter for libxml2.xmlTextReaderLocatorc                 C   s
   || _ d S r   )Ú_Locator__locator)ÚselfÚlocatorr   r   r	   Ú__init__S   s   
zLocator.__init__c                 C   ó   dS )z6Return the column number where the current event ends.éÿÿÿÿr   ©r   r   r   r	   ÚgetColumnNumberV   ó   zLocator.getColumnNumberc                 C   ó
   | j  ¡ S )z4Return the line number where the current event ends.)r   Ú
LineNumberr    r   r   r	   ÚgetLineNumberZ   ó   
zLocator.getLineNumberc                 C   r   )z3Return the public identifier for the current event.Nr   r    r   r   r	   ÚgetPublicId^   r"   zLocator.getPublicIdc                 C   r#   )z3Return the system identifier for the current event.)r   ÚBaseURIr    r   r   r	   ÚgetSystemIdb   r&   zLocator.getSystemIdN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r!   r%   r'   r)   r   r   r   r	   r   P   s    r   c                   @   s\   e Z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S )ÚLibXml2Readerc                 C   s@   t j | ¡ d| _d| _d| _d| _d| _d | _d | _	d | _
d S )Nr   r   )r   Ú	XMLReaderr   Ú_LibXml2Reader__nsÚ_LibXml2Reader__nspfxÚ_LibXml2Reader__validateÚ_LibXml2Reader__extparamsÚ_LibXml2Reader__parsingÚ_LibXml2Reader__lex_handlerÚ_LibXml2Reader__decl_handlerÚ_LibXml2Reader__errorsr    r   r   r	   r   h   s   
zLibXml2Reader.__init__c                 C   s0   | j d u rg | _ | j  |t|d t|ƒƒf¡ d S r   )r7   ÚappendÚSAXParseExceptionr   )r   ÚargÚmsgÚseverityr   r   r   r	   Ú_errorHandlerw   s   
ÿ
ÿzLibXml2Reader._errorHandlerc                 C   sh   | j D ]+\}}|tjtjfv r| j |¡ q|r(|| j d d u r(| j |¡ q| j |¡ qd | _ d S )Nr   r   )r7   Úlibxml2Ú PARSER_SEVERITY_VALIDITY_WARNINGÚPARSER_SEVERITY_WARNINGÚ_err_handlerÚwarningÚ
fatalErrorÚerror)r   Úfatalr<   Ú	exceptionr   r   r	   Ú_reportErrors~   s   ÿ
zLibXml2Reader._reportErrorsc                 C   sV  d| _ z¢t|tƒrt |¡}nt |¡}| ¡ }|d u r!| ¡ }t 	|¡}| 
| ¡ ¡}| | jd ¡ | jrU| tjd¡ | tjd¡ | tjd¡ | tj| j¡ n| tjd¡ | jrft i i ¡}nt i ¡}g }| j ¡  	 | ¡ }|dkr†| jd ur…|  d¡ n%|dkr–| jd ur”|  d¡ ný| jd ur¡|  d¡ n| j t dƒ¡ nè| !¡ }	|	dkr| jrRt"| #¡ ƒt"| $¡ ƒf}
t"| %¡ ƒ}i  |_&}i  |_'}g }| (¡ r%t"| %¡ ƒ}t"| )¡ ƒ}| *d¡rt+|ƒdkrú|dd … }nd }| ,|¡ | j -||¡ | j.sqÖt"| #¡ ƒt"| $¡ ƒf}|||< |||< | (¡ sÛ| /¡  | j 0|
||¡ | 1¡ rK| j 2|
|¡ |D ]	}| j 3|¡ q?nG| ,|¡ n@t"| %¡ ƒ}
i  |_&}| (¡ rut"| %¡ ƒ}t"| )¡ ƒ||< | (¡ sb| /¡  | j 4|
|¡ | 1¡ r‹| j 5|
¡ n|	dkrÅ| jrº| j 2t"| #¡ ƒt"| $¡ ƒft"| %¡ ƒ¡ | 6¡ D ]	}| j 3|¡ q¯nØ| j 5t"| %¡ ƒ¡ nÍ|	dkrÕ| j 7t"| )¡ ƒ¡ n½|	d	krå| j 8t"| )¡ ƒ¡ n­|	d
krõ| j 7t"| )¡ ƒ¡ n|	dkr| j9d ur| j9 :¡  | j 7t"| )¡ ƒ¡ | j9d ur| j9 ;¡  nw|	dkr4| j9d ur/|  <t"| %¡ ƒ¡ | =¡  n^|	dkrI| j9d urH|  >t"| %¡ ƒ¡ nI|	dkr^| j ?t"| %¡ ƒt"| )¡ ƒ¡ n4|	dkrt| j9d urs| j9 @t"| )¡ ƒ¡ n|	dkrzn|	dkr€n|	dkr†n|	dkrŒnt d|	 ƒ‚qs|dkr| j A¡  | B¡  W d| _ d S d| _ w )Nr   r   z"Read failed (no details available)Úxmlnsé   é   é   r   é   é   é   é   é   é   é
   é   é   zUnexpected node type %d)Cr4   Ú
isinstanceÚStringTypesr>   ÚnewTextReaderFilenamer   Úprepare_input_sourceÚgetCharacterStreamÚgetByteStreamÚinputBufferÚnewTextReaderr)   ÚSetErrorHandlerr=   r3   ÚSetParserPropÚPARSER_LOADDTDÚPARSER_DEFAULTATTRSÚPARSER_SUBST_ENTITIESÚPARSER_VALIDATEr2   r0   r   ÚAttributesNSImplÚAttributesImplÚ_cont_handlerÚstartDocumentÚReadr7   rG   rA   rC   ÚSAXExceptionÚNodeTyper
   ÚNamespaceUriÚ	LocalNameÚNameÚ_attrsÚ_qnamesÚMoveToNextAttributeÚValueÚ
startswithÚlenr8   ÚstartPrefixMappingr1   ÚMoveToElementÚstartElementNSÚIsEmptyElementÚendElementNSÚendPrefixMappingÚstartElementÚ
endElementÚpopÚ
charactersÚignorableWhitespacer5   Ú
startCDATAÚendCDATAÚstartEntityÚResolveEntityÚ	endEntityÚprocessingInstructionÚcommentÚendDocumentÚClose)r   ÚsourceÚreaderÚstreamÚinputÚattributesNSImplÚattributesImplÚprefixesÚrÚnodeTypeÚeltNameÚeltQNameÚattrsÚqnamesÚnewPrefixesÚqnameÚvalueÚ	newPrefixÚattNameÚprefixr   r   r	   Úparse   s"  






€


ÿ


ÿ



ÿ

ÿðÿ
ÿ


þÿ
€

þÿ





€


€
ÿ
€



 ÷ 



zLibXml2Reader.parsec                 C   ó   t dƒ‚)NzDTDHandler not supported©ÚSAXNotSupportedException)r   Úhandlerr   r   r	   ÚsetDTDHandler;  ó   zLibXml2Reader.setDTDHandlerc                 C   r›   )NzEntityResolver not supportedrœ   )r   Úresolverr   r   r	   ÚsetEntityResolver?  r    zLibXml2Reader.setEntityResolverc                 C   sP   |t kr| jS |tkr| jS |tkr| jS |tkrdS |tkr"| jS t	d| ƒ‚)Nr   úFeature '%s' not recognized)
r   r0   r   r1   r   r2   r   r   r3   ÚSAXNotRecognizedException©r   Únamer   r   r	   Ú
getFeatureC  s   ÿzLibXml2Reader.getFeaturec                 C   s†   | j r	td| ƒ‚|tkr|| _d S |tkr|| _d S |tkr$|| _d S |tkr4|dkr2td| ƒ‚d S |t	kr=|| _
d S td| ƒ‚)Nz#Cannot set feature %s while parsingr   zFeature '%s' not supportedr£   )r4   r   r   r0   r   r1   r   r2   r   r   r3   r¤   )r   r¦   Ústater   r   r	   Ú
setFeatureR  s*   ÿ


ÿþ
ÿzLibXml2Reader.setFeaturec                 C   s(   |t kr| jS |tkr| jS td| ƒ‚)NúProperty '%s' not recognized)r   r5   r   r6   r¤   r¥   r   r   r	   ÚgetPropertyg  s   ÿzLibXml2Reader.getPropertyc                 C   s2   |t kr	|| _d S |tkrtd| ƒ‚td| ƒ‚)NzProperty '%s' not supportedrª   )r   r5   r   r   r6   r¤   )r   r¦   r–   r   r   r	   ÚsetPropertyp  s   
ÿÿzLibXml2Reader.setPropertyN)r*   r+   r,   r   r=   rG   rš   rŸ   r¢   r§   r©   r«   r¬   r   r   r   r	   r.   f   s     /	r.   c                   C   s   t ƒ S r   )r.   r   r   r   r	   Úcreate_parser|  s   r­   )$r-   Ú
__author__Ú__version__ÚsysÚcodecsÚversion_infoÚunicode_escape_decodeÚstrÚunicoderV   Úlookupr   r
   Úxml.sax._exceptionsÚxml.saxr   r   Úxml.sax.handlerr   r   r   r   r   r   r   r   r   r   r>   ÚImportErrorÚSAXReaderNotAvailableÚexc_infor   r/   r.   r­   r   r   r   r	   Ú<module>   s6   #
0
ÿÿ  