home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / saxutils.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2003-12-30  |  17KB  |  317 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.3)
  3.  
  4. '''A library of useful helper classes to the SAX classes, for the
  5. convenience of application and driver writers.
  6. '''
  7. import os
  8. import urlparse
  9. import urllib
  10. import types
  11. import handler
  12. import xmlreader
  13.  
  14. try:
  15.     _StringTypes = [
  16.         types.StringType,
  17.         types.UnicodeType]
  18. except AttributeError:
  19.     _StringTypes = [
  20.         types.StringType]
  21.  
  22.  
  23. def __dict_replace(s, d):
  24.     '''Replace substrings of a string using a dictionary.'''
  25.     for key, value in d.items():
  26.         s = s.replace(key, value)
  27.     
  28.     return s
  29.  
  30.  
  31. def escape(data, entities = { }):
  32.     '''Escape &, <, and > in a string of data.
  33.  
  34.     You can escape other strings of data by passing a dictionary as
  35.     the optional entities parameter.  The keys and values must all be
  36.     strings; each key will be replaced with its corresponding value.
  37.     '''
  38.     data = data.replace('&', '&')
  39.     data = data.replace('>', '>')
  40.     data = data.replace('<', '<')
  41.     if entities:
  42.         data = __dict_replace(data, entities)
  43.     
  44.     return data
  45.  
  46.  
  47. def unescape(data, entities = { }):
  48.     '''Unescape &, <, and > in a string of data.
  49.  
  50.     You can unescape other strings of data by passing a dictionary as
  51.     the optional entities parameter.  The keys and values must all be
  52.     strings; each key will be replaced with its corresponding value.
  53.     '''
  54.     data = data.replace('<', '<')
  55.     data = data.replace('>', '>')
  56.     if entities:
  57.         data = __dict_replace(data, entities)
  58.     
  59.     return data.replace('&', '&')
  60.  
  61.  
  62. def quoteattr(data, entities = { }):
  63.     '''Escape and quote an attribute value.
  64.  
  65.     Escape &, <, and > in a string of data, then quote it for use as
  66.     an attribute value.  The " character will be escaped as well, if
  67.     necessary.
  68.  
  69.     You can escape other strings of data by passing a dictionary as
  70.     the optional entities parameter.  The keys and values must all be
  71.     strings; each key will be replaced with its corresponding value.
  72.     '''
  73.     data = escape(data, entities)
  74.     if '"' in data:
  75.         if "'" in data:
  76.             data = '"%s"' % data.replace('"', '"')
  77.         else:
  78.             data = "'%s'" % data
  79.     else:
  80.         data = '"%s"' % data
  81.     return data
  82.  
  83.  
  84. class XMLGenerator(handler.ContentHandler):
  85.     
  86.     def __init__(self, out = None, encoding = 'iso-8859-1'):
  87.         if out is None:
  88.             import sys
  89.             out = sys.stdout
  90.         
  91.         handler.ContentHandler.__init__(self)
  92.         self._out = out
  93.         self._ns_contexts = [
  94.             { }]
  95.         self._current_context = self._ns_contexts[-1]
  96.         self._undeclared_ns_maps = []
  97.         self._encoding = encoding
  98.  
  99.     
  100.     def startDocument(self):
  101.         self._out.write('<?xml version="1.0" encoding="%s"?>\n' % self._encoding)
  102.  
  103.     
  104.     def startPrefixMapping(self, prefix, uri):
  105.         self._ns_contexts.append(self._current_context.copy())
  106.         self._current_context[uri] = prefix
  107.         self._undeclared_ns_maps.append((prefix, uri))
  108.  
  109.     
  110.     def endPrefixMapping(self, prefix):
  111.         self._current_context = self._ns_contexts[-1]
  112.         del self._ns_contexts[-1]
  113.  
  114.     
  115.     def startElement(self, name, attrs):
  116.         self._out.write('<' + name)
  117.         for name, value in attrs.items():
  118.             self._out.write(' %s=%s' % (name, quoteattr(value)))
  119.         
  120.         self._out.write('>')
  121.  
  122.     
  123.     def endElement(self, name):
  124.         self._out.write('</%s>' % name)
  125.  
  126.     
  127.     def startElementNS(self, name, qname, attrs):
  128.         if name[0] is None:
  129.             name = name[1]
  130.         else:
  131.             name = self._current_context[name[0]] + ':' + name[1]
  132.         self._out.write('<' + name)
  133.         for pair in self._undeclared_ns_maps:
  134.             self._out.write(' xmlns:%s="%s"' % pair)
  135.         
  136.         self._undeclared_ns_maps = []
  137.         for name, value in attrs.items():
  138.             name = self._current_context[name[0]] + ':' + name[1]
  139.             self._out.write(' %s=%s' % (name, quoteattr(value)))
  140.         
  141.         self._out.write('>')
  142.  
  143.     
  144.     def endElementNS(self, name, qname):
  145.         if name[0] is None:
  146.             name = name[1]
  147.         else:
  148.             name = self._current_context[name[0]] + ':' + name[1]
  149.         self._out.write('</%s>' % name)
  150.  
  151.     
  152.     def characters(self, content):
  153.         self._out.write(escape(content))
  154.  
  155.     
  156.     def ignorableWhitespace(self, content):
  157.         self._out.write(content)
  158.  
  159.     
  160.     def processingInstruction(self, target, data):
  161.         self._out.write('<?%s %s?>' % (target, data))
  162.  
  163.  
  164.  
  165. class XMLFilterBase(xmlreader.XMLReader):
  166.     """This class is designed to sit between an XMLReader and the
  167.     client application's event handlers.  By default, it does nothing
  168.     but pass requests up to the reader and events on to the handlers
  169.     unmodified, but subclasses can override specific methods to modify
  170.     the event stream or the configuration requests as they pass
  171.     through."""
  172.     
  173.     def __init__(self, parent = None):
  174.         xmlreader.XMLReader.__init__(self)
  175.         self._parent = parent
  176.  
  177.     
  178.     def error(self, exception):
  179.         self._err_handler.error(exception)
  180.  
  181.     
  182.     def fatalError(self, exception):
  183.         self._err_handler.fatalError(exception)
  184.  
  185.     
  186.     def warning(self, exception):
  187.         self._err_handler.warning(exception)
  188.  
  189.     
  190.     def setDocumentLocator(self, locator):
  191.         self._cont_handler.setDocumentLocator(locator)
  192.  
  193.     
  194.     def startDocument(self):
  195.         self._cont_handler.startDocument()
  196.  
  197.     
  198.     def endDocument(self):
  199.         self._cont_handler.endDocument()
  200.  
  201.     
  202.     def startPrefixMapping(self, prefix, uri):
  203.         self._cont_handler.startPrefixMapping(prefix, uri)
  204.  
  205.     
  206.     def endPrefixMapping(self, prefix):
  207.         self._cont_handler.endPrefixMapping(prefix)
  208.  
  209.     
  210.     def startElement(self, name, attrs):
  211.         self._cont_handler.startElement(name, attrs)
  212.  
  213.     
  214.     def endElement(self, name):
  215.         self._cont_handler.endElement(name)
  216.  
  217.     
  218.     def startElementNS(self, name, qname, attrs):
  219.         self._cont_handler.startElement(name, attrs)
  220.  
  221.     
  222.     def endElementNS(self, name, qname):
  223.         self._cont_handler.endElementNS(name, qname)
  224.  
  225.     
  226.     def characters(self, content):
  227.         self._cont_handler.characters(content)
  228.  
  229.     
  230.     def ignorableWhitespace(self, chars):
  231.         self._cont_handler.ignorableWhitespace(chars)
  232.  
  233.     
  234.     def processingInstruction(self, target, data):
  235.         self._cont_handler.processingInstruction(target, data)
  236.  
  237.     
  238.     def skippedEntity(self, name):
  239.         self._cont_handler.skippedEntity(name)
  240.  
  241.     
  242.     def notationDecl(self, name, publicId, systemId):
  243.         self._dtd_handler.notationDecl(name, publicId, systemId)
  244.  
  245.     
  246.     def unparsedEntityDecl(self, name, publicId, systemId, ndata):
  247.         self._dtd_handler.unparsedEntityDecl(name, publicId, systemId, ndata)
  248.  
  249.     
  250.     def resolveEntity(self, publicId, systemId):
  251.         self._ent_handler.resolveEntity(publicId, systemId)
  252.  
  253.     
  254.     def parse(self, source):
  255.         self._parent.setContentHandler(self)
  256.         self._parent.setErrorHandler(self)
  257.         self._parent.setEntityResolver(self)
  258.         self._parent.setDTDHandler(self)
  259.         self._parent.parse(source)
  260.  
  261.     
  262.     def setLocale(self, locale):
  263.         self._parent.setLocale(locale)
  264.  
  265.     
  266.     def getFeature(self, name):
  267.         return self._parent.getFeature(name)
  268.  
  269.     
  270.     def setFeature(self, name, state):
  271.         self._parent.setFeature(name, state)
  272.  
  273.     
  274.     def getProperty(self, name):
  275.         return self._parent.getProperty(name)
  276.  
  277.     
  278.     def setProperty(self, name, value):
  279.         self._parent.setProperty(name, value)
  280.  
  281.     
  282.     def getParent(self):
  283.         return self._parent
  284.  
  285.     
  286.     def setParent(self, parent):
  287.         self._parent = parent
  288.  
  289.  
  290.  
  291. def prepare_input_source(source, base = ''):
  292.     '''This function takes an InputSource and an optional base URL and
  293.     returns a fully resolved InputSource object ready for reading.'''
  294.     if type(source) in _StringTypes:
  295.         source = xmlreader.InputSource(source)
  296.     elif hasattr(source, 'read'):
  297.         f = source
  298.         source = xmlreader.InputSource()
  299.         source.setByteStream(f)
  300.         if hasattr(f, 'name'):
  301.             source.setSystemId(f.name)
  302.         
  303.     
  304.     if source.getByteStream() is None:
  305.         sysid = source.getSystemId()
  306.         if os.path.isfile(sysid):
  307.             basehead = os.path.split(os.path.normpath(base))[0]
  308.             source.setSystemId(os.path.join(basehead, sysid))
  309.             f = open(sysid, 'rb')
  310.         else:
  311.             source.setSystemId(urlparse.urljoin(base, sysid))
  312.             f = urllib.urlopen(source.getSystemId())
  313.         source.setByteStream(f)
  314.     
  315.     return source
  316.  
  317.