Node.jsでMarkdownファイルをプロンプト形式で生成できるようにする

Node.jsでMarkdownファイルをプロンプト形式で生成できるようにする

Next.js でブログのようなサイトを公開しているのですが、hugo という静的サイトジェネレーターででやってたみたいに

hugo new posts/記事名.md

のような形で front matter も含めた Markdown ファイルを生成できるようにしたいと思います。

MakeMarkdown.js ファイルの作成

Node.js で実行できるように MakeMarkdown.js というファイルをプロジェクトルートに作成します。

今回は CommonJS で実行できるように組んでいきます。

Markdown の作成先は「posts」ディレクトリに作成し、プロンプト形式で front matter の内容を決めていきます。

MakeMarkdown.js

const readline = require("readline");
const fs = require("fs");
const path = require("path");

// プロンプトを設定
const read = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

// ユーザーから情報を取得するためのプロンプト関数
const askQuestion = (query) => {
  return new Promise((resolve) => read.question(query, resolve));
};

// ファイル名の取得とファイルの作成
const createMarkdownFile = async () => {
  const fileName = await askQuestion("ファイル名を入力してください: ");
  if (!fileName) {
    console.error("ファイル名は必ず入力してください.");
    read.close();
    return;
  }

  const title = await askQuestion("タイトル: ");
  const description = await askQuestion("説明: ");
  const image = await askQuestion("アイキャッチ画像パス: ");
  const tags = await askQuestion("タグ (カンマ区切り): ");
  const date = new Date().toISOString().split("T")[0]; // 現在の日付を取得 (YYYY-MM-DD形式)

  // ディレクトリの指定
  const directory = "./posts"; // 指定ディレクトリに置き換えてください

  // ディレクトリが存在しない場合は作成
  if (!fs.existsSync(directory)) {
    fs.mkdirSync(directory, { recursive: true });
  }

  // フルパスを生成
  const filePath = path.join(directory, `${fileName}.md`);

  // マークダウンファイルの内容
  const fileContent = `---
date: "${date}"
title: "${title}"
description: "${description}"
image: "${image}"
tags: [${tags
    .split(",")
    .map((tag) => `"${tag.trim()}"`)
    .join(", ")}]
---

# ${title}

コンテンツの内容...
`;

  // ファイルを作成
  fs.writeFile(filePath, fileContent, (err) => {
    if (err) {
      console.error("書き込みエラー:", err);
    } else {
      console.log(`${filePath}ファイルを生成しました`);
    }
    read.close();
  });
};

// プログラムを実行
createMarkdownFile();

プロンプトには title, description, アイキャッチ画像、タグ(カンマ区切り)の指定を行えるようにし、

date は現在の日付を作成日付として作成されるようにしています。

Markdown ファイルの作成先は適宜変更するか、ファイル名入力のところで直接ディレクトリのパスも指定できるようにしても良いかなと思います。

使用方法

MakeMarkdown.js ファイルがあるディレクトリで

node MakeMarkdown.js

と実行すると、プロンプトが出てくるようになるので、順次入力していきます。

> node MakeMarkdown.js
ファイル名を入力してください: sample
タイトル: 新しい記事
説明: 新しい記事の説明
アイキャッチ画像パス: /images/sample.png
タグ (カンマ区切り): sample,post
posts\sample.mdファイルを生成しました

作成後のファイルは下記のような形になります。

posts/sample.md

---
date: "2024-07-03"
title: "新しい記事"
description: "新しい記事の説明"
image: "/images/sample.png"
tags: ["sample", "post"]
---

# 新しい記事

コンテンツの内容...