PR

【個人開発】Markdownを木構造で出力できる「marktree」

OSS開発

文章全体を構造化して一目で把握したい」 と思ったことはないでしょうか?

特に自分はWordpressに投稿する際に、まずMarkdownで下書きした後、それをGutenbergの「カスタムHTML」に貼り付けて「ブロックに変換」し、記事を作成しています。そのため、Markdownの段階で文章構造を俯瞰したいのです。

そこで、Markdownの見出し(#)を読み込み、木構造を出力するCUIツール「marktree」 をPythonで作りました。

WordPressブロガーの方必見! 外出先でもブログ執筆作業がはかどる、 Ankerの大容量モバイルバッテリー をご紹介します。

Markdownを木構造で出力できる「marktree」とは?

marktree」は、Pythonで開発されたオープンソースのCUIツールです。

GitHub - yusu79/marktree: Markdownを読み込み、木構造で表示するCUIツール
Markdownを読み込み、木構造で表示するCUIツール. Contribute to yusu79/marktree development by creating an account on GitHub.

marktree hoge.md」とすると、指定したMarkdownファイルを読み込み、「#」の数に基づいて階層に分類したtree構造をターミナルに出力します。

具体的な使い方は、以下の記事で詳しく解説しています。

【個人開発】Markdownを読み込みtreeを生成する方法【Python】 - Qiita
1. はじめにMarkdownは、見出しの大きさを「#」の数で指定し、文章を簡単に構造化できる記法です。また、一定のルールに基づいてHTMLにレンダリングされるため、多くのブログで採用されています…

インストール方法

pipでインストールします。

Bash
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出来ない場合は以下の記事をご参照ください。

使い方

Bash
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」というツールを作成しました。

GitHub - yusu79/markdown-tree: Markdownのファイルを読み込み、木構造のように表示するスクリプト
Markdownのファイルを読み込み、木構造のように表示するスクリプト. Contribute to yusu79/markdown-tree development by creating an account on GitHub.

このツールを開発する際に、最初に行ったのは前述のChatGPTのプロンプトを使用したコードの作成です。使用したChatGPTのバージョンは「ChatGPT3.5」でした。

2.生成されたコードが実行可能になるように書き直すことを決める

当時、ChatGPTが新しく登場しており、生成AIを操作するだけで興奮していました。しかし、前述の命令によって生成されたコードは、全く機能しないガラクタでした。一番肝心の 「treeのように出力するアルゴリズム」 が出鱈目だったので、この部分は自分で考える必要がありました。

ただし、ChatGPTが一定のコードを生成してくれたことにより、何から手をつけていいかという出発点を得ることができ、それは大いに助けになりました。

3.「treeのように出力するアルゴリズム」を開発する

Markdown全体を読み込み、文章の先頭に「#」がある行を抽出します。その行の先頭にある「#」の数に基づいて、treeの階層を設定します。

例えば、以下のような文章があるとします。

Markdown
# h1
##### h5

#####」なら、5回ぶん空白を開けた後に「└──」を出力します。

Bash
└── h1
            └── h5

しかし、同じ階層が後ろに続くなら「└──」ではなく「├──」を出力します。

Markdown
# h1
##### h5
##### h5
Bash
└── h1
            ├── h5
            └── h5

さらに、その下に階層が高い見出しがある場合は、その階層と同じ箇所に空白の代わりに「」を追加します。

Markdown
# h1
##### h5
##### h5
### h3
## h2
Bash
└── 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」とするだけで、簡単にクリップボードを読み込む機能を実装できます。

pyperclip
A cross-platform clipboard module for Python. (Only handles plain text for now.)

【その2】PyPIにアップロードする

Pythonで開発したので、「marktree」はPyPIにアップロードしました。PyPIへのアップロード手順については、以下のリンクを参照してください。

これにより、「pip install marktree」とするだけで、どのOSのPCでも「marktree」を利用できるようになりました。

まとめ

この記事では、開発した「marktree」を完成させるまでに行った一連の作業をまとめました。

当初は「ChatGPTを使えば簡単にOSSを作れるのでは?」という軽い気持ちからスタートしましたが、結果的に自分でアルゴリズムを考えることになりました。

今後、ソフトウェア開発が本当に簡単になる未来にわくわくしています。この経験は生成AIに興味を持つ良いきっかけとなりました。

参考サイト


  1. Zero-Shotプロンプティング | Prompt Engineering Guide ↩︎

  2. apt – Linux技術者認定 LinuC | LPI-Japan ↩︎

タイトルとURLをコピーしました