Index: markup/core.py
===================================================================
--- markup/core.py	(revision 248)
+++ markup/core.py	(working copy)
@@ -16,7 +16,8 @@
 import htmlentitydefs
 import re
 
-__all__ = ['Stream', 'Markup', 'escape', 'unescape', 'Namespace', 'QName']
+__all__ = ['Stream', 'Markup', 'escape', 'unescape', 'plaintext',
+           'Namespace', 'QName']
 
 
 class StreamEventKind(str):
@@ -81,7 +82,7 @@
         """Return a string representation of the stream.
         
         @param method: determines how the stream is serialized; can be either
-                       "xml", "xhtml", or "html", or a custom `Serializer`
+                       "xml", "xhtml", "html", "text" or a custom `Serializer`
                        subclass
         @param encoding: how the output string should be encoded; if set to
                          `None`, this method returns a `unicode` object
@@ -113,7 +114,8 @@
         string.
         
         @param method: determines how the stream is serialized; can be either
-                       "xml", "xhtml", or "html", or a custom serializer class
+                       "xml", "xhtml", "html", "text" or a custom serializer
+                       class
 
         Any additional keyword arguments are passed to the serializer, and thus
         depend on the `method` parameter value.
@@ -123,7 +125,8 @@
         if isinstance(method, basestring):
             cls = {'xml':   output.XMLSerializer,
                    'xhtml': output.XHTMLSerializer,
-                   'html':  output.HTMLSerializer}[method]
+                   'html':  output.HTMLSerializer,
+                   'text':  output.TextSerializer}[method]
         serialize = cls(**kwargs)
         return serialize(_ensure(self))
 
Index: markup/output.py
===================================================================
--- markup/output.py	(revision 248)
+++ markup/output.py	(working copy)
@@ -398,6 +398,27 @@
                 yield Markup('<?%s %s?>' % data)
 
 
+class TextSerializer(XMLSerializer):
+    """Produces simple text (i.e. no markup, no entities) from an event stream.
+    
+    >>> from markup.builder import tag
+    >>> elem = tag.div(tag.a('<Hello!>', href='foo'), tag.br)
+    >>> print ''.join(TextSerializer()(elem.generate()))
+    <Hello!>
+    """
+
+    def __init__(self):
+        """Initialize the Text serializer."""
+        XMLSerializer.__init__(self, doctype=None, strip_whitespace=False)
+
+    def __call__(self, stream):
+        for token in XMLSerializer.__call__(self, stream):
+            if isinstance(token, Markup):
+                yield token.striptags().stripentities()
+            else:
+                yield token # CDATA
+
+
 class WhitespaceFilter(object):
     """A filter that removes extraneous ignorable white space from the
     stream."""
