ブログのタグを調整するためのツール書いた
目次
はじめに
このブログ記事は元々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()
反映されているはずです。
まとめ
今日は簡単にですが、ブログの管理効率化を目的にスクリプト書いてみました。 めっちゃニッチなコードですが便利ですね。助かります。