Переменная лексера в выделении jinja2

Мой шаблон 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 ','

2 ответа

Вы пытались с пользовательским фильтром см. http://jinja.pocoo.org/docs/2.10/api/? (мое предложение не использует расширение jinja2-highlight, а только фрагменты)

в вашем файле 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)

К сожалению это кажется невозможным с текущим плагином. Здесь нет рекурсивного синтаксиса jinja, и способ, которым плагин анализирует, похоже, плохо обрабатывает ввод переменных. Я связался с автором без ответа, и после просмотра исходного кода плагина кажется возможным, но не стоящим моего времени в данный момент, чтобы внести необходимые изменения, так что..

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

..это.

Другие вопросы по тегам