2010-05-19 20 views
3

Je souhaite créer une table des matières et des notes de fin dans un modèle Jinja2. Comment peut-on accomplir ces tâches?Créer des macros Jinja2 qui placent le contenu dans des emplacements distincts

Par exemple, je veux avoir un modèle comme suit:

{% block toc %} 
{# ... the ToC goes here ... #} 
{% endblock %} 

{% include "some other file with content.jnj" %} 

{% block endnotes %} 
{# ... the endnotes go here ... #} 
{% endblock %} 

Lorsque le some other file with content.jnj a un contenu comme celui-ci:

{% section "One" %} 
Title information for Section One (may be quite long); goes in Table of Contents 
... 
Content of section One 

{% section "Two" %} 
Title information of Section Two (also may be quite long) 

<a href="#" id="en1">EndNote 1</a> 
<script type="text/javsacript">...(may be reasonably long) 
</script> {# ... Everything up to here is included in the EndNote #} 

Là où je dis "peut être tout à fait moyen/long" I Cela signifie qu'il ne peut raisonnablement être mis entre guillemets en tant qu'argument d'une macro ou d'une fonction globale.

Je me demande s'il y a un motif pour cela qui peut accommoder ceci, dans le cadre de Jinja2.

Ma première pensée est de créer une extension, de sorte que l'on peut avoir un bloc pour les sections et notes finales, comme -SO:

{% section "One" %} 
Title information goes here. 
{% endsection %} 

{% endnote "one" %} 
<a href="#">...</a> 
<script> ... </script> 
{% endendnote %} 

Ensuite, ont des fonctions globales (qui passe dans l'environnement Jinja2) :

{{ table_of_contents() }} 

{% include ... %} 

{{ endnotes() }} 

Cependant, alors que cela fonctionnera pour les notes de fin, je suppose qu'il a besoin d'un second passage par quelque chose pour la table des matières.

Merci d'avoir lu. Je serais très obligé pour vos pensées et vos commentaires.

Brian

Répondre

2

On dirait que vous dirigez vers le bas le droit chemin dans la définition d'une structure cohérente pour chaque section (i.e. titre, corps, notes de fin). Est-ce que le stockage de ces informations dans des structures de données Python régulières - plutôt que dans des blocs Jinja et/ou des extensions personnalisées - serait acceptable? Exemple ci-dessous

dans content.jnj:

{% set sections = [] %} 
{% do sections.append({ 
'title': 'Section One title', 
'body': 
""" 
Section one main body text... 
""", 
'endnotes': 
""" 
<a href='#'>...</a> 
<script> ... </script> 
""", 
}) 
%} 
{# append more sections #} 

dans template.jnj:

{% from 'content.jnj' import sections as sections %} 
{# table of contents #} 
{% for section in sections %} 
    {{ loop.index }}. {{ section['title'] }} 
{% endfor %} 
{# body #} 
{% for section in sections %} 
    {{ section['title'] }} 
    {{ section['body'] }} 
{% endfor %} 
{# endnotes #} 
{% for section in sections %} 
    {{ loop.index }}. {{ section['endnotes'] }} 
{% endfor %} 

Notez que content.jnj nécessite l'Jinja2 do extension à être activé (par exemple env = jinja2.Environment(extensions=['jinja2.ext.do']).)

Il peut être surpuissant pour votre fins, mais une autre option est de stocker le contenu dans un langage de balisage, tel que reStructuredText, et concevoir la couche de présentation comme un thème Sphinx (Jinja2 est le format de modèle par défaut).