【问题标题】:Variable lexer in jinja2 highlightjinja2 中的变量词法分析器突出显示
【发布时间】:2017-06-07 04:10:31
【问题描述】:

我的 jinja2 模板收到一个代码块,其中可能包含任意数量的不同语言。我想将正确的词法分析器传递给模板并使用 jinja2-highlight 插件(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-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 ','

【问题讨论】:

    标签: python-3.x jinja2 pygments


    【解决方案1】:

    您是否尝试过使用 自定义过滤器 参见 http://jinja.pocoo.org/docs/2.10/api/#custom-filters ? (此提案没有使用 jinja2-highlight 扩展,而仅使用 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)
    

    【讨论】:

      【解决方案2】:

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

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

      ..是的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-13
        • 2013-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-31
        相关资源
        最近更新 更多