Jinja 模板渲染数据¶
数据写在 Python 里, 文档里只写模板。数据一改, 重新构建, 所有表格自动更新。
数据从哪来¶
conf.py 把 sanhe_me_kb.docs.doc_data 注册成名为 doc_data 的 jinja context:
# ``{jinja} doc_data`` renders its body with these variables, then parses the
# result in the page's own syntax (MyST in .md, reST in .rst).
from sanhe_me_kb.docs import doc_data
jinja_contexts = {
"doc_data": {
"doc_data": doc_data,
},
}
数据本身是一个 list of tuple:
users = [
(1, "alice"),
(2, "bob"),
]
{jinja} directive 先用 jinja 渲染它的内容, 再按当前页面的语法解析渲染结果: .md 页面按 MyST 解析, .rst 页面按 reST 解析。
例子 1: Markdown 表格¶
模板:
```{jinja} doc_data
| id | name |
| :--- | :--- |
{% for id, name in doc_data.users -%}
| {{ id }} | {{ name }} |
{% endfor %}
```
结果:
id |
name |
|---|---|
1 |
alice |
2 |
bob |
例子 2: reST list-table¶
在 .md 页面里要输出 reST, 就把渲染结果包在 {eval-rst} 里。在 .rst 页面里直接写 .. jinja:: doc_data 即可, 不需要 eval-rst。
模板:
````{jinja} doc_data
```{eval-rst}
.. list-table:: Users
:header-rows: 1
:widths: 10 90
* - id
- name
{% for id, name in doc_data.users %}
* - {{ id }}
- {{ name }}
{% endfor %}
```
````
结果:
id |
name |
|---|---|
1 |
alice |
2 |
bob |
例子 3: 不用 reST 的 list-table¶
MyST 自己也有 {list-table} directive, 语法和 reST 一样, 只是外面用 Markdown 的 fence:
id |
name |
|---|---|
1 |
alice |
2 |
bob |