【Python】Markdownを読み込みtreeを生成する方法

## 1. はじめに
Markdownは、見出しの大きさを「`#`」の数で指定し、文章を簡単に構造化できる記法です。また、一定のルールに基づいてHTMLにレンダリングされるため、多くのブログで採用されています（例: Qiita）。

Markdownを使用して情報をまとめる際、全体の構造を一目で把握したくなることがあります。その際に便利なのが、Markdownファイルの階層構造をUNIXコマンドの`tree`のように出力することができる`marktree`コマンドです。

### 前回からの変更
以前はLinux向けに`apt`でインストールできるようにPPAリポジトリを使用していましたが、Windowsに戻ったためスクリプトを書き直し、パッケージ名も「markdown-tree」から「marktree」に変更しました。インストールはPyPIを使用します。

詳しい開発経緯は以下の記事をご覧ください。

https://yusu79.com/dev-marktree/

## 2. セットアップ（Setup）
pipを使用してインストールします。
```bash
pip install marktree
```

### Windowsで「警告」が出た時の対処方法
Windowsで`pip install`を実行すると、PATHに通っていない旨の警告(`"WARNING: The script clipcount.exe is installed in 'ファイルパス' which is not on PATH."`)が表示されることがあります。この場合、`C:\Users\user\Documents\PowerShell\Profile.ps1`に以下のようにPATHを追加してください。

```powershell:C:\Users\user\Documents\PowerShell\Profile.ps1
$env:path += ";C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\Scripts"
```

:::note warn
Powershellのバージョンが「5」なら、Profile.ps1の保存先フォルダは「Powershell」から「WindowsPowerShell」に変えてください。
上記の設定は、Powershellのバージョン「7」を想定しています。
:::

詳しくは以下の記事を御覧ください。

https://yusu79.com/python-path-issue/


また、`WARNING: Failed to write executable - trying to use .deleteme logic` といった警告が出て**インストールそのものが出来ない**こともあります。この問題の解決については、以下の記事をご参照ください。

https://yusu79.com/pip-install-failure-fix/

## 3. 簡単な使い方（Quick usage）
```
marktree [オプション] [hoge.md]
```

| オプション         | 説明                                                                                                    | 
| ------------------ | ------------------------------------------------------------------------------------------------------- | 
| marktree -h        | ヘルプ画面を表示します。                                                                                | 
| marktree --help_jp | ヘルプ画面を日本語で表示します。                                                                        | 
| marktree -L 3      | -Lオプションはツリーが表示される階層を決定します。                                                      | 
| marktree -C        | -Cオプションは、クリップボードにコピーされたMarkdownテキストをツリー形式で直接出力します。 | 


### 例
Markdownファイル`hoge.md`を用意して以下のように実行できます。
```md:hoge.md
# h1 
## h2 
### h3 
#### h4 
#### h4 
## h2 
## h2
### h3 
#### h4 
##### h5 
###### h6 
### h3
# h1 
```

通常の出力（デフォルトの階層は6）:
```bash
$ marktree hoge.md
├── h1 
│  ├── h2 
│  │  └── h3 
│  │     ├── h4 
│  │     └── h4 
│  ├── h2 
│  └── h2
│     ├── h3 
│     │  └── h4 
│     │     └── h5 
│     │        └── h6 
│     └── h3
└── h1 
```

`-L 3`を使用して階層を指定（階層は1から6まで）:
```bash
$ marktree -L 3 hoge.md
├── h1 
│  ├── h2 
│  │  └── h3 
│  ├── h2 
│  └── h2
│     ├── h3 
│     └── h3
└── h1 
```

`-C`を使用すると、クリップボードにコピーされたMarkdownテキストをツリー形式で直接出力します。さらに、`-L`を組み合わせて使うこともできます:
```
$ marktree -C -L 3 
├── h1 
│  ├── h2 
│  │  └── h3 
│  ├── h2 
│  └── h2
│     ├── h3 
│     └── h3
└── h1 
```


## 4. 使い方（Usage）
`marktree`コマンドは、Markdownファイルの`#`に基づいてファイルをツリー階層として出力します。
`-L`オプションは、元の`tree`コマンドと同様に深さを指定します。深さは1から6まで可能で、それ以上を指定するとエラーが発生しますので注意してください。
`-C`オプションは、クリップボードにコピーされたMarkdownテキストをツリー形式で直接出力します。これは出力前にMarkdownテキストを別のファイルにコピーする必要がなくなるので便利です。

オプションの順序は特に決まっておらず、複数のファイルを渡す場合は最後のファイルのみが変換されて出力されます。

## 5. まとめ
`marktree`はMarkdownファイルを読み込み、「`#`」の数だけ階層が深くなるtreeを生成するコマンドです。目次代わりにも使えるので、ぜひ試してみてください。

## 6. GitHubとPyPI
- [https://github.com/yusu79/marktree](https://github.com/yusu79/marktree)
- https://pypi.org/project/marktree/