Hugo導入記(3) ドキュメントルート用index.html
- Categories
- Tags
- Share
では、ドキュメントルート用のindex.htmlを書いていきましょう。 前回、テーマ「happy」を作ったので、それを編集していきます。
まず、layoutsディレクトリをおさらいします。
themes/happy/layouts/
├── 404.html
├── _default
│ ├── list.html
│ └── single.html
├── index.html
└── partials
├── footer.html
└── header.html
この、index.htmlを編集していきます。
index.htmlを編集
では書いていきましょう。
まずは、header
部分や、footer
部分を書きましょう。
最初は、余計な情報・ロジックはなるべく載せないようにします。
これをthemes/happy/index.html
にコピーしてください。
<!DOCTYPE html>
<html lang="ja-JP">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="description" content="">
<meta name="keywords" content="">
<link href="{{ .RSSlink }}" rel="alternate" type="application/rss+xml" title="{{ .Site.Title }}">
<title>{{ $isHomePage := eq .Title .Site.Title }}{{ .Title }}{{ if eq $isHomePage false }} - {{ .Site.Title }}{{ end }}</title>
</head>
<body>
<noscript>当サイトはJavaScriptを使用しています。JavaScriptを有効にしてください。</noscript>
<div class="blog-header">
<header>
<h1><a href="/">ブログのタイトル</a></h1>
<p>ブログの説明など</p>
</header>
</div>
<!-- 先頭からここまでがヘッダー共通部分 -->
<main>
<h1>テスト</h1>
<!-- あとで記事表示部分を入れる -->
</main>
<!-- ここから最後まで、フッター共通部分 -->
<div class="blog-footer">
<footer>
<p class="copyright">Copyright ©</p>
</footer>
</div>
</body>
</html>
では、確認してみましょう。Hugoのプロジェクトのディレクトリで以下を入力してHugoのサーバーを立ち上げておきます。
hugo server -t happy -w -D
これで、http://localhost:1313/にアクセスすると、以下のような画面が表示されます。
この状態でも、一応テンプレートは出来上がっていますが、追加された記事が画面に表示されるような処理は書いていません。 追加された記事を表示したいところですが、その前に、まずは共通部分を他のファイルに分けて、分離してみましょう。
共通部分を部分テンプレートにする
layoutsディレクトリのおさらいをします。
中に、partialsディレクトリがあり、そこに、header.html
とfooter.html
があります。
themes/happy/layouts/
├── 404.html
├── _default
│ ├── list.html
│ └── single.html
├── index.html
└── partials
├── footer.html
└── header.html
partialsディレクトリは、部分テンプレート置き場です。 部分テンプレートとは、様々なテンプレートから共通で利用するパーツのことです。 Hugoでいえば、以下のもので共通で使い回すと便利です。
- ドキュメントルート用のindex.html
- 記事一覧用の
_defualt/list.html
など - 記事用の
_default/single.html
など
ひとまず、使ってみましょう。ヘッダー、フッターの内容をindex.html
からカットして、ペーストしてみましょう。
ヘッダー
partials/header.html
に以下をコピーしましょう。
<!DOCTYPE html>
<html lang="ja-JP">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="description" content="">
<meta name="keywords" content="">
<link href="{{ .RSSlink }}" rel="alternate" type="application/rss+xml" title="{{ .Site.Title }}">
<title>{{ $isHomePage := eq .Title .Site.Title }}{{ .Title }}{{ if eq $isHomePage false }} - {{ .Site.Title }}{{ end }}</title>
</head>
<body>
<noscript>当サイトはJavaScriptを使用しています。JavaScriptを有効にしてください。</noscript>
<div class="blog-header">
<header>
<h1><a href="/">ブログのタイトル</a></h1>
<p>ブログの説明など</p>
</header>
</div>
フッター
partials/footer.html
に以下をコピーしましょう。
<div class="blog-footer">
<footer>
<p class="copyright">Copyright ©</p>
</footer>
</div>
</body>
</html>
index.htmlを再編集
では、部分テンプレートを読み込んでみましょう。
themes/happy/index.html
で、{{ partial "header.html" . }}
のように書いてみましょう。
{{ partial "header.html" . }}
<main>
<h1>テスト</h1>
<!-- あとで記事表示部分を入れる -->
</main>
{{ partial "footer.html" . }}
themes/happy/index.html
の中身が簡潔になりましたね。
これで、ドキュメントルートに出力するべきコンテンツのみに注力してテンプレートを編集できます。
次に、Hugoのロジックの記述方法について軽く説明します。
Hugoのロジック記述方法
さきほど、{{ partial "header.html" . }}
のように書いてみましょう、と書きました。
これがまさにHugoの記述方法です。{{ 処理内容 }}
という書き方をします。ですので、{{}}
が出てきたら、Hugo用の処理を何かやってるな、と思って下さい。
今回使った{{ partial "header.html" . }}
は、partialsディレクトリのheader.html
を読み込んで、内容(.
)をここに出してね、という処理です。
この.
がHugoにとって重要だと思われるので、書き忘れないように注意しましょう。
これは私個人の印象なのですが、Hugoの.
は、プログラマやJavaScriptをやったことがあるデザイナーさんにわかりやすくいうと、this
だと思います。
そう考えると、後々出てくるHugoの処理について、理解しやすいのではないかと思います。
記事を表示する
先に記事を作っておく
では、いよいよ記事を表示します。が、その前に、表示する記事を作っておかなければなりません。とりあえず10個作ってみます。
hugo new post/0001.md
hugo new post/0002.md
hugo new post/0003.md
hugo new post/0004.md
hugo new post/0005.md
hugo new post/0006.md
hugo new post/0007.md
hugo new post/0008.md
hugo new post/0009.md
hugo new post/0010.md
Hugoはmarkdown形式で記述ができるので、拡張子を.md
にしています。どんな内容になっているか、post/0001.md
を見てみましょう。
+++
date = "2016-04-28T00:00:24+09:00"
draft = true
title = "0001"
+++
この+++
で囲まれたところは、Front Matter
というもので、記事固有の変数を設定できる領域です。
詳しくは、HugoのサイトのFront Matterにありますが、今回は特にいじりません。
後々やっていきましょう。とりあえず、簡単に説明すると、
- date
- 記事の作成日時
- draft
- 下書きか否か(trueなら下書き状態)
- title
- 記事のタイトル
では、今回は各記事をわかりやすくするために、本文を書いておきます。
+++
date = "2016-04-28T00:00:24+09:00"
draft = true
title = "0001"
+++
これは0001の本文です。
0001.md
だけでなく、全部本文を書いておくといいでしょう。
index.htmlを編集して記事を出す
では、themes/happy/layouts/index.html
を編集して記事を出してみましょう。
{{ partial "header.html" . }}
<main>
{{ range .Data.Pages }}
<article>
<h1>{{ .Title }}</h1>
<div>
<span>投稿日時: {{ .Date.Format "2006-01-02" }}</span>
</div>
<p>{{ .Content }}</p>
</article>
{{ end }}
</main>
{{ partial "footer.html" . }}
{{ range .Data.Pages }}
で、記事のループ処理が開始されます。{{ end }}
を入れて、ちゃんと閉じましょう。
Hugoの場合、ループ処理を行うと、ループの度に記事の内容が暗黙の変数に入れられます。
そのため、range内で{{ .Title }}
や{{ .Content }}
のように短く直感的に書くことができます。
暗黙の変数を使わないことも可能です。以下のようにすれば、$article
という変数にループごとの記事の内容を代入できます。
{{ range $article := .Data.Pages }}
<article>
<h1>{{ $article.Title }}</h1>
<div>
<span>投稿日時: {{ $article.Date.Format "2006-01-02" }}</span>
</div>
<p>{{ $article.Content }}</p>
</article>
{{ end }}
どちらの書き方がいいかは、好みの問題だと思います。 ただ、公式サイトのサンプルは、暗黙の変数を使っていることがほとんどなので、「暗黙の変数を使うとわかりにくい!」と感じるところでのみ、 明示的に変数を使えばいいと思います。
さて、この修正によって、記事が一覧で表示されるようになりました!
ようやく少しブログらしくなってきましたねー。
今回のまとめ
今回は、Hugoでブログの内容を全部出すようにテンプレートindex.html
を書きました。
その中で、部分テンプレートや、rangeによるループを紹介しました。 今のところは、とりあえず出せるようになっただけですので実用にはまだまだですね。 現在の状態だと記事があるぶんだけ全部出てしまうので、100件くらい記事があるととんでもなく長いページになってしまいます。
次回は、index.html
でのページングをやっていきます。お楽しみに。