skip to content
barorin&?

MT形式のテキストファイルをmdxファイルに変換する

/ 2 min read

Table of Contents

はじめに

はてなブロックから記事移行するために MT(MovableType)形式を 1 記事ずつ分割して マークダウン形式に変換するスクリプトを書いてみました。
Convert/YYYY/MM/DD.mdx という感じで記事が分割されて保存されるようになってます。

方法

事前準備

Terminal window
# HTMLをMarkdownに変換してくれるライブラリ
# URL: https://github.com/matthewwithanm/python-markdownify
$ pip install markdownify

スクリプト

import datetime
import os
import re
from markdownify import markdownify as md
def save_mdx_at_dir(dir_path: str, file_name: str, content: str) -> None:
"""保存先を指定してファイルを作成
Args:
dir_path(str): ディレクトリパス
file_name(str): ファイル名
content(str): 書き込むコンテンツ
Returns:
None
"""
os.makedirs(dir_path, exist_ok=True)
with open(os.path.join(dir_path, file_name), mode="w", encoding="utf-8") as f:
f.write(content)
def duplicate_rename(file_path: str) -> str:
"""重複ファイルのリネーム
Args:
file_path(str): ファイルパス
Returns:
os.path.basename(new_name)(str): 拡張子付きのファイル名
os.path.basename(file_path)(str): 拡張子付きのファイル名
"""
if os.path.isfile(file_path):
name, ext = os.path.splitext(file_path)
i = 1
while True:
new_name = f"{name}-{i}{ext}"
if not os.path.isfile(new_name):
return os.path.basename(new_name)
i += 1
else:
return os.path.basename(file_path)
def mt_to_mdx(mt_text: str) -> None:
"""MT形式のテキストファイルをmdxファイルに変換
Args:
mt_text(str): MT形式のテキストファイルパス
Returns:
None
"""
pattern = re.compile(r"BODY:(.*?)-----$", re.MULTILINE | re.DOTALL) # 複数行マッチ
export_list = mt_text.split("--------")
for export in export_list:
title = re.search(r"TITLE: (.*)", export).group(1) # type: ignore
summery = title[:15] + "..." if len(title) > 15 else title
date = re.search(r"DATE: (.*)", export).group(1) # type: ignore
date = datetime.datetime.strptime(date, "%m/%d/%Y %H:%M:%S")
year, month, day = (
str(date.year),
str(date.month).zfill(2),
str(date.day).zfill(2),
)
date = str(datetime.date(date.year, date.month, date.day))
category = re.findall(r"CATEGORY: (.*)", export)
body = pattern.search(export).group(1) # type: ignore
body = md(body)
mdx = (
f"---\ntitle: {title}\ndate: {date}\n"
+ f"tags: {category}\ndraft: false\nsummary: {summery}\n---{body}"
)
file_name = duplicate_rename(f"convert/{year}/{month}/{day}.mdx")
save_mdx_at_dir(f"convert/{year}/{month}", file_name, mdx)
with open('hogefuga.hateblo.jp.export.txt') as f:
mt_text = f.read()
mt_to_mdx(mt_text)