2017-01-22 8 views
0

Meine jinja2 Vorlage erhält einen Code-Block, der eine beliebige Anzahl von verschiedenen Sprachen enthalten kann. Ich würde gerne den richtigen Lexer an das Template übergeben und es mit dem jinja2-highlight Plugin (pygents) entsprechend rendern. Ich rendere meine Vorlage mit der 'Befehl' Variable, die ein Wörterbuch ist, das alle Daten enthält, die im Rest der Vorlage notwendig sind. Im Idealfall würde Ich mag etwas in diese Richtung tunVariable lexer in jinja2 highlight

{% highlight "{{ command.lexer }}", lineno='table' %}{{ command.script }}{% endhighlight %} 

ich versucht habe:

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

und sogar

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

Ich kann die Kombination von Rendering scheinen, um herauszufinden Regeln zwischen jinja2 und jinja2-highlight/pygents.

Ich mag etwas nicht tun möchte:

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

Es scheint mit der jinja2 Parser-Klasse zu tun zu haben, aber ich bin ein bisschen stecken .. fühlt sich an wie ich etwas mit Blick auf bin trivial.

verschiedene Fehlermeldungen alle wie folgt aussehen:

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

Antwort

0

Leider scheint es unmöglich, mit dem aktuellen Plug-ins. Es gibt keine rekursive Jinja-Syntax, und die Art und Weise, wie das Plugin analysiert, scheint keine Variableneingabe gut zu handhaben. Ich habe den Autor kontaktiert, ohne Antwort und nach der Quellcode des Plugins gerade scheint es möglich, aber nicht wert, meine Zeit in diesem Moment die notwendigen Änderungen vorzunehmen, so ..

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

..es ist.

0

haben Sie versucht mit einem benutzerdefinierten Filter siehe http://jinja.pocoo.org/docs/2.10/api/#custom-filters? (mein Vorschlag does'nt die jinja2-Highlight Erweiterung verwenden, aber nur pygments)

in Ihrer filters.py Datei (erstellen Sie es bei Bedarf)

# 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 

in Ihrer Vorlagendatei (.html)

<div class="content">{{ command.script | light(command.lexer) | safe }}</div> 

in Ihrer App-Datei (app.py):

from my_app import filters 
filters.init_app(app)