Edgewall Software

Ticket #41: text_serializer-r248.patch

File text_serializer-r248.patch, 2.8 KB (added by cboos, 9 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."""