You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

58 lines
2.3 KiB

13 years ago
"""A collection of modules for iterating through different kinds of
tree, generating tokens identical to those produced by the tokenizer
module.
To create a tree walker for a new type of tree, you need to do
implement a tree walker object (called TreeWalker by convention) that
implements a 'serialize' method taking a tree as sole argument and
returning an iterator generating tokens.
"""
12 years ago
from __future__ import absolute_import, division, unicode_literals
import sys
from ..utils import default_etree
13 years ago
treeWalkerCache = {}
12 years ago
13 years ago
def getTreeWalker(treeType, implementation=None, **kwargs):
"""Get a TreeWalker class for various types of tree with built-in support
treeType - the name of the tree type required (case-insensitive). Supported
12 years ago
values are:
13 years ago
"dom" - The xml.dom.minidom DOM implementation
"pulldom" - The xml.dom.pulldom event stream
"etree" - A generic walker for tree implementations exposing an
elementtree-like interface (known to work with
ElementTree, cElementTree and lxml.etree).
"lxml" - Optimized walker for lxml.etree
"genshi" - a Genshi stream
implementation - (Currently applies to the "etree" tree type only). A module
implementing the tree type e.g. xml.etree.ElementTree or
cElementTree."""
treeType = treeType.lower()
if treeType not in treeWalkerCache:
12 years ago
if treeType in ("dom", "pulldom"):
name = "%s.%s" % (__name__, treeType)
__import__(name)
mod = sys.modules[name]
13 years ago
treeWalkerCache[treeType] = mod.TreeWalker
elif treeType == "genshi":
12 years ago
from . import genshistream
13 years ago
treeWalkerCache[treeType] = genshistream.TreeWalker
elif treeType == "lxml":
12 years ago
from . import lxmletree
13 years ago
treeWalkerCache[treeType] = lxmletree.TreeWalker
elif treeType == "etree":
12 years ago
from . import etree
if implementation is None:
implementation = default_etree
13 years ago
# XXX: NEVER cache here, caching is done in the etree submodule
return etree.getETreeModule(implementation, **kwargs).TreeWalker
return treeWalkerCache.get(treeType)