開発 へ戻る
Markdown frontmatter パース / 生成

Markdown frontmatter パース / 生成

Astro / Hugo / Jekyll / Next.js MDX の Markdown ファイル先頭に置く YAML frontmatter (--- ... ---) を解析して key-value テーブル + JSON 表示。逆方向では YAML テキストを書いて本文と組み合わせ、frontmatter 付き Markdown を生成。Mode 切替で両方向。ブログ・静的サイト・ドキュメントの編集に。

使い方

**parse モード** (Markdown → frontmatter + body): frontmatter 付きの Markdown を貼り付けると、`---` で囲まれた YAML ブロックを **eemeli/yaml** で解析して、(1) key-value テーブル (キー / 型 / 値の 3 列)、(2) JSON 表現、(3) 本文 (frontmatter を除いた残り) の 3 領域で表示します。**compose モード** (frontmatter + body → Markdown): YAML テキストと本文 (Markdown) を別々に入れると、`---` フェンスで包んだ frontmatter + 本文を結合した完全な Markdown ファイルを生成。Astro / Hugo / Jekyll / Next.js MDX / Eleventy など、frontmatter を使う静的サイトジェネレーター全般のフォーマットに対応します。YAML が不正な場合は赤いエラー表示で行番号 + メッセージを返します。

詳細解説

frontmatter が含む情報の種類

SSG (静的サイトジェネレーター) の frontmatter には記事のメタデータが集中しています。titledatetags は当然として、authordraft: trueinternal: true のような下書き・非公開フラグ、slugpermalink による URL 設計、weightorderfeatured による掲載優先順位、場合によっては password フィールドや access_level のような権限情報が含まれることがあります。

未公開の記事・ブログの下書き・社内 Wiki のページを扱う場面では、frontmatter を解析して確認したい需要があります。これらのコンテンツはまだ公開されていない情報を含んでいるため、確認のためにオンラインツールに送ることは、未公開コンテンツを外部サーバーに渡すことになります。

未公開コンテンツをオンラインツールで処理するリスク

Markdown ファイルの frontmatter を解析・編集するオンラインツールに対してファイル内容を送信すると、記事の本文を含む全体がサーバーに届きます。下書き段階のブログ記事・未発表の技術文書・社内ナレッジベースのページは、公開前の段階で第三者に知られることを想定していません。

さらに compose モードでは frontmatter と本文を組み合わせて Markdown を生成する作業が発生します。frontmatter の YAML と本文の両方を貼り付けることになるため、コンテンツの全体像が外部に渡ります。Hugo・Astro のプロジェクトで複数のページを一括で frontmatter 操作する作業では、多数のページの内容が対象になることがあります。

eemeli/yaml ライブラリでブラウザ内に閉じる

このツールは eemeli/yaml ライブラリをブラウザバンドルとして読み込み、YAML の解析をブラウザ内で実行します。RFC 5545 準拠の YAML 1.2 型 (string / number / boolean / null / array / object / date) の解析、行番号付きのエラーメッセージの生成、JSON 表現へのシリアライズはすべてクライアントサイドで完結します。compose モードの --- フェンス挿入・frontmatter と本文の結合も JavaScript で処理します。

入力した Markdown ファイルの内容はページメモリにのみ存在します。未公開の記事・下書き・社内文書を安全に解析・編集できます。

SSG 移行やコンテンツ品質チェックへの活用

Hugo から Astro への移行・Jekyll から Next.js MDX への移行では、frontmatter の構造が変わることがあります。このツールで既存の frontmatter を JSON 形式で確認し、必要なフィールドの有無・型・値を確認してから移行スクリプトを書く、という作業に使えます。draft: true のフラグが付いたまま本番ビルドに混入していないか確認する、date フィールドの形式が統一されているか確認する、といった品質チェックにも活用できます。frontmatter の YAML 自体を JSON 化したい場面では yaml-json-convert が、本文の見出し構造を整えたい場合は markdown-toc が次のステップになります。

YAML 1.2 仕様と frontmatter 慣習: --- フェンスの起源と TOML / JSON 派生

Frontmatter という呼称は Jekyll が 2008 年に YAML ベースのメタデータブロックを --- フェンスで囲む形式を採用したことに由来し、その後 Hugo・Hexo・Gatsby・Astro・Next.js MDX が同じ慣習を継承しました。YAML 自体は IETF / YAML.org の YAML 1.2 仕様 (2009 年公開、現行は 2021 改訂版) で定義され、本ツールが使う eemeli/yaml ライブラリ (npm 名 yaml) は YAML 1.2 / 1.1 両対応のフル準拠 parser です。json-to-yaml の単純な変換ではなく、行番号付きエラー・コメント保持・anchor / alias / tag による参照を解釈できます。

