home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / var / lib / python-support / python2.4 / drv_libxml2.pyc (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2006-08-31  |  10.7 KB  |  297 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.4)
  3.  
  4. ''' A SAX2 driver for libxml2, on top of it\'s XmlReader API
  5.  
  6. USAGE
  7.     # put this file (drv_libxml2.py) in PYTHONPATH
  8.     import xml.sax
  9.     reader = xml.sax.make_parser(["drv_libxml2"])
  10.     # ...and the rest is standard python sax.
  11.  
  12. CAVEATS
  13.     - Lexical handlers are supported, except for start/endEntity
  14.       (waiting for XmlReader.ResolveEntity) and start/endDTD
  15.     - Error callbacks are not exactly synchronous, they tend
  16.       to be invoked before the corresponding content callback,
  17.       because the underlying reader interface parses
  18.       data by chunks of 512 bytes
  19.     
  20. TODO
  21.     - search for TODO
  22.     - some ErrorHandler events (warning)
  23.     - some ContentHandler events (setDocumentLocator, skippedEntity)
  24.     - EntityResolver (using libxml2.?)
  25.     - DTDHandler (if/when libxml2 exposes such node types)
  26.     - DeclHandler (if/when libxml2 exposes such node types)
  27.     - property_xml_string?
  28.     - feature_string_interning?
  29.     - Incremental parser
  30.     - additional performance tuning:
  31.       - one might cache callbacks to avoid some name lookups
  32.       - one might implement a smarter way to pass attributes to startElement
  33.         (some kind of lazy evaluation?)
  34.       - there might be room for improvement in start/endPrefixMapping
  35.       - other?
  36.  
  37. '''
  38. __author__ = u'St├⌐phane Bidoul <sbi@skynet.be>'
  39. __version__ = '0.3'
  40. import codecs
  41. from types import StringType, UnicodeType
  42. StringTypes = (StringType, UnicodeType)
  43. from xml.sax._exceptions import *
  44. from xml.sax import xmlreader, saxutils
  45. from xml.sax.handler import 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_string
  46. _decoder = codecs.lookup('utf8')[1]
  47.  
  48. def _d(s):
  49.     if s is None:
  50.         return s
  51.     else:
  52.         return _decoder(s)[0]
  53.  
  54.  
  55. try:
  56.     import libxml2
  57. except ImportError:
  58.     e = None
  59.     raise SAXReaderNotAvailable('libxml2 not available: import error was: %s' % e)
  60.  
  61.  
  62. class Locator(xmlreader.Locator):
  63.     '''SAX Locator adapter for libxml2.xmlTextReaderLocator'''
  64.     
  65.     def __init__(self, locator):
  66.         self._Locator__locator = locator
  67.  
  68.     
  69.     def getColumnNumber(self):
  70.         '''Return the column number where the current event ends.'''
  71.         return -1
  72.  
  73.     
  74.     def getLineNumber(self):
  75.         '''Return the line number where the current event ends.'''
  76.         return self._Locator__locator.LineNumber()
  77.  
  78.     
  79.     def getPublicId(self):
  80.         '''Return the public identifier for the current event.'''
  81.         pass
  82.  
  83.     
  84.     def getSystemId(self):
  85.         '''Return the system identifier for the current event.'''
  86.         return self._Locator__locator.BaseURI()
  87.  
  88.  
  89.  
  90. class LibXml2Reader(xmlreader.XMLReader):
  91.     
  92.     def __init__(self):
  93.         xmlreader.XMLReader.__init__(self)
  94.         self._LibXml2Reader__ns = 0
  95.         self._LibXml2Reader__nspfx = 0
  96.         self._LibXml2Reader__validate = 0
  97.         self._LibXml2Reader__extparams = 1
  98.         self._LibXml2Reader__parsing = 0
  99.         self._LibXml2Reader__lex_handler = None
  100.         self._LibXml2Reader__decl_handler = None
  101.         self._LibXml2Reader__errors = None
  102.  
  103.     
  104.     def _errorHandler(self, arg, msg, severity, locator):
  105.         if self._LibXml2Reader__errors is None:
  106.             self._LibXml2Reader__errors = []
  107.         
  108.         self._LibXml2Reader__errors.append((severity, SAXParseException(msg, None, Locator(locator))))
  109.  
  110.     
  111.     def _reportErrors(self, fatal):
  112.         for severity, exception in self._LibXml2Reader__errors:
  113.             if severity in (libxml2.PARSER_SEVERITY_VALIDITY_WARNING, libxml2.PARSER_SEVERITY_WARNING):
  114.                 self._err_handler.warning(exception)
  115.                 continue
  116.             if fatal and exception is self._LibXml2Reader__errors[-1][1]:
  117.                 self._err_handler.fatalError(exception)
  118.                 continue
  119.             self._err_handler.error(exception)
  120.         
  121.         self._LibXml2Reader__errors = None
  122.  
  123.     
  124.     def parse(self, source):
  125.         self._LibXml2Reader__parsing = 1
  126.         
  127.         try:
  128.             if type(source) in StringTypes:
  129.                 reader = libxml2.newTextReaderFilename(source)
  130.             else:
  131.                 source = saxutils.prepare_input_source(source)
  132.                 input = libxml2.inputBuffer(source.getByteStream())
  133.                 reader = input.newTextReader(source.getSystemId())
  134.             reader.SetErrorHandler(self._errorHandler, None)
  135.             if self._LibXml2Reader__extparams:
  136.                 reader.SetParserProp(libxml2.PARSER_LOADDTD, 1)
  137.                 reader.SetParserProp(libxml2.PARSER_DEFAULTATTRS, 1)
  138.                 reader.SetParserProp(libxml2.PARSER_SUBST_ENTITIES, 1)
  139.                 reader.SetParserProp(libxml2.PARSER_VALIDATE, self._LibXml2Reader__validate)
  140.             else:
  141.                 reader.SetParserProp(libxml2.PARSER_LOADDTD, 0)
  142.             if self._LibXml2Reader__ns:
  143.                 attributesNSImpl = xmlreader.AttributesNSImpl({ }, { })
  144.             else:
  145.                 attributesImpl = xmlreader.AttributesImpl({ })
  146.             prefixes = []
  147.             self._cont_handler.startDocument()
  148.             while None:
  149.                 r = reader.Read()
  150.                 if r == 1:
  151.                     if self._LibXml2Reader__errors is not None:
  152.                         self._reportErrors(0)
  153.                     
  154.                 elif r == 0:
  155.                     if self._LibXml2Reader__errors is not None:
  156.                         self._reportErrors(0)
  157.                     
  158.                     break
  159.                 elif self._LibXml2Reader__errors is not None:
  160.                     self._reportErrors(1)
  161.                 else:
  162.                     self._err_handler.fatalError(SAXException('Read failed (no details available)'))
  163.                 break
  164.                 nodeType = reader.NodeType()
  165.                 if nodeType == 1:
  166.                     pass
  167.                 if nodeType == 15:
  168.                     if self._LibXml2Reader__ns:
  169.                         self._cont_handler.endElementNS((_d(reader.NamespaceUri()), _d(reader.LocalName())), _d(reader.Name()))
  170.                         for prefix in prefixes.pop():
  171.                             self._cont_handler.endPrefixMapping(prefix)
  172.                         
  173.                     else:
  174.                         self._cont_handler.endElement(_d(reader.Name()))
  175.                 self._LibXml2Reader__ns
  176.                 if nodeType == 3:
  177.                     self._cont_handler.characters(_d(reader.Value()))
  178.                     continue
  179.                 if nodeType == 13:
  180.                     self._cont_handler.ignorableWhitespace(_d(reader.Value()))
  181.                     continue
  182.                 if nodeType == 14:
  183.                     self._cont_handler.characters(_d(reader.Value()))
  184.                     continue
  185.                 if nodeType == 4:
  186.                     if self._LibXml2Reader__lex_handler is not None:
  187.                         self._LibXml2Reader__lex_handler.startCDATA()
  188.                     
  189.                     self._cont_handler.characters(_d(reader.Value()))
  190.                     if self._LibXml2Reader__lex_handler is not None:
  191.                         self._LibXml2Reader__lex_handler.endCDATA()
  192.                     
  193.                 self._LibXml2Reader__lex_handler is not None
  194.                 if nodeType == 5:
  195.                     if self._LibXml2Reader__lex_handler is not None:
  196.                         self.startEntity(_d(reader.Name()))
  197.                     
  198.                     reader.ResolveEntity()
  199.                     continue
  200.                 if nodeType == 16:
  201.                     if self._LibXml2Reader__lex_handler is not None:
  202.                         self.endEntity(_d(reader.Name()))
  203.                     
  204.                 self._LibXml2Reader__lex_handler is not None
  205.                 if nodeType == 7:
  206.                     self._cont_handler.processingInstruction(_d(reader.Name()), _d(reader.Value()))
  207.                     continue
  208.                 if nodeType == 8:
  209.                     if self._LibXml2Reader__lex_handler is not None:
  210.                         self._LibXml2Reader__lex_handler.comment(_d(reader.Value()))
  211.                     
  212.                 self._LibXml2Reader__lex_handler is not None
  213.                 if nodeType == 10:
  214.                     continue
  215.                 if nodeType == 17:
  216.                     continue
  217.                 if nodeType == 6:
  218.                     continue
  219.                 if nodeType == 12:
  220.                     continue
  221.                 raise SAXException('Unexpected node type %d' % nodeType)
  222.             if r == 0:
  223.                 self._cont_handler.endDocument()
  224.             
  225.             reader.Close()
  226.         finally:
  227.             self._LibXml2Reader__parsing = 0
  228.  
  229.  
  230.     
  231.     def setDTDHandler(self, handler):
  232.         raise SAXNotSupportedException('DTDHandler not supported')
  233.  
  234.     
  235.     def setEntityResolver(self, resolver):
  236.         raise SAXNotSupportedException('EntityResolver not supported')
  237.  
  238.     
  239.     def getFeature(self, name):
  240.         if name == feature_namespaces:
  241.             return self._LibXml2Reader__ns
  242.         elif name == feature_namespace_prefixes:
  243.             return self._LibXml2Reader__nspfx
  244.         elif name == feature_validation:
  245.             return self._LibXml2Reader__validate
  246.         elif name == feature_external_ges:
  247.             return 1
  248.         elif name == feature_external_pes:
  249.             return self._LibXml2Reader__extparams
  250.         else:
  251.             raise SAXNotRecognizedException("Feature '%s' not recognized" % name)
  252.  
  253.     
  254.     def setFeature(self, name, state):
  255.         if self._LibXml2Reader__parsing:
  256.             raise SAXNotSupportedException('Cannot set feature %s while parsing' % name)
  257.         
  258.         if name == feature_namespaces:
  259.             self._LibXml2Reader__ns = state
  260.         elif name == feature_namespace_prefixes:
  261.             self._LibXml2Reader__nspfx = state
  262.         elif name == feature_validation:
  263.             self._LibXml2Reader__validate = state
  264.         elif name == feature_external_ges:
  265.             if state == 0:
  266.                 raise SAXNotSupportedException("Feature '%s' not supported" % name)
  267.             
  268.         elif name == feature_external_pes:
  269.             self._LibXml2Reader__extparams = state
  270.         else:
  271.             raise SAXNotRecognizedException("Feature '%s' not recognized" % name)
  272.  
  273.     
  274.     def getProperty(self, name):
  275.         if name == property_lexical_handler:
  276.             return self._LibXml2Reader__lex_handler
  277.         elif name == property_declaration_handler:
  278.             return self._LibXml2Reader__decl_handler
  279.         else:
  280.             raise SAXNotRecognizedException("Property '%s' not recognized" % name)
  281.  
  282.     
  283.     def setProperty(self, name, value):
  284.         if name == property_lexical_handler:
  285.             self._LibXml2Reader__lex_handler = value
  286.         elif name == property_declaration_handler:
  287.             raise SAXNotSupportedException("Property '%s' not supported" % name)
  288.             self._LibXml2Reader__decl_handler = value
  289.         else:
  290.             raise SAXNotRecognizedException("Property '%s' not recognized" % name)
  291.  
  292.  
  293.  
  294. def create_parser():
  295.     return LibXml2Reader()
  296.  
  297.