今回は、Hugoについてです。_index.md
は標準では限られたコンテンツしか含めないので、それを改造していきたいと思います。
そもそも_index.md
とは?というところにも触れるので、_index.md
とindex.md
の仕様に疑問がある方は必見です。
Hugoでの_index.md 見出しへのリンク
以下のようなフォルダがサーバー上にあったとします。
- contents
- old
* index.html
* old_content.html
* index.html
* content1.html
* content2.html
この時に、contents/
とcontents/index.html
はアクセスしたときに同じ様に表示されます。
同様にcontents/old/
とcontents/old/index.html
も同じ表示となります。
これは、フォルダにアクセスしたときに、index.html
が存在するか探索されるからです。
一方で、Hugoでは、index.md
と_index.md
というこれとほぼ同様の役割を果たすものをが用意されています。
ただ、これらは厳密には異なり、仕様が異なります。
ひとつづつ見ていきましょう。
index.mdの仕様 見出しへのリンク
index.md
はほとんどindex.html
のようなものであると思ってもらってもいいです。
- contents
- blog
* index.md
のようにファイルを配置すれば、ビルド後は、[servername]/blog/
とアクセスすることもできるし、
[servername]/blog/index.html
とアクセスすることも出来ます。
ただ、index.md
には__落とし穴__が…
- contents
- blog
- item
* index.md <- NG (index.md被りは禁止)
* index.md <- OK
* server.md <- NG (server/indexかのように扱われる)
- about
* index.md
このような配置をして、ビルドすると、server.md
とitem/index.md
がビルドされません!
なぜかと言うと、index.md
は 下層ノードでの重複が禁止 されているからです。
即ち、blog/
はもう既にindex.md
を持っているので、子ディレクトリのindex.md
はビルドされません。
Hugoはserver.md
の様なファイルをserver/index.html
にビルドしようとするのでserver.md
もビルドされません。
ややこしいですね。即ち、index.md
をフォルダに置いたら、その子フォルダのMarkdownファイルはすべてビルドされないということです。
これは前述のHTMLのサーバーとは全く異なる仕様です。
_index.mdの仕様 見出しへのリンク
一方、_index.mdは
- contents
- blog
- item
* _index.md <- OK
* _index.md <- OK
この様に配置しても問題ありません!
なぜかというと、_index.md
はindex.md
と用途が異なるからです。
Hugoにおいて、_index.md
は、他のページへの 道しるべの役割 を果たすものなのです。_index.md
はその子フォルダにどの様な記事が存在するかを、リスト形式で示すために存在します。
ただ、その用途に特化するためなのか、_index.md
に記事を書いても、 無視されます。
ここまでをまとめると
index.md | _index.md | |
---|---|---|
下層ノードでの重複 | x | o |
記事を含めるか | o | x |
本編 (前置き長すぎ)
見出しへのリンク
ここで、当然、疑問として、 “下層ノードでの重複を許しながら、記事を含んだものを作れるの?” というのが浮かびます。
答えは YES です。
私もこの疑問を持ったのですが、ごり押しで解決できたので、その方法を紹介したいと思います。
- まず、Hugoで作業しているディレクトリに行きます。
- 以下のようなディレクトリとファイルを作成します。パスでかけば、
layouts/_default/list.html
です。
layouts/_default/list.html
を以下のように書き換えます。
{{ define "title" }}
{{- .Title }} · {{ .Site.Title -}}
{{ end }}
{{ define "content" }}
{{ if .Params.ispage }}
{{ partial "page.html" . }}
{{ else }}
{{ partial "list.html" . }}
{{ end }}
{{ end }}
何をしたかというと、_index.md
をオーバーライドして、任意のコンテンツを含めるようにしました。
これを行えば、_index.md
に普通に記事を書いて、パラメーターとしてMarkdownの先頭に
ispage: true
と追加してあげるだけで、重複可能な記事を含んだコンテンツを作れるようになります!
おわりに 見出しへのリンク
いかがだったのでしょうか?
いわゆる、index.html
と同じ仕様のものを探していたのですが、なかったのでオーバーライドすることになりました。index.md
を重複可能にする方法も探したのですが、どうやらHugo本体のほうで定義されているようなので、仕様変更は不可能でした。