Qiita-CLIで作ったmdファイルを整理するpart1


# はじめに

Qiita-CLI を使っていると md ファイルが多くなりすぎて管理ができなくなってしまう．
もちろん，後に編集はできるようにしたいのですべて public フォルダにおいておきたい．（md ファイルが public フォルダにないとプレビューがみれない）

そのため，ファイル名を正規化して，ツリー構造を作成することでどのような記事があるかを一目でわかるようにする．

part2 でよりアップデートしているので，そちらも参照してください．

https://qiita.com/magix/items/dbd7833190e6e4b48f77

# 最終的に

ファイル構造

```
public
│  00_HowTo.md
│  math_Fourie.md
│  _aws_ec2.md
│  _aws_vpc.md
│  _eng_AM.md
│  _eng_equLowRangeSystem.md
│  _eng_FMPM.md
│  _llm_Bard_Bard.md
│  _llm_chatGPT_IphoneShortcut.md
│  _llm_GithubCopilot_noAnswer.md
│  _math_Laplace.md
│  _programming_mock.md
│  _py_qiitafile.md
│  __docs.md
│
└─.remote
        11111111111111111111.md
        22222222222222222222.md
```

:::note info
.remote フォルダは公開している記事のものなので無視
:::

この時出力は

```
├─
│   └─ *docs.md---title: memo
├─ 00
│   └─ HowTo.md---title: How To Write Blogs with Qiita-CLI
├─ aws
│   ├─ *ec2.md---title: About AWS EC2
│   └─ *vpc.md---title: About AWS VPC
├─ eng
│   ├─ *AM.md---title: 等価低域系
│   └─ *FMPM.md---title: 角度変調（FM・PM）
├─ llm
│   ├─ *bard.md---title: Bard
│   └─ chatGPT
│       └─ *IphoneShortcut.md---title: Use ChatGPT with Iphone Shortcut App
├─ math
│   ├─ *Laplace.md---title: ラプラス変換
│   └─ Fourie.md---title: フーリエ変換を信号処理の観点から理解する
├─ programming
│   └─ *mock.md---title: Test with Mock or Stub
└─ py
    └─ *qiitafile.md---title: Qiita-CLIで作ったmdファイルを整理する
```

### 出力のポイントは以下の通り

- ディレクトリはブログのジャンル

- タイトルも書いてあるとわかりやすいのでタイトルも---に続けて出力

:::note warn
タイトルは各 md ファイルの 2 行目としている．
タイトルなどを書いていないとプレビューでエラーが出るので 2 行目にタイトルがあることは前提とする
:::

- ファイル名の前に \* があるのは未投稿のファイル

# ファイル名の付け方

まず，ファイル名を正規化する
ポイントは

- はじめに _ とつけていたら，未投稿
  :::note info
  _ とつけると VSCode ではファイルが上にくる
  :::
- \_ でジャンル（フォルダ）をわける
- ジャンルは大きい順に書く
  :::note info
  aws の ec2 の startup という記事であれば**aws_ec2_startup.md**
  :::

# python コードを書く

結果はこちら

```
import glob
import os
import numpy as np

def print_tree(folder_files):
    tree = {}
    for file in folder_files:
        parts = file.split('_')
        node = tree
        for part in parts:
            node = node.setdefault(part, {})
    return tree

def print_second_line(file):
    with open(file, 'r') as f:
        return f.readlines()[1].rstrip('\n')

def print_tree_structure(tree, indent='', is_last=False):
    nodes = sorted(tree)
    output = ''
    for i, node in enumerate(nodes):
        if i == len(nodes) - 1:
            output += indent + '└─ ' + node + '\n'
            if tree[node]:
                output += print_tree_structure(tree[node], indent + '    ', is_last=True)
        else:
            output += indent + '├─ ' + node + '\n'
            if tree[node]:
                output += print_tree_structure(tree[node], indent + '│   ')
    return output


md_files = glob.glob('public/*.md')

folder_files = []
for file in md_files:
    file_name = os.path.basename(file)
    if file_name.startswith('_'):
        file_name = file_name[1:]
        file_name = file_name.rsplit('_', 1)[0] + '_*' + file_name.rsplit('_', 1)[1] if '_' in file_name else file_name
    folder_structure = os.path.dirname(file_name)
    tmp = os.path.join(folder_structure, os.path.basename(file_name))
    title = print_second_line(file)
    if title is not None:
        folder_files = np.append(folder_files, tmp + '---' + title)
    else:
        folder_files = np.append(folder_files, tmp)

tree = print_tree(folder_files)

print(print_tree_structure(tree))
```

これで出力結果が出る．
もう少し楽に書けそうだが，できていればなんでもいいのでこのままでいいでしょう
この出力結果をファイルに書き込んだり追記したりすることで管理がより楽になりそうかも