[Python-checkins] python/dist/src/Lib/xml/sax expatreader.py,1.30,1.31

loewis@users.sourceforge.net loewis@users.sourceforge.net
Sat, 25 Jan 2003 08:51:52 -0800


Update of /cvsroot/python/python/dist/src/Lib/xml/sax
In directory sc8-pr-cvs1:/tmp/cvs-serv28717

Modified Files:
	expatreader.py 
Log Message:
Merge with PyXML 1.28:
Wrap a lot of long lines.
Clean up a handler for expat.error.

If a lexical handler is set, make sure we call the startDTD() and
endDTD().  If the lexical handler is unset (by setting it to None),
remove the handlers from the underlying pyexpat parser object.
Closes SF bug #485584.

In namespaces mode, make sure we set up the qnames dictionary
correctly for the AttributesNSImpl instance passed to the
start-element-handler.
Closes SF bug #563399.

Support skippedEntity. Fixes #665486.


Index: expatreader.py
===================================================================
RCS file: /cvsroot/python/python/dist/src/Lib/xml/sax/expatreader.py,v
retrieving revision 1.30
retrieving revision 1.31
diff -C2 -d -r1.30 -r1.31
*** expatreader.py	30 Jun 2002 07:27:30 -0000	1.30
--- expatreader.py	25 Jan 2003 16:51:50 -0000	1.31
***************
*** 1,4 ****
  """
! SAX driver for the Pyexpat C module.  This driver works with
  pyexpat.__version__ == '2.22'.
  """
--- 1,4 ----
  """
! SAX driver for the pyexpat C module.  This driver works with
  pyexpat.__version__ == '2.22'.
  """
***************
*** 83,87 ****
  
  class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):
!     "SAX driver for the Pyexpat C module."
  
      def __init__(self, namespaceHandling=0, bufsize=2**16-20):
--- 83,87 ----
  
  class ExpatParser(xmlreader.IncrementalParser, xmlreader.Locator):
!     """SAX driver for the pyexpat C module."""
  
      def __init__(self, namespaceHandling=0, bufsize=2**16-20):
***************
*** 111,115 ****
              self._parser.SetBase(source.getSystemId())
  
!     # Redefined setContentHandle to allow changing handlers during parsing
  
      def setContentHandler(self, handler):
--- 111,115 ----
              self._parser.SetBase(source.getSystemId())
  
!     # Redefined setContentHandler to allow changing handlers during parsing
  
      def setContentHandler(self, handler):
***************
*** 146,159 ****
          elif name == feature_validation:
              if state:
!                 raise SAXNotSupportedException("expat does not support validation")
          elif name == feature_external_pes:
              if state:
!                 raise SAXNotSupportedException("expat does not read external parameter entities")
          elif name == feature_namespace_prefixes:
              if state:
!                 raise SAXNotSupportedException("expat does not report namespace prefixes")
          else:
!             raise SAXNotRecognizedException("Feature '%s' not recognized" %
!                                             name)
  
      def getProperty(self, name):
--- 146,162 ----
          elif name == feature_validation:
              if state:
!                 raise SAXNotSupportedException(
!                     "expat does not support validation")
          elif name == feature_external_pes:
              if state:
!                 raise SAXNotSupportedException(
!                     "expat does not read external parameter entities")
          elif name == feature_namespace_prefixes:
              if state:
!                 raise SAXNotSupportedException(
!                     "expat does not report namespace prefixes")
          else:
!             raise SAXNotRecognizedException(
!                 "Feature '%s' not recognized" % name)
  
      def getProperty(self, name):
***************
*** 167,173 ****
                      return self._parser.GetInputContext()
                  else:
!                     raise SAXNotRecognizedException("This version of expat does not support getting the XML string")
              else:
!                 raise SAXNotSupportedException("XML string cannot be returned when not parsing")
          raise SAXNotRecognizedException("Property '%s' not recognized" % name)
  
--- 170,179 ----
                      return self._parser.GetInputContext()
                  else:
!                     raise SAXNotRecognizedException(
!                         "This version of expat does not support getting"
!                         " the XML string")
              else:
!                 raise SAXNotSupportedException(
!                     "XML string cannot be returned when not parsing")
          raise SAXNotRecognizedException("Property '%s' not recognized" % name)
  
***************
*** 200,206 ****
              # except when invoked from close.
              self._parser.Parse(data, isFinal)
!         except expat.error:
!             error_code = self._parser.ErrorCode
!             exc = SAXParseException(expat.ErrorString(error_code), None, self)
              # FIXME: when to invoke error()?
              self._err_handler.fatalError(exc)
--- 206,211 ----
              # except when invoked from close.
              self._parser.Parse(data, isFinal)
!         except expat.error, e:
!             exc = SAXParseException(expat.ErrorString(e.code), e, self)
              # FIXME: when to invoke error()?
              self._err_handler.fatalError(exc)
