5

SphinxコードスニペットのドキュメントでPygmentsを使用して強調したいLispのような言語があります。私のアプローチは、既存のCommonLispLexerを拡張して、NameHighlightFilterを使用して組み込みの名前を追加することです。しかし、それは機能していないので、私は明らかな何かを見逃しているに違いありません。conf.pyに以下を追加しました:

def setup(app): 
    from sphinx.highlighting import lexers
    from pygments.lexers import CommonLispLexer
    from pygments.token import Name
    from pygments.filters import NameHighlightFilter
    tl_lexer = CommonLispLexer()
    tl_lexer.add_filter(NameHighlightFilter(
            names=['define-function', 'define-macro', 
                   'define-variable', 'define-constant'],
            tokentype=Name.Builtin,
            ))
    app.add_lexer('tl', tl_lexer)

highlight_language = 'tl'

ただし、NameHighlightFilterは効果がありません。コードブロックはLispであるかのように強調表示されますが、私の新しい組み込み名には特別な強調表示はありません。

4

1 に答える 1

6

その理由はNameHighlighFilter、レクサーToken.Nameがとして分類するトークンのみを が変換するのに対し、 はCommonLispLexerほとんどすべてを として分類するためName.Variableです。これは、NameHighlightFilterPygments ソース コードからののフィルタ関数です。

def filter(self, lexer, stream):
    for ttype, value in stream:
        if ttype is Name and value in self.names:
            yield self.tokentype, value
        else:
            yield ttype, value

私の唯一の回避策は、独自のフィルターを作成することでした。この機能により、私が望んでいた外観が得られました。

def filter(self, lexer, stream):
    define = False
    for ttype, value in stream:
        if value in self.tl_toplevel_forms:
            ttype = Name.Builtin
            define = True
        elif define and ttype == Name.Variable:
            define = False
            ttype = Name.Function
        elif value in self.tl_special_forms:
            ttype = Name.Variable
        # the Common Lisp lexer highlights everything else as
        # variables, which isn't the look I want.  Instead
        # highlight all non-special things as text.
        elif ttype == Name.Variable:
            ttype = Name.Text
        yield ttype, value

Pygments 開発者への注意として、おそらく は、NameHighlightFilter変換されるトークン タイプを表すオプションの引数を取ることができます (現在、出力トークン タイプのみを取ります)。

于 2012-07-11T12:45:10.883 に答える