如何在带有争论的块上使用Jinja2过滤器

时间:2016-08-10 16:51:38

标签: python jinja2

我正在尝试使用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'))

1 个答案:

答案 0 :(得分:2)

我是个白痴,那是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')