Zolaで生成したブログの更新履歴をいい感じに表示する
2022/11/29 17:28 | 公開 |
目的
記事のMarkdownのヘッダーに下記ような記述をして
title = "タイトル"
date = 2022-11-19T22:00:00+09:00
[extra]
updated_histories = [
{ date = 2022-12-22T01:07:00+09:00, content = "追記1" },
{ date = 2022-11-21T23:52:00+09:00, content = "修正B" },
{ date = 2022-11-20T11:24:00+09:00, content = "修正A" },
]
下の画像のように表示するというのが目的です。
このサイトであればこことかが更新履歴が複数あってわかりやすいです。
前提
Zolaのテーマのhtmlを自分で編集できる。
誰かが作ったテーマを使用している場合はgithubからインストールしていることが多いと思いますがその場合でも記事のテンプレート(多くの場合post.html
)が編集できれば問題ないです。
やること
テンプレートファイル編集
記事のテンプレートファイル(page.html
とか)を開いて更新履歴を表示したい箇所に下記の記述を追加します。
<section class="update_history">
<table>
<tr>
<td><span class = "date">{{ page.date | date(format="%Y/%m/%d %H:%M") }}</span></td>
<td>公開</td>
</tr>
{% if page.extra.updated_histories %}
{% for item in page.extra.updated_histories | sort(attribute="date") %}
<tr>
<td><span class = "date">{{ item.date | date(format="%Y/%m/%d %H:%M") }}</span></td>
<td class="update_history_content">{{ item.content | markdown | safe }}</td>
</tr>
{% endfor %}
{% endif %}
</table>
</section>
Markdownに更新履歴を追加
記事のMarkdownに以下のように [extra]
updated_histories
を追加します。
updated_histories
はtoml
の辞書形式でdate
(更新日時)とcontent
(更新内容)を記述します。
[extra]
updated_histories = [
{ date = 2022-12-22T01:07:00+09:00, content = "追記1" },
{ date = 2022-11-21T23:52:00+09:00, content = "修正B" },
{ date = 2022-11-20T11:24:00+09:00, content = "修正A" },
]
結果
cssにもよりますがおおよそこのように表示されると思います。
ざっくり解説
まずhtml
の方です。
ここは更新履歴を表示するまとまりを記述しているだけです。
section
ではなくdiv
でも良いですし、class
も別名で構いません。なんならこのタグ自体なくしても問題はないと思います。
ただあったほうがcssでスタイルをいじりやすいのでこうしています。
<section class="update_history">
<!-- 省略 -->
</section>
ここは投稿日を表示しています。
投稿日はヘッダーのdate
の内容が使用されます。
日付のフォーマットは"%Y/%m/%d %H:%M"
を指定していますが好きに編集していただいて構いません。
<table>
<tr>
<td><span class="date">{{ page.date | date(format="%Y/%m/%d %H:%M") }}</span></td>
<td>公開</td>
</tr>
<!-- 省略 -->
</table>
今回のキモ1です。
1行目はMarkdownのヘッダーにextra.updated_histories
が設定されている場合に更新履歴を表示するための条件です。
2行目の{% for ... %}
では更新履歴は日付でソートを行い、要素をループで処理します。
4行目の日付表示は投稿日と同じです。
5行目は更新内容をMarkdownとして解釈し表示するための記述です。
1 {% if page.extra.updated_histories %}
2 {% for item in page.extra.updated_histories | sort(attribute="date") %}
3 <tr>
4 <td><span class="date">{{ item.date | date(format="%Y/%m/%d %H:%M") }}</span></td>
5 <td class="update_history_content">{{ item.content | markdown | safe }}</td>
6 </tr>
7 {% endfor %}
8 {% endif %}
リストではなくテーブルとして表示しているのはフォントによっては日付と更新内容がきれいに並ばなかったからです。
好みでリストにしても問題ないです。
次にMarkdown側の変更です。今回のキモ2です。
ヘッダーにZolaが用意していない要素(extra
)のupdated_histories
を追加しそこに日付と更新内容を格納します。
[extra]
updated_histories = [
{ date = 2022-12-22T01:07:00+09:00, content = "追記1" },
{ date = 2022-11-21T23:52:00+09:00, content = "修正B" },
{ date = 2022-11-20T11:24:00+09:00, content = "修正A" },
]
contentはMarkdownとして解釈されるため
updated_histories = [
{ date = 2022-12-22T01:07:00+09:00, content = "**追記1**" }, # 強調表示
]
みたいなこともできます。
あとがき
これだけのことをやるのにもZolaとTeraの仕様を理解していないと難しかったです。
テーマ編集は苦しいですが楽しいです。