skip to content
barorin&?

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

/ 2 min read

はじめに

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

方法

事前準備

# 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)