このサイトのディレクトリ構成の再考
今の記事のディレクトリ構成はこんな感じ
./contents
├── 2021-06
│ ├── 2021-06-01.md
│ ├── 2021-06-02.md
│ ├── 2021-06-03.md
│ ├── 2021-06-04.md
│ ├── 2021-06-05.md
│ ├── 2021-06-06.md
│ ├── 2021-06-07.md
│ ├── 2021-06-08.md
│ ├── 2021-06-09.md
│ ├── 2021-06-10.md
│ ├── 2021-06-11.md
│ ├── 2021-06-12.md
│ ├── 2021-06-13.md
│ ├── 2021-06-14.md
│ ├── 2021-06-15.md
│ ├── 2021-06-16.md
│ ├── 2021-06-17.md
│ ├── 2021-06-18.md
│ ├── 2021-06-19.md
│ ├── 2021-06-20.md
│ ├── 2021-06-21.md
│ ├── 2021-06-22.md
│ ├── 2021-06-23.md
│ ├── 2021-06-24.md
│ ├── 2021-06-25.md
│ ├── 2021-06-26.md
│ ├── 2021-06-27.md
│ ├── 2021-06-28.md
│ ├── 2021-06-29.md
│ └── 2021-06-30.md
├── 2021-07
│ ├── 2021-07-01.md
│ ├── 2021-07-02.md
...
年月のディレクトリがあって、その中に[YYYY-MM-DD].md
が置いてある。
このサイトを公開した当初はこんなに毎日書くと思ってなかったので考えてなかったけど、今後もしばらく書いていくことを考えると、年/月/日でそれぞれディレクトリを切ったほうがよさそうかなと思い始めた。
├── 2021
│ ├── 07
│ │ ├── 01.md
│ │ ├── 02.md
こんな感じ。
現状だとディレクトリ名とファイル名に重複がある(年月の部分)のでちょっと余計な感じがする。
今は記事作成用の VSCode 拡張と同じように、「きょう」と入力して YYYY-MM-DD の日付をファイル名にする、みたいなことをやったりしている(日付が変わってから書くことが多いのでよく「きのう」と入力する)
ディレクトリ構成とファイル名を変えたらまあこのやり方ではなくなるけど、よりスマートなやりかたで書いていきたい。
ちなみに今はファイル名を Node.js の path モジュールを使ってpath.parse(filePath).name
で取得していて、記事の ID もこれになっているのだけど、ディレクトリ構成を上述の通りに変更した場合は ID や日付をどう取得するか。
path.parse(filePath)
で以下のようなデータが取得できる。
path.parse('/home/user/dir/file.txt')
// Returns:
// { root: '/',
// dir: '/home/user/dir',
// base: 'file.txt',
// ext: '.txt',
// name: 'file' }
たとえば/contents/2021/07/01.md
というファイルパスの場合、
path.parse('/2021/07/01.md')
// Returns:
// { root: '/',
// dir: '/contents/2021/07',
// base: '01.md',
// ext: '.md',
// name: '01' }
という感じになってしまう。こうすると日付だけをうまく取得するのはなかなか面倒そう。
他に案がないかPath | Node.js v17.3.0 Documentationを見ていたところ、path.sep
というのがあった。
まあこれは要するに/
を返すものではあるんだけど(自分の手元の環境では)、これを使うと
'/contents/2021/07/01.md'.split(path.sep)
// ['contents', '2021', '07', '01.md']
みたいな感じになりそう。
なのでこれを使って、
const dateParts = filePath.split(path.sep)
const date = `${dateParts[1]}-${dateParts[2]}-${path.parse(filePath).name}`
みたいな感じで取得できるかな?
ただ取得できたとして、どうやって構成するのが良いのかはわからん。みんなどうやってるんだろう。