この記事の概要
記事ページのコンテンツを Markdown で管理することはよくあると思います。
なおかつ、Frontmatter にメタ情報を書くこともよくあると思います。
ただ私がアホすぎるがゆえに、Frontmatter に何を書いていたか忘れたり、正しいプロパティ名を忘れたりすることが多いです。
というわけで Scaffdog を使って記事の雛形を生成する流れを記事にしました。
インストールや初期化
npm install --save-dev scaffdog
npx scaffdog init
# 設定ファイルの名前を求められる。ここでは article とする
これで.scaffdog
ディレクトリにconfig.js
とarticle.md
が生成されました。
以降は.scaffdog/article.md
を編集していきます。
実現したいこと
設定を追加する前に、最終的に実現したいことを整理しておきます。
- 記事の slug を入力すると
src/content/article
に入力したテキスト/index.md
が作成される - 記事タイトルを入力すると Frontmatter の
title
にテキストが適用される - ファイルを作成した日付が Frontmatter の
date
にYYYY-MM-DD
の形式で適用される - draft かどうかを聞かれ、Yes/No にあわせて Frontmatter の
draft
に true/false が適用される
完成形
---
name: "article"
root: "src/content/article"
output: "."
ignore: []
questions:
slug: "slugは?"
title: "記事のタイトルは?"
draft:
confirm: "下書き?"
initial: true
---
# `{{ inputs.slug }}/index.md`
```markdown
---
title: "{{ inputs.title }}"
date: {{ date "YYYY-MM-DD" }}
draft: {{ inputs.draft ? "true" : "false" }}
---
```
そんなに難しいことはしていないのですが、少しつまづいた箇所があったのでその部分だけ解説します。
今日の日付を入れる
ビルトインのヘルパーにdate
があります。
他のヘルパーは値と関数をパイプ|
で繋いでいたので、date もそうなのかと思いましたが、違いました。
こちらにあるように、当日以外の日付でフォーマットすること自体ができないようです。
draft の true/false
最初、以下のように書いていました。
draft: {{ inputs.draft ? true : false }}
しかし、これだと Yes でも No でも何も Frontmatter に記載されません。
公式ドキュメントにあるように、{{}}
の中が true でも false でもアウトプットは空になってしまいます。
よく考えれば当たり前な気がしますが、Frontmatter 内で真偽値として記載しているとは言え、あくまで文字列です。
- draft: {{ inputs.draft ? true : false }}
+ draft: {{ inputs.draft ? "true" : "false" }}
これで期待通りになりました。
実際に使う
記事を作成するにあたり、ターミナルで次のコマンドを実行します。
npx scaffdog generate article
すると、先ほど設定した内容が聞かれますので、答えていきます。
ℹ Output destination directory: "src/content/article"
? slugは? test
? 記事のタイトルは? テスト記事です
? 下書き? (y/N) Yes
🐶 Generated 1 file!
✔ src/content/article/test/index.md
生成された Markdown ファイルも問題ありません。
---
title: "テスト記事です"
date: 2024-07-14
draft: true
---