ベーステンプレート(Base Templates)
「デザイン部分を部品化する Partial Templates」でテンプレートの一部を切り出しましたが、ここではサイト全体で共通する土台として使用できるベーステンプレート(Base Templates)を見ていきます。 Hugo のベーステンプレートは、Go のテンプレートライブラリである block template という仕組みを使用しており、block で定義した部分を、define で定義した内容に置き換えます。
ベーステンプレート
Hugo では、次のようなサイト全体で共通する html をベーステンプレート (baseof.html) として作成し、ページ毎に変更したいブロックを通常のテンプレート(リストテンプレートやシングルページテンプレート)で定義した内容に置き換えることができます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<link rel="icon" href="favicon.ico">
...
</head>
<body>
...
</body>
</html>
ベーステンプレート機能は、Go のテンプレートパッケージにある block template パッケージを使用しており、block で定義した部分が、define で定義した内容に置き換えられます(下図参照)。ベーステンプレートを使用する場合、基本的にすべてのページがベーステンプレートを使用して生成され、どのテンプレートで置き換えられるかはベーステンプレートを使用しない場合と同じ参照ルールによって決定されます。 例えば、ホームページやセクションページなどの生成には list.html が使用され、個々の記事ページの生成には single.html が使用されます。
Go 言語でのblock template パッケージ
Go 言語にも興味がわいてきたので、少しずつ掘り下げていきたいと思います。 Hugo で行われていることの確認として block template パッケージの簡単な使い方を確認してみます。
まず、ベースとなるテンプレートと置き換えるテンプレート( layout.html , contents.html)を用意します。
{{define "layout"}}
<html>
<head>...</head>
<div>
{{block "contents" .}}
not found
{{end}}
</div>
</html>
{{end}}
実行するプログラムは、次のプログラムを用意します。
{{define "contents"}}
<h1>contents_title</h1>
{{end}}
package main
import (
"html/template"
"os"
)
func main() {
t, _ := template.ParseFiles("layout.html", "contents.html")
t.ExecuteTemplate(os.Stdout, "layout", nil)
}
置換された結果が出力されることを確認できます。