Nanocで1ファイルからたくさんのページを作る
静的サイトジェネレーションと言えば最近はGatsbyやNest.jsが元気いいかんじだけど、単純なHTMLやJSONの生成などにはNanocも手軽で依然便利である。
今回は同じ構成のサイトで文言が少しだけ違うようなものを量産する際には設定ファイルだけ書いてサイト全体を生成できたら便利だなということで、Itemに複数のrepresentationを用意することでそれを実現してみた。
representationは同じItemからHTMLやJSONなど複数のフォーマットの異なるファイルを作れるというものだが、公式ドキュメントのItems and layoutsを見ると
a cue sheet representation, useful for track list pages
とも書いてあるのでメタデータから複数ファイルを生成するというのも公式の想定する使い方であることが分かる。
(上記はメタデータに記述したキューシートからトラックごとのページを生成するということだろう)
Rules
%w{index profile about}.each do |page_key|
compile '/data.yml', :rep => page_key.to_sym do
layout "/#{page_key}.*"
write "/#{page_key}.html"
end
end
DSL内にRubyのコードが書けるのでループでDRYに。
content/data.yml
本文は空にしてメタデータだけ書く。
---
site_title: ほげほげ
index:
title: いんでっくす
subtitle: さぶたいとる
profile:
title: ぷろふぃーる
name: akahige
detail: >
ひあどきゅめんと的な
テキストです。
about:
title: あばうと
detail: >
ひあどきゅめんと的な
テキストです。
---
layoutファイル
今回の例では以下のレイアウトファイルをlayoutディレクトリ以下に用意する。
- index.html
- profile.html
- about.html
部分テンプレートとして
- header.html
- fotter.html
あたりも用意するといいだろう。
ちなみに
このやり方は画像がメインで少しだけのテキストがある、といったサイトを量産するのに向いたアプローチ。
細かい融通は利かないし、利かせようとするとかえって手間がかかるので注意。
layoutはdefault.htmlだけにしてcontentの中にindex.html、profile.html、about.htmlを作るというのがスタンダードなやり方であることは忘れない方がいい。