2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Markdownの記法がバラバラ…?壊れたmdを整形するPythonツールを自作してみた【md-formatter】

Posted at

はじめに

Windowsのメモ帳がMarkdownに対応した──
…はずなのに、開いたファイルを勝手に整形して壊してくるという衝撃の仕様に直面しました。

この仕様については、前回の記事でも詳しく触れています:

📝 【まぜるな危険】Markdownに対応したWindows11のメモ帳は要注意!実際に触ってわかった“怖さ”とは?

具体的には:

  • リストの間に不要な空行が入る
  • エスケープ文字が強制挿入される
  • 記法が一部変えられてしまう

この「壊されたMarkdownファイル」を修復するためにツールを作り始めたのですが、
せっかくなら…と、Markdown整形ツールとして仕立て直してみました。

既存のツールもいくつか見つけたんですが──
普段はC言語がメインなので、Pythonの勉強を兼ねて Markdown整形ツールを作ってみました。

GitHub: https://github.com/Shachi-lab/md-formatter


解決したかったMarkdownの“揺れ”

Markdownには、仕様上「複数の書き方が許されている」記法がいくつもあります。

たとえば──

表現 記法の例
太字 **bold**__bold__
斜体 *italic*_italic_
リスト * - + どれでも可
水平線 ---, ***, ___ など
エスケープ \_, \*, \[, \] など

個人で使っているうちはまだいいですが、以下のような問題が起こりがちです:

  • 表示がツールによって変わる
  • 複数人で編集すると記法が混在する
  • Gitのdiffがノイズだらけになる

作ったもの:md-formatter.py

Python製のCLIツールで、Markdownファイルの整形・記法統一・ノイズ削除を行います。

GitHub公開中:
👉 https://github.com/Shachi-lab/md-formatter


特徴・できること

  • ✅ 強調記法(太字・斜体)の記号を統一(**, __, -- など)
  • ✅ 水平線やリストの記号も統一(---, *, + など)
  • コードブロック の中身は整形対象から除外
  • ✅ メモ帳などで勝手に入った空行を削除(リスト間の空行など)
  • ✅ エスケープ記号(\_など)を一括削除(オプション)

基本の使い方

python md-formatter.py input.md > output.md

オプション一覧

オプション 内容 デフォルト
--bold {*, -, _} 太字マーカーを選択 *
--italic {*, -, _} 斜体マーカーを選択 *
--hr {*, -, _} 水平線マーカーを選択 -
--list {*, -, +} リストマーカーを選択 -
--no-del-escape エスケープ文字を削除しない false
--no-fix-list メモ帳由来の空行を削除しない false

カスタム例

python md-formatter.py --bold _ --italic - --list + input.md > output.md
python md-formatter.py --no-del-escape --no-fix-list input.md > output.md

実装の工夫ポイント

正規表現で太字や斜体を統一

Pythonのre.subとラムダ式を使うと、記法を変換できます:

line = re.sub(r'(?P<marker>\*\*|__)(?P<text>.*?)(?P=marker)',
              lambda m: args.bold * 2 + m.group('text') + args.bold * 2,
              line)

マーカー部分を(?P<marker>...)でキャプチャし、(?P=marker)で閉じマーカーと一致させています。


argparseで引数パース

オプションの指定には、Python標準のargparseを使用:

import argparse

parser = argparse.ArgumentParser()
parser.add_argument('--bold', choices=['*', '-', '_'], default='*')
args = parser.parse_args()

これだけで、指定できる記号に制限を加えたり、デフォルトを設定できます。


まとめ

Markdownの記法がバラバラで困る場面、意外と多いですよね。
ツールやエディタによっては勝手に整形されてしまうこともあり、履歴管理や共同編集が面倒になる原因になります。

今回のmd-formatter.pyは、最低限のルールで記法を統一し、読みやすく、差分にも優しい状態に整えることを目的としています。

Pythonの練習がてらでも作れるので、ちょっとした自動整形におすすめです!

🎀「Pythonって、ちょっと書くだけでも“便利ツール”になるから楽しいよねっ」

いつもは、C言語でプログラミングしてるので、まだpythonは勉強中です。
バグとか不具合とかいっぱいあると思いますが、大目に見てください。

※この記事は、しゃちらぼブログ Vol.029 をベースに、Qiita向けに再構成・補足したものです。


関連リンク


参考

  • Markdown記法の仕様(CommonMark, GitHub Flavored Markdown)
  • Python公式:re / argparse
2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?