ブログのカテゴリの整理

カテゴリの整理

Hugoからの移行時に、記事のカテゴリは全て "blog" としてタグのみを使う ようにしていました。使っているタグは10種類くらいです。

ところが、以下のような問題が残ってしまいました。

  • 使っているテーマはカテゴリのアーカイブへのリンクを自動でメニューに追加して くれるが活用できていない。タグだと数が多すぎる。
  • 自動的に関連記事へのリンクを追加してくれるプラグインがあるが、タグにより 関連記事を探すため、現在の10種類だと粗すぎて関連記事がうまく拾えていない。

いろいろ考えた挙句、現在のタグをベースにカテゴリを集約して数を減らしつつ、 タグはもう少し自由により細かく設定することにしました。

集約したカテゴリは以下の通りです。

Web/Tech
技術系の記事。
Gadget
ガジェット系の記事
Automotive
自動車関連の記事
Trivialities
雑記です。
Entertainment
書評、映画、音楽関連記事。
Dining
食やお酒関連の記事。

過去記事の自動変換

過去のMarkdownで書き溜めた記事の移行は面倒だったのでプログラムを書きました。

 1 #!/usr/bin/env python
 2 import os
 3 import re
 4 import fileinput
 5 
 6 # TagsからCategoryへの変換プログラム
 7 # ./content 以下のフォルダを再帰的に読み込み処理を行う。
 8 # 1. 年度を使ったTagは無視する
 9 # 2. 最初のタグをカテゴリとして登録する
10 # 3. 複数のタグを集約してカテゴリ数を限定する。
11 def print_meta(path, title, date, tags,slug,category,description):
12     print('Title: {0}'.format(title))
13     print('Date: {0}'.format(date))
14     if len(tags) > 0:
15         print('Tags: {0}'.format(tags.lower()))
16     print('Category: {0}'.format(category))
17     print('Slug: {0}'.format(slug))
18     print('Description: {0}'.format(description))
19     print()
20 
21 def convert_file(path):
22     with fileinput.input(files=(path,), inplace=True) as f:
23         state = 'meta'
24         title = ''
25         date = ''
26         tags = ''
27         slug = ''
28         category = ''
29         description = ''
30 
31         for line in f:
32             line = line.strip('\n')
33             kv = line.split(':', maxsplit=1)
34             key = kv[0].lower()
35             if state == 'meta':
36                 if key == 'description':
37                     print_meta(path, title, date, tags,slug,category,description)
38                     state = 'body'
39                 else:
40                     if key == 'title':
41                         title = kv[1].strip('"')
42                         title = title.strip()
43                     elif key == 'slug':
44                         slug = kv[1].strip('"')
45                         slug = slug.strip()
46                     elif key == 'description':
47                         description = kv[1].strip('"')
48                         description = description.strip()
49                     elif key == 'date':
50                         date = kv[1].strip('"').replace('T', ' ')[:len('YYYY-MM-DD HH:MM')]
51                         date = date.strip()
52                     elif key == 'tags':
53                         tags_temp = kv[1].strip('[]').replace('"', '')
54                         tags_temp = tags_temp.strip()
55                         tags_array = tags_temp.split(',')
56                         tags = ''
57                         for item in tags_array:
58                             pattern = r"20*"
59                             match = re.match(pattern,item)
60                             if match:
61                                 tags_array.remove(item)
62                             else:
63                                 if tags == '':
64                                     tags = item
65                                 else:
66                                     tags = tags + ',' + item
67                         first_tag = tags_array[0].strip()
68                         if first_tag in {'car','cars'}:
69                             category = 'Automotive'
70                         elif first_tag in {'web/tech','software'}:
71                             category = 'Web/Tech'
72                         elif first_tag in {'music','films','books'}:
73                             category = 'Entertainment'
74                         elif first_tag in {'gadget'}:
75                             category = 'Gadget'
76                         elif first_tag in {'foods and drink'}:
77                             category = 'Dining'
78                         elif first_tag in {'travel','daily trivialities',
79                                            'daily trivialitieis','current affairs'}:
80                             category = "Trivialities"
81                         else:
82                             category = first_tag
83             else:
84                 print(line)
85 
86 for path, dirs, files in os.walk('content'):
87     for f in files:
88         if f.endswith('.md') or f.endswith('.markdown'):
89             fpath = os.path.join(path, f)
90             print('path={0}'.format(fpath))
91             convert_file(fpath)