# -*- coding: utf-8 -*-
"""
    pygments.formatters.other
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    Other formatters: NullFormatter, RawTokenFormatter.

    :copyright: 2006-2007 by Georg Brandl, Armin Ronacher.
    :license: BSD, see LICENSE for more details.
"""

from pygments.formatter import Formatter
from pygments.util import get_choice_opt


__all__ = ['NullFormatter', 'RawTokenFormatter']


class NullFormatter(Formatter):
    """
    Output the text unchanged without any formatting.
    """
    name = 'Text only'
    aliases = ['text', 'null']
    filenames = ['*.txt']

    def format(self, tokensource, outfile):
        enc = self.encoding
        for ttype, value in tokensource:
            if enc:
                outfile.write(value.encode(enc))
            else:
                outfile.write(value)


class RawTokenFormatter(Formatter):
    r"""
    Format tokens as a raw representation for storing token streams.

    The format is ``tokentype<TAB>repr(tokenstring)\n``. The output can later
    be converted to a token stream with the `RawTokenLexer`, described in the
    `lexer list <lexers.txt>`_.

    Only one option is accepted:

    `compress`
        If set to ``'gz'`` or ``'bz2'``, compress the output with the given
        compression algorithm after encoding (default: ``''``).
    """
    name = 'Raw tokens'
    aliases = ['raw', 'tokens']
    filenames = ['*.raw']

    unicodeoutput = False

    def __init__(self, **options):
        Formatter.__init__(self, **options)
        self.compress = get_choice_opt(options, 'compress',
                                       ['', 'none', 'gz', 'bz2'], '')

    def format(self, tokensource, outfile):
        if self.compress == 'gz':
            import gzip
            outfile = gzip.GzipFile('', 'wb', 9, outfile)
            write = outfile.write
            flush = outfile.flush
        elif self.compress == 'bz2':
            import bz2
            compressor = bz2.BZ2Compressor(9)
            def write(text):
                outfile.write(compressor.compress(text))
            def flush():
                outfile.write(compressor.flush())
                outfile.flush()
        else:
            write = outfile.write
            flush = outfile.flush

        lasttype = None
        lastval = u''
        for ttype, value in tokensource:
            write("%s\t%r\n" % (ttype, value))
        flush()

@@ -334,17 +334,87 @@
 ice_opt%0A
+from pygments.token import Token%0Afrom pygments.console import colorize
 %0A
-
 %0A__all__
@@ -1372,16 +1372,198 @@
 %60''%60%60).%0A
+    %60error_color%60%0A        If set to a color name, highlight error tokens using that color.  If%0A        set but with no value, defaults to %60%60'red'%60%60.%0A        *New in Pygments 0.11.*%0A%0A
     %22%22%22%0A
@@ -1880,16 +1880,399 @@
 2'%5D, '')
+%0A        self.error_color = options.get('error_color', None)%0A        if self.error_color is True:%0A            self.error_color = 'red'%0A        if self.error_color is not None:%0A            try:%0A                colorize(self.error_color, '')%0A            except KeyError:%0A                raise ValueError(%22Invalid color %25r specified%22 %25%0A                                 self.error_color)
 %0A%0A    de
@@ -2921,16 +2921,49 @@
 l = u''%0A
+        if self.error_color:%0A    
         
@@ -2987,32 +2987,301 @@
 in tokensource:%0A
+                line = %22%25s%5Ct%25r%5Cn%22 %25 (ttype, value)%0A                if ttype is Token.Error:%0A                    write(colorize(self.error_color, line))%0A                else:%0A                    write(line)%0A        else:%0A            for ttype, value in tokensource:%0A    
             writ

Add optional error token colorizing to the !RawTokenFormatter to close #333.