Closed2

google/zxでjsonをmarkdownファイルに変換してみる

catnosecatnose

zxのインストール

一回実行できれば良いタスクということもあり、zxをグローバルインストールすることにしました。

$ npm i -g zx
$ nodenv rehash # nodenvを使っていたので
$ zx -v
# 7.0.8

jsファイルを作る

てきとうな名前でJSファイルを作り、ドキュメントの通りShebangを書きます。今回はTop-Level Awaitを使いたかったので拡張子.mjsとします。

json-to-md.mjs
#!/usr/bin/env zx

ファイルに実行権限を付与します。

$ chmod +x ./json-to-md.mjs

処理を書く

今回やりたかったのはざっくりと以下のようなjsonを読み込み、いい感じにmarkdownファイルを生成することでした。

example.json
{
  "items": [
    // このitemごとに.mdファイルにしたい
    {
      "date": "2022-02-02",
      "title": "タイトル",
      "description": "なにか説明"
    },
    {
       "date": "2022-01-05",
       "title": "タイトルその2",
       "description": "なにか説明その2"
    },
    ...
  ]
}

イメージとしては

  • 生成するファイル名は${date}.md
  • titleはmarkdownのFront Matterに
  • descriptionはmarkdownの本文に

という感じです。というわけで以下のような処理を書きました。

json-to-md.mjs
#!/usr/bin/env zx

import fs from "fs/promises";

// jsonを読み込む
const jsonRaw = await fs.readFile("./example.json", "utf8");
// パースして`items`プロパティを取得
const items = JSON.parse(jsonRaw).items;

// itemごとに.mdファイルに出力
await Promise.all(
  items.map(async (item) => {
    const { title, description, date } = item;

    // ファイルの中身となる文字列を生成
    const mdBody = [
      `---`,
      `title: "${title}"`,
      `---`,
      ``,
      `description`,
    ].join("\n");

    // 書き込み
    await fs.writeFile(
      `./contents/${date}.md`, // 出力先
      mdBody,
      { flag: "wx" } // すでに存在する場合はエラーに
    );
  })
);

console.log("Done ✨");

実行します。

$ zx ./json-to-md.mjs
# Done ✨

これでjsonのitemごとに○○.mdファイルが生成されました。

このスクラップは2022/08/16にクローズされました