簡體   English   中英

Jinja2 Output Markdown

[英]Jinja2 Output Markdown Frontmatter to List

我有一個 Markdown 文件的文件夾。 每個文件都包含一個 YAML frontmatter 塊。 我正在嘗試將 output 標題從每個文件的 frontmatter 轉換為 Jinja2 模板,並將它們全部列出在 HTML 文件中。

在沒有 Jinja2 的情況下顯示標題沒有問題,但是當我嘗試將 output 轉換為我的 Jinja2 模板時,一切都崩潰了。

這是我正在使用的 Markdown 文件的示例, title:我要列出的項目:

---
title: Test
date: 2020-03-26
---

## Test Markdown

這是我正在使用的 Python 代碼。 我正在使用python-frontmatter模塊從每個 Markdown 帖子中提取frontmatter。

使用 frontmatter 模塊很容易 select 標題並將其顯示在終端上,但使用 Jinja2 模板我沒有得到任何結果。 content.metadata是一個字典。

import frontmatter
import jinja2
import glob

# Initialise Jinja2:
jinja2_env = jinja2.Environment(
    loader=jinja2.FileSystemLoader("templates"),
)

# Get list of posts:
posts = glob.glob("posts/*.md")

def build():

    with open("test.html", "w", encoding="utf-8") as index_file:
        for post in posts:
            content = frontmatter.load(post)

            # Prints titles to the terminal the way I want to output them in the Jinja template:
            print(content.metadata["title"])

            # Jinja output:
            template = jinja2_env.get_template("test.html.j2")
            rendered = template.render(frontmatter=content.metadata)
            index_file.write(rendered)

build()

我的 Jinja2 模板如下所示:

<ul>
{% for key, value in frontmatter.items() %}
    <li><a href="">{{ value.title() }}</a></li>
{% endfor %}
</ul>

這根本不起作用,我收到錯誤jinja2.exceptions.UndefinedError: 'datetime.datetime object' has no attribute 'title' 如果我刪除.title() ,則創建的 HTML 文件最終會遍歷字典,但會為每個字典輸出完整的模板:

<ul>

    <li><a href="">Test Title 1</a></li>

    <li><a href="">2020-10-21 10:00:20</a></li>

</ul><ul>

    <li><a href="">Test Title 2</a></li>

    <li><a href="">2019-06-09 17:42:12</a></li>

</ul><ul>

    <li><a href="">Test Title 3</a></li>

    <li><a href="">2019-06-09 17:42:12</a></li>

</ul>

我在這里的 Python 知識有限,所以解決這個問題的任何幫助都會很棒。 最后我想要的是一個 HTML 文件,它輸出每個文件的標題,如下所示:

<ul>
    <li><a href="">Test Title 1</a></li>
    <li><a href="">Test Title 2</a></li>
    <li><a href="">Test Title 3</a></li>
</ul>
<ul>
{% for key, value in frontmatter.items() %}
    <li><a href="">{{ value.title() }}</a></li>
{% endfor %}
</ul>

這是錯誤的。 就像錯誤消息說的那樣,您在日期時間 object (您的date前事項)上調用title() ) 。

您的循環正在遍歷前面的每個key (標題,然后是日期)以及value

<ul>
    <li><a href="">{{ frontmatter.title }}</a></li>
    <li>{{ frontmatter.date }}</li>
</ul>

當然,這只會顯示您的一個源文件的標題,因為您正在遍歷每個帖子並將它們呈現為完全獨立的模板:

for post in posts:

您要渲染1 個模板,因此請刪除您對render()調用的 for 循環並將其傳遞給您的所有帖子:

rendered = template.render(
    posts=posts,
    posts_meta=[frontmatter.load(post).metadata for post in posts]
)

...並在您的模板中循環它們:

<ul>
{% post_meta in posts_meta %}
    <li><a href="">{{ post_meta.title }}</a></li>
{% endfor %}
</ul>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM