ó
T¸t_c           @   s7  d  Z  d Z d Z d d l Z d d l m Z m Z e e f Z d d l Td 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 e j d	 ƒ d
 Z d „  Z y d d l Z Wn# e k
 r÷ Z e d e ƒ ‚ n Xd e
 j f d „  ƒ  YZ d e
 j f d „  ƒ  YZ  d „  Z! d S(   sí   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>s   0.3iÿÿÿÿN(   t
   StringTypet   UnicodeType(   t   *(   t	   xmlreadert   saxutils(
   t   feature_namespacest   feature_namespace_prefixest   feature_string_interningt   feature_validationt   feature_external_gest   feature_external_pest   property_lexical_handlert   property_declaration_handlert   property_dom_nodet   property_xml_stringt   utf8i   c         C   s"   |  d  k r |  St |  ƒ d Sd  S(   Ni    (   t   Nonet   _decoder(   t   s(    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   _d<   s    s+   libxml2 not available: import error was: %st   Locatorc           B   s;   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   s4   SAX Locator adapter for libxml2.xmlTextReaderLocatorc         C   s   | |  _  d  S(   N(   t   _Locator__locator(   t   selft   locator(    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   __init__K   s    c         C   s   d S(   s6   Return the column number where the current event ends.iÿÿÿÿ(    (   R   (    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   getColumnNumberN   s    c         C   s   |  j  j ƒ  S(   s4   Return the line number where the current event ends.(   R   t
   LineNumber(   R   (    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   getLineNumberR   s    c         C   s   d S(   s3   Return the public identifier for the current event.N(   R   (   R   (    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   getPublicIdV   s    c         C   s   |  j  j ƒ  S(   s3   Return the system identifier for the current event.(   R   t   BaseURI(   R   (    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   getSystemIdZ   s    (   t   __name__t
   __module__t   __doc__R   R   R   R   R   (    (    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyR   H   s   				t   LibXml2Readerc           B   sb   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z RS(
   c         C   s\   t  j j |  ƒ d |  _ d |  _ d |  _ d |  _ d |  _ d  |  _	 d  |  _
 d  |  _ d  S(   Ni    i   (   R   t	   XMLReaderR   t   _LibXml2Reader__nst   _LibXml2Reader__nspfxt   _LibXml2Reader__validatet   _LibXml2Reader__extparamst   _LibXml2Reader__parsingR   t   _LibXml2Reader__lex_handlert   _LibXml2Reader__decl_handlert   _LibXml2Reader__errors(   R   (    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyR   `   s    							c         C   sG   |  j  d  k r g  |  _  n  |  j  j | t | d  t | ƒ ƒ f ƒ d  S(   N(   R+   R   t   appendt   SAXParseExceptionR   (   R   t   argt   msgt   severityR   (    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   _errorHandlero   s
    	c         C   s’   x‚ |  j  D]w \ } } | t j t j f k rA |  j j | ƒ q
 | rq | |  j  d d k rq |  j j | ƒ q
 |  j j | ƒ q
 Wd  |  _  d  S(   Niÿÿÿÿi   (	   R+   t   libxml2t    PARSER_SEVERITY_VALIDITY_WARNINGt   PARSER_SEVERITY_WARNINGt   _err_handlert   warningt
   fatalErrort   errorR   (   R   t   fatalR0   t	   exception(    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   _reportErrorsv   s    	c         C   s%  d |  _  zt | ƒ t k r0 t j | ƒ } n9 t j | ƒ } t j | j ƒ  ƒ } | j	 | j
 ƒ  ƒ } | j |  j d  ƒ |  j r× | j t j d ƒ | j t j d ƒ | j t j d ƒ | j t j |  j ƒ n | j t j d ƒ |  j rt j i  i  ƒ } n t j i  ƒ } g  } |  j j ƒ  xÀ| j ƒ  } | d k rg|  j d  k	 rÌ|  j d ƒ qÌne | d k r–|  j d  k	 r’|  j d ƒ n  Pn6 |  j d  k	 rµ|  j d ƒ n |  j j t  d ƒ ƒ P| j! ƒ  } | d k r$|  j r‹t" | j# ƒ  ƒ t" | j$ ƒ  ƒ f }	 t" | j% ƒ  ƒ }
 i  | _& } i  | _' } g  } xÒ | j( ƒ  rt" | j% ƒ  ƒ } t" | j) ƒ  ƒ } | j* d ƒ rÜt+ | ƒ d k r¤| d } n d  } | j, | ƒ |  j j- | | ƒ |  j. sÜqFqÜn  t" | j# ƒ  ƒ t" | j$ ƒ  ƒ f } | | | <| | | <qFW| j/ ƒ  |  j j0 |	 |
 | ƒ | j1 ƒ  r{|  j j2 |	 |
 ƒ x. | D] } |  j j3 | ƒ q^Wq!| j, | ƒ qêt" | j% ƒ  ƒ }	 i  | _& } x8 | j( ƒ  rät" | j% ƒ  ƒ } t" | j) ƒ  ƒ | | <q­W| j/ ƒ  |  j j4 |	 | ƒ | j1 ƒ  rê|  j j5 |	 ƒ qêq-| d k r¿|  j r |  j j2 t" | j# ƒ  ƒ t" | j$ ƒ  ƒ f t" | j% ƒ  ƒ ƒ xC | j6 ƒ  D] } |  j j3 | ƒ qƒWqê|  j j5 t" | j% ƒ  ƒ ƒ q-| d k rê|  j j7 t" | j) ƒ  ƒ ƒ q-| d	 k r|  j j8 t" | j) ƒ  ƒ ƒ q-| d
 k r@|  j j7 t" | j) ƒ  ƒ ƒ q-| d k r©|  j9 d  k	 rk|  j9 j: ƒ  n  |  j j7 t" | j) ƒ  ƒ ƒ |  j9 d  k	 rê|  j9 j; ƒ  qêq-| d k rí|  j9 d  k	 rà|  j< t" | j% ƒ  ƒ ƒ n  | j= ƒ  q-| d k r'|  j9 d  k	 rê|  j> t" | j% ƒ  ƒ ƒ qêq-| d k ra|  j j? t" | j% ƒ  ƒ t" | j) ƒ  ƒ ƒ q-| d k rž|  j9 d  k	 rê|  j9 j@ t" | j) ƒ  ƒ ƒ qêq-| d k r­q-| d k r¼q-| d k rËq-| d k rÚq-t  d | ƒ ‚ q-| d k r	|  j jA ƒ  n  | jB ƒ  Wd  d |  _  Xd  S(   Ni   i    s"   Read failed (no details available)t   xmlnsi   i   i   i   i   i   i   i   i   i   i
   i   i   s   Unexpected node type %d(C   R(   t   typet   StringTypesR2   t   newTextReaderFilenameR   t   prepare_input_sourcet   inputBuffert   getByteStreamt   newTextReaderR   t   SetErrorHandlerR1   R   R'   t   SetParserPropt   PARSER_LOADDTDt   PARSER_DEFAULTATTRSt   PARSER_SUBST_ENTITIESt   PARSER_VALIDATER&   R$   R   t   AttributesNSImplt   AttributesImplt   _cont_handlert   startDocumentt   ReadR+   R;   R5   R7   t   SAXExceptiont   NodeTypeR   t   NamespaceUrit	   LocalNamet   Namet   _attrst   _qnamest   MoveToNextAttributet   Valuet
   startswitht   lenR,   t   startPrefixMappingR%   t   MoveToElementt   startElementNSt   IsEmptyElementt   endElementNSt   endPrefixMappingt   startElementt
   endElementt   popt
   characterst   ignorableWhitespaceR)   t
   startCDATAt   endCDATAt   startEntityt   ResolveEntityt	   endEntityt   processingInstructiont   commentt   endDocumentt   Close(   R   t   sourcet   readert   inputt   attributesNSImplt   attributesImplt   prefixest   rt   nodeTypet   eltNamet   eltQNamet   attrst   qnamest   newPrefixest   qnamet   valuet	   newPrefixt   attNamet   prefix(    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   parse…   sô    						
		

	
	
		!	%"c         C   s   t  d ƒ ‚ d  S(   Ns   DTDHandler not supported(   t   SAXNotSupportedException(   R   t   handler(    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   setDTDHandler0  s    c         C   s   t  d ƒ ‚ d  S(   Ns   EntityResolver not supported(   R   (   R   t   resolver(    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   setEntityResolver4  s    c         C   sp   | t  k r |  j S| t k r& |  j S| t k r9 |  j S| t k rI d S| t k r\ |  j St	 d | ƒ ‚ d  S(   Ni   s   Feature '%s' not recognized(
   R   R$   R   R%   R   R&   R	   R
   R'   t   SAXNotRecognizedException(   R   t   name(    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt
   getFeature8  s    c         C   s¾   |  j  r t d | ƒ ‚ n  | t k r4 | |  _ n† | t k rL | |  _ nn | t k rd | |  _ nV | t k r’ | d k rº t d | ƒ ‚ qº n( | t	 k rª | |  _
 n t d | ƒ ‚ d  S(   Ns#   Cannot set feature %s while parsingi    s   Feature '%s' not supporteds   Feature '%s' not recognized(   R(   R   R   R$   R   R%   R   R&   R	   R
   R'   R†   (   R   R‡   t   state(    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt
   setFeatureG  s"    	c         C   s:   | t  k r |  j S| t k r& |  j St d | ƒ ‚ d  S(   Ns   Property '%s' not recognized(   R   R)   R   R*   R†   (   R   R‡   (    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   getProperty\  s    c         C   sT   | t  k r | |  _ n8 | t k r@ t d | ƒ ‚ | |  _ n t d | ƒ ‚ d  S(   Ns   Property '%s' not supporteds   Property '%s' not recognized(   R   R)   R   R   R*   R†   (   R   R‡   R|   (    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   setPropertye  s    
(   R   R    R   R1   R;   R€   Rƒ   R…   Rˆ   RŠ   R‹   RŒ   (    (    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyR"   ^   s   				«						c           C   s   t  ƒ  S(   N(   R"   (    (    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   create_parserq  s    ("   R!   t
   __author__t   __version__t   codecst   typesR    R   R>   t   xml.sax._exceptionst   xml.saxR   R   t   xml.sax.handlerR   R   R   R   R	   R
   R   R   R   R   t   lookupR   R   R2   t   ImportErrort   et   SAXReaderNotAvailableR   R#   R"   R   (    (    (    s1   /usr/lib64/python2.7/site-packages/drv_libxml2.pyt   <module>#   s&   
F	ÿ 