Edgewall Software

Ticket #168: substitute-preserve-Markup-r783.patch

File substitute-preserve-Markup-r783.patch, 2.3 KB (added by cboos, 16 years ago)

After substitution, wrap the output data in Markup if the input data was Markup

  • genshi/filters/tests/transform.py

     
    1919
    2020def suite():
    2121    from genshi.input import HTML
     22    from genshi.core import Markup
     23    from genshi.builder import tag
    2224    suite = doctest.DocTestSuite(genshi.filters.transform,
    2325                                 optionflags=doctest.NORMALIZE_WHITESPACE,
    24                                  extraglobs={'HTML': HTML})
     26                                 extraglobs={'HTML': HTML, 'tag': tag,
     27                                     'Markup': Markup})
    2528    return suite
    2629
    2730if __name__ == '__main__':
  • genshi/filters/transform.py

     
    5151import sys
    5252
    5353from genshi.builder import Element
    54 from genshi.core import Stream, Attrs, QName, TEXT, START, END, _ensure
     54from genshi.core import Stream, Attrs, QName, TEXT, START, END, _ensure, Markup
    5555from genshi.path import Path
    5656
    5757__all__ = ['Transformer', 'StreamBuffer', 'InjectorTransformation', 'ENTER',
     
    549549        ...             '<b>some bold text</b></body></html>')
    550550        >>> print html | Transformer('body').substitute('(?i)some', 'SOME')
    551551        <html><body>SOME text, some more text and <b>SOME bold text</b></body></html>
     552        >>> tags = tag.html(tag.body('Some text, some more text and ',
     553        ...      Markup('<b>some bold text</b>')))
     554        >>> print tags.generate() | Transformer('body').substitute('(?i)some', 'SOME')
     555        <html><body>SOME text, some more text and <b>SOME bold text</b></body></html>
    552556
    553557        :param pattern: A regular expression object or string.
    554558        :param replace: Replacement pattern.
     
    865869        """
    866870        for mark, (kind, data, pos) in stream:
    867871            if kind is TEXT:
    868                 data = self.pattern.sub(self.replace, data, self.count)
     872                data1 = self.pattern.sub(self.replace, data, self.count)
     873                data = isinstance(data, Markup) and Markup(data1) or data1
    869874            yield mark, (kind, data, pos)
    870875
    871876