ベーステンプレート(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)
}

置換された結果が出力されることを確認できます。