• テクノロジー

Hugoでも「この記事は最終更新日からX年以上経過しています」みたいなアラートを表示したい

技術記事を書いている以上、その記事の信憑性とかそういうところはある程度担保したいもの。

Qiitaやその他のブログでよく見る「この記事は最終更新日からX年以上経過しています」みたいなアラートをHugoでも出すようにしてみる。

Hugoで実行時の日付を取得する

今回やりたいことを満たすためには、サイトをビルドしたタイミングの日付と、記事の更新日を比較する必要がある。

しかし、Hugoでサイトのビルド日付を取るのは一筋縄ではいかない。

.Site.LastChange.Yearは最新記事のDateを返すので使えない

Hugoではコピーライトの表示などのために、ビルドしたときの年が変数に格納されている。 この値をうまくつかって日付の比較ができいかと考えたが、この値は最後に更新した記事の日付を返すため、今回やりたいことには使えない。

.Site.LastChange.Year

getenvで環境変数から取る

どうやらいい感じにビルドした日付を取ることができなさそうなので、hugoコマンドにenvで変数を渡す方向で実現することにした。

env HUGO_BUILD_DATE="`date "+%Y%m"`" hugo

これをテンプレート内で取るにはこうする。

{{ getenv "HUGO_BUILD_DATE" }}

今回は年月までの比較しかしないけど、もし年月日すべてで精密な比較をしたい場合は渡す値を変えればいいと思う。

記事の最終更新日とビルド時の日付を整数として比較する

記事の最終更新日は.Lastmodに格納されているので、先程環境変数から格納した値と.Lastmodを比較しなければいけない。

テンプレート上で日付の比較をするほど高度な処理はできない(と思う)ので、単純に日付を整数に変換して扱う。

{{ if lt 100 (sub (int (getenv "HUGO_BUILD_DATE")) (int (.Lastmod.Format "200601"))) }}
alert here.
{{ end }}

渡したビルド時の日付と、対象記事の最終更新日の差が100を超える(1年経っている)場合にアラートを表示すれば、 それなりの精度でアラートが表示できる。