これが激ムズ。
成果物
構成
構成
- templates/
- about/
- section.html
- page.html
- archive/
- section.html
- page.html
- author/
- section.html
- page.html
- blog/
- section.html
- page.html
- index.html
- section.html
- page.html
- about/
- content/
- about/
- index.md
- archive/
- index.md
- author/
- index.md
- blog/
- _index.md
- 20210729100000.md
- 20210730100000.md
- 20210731100000.md
- about/
学習したこと
ディレクトリ構成
zola init $SITE_ROOT
で新規作成すると以下のようなディレクトリ構成になっている。
ディレクトリ | 役割 |
---|---|
templates/ |
HTMLテンプレートを配置する |
content/ |
Markdownを配置する |
static/ |
CSSなど共有ファイルを配置する |
themes/ |
テーマを配置する |
テーマについては今はやらない。
templates/
HTMLとtera構文を組み合わせてテンプレートを書く。
予約されているファイル名が3つある。以下のとおり。
ファイル名 | URL | 役割 |
---|---|---|
index.html |
{base_url} |
サイトのトップページ |
section.html |
{base_url}/{section} |
セクションのトップページ |
page.html |
{base_url}/{section}/{page}/ |
末端の記事ページ |
セクションやページについては後述する。
content/
Markdownファイルを配置する。
予約されているファイル名はindex.md
と_index.md
の2つ。
templates/
とcontent/
の各ファイルにおける対応は以下のとおり。
templates/ |
content/ |
---|---|
index.html |
(なし), index.md , _index.md |
section.html |
{section}/index.md , {section}/_index.md |
page.html |
{section}/{page}.md |
{section}
や{page}
は予約名以外の任意名前をつけることができる。
セクション
content/
配下に任意のディレクトリを作るとそれがzolaのセクション
になる。このセクションはURLでいうと{base_url}/{セクション}/
のようになる。ディレクトリ階層と連動しているため、深く作るほどURLも深くなってゆく。
{base_url}/{セクション}/
にアクセスするとそのセクション・ディレクトリにあるindex.html
または_index.html
が表示される。両者のちがいについては後述する。
このセクションはHTMLの<section>
タグとは無関係だ。さらにいえばtomlの[セクション]
とも別である。同じ名前なだけにややこしい。一般的な名前であるせいでググラビリティも低い。
ページ
セクション・ディレクトリにindex.md
, _index.md
以外のファイル名でつくったMarkdownファイルのこと。たとえばhello.md
や2021-07-01.md
など。contetnt/{section}/hello.md
のようなパスになる。{base_url}/{section}/hello.md
のようなURLでアクセスする。
ページ
という語も一般用語なので紛らわしい。現にこの記事でも、zolaの概念におけるページと、HTML文書を意味するページ、どちらの意味でも使われている。なんてややこしんだ。
templates/
直下のsection.html
とpage.html
は必須だった
content/_index.md
のフロントマターでtemplate
,page_template
を別パスで指定すれば不要だと思っていたが、そうではないらしい。なぜか使っていないのにtemplates/
直下のsection.html
とpage.html
は必須だった。さもなくばエラーが出る。なんでや!
index.md
と_index.md
いやいや_index.md
ってなんだよ。index.md
じゃダメなの?
じつはzolaのヤツめが使い分けている。なんてキモチワルイんだ。
ファイル名 | 場面 | 例 |
---|---|---|
index.md |
これはこのセクションのトップページである。このセクションには他のmd ファイルがない。 |
author/index.md, archive/index.md, about/index.md |
_index.md |
これはこのセクションのトップページである。このセクションには他の.md ファイルがある。 |
blog/_index.md |
つまり、両者はともに{base_url}/{section}/
というURLでアクセスするページのことだ。
ちがいは、そのセクションにおけるページがその1ページのみならindex.md
を使う。他にもページがあるときは_index.md
を使う。それだけ。
なぜ名前を使い分けねばならないのか。ややこしい。
content/author/index.md
+++
の行で囲まれた範囲はフロントマターである。これで記事ごとにメタデータを指定する。
+++ title = "著者" #template = "author/section.html" page_template = "author/page.html" +++ ytyaru # スキル * C/C++ * C# * Rust * Python * Bash * HTML/CSS/JavaScript * XML/JSON/YAML/TOML * SQL
index.md
のときはpage_template
を指定する(template
でなく)section
変数が作られておらず{{ section.title }}
変数などで参照エラーになる
content/blog/_index.md
blog
セクションの
+++ title = "ブログ" sort_by = "date" template = "blog/section.html" page_template = "blog/page.html" +++
index.md
のときはtemplate
とpage_template
を指定する- たぶん記事ごとにほかのテンプレートを適用したいときは
{section}/{page}.md
のフロントマターにpage_template
で設定すればいいはず(未確認)
- たぶん記事ごとにほかのテンプレートを適用したいときは
content/blog/20210731100000.md
ページ。末端の記事。
+++
title = "第三の記事タイトル"
description = "第三の記事の説明です。"
date = 2021-07-31T10:00:00
+++
第三の記事の本文です。
# タイトル
なんちゃら。
templates/{section}/index.html
系
1セクション1ページのみ。
templates/about/index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>{{ page.title }} | {{ config.title }}</title> <meta name="description" content="{{ page.description }}"> <meta name="author" content="{{ config.extra.author }}"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="static/css/mobile.css" type="text/css" media="screen and (max-width: 899px)"> <link rel="stylesheet" href="static/css/pc.css" type="text/css" media="screen and (min-width: 900px)"> <link rel="shortcut icon" href=""> </head> <body> </section></article></main>#} <main><article><h1>{{ page.title }}</h1><p>{{ page.description }}</p>{{ page.content | safe }}</article></main> <aside><!-- ad --></aside> <footer>© 2021 {{ config.extra.author }}</footer> </body>
テンプレ変数 | データ取得元 |
---|---|
{{ page.title }} |
content/about/index.md のフロントマター |
{{ config.title }} |
config.toml |
テンプレ変数page
, config
はそれぞれの取得元からデータを得る。
{{ config.extra.author }}
はconfig.toml
の[extra]
セクションにおけるauthor
キーの値を参照するという意味。
{{ page.content | safe }}
はフィルタでデータ加工している。page.content
はcontent/{section}/{page}.md
で書かれたMarkdownをHTMLに変換したテキストである。そしてそのHTMLテキストをsafeフィルタで加工している。フィルタはLinuxコマンドのようなもので、パイプによってデータを加工する。safeフィルタは、テキストをHTMLとして出力する。エスケープ(サニタイズ)されない。
templates/archive/index.html
templates/author/index.html
templates/{section}/_index.html
系
1セクション複数ページ。セクションのトップページはしばしば複数ページへのリンク一覧である。