Frontmatter とは
Definition 1 Frontmatter
- Frontmatter とは,Markdown ファイルの先頭に置かれるメタデータブロックのこと.
- 本文として描画されることを意図しないが,ページ生成時にツール側 (静的サイトジェネレータ,ブログエンジン,ドキュメントビルダー等) から参照される情報を宣言的に記述するために使われる.
代表的な用途は次のとおり:
- 記事タイトル (
title) - SEO 用の概要文 (
description) - 記事に紐付くタグ (
tags) - 公開日 / 更新日 (
date,date-modified)
何をキーに置くかはツール側のスキーマで決まるため,「自由に追加できる」と言ってもパーサが解釈できないキーは単に無視される点に注意.
書き方: 三本ダッシュで囲む
NoteRULE
- ファイル冒頭を
---で囲んだブロックが Frontmatter として解釈される.
---
title: "Frontmatter section"
---
# Markdown section二つ目の --- 以降が通常の Markdown 本文として処理される.
Warning
- ブロック内は YAML として parse される.したがってインデントは半角スペース固定でタブを混ぜない.
- 多くのパーサは Frontmatter ブロックがファイルの 1 行目から始まることを要求する.
- BOM や先頭の空行があると Frontmatter として認識されず,本文に
---がそのまま出力される
- BOM や先頭の空行があると Frontmatter として認識されず,本文に
:を含む文字列 (例:title: foo: bar) はクォートしないと YAML 構文エラーになる.
基本の YAML 記法
スカラー値
---
title: 'The document title'
---ブロックスタイルの配列
---
tags:
- JavaScript
- Markdown
---フロースタイル (ブラケット記法) の配列
---
tags: ["JavaScript", "Markdown"]
---ブロック形式とフロー形式は等価で,tags[0] == "JavaScript" となる.要素数が少なくインラインで読みやすい場合はフロー記法,要素が多い・コメントを挟みたい場合はブロック記法が向く.
ネストした構造
オブジェクトの配列はハイフン (-) で要素を区切り,各要素配下のキーをそろえてインデントする.
---
tech:
- role: frontend
stack: Remix
- role: backend
stack: Go
---
Warning
- 元記事のように
- frontendと書いてその下にstack: Remixを続けると YAML としては不正となる (配列要素が文字列"frontend"で確定してしまうため,後続のstack:を子キーとして解釈できない). - ネストしたオブジェクトを表現したいときは,ハイフンの直後に最初のキーを書く (
- role: frontend) のが一般的.
複数行文字列: > と | の違い
YAML には複数行文字列のためのブロックスカラー記法が 2 種類ある.Frontmatter では特に description のような長文フィールドで頻出する.
Folded 記法 >: 改行をスペースに畳み込む
---
description: >
this is a
multiline
string
---このとき description の値は次の 1 行になる:
this is a multiline string
段落として 1 行に整形したい (= ソース上では折り返したいが出力では 1 行) ケースで使う.
Literal 記法 |: 改行を保持する
---
description: |
this is a
multiline
string
---このとき値は改行込みで保持される:
this is a
multiline
string
整形済みテキスト (詩,コードスニペット,事前に改行位置が決まっている文章) を埋め込みたい場合に使う.
Warning
>も|も末尾の改行の扱いがオプションで変わる:>/|(デフォルト・clip) は末尾改行を 1 つだけ残し,>-/|-(strip) は末尾改行を削除,>+/|+(keep) は末尾の空行を全部残す.- インデントは「ブロック開始行より深い」位置でそろえる.インデント幅を混在させると YAML パーサが文字列の途中で打ち切る.
まとめ
- Frontmatter は Markdown の先頭に置く YAML メタデータブロックで,
---で区切る - パーサは YAML として読むので,インデント・クォート・ブロック記法の規則に従う必要がある
- 配列はブロック / フロー どちらでもよい.ネストしたオブジェクトの配列は
- key: valueの形でハイフン直後に最初のキーを置く - 複数行文字列は
>で折り畳み,|で改行保持.用途で使い分ける