mirror of
https://github.com/python/cpython.git
synced 2025-07-22 18:55:22 +00:00

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)
|