マークダウンは構造化された文書を書くためのプレーンテキスト形式であり、電子メールやusenetの投稿における書式を示すための慣習に基づきます。 John Gruber氏により(Aaron Swartz氏の助けを借りて)開発され2004年に構文の説明とマークダウンをHTMLに変換するためのPerlスクリプト (Markdown.pl) の形で公表されました。 その後の10年間にわたって、数多の実装が多くの言語で開発されました。 元来のマークダウンの構文を脚註、表、その他の文書の要素のための慣習で拡張したものがありました。 マークダウンの文書をHTML以外の形式で呈示できるようにするものがありました。 Reddit、StackOverflow、GitHubのようなウェブサイトにはマークダウンを使う数百万人もの人がいました。 そしてマークダウンはウェブを越え、書籍、記事、スライド、手紙、講義ノートの執筆に使われ始めました。
マークダウンがその他多くの軽量なマークアップの構文と、つまり大抵は書きやすい構文と、一線を画すところはその可読性です。 Gruber氏は次のように書いています。
マークダウンの書式の構文のための何にも勝る設計の目標はできるだけ読みやすくすることです。 この考え方では、タグや書式の指示でマークアップされているように見えることなく、マークダウンで書式化された文書がそのままの形で、プレーンテキストとして、公開できるものであるべきとされます。 (https://daringfireball.net/projects/markdown/)
この点はAsciiDocの見本とそれと等価なマークダウンの見本を比べることで例証できます。 以下はAsciiDocの説明書からのAsciiDocの見本です。
1. List item one.
+
List item one continued with a second paragraph followed by an
Indented block.
+
.................
$ ls *.sh
$ mv *.sh ~/tmp
.................
+
List item continued with a third paragraph.
2. List item two continued with an open block.
+
--
This paragraph is part of the preceding list item.
a. This list is nested and does not require explicit item
continuation.
+
This paragraph is part of the preceding list item.
b. List item b.
This paragraph belongs to item two of the outer list.
--
そしてこちらはマークダウンによる同一の文書です。
1. List item one.
List item one continued with a second paragraph followed by an
Indented block.
$ ls *.sh
$ mv *.sh ~/tmp
List item continued with a third paragraph.
2. List item two continued with an open block.
This paragraph is part of the preceding list item.
1. This list is nested and does not require explicit item continuation.
This paragraph is part of the preceding list item.
2. List item b.
This paragraph belongs to item two of the outer list.
AsciiDoc版は、おそらくは、より書きやすいです。 字下げについて気にする必要はありません。 しかしマークダウン版の方がずっと読みやすいです。 リスト項目の入れ子は、処理された文書のみならず、ソースにおいても目に明らかです。
John Gruber氏のマークダウンの構文の正典的な説明では構文が曖昧さなく規定されていません。 以下は説明で答えていない質問の例です。
副リストにどのくらい字下げが必要ですか? 仕様には継続する段落は4つの空白文字で字下げする必要があると書かれていますが、副リストについては完全には明示的ではありません。 こちらもそうなっている、つまり4つの空白文字で字下げしなければならない、と考えるのが自然ですが、Markdown.plでは要求されていません。 これはおよそ「重箱の隅をつつくような場合」ではなく、この問題についての実装間の乖離によりしばしば実際の文書において利用者を驚かせることにつながっています(John Gruber氏によるこちらの見解を参照)。
ブロック引用ないし見出しの前に空行は必要ですか? ほとんどの実装で空行は要求されません。 しかしながら、これにより強く折り返されたテキストでの予期しない結果や、構文解析における曖昧さにもつながることがあります(なお見出しをブロック引用内に置く実装もある一方で、そうしないものもあります)(John Gruber氏も空行を要求することを支持すると語っていました)。
字下げコードブロックの前に空行は必要ですか? (Markdown.plでは要求されますが、文書では言及されておらず、これを要求しない実装があります)
paragraph
code?
リスト項目が<p>タグに囲まれるか判定する厳密な規則は何ですか? リストは部分的に「ゆるやか」で部分的に「窮屈」にできますか? そのようなリストについてどうするべきですか?
1. one
2. two
3. three
あるいは以下はどうでしょう?
1. one
- a
- b
2. two
(John Gruber氏による関連する見解はこちらにあります)
リストの印は字下げできますか? 順序付きリストの印は右揃えにできますか?
8. item 1
9. item 2
10. item 2a
以下は2つ目の項目の中に主題分割がある1つのリストでしょうか、それとも主題分割で別れた2つのリストでしょうか?
* a
* * * * *
* b
リストの印が数字から中黒に変わるとき、2つのリストと1つのリストのどちらになりますか? (マークダウンの構文の説明では2つの方が示唆されていますが、perlスクリプトとその他多くの実装では1つ生成されます)
1. fee
2. fie
- foe
- fum
行内の構造の印のための優先度の規則は何ですか? 例えば、以下は適正なリンクでしょうか、それともコード区域が優先するのでしょうか?
[a backtick (`)](/url) and [another backtick (`)](/url).
強調と強い強調の印の優先度の規則は何ですか? 例えば以下はどのように構文解析するべきですか?
*foo *bar* baz*
ブロックの水準と行内の水準の構造の間の優先度の規則は何ですか? 例えば、以下はどのように構文解析すべきですか?
- `a long code span can contain a hyphen like this
- and it can screw things up`
リストの項目に節の見出しを含められますか? (Markdown.plでは許されていませんが、ブロック引用に見出しを含めることは許されています)
- # Heading
リスト項目は空にできるのでしょうか。
* a
*
* b
リンク参照はブロック引用やリスト項目の内側で定義できますか?
> Blockquote [foo].
>
> [foo]: /url
同じ参照に複数の定義があるなら、どちらが優先しますか?
[foo]: /url1
[foo]: /url2
[foo][]
仕様が欠落していたときは、早期の実装者達はこうした曖昧さを解決するためにMarkdown.plをあたりました。 しかしMarkdown.plはかなり不具合だらけだったことと、多くの事例で明らかに悪い結果になったために、満足のいく仕様の代わりではありませんでした。
曖昧さのない仕様がないために、実装は著しく乖離してきました。 結果として、あるシステム(例えば、GitHubのウィキ)の方法で呈示される文書が別のもの(例えば、pandocを使ってdocbookに変換したもの)では違って呈示されることに利用者はしばしば驚かされます。 問題をさらに悪くすることに、マークダウンでは「構文の誤り」と見なすものが何もないために、そうした乖離がすぐ発覚しないことはよくあります。
本文書ではマークダウンの構文を曖昧さなく規定することを試みます。 マークダウンとHTMLを併記する多くの例が含まれています。 これらには適合性試験を兼ねる意図があります。 付属するスクリプトspec_tests.pyを使うと任意のマークダウンのプログラムに対してテストを実行できます。
python test/spec_tests.py --spec spec.txt --program PROGRAM
本文書ではどのようにマークダウンを抽象構文木に構文解析するかが記述されているため、HTMLより構文木の抽象的な表現を使う方が理に適っていたことでしょう。 しかしHTMLにはここで必要な構造的な区別を表現する能力があり、テストのためにHTMLを選択することで抽象構文木の呈示器を書くことなく実装に対してテストを実行できるのです。
なおHTMLの例に特有な点については必ずしも仕様では義務付けていません。 例えば、仕様では何をもってリンク先とするかが書かれていますが、URLの中のアスキーでない文字がパーセント符号化されていることは義務付けていません。 自動的なテストを使うためには、実装者達は仕様の例の(URLの中のアスキーでない文字がパーセント符号化された)期待結果に準拠する呈示器を提供する必要があります。 しかし準拠する実装では違う呈示器を使うことができURLの中でアスキーでない文字をパーセント符号化しない方を選んでも構いません。
本文書はテキストファイルの、spec.txtから生成されており、併記されたテストのための小さな拡張のあるマークダウンで書かれています。 スクリプトtools/makespec.pyを使うとspec.txtをHTMLまたはCommonMark(これはさらに他の形式に変換できます)に変換できます。
例では、タブ文字を表現するために→を用います。
文字の任意の系列は適正なCommonMarkの文書です。
文字はユニコードの符号位置です。 符号位置の中には(例えば、結合音符といった)直感的な意味での文字に照応しないものもありますが、本仕様の目的からすべての符号位置が文字と見なされます。
本仕様では符号化方式を指定しません。 行をバイトではなく文字から構成されるものとして考えるからです。 準拠する構文解析器では特定の符号化方式に限っても構いません。
行とは改行 (U+000A) または復帰 (U+000D) 以外の0以上の文字の系列であって、行末またはファイルの終わりが後に続きます。
行末とは改行 (U+000A)、または復帰 (U+000D) で改行が続かないもの、または復帰に改行が続くものです。
文字が1つも含まれない行、または空白文字 (U+0020) ないしタブ (U+0009) のみを含む行は、空行と呼ばれます。
以下の文字クラスの定義が本仕様で使われます。
ユニコードの空白文字とはユニコードのZsの一般分類にある文字、またはタブ (U+0009)、改行 (U+000A)、紙送り (U+000C)、復帰 (U+000D) です。
ユニコードの空白とは1つ以上のユニコードの空白文字の系列です。
タブ文字とはU+0009です。
空白文字とはU+0020です。
アスキーの制御文字とはU+0000-1Fの間(両端を含む)の文字ないしU+007Fです。
アスキーの約物文字とは !、"、#、$、%、&、'、(, )、 *、+、,、-、.、/ (U+0021–2F)、 :、;、<、=、>、?、@ (U+003A–0040)、 [、\、]、^、_、` (U+005B–0060)、 {、|、}、~ (U+007B–007E) です。
ユニコードの約物文字とはユニコードのP(約物)ないしS(記号)の一般分類にある文字です。
行内のタブは空白文字に展開されません。 しかしながら、ブロックの構造を定義する上で空白が役に立つ文脈においては、タブはあたかも4文字のタブ位置の空白で置き換わったように働きます。
したがって、例えば、字下げコードブロックにおいて4つの空白の代わりにタブが使えます(なお、しかしながら、内部のタブは文字通りのタブとして素通りし、空白に展開されません)。
以下の例では、リストの項目の継続する段落がタブで字下げされています。 これは4つの空白で字下げした場合のものとまったく同じ効果があります。
通常はブロック引用を開始する>には省略可能な1つの空白文字を後に続けて構いませんが、これは内容の一部とは見なされません。 以下の事例では>にタブが後に続いており、これはあたかも3つの空白に展開されたように扱われます。 これらの空白のうち1つは区切りの一部と見なされるため、fooはブロック引用の文脈内では6つの空白で字下げされたものと見なされ、そのため2つの空白で始まる字下げコードブロックになります。
- foo
- bar
→ - baz
<ul>
<li>foo
<ul>
<li>bar
<ul>
<li>baz</li>
</ul>
</li>
</ul>
</li>
</ul>
安全上の理由のため、ユニコード文字U+0000はREPLACEMENT CHARACTER (U+FFFD) で置き換えなければなりません。
あらゆるアスキーの約物文字は、バックスラッシュでエスケープできます。
\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~
<p>!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~</p>
他の文字の前のバックスラッシュは文字通りのバックスラッシュとして扱われます。
エスケープされた文字は普通の文字として扱われ通常のマークダウンの意味はありません。
\*not emphasized*
\<br/> not a tag
\[not a link](/foo)
\`not code`
1\. not a list
\* not a list
\# not a heading
\[foo]: /url "not a reference"
\ö not a character entity
<p>*not emphasized*
<br/> not a tag
[not a link](/foo)
`not code`
1. not a list
* not a list
# not a heading
[foo]: /url "not a reference"
&ouml; not a character entity</p>
バックスラッシュ自体がエスケープされれば後に続く文字はエスケープされません。
行の終わりのバックスラッシュは固い改行です。
バックスラッシュのエスケープはコードブロック、コード区域、自動リンク、素のHTMLの中では働きません。
<https://example.com?find=\*>
<p><a href="https://example.com?find=%5C*">https://example.com?find=\*</a></p>
しかしURLとリンク題、リンク参照、有塀コードブロックにおける情報文字列を含む、その他すべての文脈では働きます。
適正なHTMLの実体参照と数値的な文字参照は照応するユニコード文字の代わりに使えますが、以下の例外があります。
実体と文字参照はコードブロックやコード区域の中では認識されません。
実体と文字参照はCommonMarkにおける構造的な要素を定義する特殊な文字の代わりとして表せません。 例えば、*が文字通りの*の文字の代わりに使えるとはいえ、*では強調の区切り、中黒リストの印、主題分割における*を置き換えられません。
CommonMarkに準拠する構文解析器では特定の文字がソースにおいてユニコード文字ないし実体参照を使って表されていたかどうかについての情報を保管する必要はありません。
実体参照は&と任意の適正なHTML5の実体名と;からなります。 文書https://html.spec.whatwg.org/entities.jsonが適正な実体参照とそれらに照応する符号位置のための権威的なソースとして使われます。
& © Æ Ď
¾ ℋ ⅆ
∲ ≧̸
<p> & © Æ Ď
¾ ℋ ⅆ
∲ ≧̸</p>
10進数の数値的な文字参照は&#と1から7までのアラビア数字の文字列と;からなります。 数値的な文字参照はそれに照応するユニコード文字として構文解析されます。 不適正なユニコードの符号位置はREPLACEMENT CHARACTER (U+FFFD) で置き換わります。 安全上の理由のため、符号位置U+0000もまたU+FFFDで置き換わります。
16進数の数値的な文字参照は&#とXないしxのいずれかと1個から6個の16進数の数字の文字列と;からなります。 これらも照応するユニコード文字として構文解析されます(こちらでは10進数ではなく16進数の数値で指定されています)。
以下は実体でないものです。
  &x; &#; &#x;
�
&#abcdef0;
&ThisIsNotDefined; &hi?;
<p>&nbsp &x; &#; &#x;
&#87654321;
&#abcdef0;
&ThisIsNotDefined; &hi?;</p>
HTML5では(©のような)末尾のセミコロンのない実体参照を一部受け付けていますが、文法が曖昧すぎるものになるため、ここではこれらは認識されません。
HTML5の名前付きの実体の一覧にない文字列も実体参照として認識されません。
実体と数値的な文字参照は、URL、リンク題、有塀コードブロックの情報文字列を含めて、コード区域ないしコードブロックを除くあらゆる文脈で認識されます。
[foo](/föö "föö")
<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
[foo]
[foo]: /föö "föö"
<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
実体と数値的な文字参照はコード区域とコードブロックでは文字通りのテキストとして扱われます。
実体と数値的な文字参照はCommonMarkの文書における構造を示す記号の代わりとしては使えません。
文書はブロック――段落や、ブロック引用や、リストや、見出しや、区切り線や、コードブロックといった構造的な要素――の系列と見なせます。 ブロックの中には(ブロック引用やリスト項目のように)別のブロックを含むものもあります。 他の(見出しや段落といった)ものは行内の内容――テキストや、リンクや、強調されたテキストや、画像や、コード区域、その他諸々――を含みます。
ブロックの構造の標識は行内の構造の標識に常に優先します。 そのため、例えば、以下は2つの項目を持つリストであり、コード区域を含む1つの項目を持つリストではありません。
この意味するところは構文解析を2つの工程で進められるということです。 1番目で、文書のブロックの構造が見分けられます。 2番目で、段落、見出し、その他のブロックの構築要素の内側のテキストの行を行内の構造のために構文解析できます。 2番目の工程では1番目の工程が終わってからのみ使えるリンク参照定義についての情報が必要です。 なお1番目の工程では行を順番に処理することが要求されますが、あるブロック要素の行内の構文解析は他のどの要素の行内の構文解析にも影響しないため、2番目は並列化できます。
ブロックは2種類に分けることができ、入れ物ブロックという、別のブロックを含められるものと、葉ブロックという、含められないものがあります。
本節ではマークダウンの文書を形作る様々な種類の葉ブロックについて記述します。
省略可能な3つまでの字下げの空白に、3つ以上の相等しい-、_、*の文字の系列が後に続き、そのそれぞれの文字に省略可能な任意の数の空白ないしタブが後に続くものからなる行は、主題分割を形成します。
以下は間違った文字です。
以下は文字が足りません。
3つ以内の字下げは許容されます。
4文字分の空白の字下げは多過ぎます。
3文字より多く使っても構いません。
文字の間に、空白またはタブを書くことができます。
終端にある空白とタブは許容されます。
しかしながら、その他の文字はその行に現れてはなりません。
空白ないしタブ以外のすべての文字は同じであることが要求されます。 そのため、以下は主題分割ではありません。
主題分割の前後に空行は要りません。
主題分割は段落に割り込めます。
主題分割であるための上述の条件に合うダッシュの行がsetext見出しの下線としても解釈できるならば、setext見出しとしての解釈が優先します。 したがって、例えば、以下はsetext見出しであって、段落に主題分割が続いたものではありません。
主題分割とリスト項目の両方がとある行の取り得る解釈であるとき、主題分割が優先します。
リスト項目に主題分割を入れたいときは、別のリスト記号を使います。
ATX見出しは1文字以上の文字の文字列からなるものであって、その文字列は行内の内容として構文解析されるもので、またその文字列は1個から6個のエスケープされていない#の文字の開始の系列とエスケープされていない#の文字の任意の数の省略可能な閉止の系列の間にあるものです。 #の文字の開始の系列には空白ないしタブ、ないし行の終わりが続かなければなりません。 #の省略可能な閉止の系列には空白ないしタブが前に付いていなければならず空白ないしタブのみ後に続いていて構いません。 開始の#の文字には3つまで字下げの空白が前に付いていて構いません。 見出しの素の内容は行内の内容として構文解析される前に先頭と末尾の空白ないしタブが切り詰められます。 見出しの水準は開始の系列における#の文字の数に等しいです。
以下は単純な見出しです。
# foo
## foo
### foo
#### foo
##### foo
###### foo
<h1>foo</h1>
<h2>foo</h2>
<h3>foo</h3>
<h4>foo</h4>
<h5>foo</h5>
<h6>foo</h6>
7つ以上の#記号は見出しになりません。
少なくとも1つの空白ないしタブが#の文字と見出しの内容の間に要求されますが、見出しが空のときはその限りではありません。 なお多くの実装で現在は空白を要求していません。 しかしながら、空白は元来のATXの実装により要求されていたのであり、以下のようなものが見出しとして構文解析されることを防ぐのに役立ちます。
以下は見出しではありませんが、それは最初の#がエスケープされているからです。
内容は行内として解析されます。
先頭と末尾の空白ないしタブは行内の内容を構文解析する上で無視されます。
3つ以内の字下げは許容されます。
4文字分の空白の字下げは多過ぎます。
#の文字の閉止の系列は省略可能です。
開始の並びと同じ長さである必要はありません。
閉止の系列の後では空白ないしタブが許容されます。
#の文字の系列に空白ないしタブ以外の任意のものが続いたものは閉止の系列ではありませんが、見出しの内容の一部として見なされます。
閉止の系列には空白ないしタブが前に付かなければなりません。
バックスラッシュでエスケープされた#の文字は閉止の系列の一部と見なされません。
ATX見出しはそれを取り巻く内容から空行で別れている必要はなく、段落に割り込めます。
ATX見出しは空にできます。
setext見出しは1つ以上のテキストの行からなるものであって、空行に割り込れておらず、その最初の行には3つを越える字下げの空白がなく、setext見出しの下線が後に続きます。 この1つ以上のテキストの行というのは、もしsetext見出しの下線が後に続いていなかったとしたら、段落として解釈されていたであろうものでなければならず、コード塀、ATX見出し、ブロック引用、主題分割、リスト項目、HTMLブロックといったものに解釈できるものにはできません。
setext見出しの下線は=の文字の系列か-の文字の系列であって、3つを越えない字下げの空白があり任意の数の末尾の空白ないしタブがあります。
=の文字がsetext見出しの下線で使われるなら見出しは水準が1の見出しであり、-の文字が使われるならば水準が2の見出しです。 見出しの内容はその前に付いている1つ以上のテキストの行をCommonMarkの行内の内容として構文解析した結果です。
一般に、setext見出しには空行を前に付けたり後に続けたりする必要はありません。 しかしながら、段落に割り込むことはできないため、setext見出しが段落の後にくるときは、空行がそれらの間に必要です。
以下は単純な例です。
Foo *bar*
=========
Foo *bar*
---------
<h1>Foo <em>bar</em></h1>
<h2>Foo <em>bar</em></h2>
見出しの内容は1行を超えてわたっても構いません。
内容は見出しの素の内容を行内として構文解析した結果です。 見出しの素の内容はこの1つ以上の行を連結して先頭と末尾の空白ないしタブを除いたものから形成されます。
下線はどんな長さにもできます。
見出しの内容には3つまで字下げの空白を前に付けることができ、下線に揃える必要はありません。
4文字分の空白の字下げは多過ぎます。
setext見出しの下線には3つまで字下げの空白を前に付けることができ、末尾に空白ないしタブがあって構いません。
4文字分の空白の字下げは多過ぎます。
setext見出しの下線には内部に空白ないしタブを含められません。
内容の行にある末尾の空白ないしタブにより固い改行になることはありません。
終わりにバックスラッシュがあっても同じです。
ブロックの構造の標識が行内の構造の標識に優先するため、以下はsetext見出しです。
`Foo
----
`
<a title="a lot
---
of dashes"/>
<h2>`Foo</h2>
<p>`</p>
<h2><a title="a lot</h2>
<p>of dashes"/></p>
setext見出しの下線はリスト項目ないしブロック引用では不精な継続行になれません。
段落と後に続くsetext見出しの間には空行が必要ですが、これはさもなければ段落が見出しの内容の一部になるためです。
しかし一般にはsetext見出しの前後に空行は要求されません。
setext見出しは空にできません。
setext見出しの1行以上のテキストの行は段落以外のブロックの構築要素として解釈できるものであってはなりません。 そのため、以下の例におけるダッシュの行は主題分割として解釈されます。
> fooを文字通りのテキストとして持つ見出しにしたければ、バックスラッシュのエスケープが使えます。
互換性の補足: ほとんどの既存のマークダウンの実装ではsetext見出しのテキストが複数行にわたることを許容していません。 しかし次のものをどう解釈するかについての総意は何もありません。
Foo
bar
---
baz
4つの異なる解釈を取れます。
私達は解釈4が最も自然に感じており、解釈4では、複数行の見出しが許容されることにより、CommonMarkの表現力が増します。 解釈1にしたい執筆者は最初の段落の後に空行を置けます。
2つ目の解釈にしたい執筆者は主題分割の周りに空行を置けます。
あるいは次のように、setext見出しの下線として見なせない主題分割を使えます。
解釈3にしたい執筆者はバックスラッシュのエスケープを使えます。
字下げコードブロックは空行で別れた1つ以上の字下げされた塊からなります。 字下げされた塊は空でない行の系列であって、それぞれの行には4つ以上の字下げの空白が前に付きます。 コードブロックの内容はその行の文字通りの内容であって、末尾の行末を含み、4つの字下げの空白は差し引かれます。 字下げコードブロックには情報文字列はありません。
字下げコードブロックは段落に割り込めないため、段落とその後に続く字下げコードブロックの間に空行がなければなりません(コードブロックとその後に続く段落の間には、しかしながら、空行は必要ありません)。
字下げの解釈にコードブロックとするものとその構成物がリスト項目に属することを示すものとの間で曖昧さがあるならば、リスト項目の解釈が優先します。
コードブロックの内容は文字通りのテキストであり、マークダウンとして構文解析されません。
以下は空行で分かれた3つの塊です。
4つの字下げの空白を越えるあらゆる先頭の空白ないしタブはその内容に含まれることになり、空行内でもそうです。
字下げコードブロックは段落に割り込めません(これによりぶら下がりの字下げなどが許容されます)。
しかしながら、4つより少ない字下げの空白を持つあらゆる空でない行によりコードブロックは直ちに終わります。 そのため段落は字下げされたコードの直後に現れて構いません。
また字下げされたコードはその他の種類のブロックの直前と直後に出現させられます。
# Heading
foo
Heading
------
foo
----
<h1>Heading</h1>
<pre><code>foo
</code></pre>
<h2>Heading</h2>
<pre><code>foo
</code></pre>
<hr />
最初の行の前には、字下げの空白が4つ以上あっても構いません。
字下げコードブロックの前に付いたり後に続いたりする空行はそのブロックに含まれません。
末尾の空白ないしタブは、コードブロックの内容に含まれます。
コード塀とは少なくとも3つの連続する抑音符の文字 (`) ないしチルダ (~) の系列です(チルダと抑音符は混ぜられません)。 有塀コードブロックはコード塀で始まり、3つまでの字下げの空白が前に付きます。
開始のコード塀のある行にはコード塀の後に続けて省略可能な何らかのテキストを含めても構いません。 このテキストは先頭と末尾の空白ないしタブが切り詰められて情報文字列と呼ばれます。 情報文字列が抑音符の塀の後に来るなら、抑音符の文字を一切含んではなりません(この制限のある理由はさもなければ行内コードが誤って有塀コードブロックの開始として解釈されるものがあるだろうからです)。
コードブロックの内容はすべての後続する行からなり、コードブロックが始まったものと同じ種類の(抑音符かチルダの)閉止のコード塀までであって、そのコード塀には少なくとも開始のコード塀と同じだけの抑音符ないしチルダがあります。 先頭のコード塀にN個の字下げの空白が前に付いているならば、内容の各行からN個までの字下げの空白が(あるなら)除かれます(内容の行が字下げされていなければ、変わらないまま保持されます。 N個の空白より少なく字下げされていれば、すべての字下げが除かれます)。
閉止のコード塀には3つまで字下げの空白が前に付いていて構わず、また空白ないしタブのみ後に続いていて構いませんが、これは無視されます。 これを含むブロック(または文書)の終わりに達して閉止のコード塀が見当たらなかったなら、コードブロックには開始のコード塀の後からこれを含むブロック(または文書)の終わりまでのすべての行が含まれます(代わる仕様として閉止のコード塀が見当たらない事象があったときに後戻りの解析を要求することもあったでしょう。 しかしこれでは構文解析がずっと効率的でなくなり、またここで記述されている挙動についての実際の欠陥はないように思われます)。
有塀コードブロックは段落に割り込んで構いませんし、前後のいずれにも空行を要求しません。
コード塀の内容は文字通りのテキストとして扱われ、行内として構文解析されません。 情報文字列の最初の単語は通例としてコードの見本の言語を指定するために使われており、codeタグのclass属性に呈示されます。 しかしながら、本仕様では情報文字列の特定の扱いを何ら義務付けません。
以下は抑音符を伴う単純な例です。
以下ではチルダが使われています。
3つより少ない抑音符は不充分です。
閉止のコード塀では開始の塀と同じ文字を使わなければなりません。
閉止のコード塀は、開始の塀と少なくとも同じ長さでなければなりません。
閉じられていないコードブロックは文書の終わり(またはそれを取り囲むブロック引用またはリスト項目)で閉じられます。
コードブロックの内容は、すべて空行でも構いません。
コードブロックは空でも構いません。
塀は字下げできます。 開始の塀が字下げされているなら、内容の行にそれと等しい開始の字下げがもしあるなら除かれます。
4文字分の空白の字下げは多過ぎます。
閉止の塀には3つまでの字下げの空白が前に付いていて構いませんし、その字下げは開始の塀のそれと合致する必要はありません。
以下は閉止の塀ではありませんが、それは4つの空白で字下げされているからです。
(開始及び閉止の)コード塀には、その中に空白ないしタブを含められません。
有塀コードブロックは段落に割り込むことができ、間に空行なく、段落を直接後に続けられます。
その他のブロックについても空行を差し挟むことなく有塀コードブロックの前後に出現させられます。
情報文字列は開始のコード塀の後に与えることができます。 本仕様では情報文字列の特定の扱いを義務付けはしませんが、最初の単語は通例ではコードブロックの言語を指定するために使われます。 HTMLの出力では、言語は普通code要素に対してlanguage-に言語の名前を後に続けたものからなるクラスを加えることで示されます。
```ruby
def foo(x)
return 3
end
```
<pre><code class="language-ruby">def foo(x)
return 3
end
</code></pre>
~~~~ ruby startline=3 $%@#$
def foo(x)
return 3
end
~~~~~~~
<pre><code class="language-ruby">def foo(x)
return 3
end
</code></pre>
抑音符のコードブロックのための情報文字列には抑音符を含められません。
チルダのコードブロックのための情報文字列には抑音符とチルダを含められます。
閉止のコード塀には情報文字列を持たせられません。
HTMLブロックとは素のHTMLとして扱われる(そしてHTMLの出力ではエスケープされない)行の集まりです。
7種類のHTMLブロックがあり、その開始と終了の条件で定義できます。 このブロックは(3つまで省略可能な字下げの空白があった後に)開始条件に合う行で始まります。 合致する終了条件に合う最初の後続する行、またはもし終了条件に合う行に遭遇しなければ、文書の最後の行、または現在のHTMLブロックを含む入れ物ブロックの最後の行で終わります。 最初の行が開始条件と終了条件の両方に合うなら、ブロックはその行だけを含みます。
開始条件: 行が文字列<pre、<script、<style、<textarea(大文字と小文字の区別なし)で始まり、空白文字、タブ文字、文字列>、ないし行の終わりが後に続くとき。
終了条件: 行に終了のタグ</pre>、</script>、</style>、</textarea>(大文字と小文字の区別なし。 開始のタグと合致する必要はありません)を含むとき。
開始条件: 行が文字列<!--で始まるとき。
終了条件: 行に文字列-->が含まれるとき。
開始条件: 行が文字列<?で始まるとき。
終了条件: 行に文字列?>が含まれるとき。
開始条件: 行がアスキー文字の後に続く文字列<!で始まるとき。
終了条件: 行に文字>が含まれるとき。
開始条件: 行が文字列<![CDATA[で始まるとき。
終了条件: 行に文字列]]>が含まれるとき。
開始条件: 行が文字列<ないし</の後に続いて(大文字と小文字を区別しない)文字列address、article、aside、base、basefont、blockquote、body、caption、center、col、colgroup、dd、details、dialog、dir、div、dl、dt、fieldset、figcaption、figure、footer、form、frame、frameset、h1、h2、h3、h4、h5、h6、head、header、hr、html、iframe、legend、li、link、main、menu、menuitem、nav、noframes、ol、optgroup、option、p、param、search、section、summary、table、tbody、td、tfoot、th、thead、title、tr、track、ulのいずれかがあり、空白文字、タブ文字、行の終わり、文字列>、ないし文字列/>が後に続くもので始まるとき。
終了条件: 行に空行が後に続くとき。
開始条件: 行が完全な(pre、script、style、textarea以外の任意のタグ名の)開始タグないし完全な閉止タグで始まり、すべてが単一の行にあって、ゼロ以上の空白文字ないしタブ文字が後に続き、行の終わりが後に続くとき。
終了条件: 行に空行が後に続くとき。
HTMLブロックは適切な終了条件で閉じられるか、文書ないし他の入れ物ブロックの最後の行まで続きます。 つまり HTMLブロックの範囲内にある 任意のHTMLであってさもなければ開始条件として認識されていたかもしれないものは構文解析器により無視されてそのまま素通りされ、構文解析器の状態を変えることはありません。
例えば、<table>で始まるHTMLブロックの範囲内にある<pre>は構文解析器の状態に影響しませんが、それはそのHTMLブロックが開始条件6において始まったためであって、任意の空行で終わります。 以下には驚かれるかもしれません。
<table><tr><td>
<pre>
**Hello**,
_world_.
</pre>
</td></tr></table>
<table><tr><td>
<pre>
**Hello**,
<p><em>world</em>.
</pre></p>
</td></tr></table>
この事例では、HTMLブロックは空行で終端し――**Hello**というテキストは書いたままに残り――通常の構文解析が再開されるときは、この段落があり、worldが強調されて行内とブロックのHTMLが後に続きます。
種別7を除くHTMLブロックのすべての種別は段落に割り込んで構いません。 種別7のブロックは段落に割り込めません(この制限は折り返された段落内の長いタグをHTMLブロックの開始とする望まない解釈を防止することを意図しています)。
以降は単純な数例です。 以下は種別6の基礎的なHTMLブロックです。
<table>
<tr>
<td>
hi
</td>
</tr>
</table>
okay.
<table>
<tr>
<td>
hi
</td>
</tr>
</table>
<p>okay.</p>
ブロックは終止タグから始めることもできます。
これは、2つのHTMLブロックと、それらに挟まれたマークダウンの段落です。
空白があるであろうところで分かれている限り、最初の行は部分的にできます。
開始タグは閉じる必要はありません。
部分的なタグは完全であることさえ必要ありません(悪因悪果)。
それらしく始まっている限り、先頭のタグは適正なタグである必要さえありません。
種別6のブロックでは、先頭のタグはそれ自体で行をなす必要はありません。
次の空行ないし文書の終わりまでのすべてはHTMLブロックに含まれます。 そのため、後に続く例では、マークダウンのコードブロックやブロック引用のように見えるものは実はHTMLブロックの一部であって、空行ないし文書の終わりに達するまで続きます。
(6) のブロック水準のタグの一覧に ない タグによるHTMLブロックを始めるためには、最初の行にそのタグのみを置かなければなりません(また完全でなければなりません)。
種別7のブロックでは、タグ名はどんなものにもできます。
これらの規則はブロックの水準ないし行内の水準のいずれのタグとしても機能できるタグを扱うことを許容するべく設計されています。 <del>タグが好例です。 内容を<del>タグで3つの異なる方法により取り巻けます。 以下の事例では、素のHTMLブロックになりますが、それは<del>タグがそれ自体で行をなすからです。
以下の事例では、<del>タグを含むだけの素のHTMLブロックになります(なぜなら後に続く空行で終わっているため)。 そのため内容はCommonMarkとして解釈されます。
最後に、以下の事例では、<del>タグはCommonMarkの段落 内の 素のHTMLとして解釈されます(タグはそれ自体で行をなしていないため、HTMLブロックではなくて行内HTMLが得られます)。
文字通りの内容(pre、script、style、textarea)を含めることを意図しているHTMLタグ、コメント、処理命令、宣言は少し違った風に扱われます。 最初の空行で終わる代わりに、これらのブロックは照応する終了タグを含む最初の行で終わります。 結果として、以下のブロックには空行を含められます。
preタグ(種別1)は次の通り。
<pre language="haskell"><code>
import Text.HTML.TagSoup
main :: IO ()
main = print $ parseTags tags
</code></pre>
okay
<pre language="haskell"><code>
import Text.HTML.TagSoup
main :: IO ()
main = print $ parseTags tags
</code></pre>
<p>okay</p>
scriptタグ(種別1)は次の通り。
<script type="text/javascript">
// JavaScript example
document.getElementById("demo").innerHTML = "Hello JavaScript!";
</script>
okay
<script type="text/javascript">
// JavaScript example
document.getElementById("demo").innerHTML = "Hello JavaScript!";
</script>
<p>okay</p>
textareaタグ(種別1)
styleタグ(種別1)は次の通り。
<style
type="text/css">
h1 {color:red;}
p {color:blue;}
</style>
okay
<style
type="text/css">
h1 {color:red;}
p {color:blue;}
</style>
<p>okay</p>
合致する終了タグがないなら、ブロックは文書(または取り囲むブロック引用ないしリスト項目)の終わりで終わります。
終了タグは開始タグと同じ行に出現させられます。
なお最後の行にある終了タグの後の一切はHTMLブロックに含まれます。
コメント(種別2)は次の通り。
処理命令(種別3)は次の通り。
宣言(種別4)は次の通り。
CDATA(種別5)は次の通り。
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then {
return 1;
} else {
return 0;
}
}
]]>
okay
<![CDATA[
function matchwo(a,b)
{
if (a < b && a < 0) then {
return 1;
} else {
return 0;
}
}
]]>
<p>okay</p>
開始のタグには3つまで字下げの空白を前に付けられますが、4つはいけません。
種別1から6のHTMLブロックは段落に割り込むことができ、空行を前に付ける必要はありません。
しかしながら、文書の終わりを除き、また前述した種別1から5のブロックを除き、後に続く空行は必要です。
種別7のHTMLブロックは段落に割り込めません。
この規則はJohn Gruber氏の元来のマークダウンの構文の仕様とは違っており、そちらでは次のように書かれています。
唯一の制限はブロック水準のHTML要素――例えば
<div>、<table>、<pre>、<p>など――はそれを取り巻く内容から空行で別れていなければならず、ブロックの始めと終わりのタグは空白ないしタブで字下げされているべきではないということです。
いくつかの点でGruber氏の規則はここで与えるものより制限的です。
(Gruber氏自身のものを含む)ほとんどのマークダウンの実装ではこれらの制限のすべては重んじられていません。
しかしながら、一点、Gruber氏の規則がここで与えているものより自由なところがあり、それはHTMLブロック内に空行が現れることを許容しているためです。 ここでそれを許容しないことには2つ理由があります。 1つ目に、釣り合いの取れたタグを構文解析する必要を除くことであり、こうした解析は高くつくものであって合致する終了タグが見当たらなければ文書の終わりから後戻りでの解析が要求されかねません。 2つ目に、マークダウンの内容をHTMLタグ内に含めるとても単純で柔軟な方法が供されます。 単にマークダウンとHTMLを空行を使って分けるのです。
比較は次の通り。
マークダウンの実装には開始タグに属性markdown=1があるならタグ内の内容をテキストとして解釈する慣習を取り入れているものもあります。 上述で与えた規則の方が同じ表現力を達成するより単純でより簡潔な方法であって、構文解析がずっと単純でもあると思われます。
主たる潜在的な欠点はもはやHTMLブロックをマークダウン文書に100%の信頼性をもって貼り付けられないということです。 しかしながら、 ほとんどの事例においては これでうまくいきます、というのもHTMLにおける空行には通常HTMLブロックのタグが後に続くからです。 例えば以下の通りです。
しかしながら、問題はあって、内側のタグが字下げされており かつ 空白で別れているならば、字下げされたコードブロックとして解釈されるためです。
<table>
<tr>
<td>
Hi
</td>
</tr>
</table>
<table>
<tr>
<pre><code><td>
Hi
</td>
</code></pre>
</tr>
</table>
幸いにも、空行は通常必須ではなく削除できます。 例外は<pre>タグ内にあるときですが、上で記述した通り、<pre>で始まる素のHTMLブロックには空行を含めることが 可能 です。
リンク参照定義は、省略可能な3つまでの字下げの空白が前に付いたリンクラベルに、コロン (:) と、省略可能な(1つまでの行末を含む)空白ないしタブと、リンク先と、省略可能な(1つまでの行末を含む)空白ないしタブと、省略可能なリンク題とが後に続いたものからなり、題があるならリンク先から空白ないしタブで別れていなければなりません。 これ以上の文字が現れてはなりません。
リンク参照定義は文書の構造的な要素に照応しません。 代わりに、文書のどこの参照リンクや参照風の画像においても使えるラベルを定義します。 リンク参照定義はそれを使うリンクの前後のどちらにも来ることができます。
[Foo*bar\]]:my_(url) 'title (with parens)'
[Foo*bar\]]
<p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
[Foo bar]:
<my url>
'title'
[Foo bar]
<p><a href="my%20url" title="title">Foo bar</a></p>
題は複数行にわたっても構いません。
[foo]: /url '
title
line1
line2
'
[foo]
<p><a href="/url" title="
title
line1
line2
">foo</a></p>
しかしながら、空行は含んではなりません。
[foo]: /url 'title
with blank line'
[foo]
<p>[foo]: /url 'title</p>
<p>with blank line'</p>
<p>[foo]</p>
題は省いて構いません。
リンク先は省いてはなりません。
しかしながら、山括弧を使って空のリンク先を指定して構いません。
題はリンク先から1つ以上の空白ないしタブで別れていなければなりません。
題と宛先の両方にバックスラッシュのエスケープと文字通りのバックスラッシュを含められます。
[foo]: /url\bar\*baz "foo\"bar\baz"
[foo]
<p><a href="/url%5Cbar*baz" title="foo"bar\baz">foo</a></p>
リンクはそれに照応する定義の前に来ることができます。
複数の合致する定義があるなら、最初のものが優先します。
リンクの節で註記する通り、ラベルの合致では大文字と小文字を区別しません(合致を参照)。
何かがリンク参照定義かどうかはそれにより定義されるリンク参照が文書で使われているかどうかとは独立です。 したがって、例えば、以下の文書にはリンク参照定義だけが含まれており、可視の内容はありません。
以下は別のものです。
以下はリンク参照定義ではありませんが、それは題の後に空白ないしタブ以外の文字があるからです。
以下はリンク参照定義ですが、題がありません。
以下はリンク参照定義ではありませんが、それは4つの空白で字下げされているからです。
[foo]: /url "title"
[foo]
<pre><code>[foo]: /url "title"
</code></pre>
<p>[foo]</p>
以下はリンク参照定義ではありませんが、それはコードブロック内で現れているからです。
リンク参照定義は段落に割り込めません。
しかしながら、見出しや主題分割といった、他のブロック要素の直後に続けることができ、空行が後に続く必要はありません。
# [Foo]
[foo]: /url
> bar
<h1><a href="/url">Foo</a></h1>
<blockquote>
<p>bar</p>
</blockquote>
複数のリンク参照定義は、空行を挟むことなしに、次々に出現させられます。
[foo]: /foo-url "foo"
[bar]: /bar-url
"bar"
[baz]: /baz-url
[foo],
[bar],
[baz]
<p><a href="/foo-url" title="foo">foo</a>,
<a href="/bar-url" title="bar">bar</a>,
<a href="/baz-url">baz</a></p>
リンク参照定義は、リストやブロック引用といった、ブロックの入れ物内に出現させられます。 こうした定義は文書全体に影響し、これらが定義されている入れ物に留まりません。
他の種類のブロックとして解釈できない空でない行の系列は段落を形成します。 段落の内容は段落の素の内容を行内として構文解析した結果です。 段落の素の内容はその1つ以上の行を連結して先頭と末尾の空白ないしタブを除くことで形成されます。
2つの段落を持つ簡単な例を示します。
段落は複数行にわたって書けますが、空白行は入れられません。
段落の間の複数の空行には、効果がありません。
先頭の空白ないしタブは、飛ばされます。
最初の後の行はどれだけ字下げしても構いませんが、これはコードブロックが段落に割り込めないためです。
しかしながら、最初の行には3つまで字下げの空白が前に付いていて構いません。 4つの字下げの空白は多過ぎます。
最後の空白ないしタブは行内の構文解析の前に切り詰められるため、2つ以上の空白で終わる段落は固い改行で終わることはありません。
ブロック水準の要素の間の空行は、リストが窮屈かゆるやかかを判定するときに担う役割を除いて、無視されます。
文書の最初と最後の空白行は無視されます。
入れ物ブロックは他のブロックを内容として持つブロックです。 入れ物ブロックは2つに大別され、ブロック引用とリスト項目です。 リストはリスト項目のためのさらなる入れ物です。
ここでは入れ物ブロックのための構文を再帰的に定義します。 その定義の一般的な形式は次の通り。
Xがブロックの系列ならば、Xをしかじかの方法で変換した結果はこれらのブロックを内容として持つ種別Yの入れ物です。
そのため、ここでは何をもってブロック引用やリスト項目とするかをこれらがどのようにその内容から 生成 できるのかを説明することによって説明します。 これで構文を定義するには事足りるでしょうが、これらの構築物を 構文解析 する一通りの手順は与えていません(一通りの手順は後述する構文解析の戦略と題した節で供されます)。
ブロック引用の印には、省略可能な3つまで字下げの空白が前に付き、(a) 文字>と共にその後に続く字下げの空白があるもの、ないし (b) 単一の文字>で字下げの空白が後に続かないものからなります。
以下の規則によりブロック引用が定義されます。
基礎的な場合。 1つ以上の行の文字列 Ls が1つ以上のブロックの系列 Bs を構成するならば、 Ls の各行の始めにブロック引用の印を前に付けた結果は Bs を含むブロック引用です。
不精性。 1つ以上の行の文字列 Ls が内容 Bs を持つブロック引用を構成するならば、先頭のブロック引用の印をその行のブロック引用の印の後の空白文字やタブ文字以外の次の文字が段落継続テキストである1つ以上の行から削除した結果は Bs を内容として持つブロック引用です。 段落継続テキストは段落の内容の一部として構文解析されることになるテキストですが、段落の始めに現れないものです。
他には何も、ブロック引用として見なされません。
以下は単純な例です。
>の文字の後の空白ないしタブは省けます。
>の文字には3つまで字下げの空白を前に付けられます。
4文字分の空白の字下げは多過ぎます。
不精性の条項により段落継続テキストの前の>を省くことが許容されます。
ブロック引用には一部が不精で一部は不精でない継続行を含められます。
不精性はブロック引用の印が前に付いていたとしたら段落の継続であったであろう行のみに適用されます。 例えば、>は以下の2つ目の行で省けませんが……
> foo
> ---
……省くと意味が変わります。
同様に、2行目の> を省くと……
> - foo
> - bar
……ブロック引用は1行目の後で終わります。
> - foo
- bar
<blockquote>
<ul>
<li>foo</li>
</ul>
</blockquote>
<ul>
<li>bar</li>
</ul>
同じ理由から、字下げないし有塀のコードブロックの後続する行の前からは> を省けません。
> foo
bar
<blockquote>
<pre><code>foo
</code></pre>
</blockquote>
<pre><code>bar
</code></pre>
> ```
foo
```
<blockquote>
<pre><code></code></pre>
</blockquote>
<p>foo</p>
<pre><code></code></pre>
なお以下の事例においては、不精な継続行になります。
その理由については、以下に注目してください。
> foo
> - bar
- barはリストを始めるには深く字下げされすぎており、字下げコードブロックは段落に割り込めないために字下げコードブロックにできないため、段落継続テキストなのです。
ブロック引用は空にできます。
ブロック引用には先頭や最後に空行があっても構いません。
空行があると、必ずブロック引用が離されます。
(ほとんどの現在のマークダウンの実装では、John Gruber氏の元来のMarkdown.plを含めて、この例を2つの段落を持つ単一のブロック引用として構文解析するでしょう。 しかし執筆者が2つのブロック引用にしたいか1つにしたいか決めることを許容する方がよいように思われます)
連続性の意味するところは以下のブロック引用を一緒に置くなら、単一のブロック引用になるということです。
2つの段落を持つブロック引用にするには、以下を使います。
ブロック引用は段落に割り込めます。
一般に、ブロック引用の前後に空行は必要ありません。
> aaa
***
> bbb
<blockquote>
<p>aaa</p>
</blockquote>
<hr />
<blockquote>
<p>bbb</p>
</blockquote>
しかしながら、不精性のために、ブロック引用とその後に続く段落の間には空行が必要です。
不精性の帰結として任意の数の先頭の>は入れ子のブロック引用の継続行では省いて構いません。
> > > foo
bar
<blockquote>
<blockquote>
<blockquote>
<p>foo
bar</p>
</blockquote>
</blockquote>
</blockquote>
>>> foo
> bar
>>baz
<blockquote>
<blockquote>
<blockquote>
<p>foo
bar
baz</p>
</blockquote>
</blockquote>
</blockquote>
字下げコードブロックをブロック引用に含めるときは、ブロック引用の印に>とその後に続く字下げの空白の両方が含まれることを覚えておいてください。 そのため>の後に 5つの空白 が必要です。
> code
> not code
<blockquote>
<pre><code>code
</code></pre>
</blockquote>
<blockquote>
<p>not code</p>
</blockquote>
中黒リストの印は-、+、ないし*の文字です。
順序付きリストの印は1個から9個までのアラビア数字 (0-9) の系列であって、.の文字ないし)の文字のいずれかが後に続きます(長さの制限がある理由は10桁の数字だと一部のブラウザで整数の桁溢れが見られだすためです)。
以下の規則によりリスト項目が定義されます。
基礎的な場合。 1つ以上の行の系列 Ls が空白ないしタブ以外の文字から始まるブロックの系列 Bs を構成し、 M が幅 W のリストの印に1 ≤ N ≤ 4個の字下げの空白が後に続いたものであるならば、 Ls の最初の行に M とその後に続く空白を前に付け、 Ls の後続する行を W + N 個の空白で字下げした結果は、 Bs を内容として持つリスト項目です。 リスト項目の種別(中黒ないし順序付き)はそのリストの印の種別により決まります。 リスト項目が順序付きであるならば、順序付きリストの印に基づいて、開始番号も割り当てられます。
例外は次の通り。
例えば、 Ls が以下の行だとします。
A paragraph
with two lines.
indented code
> A block quote.
<p>A paragraph
with two lines.</p>
<pre><code>indented code
</code></pre>
<blockquote>
<p>A block quote.</p>
</blockquote>
そして M を印の1.に、また N = 2とします。 すると規則1番目によれば以下は開始番号が1の順序付きリスト項目であり、 Ls と同じ内容です。
1. A paragraph
with two lines.
indented code
> A block quote.
<ol>
<li>
<p>A paragraph
with two lines.</p>
<pre><code>indented code
</code></pre>
<blockquote>
<p>A block quote.</p>
</blockquote>
</li>
</ol>
最も注意すべき重要なことはリストの印の後のテキストの位置がリスト項目の中の後続するブロックでどれだけ字下げが必要かを決めるということです。 リストの印が2つの字下げの空白ぶんを占めており、リストの印と空白ないしタブ以外の次の文字の間に3つの空白があるならば、リスト項目のもとに収まるにはブロックは5つの空白で字下げされていなければなりません。
以下はリスト項目のもとに置くためにどれだけ深く字下げしなければならないかを示す例です。
これはつい列の見方で考えたくなります。 つまり継続するブロックはリストの印の後の空白ないしタブ以外の最初の文字の列だけはせめて字下げされなくてはならないということです。 しかしながら、それはあまり正しくありません。 リストの印の後の字下げの空白はどれだけ相対的な字下げが必要かを決めます。 どの列でこの字下げが達するかは、以下の例で示されるように、どれだけリスト項目が他の構築物の中に埋め込まれているかによります。
> > 1. one
>>
>> two
<blockquote>
<blockquote>
<ol>
<li>
<p>one</p>
<p>two</p>
</li>
</ol>
</blockquote>
</blockquote>
ここでtwoがリストの印1.と同じ列に現れていますが、最後に含んでいるブロック引用の印の後に充分な字下げがあるため、実はリスト項目に含まれます。
逆もまたありえます。 以下の例では、単語twoはリスト項目の最初のテキストである、oneの右より奥に現れていますが、ブロック引用の印を過ぎてから充分に奥まで字下げされていないため、リスト項目の一部とは見なされません。
>>- one
>>
> > two
<blockquote>
<blockquote>
<ul>
<li>one</li>
</ul>
<p>two</p>
</blockquote>
</blockquote>
なおリストの印とその後に続く何らかの内容の間には少なくとも1つの空白ないしタブが必要であるため、以下はリスト項目ではありません。
リスト項目には1つ以上の空行で別れているブロックが含まれていても構いません。
リスト項目には、どんな種類のブロックが含まれていても構いません。
1. foo
```
bar
```
baz
> bam
<ol>
<li>
<p>foo</p>
<pre><code>bar
</code></pre>
<p>baz</p>
<blockquote>
<p>bam</p>
</blockquote>
</li>
</ol>
字下げコードブロックを含むリスト項目ではコードブロックの範囲内の空の行は書いたままに保持されます。
なお、順序付きリストの開始番号は、9桁以下でなければなりません。
開始番号は0で始めても構いません。
開始番号は負であってはなりません。
字下げコードブロックにはテキストがリスト項目に含まれる領域の端を越えて4つの字下げの空白が前に付かなければなりません。 以下の事例では6つの空白です。
また、以下の事例では11個の空白です。
リスト項目の 最初の ブロックが字下げコードブロックであるならば、規則2番目により、内容にはリストの印の後に 1つの 字下げの空白が前に付いていなければなりません。
indented code
paragraph
more code
<pre><code>indented code
</code></pre>
<p>paragraph</p>
<pre><code>more code
</code></pre>
1. indented code
paragraph
more code
<ol>
<li>
<pre><code>indented code
</code></pre>
<p>paragraph</p>
<pre><code>more code
</code></pre>
</li>
</ol>
なお余剰の字下げの空白はコードブロック内の空白として解釈されます。
1. indented code
paragraph
more code
<ol>
<li>
<pre><code> indented code
</code></pre>
<p>paragraph</p>
<pre><code>more code
</code></pre>
</li>
</ol>
なお規則1番目と2番目は2つの場合、すなわち (a) リスト項目に含まれる1つ以上の行が空白ないしタブ以外の文字で始まる場合と、(b) 字下げコードブロックで始まる場合にのみ適用されます。 以下のような事例においては、1つ目のブロックは3つの字下げの空白で始まっており、規則では全体を字下げしてリストの印を前に付けることでリスト項目を形成することが許容されません。
これは著しい制限ではありませんが、それはブロックに3つまでの字下げの空白が前に付いているとき、規則1番目を適用することが許容されるように、字下げはいつでも解釈を変えずに除けるからです。 そのため、上の事例については次の通り。
以下は、空行で始まるものの、空ではないリスト項目です。
-
foo
-
```
bar
```
-
baz
<ul>
<li>foo</li>
<li>
<pre><code>bar
</code></pre>
</li>
<li>
<pre><code>baz
</code></pre>
</li>
</ul>
リスト項目が空行で始まるとき、リストの印の後に続く空白の数により要求される字下げは変わりません。
リスト項目は1つまでの空行で始められます。 以下の例では、fooはリスト項目の一部ではありません。
以下は空の中黒リスト項目です。
リストの印の後に続く空白ないしタブがあるかどうかは重要ではありません。
以下は空の順序付きリスト項目です。
リストは、空のリスト項目で始まったり終わったりしても構いません。
しかしながら、空のリスト項目は段落に割り込めません。
1つの空白で字下げした事例は次の通り。
1. A paragraph
with two lines.
indented code
> A block quote.
<ol>
<li>
<p>A paragraph
with two lines.</p>
<pre><code>indented code
</code></pre>
<blockquote>
<p>A block quote.</p>
</blockquote>
</li>
</ol>
2つの空白で字下げした事例は次の通り。
1. A paragraph
with two lines.
indented code
> A block quote.
<ol>
<li>
<p>A paragraph
with two lines.</p>
<pre><code>indented code
</code></pre>
<blockquote>
<p>A block quote.</p>
</blockquote>
</li>
</ol>
3つの空白で字下げした事例は次の通り。
1. A paragraph
with two lines.
indented code
> A block quote.
<ol>
<li>
<p>A paragraph
with two lines.</p>
<pre><code>indented code
</code></pre>
<blockquote>
<p>A block quote.</p>
</blockquote>
</li>
</ol>
4つの空白の字下げでは、コードブロックになります。
1. A paragraph
with two lines.
indented code
> A block quote.
<pre><code>1. A paragraph
with two lines.
indented code
> A block quote.
</code></pre>
以下は不精な継続行のある例です。
1. A paragraph
with two lines.
indented code
> A block quote.
<ol>
<li>
<p>A paragraph
with two lines.</p>
<pre><code>indented code
</code></pre>
<blockquote>
<p>A block quote.</p>
</blockquote>
</li>
</ol>
字下げは部分的に削除できます。
以下の例では、入れ子の構造で不精性がどう働くかを示したものです。
> 1. > Blockquote
continued here.
<blockquote>
<ol>
<li>
<blockquote>
<p>Blockquote
continued here.</p>
</blockquote>
</li>
</ol>
</blockquote>
> 1. > Blockquote
> continued here.
<blockquote>
<ol>
<li>
<blockquote>
<p>Blockquote
continued here.</p>
</blockquote>
</li>
</ol>
</blockquote>
副リストの規則は上述の一般則に従います。 副リストは段落がリスト項目に含まれるために必要とされるであろう数と同じ字下げの空白で字下げされていなければなりません。
そのため、以下の事例では2つの空白の字下げが必要です。
- foo
- bar
- baz
- boo
<ul>
<li>foo
<ul>
<li>bar
<ul>
<li>baz
<ul>
<li>boo</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
1つでは足りません。
以下では4つ必要です。 なぜならリストの印の幅が広いからです。
3つでは足りません。
リストはリスト項目中の最初のブロックでも構いません。
1. - 2. foo
<ol>
<li>
<ul>
<li>
<ol start="2">
<li>foo</li>
</ol>
</li>
</ul>
</li>
</ol>
リスト項目には見出しを含められます。
John Gruber氏のマークダウンの仕様では、リスト項目について以下が記されています。
「リストの印は通例として左端で始まりますが、3つまでの空白で字下げされていて構いません。 リストの印には1つ以上の空白ないしタブが後に続いていなければなりません」
「リストの見栄えを良くするため、項目をぶら下がる字下げで折り返せます……しかしそうしたくなければ、しなくていいです」
「リスト項目は複数の段落からなっていて構いません。 リスト項目の後続する各段落は4つ以上の空白ないしタブのいずれかで字下げされていなければなりません」
「後続する段落のすべての行を字下げすれば見栄えが良いのですが、ここでもまた、マークダウンでは不精であることが許容されます」
「リスト項目の範囲内にブロック引用を置くには、ブロック引用の>の区切りは字下げされている必要があります」
「リスト項目の範囲内にコードブロックを置くには、コードブロックは2倍――8つの空白ないし2つのタブで――字下げされている必要があります」
これらの規則ではリスト項目のもとにある段落は4つの空白で字下げされていなければならず(察するに、左端からであって、リストの印の始めからではないと思われますが、述べられていません)、リスト項目のもとにあるコードは通常の4つの代わりに8つの空白で字下げされていなければならないと規定されています。 ブロック引用が字下げされていなければならないとも述べていますが、どれだけかについてはなく、しかしながら、与えられた例には4つの空白の字下げがあります。 他の種類のブロック水準の内容については何も述べられていないものの、リスト項目のもとにある すべての ブロック要素は、別のリストを含めて、4つの空白で字下げされていなければならないと推定するのがきっと理に適っています。 この原理は 4つの空白の規則 と呼ばれてきました。
4つの空白の規則は明快で原理的であって、参照実装であるMarkdown.plがそれに従っていれば、おそらく標準になっていたことでしょう。 しかしながら、Markdown.plでは段落と副リストが、少なくとも外側の水準においては、たった2つの字下げの空白で始まることが許容されています。 さらに悪いことに、その挙動は一貫性がありませんでした。 つまり外側の水準のリストには2つの空白の字下げが必要ですが、この副リストの副リストには3つの空白が必要でした。 そうなると、様々なマークダウンの実装でリスト項目のもとに何が来るのかを決めるための非常に様々な規則が開発されてきたということは、驚くことではありません(例えば、Pandocとpython-Markdownでは、Gruber氏の構文の説明と4つの空白の規則に忠実である一方で、discount、redcarpet、marked、PHP Markdown、またその他ではMarkdown.plの挙動により近づけた形で従っています)。
残念ながら、実装間の乖離からすると、あらゆる既存の文書が崩れないことを保証するリスト項目のための仕様を与える方法はありません。 しかしながら、ここで与えた仕様は4つの空白の規則ないしより寛容なMarkdown.plの挙動のどちらで書式化されたリストでも、人間が読む上で自然なやり方で配置されているとするなら、正しく扱うことでしょう。
ここでの戦略は、固定であったり独断による数があるのではなく、リストの印の幅と字下げによりリスト項目のもとにブロックを収めるために必要な字下げが決まるというものです。 書き手はリスト項目の本文をリスト項目の印(とリストの印に対する何らかの字下げ)に合わせるのに足るだけ右に字下げされた単位として考えることができます(不精性の規則である、5番目により、そこから必要であれば継続する行を字下げしないようにすることが許容されます)。
ここでの規則は、主張となりますが、端からの固定の字下げの水準を要求するあらゆる規則に勝ります。 4つの空白の規則は明快ですが不自然です。 かなり非直感的なものとして……
- foo
bar
- baz
……は段落が挟まっている2つのリストとして構文解析され……
<ul>
<li>foo</li>
</ul>
<p>bar</p>
<ul>
<li>baz</li>
</ul>
……になりますが、これは4つの空白の規則が要求するためで、次の単一のリストにはならないのです。
<ul>
<li>
<p>foo</p>
<p>bar</p>
<ul>
<li>baz</li>
</ul>
</li>
</ul>
4つの空白の選択は独断的です。 慣れることはできますが、推測されるようなものではなく、初心者が定期的につまずくところです。
2つの空白の規則を取り入れれば助けになったのでしょうか? 問題はそうした規則では、最初のリストの印に3つまでの字下げの空白が許容される規則と組み合わさると、元のリストの印 より少なく 字下げされたテキストがリスト項目に含める上で許容されます。 例えば、Markdown.plが以下を構文解析すると……
- one
two
……単一のリスト項目とし、twoを継続段落にしてしまいます。
<ul>
<li>
<p>one</p>
<p>two</p>
</li>
</ul>
また、似た事例として……
> - one
>
> two
……は以下として構文解析されます。
<blockquote>
<ul>
<li>
<p>one</p>
<p>two</p>
</li>
</ul>
</blockquote>
これでは、極端に非直感的です。
端からの固定の字下げを要求するのではなく、リストの印(これ自体も字下げして構いません)から固定の字下げ(2つの空白か、1つの空白としましょう)を要求することができたでしょう。 この提案では議論した最後の異常な点は除かれるでしょう。 上で提示された仕様とは異なり、段落barが最初の段落fooと同じくらい深く字下げされていないにしても、以下を副段落を持つリスト項目として見なすでしょう。
10. foo
bar
おそらくはこのテキストはbarを副段落として持つリスト項目のように読まれますが、その点でその提案に分があるかもしれません。 しかしながら、この提案において字下げのコードはリストの印の後から6つの空白で字下げされなければならなくなるでしょう。 そしてこれにより多くの既存のマークダウンが崩れてしまうのですが、その類型とは次の通りです。
1. foo
indented code
……このコードは8つの空白で字下げされています。 上述の仕様では、対照的に、このテキストを期待通りに構文解析するでしょうが、それはコードブロックの字下げがfooの始めから計測されるためです。
特別な扱いが必要な1つの場合は字下げのコード で始まる リスト項目です。 その場合はどれだけの字下げが要求されるのでしょうか、というのも計測する元となる「最初の段落」がないためです。 規則2番目はそうした場合を単純に明記しており、リストの印から1つの空白の字下げ(およびそこから字下げのコードのための通常の4つの空白)が要求されるとしています。 これはリストの印に加えて先頭の字下げに4つの空白が取られている場合(よくある場合)における4つの空白の規則に合致するでしょうが、他の場合では乖離があるでしょう。
リストは同じ型を持つ1つ以上のリスト項目の系列です。 リスト項目はどれだけの数の空行で別れていても構いません。
2つのリスト項目は同じ型のリストの印で始まるなら同じ型を持つものです。 2つのリストの印は (a) 同じ文字 (-、+、*) を使う中黒リストの印であるか (b) 同じ区切り(.ないし)のいずれか)の順序付きリストの数字であるなら同じ型です。
リストはその構成要素たるリスト項目が順序付きリストの印で始まるなら順序付きリストであって、その構成要素たるリスト項目が中黒リストの印で始まるなら中黒リストです。
順序付きリストの開始番号はその先頭のリスト項目のリスト番号で決まります。 後続するリスト項目の番号は顧みられません。
リストはその構成要素たるリスト項目のいずれかが空行で別れているか、その構成要素たるリスト項目のいずれかに間に空行がある2つのブロック水準の要素がじかに含まれるならゆるやかです。 さもなければリストは窮屈です(HTMLの出力における違いとしてゆるやかなリストの中の段落は<p>タグに包まれる一方で、窮屈なリストの中の段落はそうではありません)。
中黒ないし順序付きのリストの区切りが変わると新しいリストが始まります。
1. foo
2. bar
3) baz
<ol>
<li>foo</li>
<li>bar</li>
</ol>
<ol start="3">
<li>baz</li>
</ol>
CommonMarkでは、リストで段落に割り込めます。 つまり、段落とその後に続くリストを離すために空行は必要とされません。
Markdown.plではこれは許容されていませんが、これは固く折り返された行の中の数字によりリストを誘発する恐れがあるためです。
The number of windows in my house is
14. The number of doors is 6.
とはいえ、妙なことに、同じ配慮が適用されるかもしれなかったにせよ、Markdown.plではブロック引用で段落に割り込むことは たしかに 許容されています。
CommonMarkでは、リストで段落に割り込むことを許容しているのですが、2つの理由があります。 1つ目に、空行なしに行を始めることは自然であってあまり見掛けないことでもないためです。
I need to buy
- new shoes
- a coat
- a plane ticket
2つ目に、私達は以下に引き付けられているからです。
一律性の原則:もしテキストの塊に何らかの意味があるなら、(リスト項目やブロック引用といった)入れ物ブロックに置かれたときに同じ意味を持ち続けます。
(もちろん、リスト項目とブロック引用のための仕様はこの原理を所与のものとしています) この原理が示唆しているのはもし……
* I need to buy
- new shoes
- a coat
- a plane ticket
……が段落とその後に続く入れ子の副リストを含むリスト項目である、というのも(リストが「窮屈」であるため、段落が<p>タグなしに提示されるかもしれないとはいえ)すべてのマークダウンの実装でそうであると合意されているためですが、そのときは……
I need to buy
- new shoes
- a coat
- a plane ticket
……もまた、段落に入れ子の副リストが続いたものであるべきです。
リスト項目内でリストが段落に割り込むことを許容するマークダウンの慣例が充分に確立されているため、一律性の原理により外側のリスト項目も同様にこれを許容することがここでは要求されます(reStructuredTextでは違う手法が取られており、別のリスト項目内でもリストの前に空行が要求されます)。
固く折り返された数字のある段落の中の望まないリストの問題を解決するために、1から始まるリストのみ段落に割り込めるよう許容しました。 したがって次の通り。
The number of windows in my house is
14. The number of doors is 6.
<p>The number of windows in my house is
14. The number of doors is 6.</p>
それでも、以下のような事例においては、意図しない結果になります。
The number of windows in my house is
1. The number of doors is 6.
<p>The number of windows in my house is</p>
<ol>
<li>The number of doors is 6.</li>
</ol>
ですがこの規則で、紛らわしくリストと捉えられてしまう、ほとんどの場合が回避されるでしょう。
項目の間にどれだけ空行があっても構いません。
- foo
- bar
- baz
<ul>
<li>
<p>foo</p>
</li>
<li>
<p>bar</p>
</li>
<li>
<p>baz</p>
</li>
</ul>
- foo
- bar
- baz
bim
<ul>
<li>foo
<ul>
<li>bar
<ul>
<li>
<p>baz</p>
<p>bim</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
同じ型の連続するリストを離すために、またはリストと字下げコードブロックであってさもなくば最後のリスト項目の副段落として構文解析されていたであろうものを離すために、空のHTMLコメントを挿入できます。
- foo
- bar
<!-- -->
- baz
- bim
<ul>
<li>foo</li>
<li>bar</li>
</ul>
<!-- -->
<ul>
<li>baz</li>
<li>bim</li>
</ul>
- foo
notcode
- foo
<!-- -->
code
<ul>
<li>
<p>foo</p>
<p>notcode</p>
</li>
<li>
<p>foo</p>
</li>
</ul>
<!-- -->
<pre><code>code
</code></pre>
リスト項目は同じ水準に字下げされている必要はありません。 以下のリスト項目は同じリストの水準の項目として扱われますが、それはどれも前のリスト項目に属するに足るだけ字下げされていないためです。
- a
- b
- c
- d
- e
- f
- g
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
<li>d</li>
<li>e</li>
<li>f</li>
<li>g</li>
</ul>
なお、しかしながら、リスト項目には3つの字下げの空白を越えて前に付けてはなりません。 以下では- eは段落継続行として扱われますが、これは3つの空白より多く字下げされているからです。
そして以下では、3. cは字下げコードブロックとして扱われますが、これは4つの空白で字下げされており空行が前に付いているからです。
1. a
2. b
3. c
<ol>
<li>
<p>a</p>
</li>
<li>
<p>b</p>
</li>
</ol>
<pre><code>3. c
</code></pre>
これはゆるやかなリストですが、それは2つのリスト項目の間に空行があるからです。
以下も同じで、こちらには空の2つ目の項目があります。
項目間に空行がないにしても、以下はゆるやかなリストですが、それは1つの項目に間に空行がある2つのブロック水準の要素がじかに含まれているからです。
- a
- b
c
- d
<ul>
<li>
<p>a</p>
</li>
<li>
<p>b</p>
<p>c</p>
</li>
<li>
<p>d</p>
</li>
</ul>
- a
- b
[ref]: /url
- d
<ul>
<li>
<p>a</p>
</li>
<li>
<p>b</p>
</li>
<li>
<p>d</p>
</li>
</ul>
以下は窮屈なリストです。 なぜなら、空行がコードブロックの中にあるからです。
- a
- ```
b
```
- c
<ul>
<li>a</li>
<li>
<pre><code>b
</code></pre>
</li>
<li>c</li>
</ul>
以下は窮屈なリストですが、それは空行が副リストの2つの段落間にあるからです。 そのため副リストがゆるやかである一方で外側のリストは窮屈です。
以下は窮屈なリストですが、それは空行がブロック引用内にあるからです。
以下のリストは窮屈ですが、それは連続するブロック要素が空行で別れていないからです。
- a
> b
```
c
```
- d
<ul>
<li>a
<blockquote>
<p>b</p>
</blockquote>
<pre><code>c
</code></pre>
</li>
<li>d</li>
</ul>
単一の段落のリストは窮屈です。
以下のリストはゆるやかですが、これはリスト項目の中の2つのブロック要素間の空行のためです。
以下の外側のリストはゆるやかですが、内側のリストは窮屈です。
- a
- b
- c
- d
- e
- f
<ul>
<li>
<p>a</p>
<ul>
<li>b</li>
<li>c</li>
</ul>
</li>
<li>
<p>d</p>
<ul>
<li>e</li>
<li>f</li>
</ul>
</li>
</ul>
行内要素は文字の流れの始めから終わりへ(右書きの言語では、左から右へ)逐次に構文解析されます。 したがって、例えば……
……でhiはコードとして構文解析され、最後にある抑音符は文字通りの抑音符として残ります。
抑音符の文字列は1つ以上の抑音符の文字 (`) からなる文字列であって抑音符が前に付くことも後に続くこともないものです。
コード区域は抑音符の文字列で始まり等しい長さの抑音符の文字列で終わります。 コード区域の内容はこれら2つの抑音符の文字列の間の1つ以上の文字であって、以下の方法で正規化されます。
以下は単純なコード区域です。
以下では2つの抑音符が使われていますが、それはコードに抑音符が含まれているからです。 この例では単一の先頭と末尾の空白が切り詰められることも例証されています。
この例では先頭と末尾の空白を切り詰めることの狙いが示されています。
なお、 1つ だけ空白が切り詰められます。
切り詰めは空白が文字列の両端にあるときのみ起こります。
空白のみ切り詰められるのであって、ユニコードの空白一般ではそうならず、以下の通りです。
コード区域に空白しか含まれなければ、何も切り詰められません。
行末は空白のように扱われます。
内側の空白は縮められません。
なおブラウザでは<code>要素を呈示するときに連続する空白を縮めることが通例であるため、以下のCSSを使うことが推奨されます。
code{white-space: pre-wrap;}
なお抑音符のエスケープはコード区域では働きません。 すべての抑音符は文字通りに扱われます。
抑音符のエスケープが必要になることはありませんが、それは常に、コードにちょうど n 個の抑音符の文字からなる文字列が一切含まれないように、 n 個の抑音符の文字からなる文字列を区切りとして選べるからです。
コード区域の抑音符にはHTMLタグと自動リンクを除いてその他すべての行内の構築要素よりも高い優先度があります。 したがって、例えば、以下は強調されたテキストとして構文解析されませんが、それは2つ目の*がコード区域の一部であるためです。
また、以下はリンクとして構文解析されません。
コード区域、HTMLタグ、自動リンクには同じ優先度があります。 したがって、以下はコードです。
ただし以下はHTMLタグです。
また、以下はコードです。
しかし以下は自動リンクです。
<https://foo.bar.`baz>`
<p><a href="https://foo.bar.%60baz">https://foo.bar.`baz</a>`</p>
抑音符の文字列がそれに合致する抑音符の文字列で閉じていないときは、単に文字通りの抑音符になります。
以下の事例でも長さにおいて等しい開始と閉止の抑音符の文字列の必要性が例証されています。
John Gruber氏の元来のマークダウンの構文の説明では次のように書かれています。
マークダウンでは星印文字 (
*) と下線文字 (_) が強調の標識として扱われます。 一重の*ないし_で包まれたテキストはHTMLの<em>タグで包まれますが、二重の*ないし_ではHTMLの<strong>タグで包まれます。
これはほとんどの利用者にとって充分でしょうが、この規則では多くが決まっていないまま残されており、とりわけ入れ子の強調となるとそうです。 元来のMarkdown.plのテスト一式では三重の***と___の区切りが強い強調に使えることが明らかになっており、ほとんどの実装でも以下の類型を許容してきました。
***strong emph***
***strong** in emph*
***emph* in strong**
**in strong *emph***
*in emph **strong***
以下の類型はそれよりは広く対応されてはいませんが、意図は明らかであり(特に参考文献の項目のような文脈で)有用です。
*emph *with emph* in it*
**strong **with strong** in it**
多くの実装でも内部の下線文字を含む単語での望まない強調を避けるため、単語内の強調を*の形式に制限しています(そうしたものはコード区域に置くのが最良慣行ですが、利用者がそうしないことはよくあります)。
internal emphasis: foo*bar*baz
no emphasis: foo_bar_baz
以下で与える規則はこれらの類型のすべてを捉えつつも、後戻りをしない効率的な構文解析の戦略が許容されるようにしています。
最初に、いくつかの定義です。 区切り連とはバックスラッシュでエスケープされていない*の文字が前に付いても後に続いてもいない1つ以上の*の文字の系列か、バックスラッシュでエスケープされていない_の文字が前に付いても後に続いてもいない1つ以上の_の文字の系列のいずれかです。
左側の区切り連とは区切り連であって (1) ユニコードの空白が後に続いておらず、かつ (2a) ユニコードの約物文字が後に続いていないか、 (2b) ユニコードの約物文字が後に続いておりユニコードの空白ないしユニコードの約物文字が前に付いているかのいずれかです。 この定義の目的のため、行の始めと終わりはユニコードの空白と見なされます。
右側の区切り連とは区切り連であって (1) ユニコードの空白が前に付いておらず、かつ (2a) ユニコードの約物文字が前に付いていないか、(2b) ユニコードの約物文字が前に付いておりユニコードの空白ないしユニコードの約物文字が後に続いているかのいずれかです。 この定義の目的のため、行の始めと終わりはユニコードの空白と見なされます。
以下は区切り連の例です。
左側ですが右側ではありません。
***abc
_abc
**"abc"
_"abc"
右側ですが左側ではありません。
abc***
abc_
"abc"**
"abc"_
左側と右側の両方です。
abc***def
"abc"_"def"
左側でも右側でもありません。
abc *** def
a _ b
(左側と右側の区切り連を前の文字と後の文字に基づいて区別するという発想はRoopesh Chander氏のvfmdから来ています。 vfmdでは「区切り連」の代わりに「強調の標識の文字列」という用語が使われており左側と右側の連を区別する規則はここで与えているものより少しだけ複雑です)
以下の規則により、強調と強い強調が定義されます。
単一の*の文字が強調の開始可能であるのは左側の区切り連の一部であるときでありまたそのときに限ります (if and only if; iff)。
単一の_の文字が強調の開始可能であるのは左側の区切り連の一部でありかつ (a) 右側の区切り連の一部でないか (b) ユニコードの約物文字が前に付いた右側の区切り連の一部であるかのいずれかのときでありまたそのときに限ります。
単一の_の文字が強調の閉止可能であるのは右側の区切り連の一部でありかつ (a) 左側の区切り連の一部ではないか (b) ユニコードの約物文字が後に続く左側の区切り連の一部であるかのいずれかのときでありまたそのときに限ります。
二重である__が強い強調の開始可能であるのは左側の区切り連の一部でありかつ (a) 右側の区切り連の一部でないか (b) ユニコードの約物文字が前に付く左側の区切り連の一部であるときのいずれかのときでありまたそのときに限ります。
二重である__が強い強調の閉止可能であるのは右側の区切り連の一部でありかつ (a) 左側の区切り連の一部でないか (b) ユニコードの約物文字が後に続く左側の区切り連の一部であるときでありまたそのときに限ります。
強調は強調の開始可能な区切りで始まり強調の閉止可能な区切りで終わり、それには開始の区切りと同じ(_ないし*の)文字が使われます。 開始と閉止の区切りは離れた区切り連に属していなければなりません。 いずれかの区切りで強調を開始することも閉止することも両方できるならば、開始と閉止の区切りを含む区切り連の長さの和は両方の長さが3の倍数でない限り3の倍数であってはなりません。
強い強調は強い強調の開始可能な区切りで始まり強い強調の閉止可能な区切りで終わり、それには開始の区切りと同じ(_ないし*の)文字が使われます。 開始と閉止の区切りは離れた区切り連に属していなければなりません。 区切りのいずれかが強い強調を開始することも閉止することも両方できるならば、開始と閉止の区切りを含む区切り連の長さの和は両方の長さが3の倍数でない限り3の倍数であってはなりません。
文字通りの*の文字は、バックスラッシュでエスケープされていない限り、*で区切られた強調ないし**で区切られた強い強調の始めないし終わりに出現できません。
文字通りの_の文字は、バックスラッシュでエスケープされていない限り、_で区切られた強調ないし__で区切られた強い強調の始めないし終わりに出現できません。
ここで上述の規則1番目から12番目では複数の構文解析の仕方が両立することがあり、以下の原理でその曖昧さが解決されます。
入れ子の数は最小化されるべきです。 したがって、例えば、<strong>...</strong>の解釈は<em><em>...</em></em>に常に優先します。
<em><strong>...</strong></em>の解釈は<strong><em>...</em></strong>に常に優先します。
2つの強調ないし強い強調になる潜在性のある区域が重なり合っているとき、つまり2つ目が1つ目の終わりの前に始まり1つ目の終わりの後に終わるとき、1つ目が優先します。 したがって、例えば、*foo _bar* baz_は*foo <em>bar* baz</em>ではなく<em>foo _bar</em> baz_として構文解析されます。
同じ閉止の区切りを持つ2つの強調ないし強い強調になる潜在性のある区域があるとき、短かい方(後に開いた方)が優先します。 したがって、例えば、**foo **bar baz**は<strong>foo **bar baz</strong>ではなく**foo <strong>bar baz</strong>として構文解析されます。
行内コード区域、リンク、HTMLタグは強調より固く結び付きます。 そのため、そうした要素のいずれかは含みいずれかは含まないという解釈間での選択があるとき、前者が常に勝ちます。 したがって、例えば、*[foo*](bar)は<em>[foo</em>](bar)ではなく*<a href="bar">foo*</a>として構文解析されます。
これらの規則は、以降の例を通じて、分かりやすく表せます。
規則1番目に関して以下の通り。
以下は強調ではありませんが、それは開始の*に空白が後に続いており、そのため左側の区切り連の一部でないからです。
以下は強調ではありませんが、それは開始の*に英数字が前に付き約物が後に続いており、そのため左側の区切り連の一部ではないからです。
ユニコードの非改行空白も、空白文字とは見なされません。
ユニコードの記号も約物として見なされます。
*$*alpha.
*£*bravo.
*€*charlie.
*𞋿*delta.
<p>*$*alpha.</p>
<p>*£*bravo.</p>
<p>*€*charlie.</p>
<p>*𞋿*delta.</p>
*による単語内の強調は許されます。
規則2番目に関して以下の通り。
以下は強調ではありませんが、それは開始の_に空白が後に続いているからです。
以下は強調ではありませんが、それは開始の_に英数字が前に付き約物が後に続いているからです。
_による強調は単語内では許されません。
以下で_により強調は生成されませんが、それは1つ目の区切り連が右側であり2つ目が左側だからです。
開始の区切りが左側と右側の両方であるとしても、以下は強調ですが、それは約物が前に付いているからです。
規則3番目に関して以下の通り。
以下は強調ではありませんが、それは閉止の区切りが開始の区切りと合致しないからです。
以下は強調ではありませんが、それは閉止の*に空白が前に付いているからです。
行末も空白文字と見なされます。
以下は強調ではありませんが、それは2つ目の*に約物が前に付いており英数字が後に続いている(そのため右側の区切り連の一部ではない)からです。
この制限の要点はこの例だとより飲み込みやすいです。
*による単語内の強調は許されます。
規則4番目に関して以下の通り。
以下は強調ではありませんが、それは閉止の_に空白が前に付いていないからです。
以下は強調ではありませんが、それは2つ目の_に約物が前に付いており英数字が後に続いているからです。
以下は強調の範囲内にある強調です。
単語内の強調は、_については許されません。
以下は、閉止の区切りが左側と右側の両方であるとしても、強調ですが、それは約物が後に続いているからです。
規則5番目に関して以下の通り。
以下は強い強調ではありませんが、それは開始の区切りに空白が後に続いているからです。
以下は強い強調ではありませんが、それは開始の**に英数字が前に付いており約物が後に続いており、そのため左側の区切り連の一部でないからです。
**による単語内の強い強調は許されます。
規則6番目に関して以下の通り。
以下は強い強調ではありませんが、それは開始の区切りに空白が後に続いているからです。
行末は空白文字と見なされます。
以下は強い強調ではありませんが、それは開始の__に英数字が前に付いており約物が後に続いているからです。
単語内の強い強調は、__については禁止されます。
以下は、開始の区切りが左側と右側の両方であるとしても、強い強調ですが、それは約物が前に付いているからです。
規則7番目に関して以下の通り。
以下は強い強調ではありませんが、それは閉止の区切りに空白が前に付いているからです。
(強調された*foo bar *として解釈することもできませんが、それは規則11番目のためです)
以下は強い強調ではありませんが、それは2つ目の**に約物が前に付き英数字が後に続いているからです。
この制限の要点は以下の例だとより飲み込みやすいです。
**Gomphocarpus (*Gomphocarpus physocarpus*, syn.
*Asclepias physocarpa*)**
<p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
<em>Asclepias physocarpa</em>)</strong></p>
単語内の強調について以下の通りです。
規則8番目に関して以下の通り。
以下は強い強調ではありませんが、それは閉止の区切りに空白が前に付いているからです。
以下は強い強調ではありませんが、それは2つ目の__に約物が前に付き英数字が後に続いているからです。
この制限の要点はこの例だとより飲み込みやすいです。
単語内の強い強調は、__については禁止されます。
以下は、閉止の区切りが左側と右側の両方であるとしても、強い強調ですが、それは約物が後に続いているからです。
規則9番目に関して以下の通り。
あらゆる空でない行内の要素の系列は強調された区域の内容になりえます。
とりわけ、強調と強い強調は強調内に入れ子になりえます。
なお前述の事例において、次の解釈……
<p><em>foo</em><em>bar<em></em>baz</em></p>
……は(fooの後の*のように)開くことも閉じることも両方できる区切りは開始と閉止の区切りを含む区切り連の長さの和が3の倍数なら両方の長さが3の倍数でない限りは強調を形成できないという条件により排除されます。
同じ理由のため、以下の例で2つの連続する強調に分かれたものにはなりません。
同じくこの条件により、内部の空白が省かれている場合であっても、以下の事例はすべて強調内に入れ子になった強い強調となることが確定します。
内部の閉止と開始の区切り連の長さが 両方とも 3の倍数のときは、ただし、それらは合致して強調が作られます。
foo******bar*********baz
<p>foo<strong><strong><strong>bar</strong></strong></strong>***baz</p>
際限のない入れ子の水準にできます。
*foo **bar *baz* bim** bop*
<p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>
空の強調や強い強調はありえません。
規則10番目に関して以下の通り。
あらゆる空でない行内の要素の系列は強く強調された区域の内容になれます。
とりわけ、強調と強い強調は強い強調内に入れ子になれます。
際限のない入れ子の水準にできます。
**foo *bar **baz**
bim* bop**
<p><strong>foo <em>bar <strong>baz</strong>
bim</em> bop</strong></p>
空の強調や強い強調はありえません。
規則11番目に関して以下の通り。
なお区切りが均等に合致しないときは、規則11番目により超過する文字通りの*の文字が強調の外側に現れることが決まりますが、内側ではありません。
規則12番目に関して以下の通り。
なお区切りが均等に合致しないときは、規則12番目により超過する文字通りの_の文字は強調の外側に現れることが決まりますが、内側ではありません。
規則13番目により強調を強調の内側に直接入れ子にしたければ、違う区切りを使わなければならないことが示唆されます。
しかしながら、強い強調の範囲内の強い強調は区切りを切り替えることなく可能です。
規則13番目は好きなだけ長い区切りの系列にも適用できます。
規則14番目に関して以下の通り。
規則15番目に関して以下の通り。
規則16番目に関して以下の通り。
規則17番目に関して以下の通り。
**a<https://foo.bar/?q=**>
<p>**a<a href="https://foo.bar/?q=**">https://foo.bar/?q=**</a></p>
__a<https://foo.bar/?q=__>
<p>__a<a href="https://foo.bar/?q=__">https://foo.bar/?q=__</a></p>
リンクテキストにはリンク(可視のテキスト)、リンク先(リンク先であるURI)、省略可能なリンク題が含まれます。 マークダウンではリンクは2つに大別されます。 行内リンクでは宛先と題はリンクテキストの直後に与えられます。 参照リンクでは宛先と題は文書のどこかに定義されます。
リンクテキストは角括弧([と])で囲まれたゼロ以上の行内の要素の系列からなります。 以下の規則が適用されます。
リンクには、どの入れ子の水準にも、別のリンクは含められません。 含められていたとしたら適正であったであろう複数のリンクの定義がそれぞれ他の内部に入れ子で現れているなら、最奥の定義が使われます。
角括弧がリンクテキストの中で許容されるのは (a) バックスラッシュでエスケープされているときか (b) 角括弧の合致する対、つまり開く角括弧の[、0以上の行内の系列、閉じる角括弧の]として現れるときのみです。
抑音符のコード区域、自動リンク、素のHTMLタグはリンクテキストにおける角括弧よりも固く結び付きます。 したがって、例えば、[foo`]`はリンクテキストになりえませんが、それは2つ目の]がコード区域の一部であるためです。
リンクテキストにおける角括弧は強調と強い強調のための印より固く結び付きます。 したがって、例えば、*[foo*](url)はリンクです。
リンク先は次のいずれかからなります。
開く<と閉じる>の間の行末やエスケープされていない<ないし>の文字を一切含まない0以上の文字の系列か、もしくは
<で始まらず、アスキー制御文字や空白の文字を含まず、丸括弧を含むのが (a) バックスラッシュでエスケープされているか (b) エスケープされていない丸括弧の釣り合う対の一部であるときのみである文字からなる空でない系列です(実装では効率性の問題を避けるため丸括弧の入れ子に制限を課して構いませんが、少なくとも3段階の入れ子には対応しているべきです)。
リンク題は以下のいずれかからなります。
真っ直ぐな二重引用符の文字 (") の間のゼロ以上の文字の系列であって、その中の文字にはバックスラッシュでエスケープされているときのみ"の文字が含まれるもの、もしくは
真っ直ぐな単一引用符の文字 (') の間のゼロ以上の文字の系列であって、その中の文字にはバックスラッシュでエスケープされているときのみ'の文字が含まれるもの、もしくは
対をなす丸括弧 ((...)) の間のゼロ以上の文字の系列であって、その中の文字にはバックスラッシュでエスケープされているときのみ(ないし)の文字が含まれるものです。
リンク題は複数行にわたって構わないとはいえ、空行を含んではなりません。
行内リンクはリンクテキストとその直後に続く左の丸括弧(、省略可能なリンク先、省略可能なリンク題、そして右の丸括弧)からなります。 これらの4つの構成要素は空白、タブ、1つまでの行末で別れていて構いません。 リンク先とリンク題の両方が存在するなら、空白、タブ、1つまでの行末で別れて いなければならない とします。
リンクのテキストはリンクテキストの中に含まれる(取り囲む角括弧を除く)行内要素からなります。 リンクのURIはリンク先からなり、もしあるなら取り囲む<...>は除かれ、上述したようなバックスラッシュのエスケープが効果を持ちます。 リンク題はリンクの題名からなり、取り囲む区切りを除き、上述したようなバックスラッシュのエスケープが効果を持ちます。
以下は単純な行内リンクです。
題、リンクテキスト、さらには宛先も省いて構いません。
宛先には山括弧で囲まれているなら空白のみを含められます。
宛先には、山括弧で囲まれていても、行末を含められません。
宛先には山括弧で囲まれていれば)を含められます。
リンクを囲む山括弧はエスケープが外れていなければなりません。
以下はリンクではありませんが、それは開く山括弧が適切に合致しないからです。
リンク先の内部の丸括弧はエスケープして構いません。
任意の数の丸括弧はエスケープなしに許容されますが、釣り合いが取れている限りにおいてです。
しかしながら、釣り合いの取れていない丸括弧があるなら、エスケープをするか<...>の形式を使う必要があります。
丸括弧とその他の記号も、通常のマークダウンのように、エスケープできます。
リンクにはフラグメントの識別子とクエリを含められます。
[link](#fragment)
[link](https://example.com#fragment)
[link](https://example.com?foo=3#frag)
<p><a href="#fragment">link</a></p>
<p><a href="https://example.com#fragment">link</a></p>
<p><a href="https://example.com?foo=3#frag">link</a></p>
なおエスケープできない文字の前のバックスラッシュはただのバックスラッシュです。
URLエスケープ処理は宛先内では行わずそのままにしておくべきですが、それはすべてのURLエスケープされた文字もまた適正なURLの文字であるためです。 宛先の中の実体と数値的な文字参照は照応するユニコードの符号位置に、通常通りに構文解析されます。 これらはHTMLとして書き出されるときに随意でURLエスケープされていて構いませんが、本仕様ではHTMLやその他の形式でURLを呈示するための何らかの特定の方針を促進しません。 呈示器では出力においてURLをどのようにエスケープないし正規化するかについての様々な決定をして構いません。
なお、題はよく宛先として構文解析されることがあるので、宛先を省いて題を保とうとするなら、期待しない結果になるでしょう。
題は単一引用符、二重引用符、丸括弧にあって構いません。
[link](/url "title")
[link](/url 'title')
[link](/url (title))
<p><a href="/url" title="title">link</a>
<a href="/url" title="title">link</a>
<a href="/url" title="title">link</a></p>
バックスラッシュのエスケープと実体と数値的な文字参照を題で使って構いません。
題はリンクから空白、タブ、1つまでの行末を使って別れていなければなりません。 分割しない空白のような他のユニコードの空白は働きません。
入れ子にされた釣り合いの取れた引用符はエスケープなしには許容されません。
[link](/url "title "and" title")
<p>[link](/url "title "and" title")</p>
しかし違う引用符の種別を使って回避するのは簡単です。
[link](/url 'title "and" title')
<p><a href="/url" title="title "and" title">link</a></p>
(註:Markdown.plではたしかに二重引用符の題の内部の二重引用符が許容されており、そのテスト一式にはこれを論証するテストが含まれます。 しかしこれによりもたらされる余剰の複雑性に良い合理性を見いだしがたく、というのも二重引用符を含む題を書く上で多くの方法――バックスラッシュのエスケープ、実体と数値的な文字参照、題を囲むための違う引用符の種別の使用――が既にあるからです。 Markdown.plの題の扱いには他にも数々の妙な特徴があります。 例えば、行内リンクでは単一引用符の題が許容されていますが、参照リンクではされません。 また、行内リンクではそうではありませんが参照リンクでは、題を"で始めたり)で終わったりすることが許容されています。 Markdown.pl 1.0.1でも囲む引用符のない題が許容されていますが、1.0.2b8では許容されていません。 行内リンクとリンク参照定義で同じ方法で働く単純で、合理的な規則を取り入れることが好ましいと思われます)
空白、タブ、1つまでの行末は宛先と題の周りにおいて許容されます。
しかしリンクテキストとその後に続く丸括弧の間では許容されません。
リンクテキストには釣り合いの取れた角括弧が含まれていて構いませんが、釣り合いが取れていないものはそうではなく、エスケープされていないときに限ります。
リンクテキストには行内の内容が含まれていて構いません。
[link *foo **bar** `#`*](/uri)
<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
しかしながら、どの入れ子の水準においても、リンクには別のリンクを含められません。
[foo *[bar [baz](/uri)](/uri)*](/uri)
<p>[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p>
以下の事例では強調の結び付きに対してリンクテキストの結び付きが優先することが例証されています。
なおリンクの一部 ではない 角括弧は優先しません。
以下の事例ではHTMLタグ、コード区域、自動リンクがリンクの結び付きに優先することが例証されています。
[foo<https://example.com/?search=](uri)>
<p>[foo<a href="https://example.com/?search=%5D(uri)">https://example.com/?search=](uri)</a></p>
完全参照リンクはリンクテキストに文書のどこかにあるリンク参照定義に合致するリンクラベルが直後に続いたものからなります。
リンクラベルはバックスラッシュでエスケープされていない左の角括弧 ([) で始まり最初の右の角括弧 (]) で終わります。 これらの角括弧の間には少なくとも1つの空白、タブ、行末でない文字がなければなりません。 エスケープされていない角括弧の文字はリンクラベルの開始と閉止の角括弧内では許容されません。 リンクラベルには角括弧内に最大で999個の文字を持たせられます。
あるラベルが別のものに合致するのはそれらの正規化された形態が等しい場合に限ります。 ラベルを正規化する上では、開始と閉止の角括弧を切り詰めて、 ユニコードの大文字と小文字の折り畳み が行われ、先頭と末尾の空白、タブ、行末が切り詰められ、連続する内部の空白、タブ、行末が単一の空白に縮められます。 複数の合致する参照リンク定義があるなら、文書で最初に来るものが使われます(そうした場合に警告を出すのが望ましいです)。
リンクのURIと題は合致するリンク参照定義により供されます。
以下は単純な例です。
リンクテキストの規則は行内リンクと同じです。 したがって以降の通りです。
リンクテキストには釣り合いの取れた角括弧が含まれていて構いませんが、釣り合いが取れていないものはそうではなく、エスケープされていないときに限ります。
リンクテキストには行内の内容が含まれていて構いません。
[link *foo **bar** `#`*][ref]
[ref]: /uri
<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
[][ref]
[ref]: /uri
<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>
しかしながら、どの入れ子の水準においても、リンクには別のリンクを含められません。
[foo [bar](/uri)][ref]
[ref]: /uri
<p>[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p>
[foo *bar [baz][ref]*][ref]
[ref]: /uri
<p>[foo <em>bar <a href="/uri">baz</a></em>]<a href="/uri">ref</a></p>
(上の例では、1つの完全参照リンクの代わりに2つの簡略参照リンクになります)
以下の事例では強調の結び付きに対するリンクテキストの結び付きの優先度が例証されています。
以下の事例ではHTMLタグ、コード区域、自動リンクがリンクの結び付きに優先することが例証されています。
[foo<https://example.com/?search=][ref]>
[ref]: /uri
<p>[foo<a href="https://example.com/?search=%5D%5Bref%5D">https://example.com/?search=][ref]</a></p>
合致では大文字と小文字が区別されません。
ユニコードの大文字と小文字の折り畳みが使われます。
連続する内部の空白、タブ、行末は合致を判定する目的のために1つの空白として扱われます。
空白、タブ、行末はリンクテキストとリンクラベルの間で一切許容されません。
これはJohn Gruber氏の元来のマークダウンの構文の説明からの新機軸であり、そちらではリンクテキストとリンクラベルの間の空白を陽に許容しています。 それにより行内リンクを持つ行での参照リンクがもたらされ、その行内リンクには(元来のマークダウンと本仕様の両方によれば)リンクテキストの後に空白を持たせられません。 より重要なこととして、それによりうっかり連続する簡略参照リンクに捉えられてしまうことが防がれます。 空白がリンクテキストとリンクラベルの間に許容されるならば、以下においては単一の参照リンクが得られるのであって、2つの簡略参照リンクではなく、これは意図通りです。
[foo]
[bar]
[foo]: /url1
[bar]: /url2
(なお簡略参照リンクはMarkdown.plのベータ版においてGruber氏自身により導入されましたが、公式の構文の説明に含められることはありませんでした。 簡略参照リンクがなければ、リンクテキストとリンクラベルの間に空白を許容することは無害ですが、ひとたび簡略参照が導入されれば、頻繁に意図しない結果につながるために、これを許容することは危険すぎます)
複数の合致するリンク参照定義があるとき、最初のものが使われます。
なお合致は正規化された文字列に対して行われるのであって、構文解析された行内の内容ではありません。 そのためラベルにより等価な行内の内容が定義されるにしても、以下は合致しません。
バックスラッシュでエスケープされていない限り、リンクラベルには角括弧を含められません。
なおこの例では]はバックスラッシュでエスケープされていません。
リンクラベルには少なくとも1つの空白、タブ、行末ではない文字が含まれていなければなりません。
縮約参照リンクは文書のどこかにあるリンク参照定義に合致するリンクラベルに、文字列[]が後に続いたものからなります。 リンクラベルの内容は行内として構文解析され、リンクのテキストとして使われます。 リンクのURLと題は合致する参照リンク定義により供されます。 したがって、[foo][]は[foo][foo]と等価です。
[*foo* bar][]
[*foo* bar]: /url "title"
<p><a href="/url" title="title"><em>foo</em> bar</a></p>
リンクラベルは大文字と小文字が区別されません。
完全参照リンクと同じく、空白、タブ、行末は2つの角括弧の対の間に許容されません。
簡略参照リンクは文書のどこかにあるリンク参照定義に合致するリンクラベルからなり[]ないしリンクラベルが後に続かないものです。 リンクラベルの内容は行内として構文解析され、リンクのテキストとして使われます。 リンクのURIと題は合致するリンク参照定義により供されます。 したがって、[foo]は[foo][]と等価です。
[*foo* bar]
[*foo* bar]: /url "title"
<p><a href="/url" title="title"><em>foo</em> bar</a></p>
[[*foo* bar]]
[*foo* bar]: /url "title"
<p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p>
リンクラベルは大文字と小文字が区別されません。
リンクテキストの後の空白は保持されるべきです。
角括弧が付いたテキストがほしいだけなら、開く角括弧をバックスラッシュでエスケープしてリンクを避けられます。
なお以下はリンクですが、それはリンクラベルが最初に後に続く閉じる角括弧で終わるからです。
完全ないし縮約の参照は簡略参照に優先します。
行内リンクも優先します。
以下の事例で[bar][baz]は参照として、[foo]は通常のテキストとして構文解析されます。
以下では、ただし、[foo][bar]は参照として構文解析されますが、それは[bar]が定義されているためです。
[foo][bar][baz]
[baz]: /url1
[bar]: /url2
<p><a href="/url2">foo</a><a href="/url1">baz</a></p>
以下で[foo]は簡略参照として構文解析されませんが、それは([bar]が定義されていないとしても)リンクラベルが後に続くからです。
画像のための構文はリンクのための構文と似ていますが、1点違いがあります。 リンクテキストの代わりに、画像の説明があります。 このための規則はリンクテキストのためのものとほぼ同じですが、(a) 画像の説明が[ではなく![で始まる点と、(b) 画像の説明にリンクが含まれていて構わない点は除きます。 画像の説明には内容として行内要素があります。 画像がHTMLに呈示されるとき、これが標準的には画像のalt属性として使われます。
![foo *bar*]
[foo *bar*]: train.jpg "train & tracks"
<p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p>
本仕様では構文解析に関心があり、呈示ではないとはいえ、HTMLに呈示する上では、画像の説明の素の文字列の内容のみを使うことが推奨されます。 なお上の例では、代替の属性の値はfoo barであって、foo [bar](/url)やfoo <a href="url">bar</a>ではありません。 素の文字列の内容のみが呈示され、書式化はされていません。
![foo *bar*][]
[foo *bar*]: train.jpg "train & tracks"
<p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p>
![foo *bar*][foobar]
[FOOBAR]: train.jpg "train & tracks"
<p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p>
My 
<p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p>
参照風では次の通り。
縮約では次の通り。
![*foo* bar][]
[*foo* bar]: /url "title"
<p><img src="/url" alt="foo bar" title="title" /></p>
ラベルは大文字と小文字が区別されません。
参照リンクと同じく、空白、タブ、行末は、2つの角括弧の対の間には許容されません。
簡略では次の通り。
![*foo* bar]
[*foo* bar]: /url "title"
<p><img src="/url" alt="foo bar" title="title" /></p>
なおリンクラベルにはエスケープされていない角括弧を含められません。
リンクラベルは大文字と小文字が区別されません。
文字通りの!に角括弧の付いたテキストを後に続けたいだけなら、開きの[をバックスラッシュでエスケープできます。
文字通りの!の後にリンクがほしければ、!をバックスラッシュでエスケープしてください。
自動リンクは<と>の内部に絶対URIや電子メールアドレスがあるものです。 リンクとして構文解析され、そのリンクにはURLないし電子メールアドレスがリンクラベルとしてあります。
URIの自動リンクは<、その後に続く絶対URIに>が後に続いたものからなります。 URIへのリンクとして構文解析され、そのリンクにはURIがリンクのラベルとしてあります。
絶対URIとは、ここでの目的として、スキームにコロン (:) が後に続きそれにゼロ以上のアスキー制御文字、空白、<、>以外の文字が後に続いたものからなります。 URIにこれらの文字が含まれるなら、パーセント符号化されていなければなりません(例えば空白は%20です)。
本仕様の目的のため、スキームはアスキー文字で始まりアスキー文字、数字、ないし記号の足す (“+”)、ピリオド (“.”)、ハイフン (“-”) の任意の組み合わせが後に続く2個から32個の文字の任意の系列です。
以下はいくつかの適正な自動リンクです。
<https://foo.bar.baz/test?q=hello&id=22&boolean>
<p><a href="https://foo.bar.baz/test?q=hello&id=22&boolean">https://foo.bar.baz/test?q=hello&id=22&boolean</a></p>
<irc://foo.bar:2233/baz>
<p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>
大文字でも大丈夫です。
なお本仕様の目的のために絶対URIとして見なされる多くの文字列は適正なURIではありませんが、それはスキーマが登録されていないか構文に別の問題があるからです。
<made-up-scheme://foo,bar>
<p><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p>
空白は自動リンク中で許容されません。
バックスラッシュのエスケープは自動リンクの内部では働きません。
<https://example.com/\[\>
<p><a href="https://example.com/%5C%5B%5C">https://example.com/\[\</a></p>
電子メールの自動リンクは<、その後に続く電子メールアドレス、その後に続く>からなります。 リンクのラベルは電子メールアドレスであり、URLはmailto:に電子メールアドレスが後に続いたものです。
電子メールアドレスとは、ここでの目的のため、HTML5の仕様からの規範的でない構文に合致する任意のものです。
/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?
(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/
電子メールの自動リンクの例は次の通り。
<foo@bar.example.com>
<p><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
<foo+special@Bar.baz-bar0.com>
<p><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p>
バックスラッシュのエスケープは電子メールの自動リンクの内側では働きません。
以下は自動リンクではありません。
HTMLタグのように見える<と>の間のテキストは素のHTMLタグとして構文解析されHTMLにおいてエスケープなしに呈示されます。 タグと属性名は現行のHTMLタグに制限されないため、独自のタグを(さらには、例えば、DocBookのタグも)使って構いません。
以下はタグの文法です。
タグ名はアスキー文字にゼロ以上のアスキー文字、数字、ないしハイフン (-) が後に続いたものからなります。
属性は空白、タブ、1つまでの行末、属性名、省略可能な属性値の指定からなります。
属性名はアスキー文字、_、ないし:に、ゼロ以上のアスキー文字、数字、_、.、:、ないし-が後に続いたものからなります(補足:これはアスキーに制限されたXMLの仕様です。 HTML5ではもっとゆるいです)。
属性値の指定は省略可能な空白、タブ、1つまでの行末、そして=の文字、省略可能な空白、タブ、1つまでの行末、そして属性値からなります。
属性値は引用符のない属性値、単一引用符の属性値、二重引用符の属性値からなります。
引用符のない属性値は空白、タグ、行末、"、'、=、<、>、ないし`を含まない文字からなる空でない文字列です。
単一引用符の属性値は'、'を含まないゼロ以上の文字、最後に'からなります。
二重引用符の属性値は"、"を含まないゼロ以上の文字、最後の"からなります。
開始タグは<の文字、タグ名、ゼロ以上の属性、省略可能な空白、タブ、そして1つまでの行末、省略可能な/の文字、そして>の文字からなります。
閉止タグは文字列</、タグ名、省略可能な空白、タブ、1つまでの行末、そして文字>からなります。
HTMLコメントは<!-->、<!--->、ないし<!--、文字列-->を含まない文字からなる文字列、そして-->からなります(HTMLの仕様を参照)。
処理命令は文字列<?、文字列?>を含まない文字からなる文字列、そして文字列?>からなります。
宣言は文字列<!、アスキー文字、文字>を含まないゼロ以上の文字、そして文字>からなります。
CDATA節は文字列<![CDATA[、文字列]]>を含まない文字からなる文字列、文字列]]>からなります。
HTMLタグは開始タグ、閉止タグ、HTMLコメント、処理命令、宣言、CDATA節です。
以下は単純な開始タグです。
空の要素は次の通り。
空白は許容されます。
属性付きのものは次の通り。
<a foo="bar" bam = 'baz <em>"</em>'
_boolean zoop:33=zoop:33 />
<p><a foo="bar" bam = 'baz <em>"</em>'
_boolean zoop:33=zoop:33 /></p>
独自のタグ名が使えます。
以下は不正なタグ名であって、HTMLとして構文解析されません。
以下は不正な属性名です。
以下は不正な属性値です。
以下は不正な空白です。
< a><
foo><bar/ >
<foo bar=baz
bim!bop />
<p>< a><
foo><bar/ >
<foo bar=baz
bim!bop /></p>
以下は空白が欠けています。
閉止タグは次の通り。
以下には閉止タグ中に不正な属性があります。
以下はコメントです。
foo <!-- this is a --
comment - with hyphens -->
<p>foo <!-- this is a --
comment - with hyphens --></p>
foo <!--> foo -->
foo <!---> foo -->
<p>foo <!--> foo --></p>
<p>foo <!---> foo --></p>
処理命令は次の通り。
宣言は次の通り。
CDATA節は次の通り。
実体と数値的な文字参照はHTMLの属性で保持されます。
バックスラッシュのエスケープはHTMLの属性では働きません。
タグで改行が許容されるにしても、ブロック引用により行が行内HTMLとして構文解析されることが防がれます。
2つ以上の空白が前に付きブロックの終わりに現れない(コード区域にもHTMLタグにもない)行末は(HTMLで<br />タグとして呈示される)固い改行として構文解析されます。
より可視的な代替として、行末の前のバックスラッシュを2つ以上の空白の代わりに使って構いません。
2つ以上の空白が使えます。
次の行の始めにある先頭の空白は無視されます。
固い改行は強調、リンク、行内の内容が許容されるその他の構築要素の内部に現れることができます。
固い改行はコード区域内に現れません。
あるいはHTMLタグ内においても。
固い改行はブロックの範囲内の行内の内容を離すためのものです。 固い改行のための構文は段落でもその他のブロック要素でもその終わりでは働きません。
2つ以上の空白やバックスラッシュが前に付いていない(コード区域やHTMLタグの中でない)通常の行末は柔らかい分割として構文解析されます(柔らかい改行はHTMLでは行末ないし空白として呈示して構いません。 結果はブラウザで同じになるでしょう。 以下の例では、行末が使われています)。
行の終わりと次の行の始めの空白は除かれます。
準拠する構文解析では柔らかい改行をHTMLで行末ないし空白のいずれかとして呈示して構いません。
呈示器は柔らかい改行を固い改行として呈示するオプションを供しても構いません。
上の規則により解釈が与えられていないあらゆる文字は素のテキストの内容として構文解析されます。
内部の空白は書いたままに保持されます。
本補遺ではCommonMarkの参照実装で使われている構文解析の戦略の特徴を記述します。
構文解析には二段階あります。
一段階目では、入力の1つ以上の行が消費され文書のブロックの構造――段落、ブロック引用、リスト項目、その他諸々への分割――が構築されます。 テキストはこれらのブロックに割り当てられますが構文解析されません。 リンク参照定義は構文解析されリンクの対応付けが構築されます。
二段階目では、一段階目で構築されたリンク参照の対応付けを使って、段落と見出しの素のテキストの内容がマークダウンの行内の要素(文字列、コード区域、リンク、強調、その他諸々)の系列に構文解析されます。
処理における各時点で、文書は ブロック の木として表現されます。 木の根はdocumentブロックです。 documentは任意の数の他のブロックを 子 として持てます。 これらの子は、さらに、他のブロックを子として持ちます。 ブロックの最後の子は普通 開いている と見なされますが、それは入力の後続の行がその内容を変えることがあるという意味です(開いていないブロックは 閉じて います)。 以下は、例えば、取り得る文書の木であり、矢印で示された開いたブロックがあります。
-> document
-> block_quote
paragraph
"Lorem ipsum dolor\nsit amet."
-> list (type=bullet tight=true bullet_char=-)
list_item
paragraph
"Qui *quodsi iracundia*"
-> list_item
-> paragraph
"aliquando id"
処理された各行にはこの木における効果があります。 行が解析され、その内容によって、文書を以下のうち1つ以上の方法で変えられます。
いったん行がこのように木に取り込まれたら、無視することができ、そのため入力は一度に流して読めます。
各行について、以下の手続きに従っています。
最初に開いているブロックを巡回し、文書の根から始め、最後の開いているブロックまで最後の子まで降りていきます。 各ブロックではブロックが開いたままなら行が満たす条件が課されます。 例えば、ブロック引用は>の文字を要求します。 段落は空でない行を要求します。 この段階で開いているブロックのすべてないしごく一部のものに合致するかもしれません。 しかしまだ合致していないブロックは閉じられませんが、それは不精の継続行があるかもしれないからです。
次に、既存のブロック群に対する継続の印を消費した後に、新しいブロックの開始(例えばブロック引用のための>)を探します。 もし新しいブロックの開始に遭遇したら、工程1で合致していない任意のブロックを閉じて新しいブロックを最後の合致した入れ物ブロックの子として作ります。
最後に、(>のようなブロックの印、リストの印、消費された字下げの後の)行の残りを見ます。 これは最後の開いたブロック(段落、コードブロック、見出し、ないし素のHTML)に取り込めるテキストです。
setext見出しはsetext見出しの下線である段落の行を見かけたときに形成されます。
参照リンク定義は段落が閉じたときに検知されますが、それはつまり累積されたテキストの行は1つ以上の参照リンク定義で始まるかどうか見るために構文解析されるのです。 残りのものは何であれ通常の段落になります。
この仕組みは上述の木がこの4行のマークダウンにより生成されるさまを考えればわかります。
> Lorem ipsum dolor
sit amet.
> - Qui *quodsi iracundia*
> - aliquando id
劈頭第一に、この文書のモデルは以下だけです。
-> document
テキストの最初の行の……
> Lorem ipsum dolor
……によりblock_quoteブロックがここでの開いたdocumentブロックの子として、そしてそのblock_quoteの子としてparagraphブロックが作られます。 それからそのテキストは最後の開いたブロックである、paragraphに取り入れられます。
-> document
-> block_quote
-> paragraph
"Lorem ipsum dolor"
次の行の……
sit amet.
……は開いたparagphraの「不精な継続」であるため、段落のテキストに加えられます。
-> document
-> block_quote
-> paragraph
"Lorem ipsum dolor\nsit amet."
3行目の……
> - Qui *quodsi iracundia*
……によりparagraphブロックは閉じられ、新しいlistブロックがblock_quoteの子として開かれます。 list_itemもまたlistの子として、paragraphがlist_itemの子として加えられます。 テキストはそれからその新しいparagraphに加えられます。
-> document
-> block_quote
paragraph
"Lorem ipsum dolor\nsit amet."
-> list (type=bullet tight=true bullet_char=-)
-> list_item
-> paragraph
"Qui *quodsi iracundia*"
4行目の……
> - aliquando id
……によりlist_item(とその子であるparagraph)が閉じられ、新しいlist_itemがlistの子として開かれます。 paragraphが新しいlist_itemの子として加えられ、そのテキストが含められます。 こうして最終的な木が得られます。
-> document
-> block_quote
paragraph
"Lorem ipsum dolor\nsit amet."
-> list (type=bullet tight=true bullet_char=-)
list_item
paragraph
"Qui *quodsi iracundia*"
-> list_item
-> paragraph
"aliquando id"
いったん入力のすべてが構文解析されれば、すべての開いたブロックが閉じられます。
それから「木を歩き」、つまりすべてのノードを訪れて、段落と見出しの素の文字列の内容を行内として構文解析します。 この時点ですべてのリンク参照定義を見てきたため、参照リンクを進みながら解決していけます。
document
block_quote
paragraph
str "Lorem ipsum dolor"
softbreak
str "sit amet."
list (type=bullet tight=true bullet_char=-)
list_item
paragraph
str "Qui "
emph
str "quodsi iracundia"
list_item
paragraph
str "aliquando id"
なお最初の段落の行末がsoftbreakとして構文解析され、最初のリスト項目の星印がemphになっています。
行内の構文解析の断然手際を要する部分は強調、強い強調、リンク、そして画像の扱いです。 これは以下のアルゴリズムを使ってなされます。
行内を構文解析しており以下のいずれかに当たったとき……
*ないし_の文字、または[または![……これらの記号を文字通りの内容として持つテキストノードを挿入し、このテキストノードへのポインタを区切りスタックに加えます。
区切りスタックは二重リンクリストです。 各要素にはテキストノードへのポインタと、加えて以下についての情報が含まれます。
[、![、*、_)]の文字に当たったとき、 リンクないし画像を探す 手続き(後述)を呼び出します。
入力の終わりに当たったとき、 強調の処理 の手続き(後述)を、stack_bottom = NULLで呼び出します。
区切りスタックの一番上から始めて、スタックを後方へ見て回り開いている[ないし![の区切りを探します。
それが見つからなければ、文字通りのテキストノードの]を返します。
それが見つかり、しかし 活性 でなければ、非活性な区切りをスタックから除いて、文字通りのテキストノードの]を返します。
それが見つかり活性であるならば、その先を構文解析して行内のリンク/画像、参照リンク/画像、縮約参照リンク/画像、ないし簡略参照リンク/画像があるか見ます。
ないならば、開始の区切りを区切りスタックから除いて文字通りのテキストノードの]を返します。
あるならば……
子が開始の区切りにより指されているテキストノードの後にある行内であるリンクないし画像のノードを返します。
[の開始物をstack_bottomとして、これらの行内に 強調の処理 を実行します。
開始の区切りを除きます。
リンク(であって画像でない)があるなら、開始の区切りの前にあるすべての[の区切りも 非活性 に設定します(これによりリンクの範囲内のリンクができることが防がれます)。
引数stack_bottomは区切りスタックでどこまで深く降りていくかの下限を設定します。 NULLなら、ずっと底まで行けます。 さもなければ、stack_bottomを訪れる前に止まります。
current_positionは区切りスタックのstack_bottomのすぐ上の要素(またはstack_bottomがNULLなら最初の要素)を指すようにします。
ここでは各区切りの種別(*、_)についてopeners_bottomを追跡しますが、これらは(3を法とする)閉止の区切り連の長さおよび閉止の区切りが開始物にもなれるかどうかが索引付けされています。 これをstack_bottomに初期化します。
それから以下を潜在的な閉止物が底を尽くまで繰り返します。
区切りスタックで(必要なら)区切りの*ないし_を持つ最初の潜在的な閉止物が見つかるまでcurrent_positionを前に進めます(これは入力の始めに最も近い潜在的な閉止物――構文解析の順番における最初のもの――になります)。
ここまできたら、スタックにおいて(この区切りの種別についてのstack_bottomとopeners_bottomの上に留めつつ)最初の適正な潜在的な開始物を顧みますが、ここで「適正」であるには以下が要求されます。
字句が潜在的に開始物であり、かつ
字句に現在の潜在的な閉止物と同じ区切りの種別があり、かつ
以下のいずれかが真であること。
閉止物が潜在的な開始物でなく開始物が潜在的な閉止物でない、もしくは
閉じる区切りの元の長さが3の倍数である、もしくは
開始の区切り連の元来の長さ+閉止の区切り連の元来の長さが3の倍数でない
何かしら見つかったとき。
強調ないし強い強調があるかどうか調べます。 閉止物と開始物の両方の区域が長さ>=2を持つなら、強いものであり、さもなければ普通のものです。
開始物に照応するテキストノードの後に、強調ないし強い強調のノードをそれに従って挿入します。
開始物と閉止物の間のすべての区切りを区切りスタックから除きます。
(普通の強調の)1つないし(強い強調の)2つの区切りを開始と閉止のテキストノードから除きます。 結果として空になるなら、それらを除いて区切りスタックの照応する要素を除きます。 閉止ノードが除かれれば、スタック中の次の要素を指すcurrent_positionをリセットします。
何も見当たらないとき。
openers_bottomをcurrent_positionの前の要素に設定します(この時点に至るまでまたこの時点を含めてこの種類の閉止物に対する開始物がないことがわかっているため、これにより将来の探索で下限が置かれます)。
current_positionにある閉止物が潜在的な開始物でなければ、(いずれにしても閉止物になれないとわかっているため)区切りスタックから除きます。
current_positionをスタックの次の要素に進めます。
終わった後は、区切りスタックからstack_bottomの上のすべての区切りを除きます。
本文書はCommonMark Specの日本語訳です。 本文書の使用許諾は原文と同様にCC-BY-SA 4.0のもとに頒布されます。 本訳に係る著作情報は以下の通りです。
Copyright (C) 2026 gemmaro gemmaro.dev@gmail.com.
本訳に先駆けて以下の訳がなされていました。 本訳の作成にあたり主に訳語等に関してそれらを参照したところがあります。 なおメールアドレス中の「at」は「@」に読みかえてください。