***************
*** 222,232 ****
  
      def _reset_lex_handler_prop(self):
!         self._parser.CommentHandler = self._lex_handler_prop.comment
!         self._parser.StartCdataSectionHandler = self._lex_handler_prop.startCDATA
!         self._parser.EndCdataSectionHandler = self._lex_handler_prop.endCDATA
  
      def reset(self):
          if self._namespaces:
!             self._parser = expat.ParserCreate(None, " ", intern = self._interning)
              self._parser.StartElementHandler = self.start_element_ns
              self._parser.EndElementHandler = self.end_element_ns
--- 227,250 ----
  
      def _reset_lex_handler_prop(self):
!         lex = self._lex_handler_prop
!         parser = self._parser
!         if lex is None:
!             parser.CommentHandler = None
!             parser.StartCdataSectionHandler = None
!             parser.EndCdataSectionHandler = None
!             parser.StartDoctypeDeclHandler = None
!             parser.EndDoctypeDeclHandler = None
!         else:
!             parser.CommentHandler = lex.comment
!             parser.StartCdataSectionHandler = lex.startCDATA
!             parser.EndCdataSectionHandler = lex.endCDATA
!             parser.StartDoctypeDeclHandler = self.start_doctype_decl
!             parser.EndDoctypeDeclHandler = lex.endDTD
  
      def reset(self):
          if self._namespaces:
!             self._parser = expat.ParserCreate(None, " ",
!                                               intern=self._interning)
!             self._parser.namespace_prefixes = 1
              self._parser.StartElementHandler = self.start_element_ns
              self._parser.EndElementHandler = self.end_element_ns
***************
*** 249,253 ****
  #         self._parser.NotStandaloneHandler =
          self._parser.ExternalEntityRefHandler = self.external_entity_ref
!         self._parser.SetParamEntityParsing(expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE)
  
          self._parsing = 0
--- 267,277 ----
  #         self._parser.NotStandaloneHandler =
          self._parser.ExternalEntityRefHandler = self.external_entity_ref
!         try:
!             self._parser.SkippedEntityHandler = self.skipped_entity_handler
!         except AttributeError:
!             # This pyexpat does not support SkippedEntity
!             pass
!         self._parser.SetParamEntityParsing(
!             expat.XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE)
  
          self._parsing = 0
***************
*** 282,301 ****
          pair = name.split()
          if len(pair) == 1:
              pair = (None, name)
          else:
              pair = tuple(pair)
  
          newattrs = {}
          for (aname, value) in attrs.items():
!             apair = aname.split()
!             if len(apair) == 1:
                  apair = (None, aname)
              else:
!                 apair = tuple(apair)
  
              newattrs[apair] = value
  
          self._cont_handler.startElementNS(pair, None,
!                                           AttributesNSImpl(newattrs, {}))
  
      def end_element_ns(self, name):
--- 306,339 ----
          pair = name.split()
          if len(pair) == 1:
+             # no namespace
              pair = (None, name)
+         elif len(pair) == 3:
+             pair = pair[0], pair[1]
          else:
+             # default namespace
              pair = tuple(pair)
  
          newattrs = {}
+         qnames = {}
          for (aname, value) in attrs.items():
!             parts = aname.split()
!             length = len(parts)
!             if length == 1:
!                 # no namespace
!                 qname = aname
                  apair = (None, aname)
+             elif length == 3:
+                 qname = "%s:%s" % (parts[2], parts[1])
+                 apair = parts[0], parts[1]
              else:
!                 # default namespace
!                 qname = parts[1]
!                 apair = tuple(parts)
  
              newattrs[apair] = value
+             qnames[apair] = qname
  
          self._cont_handler.startElementNS(pair, None,
!                                           AttributesNSImpl(newattrs, qnames))
  
      def end_element_ns(self, name):
***************
*** 303,306 ****
--- 341,346 ----
          if len(pair) == 1:
              pair = (None, name)
+         elif len(pair) == 3:
+             pair = pair[0], pair[1]
          else:
              pair = tuple(pair)
***************
*** 322,325 ****
--- 362,368 ----
          self._cont_handler.endPrefixMapping(prefix)
  
+     def start_doctype_decl(self, name, pubid, sysid, has_internal_subset):
+         self._lex_handler_prop.startDTD(name, pubid, sysid)
+ 
      def unparsed_entity_decl(self, name, base, sysid, pubid, notation_name):
          self._dtd_handler.unparsedEntityDecl(name, pubid, sysid, notation_name)
***************
*** 349,352 ****
--- 392,401 ----
          del self._entity_stack[-1]
          return 1
+ 
+     def skipped_entity_handler(self, name, is_pe):
+         if is_pe:
+             # The SAX spec requires to report skipped PEs with a '%'
+             name = '%'+name
+         self._cont_handler.skippedEntity(name)
  
  # ---