Edgewall Software

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

File substitute-preserve-Markup-r783.patch, 2.3 KB (added by cboos, 4 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