概要
- Markdown はシンプルだが、その設計や運用には多くの矛盾や問題点が存在
- CommonMark による仕様統一の努力は評価されるが、根本的な課題は言語自体にある
- 拡張や互換性 の問題、HTMLとの混在、パーシングやセキュリティリスクが顕在化
- 理想的なマークアップ言語 には明確な仕様とビルドシステム、拡張性が必要
- 現状のMarkdown は万能ではなく、用途に応じた適切な選択が重要
Markdownの光と影
- Markdown は、 最小限の記法 で文書を整形できるマークアップ言語
- 主な目的は、 MarkdownファイルからHTMLファイルへの変換
- 視認性が高く、記述も簡単 で、初心者でもチートシートだけで使い始められる
- C言語のように、出力が予測しやすい 点も魅力
- しかし、 私たちが本当に求めているもの は何かが曖昧
- UIやプログラミング的な拡張 を求める声も多く、機能追加が混乱を招く
- 仕様の不明瞭さ が、さまざまな解釈や実装の違いを生む要因
Markdownの曖昧な仕様と実装の混乱
- 同じ出力を別の記法で書ける という問題
- 例:
# HelloとHello =====はどちらも同じ見出しに変換 - 強調(太字・斜体) も
**bold**、__bold__、<b>bold</b>など複数の書き方が可能 - 入れ子や複雑な強調記法 がパーサーの脆弱性(ReDoS等)を誘発
- 例:
- HTMLのインライン挿入 が可能
- Markdown内で
<span>や<div>などHTMLタグを直接記述できる - これにより、 MarkdownパーサーだけでなくHTMLパーサーも必要 となる
- セキュリティリスク(XSS等) の温床となりやすい
- Markdown内で
- 古い記法や複数の書き方が混在
- 見出しやリスト、水平線など、 2通り以上の記載方法 が存在
- 文脈依存の記法 (例: footnoteや参照リンク)でパースが複雑化
パーシングとレンダリングの課題
- パース自体は簡単 だが、 文脈依存の仕様 があると一気に難易度が上がる
- 例: footnoteや参照リンクは グローバルな定義解決 が必要
- レンダリングはさらに難しい
- 現代のMarkdownは フットノートやカスタムコールアウト、数式、カスタムスタイリング など多機能化
- 単純なテキスト変換から、コンパイラ的な処理 が求められる
- 依存関係や実行エンジン まで必要になるケースも
セキュリティと運用の現実
- インラインHTMLやプラグイン、埋め込み実行エンジン の導入で攻撃面が広がる
- 実際に XSS脆弱性(CVE) が繰り返し発生
- パーサーの多様化 と 独自拡張 が標準化を阻害
- どのツールも「 万能ではない」状態
理想のマークアップ言語とは
- 明確で一貫した仕様 と ビルドシステム の必要性
- インラインHTML禁止、明確なショートコードや関数の導入
- カスタムフック の定義(コンパイル前・中・後)
- 仕様の完全な定義
- 現状の選択肢の限界
- Plain text: 美しいが専門性が高い
- reStructuredText: 読むのは良いが書きにくい
- mdx: HTMLに近づきすぎて可読性が犠牲
- 万能な選択肢は存在しない という現実
結論:Markdownをどう使うべきか
- Markdownはシンプルな文書作成には最適
- ただし、 拡張や複雑な要件には向かない
- 用途に応じて適切なツールを選択
- 必要なら カスタムビルドのツールや独自仕様 の導入を検討
- 「言語」として万能を求めず、道具として割り切って使う姿勢 が重要