Edgewall Software

Ticket #41: text_serializer-r248.patch

File text_serializer-r248.patch, 2.8 KB (added by cboos, 8 years ago)

Implementation of this feature on top of r248.

  • markup/core.py

     
    1616import htmlentitydefs 
    1717import re 
    1818 
    19 __all__ = ['Stream', 'Markup', 'escape', 'unescape', 'Namespace', 'QName'] 
     19__all__ = ['Stream', 'Markup', 'escape', 'unescape', 'plaintext', 
     20           'Namespace', 'QName'] 
    2021 
    2122 
    2223class StreamEventKind(str): 
     
    8182        """Return a string representation of the stream. 
    8283         
    8384        @param method: determines how the stream is serialized; can be either 
    84                        "xml", "xhtml", or "html", or a custom `Serializer` 
     85                       "xml", "xhtml", "html", "text" or a custom `Serializer` 
    8586                       subclass 
    8687        @param encoding: how the output string should be encoded; if set to 
    8788                         `None`, this method returns a `unicode` object 
     
    113114        string. 
    114115         
    115116        @param method: determines how the stream is serialized; can be either 
    116                        "xml", "xhtml", or "html", or a custom serializer class 
     117                       "xml", "xhtml", "html", "text" or a custom serializer 
     118                       class 
    117119 
    118120        Any additional keyword arguments are passed to the serializer, and thus 
    119121        depend on the `method` parameter value. 
     
    123125        if isinstance(method, basestring): 
    124126            cls = {'xml':   output.XMLSerializer, 
    125127                   'xhtml': output.XHTMLSerializer, 
    126                    'html':  output.HTMLSerializer}[method] 
     128                   'html':  output.HTMLSerializer, 
     129                   'text':  output.TextSerializer}[method] 
    127130        serialize = cls(**kwargs) 
    128131        return serialize(_ensure(self)) 
    129132 
  • markup/output.py

     
    398398                yield Markup('<?%s %s?>' % data) 
    399399 
    400400 
     401class TextSerializer(XMLSerializer): 
     402    """Produces simple text (i.e. no markup, no entities) from an event stream. 
     403     
     404    >>> from markup.builder import tag 
     405    >>> elem = tag.div(tag.a('<Hello!>', href='foo'), tag.br) 
     406    >>> print ''.join(TextSerializer()(elem.generate())) 
     407    <Hello!> 
     408    """ 
     409 
     410    def __init__(self): 
     411        """Initialize the Text serializer.""" 
     412        XMLSerializer.__init__(self, doctype=None, strip_whitespace=False) 
     413 
     414    def __call__(self, stream): 
     415        for token in XMLSerializer.__call__(self, stream): 
     416            if isinstance(token, Markup): 
     417                yield token.striptags().stripentities() 
     418            else: 
     419                yield token # CDATA 
     420 
     421 
    401422class WhitespaceFilter(object): 
    402423    """A filter that removes extraneous ignorable white space from the 
    403424    stream."""