Hugo で各ページ固有のスタイルシートを呼び出す

Published
Category
Web

Hugo で各ページ固有の CSS を適用したい場合にどうするか悩んだのでその備忘録。

このサイトではで blog 的なページは /post 以下、個別のしっかりした記事は /doc 以下、というふうに分けている(つもり)。その中で /doc 以下の階層で個別のスタイルシートを適用したくなり、かつそれを記事ファイルと同じフォルダに置きたかったので、一工夫必要でした。

まず記事の元となる hoge.md と個別スタイルの custom.css/doc/hoge/ フォルダにいるとします。ここでテンプレートの header.html のスタイルシートを呼び出しているあたりに下記のコードを追加します。

{{ if ne (print (.Resources.Match "custom.css")) "[]" }}
<link rel="stylesheet" href="custom.css" />
{{ end }}

custom.css が同階層に存在すれば custom.css を呼び出す HTML タグを挿入するという流れです。ここでしばらくはまったのが、まずどの関数で存在判定をするのか。結果としては .Resources.Match "hoge" だったわけですが、他にも .Get などの機能が似ていそうな関数がいくつかあって調べるのに時間がかかりました。.Resources.Match は指定されたファイル等が存在しない場合に空文字列を返します。これが "[]" でした。しかしこのままでは判定に失敗するので、 .Resources.Matchprint でラップしてあげて文字列化し、無事判定に成功しました。

ここまで書いて判定文字列 "[]" をダブルクォーテーションで囲わなければよかったような気もしますが面倒なので今回は無視します。 やっぱり無理だったからこれで良し。

空の array は nil で表現できるようなので結局こうなった。すっきり。

{{- if ne (.Resources.Match "custom.css") nil -}}
<link rel="stylesheet" href="custom.css" />
{{- end -}}