Closed2
google/zxでjsonをmarkdownファイルに変換してみる
zxはJavaScriptでshellを書けるライブラリです。
zxの基本的な解説についてはこちらの記事が分かりやすいと思います。
仕事でjsonファイルの内容をmarkdownとして○○.md
に出力したいケースがあったので試しにzxでやってみることにしました。
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にクローズされました