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を作るというのがスタンダードなやり方であることは忘れない方がいい。