「文章全体を構造化して一目で把握したい」 と思ったことはないでしょうか?
特に自分はWordpressに投稿する際に、まずMarkdownで下書きした後、それをGutenbergの「カスタムHTML」に貼り付けて「ブロックに変換」し、記事を作成しています。そのため、Markdownの段階で文章構造を俯瞰したいのです。
そこで、Markdownの見出し(#)を読み込み、木構造を出力するCUIツール「marktree」 をPythonで作りました。
Markdownを木構造で出力できる「marktree」とは?
「marktree」は、Pythonで開発されたオープンソースのCUIツールです。
「marktree hoge.md
」とすると、指定したMarkdownファイルを読み込み、「#
」の数に基づいて階層に分類したtree構造をターミナルに出力します。
具体的な使い方は、以下の記事で詳しく解説しています。
インストール方法
pipでインストールします。
pip install marktree
Windowsで上記を実行した際に「"WARNING: The script clipcount.exe is installed in 'ファイルパス' which is not on PATH."
」という警告が表示されたなら、以下の記事をご参照ください。
また、「WARNING: Failed to write executable - trying to use .deleteme logic
」という警告が表示されpip install
出来ない場合は以下の記事をご参照ください。
使い方
marktree [オプション] [hoge.md]
オプション | 説明 |
---|---|
marktree -h | ヘルプ画面を表示します。 |
marktree –help_jp | ヘルプ画面を日本語で表示します。 |
marktree -L 階層 | -Lオプションはツリーが表示される階層を決定します。 |
marktree -C | -Cオプションは、クリップボードにコピーされたMarkdownテキストをツリー形式で直接出力します。 |
「marktree」完成までにした2つのこと
【その1】ChatGPTでスクリプトを作成する
まず最初に、ChatGPTでざっくりと 「treeコマンドのようにMarkdownを木構造にするファイルを作って欲しい」 という指示をしました。
この指示はゼロショット・プロンプティング[1]を使用しています。ゼロショット・プロンプティングは、先行するコンテキストなしに、AIが学習データのみを参照して回答を生成する命令形式です。
marktreeを開発する際には、特定のOSSなどを参考にする予定は立てておらず、完全にゼロから開発を行いました。
1.shellscriptで「markdown-tree」を作る
実は、最初からPythonでの開発を検討していたわけではありません。当時は「apt[2]にパッケージを登録したい」という思いから、シェルスクリプトで「markdown-tree」というツールを作成しました。
このツールを開発する際に、最初に行ったのは前述のChatGPTのプロンプトを使用したコードの作成です。使用したChatGPTのバージョンは「ChatGPT3.5」でした。
2.生成されたコードが実行可能になるように書き直すことを決める
当時、ChatGPTが新しく登場しており、生成AIを操作するだけで興奮していました。しかし、前述の命令によって生成されたコードは、全く機能しないガラクタでした。一番肝心の 「treeのように出力するアルゴリズム」 が出鱈目だったので、この部分は自分で考える必要がありました。
ただし、ChatGPTが一定のコードを生成してくれたことにより、何から手をつけていいかという出発点を得ることができ、それは大いに助けになりました。
3.「treeのように出力するアルゴリズム」を開発する
Markdown全体を読み込み、文章の先頭に「#
」がある行を抽出します。その行の先頭にある「#
」の数に基づいて、treeの階層を設定します。
例えば、以下のような文章があるとします。
# h1
##### h5
「#####
」なら、5回ぶん空白を開けた後に「└──
」を出力します。
└── h1
└── h5
しかし、同じ階層が後ろに続くなら「└──
」ではなく「├──
」を出力します。
# h1
##### h5
##### h5
└── h1
├── h5
└── h5
さらに、その下に階層が高い見出しがある場合は、その階層と同じ箇所に空白の代わりに「│
」を追加します。
# h1
##### h5
##### h5
### h3
## h2
└── h1
│ │ ├── h5
│ │ └── h5
│ └── h3
└── h2
このように、「treeのように出力するアルゴリズム」は下の階層からその都度影響を受けることになります。 そこで、上から順に作るのではなく、下から順に作成し、それを反転させる方法を考えました。
このアプローチにより、treeをスムーズに出力することができました。
4.Pythonで「marktree」を作る
その後、Windows環境でも積極的に開発するようになり、どの環境でも動作するように「markdown-tree」をPythonで書き直すことを決めました。
この際にChatGPTに対して、「markdown-tree
をPythonで書き直してほしい」と依頼すると、ゼロショット・プロンプトの時よりも遥かに高い精度でコードを生成してくれました。
この生成されたコードに簡単な手直しを施し、より完成度の高いコードに仕上げ、さらにオプションを追加することで、「marktree」は完成へと至りました。
「-C」オプション
marktreeは完成したものの、ある時点で「階層を知るためにファイルを都度作成するのは面倒くさい」と感じました。そこで、ファイルを作成せずにクリップボードを読み込み、そのままtreeを出力する「-C
」オプションを追加しました。
このオプションでは、「pyperclip」というプラグインを使用しています。これをインストールし、Pythonファイルの先頭で「import pyperclip
」とするだけで、簡単にクリップボードを読み込む機能を実装できます。
【その2】PyPIにアップロードする
Pythonで開発したので、「marktree」はPyPIにアップロードしました。PyPIへのアップロード手順については、以下のリンクを参照してください。
これにより、「pip install marktree
」とするだけで、どのOSのPCでも「marktree」を利用できるようになりました。
まとめ
この記事では、開発した「marktree」を完成させるまでに行った一連の作業をまとめました。
当初は「ChatGPTを使えば簡単にOSSを作れるのでは?」という軽い気持ちからスタートしましたが、結果的に自分でアルゴリズムを考えることになりました。
今後、ソフトウェア開発が本当に簡単になる未来にわくわくしています。この経験は生成AIに興味を持つ良いきっかけとなりました。
参考サイト
- yusu79/marktree: Markdownを読み込み、木構造で表示するPythonコマンド
- yusu79/markdown-tree: Markdownのファイルを読み込み、木構造のように表示するスクリプト
- asweigart/pyperclip: Python module for cross-platform clipboard functions.