3

我想在 Jinja2 模板中创建目录和尾注。怎样才能完成这些任务?

例如,我想要一个模板如下:

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

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

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

其中some other file with content.jnj有这样的内容:

{% 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 #}

我说“可能相当长/相当长”的意思是说它不能合理地放在引号中作为宏或全局函数的参数。

我想知道在 Jinja2 的框架内是否有一种可以适应这种情况的模式。

我最初的想法是创建一个扩展,以便可以为部分和尾注设置一个块,如下所示:

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

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

然后有全局函数(在 Jinja2 环境中传递):

{{ table_of_contents() }}

{% include ... %}

{{ endnotes() }}

但是,虽然这适用于尾注,但我认为它需要对目录进行第二次传递。

感谢您的阅读。我非常感谢您的想法和意见。

布赖恩

4

1 回答 1

2

似乎您在为每个部分(即标题、正文、尾注)定义一致的结构方面走在正确的道路上。将这些信息存储在常规 Python 数据结构中——而不是 Jinja 块和/或自定义扩展中——是否可以接受?下面的例子。

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 #}

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 %}

请注意,content.jnj需要启用 Jinja2do扩展(例如 env = jinja2.Environment(extensions=['jinja2.ext.do']).)

出于您的目的,这可能有点矫枉过正,但另一种选择是将内容存储在标记语言中,例如 reStructuredText,并将表示层设计为Sphinx主题(Jinja2 是默认模板格式)。

于 2010-08-16T10:32:38.713 回答