独自のフィルターの作成

バージョン 0.7 で追加されました。

独自フィルターを作成するのは非常に簡単です。Filter クラスを継承し、filter メソッドをオーバーライドするだけです。さらに、フィルターはいくつかのキーワード引数を使用してインスタンス化され、フィルターの動作を調整できます。

フィルタのサブクラス化

例として、出力の色鮮やかさを低減するためにすべての Name.Function トークンを通常の Name トークンに変換するフィルターを記述します。

from pygments.util import get_bool_opt
from pygments.token import Name
from pygments.filter import Filter

class UncolorFilter(Filter):

    def __init__(self, **options):
        Filter.__init__(self, **options)
        self.class_too = get_bool_opt(options, 'classtoo')

    def filter(self, lexer, stream):
        for ttype, value in stream:
            if ttype is Name.Function or (self.class_too and
                                          ttype is Name.Class):
                ttype = Name
            yield ttype, value

lexer 引数に関する注意: レクサーインスタンスである必要がないため、非常に混乱する場合があります。add_filter() 関数を使用してレクサーによってフィルターが追加された場合、そのレクサーはフィルターに登録されます。その場合、lexer はフィルターを登録したレクサーを参照します。レクサーに渡されたオプションにアクセスするために使用できます。None になる可能性があるため、アクセスする場合は常にそのケースを確認する必要があります。

デコレータの使用

また、pygments.filter モジュールから simplefilter デコレータを使用することもできます。

from pygments.util import get_bool_opt
from pygments.token import Name
from pygments.filter import simplefilter


@simplefilter
def uncolor(self, lexer, stream, options):
    class_too = get_bool_opt(options, 'classtoo')
    for ttype, value in stream:
        if ttype is Name.Function or (class_too and
                                      ttype is Name.Class):
            ttype = Name
        yield ttype, value

このフィルターは uncolor(classtoo=True) を呼び出してインスタンス化できます。これは、前のフィルターを UncolorFilter(classtoo=True) を呼び出してインスタンス化したのと同じ方法です。uncolor が内部フィルタークラスのサブクラスであるクラスを確実にし、自動的にデコレータで処理されます。クラス uncolo はデコレートされた関数をフィルター手法として使用します。(おそらくメソッドで使用しない self 引数がある理由です。)