Jekyllのブログポストを年別で整理して表示する方法
2023-01-02
ブログのページは以下の内容になっているので、同じように表示したい場合はまるっとコピペすればよい。
{% assign sec2023 = '2023/12/31' | date: "%s" %}
{% assign sec2022 = '2022/12/31' | date: "%s" %}
# 2023
{% for post in site.posts %}
{% assign postsec = post.date | date: "%s" %}
{% if sec2022 < postsec and postsec <= sec2023 %}
[{{post.date | date: "%Y-%m-%d"}} {{post.title}}]({{post.url}})
{% endif %}
{% endfor %}
解説
なお、インデントしていない理由はファイルがmarkdownなのでインデントするとmarkdownの構文として解釈されてしまうためである。
assign sec2023 = '2023/12/31' | date: "%s"
sec2023
という変数を定義し、内容は年末の秒数を入れている(多分エポック秒)。何に使うかは後述
for post in site.posts
…endfor
site.posts
がサイト内のポスト一覧なので、rubyでいえばsite.posts.each {|post| ...}
と同じ
assign postsec = post.date | date: "%s"
- ポストの投稿日時の秒数
if sec2022 < postsec and postsec <= sec2023
- ポストの投稿日時の秒数が2022/12/31から2023/12/31の間か
- 直接日付で比較することができないため、秒数で比較している
[{{post.date | date: "%Y-%m-%d"}} {{post.title}}]({{post.url}})
- 対象年内だったら日付とタイトルの文言でポストにリンクする
Off-by-oneエラーになりそう(2022/12/31のポストが2023年に入りそう)だけど、試してみたところならなかったので問題なさそう。
2024年になったら、sec2024
を増やして、2023のコードをまるっとコピーして変数の年数を変えるだけでよい。スマートではないがやりたいことはできる。
余談
Jekyll構文をエスケープしたい場合は{% raw %}...{% endraw %}
で括ればエスケープできる。