ブログのカテゴリの整理

カテゴリ:  Tech タグ:  blog pelican

カテゴリの整理

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

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

  • 使っているテーマはカテゴリのアーカイブへのリンクを自動でメニューに追加して くれるが活用できていない。タグだと数が多すぎる。

  • 自動的に関連記事へのリンクを追加してくれるプラグインがあるが、タグにより 関連記事を探すため、現在の10種類だと粗すぎて関連記事がうまく拾えていない。

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

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

Tech

技術系の記事。

Gadget

ガジェット系の記事

Automotive

自動車関連の記事

Trivialities

雑記です。

Entertainment

書評、映画、音楽関連記事。

Dining

食やお酒関連の記事。

過去記事の自動変換

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

#!/usr/bin/env python
import os
import re
import fileinput

# TagsからCategoryへの変換プログラム
# ./content 以下のフォルダを再帰的に読み込み処理を行う。
# 1. 年度を使ったTagは無視する
# 2. 最初のタグをカテゴリとして登録する
# 3. 複数のタグを集約してカテゴリ数を限定する。
def print_meta(path, title, date, tags,slug,category,description):
    print('Title: {0}'.format(title))
    print('Date: {0}'.format(date))
    if len(tags) > 0:
        print('Tags: {0}'.format(tags.lower()))
    print('Category: {0}'.format(category))
    print('Slug: {0}'.format(slug))
    print('Description: {0}'.format(description))
    print()

def convert_file(path):
    with fileinput.input(files=(path,), inplace=True) as f:
        state = 'meta'
        title = ''
        date = ''
        tags = ''
        slug = ''
        category = ''
        description = ''

        for line in f:
            line = line.strip('\n')
            kv = line.split(':', maxsplit=1)
            key = kv[0].lower()
            if state == 'meta':
                if key == 'description':
                    print_meta(path, title, date, tags,slug,category,description)
                    state = 'body'
                else:
                    if key == 'title':
                        title = kv[1].strip('"')
                        title = title.strip()
                    elif key == 'slug':
                        slug = kv[1].strip('"')
                        slug = slug.strip()
                    elif key == 'description':
                        description = kv[1].strip('"')
                        description = description.strip()
                    elif key == 'date':
                        date = kv[1].strip('"').replace('T', ' ')[:len('YYYY-MM-DD HH:MM')]
                        date = date.strip()
                    elif key == 'tags':
                        tags_temp = kv[1].strip('[]').replace('"', '')
                        tags_temp = tags_temp.strip()
                        tags_array = tags_temp.split(',')
                        tags = ''
                        for item in tags_array:
                            pattern = r"20*"
                            match = re.match(pattern,item)
                            if match:
                                tags_array.remove(item)
                            else:
                                if tags == '':
                                    tags = item
                                else:
                                    tags = tags + ',' + item
                        first_tag = tags_array[0].strip()
                        if first_tag in {'car','cars'}:
                            category = 'Automotive'
                        elif first_tag in {'web/tech','software'}:
                            category = 'Tech'
                        elif first_tag in {'music','films','books'}:
                            category = 'Entertainment'
                        elif first_tag in {'gadget'}:
                            category = 'Gadget'
                        elif first_tag in {'foods and drink'}:
                            category = 'Dining'
                        elif first_tag in {'travel','daily trivialities',
                                           'daily trivialitieis','current affairs'}:
                            category = "Trivialities"
                        else:
                            category = first_tag
            else:
                print(line)

for path, dirs, files in os.walk('content'):
    for f in files:
        if f.endswith('.md') or f.endswith('.markdown'):
            fpath = os.path.join(path, f)
            print('path={0}'.format(fpath))
            convert_file(fpath)

コメント

Comments powered by Disqus