# HG changeset patch # User athomas # Date 1185673300 0 # Node ID f0c7ee19a54b02ce9aad0f9533afae906f3cef44 # Parent e86edca143fbbf2630d0201b6857af125fc83f4e Added Chris' rename transformation filter. diff --git a/genshi/filters/transform.py b/genshi/filters/transform.py --- a/genshi/filters/transform.py +++ b/genshi/filters/transform.py @@ -143,13 +143,11 @@ __slots__ = ['transforms'] - def __init__(self, path=None): + def __init__(self, path='.'): """Construct a new transformation filter. :param path: an XPath expression (as string) or a `Path` instance """ - if path is None: - path = '.' self.transforms = [SelectTransformation(path)] def __call__(self, stream): @@ -558,6 +556,16 @@ """ return self.apply(SubstituteTransformation(pattern, replace, count)) + def rename(self, name): + """Rename matching elements. + + >>> html = HTML('
Some text, some more text and ' + ... 'some bold text') + >>> print html | Transformer('body/b').rename('strong') + Some text, some more text and some bold text + """ + return self.apply(RenameTransformation(name)) + def trace(self, prefix='', fileobj=None): """Print events as they pass through the transform. @@ -860,6 +868,28 @@ yield mark, (kind, data, pos) +class RenameTransformation(object): + """Rename matching elements.""" + def __init__(self, name): + """Create the transform. + + :param name: New element name. + """ + self.name = QName(name) + + def __call__(self, stream): + """Apply the transform filter to the marked stream. + + :param stream: The marked event stream to filter + """ + for mark, (kind, data, pos) in stream: + if mark is ENTER: + data = self.name, data[1] + elif mark is EXIT: + data = self.name + yield mark, (kind, data, pos) + + class InjectorTransformation(object): """Abstract base class for transformations that inject content into a stream.