jinja2中的变量词法分析器突出显示
问题描述:
我的jinja2模板接收可能包含任意数量不同语言的代码块。我想将正确的词法分析器传递给模板,并使用jinja2-highlight插件(pygments)进行相应的渲染。 我使用'command'变量呈现我的模板,该变量是一个保存模板其余部分所需的所有数据的字典。理想情况下,我想沿着这些线路jinja2中的变量词法分析器突出显示
{% 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-highlight/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 %}
..它是。
答
您是否尝试过使用自定义过滤器请参阅http://jinja.pocoo.org/docs/2.10/api/#custom-filters? (我的建议一点儿也不使用的Jinja2高亮扩展名,但只有Pygments来做)
在filters.py文件(如有必要创建它)
# 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
在模板文件
(的.html)
<div class="content">{{ command.script | light(command.lexer) | safe }}</div>
在您的应用程序文件
(app.py):
from my_app import filters
filters.init_app(app)