如何在带参数的块上使用 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')
我正在尝试使用 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')