python - 如何在带有参数的 block 上使用 Jinja2 过滤器

标签 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'))

最佳答案

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

关于python - 如何在带有参数的 block 上使用 Jinja2 过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38879318/

相关文章:

python - 使用 Hadoop 的 Blender 静止图像渲染

python - 将自定义主题/代码应用于 CKAN 扩展

python - 如何获取 Jinja2 模板中导致异常(TemplateSyntaxError 除外)的行号?

python - 通过超链接通过 html 页面显示 xml 文件

Python:如果值==0,则从Excel图表图例中删除

python - 用于分隔列的字典的 pandas 列表

python - jinja2中for循环内的范围

html-email - 使用 Jinja 渲染带有内联 CSS 的 HTML 电子邮件

python - 项目和属性之间的区别 - Jinja,Python

python - 带有 Visual Studio Code 的 Anaconda