frontmatter は YAML が主流ですが、TOML 派生 (Hugo の +++ ... +++)・JSON 派生 ({ ... } ブロック)・Org-mode (#+TITLE: 形式) なども実装によっては使われます。Astro Content Collections は zod スキーマで frontmatter を runtime バリデーションし、型安全な MDX を要請するため、本ツールで JSON 形式の解析結果を得た後に zod スキーマと突合する流れが想定されます。gray-matter (Node 用 frontmatter パーサ) も同じ --- フェンス慣習を採用しており、出力の JSON 形は本ツールと互換です。

YAML の闇: ノルウェー問題 / オクテット混入 / アンカーループ

YAML 1.1 には「ノルウェー問題」と呼ばれる悪名高いバグがあります。country: NO を ISO 国コードのつもりで書くと、YAML 1.1 では NO が boolean false の別名として解釈され (yes/no/on/off/true/false がすべて bool)、結果として country: false になります。YAML 1.2 でこの bool エイリアスは true / false のみに削減されましたが、古いツール (Ruby の Psych 旧版・Python の PyYAML デフォルト) は依然として 1.1 動作のため、NO OFF Y N を文字列として扱いたい場合は明示的にクォート (country: "NO") する必要があります。eemeli/yaml は YAML 1.2 がデフォルトなのでこの問題は出ませんが、別の parser に渡したときに値が変わる可能性があります。

もう 1 つの罠は anchor (&id) / alias (*id) の循環参照と「YAML billion laughs 攻撃」(DoS 攻撃)、そしてタブ文字の混入です。YAML はインデントにタブを禁じており、エディタの設定で \\t が混ざると unexpected character で parse 失敗します。gray-matter などのパーサは frontmatter の YAML が壊れていると body だけを返す挙動 (silent fallback) を取ることがあるため、frontmatter が抜け落ちて公開してしまう事故もあります。本ツールはエラーを明示的に表示するため、CI 前の検証ステップとして使うのが安全です。date: 2024-01-01 のような ISO 8601 日付は YAML 1.2 では自動で Date オブジェクトになる (JSON シリアライズ時は文字列に戻る) ため、date: "2024-01-01" と文字列として保ちたいときはクォートを付けてください。

よくある質問

入力データはサーバーに送信されますか?
いいえ。すべてブラウザ内で完結します。YAML パース (eemeli/yaml) もブラウザで動作。
frontmatter の YAML 仕様で対応している型は?
**string / number / boolean / null / array / object / date** の標準 YAML 1.2 型をサポート (eemeli/yaml 経由)。date は ISO 8601 文字列としてもパースされます。Markdown の本文側は文字列としてそのまま保持。
他の frontmatter フォーマット (JSON / TOML) も対応していますか?
**現状は YAML のみ**。Jekyll / Hugo / Astro のほぼすべてが `---\n...\n---` の YAML 形式で、JSON frontmatter (`{ ... }`) や TOML frontmatter (`+++ ... +++` Hugo の代替) は別ツールが必要です。実需が出れば追加検討。
区切り文字 `---` の前後に空白があっても OK?
ファイル先頭の `---` 行は **完全一致** が必要 (Hugo / Astro / Jekyll の仕様)。先頭に空行があったり、`---` の前にスペースがあると frontmatter として認識されません。Markdown 内では `---` は水平線として解釈されるので、frontmatter は必ず **ファイルの 1 行目から** 始まる必要あり。
compose モードで本文を空にしたらどうなりますか?
frontmatter ブロックだけを出力します (`---\nkey: value\n---\n`)。Astro の `_config.mdx.ts` で frontmatter だけ別ファイルにするケースに使えます。YAML 自体が空 (改行のみ) なら frontmatter フェンスごと省略され、本文だけが出力されます。
YAML エラーの行番号はどう読みますか?
**YAML 内部の行** (frontmatter 内での行数)。eemeli/yaml のエラーメッセージは `Missing closing " quote at line 1, column 21` のような形式で、Markdown ファイル全体の行ではなく **frontmatter ブロック内** の相対行です。

「送らない」を確かめるには

このツールは入力データを外部に送信しません。仕組み・監査手順・運営方針は以下で詳しく説明しています。

類似のツール

YAML ⇄ JSON 変換 — インデント保持

YAML ⇄ JSON 変換 — インデント保持

YAML と JSON を相互変換します。インデント (2 / 4 / タブ) 切替・サンプル付き。eemeli/yaml ライブラリでブラウザ内処理。

開発JSON変換
Markdown 目次生成 — 見出しから TOC を抽出

Markdown 目次生成 — 見出しから TOC を抽出

Markdown 文書の見出し (#, ##, …) を拾い上げ、GitHub 互換のアンカー付きリンクで目次 (TOC) を生成します。階層リスト / 平坦リスト、含める見出しの最大レベル、H1 の除外などを切替可能。コードフェンス内の `#` は自動で無視。結果は Markdown のコピーや .md ダウンロードで他のエディタにそのまま貼れます。すべてブラウザ内処理。

開発Markdown生成
Markdown リンク抽出 — Markdown / HTML / テキストから URL を一括取得

Markdown リンク抽出 — Markdown / HTML / テキストから URL を一括取得

Markdown / HTML / プレーンテキストから URL と Markdown / HTML リンクをまとめて抽出。`[label](url)` / `![alt](url)` / `<a href>` / `<img src>` / 生 URL の 5 種類を自動検出し、種類別 (テキスト / 画像 / オートリンク) に分類して一覧化します。重複除去・種類フィルター・ホスト別グルーピング・CSV / TSV / JSON エクスポートに対応。記事内のリンク監査、転載元の洗い出し、SEO 内部リンクの可視化、SNS 投稿時の参考リンク収集に便利。すべてブラウザ内で処理されます。

開発Markdown抽出URL
Markdown プレビュー — リアルタイムレンダリング

Markdown プレビュー — リアルタイムレンダリング

Markdown を入力すると、横並びでリアルタイムに HTML プレビューが表示されます。GFM (テーブル / タスクリスト / 自動リンク) と改行→<br> の変換に対応。レンダリングした HTML をコピー / ダウンロードできます。すべての処理はブラウザ内で完結します。

開発Markdown