mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	 b044b2a701
			
		
	
	
		b044b2a701
		
	
	
	
	
		
			
			svn+ssh://svn.python.org/python/branches/py3k ................ r74821 | georg.brandl | 2009-09-16 11:42:19 +0200 (Mi, 16 Sep 2009) | 1 line #6885: run python 3 as python3. ................ r74828 | georg.brandl | 2009-09-16 16:23:20 +0200 (Mi, 16 Sep 2009) | 1 line Use true booleans. ................ r74829 | georg.brandl | 2009-09-16 16:24:29 +0200 (Mi, 16 Sep 2009) | 1 line Small PEP8 correction. ................ r74830 | georg.brandl | 2009-09-16 16:36:22 +0200 (Mi, 16 Sep 2009) | 1 line Use true booleans. ................ r74831 | georg.brandl | 2009-09-16 17:54:04 +0200 (Mi, 16 Sep 2009) | 1 line Use true booleans and PEP8 for argdefaults. ................ r74833 | georg.brandl | 2009-09-16 17:58:14 +0200 (Mi, 16 Sep 2009) | 1 line Last round of adapting style of documenting argument default values. ................ r74835 | georg.brandl | 2009-09-16 18:00:31 +0200 (Mi, 16 Sep 2009) | 33 lines Merged revisions 74817-74820,74822-74824 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r74817 | georg.brandl | 2009-09-16 11:05:11 +0200 (Mi, 16 Sep 2009) | 1 line Make deprecation notices as visible as warnings are right now. ........ r74818 | georg.brandl | 2009-09-16 11:23:04 +0200 (Mi, 16 Sep 2009) | 1 line #6880: add reference to classes section in exceptions section, which comes earlier. ........ r74819 | georg.brandl | 2009-09-16 11:24:57 +0200 (Mi, 16 Sep 2009) | 1 line #6876: fix base class constructor invocation in example. ........ r74820 | georg.brandl | 2009-09-16 11:30:48 +0200 (Mi, 16 Sep 2009) | 1 line #6891: comment out dead link to Unicode article. ........ r74822 | georg.brandl | 2009-09-16 12:12:06 +0200 (Mi, 16 Sep 2009) | 1 line #5621: refactor description of how class/instance attributes interact on a.x=a.x+1 or augassign. ........ r74823 | georg.brandl | 2009-09-16 15:06:22 +0200 (Mi, 16 Sep 2009) | 1 line Remove strange trailing commas. ........ r74824 | georg.brandl | 2009-09-16 15:11:06 +0200 (Mi, 16 Sep 2009) | 1 line #6892: fix optparse example involving help option. ........ ................
		
			
				
	
	
		
			99 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
	
		
			3.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """Registration facilities for DOM. This module should not be used
 | |
| directly. Instead, the functions getDOMImplementation and
 | |
| registerDOMImplementation should be imported from xml.dom."""
 | |
| 
 | |
| from xml.dom.minicompat import *  # isinstance, StringTypes
 | |
| 
 | |
| # This is a list of well-known implementations.  Well-known names
 | |
| # should be published by posting to xml-sig@python.org, and are
 | |
| # subsequently recorded in this file.
 | |
| 
 | |
| well_known_implementations = {
 | |
|     'minidom':'xml.dom.minidom',
 | |
|     '4DOM': 'xml.dom.DOMImplementation',
 | |
|     }
 | |
| 
 | |
| # DOM implementations not officially registered should register
 | |
| # themselves with their
 | |
| 
 | |
| registered = {}
 | |
| 
 | |
| def registerDOMImplementation(name, factory):
 | |
|     """registerDOMImplementation(name, factory)
 | |
| 
 | |
|     Register the factory function with the name. The factory function
 | |
|     should return an object which implements the DOMImplementation
 | |
|     interface. The factory function can either return the same object,
 | |
|     or a new one (e.g. if that implementation supports some
 | |
|     customization)."""
 | |
| 
 | |
|     registered[name] = factory
 | |
| 
 | |
| def _good_enough(dom, features):
 | |
|     "_good_enough(dom, features) -> Return 1 if the dom offers the features"
 | |
|     for f,v in features:
 | |
|         if not dom.hasFeature(f,v):
 | |
|             return 0
 | |
|     return 1
 | |
| 
 | |
| def getDOMImplementation(name=None, features=()):
 | |
|     """getDOMImplementation(name = None, features = ()) -> DOM implementation.
 | |
| 
 | |
|     Return a suitable DOM implementation. The name is either
 | |
|     well-known, the module name of a DOM implementation, or None. If
 | |
|     it is not None, imports the corresponding module and returns
 | |
|     DOMImplementation object if the import succeeds.
 | |
| 
 | |
|     If name is not given, consider the available implementations to
 | |
|     find one with the required feature set. If no implementation can
 | |
|     be found, raise an ImportError. The features list must be a sequence
 | |
|     of (feature, version) pairs which are passed to hasFeature."""
 | |
| 
 | |
|     import os
 | |
|     creator = None
 | |
|     mod = well_known_implementations.get(name)
 | |
|     if mod:
 | |
|         mod = __import__(mod, {}, {}, ['getDOMImplementation'])
 | |
|         return mod.getDOMImplementation()
 | |
|     elif name:
 | |
|         return registered[name]()
 | |
|     elif "PYTHON_DOM" in os.environ:
 | |
|         return getDOMImplementation(name = os.environ["PYTHON_DOM"])
 | |
| 
 | |
|     # User did not specify a name, try implementations in arbitrary
 | |
|     # order, returning the one that has the required features
 | |
|     if isinstance(features, str):
 | |
|         features = _parse_feature_string(features)
 | |
|     for creator in registered.values():
 | |
|         dom = creator()
 | |
|         if _good_enough(dom, features):
 | |
|             return dom
 | |
| 
 | |
|     for creator in well_known_implementations.keys():
 | |
|         try:
 | |
|             dom = getDOMImplementation(name = creator)
 | |
|         except Exception: # typically ImportError, or AttributeError
 | |
|             continue
 | |
|         if _good_enough(dom, features):
 | |
|             return dom
 | |
| 
 | |
|     raise ImportError("no suitable DOM implementation found")
 | |
| 
 | |
| def _parse_feature_string(s):
 | |
|     features = []
 | |
|     parts = s.split()
 | |
|     i = 0
 | |
|     length = len(parts)
 | |
|     while i < length:
 | |
|         feature = parts[i]
 | |
|         if feature[0] in "0123456789":
 | |
|             raise ValueError("bad feature name: %r" % (feature,))
 | |
|         i = i + 1
 | |
|         version = None
 | |
|         if i < length:
 | |
|             v = parts[i]
 | |
|             if v[0] in "0123456789":
 | |
|                 i = i + 1
 | |
|                 version = v
 | |
|         features.append((feature, version))
 | |
|     return tuple(features)
 |