はじめに
Markdownはブログ記事,ドキュメントなど,文章作成の必須科目です。近年ではそれらに加え,生成AIとの対話にも欠かせません。ところが,利用するツールやサービスによってその書き方に多少の差異があり,処理系によって表示結果が異なる経験をお持ちの方も多いのではないでしょうか(筆者もその一人です)。その理由は,Markdownに方言が乱立しているためです。
本記事では,Markdownの歴史から現在の乱立状況を,できるだけ原典をたどりながら整理してみました。
Markdownの歴史
誕生(2004年)
オリジナル
MarkdownがJohn Gruber氏によって最初に発表されたのは2004年3月です。プレーンテキストをHTMLに変換するツールとして開発されました(本記事ではこれをオリジナルと呼びます)。この時点で「Markdown」は二つの意味がありました。
-
処理系
Markdown形式のテキストをHTMLに変換するPerlスクリプトである,Markdown.plです。MovableTypeなどCMSのプラグインとしても利用できるようになっていました。 -
シンタックス(構文,記法)
シンタックスとして,以下のような基本機能を規定しました。- 段落とヘッダー(Setext形式とATX形式)
- リスト(順序付き・順序なし)
- コードブロックとインラインコード
- リンクと画像
- 強調(イタリック・ボールド)
- 引用ブロック
ちなみに,ATX形式は行頭の#
~######
で見出しをつける方式,Setext形式は当該行に続けて=========
や---------
を書くことで見出し行にする方式です。多く利用されているのはATX形式です。
2004年8月にVersion1.0が公式にリリースされました。この時点で実装としてPHP Markdown(PHP実装),BlueCloth(Ruby実装),xMarkdown(Perl実装)が確認できます。
このオリジナルは2004/12のVersion1.0.1が最新です。しかし,構文の規定があいまいであったり,Markdown.plにはバグが多いなど,不十分であることが後に指摘されています。
John Gruber氏がVersion1.1を計画していた形跡はありますが,更新されていません。
Markdownのシンタックス設計において,Aaron Swartz氏の協力がありました(公式の謝辞)。特にATXと呼ばれる書式(#
で始まる見出しや,*
で始まるリスト表記)は,2002年にAaron Swartz氏が提唱していたものです。Aaron Swartz氏は,RSSを開発したり,Redditの創設にかかわった方ですが,残念ながら2013年に亡くなりました。
PHP Markdown
オリジナルの実装はPerlでしたが,Michel Fortin氏によってPHP実装のPHP Markdown(現在はclassic)がオリジナル発表直後の2004/3に開発が始まりました。PHPで書かれたことから,WordpressのPluginとして需要があったようです。
2005/7にPHP Markdown Extraとしてテーブル表記が追加されました。この時点でオリジナルとの差分が発生し,乱立の歴史が始まったと言えます。ただ,Michel Fortin氏は乱立を望んでいたわけではなく,John Gruber氏によるオリジナルの仕様に統合されることを表明していました。
初期の用途
Markdown.plがMovableType,PHP MarkdownがWordpressに組み込まれたことから推察すると,当初MarkdownはCMSで記事を効率的に書く用途が多かったようです。
初期の普及(2004-2012年)
Markdownは当初からブロガーやプログラマーの間で人気を博しました。しかし、オリジナルの仕様書は曖昧な部分が多く,実装者によって解釈が異なる問題が早期から発生していました。
Markdownの標準化への試み
CommonMark(2014年〜)
2014年,Markdownの曖昧さを解消する目的でCommonMarkプロジェクトが立ち上がりました。創設は,GitHub,Pandoc,Reddit,Stack Overflowなど,それまでMarkdownを実装したり活用していた組織の有志によるものです。このプロジェクトは,以下の目的を掲げました。
- 標準的で明確な構文仕様
- 仕様に基づくMarkdown実装を検証するための包括的なテストスイート
2014年10月にバージョン0.5がリリースされ,現在も開発が続いています。
2025年9月時点の最新版は0.31.2(2024/1/28リリース)です。
公式がCommonMarkのプレビュー機能を提供しています。commonmark.jsで動作しています。
CommonMarkによる記法はここで確認できます。
そして,なんと|
によるテーブル形式が定義されていません。ただしHTML表記の<table>
タグでテーブルを作ることができます。
その他の標準化の動き
- RFC 7763/7764(2016年):IETFによるtext/markdownメディアタイプの登録。
Markdownの乱立
主要な方言と処理系
2025年時点で、約40件強のMarkdown方言が存在します(commonmarkではFlavorsと表現されていますが,この記事では日本風に「方言」と表現します)。主要なものを以下に示します。
GitHub Flavored Markdown (GFM)
- 歴史:2009年頃から段階的に拡張され,2017年にCommonMarkベース
になりました。 - 特徴:
- テーブル構文
- タスクリスト
- 取り消し線(
~~text~~
) - 自動リンク化
- シンタックスハイライト付きコードブロック
- 仕様:https://github.github.com/gfm/
- その他:GitHub,GitLab,VisualStudioCodeなどがGFMの主要機能をサポート
MultiMarkdown
- 歴史:2006年頃,学術論文や研究ノートの作成目的で開発されました。
2023年11月にversion6.7.0がリリースされ,現在もメンテナンスが継続されていますが,新機能追加のペースは緩やかです - 特徴:
- 脚注
- テーブル
- メタデータ
- 相互参照
- 仕様:https://fletcher.github.io/MultiMarkdown-6/syntax/
Pandoc Markdown
- 歴史:2006年頃開発されました。初期バージョンでは基本的な変換機能のみを提供し,学術向け拡張は2010年代に強化されました。
2017年以降,CommonMark準拠モードの追加,Jupyter Notebook対応,Lua フィルタによる拡張機能等,文書変換ツールとして30以上の
入出力形式をサポートする多機能なMarkdown方言に発展しました。 - 特徴:
- 学術文書向けの豊富な拡張
- 数式(LaTeX構文)
- 引用文献管理
- メタデータ(YAML形式)
- 用途:学術論文、技術文書の変換
- 仕様:https://pandoc.org/MANUAL.html
日本における方言と処理系
Commonmarkの方言リストに載っていませんが,その他にも独自に拡張された記法や実装があります。日本の情報共有プラットフォームとして有名なQiitaやZennも独自の拡張を行っており,オープンソースとして公開しています。
Qiita
GitHub Flavored Markdownに準拠し,拡張を行っています。
例えば以下の注記記法は独自拡張です。
:::note warn
警告
○○に注意してください。
:::
↓表示結果
警告
○○に注意してください。
Zenn
処理系
言語別の主要実装
JavaScript/Node.js系
- Markd.js(2011年〜):MarkdownをHTMLに変換するライブラリ。軽量・高速・拡張性が特徴。プレビューテストはこちら。
- markdown-it(2014年〜):プラグイン可能なアーキテクチャ
- remark(unified ecosystem):AST変換ベース
Python系
- Python-Markdown:拡張機能が豊富
- Mistune:高速な純Python実装
- markdown2:GitHub風の拡張をサポート
その他の言語
- Redcarpet(Ruby):以前GitHub.comで使用されていた
- Blackfriday(Go):Hugo等で利用。後継はGoldmark。
- pulldown-cmark(Rust):CommonMark準拠
乱立がもたらす課題と現状
互換性の問題
同じMarkdownファイルでも,参照するシンタックスや実装によって出力が異なるケースがあります。具体的な多くの事例をBabelmark3で確認できます。
一例として,ネストされたリストが挙げられます。
```markdown
- リスト1
- ネストリスト(スペース2つ)
- さらにネスト(スペース4つ)
```
この単純な例でも,インデントの解釈は実装により異なります。
表示差分を確認するBabelmark3
実装や処理系によって表示結果が具体的にどう異なるのか,差異をBabelmark3で比較できます(2025/9現在,43の処理系を比較可能)。上記の例を比較したのがこちらです。Babelmarkの語源は原典を見つけられませんでしたが,「バベルの塔」由来であることは想像に難くありません。
Babelmarkは初代,Babelmark2,Babelmark3と3つあり,同一名称を使っているもののそれぞれ異なるプロジェクトで,現在ではBabelmark3がアクティブです。ちなみに,babelmark2を開発したJohn MacFarlane氏は,Commonmarkの立ち上げやPandocの開発に携わるなど,Markdownの開発や標準化における貢献者です。
まとめ
2004年に「シンプルで読みやすい」ことを目指して生まれたMarkdownは,数十種類の方言が乱立する状況となりました。しかし,この「乱立」は必ずしも悪いことではありません。GFMはコード共有に,Pandocは学術文書に,それぞれの用途に最適化された進化を遂げてきました。
現在のMarkdown環境を整理すると
- 基本構文:CommonMarkによって標準化が進み,主要な処理系間での互換性は向上
- 拡張機能:用途に応じた多様な発展(テーブル,数式,図表,参照など)
Markdownを使う際は,まず利用環境(GitHub,VSCode,静的サイトジェネレータなど)がどの方言に対応しているかを確認し,その仕様の範囲内で記述することが「思った通りに表示されない」問題を避ける方法でしょう。(結局,プレビューでしっかり確認しましょう,に尽きる。)
出典,参考