Table of Contents
はじめに
はてなブロックから記事移行するために MT(MovableType)形式を 1 記事ずつ分割して
マークダウン形式に変換するスクリプトを書いてみました。
Convert/YYYY/MM/DD.mdx という感じで記事が分割されて保存されるようになってます。
方法
事前準備
# HTMLをMarkdownに変換してくれるライブラリ# URL: https://github.com/matthewwithanm/python-markdownify$ pip install markdownify
スクリプト
import datetimeimport osimport 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)