17db96d56Sopenharmony_ci"""Simple API for XML (SAX) implementation for Python.
27db96d56Sopenharmony_ci
37db96d56Sopenharmony_ciThis module provides an implementation of the SAX 2 interface;
47db96d56Sopenharmony_ciinformation about the Java version of the interface can be found at
57db96d56Sopenharmony_cihttp://www.megginson.com/SAX/.  The Python version of the interface is
67db96d56Sopenharmony_cidocumented at <...>.
77db96d56Sopenharmony_ci
87db96d56Sopenharmony_ciThis package contains the following modules:
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_cihandler -- Base classes and constants which define the SAX 2 API for
117db96d56Sopenharmony_ci           the 'client-side' of SAX for Python.
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_cisaxutils -- Implementation of the convenience classes commonly used to
147db96d56Sopenharmony_ci            work with SAX.
157db96d56Sopenharmony_ci
167db96d56Sopenharmony_cixmlreader -- Base classes and constants which define the SAX 2 API for
177db96d56Sopenharmony_ci             the parsers used with SAX for Python.
187db96d56Sopenharmony_ci
197db96d56Sopenharmony_ciexpatreader -- Driver that allows use of the Expat parser with SAX.
207db96d56Sopenharmony_ci"""
217db96d56Sopenharmony_ci
227db96d56Sopenharmony_cifrom .xmlreader import InputSource
237db96d56Sopenharmony_cifrom .handler import ContentHandler, ErrorHandler
247db96d56Sopenharmony_cifrom ._exceptions import SAXException, SAXNotRecognizedException, \
257db96d56Sopenharmony_ci                        SAXParseException, SAXNotSupportedException, \
267db96d56Sopenharmony_ci                        SAXReaderNotAvailable
277db96d56Sopenharmony_ci
287db96d56Sopenharmony_ci
297db96d56Sopenharmony_cidef parse(source, handler, errorHandler=ErrorHandler()):
307db96d56Sopenharmony_ci    parser = make_parser()
317db96d56Sopenharmony_ci    parser.setContentHandler(handler)
327db96d56Sopenharmony_ci    parser.setErrorHandler(errorHandler)
337db96d56Sopenharmony_ci    parser.parse(source)
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_cidef parseString(string, handler, errorHandler=ErrorHandler()):
367db96d56Sopenharmony_ci    import io
377db96d56Sopenharmony_ci    if errorHandler is None:
387db96d56Sopenharmony_ci        errorHandler = ErrorHandler()
397db96d56Sopenharmony_ci    parser = make_parser()
407db96d56Sopenharmony_ci    parser.setContentHandler(handler)
417db96d56Sopenharmony_ci    parser.setErrorHandler(errorHandler)
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci    inpsrc = InputSource()
447db96d56Sopenharmony_ci    if isinstance(string, str):
457db96d56Sopenharmony_ci        inpsrc.setCharacterStream(io.StringIO(string))
467db96d56Sopenharmony_ci    else:
477db96d56Sopenharmony_ci        inpsrc.setByteStream(io.BytesIO(string))
487db96d56Sopenharmony_ci    parser.parse(inpsrc)
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci# this is the parser list used by the make_parser function if no
517db96d56Sopenharmony_ci# alternatives are given as parameters to the function
527db96d56Sopenharmony_ci
537db96d56Sopenharmony_cidefault_parser_list = ["xml.sax.expatreader"]
547db96d56Sopenharmony_ci
557db96d56Sopenharmony_ci# tell modulefinder that importing sax potentially imports expatreader
567db96d56Sopenharmony_ci_false = 0
577db96d56Sopenharmony_ciif _false:
587db96d56Sopenharmony_ci    import xml.sax.expatreader
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ciimport os, sys
617db96d56Sopenharmony_ciif not sys.flags.ignore_environment and "PY_SAX_PARSER" in os.environ:
627db96d56Sopenharmony_ci    default_parser_list = os.environ["PY_SAX_PARSER"].split(",")
637db96d56Sopenharmony_cidel os
647db96d56Sopenharmony_ci
657db96d56Sopenharmony_ci_key = "python.xml.sax.parser"
667db96d56Sopenharmony_ciif sys.platform[:4] == "java" and sys.registry.containsKey(_key):
677db96d56Sopenharmony_ci    default_parser_list = sys.registry.getProperty(_key).split(",")
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci
707db96d56Sopenharmony_cidef make_parser(parser_list=()):
717db96d56Sopenharmony_ci    """Creates and returns a SAX parser.
727db96d56Sopenharmony_ci
737db96d56Sopenharmony_ci    Creates the first parser it is able to instantiate of the ones
747db96d56Sopenharmony_ci    given in the iterable created by chaining parser_list and
757db96d56Sopenharmony_ci    default_parser_list.  The iterables must contain the names of Python
767db96d56Sopenharmony_ci    modules containing both a SAX parser and a create_parser function."""
777db96d56Sopenharmony_ci
787db96d56Sopenharmony_ci    for parser_name in list(parser_list) + default_parser_list:
797db96d56Sopenharmony_ci        try:
807db96d56Sopenharmony_ci            return _create_parser(parser_name)
817db96d56Sopenharmony_ci        except ImportError:
827db96d56Sopenharmony_ci            import sys
837db96d56Sopenharmony_ci            if parser_name in sys.modules:
847db96d56Sopenharmony_ci                # The parser module was found, but importing it
857db96d56Sopenharmony_ci                # failed unexpectedly, pass this exception through
867db96d56Sopenharmony_ci                raise
877db96d56Sopenharmony_ci        except SAXReaderNotAvailable:
887db96d56Sopenharmony_ci            # The parser module detected that it won't work properly,
897db96d56Sopenharmony_ci            # so try the next one
907db96d56Sopenharmony_ci            pass
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci    raise SAXReaderNotAvailable("No parsers found", None)
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci# --- Internal utility methods used by make_parser
957db96d56Sopenharmony_ci
967db96d56Sopenharmony_ciif sys.platform[ : 4] == "java":
977db96d56Sopenharmony_ci    def _create_parser(parser_name):
987db96d56Sopenharmony_ci        from org.python.core import imp
997db96d56Sopenharmony_ci        drv_module = imp.importName(parser_name, 0, globals())
1007db96d56Sopenharmony_ci        return drv_module.create_parser()
1017db96d56Sopenharmony_ci
1027db96d56Sopenharmony_cielse:
1037db96d56Sopenharmony_ci    def _create_parser(parser_name):
1047db96d56Sopenharmony_ci        drv_module = __import__(parser_name,{},{},['create_parser'])
1057db96d56Sopenharmony_ci        return drv_module.create_parser()
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_cidel sys
108