対話型でマークダウンファイルを作成するスクリプトの書き方 | Node

updated 2021-9-2

前提

fsを使うので、Nodeを使って動かします

Node v16.6.1
ESModule

script

Nodeのreadlineを使ってコンソールに対話式のコメントを出していきます

import readline from "readline";

const q = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

q.question("File Path: ", (a) => {
    // anything
    q.close();
});

シンプルに書くと上記のようになります
次は中に処理を足していきます

ファイルを読み書きする

fsを使ってファイルを読み書きする

const ws = fs.createWriteStream("toCopyFile.md");
const r = readline.createInterface({
    input : fs.createReadStream(`template.md`);
    output: ws
});
r.on("line", (line) => {
    ws.write(line);
});

template.mdtoCopyFile.mdにコピーするコードです

元になるマークダウンファイルも用意します

---
title: Template
slug: template
---
## template.md

これを先程の対話型のコードと合わせます

組み合わせる

上記の2つを組み合わせてscript.jsを作ります

// script.js
import readline from "readline";
import fs from "fs";

const q = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

q.question("File Path: ", (a1) => {
    q.question("Title: ", (a2) => {
        const ws = fs.createWriteStream(`${a1}.md`);
        const r = readline.createInterface({
            input: fs.createReadStream(`template.md`),
            output: ws,
        });
        r.on("line", (line) => {
            // titleの行を書き換える
            if (line.startsWith("title:")) {
                line = `title: ${a2}`;
            }
            // slugの行を書き換える
            if (line.startsWith("slug:")) {
                line = `slug: ${a1}`;
            }
            ws.write(`${line}\n`);
        });
        console.log(`code ${a1}.md`);
        q.close();
    });
});

これで

node script.jsを実行すると実行するディレクトリにあるtemplate.mdを読み込んで、File path:Title:で答えたファイル名のファイルを作成して、タイトルを書き換えてくれます

VSCodeのコマンドが通るのであればコンソールに表示させたcode posts/ファイル名.mdを実行することでファイルが開けます

child_processとか使えばjavascriptを実行するだけでファイルまで実行してくれるようにすることもできます