はじめに
Windowsのメモ帳がMarkdownに対応した──
…はずなのに、開いたファイルを勝手に整形して壊してくるという衝撃の仕様に直面しました。
この仕様については、前回の記事でも詳しく触れています:
📝 【まぜるな危険】Markdownに対応したWindows11のメモ帳は要注意!実際に触ってわかった“怖さ”とは?
具体的には:
- リストの間に不要な空行が入る
- エスケープ文字が強制挿入される
- 記法が一部変えられてしまう
この「壊されたMarkdownファイル」を修復するためにツールを作り始めたのですが、
せっかくなら…と、Markdown整形ツールとして仕立て直してみました。
既存のツールもいくつか見つけたんですが──
普段はC言語がメインなので、Pythonの勉強を兼ねて Markdown整形ツールを作ってみました。
解決したかった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