Jekyllのブログポストを年別で整理して表示する方法

2023-01-02

ブログのページは以下の内容になっているので、同じように表示したい場合はまるっとコピペすればよい。

{% raw %}
{% 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 %}
{% endraw %}

解説

なお、インデントしていない理由はファイルが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の間か
    • 直接日付で比較することができないため、秒数で比較している
  • {% raw %}[{{post.date | date: "%Y-%m-%d"}} {{post.title}}]({{post.url}}){% endraw %}
    • 対象年内だったら日付とタイトルの文言でポストにリンクする

Off-by-oneエラーになりそう(2022/12/31のポストが2023年に入りそう)だけど、試してみたところならなかったので問題なさそう。

2024年になったら、sec2024を増やして、2023のコードをまるっとコピーして変数の年数を変えるだけでよい。スマートではないがやりたいことはできる。

余談

Jekyll構文をエスケープしたい場合は{% raw %}{% raw %}...{%{% endraw %} endraw %}で括ればエスケープできる。