如何在带参数的块上使用 Jinja2 过滤器

How do I use Jinja2 filter on a block with argumets

我正在尝试使用 jinja2 模板。我有一个名为 highlight 的自定义过滤器,它接受字符串和语言名称并将它们传递给 pyhments 以进行代码突出显示。我正在尝试这样使用它:

{% filter highlight("python") %}
import sys

def main():
    pass
{% endfilter %}

但是我得到这个错误:

AttributeError: 'str' object has no attribute 'get_tokens'

然后我试了这个:

{% filter highlight "python" %}

也不行。

可能有一个通过 set block filtering 的技巧,然后通过 {{ ... }} 将其粘贴回去,但该技术尚未合并到主源代码中,对我来说似乎太老套了。

那么,目前这是否可能,或者我只是做错了?

编辑:这是过滤器:

@jinja2.contextfilter
def highlight(context, code, lang):
    print("HIGHLIGHT")
    print(code)
    return jinja2.Markup(pygments.highlight(code, lexer=lang, formatter='html'))

我是个白痴,那是 pygments 错误。由于某种错误,我没有看到堆栈跟踪中的最后一个条目来自那里。

你应该使用:

pygments.highlight(
    code, 
    lexer=pygments.lexers.get_lexer_by_name(lang), 
    formatter=pygments.formatters.get_formatter_by_name('html')
)

而不是:

pygments.highlight(code, lexer=lang, formatter='html')