YAMLで定義した構造通りにフォルダを作成するTypeScript
YAMLで設定した構造を元にディレクトリを作成するTypeScriptを ChatGPT に助けられて作りました。
助けられてというか、99% ChatGPT のコードです。世の中便利になりすぎました。
そもそもなんで大量のディレクトリ構造を準備しなければならなくなったのか
最近 Scrivener を使い始めましたしょっさんです。たまたま目次だけを作っていたドキュメントがあったので、それを元にして Scrivener の構造へ反映したら楽だなと考えました。数個ならまだしも、数十個にもなる目次を一つ一つまちがいなくフォルダを作ろうかと思うと厄介ですからね。
いろいろと調べてみると Scrivener ではファイルの構造そのものを import して、フォルダ構造を再現できるようです。
大量のディレクトリ構造を作成するためのプログラムを作る
では、という事で手元にある目次ファイルをちょっと修正して、フォルダ構造を作成してみてはどうかと考えてみます。なんとなく二度手間感があるものの、下手にScrivener へ直接手を下すよりかは、フォルダ構造を作ってimportする方が安全性も高そうだと判断しました。
ディレクトリ構造を実現するには
ディレクトリ構造は半構造化データなので、json か yaml で準備するほうが楽だろうと考えました。特にアウトライナーやフツーのテキストを表現するには yaml の方が手軽だろうと考え、yamlを採用します。
準備するyamlの構造は次の通りです。このファイルを読み込んで、ディレクトリを作ってくれる。そんなプログラムをChatGPT へ素直で清らな心で求めました。
第一章:
1-1. うんたらかんたら:
1-2. ほげほげ:
1-2-1. あっちょんぶりけ:
1-2-2. たほま:
1-3. foobar:
第2章:
:
:
でき上がった TypeScript のコード
という事でできたものはこれです。の前に、必要なライブラリがあったので、`js-yaml` に関わるモジュールをインストールしてからです。
npm install js-yaml
npm i --save-dev @types/js-yaml
TypeScript にしているのは、いろいろ意味がありそうで特にないのですが、たまたま TypeScript の環境が揃っていたという事にしてください。
コードは次の通り。注釈の日本語も勝手にはいてくれていました。エラーメッセージは英語なのに。
import * as fs from 'fs';
import * as yaml from 'js-yaml';
// YAMLファイルのパス
const yamlFilePath = './directory_structure.yml';
// YAMLファイルを読み込み、ディレクトリ構造を取得
const directoryStructure = yaml.load(fs.readFileSync(yamlFilePath, 'utf8'));
function createDirectories(dirPath: string, dirs: any) {
for (const key in dirs) {
const newPath = `${dirPath}/${key}`;
console.log(`key => ${key}`);
console.log(`newPath=> ${newPath}`);
if (typeof dirs[key] === 'object') {
fs.mkdirSync(newPath);
createDirectories(newPath, dirs[key]);
} else {
throw new Error('Invalid directory structure in YAML file');
}
}
}
// ディレクトリの作成
createDirectories('./', directoryStructure);
実際に使ってみてどうだったのか
yaml ファイルに間違えさえなければ、これで十分に動いてしまいます。
またすでに同じディレクトリが存在すると、上書きできないので止まります。
とはいえ、Scrivener へ移行するための手順としてはこれだけあれば十分でしょう。十分です。
今後にあたって
もう二度と使う事はない気もしないでもないのですが、Scrivener 以外の元ネタから執筆をする可能性はあります。全てのやりとりをScrivenerで実現できればいいのですが、ほぼ、そうはならないと理解しています。故に目次のアウトラインを準備してから執筆に進む事も可能性としてはありそうです。
どうせなら、使い勝手をよくしておいてもいいかなと考え、今後お勉強がてら次の実装を取り込んで行く予定です。
対象のyamlファイルを指定できるようにする
上書きオプションをつける
ディレクトリ名内に`/`などのフォルダ区切りがあった場合の対処を組み込む