[Hugo] 記事を作成するコマンドで雛形にユニークなIDを設定してみた

Nプログラマ(@Nprog128)です。
Hugoで新しく記事を作成する時は、 newコマンド を使うことが多いと思います。
このコマンドで生成される雛形は、archetypesに配置してあるファイルによって決まります。(default.mdやposts.mdなど)
最近は下書きをいくつか予め作ることが増えたのですが、下書きのslug名が重複してプレビューで開きたい記事が開けなくなることがあります。
いちいちslugの重複を手動で変更するのは面倒なので、newコマンドで生成した時点でユニークなIDを含むslugを生成してみました。
雛形を確認
それでは記事用の雛形であるposts.mdです。
hugo new siteコマンドでデフォルトで作成されるものをそのまま使っています。
post.md コードを開く
1---
2title: {{ .Name }}
3date: {{ .Date }}
4dtaft: true
5---
今回は記事をpostディレクトリに作成しているので、post.mdにしています。
postsディレクトリに作成する場合は、posts.mdで作成してください。
ユニークなIDをslugへ設定する
それでは、slugへユニークなIDを設定する記述を追加します。
雛形の中では変数や関数も使う事ができるので、 .UniqueID というページ変数を使います。
.UniqueID the MD5-checksum of the content file’s path.
これはプロジェクト内のcontentからのファイルパスの文字列からmd5を計算しているので、これを使えばユニークなslug名を設定することができます。
先程のpost.mdにslugを以下のように追加します。
post.md コードを開く
1---
2title: {{ .Name }}
3date: {{ .Date }}
4dtaft: true
5slug: {{ .UniqueID }}
6---
これで記事を作成するコマンドを実行してみます。
1hugo new post/sample.md
sample.mdが生成されるので、post/sample.mdの中身を確認してみます。
1---
2title: "Sample"
3date: 2020-03-10T19:58:27+09:00
4draft: true
5slug: 2479ee70bf3aa46641688a2796f47257
6---
slugの設定値にhash値が入っていることを確認することができました。
これで下書きをまとめて作ってもslug名が重複することがなくなりました。
Unix関数でもできる
.UniqueIDの他にもUnix関数を使えば、ユニークなIDを取得することができます(よほどタイミングが合わない限り)
1slug: "{{ (time .Date).Unix }}"
.UniqueIDの場合はslugを変更せずにファイル名を変更したりすると重複する可能性がありますが、Unix関数の場合は基本的にそれがなくなります。
ちょっと寄り道: 本当にmd5のチェックサムなのか?
.UniqueIDを使ってslugに設定された値が本当にmd5から生成されたチェックサムなのか、気になったので検証してみました。
ドキュメントにはcontent file’s pathと記述されているので、コンテンツディレクトリからの相対パスでいいようです。
Macにはmd5というコマンドがあるので、これを使ってハッシュ値を計算します。
ポイントは、ファイル自体のハッシュ値ではなく、ファイルパスのハッシュ値であることです。
なので、md5コマンドでファイルパスの文字列をハッシュ値にするために-sオプションを使います。
\$ md5 -s 'post/sample.md'
これで出力されたハッシュ値は以下の通りです。
2479ee70bf3aa46641688a2796f47257
これと先程の雛形から生成されたハッシュ値と比較してみると同じだったので、md5のチェックサムであることが分かりました。
実はここにたどり着くまでちょっと苦労していて、最初はファイル自体のハッシュ値で計算していたため、同じハッシュ値が出なくてちょっとアレアレ!?って騒いでおりました。。。
おわりに
今回は、 Hugoで記事を作成する時の雛形にユニークなIDを設定する方法、という内容でした。
これで下書きのslugが重複せずにまとめて作ることができて、ちょっとラクになりました。
slugの変わりにurlに使ってもいいかもしれないと思ったり。。。
それでは、このへんで。
バイナリー!