ブログのタグを調整するためのツール書いた

2023-04-12-00-40-44.webp
目次

はじめに

このブログ記事は元々Wordpressで書いていたので、Wordpressのタグ付けをしていました。 しかし、Hugoに移行するにあたってタグ付けがぐちゃぐちゃになっていました。 それだけでなくカテゴリを整えたいとおもっていました。

Markdownファイルを1つずつ編集するのも良いのですが、どうにもやる気になれません。

自作編集ツールを作成する

ブログの記事に使っているMarkdownファイルからタグを抽出しています。 タグ編集はCSVファイルを使って編集しています。

タグ情報の抜き出し

Postフォルダ無いの構成がこんな感じです。

contents/post
├─post1
│      cropped-Keyboard__1614449645.webp
│      index.md
│
├─post10
│      2021-03-15-09-44-58.webp
│      2021-03-15-10-02-48.webp
│      2021-03-15-10-06-53.webp
│      2021-03-15-10-08-03.webp
│      2021-03-15-21-56-21.webp
│      index.md
│
├─post100
│      index.md
│      markdown-img-paste-20211101021008159-600x312.webp
│      markdown-img-paste-20211101021059290.webp
│      markdown-img-paste-20211101021123739-351x600.webp
(中略)

私のブログでは、記事ごとにフォルダがあって、index.mdに記事の内容が書かれています。 そして、画像ファイルが同一フォルダに保存して管理しています。

このフォルダ構成であることを前提に進めていきます。

import os
import re
import csv

def extract_metadata_from_file(file_path):
    metadata = {}
    with open(file_path, "r", encoding="utf-8") as file:
        content = file.read()

        # タイトル、日付、カテゴリ、カバー画像、説明、タグを抽出
        patterns = {
            "title": r"title:\s*\"(.*?)\"",
            "date": r"date:\s*\"(.*?)\"",
            "categories": r"categories:\s*\[(.*?)\]",
            "coverImage": r"coverImage:\s*\"(.*?)\"",
            "description": r"description:\s*\"(.*?)\"",
            "tags": r"tags:\s*\[(.*?)\]"
        }

        for key, pattern in patterns.items():
            regex = re.compile(pattern, re.MULTILINE)
            match = regex.search(content)
            if match:
                if key in ["categories", "tags"]:
                    metadata[key] = [item.strip().strip("'") for item in match.group(1).split(',')]
                else:
                    metadata[key] = match.group(1)
            else:
                metadata[key] = None

    return metadata

def collect_metadata_from_files(path):
    metadata_data = []
    for root, dirs, files in os.walk(path):
        for file in files:
            if file == "index.md":
                file_path = os.path.join(root, file)
                metadata = extract_metadata_from_file(file_path)
                metadata["path"] = file_path
                metadata_data.append(metadata)
    return metadata_data

def write_metadata_to_csv(metadata_data, output_file):
    with open(output_file, "w", encoding="utf-8", newline="") as csvfile:
        fieldnames = ["path", "title", "date", "categories","tags","coverImage", "description"]
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writeheader()
        for row in metadata_data:
            writer.writerow({key: ','.join(row[key]) if isinstance(row[key], list) else row[key] for key in fieldnames})

if __name__ == "__main__":
    path = "."  # カレントディレクトリを指定
    output_file = "metadata_summary.csv"
    metadata_data = collect_metadata_from_files(path)
    write_metadata_to_csv(metadata_data, output_file)

取得したCSVファイルを確認します。

こんな感じですね。良いんじゃないでしょうか。

タグ情報の反映

先程、取得したCSVファイルを指定し、各ファイルにタグの内容を反映していきます。

import csv
import os
import re

def main():
    csv_file_path = 'metadata_summary.csv'

    with open(csv_file_path, 'r', encoding='utf-8') as file:
        csv_reader = csv.DictReader(file)
        for row in csv_reader:
            index_md_path = row['path']
            if os.path.isfile(index_md_path):
                with open(index_md_path, 'r', encoding='utf-8') as md_file:
                    md_content = md_file.read()
                    md_content = re.sub(r'---\n.*?\n---', '', md_content, flags=re.DOTALL)
                
                new_categories = '[' + ','.join(['"' + c.strip().replace('"', '') + '"' for c in row['categories'].split(',')]) + ']'
                new_tags = '[' + ','.join(['"' + t.strip().replace('"', '') + '"' for t in row['tags'].split(',')]) + ']'
                
                new_metadata = f"""---
title: "{row['title']}"
date: "{row['date']}"
categories: {new_categories}
tags: {new_tags}
coverImage: "{row['coverImage']}"
description: "{row['description']}"
---

"""
                new_md_content = new_metadata + md_content
                with open(index_md_path, 'w', encoding='utf-8') as md_file:
                    md_file.write(new_md_content)

if __name__ == '__main__':
    main()

反映されているはずです。

まとめ

今日は簡単にですが、ブログの管理効率化を目的にスクリプト書いてみました。 めっちゃニッチなコードですが便利ですね。助かります。

Related Post

> ブログのタグを調整するためのツール書いた
再帰的なウェブサイト内リンクチェッカーをPythonで作成する
> ブログのタグを調整するためのツール書いた
HugoでSEO対策を施し、関連記事機能を実装した
> ブログのタグを調整するためのツール書いた
Nuxt.jsブログに全文検索機能を追加する方法
> ブログのタグを調整するためのツール書いた
ブログ作りを進める - パンくずリストの実装方法
> ブログのタグを調整するためのツール書いた
ブログの広告収入向上とRSSフィードの導入
> ブログのタグを調整するためのツール書いた
HugoブログをGithubActionを使ってS3サーバに差分アップする方法

おすすめの商品

>