Python 3.x jinja2 highlight中的可变lexer

Python 3.x jinja2 highlight中的可变lexer,python-3.x,jinja2,pygments,Python 3.x,Jinja2,Pygments,我的jinja2模板接收一个代码块,其中可能包含任意数量的不同语言。我想将正确的lexer传递给模板,并使用jinja2突出显示插件(pygments)相应地呈现它。 我使用“command”变量呈现模板,该变量是一个字典,保存模板其余部分所需的所有数据。理想情况下,我想按照这些思路做些事情 {% highlight "{{ command.lexer }}", lineno='table' %}{{ command.script }}{% endhighlight %} 我试过: {% hi

我的jinja2模板接收一个代码块,其中可能包含任意数量的不同语言。我想将正确的lexer传递给模板,并使用jinja2突出显示插件(pygments)相应地呈现它。 我使用“command”变量呈现模板,该变量是一个字典,保存模板其余部分所需的所有数据。理想情况下,我想按照这些思路做些事情

{% highlight "{{ command.lexer }}", lineno='table' %}{{ command.script }}{% endhighlight %}
我试过:

{% highlight command.lexer, lineno='table' %}
{% highlight 'command.lexer', lineno='table' %}
{% highlight '{{ command.lexer }}', lineno='table' %}
甚至

{% set lexer = command.lexer %}
{% highlight 'lexer', lineno='table' %}
{% highlight '{{ lexer }}', lineno='table' %}
我似乎无法理解jinja2和jinja2高亮显示/pygments之间的渲染规则组合

我真的不想做这样的事情:

{% if command.lexer == 'bash' %}
{% highlight 'bash', lineno='table' %}
{% elif command.lexer == 'perl' %}
{% highlight 'perl', lineno='table' %}
...
{% endif %}
这似乎与jinja2解析器类有关,但我有点卡住了。。感觉我忽略了一些琐碎的事情

各种错误消息都类似于:

jinja2.exceptions.TemplateSyntaxError: expected token 'end of statement block', got ','

不幸的是,使用当前的插件似乎不可能。没有递归的jinja语法,插件解析的方式似乎不能很好地处理任何变量输入。我已经联系了作者,没有回复,在浏览了插件的源代码之后,似乎有可能但不值得我现在花时间进行必要的更改,所以

{% if command.lexer == 'bash' %}
{% highlight 'bash', lineno='table' %}
{% elif command.lexer == 'perl' %}
{% highlight 'perl', lineno='table' %}
...
{% endif %}

…是的。

您是否尝试过使用自定义过滤器请参见? (此方案不使用jinja2突出显示扩展,仅使用pygments)

在filters.py文件中(必要时创建) 在模板文件(.html)中
# highlight Filter
from pygments import highlight
from pygments import lexers
from pygments.formatters import HtmlFormatter

lexers_dict = dict()
html_formatter = HtmlFormatter()

def do_highlight(content, language):    
    lexers_dict.setdefault(language,lexers.get_lexer_by_name(language))

    return highlight(content, lexers_dict[language], html_formatter)


def init_app(app):
    """Initialize a Flask application with custom filters."""    
    app.jinja_env.filters['light'] = do_highlight
<div class="content">{{ command.script | light(command.lexer) | safe }}</div>
from my_app import filters
filters.init_app(app)