CommonMarkの仕様

バージョン 0.31.2 (2024-01-28)
John MacFarlane
Creative Commons BY-SA
CommonMarkの仕様John MacFarlaneによる作品であり、使用許諾Creative Commons Attribution-ShareAlike 4.0 International Licenseのもとに頒布されます。

1はしがき

1.1マークダウンとは

マークダウンは構造化された文書を書くためのプレーンテキスト形式であり、電子メールや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版は、おそらくは、より書きやすいです。 字下げについて気にする必要はありません。 しかしマークダウン版の方がずっと読みやすいです。 リスト項目の入れ子は、処理された文書のみならず、ソースにおいても目に明らかです。

1.2なぜ仕様が必要とされているのか

John Gruber氏のマークダウンの構文の正典的な説明では構文が曖昧さなく規定されていません。 以下は説明で答えていない質問の例です。

  1. 副リストにどのくらい字下げが必要ですか? 仕様には継続する段落は4つの空白文字で字下げする必要があると書かれていますが、副リストについては完全には明示的ではありません。 こちらもそうなっている、つまり4つの空白文字で字下げしなければならない、と考えるのが自然ですが、Markdown.plでは要求されていません。 これはおよそ「重箱の隅をつつくような場合」ではなく、この問題についての実装間の乖離によりしばしば実際の文書において利用者を驚かせることにつながっています(John Gruber氏によるこちらの見解を参照)。

  2. ブロック引用ないし見出しの前に空行は必要ですか? ほとんどの実装で空行は要求されません。 しかしながら、これにより強く折り返されたテキストでの予期しない結果や、構文解析における曖昧さにもつながることがあります(なお見出しをブロック引用内に置く実装もある一方で、そうしないものもあります)(John Gruber氏も空行を要求することを支持すると語っていました)。

  3. 字下げコードブロックの前に空行は必要ですか? (Markdown.plでは要求されますが、文書では言及されておらず、これを要求しない実装があります)

    paragraph
        code?
    
  4. リスト項目が<p>タグに囲まれるか判定する厳密な規則は何ですか? リストは部分的に「ゆるやか」で部分的に「窮屈」にできますか? そのようなリストについてどうするべきですか?

    1. one
    
    2. two
    3. three
    

    あるいは以下はどうでしょう?

    1.  one
        - a
    
        - b
    2.  two
    

    (John Gruber氏による関連する見解はこちらにあります)

  5. リストの印は字下げできますか? 順序付きリストの印は右揃えにできますか?

     8. item 1
     9. item 2
    10. item 2a
    
  6. 以下は2つ目の項目の中に主題分割がある1つのリストでしょうか、それとも主題分割で別れた2つのリストでしょうか?

    * a
    * * * * *
    * b
    
  7. リストの印が数字から中黒に変わるとき、2つのリストと1つのリストのどちらになりますか? (マークダウンの構文の説明では2つの方が示唆されていますが、perlスクリプトとその他多くの実装では1つ生成されます)

    1. fee
    2. fie
    -  foe
    -  fum
    
  8. 行内の構造の印のための優先度の規則は何ですか? 例えば、以下は適正なリンクでしょうか、それともコード区域が優先するのでしょうか?

    [a backtick (`)](/url) and [another backtick (`)](/url).
    
  9. 強調と強い強調の印の優先度の規則は何ですか? 例えば以下はどのように構文解析するべきですか?

    *foo *bar* baz*
    
  10. ブロックの水準と行内の水準の構造の間の優先度の規則は何ですか? 例えば、以下はどのように構文解析すべきですか?

    - `a long code span can contain a hyphen like this
      - and it can screw things up`
    
  11. リストの項目に節の見出しを含められますか? (Markdown.plでは許されていませんが、ブロック引用に見出しを含めることは許されています)

    - # Heading
    
  12. リスト項目は空にできるのでしょうか。

    * a
    *
    * b
    
  13. リンク参照はブロック引用やリスト項目の内側で定義できますか?

    > Blockquote [foo].
    >
    > [foo]: /url
    
  14. 同じ参照に複数の定義があるなら、どちらが優先しますか?

    [foo]: /url1
    [foo]: /url2
    
    [foo][]
    

仕様が欠落していたときは、早期の実装者達はこうした曖昧さを解決するためにMarkdown.plをあたりました。 しかしMarkdown.plはかなり不具合だらけだったことと、多くの事例で明らかに悪い結果になったために、満足のいく仕様の代わりではありませんでした。

曖昧さのない仕様がないために、実装は著しく乖離してきました。 結果として、あるシステム(例えば、GitHubのウィキ)の方法で呈示される文書が別のもの(例えば、pandocを使ってdocbookに変換したもの)では違って呈示されることに利用者はしばしば驚かされます。 問題をさらに悪くすることに、マークダウンでは「構文の誤り」と見なすものが何もないために、そうした乖離がすぐ発覚しないことはよくあります。

1.3本文書について

本文書ではマークダウンの構文を曖昧さなく規定することを試みます。 マークダウンと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(これはさらに他の形式に変換できます)に変換できます。

例では、タブ文字を表現するためにを用います。

2下準備

2.1文字と行

文字の任意の系列は適正な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(記号)の一般分類にある文字です。

2.2タブ

行内のタブは空白文字に展開されません。 しかしながら、ブロックの構造を定義する上で空白が役に立つ文脈においては、タブはあたかも4文字のタブ位置の空白で置き換わったように働きます。

したがって、例えば、字下げコードブロックにおいて4つの空白の代わりにタブが使えます(なお、しかしながら、内部のタブは文字通りのタブとして素通りし、空白に展開されません)。

例 1やってみよう
→foo→baz→→bim
<pre><code>foo→baz→→bim
</code></pre>
例 2やってみよう
  →foo→baz→→bim
<pre><code>foo→baz→→bim
</code></pre>
例 3やってみよう
    a→a
    ὐ→a
<pre><code>a→a
ὐ→a
</code></pre>

以下の例では、リストの項目の継続する段落がタブで字下げされています。 これは4つの空白で字下げした場合のものとまったく同じ効果があります。

例 4やってみよう
  - foo

→bar
<ul>
<li>
<p>foo</p>
<p>bar</p>
</li>
</ul>
例 5やってみよう
- foo

→→bar
<ul>
<li>
<p>foo</p>
<pre><code>  bar
</code></pre>
</li>
</ul>

通常はブロック引用を開始する>には省略可能な1つの空白文字を後に続けて構いませんが、これは内容の一部とは見なされません。 以下の事例では>にタブが後に続いており、これはあたかも3つの空白に展開されたように扱われます。 これらの空白のうち1つは区切りの一部と見なされるため、fooはブロック引用の文脈内では6つの空白で字下げされたものと見なされ、そのため2つの空白で始まる字下げコードブロックになります。

例 6やってみよう
>→→foo
<blockquote>
<pre><code>  foo
</code></pre>
</blockquote>
例 7やってみよう
-→→foo
<ul>
<li>
<pre><code>  foo
</code></pre>
</li>
</ul>
例 8やってみよう
    foo
→bar
<pre><code>foo
bar
</code></pre>
例 9やってみよう
 - foo
   - bar
→ - baz
<ul>
<li>foo
<ul>
<li>bar
<ul>
<li>baz</li>
</ul>
</li>
</ul>
</li>
</ul>
例 10やってみよう
#→Foo
<h1>Foo</h1>
例 11やってみよう
*→*→*→
<hr />

2.3安全でない文字

安全上の理由のため、ユニコード文字U+0000はREPLACEMENT CHARACTER (U+FFFD) で置き換えなければなりません。

2.4バックスラッシュのエスケープ

あらゆるアスキーの約物文字は、バックスラッシュでエスケープできます。

例 12やってみよう
\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~
<p>!&quot;#$%&amp;'()*+,-./:;&lt;=&gt;?@[\]^_`{|}~</p>

他の文字の前のバックスラッシュは文字通りのバックスラッシュとして扱われます。

例 13やってみよう
\→\A\a\ \3\φ\«
<p>\→\A\a\ \3\φ\«</p>

エスケープされた文字は普通の文字として扱われ通常のマークダウンの意味はありません。

例 14やってみよう
\*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>*not emphasized*
&lt;br/&gt; not a tag
[not a link](/foo)
`not code`
1. not a list
* not a list
# not a heading
[foo]: /url &quot;not a reference&quot;
&amp;ouml; not a character entity</p>

バックスラッシュ自体がエスケープされれば後に続く文字はエスケープされません。

例 15やってみよう
\\*emphasis*
<p>\<em>emphasis</em></p>

行の終わりのバックスラッシュは固い改行です。

例 16やってみよう
foo\
bar
<p>foo<br />
bar</p>

バックスラッシュのエスケープはコードブロック、コード区域、自動リンク、素のHTMLの中では働きません。

例 17やってみよう
`` \[\` ``
<p><code>\[\`</code></p>
例 18やってみよう
    \[\]
<pre><code>\[\]
</code></pre>
例 19やってみよう
~~~
\[\]
~~~
<pre><code>\[\]
</code></pre>
例 20やってみよう
<https://example.com?find=\*>
<p><a href="https://example.com?find=%5C*">https://example.com?find=\*</a></p>
例 21やってみよう
<a href="/bar\/)">
<a href="/bar\/)">

しかしURLとリンク題、リンク参照、有塀コードブロックにおける情報文字列を含む、その他すべての文脈では働きます。

例 22やってみよう
[foo](/bar\* "ti\*tle")
<p><a href="/bar*" title="ti*tle">foo</a></p>
例 23やってみよう
[foo]

[foo]: /bar\* "ti\*tle"
<p><a href="/bar*" title="ti*tle">foo</a></p>
例 24やってみよう
``` foo\+bar
foo
```
<pre><code class="language-foo+bar">foo
</code></pre>

2.5実体と、数値による文字参照

適正なHTMLの実体参照と数値的な文字参照は照応するユニコード文字の代わりに使えますが、以下の例外があります。

CommonMarkに準拠する構文解析器では特定の文字がソースにおいてユニコード文字ないし実体参照を使って表されていたかどうかについての情報を保管する必要はありません。

実体参照&と任意の適正なHTML5の実体名と;からなります。 文書https://html.spec.whatwg.org/entities.jsonが適正な実体参照とそれらに照応する符号位置のための権威的なソースとして使われます。

例 25やってみよう
&nbsp; &amp; &copy; &AElig; &Dcaron;
&frac34; &HilbertSpace; &DifferentialD;
&ClockwiseContourIntegral; &ngE;
<p>  &amp; © Æ Ď
¾  ⅆ
∲ ≧̸</p>

10進数の数値的な文字参照&#と1から7までのアラビア数字の文字列と;からなります。 数値的な文字参照はそれに照応するユニコード文字として構文解析されます。 不適正なユニコードの符号位置はREPLACEMENT CHARACTER (U+FFFD) で置き換わります。 安全上の理由のため、符号位置U+0000もまたU+FFFDで置き換わります。

例 26やってみよう
&#35; &#1234; &#992; &#0;
<p># Ӓ Ϡ �</p>

16進数の数値的な文字参照&#Xないしxのいずれかと1個から6個の16進数の数字の文字列と;からなります。 これらも照応するユニコード文字として構文解析されます(こちらでは10進数ではなく16進数の数値で指定されています)。

例 27やってみよう
&#X22; &#XD06; &#xcab;
<p>&quot;  ಫ</p>

以下は実体でないものです。

例 28やってみよう
&nbsp &x; &#; &#x;
&#87654321;
&#abcdef0;
&ThisIsNotDefined; &hi?;
<p>&amp;nbsp &amp;x; &amp;#; &amp;#x;
&amp;#87654321;
&amp;#abcdef0;
&amp;ThisIsNotDefined; &amp;hi?;</p>

HTML5では(&copyのような)末尾のセミコロンのない実体参照を一部受け付けていますが、文法が曖昧すぎるものになるため、ここではこれらは認識されません。

例 29やってみよう
&copy
<p>&amp;copy</p>

HTML5の名前付きの実体の一覧にない文字列も実体参照として認識されません。

例 30やってみよう
&MadeUpEntity;
<p>&amp;MadeUpEntity;</p>

実体と数値的な文字参照は、URL、リンク題有塀コードブロック情報文字列を含めて、コード区域ないしコードブロックを除くあらゆる文脈で認識されます。

例 31やってみよう
<a href="&ouml;&ouml;.html">
<a href="&ouml;&ouml;.html">
例 32やってみよう
[foo](/f&ouml;&ouml; "f&ouml;&ouml;")
<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
例 33やってみよう
[foo]

[foo]: /f&ouml;&ouml; "f&ouml;&ouml;"
<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
例 34やってみよう
``` f&ouml;&ouml;
foo
```
<pre><code class="language-föö">foo
</code></pre>

実体と数値的な文字参照はコード区域とコードブロックでは文字通りのテキストとして扱われます。

例 35やってみよう
`f&ouml;&ouml;`
<p><code>f&amp;ouml;&amp;ouml;</code></p>
例 36やってみよう
    f&ouml;f&ouml;
<pre><code>f&amp;ouml;f&amp;ouml;
</code></pre>

実体と数値的な文字参照はCommonMarkの文書における構造を示す記号の代わりとしては使えません。

例 37やってみよう
&#42;foo&#42;
*foo*
<p>*foo*
<em>foo</em></p>
例 38やってみよう
&#42; foo

* foo
<p>* foo</p>
<ul>
<li>foo</li>
</ul>
例 39やってみよう
foo&#10;&#10;bar
<p>foo

bar</p>
例 40やってみよう
&#9;foo
<p>→foo</p>
例 41やってみよう
[a](url &quot;tit&quot;)
<p>[a](url &quot;tit&quot;)</p>

3ブロックと行内

文書はブロック――段落や、ブロック引用や、リストや、見出しや、区切り線や、コードブロックといった構造的な要素――の系列と見なせます。 ブロックの中には(ブロック引用やリスト項目のように)別のブロックを含むものもあります。 他の(見出しや段落といった)ものは行内の内容――テキストや、リンクや、強調されたテキストや、画像や、コード区域、その他諸々――を含みます。

3.1優先順位

ブロックの構造の標識は行内の構造の標識に常に優先します。 そのため、例えば、以下は2つの項目を持つリストであり、コード区域を含む1つの項目を持つリストではありません。

例 42やってみよう
- `one
- two`
<ul>
<li>`one</li>
<li>two`</li>
</ul>

この意味するところは構文解析を2つの工程で進められるということです。 1番目で、文書のブロックの構造が見分けられます。 2番目で、段落、見出し、その他のブロックの構築要素の内側のテキストの行を行内の構造のために構文解析できます。 2番目の工程では1番目の工程が終わってからのみ使えるリンク参照定義についての情報が必要です。 なお1番目の工程では行を順番に処理することが要求されますが、あるブロック要素の行内の構文解析は他のどの要素の行内の構文解析にも影響しないため、2番目は並列化できます。

3.2入れ物ブロックと葉ブロック

ブロックは2種類に分けることができ、入れ物ブロックという、別のブロックを含められるものと、葉ブロックという、含められないものがあります。

4葉ブロック

本節ではマークダウンの文書を形作る様々な種類の葉ブロックについて記述します。

4.1主題分割について

省略可能な3つまでの字下げの空白に、3つ以上の相等しい-_*の文字の系列が後に続き、そのそれぞれの文字に省略可能な任意の数の空白ないしタブが後に続くものからなる行は、主題分割を形成します。

例 43やってみよう
***
---
___
<hr />
<hr />
<hr />

以下は間違った文字です。

例 44やってみよう
+++
<p>+++</p>
例 45やってみよう
===
<p>===</p>

以下は文字が足りません。

例 46やってみよう
--
**
__
<p>--
**
__</p>

3つ以内の字下げは許容されます。

例 47やってみよう
 ***
  ***
   ***
<hr />
<hr />
<hr />

4文字分の空白の字下げは多過ぎます。

例 48やってみよう
    ***
<pre><code>***
</code></pre>
例 49やってみよう
Foo
    ***
<p>Foo
***</p>

3文字より多く使っても構いません。

例 50やってみよう
_____________________________________
<hr />

文字の間に、空白またはタブを書くことができます。

例 51やってみよう
 - - -
<hr />
例 52やってみよう
 **  * ** * ** * **
<hr />
例 53やってみよう
-     -      -      -
<hr />

終端にある空白とタブは許容されます。

例 54やってみよう
- - - -    
<hr />

しかしながら、その他の文字はその行に現れてはなりません。

例 55やってみよう
_ _ _ _ a

a------

---a---
<p>_ _ _ _ a</p>
<p>a------</p>
<p>---a---</p>

空白ないしタブ以外のすべての文字は同じであることが要求されます。 そのため、以下は主題分割ではありません。

例 56やってみよう
 *-*
<p><em>-</em></p>

主題分割の前後に空行は要りません。

例 57やってみよう
- foo
***
- bar
<ul>
<li>foo</li>
</ul>
<hr />
<ul>
<li>bar</li>
</ul>

主題分割は段落に割り込めます。

例 58やってみよう
Foo
***
bar
<p>Foo</p>
<hr />
<p>bar</p>

主題分割であるための上述の条件に合うダッシュの行がsetext見出しの下線としても解釈できるならば、setext見出しとしての解釈が優先します。 したがって、例えば、以下はsetext見出しであって、段落に主題分割が続いたものではありません。

例 59やってみよう
Foo
---
bar
<h2>Foo</h2>
<p>bar</p>

主題分割とリスト項目の両方がとある行の取り得る解釈であるとき、主題分割が優先します。

例 60やってみよう
* Foo
* * *
* Bar
<ul>
<li>Foo</li>
</ul>
<hr />
<ul>
<li>Bar</li>
</ul>

リスト項目に主題分割を入れたいときは、別のリスト記号を使います。

例 61やってみよう
- Foo
- * * *
<ul>
<li>Foo</li>
<li>
<hr />
</li>
</ul>

4.2ATX見出しについて

ATX見出しは1文字以上の文字の文字列からなるものであって、その文字列は行内の内容として構文解析されるもので、またその文字列は1個から6個のエスケープされていない#の文字の開始の系列とエスケープされていない#の文字の任意の数の省略可能な閉止の系列の間にあるものです。 #の文字の開始の系列には空白ないしタブ、ないし行の終わりが続かなければなりません。 #の省略可能な閉止の系列には空白ないしタブが前に付いていなければならず空白ないしタブのみ後に続いていて構いません。 開始の#の文字には3つまで字下げの空白が前に付いていて構いません。 見出しの素の内容は行内の内容として構文解析される前に先頭と末尾の空白ないしタブが切り詰められます。 見出しの水準は開始の系列における#の文字の数に等しいです。

以下は単純な見出しです。

例 62やってみよう
# 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つ以上の#記号は見出しになりません。

例 63やってみよう
####### foo
<p>####### foo</p>

少なくとも1つの空白ないしタブが#の文字と見出しの内容の間に要求されますが、見出しが空のときはその限りではありません。 なお多くの実装で現在は空白を要求していません。 しかしながら、空白は元来のATXの実装により要求されていたのであり、以下のようなものが見出しとして構文解析されることを防ぐのに役立ちます。

例 64やってみよう
#5 bolt

#hashtag
<p>#5 bolt</p>
<p>#hashtag</p>

以下は見出しではありませんが、それは最初の#がエスケープされているからです。

例 65やってみよう
\## foo
<p>## foo</p>

内容は行内として解析されます。

例 66やってみよう
# foo *bar* \*baz\*
<h1>foo <em>bar</em> *baz*</h1>

先頭と末尾の空白ないしタブは行内の内容を構文解析する上で無視されます。

例 67やってみよう
#                  foo                     
<h1>foo</h1>

3つ以内の字下げは許容されます。

例 68やってみよう
 ### foo
  ## foo
   # foo
<h3>foo</h3>
<h2>foo</h2>
<h1>foo</h1>

4文字分の空白の字下げは多過ぎます。

例 69やってみよう
    # foo
<pre><code># foo
</code></pre>
例 70やってみよう
foo
    # bar
<p>foo
# bar</p>

#の文字の閉止の系列は省略可能です。

例 71やってみよう
## foo ##
  ###   bar    ###
<h2>foo</h2>
<h3>bar</h3>

開始の並びと同じ長さである必要はありません。

例 72やってみよう
# foo ##################################
##### foo ##
<h1>foo</h1>
<h5>foo</h5>

閉止の系列の後では空白ないしタブが許容されます。

例 73やってみよう
### foo ###     
<h3>foo</h3>

#の文字の系列に空白ないしタブ以外の任意のものが続いたものは閉止の系列ではありませんが、見出しの内容の一部として見なされます。

例 74やってみよう
### foo ### b
<h3>foo ### b</h3>

閉止の系列には空白ないしタブが前に付かなければなりません。

例 75やってみよう
# foo#
<h1>foo#</h1>

バックスラッシュでエスケープされた#の文字は閉止の系列の一部と見なされません。

例 76やってみよう
### foo \###
## foo #\##
# foo \#
<h3>foo ###</h3>
<h2>foo ###</h2>
<h1>foo #</h1>

ATX見出しはそれを取り巻く内容から空行で別れている必要はなく、段落に割り込めます。

例 77やってみよう
****
## foo
****
<hr />
<h2>foo</h2>
<hr />
例 78やってみよう
Foo bar
# baz
Bar foo
<p>Foo bar</p>
<h1>baz</h1>
<p>Bar foo</p>

ATX見出しは空にできます。

例 79やってみよう
## 
#
### ###
<h2></h2>
<h1></h1>
<h3></h3>

4.3Setext見出し

setext見出しは1つ以上のテキストの行からなるものであって、空行に割り込れておらず、その最初の行には3つを越える字下げの空白がなく、setext見出しの下線が後に続きます。 この1つ以上のテキストの行というのは、もしsetext見出しの下線が後に続いていなかったとしたら、段落として解釈されていたであろうものでなければならず、コード塀ATX見出しブロック引用主題分割リスト項目HTMLブロックといったものに解釈できるものにはできません。

setext見出しの下線=の文字の系列か-の文字の系列であって、3つを越えない字下げの空白があり任意の数の末尾の空白ないしタブがあります。

=の文字がsetext見出しの下線で使われるなら見出しは水準が1の見出しであり、-の文字が使われるならば水準が2の見出しです。 見出しの内容はその前に付いている1つ以上のテキストの行をCommonMarkの行内の内容として構文解析した結果です。

一般に、setext見出しには空行を前に付けたり後に続けたりする必要はありません。 しかしながら、段落に割り込むことはできないため、setext見出しが段落の後にくるときは、空行がそれらの間に必要です。

以下は単純な例です。

例 80やってみよう
Foo *bar*
=========

Foo *bar*
---------
<h1>Foo <em>bar</em></h1>
<h2>Foo <em>bar</em></h2>

見出しの内容は1行を超えてわたっても構いません。

例 81やってみよう
Foo *bar
baz*
====
<h1>Foo <em>bar
baz</em></h1>

内容は見出しの素の内容を行内として構文解析した結果です。 見出しの素の内容はこの1つ以上の行を連結して先頭と末尾の空白ないしタブを除いたものから形成されます。

例 82やってみよう
  Foo *bar
baz*→
====
<h1>Foo <em>bar
baz</em></h1>

下線はどんな長さにもできます。

例 83やってみよう
Foo
-------------------------

Foo
=
<h2>Foo</h2>
<h1>Foo</h1>

見出しの内容には3つまで字下げの空白を前に付けることができ、下線に揃える必要はありません。

例 84やってみよう
   Foo
---

  Foo
-----

  Foo
  ===
<h2>Foo</h2>
<h2>Foo</h2>
<h1>Foo</h1>

4文字分の空白の字下げは多過ぎます。

例 85やってみよう
    Foo
    ---

    Foo
---
<pre><code>Foo
---

Foo
</code></pre>
<hr />

setext見出しの下線には3つまで字下げの空白を前に付けることができ、末尾に空白ないしタブがあって構いません。

例 86やってみよう
Foo
   ----      
<h2>Foo</h2>

4文字分の空白の字下げは多過ぎます。

例 87やってみよう
Foo
    ---
<p>Foo
---</p>

setext見出しの下線には内部に空白ないしタブを含められません。

例 88やってみよう
Foo
= =

Foo
--- -
<p>Foo
= =</p>
<p>Foo</p>
<hr />

内容の行にある末尾の空白ないしタブにより固い改行になることはありません。

例 89やってみよう
Foo  
-----
<h2>Foo</h2>

終わりにバックスラッシュがあっても同じです。

例 90やってみよう
Foo\
----
<h2>Foo\</h2>

ブロックの構造の標識が行内の構造の標識に優先するため、以下はsetext見出しです。

例 91やってみよう
`Foo
----
`

<a title="a lot
---
of dashes"/>
<h2>`Foo</h2>
<p>`</p>
<h2>&lt;a title=&quot;a lot</h2>
<p>of dashes&quot;/&gt;</p>

setext見出しの下線はリスト項目ないしブロック引用では不精な継続行になれません。

例 92やってみよう
> Foo
---
<blockquote>
<p>Foo</p>
</blockquote>
<hr />
例 93やってみよう
> foo
bar
===
<blockquote>
<p>foo
bar
===</p>
</blockquote>
例 94やってみよう
- Foo
---
<ul>
<li>Foo</li>
</ul>
<hr />

段落と後に続くsetext見出しの間には空行が必要ですが、これはさもなければ段落が見出しの内容の一部になるためです。

例 95やってみよう
Foo
Bar
---
<h2>Foo
Bar</h2>

しかし一般にはsetext見出しの前後に空行は要求されません。

例 96やってみよう
---
Foo
---
Bar
---
Baz
<hr />
<h2>Foo</h2>
<h2>Bar</h2>
<p>Baz</p>

setext見出しは空にできません。

例 97やってみよう

====
<p>====</p>

setext見出しの1行以上のテキストの行は段落以外のブロックの構築要素として解釈できるものであってはなりません。 そのため、以下の例におけるダッシュの行は主題分割として解釈されます。

例 98やってみよう
---
---
<hr />
<hr />
例 99やってみよう
- foo
-----
<ul>
<li>foo</li>
</ul>
<hr />
例 100やってみよう
    foo
---
<pre><code>foo
</code></pre>
<hr />
例 101やってみよう
> foo
-----
<blockquote>
<p>foo</p>
</blockquote>
<hr />

> fooを文字通りのテキストとして持つ見出しにしたければ、バックスラッシュのエスケープが使えます。

例 102やってみよう
\> foo
------
<h2>&gt; foo</h2>

互換性の補足: ほとんどの既存のマークダウンの実装ではsetext見出しのテキストが複数行にわたることを許容していません。 しかし次のものをどう解釈するかについての総意は何もありません。

Foo
bar
---
baz

4つの異なる解釈を取れます。

  1. 段落「Foo」、見出し「bar」、段落「baz」
  2. 段落「Foo bar」、主題分割、段落「baz」
  3. 段落「Foo bar — baz」
  4. 見出し「Foo bar」、段落「baz」

私達は解釈4が最も自然に感じており、解釈4では、複数行の見出しが許容されることにより、CommonMarkの表現力が増します。 解釈1にしたい執筆者は最初の段落の後に空行を置けます。

例 103やってみよう
Foo

bar
---
baz
<p>Foo</p>
<h2>bar</h2>
<p>baz</p>

2つ目の解釈にしたい執筆者は主題分割の周りに空行を置けます。

例 104やってみよう
Foo
bar

---

baz
<p>Foo
bar</p>
<hr />
<p>baz</p>

あるいは次のように、setext見出しの下線として見なせない主題分割を使えます。

例 105やってみよう
Foo
bar
* * *
baz
<p>Foo
bar</p>
<hr />
<p>baz</p>

解釈3にしたい執筆者はバックスラッシュのエスケープを使えます。

例 106やってみよう
Foo
bar
\---
baz
<p>Foo
bar
---
baz</p>

4.4字下げコードブロックについて

字下げコードブロックは空行で別れた1つ以上の字下げされた塊からなります。 字下げされた塊は空でない行の系列であって、それぞれの行には4つ以上の字下げの空白が前に付きます。 コードブロックの内容はその行の文字通りの内容であって、末尾の行末を含み、4つの字下げの空白は差し引かれます。 字下げコードブロックには情報文字列はありません。

字下げコードブロックは段落に割り込めないため、段落とその後に続く字下げコードブロックの間に空行がなければなりません(コードブロックとその後に続く段落の間には、しかしながら、空行は必要ありません)。

例 107やってみよう
    a simple
      indented code block
<pre><code>a simple
  indented code block
</code></pre>

字下げの解釈にコードブロックとするものとその構成物がリスト項目に属することを示すものとの間で曖昧さがあるならば、リスト項目の解釈が優先します。

例 108やってみよう
  - foo

    bar
<ul>
<li>
<p>foo</p>
<p>bar</p>
</li>
</ul>
例 109やってみよう
1.  foo

    - bar
<ol>
<li>
<p>foo</p>
<ul>
<li>bar</li>
</ul>
</li>
</ol>

コードブロックの内容は文字通りのテキストであり、マークダウンとして構文解析されません。

例 110やってみよう
    <a/>
    *hi*

    - one
<pre><code>&lt;a/&gt;
*hi*

- one
</code></pre>

以下は空行で分かれた3つの塊です。

例 111やってみよう
    chunk1

    chunk2
  
 
 
    chunk3
<pre><code>chunk1

chunk2



chunk3
</code></pre>

4つの字下げの空白を越えるあらゆる先頭の空白ないしタブはその内容に含まれることになり、空行内でもそうです。

例 112やってみよう
    chunk1
      
      chunk2
<pre><code>chunk1
  
  chunk2
</code></pre>

字下げコードブロックは段落に割り込めません(これによりぶら下がりの字下げなどが許容されます)。

例 113やってみよう
Foo
    bar
<p>Foo
bar</p>

しかしながら、4つより少ない字下げの空白を持つあらゆる空でない行によりコードブロックは直ちに終わります。 そのため段落は字下げされたコードの直後に現れて構いません。

例 114やってみよう
    foo
bar
<pre><code>foo
</code></pre>
<p>bar</p>

また字下げされたコードはその他の種類のブロックの直前と直後に出現させられます。

例 115やってみよう
# Heading
    foo
Heading
------
    foo
----
<h1>Heading</h1>
<pre><code>foo
</code></pre>
<h2>Heading</h2>
<pre><code>foo
</code></pre>
<hr />

最初の行の前には、字下げの空白が4つ以上あっても構いません。

例 116やってみよう
        foo
    bar
<pre><code>    foo
bar
</code></pre>

字下げコードブロックの前に付いたり後に続いたりする空行はそのブロックに含まれません。

例 117やってみよう

    
    foo
    
<pre><code>foo
</code></pre>

末尾の空白ないしタブは、コードブロックの内容に含まれます。

例 118やってみよう
    foo  
<pre><code>foo  
</code></pre>

4.5有塀コードブロックについて

コード塀とは少なくとも3つの連続する抑音符の文字 (`) ないしチルダ (~) の系列です(チルダと抑音符は混ぜられません)。 有塀コードブロックはコード塀で始まり、3つまでの字下げの空白が前に付きます。

開始のコード塀のある行にはコード塀の後に続けて省略可能な何らかのテキストを含めても構いません。 このテキストは先頭と末尾の空白ないしタブが切り詰められて情報文字列と呼ばれます。 情報文字列が抑音符の塀の後に来るなら、抑音符の文字を一切含んではなりません(この制限のある理由はさもなければ行内コードが誤って有塀コードブロックの開始として解釈されるものがあるだろうからです)。

コードブロックの内容はすべての後続する行からなり、コードブロックが始まったものと同じ種類の(抑音符かチルダの)閉止のコード塀までであって、そのコード塀には少なくとも開始のコード塀と同じだけの抑音符ないしチルダがあります。 先頭のコード塀にN個の字下げの空白が前に付いているならば、内容の各行からN個までの字下げの空白が(あるなら)除かれます(内容の行が字下げされていなければ、変わらないまま保持されます。 N個の空白より少なく字下げされていれば、すべての字下げが除かれます)。

閉止のコード塀には3つまで字下げの空白が前に付いていて構わず、また空白ないしタブのみ後に続いていて構いませんが、これは無視されます。 これを含むブロック(または文書)の終わりに達して閉止のコード塀が見当たらなかったなら、コードブロックには開始のコード塀の後からこれを含むブロック(または文書)の終わりまでのすべての行が含まれます(代わる仕様として閉止のコード塀が見当たらない事象があったときに後戻りの解析を要求することもあったでしょう。 しかしこれでは構文解析がずっと効率的でなくなり、またここで記述されている挙動についての実際の欠陥はないように思われます)。

有塀コードブロックは段落に割り込んで構いませんし、前後のいずれにも空行を要求しません。

コード塀の内容は文字通りのテキストとして扱われ、行内として構文解析されません。 情報文字列の最初の単語は通例としてコードの見本の言語を指定するために使われており、codeタグのclass属性に呈示されます。 しかしながら、本仕様では情報文字列の特定の扱いを何ら義務付けません。

以下は抑音符を伴う単純な例です。

例 119やってみよう
```
<
 >
```
<pre><code>&lt;
 &gt;
</code></pre>

以下ではチルダが使われています。

例 120やってみよう
~~~
<
 >
~~~
<pre><code>&lt;
 &gt;
</code></pre>

3つより少ない抑音符は不充分です。

例 121やってみよう
``
foo
``
<p><code>foo</code></p>

閉止のコード塀では開始の塀と同じ文字を使わなければなりません。

例 122やってみよう
```
aaa
~~~
```
<pre><code>aaa
~~~
</code></pre>
例 123やってみよう
~~~
aaa
```
~~~
<pre><code>aaa
```
</code></pre>

閉止のコード塀は、開始の塀と少なくとも同じ長さでなければなりません。

例 124やってみよう
````
aaa
```
``````
<pre><code>aaa
```
</code></pre>
例 125やってみよう
~~~~
aaa
~~~
~~~~
<pre><code>aaa
~~~
</code></pre>

閉じられていないコードブロックは文書の終わり(またはそれを取り囲むブロック引用またはリスト項目)で閉じられます。

例 126やってみよう
```
<pre><code></code></pre>
例 127やってみよう
`````

```
aaa
<pre><code>
```
aaa
</code></pre>
例 128やってみよう
> ```
> aaa

bbb
<blockquote>
<pre><code>aaa
</code></pre>
</blockquote>
<p>bbb</p>

コードブロックの内容は、すべて空行でも構いません。

例 129やってみよう
```

  
```
<pre><code>
  
</code></pre>

コードブロックは空でも構いません。

例 130やってみよう
```
```
<pre><code></code></pre>

塀は字下げできます。 開始の塀が字下げされているなら、内容の行にそれと等しい開始の字下げがもしあるなら除かれます。

例 131やってみよう
 ```
 aaa
aaa
```
<pre><code>aaa
aaa
</code></pre>
例 132やってみよう
  ```
aaa
  aaa
aaa
  ```
<pre><code>aaa
aaa
aaa
</code></pre>
例 133やってみよう
   ```
   aaa
    aaa
  aaa
   ```
<pre><code>aaa
 aaa
aaa
</code></pre>

4文字分の空白の字下げは多過ぎます。

例 134やってみよう
    ```
    aaa
    ```
<pre><code>```
aaa
```
</code></pre>

閉止の塀には3つまでの字下げの空白が前に付いていて構いませんし、その字下げは開始の塀のそれと合致する必要はありません。

例 135やってみよう
```
aaa
  ```
<pre><code>aaa
</code></pre>
例 136やってみよう
   ```
aaa
  ```
<pre><code>aaa
</code></pre>

以下は閉止の塀ではありませんが、それは4つの空白で字下げされているからです。

例 137やってみよう
```
aaa
    ```
<pre><code>aaa
    ```
</code></pre>

(開始及び閉止の)コード塀には、その中に空白ないしタブを含められません。

例 138やってみよう
``` ```
aaa
<p><code> </code>
aaa</p>
例 139やってみよう
~~~~~~
aaa
~~~ ~~
<pre><code>aaa
~~~ ~~
</code></pre>

有塀コードブロックは段落に割り込むことができ、間に空行なく、段落を直接後に続けられます。

例 140やってみよう
foo
```
bar
```
baz
<p>foo</p>
<pre><code>bar
</code></pre>
<p>baz</p>

その他のブロックについても空行を差し挟むことなく有塀コードブロックの前後に出現させられます。

例 141やってみよう
foo
---
~~~
bar
~~~
# baz
<h2>foo</h2>
<pre><code>bar
</code></pre>
<h1>baz</h1>

情報文字列は開始のコード塀の後に与えることができます。 本仕様では情報文字列の特定の扱いを義務付けはしませんが、最初の単語は通例ではコードブロックの言語を指定するために使われます。 HTMLの出力では、言語は普通code要素に対してlanguage-に言語の名前を後に続けたものからなるクラスを加えることで示されます。

例 142やってみよう
```ruby
def foo(x)
  return 3
end
```
<pre><code class="language-ruby">def foo(x)
  return 3
end
</code></pre>
例 143やってみよう
~~~~    ruby startline=3 $%@#$
def foo(x)
  return 3
end
~~~~~~~
<pre><code class="language-ruby">def foo(x)
  return 3
end
</code></pre>
例 144やってみよう
````;
````
<pre><code class="language-;"></code></pre>

抑音符のコードブロックのための情報文字列には抑音符を含められません。

例 145やってみよう
``` aa ```
foo
<p><code>aa</code>
foo</p>

チルダのコードブロックのための情報文字列には抑音符とチルダを含められます。

例 146やってみよう
~~~ aa ``` ~~~
foo
~~~
<pre><code class="language-aa">foo
</code></pre>

閉止のコード塀には情報文字列を持たせられません。

例 147やってみよう
```
``` aaa
```
<pre><code>``` aaa
</code></pre>

4.6HTMLブロックについて

HTMLブロックとは素のHTMLとして扱われる(そしてHTMLの出力ではエスケープされない)行の集まりです。

7種類のHTMLブロックがあり、その開始と終了の条件で定義できます。 このブロックは(3つまで省略可能な字下げの空白があった後に)開始条件に合う行で始まります。 合致する終了条件に合う最初の後続する行、またはもし終了条件に合う行に遭遇しなければ、文書の最後の行、または現在のHTMLブロックを含む入れ物ブロックの最後の行で終わります。 最初の行が開始条件終了条件の両方に合うなら、ブロックはその行だけを含みます。

  1. 開始条件: 行が文字列<pre<script<style<textarea(大文字と小文字の区別なし)で始まり、空白文字、タブ文字、文字列>、ないし行の終わりが後に続くとき。
    終了条件: 行に終了のタグ</pre></script></style></textarea>(大文字と小文字の区別なし。 開始のタグと合致する必要はありません)を含むとき。

  2. 開始条件: 行が文字列<!--で始まるとき。
    終了条件: 行に文字列-->が含まれるとき。

  3. 開始条件: 行が文字列<?で始まるとき。
    終了条件: 行に文字列?>が含まれるとき。

  4. 開始条件: 行がアスキー文字の後に続く文字列<!で始まるとき。
    終了条件: 行に文字>が含まれるとき。

  5. 開始条件: 行が文字列<![CDATA[で始まるとき。
    終了条件: 行に文字列]]>が含まれるとき。

  6. 開始条件: 行が文字列<ないし</の後に続いて(大文字と小文字を区別しない)文字列addressarticleasidebasebasefontblockquotebodycaptioncentercolcolgroupdddetailsdialogdirdivdldtfieldsetfigcaptionfigurefooterformframeframeseth1h2h3h4h5h6headheaderhrhtmliframelegendlilinkmainmenumenuitemnavnoframesoloptgroupoptionpparamsearchsectionsummarytabletbodytdtfootththeadtitletrtrackulのいずれかがあり、空白文字、タブ文字、行の終わり、文字列>、ないし文字列/>が後に続くもので始まるとき。
    終了条件: 行に空行が後に続くとき。

  7. 開始条件: 行が完全な(prescriptstyletextarea以外の任意のタグ名の)開始タグないし完全な閉止タグで始まり、すべてが単一の行にあって、ゼロ以上の空白文字ないしタブ文字が後に続き、行の終わりが後に続くとき。
    終了条件: 行に空行が後に続くとき。

HTMLブロックは適切な終了条件で閉じられるか、文書ないし他の入れ物ブロックの最後の行まで続きます。 つまり HTMLブロックの範囲内にある 任意のHTMLであってさもなければ開始条件として認識されていたかもしれないものは構文解析器により無視されてそのまま素通りされ、構文解析器の状態を変えることはありません。

例えば、<table>で始まるHTMLブロックの範囲内にある<pre>は構文解析器の状態に影響しませんが、それはそのHTMLブロックが開始条件6において始まったためであって、任意の空行で終わります。 以下には驚かれるかもしれません。

例 148やってみよう
<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ブロックです。

例 149やってみよう
<table>
  <tr>
    <td>
           hi
    </td>
  </tr>
</table>

okay.
<table>
  <tr>
    <td>
           hi
    </td>
  </tr>
</table>
<p>okay.</p>
例 150やってみよう
 <div>
  *hello*
         <foo><a>
 <div>
  *hello*
         <foo><a>

ブロックは終止タグから始めることもできます。

例 151やってみよう
</div>
*foo*
</div>
*foo*

これは、2つのHTMLブロックと、それらに挟まれたマークダウンの段落です。

例 152やってみよう
<DIV CLASS="foo">

*Markdown*

</DIV>
<DIV CLASS="foo">
<p><em>Markdown</em></p>
</DIV>

空白があるであろうところで分かれている限り、最初の行は部分的にできます。

例 153やってみよう
<div id="foo"
  class="bar">
</div>
<div id="foo"
  class="bar">
</div>
例 154やってみよう
<div id="foo" class="bar
  baz">
</div>
<div id="foo" class="bar
  baz">
</div>

開始タグは閉じる必要はありません。

例 155やってみよう
<div>
*foo*

*bar*
<div>
*foo*
<p><em>bar</em></p>

部分的なタグは完全であることさえ必要ありません(悪因悪果)。

例 156やってみよう
<div id="foo"
*hi*
<div id="foo"
*hi*
例 157やってみよう
<div class
foo
<div class
foo

それらしく始まっている限り、先頭のタグは適正なタグである必要さえありません。

例 158やってみよう
<div *???-&&&-<---
*foo*
<div *???-&&&-<---
*foo*

種別6のブロックでは、先頭のタグはそれ自体で行をなす必要はありません。

例 159やってみよう
<div><a href="bar">*foo*</a></div>
<div><a href="bar">*foo*</a></div>
例 160やってみよう
<table><tr><td>
foo
</td></tr></table>
<table><tr><td>
foo
</td></tr></table>

次の空行ないし文書の終わりまでのすべてはHTMLブロックに含まれます。 そのため、後に続く例では、マークダウンのコードブロックやブロック引用のように見えるものは実はHTMLブロックの一部であって、空行ないし文書の終わりに達するまで続きます。

例 161やってみよう
<div></div>
``` c
int x = 33;
```
<div></div>
``` c
int x = 33;
```
例 162やってみよう
<div
> not quoted text
<div
> not quoted text

(6) のブロック水準のタグの一覧に ない タグによるHTMLブロックを始めるためには、最初の行にそのタグのみを置かなければなりません(また完全でなければなりません)。

例 163やってみよう
<a href="foo">
*bar*
</a>
<a href="foo">
*bar*
</a>

種別7のブロックでは、タグ名はどんなものにもできます。

例 164やってみよう
<Warning>
*bar*
</Warning>
<Warning>
*bar*
</Warning>
例 165やってみよう
<i class="foo">
*bar*
</i>
<i class="foo">
*bar*
</i>
例 166やってみよう
</ins>
*bar*
</ins>
*bar*

これらの規則はブロックの水準ないし行内の水準のいずれのタグとしても機能できるタグを扱うことを許容するべく設計されています。 <del>タグが好例です。 内容を<del>タグで3つの異なる方法により取り巻けます。 以下の事例では、素のHTMLブロックになりますが、それは<del>タグがそれ自体で行をなすからです。

例 167やってみよう
<del>
*foo*
</del>
<del>
*foo*
</del>

以下の事例では、<del>タグを含むだけの素のHTMLブロックになります(なぜなら後に続く空行で終わっているため)。 そのため内容はCommonMarkとして解釈されます。

例 168やってみよう
<del>

*foo*

</del>
<del>
<p><em>foo</em></p>
</del>

最後に、以下の事例では、<del>タグはCommonMarkの段落 内の 素のHTMLとして解釈されます(タグはそれ自体で行をなしていないため、HTMLブロックではなくて行内HTMLが得られます)。

例 169やってみよう
<del>*foo*</del>
<p><del><em>foo</em></del></p>
例 170やってみよう
<del
class="foo">
*foo*
</del>
<p><del
class="foo">
<em>foo</em>
</del></p>

文字通りの内容(prescriptstyletextarea)を含めることを意図しているHTMLタグ、コメント、処理命令、宣言は少し違った風に扱われます。 最初の空行で終わる代わりに、これらのブロックは照応する終了タグを含む最初の行で終わります。 結果として、以下のブロックには空行を含められます。

preタグ(種別1)は次の通り。

例 171やってみよう
<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)は次の通り。

例 172やってみよう
<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)

例 173やってみよう
<textarea>

*foo*

_bar_

</textarea>
<textarea>

*foo*

_bar_

</textarea>

styleタグ(種別1)は次の通り。

例 174やってみよう
<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>

合致する終了タグがないなら、ブロックは文書(または取り囲むブロック引用ないしリスト項目)の終わりで終わります。

例 175やってみよう
<style
  type="text/css">

foo
<style
  type="text/css">

foo
例 176やってみよう
> <div>
> foo

bar
<blockquote>
<div>
foo
</blockquote>
<p>bar</p>
例 177やってみよう
- <div>
- foo
<ul>
<li>
<div>
</li>
<li>foo</li>
</ul>

終了タグは開始タグと同じ行に出現させられます。

例 178やってみよう
<style>p{color:red;}</style>
*foo*
<style>p{color:red;}</style>
<p><em>foo</em></p>
例 179やってみよう
<!-- foo -->*bar*
*baz*
<!-- foo -->*bar*
<p><em>baz</em></p>

なお最後の行にある終了タグの後の一切はHTMLブロックに含まれます。

例 180やってみよう
<script>
foo
</script>1. *bar*
<script>
foo
</script>1. *bar*

コメント(種別2)は次の通り。

例 181やってみよう
<!-- Foo

bar
   baz -->
okay
<!-- Foo

bar
   baz -->
<p>okay</p>

処理命令(種別3)は次の通り。

例 182やってみよう
<?php

  echo '>';

?>
okay
<?php

  echo '>';

?>
<p>okay</p>

宣言(種別4)は次の通り。

例 183やってみよう
<!DOCTYPE html>
<!DOCTYPE html>

CDATA(種別5)は次の通り。

例 184やってみよう
<![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つはいけません。

例 185やってみよう
  <!-- foo -->

    <!-- foo -->
  <!-- foo -->
<pre><code>&lt;!-- foo --&gt;
</code></pre>
例 186やってみよう
  <div>

    <div>
  <div>
<pre><code>&lt;div&gt;
</code></pre>

種別1から6のHTMLブロックは段落に割り込むことができ、空行を前に付ける必要はありません。

例 187やってみよう
Foo
<div>
bar
</div>
<p>Foo</p>
<div>
bar
</div>

しかしながら、文書の終わりを除き、また前述した種別1から5のブロックを除き、後に続く空行は必要です。

例 188やってみよう
<div>
bar
</div>
*foo*
<div>
bar
</div>
*foo*

種別7のHTMLブロックは段落に割り込めません。

例 189やってみよう
Foo
<a href="bar">
baz
<p>Foo
<a href="bar">
baz</p>

この規則はJohn Gruber氏の元来のマークダウンの構文の仕様とは違っており、そちらでは次のように書かれています。

唯一の制限はブロック水準のHTML要素――例えば<div><table><pre><p>など――はそれを取り巻く内容から空行で別れていなければならず、ブロックの始めと終わりのタグは空白ないしタブで字下げされているべきではないということです。

いくつかの点でGruber氏の規則はここで与えるものより制限的です。

(Gruber氏自身のものを含む)ほとんどのマークダウンの実装ではこれらの制限のすべては重んじられていません。

しかしながら、一点、Gruber氏の規則がここで与えているものより自由なところがあり、それはHTMLブロック内に空行が現れることを許容しているためです。 ここでそれを許容しないことには2つ理由があります。 1つ目に、釣り合いの取れたタグを構文解析する必要を除くことであり、こうした解析は高くつくものであって合致する終了タグが見当たらなければ文書の終わりから後戻りでの解析が要求されかねません。 2つ目に、マークダウンの内容をHTMLタグ内に含めるとても単純で柔軟な方法が供されます。 単にマークダウンとHTMLを空行を使って分けるのです。

比較は次の通り。

例 190やってみよう
<div>

*Emphasized* text.

</div>
<div>
<p><em>Emphasized</em> text.</p>
</div>
例 191やってみよう
<div>
*Emphasized* text.
</div>
<div>
*Emphasized* text.
</div>

マークダウンの実装には開始タグに属性markdown=1があるならタグ内の内容をテキストとして解釈する慣習を取り入れているものもあります。 上述で与えた規則の方が同じ表現力を達成するより単純でより簡潔な方法であって、構文解析がずっと単純でもあると思われます。

主たる潜在的な欠点はもはやHTMLブロックをマークダウン文書に100%の信頼性をもって貼り付けられないということです。 しかしながら、 ほとんどの事例においては これでうまくいきます、というのもHTMLにおける空行には通常HTMLブロックのタグが後に続くからです。 例えば以下の通りです。

例 192やってみよう
<table>

<tr>

<td>
Hi
</td>

</tr>

</table>
<table>
<tr>
<td>
Hi
</td>
</tr>
</table>

しかしながら、問題はあって、内側のタグが字下げされており かつ 空白で別れているならば、字下げされたコードブロックとして解釈されるためです。

例 193やってみよう
<table>

  <tr>

    <td>
      Hi
    </td>

  </tr>

</table>
<table>
  <tr>
<pre><code>&lt;td&gt;
  Hi
&lt;/td&gt;
</code></pre>
  </tr>
</table>

幸いにも、空行は通常必須ではなく削除できます。 例外は<pre>タグ内にあるときですが、上で記述した通り、<pre>で始まる素のHTMLブロックには空行を含めることが 可能 です。

4.7リンク参照定義について

リンク参照定義は、省略可能な3つまでの字下げの空白が前に付いたリンクラベルに、コロン (:) と、省略可能な(1つまでの行末を含む)空白ないしタブと、リンク先と、省略可能な(1つまでの行末を含む)空白ないしタブと、省略可能なリンク題とが後に続いたものからなり、題があるならリンク先から空白ないしタブで別れていなければなりません。 これ以上の文字が現れてはなりません。

リンク参照定義は文書の構造的な要素に照応しません。 代わりに、文書のどこの参照リンクや参照風の画像においても使えるラベルを定義します。 リンク参照定義はそれを使うリンクの前後のどちらにも来ることができます。

例 194やってみよう
[foo]: /url "title"

[foo]
<p><a href="/url" title="title">foo</a></p>
例 195やってみよう
   [foo]: 
      /url  
           'the title'  

[foo]
<p><a href="/url" title="the title">foo</a></p>
例 196やってみよう
[Foo*bar\]]:my_(url) 'title (with parens)'

[Foo*bar\]]
<p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
例 197やってみよう
[Foo bar]:
<my url>
'title'

[Foo bar]
<p><a href="my%20url" title="title">Foo bar</a></p>

題は複数行にわたっても構いません。

例 198やってみよう
[foo]: /url '
title
line1
line2
'

[foo]
<p><a href="/url" title="
title
line1
line2
">foo</a></p>

しかしながら、空行は含んではなりません。

例 199やってみよう
[foo]: /url 'title

with blank line'

[foo]
<p>[foo]: /url 'title</p>
<p>with blank line'</p>
<p>[foo]</p>

題は省いて構いません。

例 200やってみよう
[foo]:
/url

[foo]
<p><a href="/url">foo</a></p>

リンク先は省いてはなりません。

例 201やってみよう
[foo]:

[foo]
<p>[foo]:</p>
<p>[foo]</p>

しかしながら、山括弧を使って空のリンク先を指定して構いません。

例 202やってみよう
[foo]: <>

[foo]
<p><a href="">foo</a></p>

題はリンク先から1つ以上の空白ないしタブで別れていなければなりません。

例 203やってみよう
[foo]: <bar>(baz)

[foo]
<p>[foo]: <bar>(baz)</p>
<p>[foo]</p>

題と宛先の両方にバックスラッシュのエスケープと文字通りのバックスラッシュを含められます。

例 204やってみよう
[foo]: /url\bar\*baz "foo\"bar\baz"

[foo]
<p><a href="/url%5Cbar*baz" title="foo&quot;bar\baz">foo</a></p>

リンクはそれに照応する定義の前に来ることができます。

例 205やってみよう
[foo]

[foo]: url
<p><a href="url">foo</a></p>

複数の合致する定義があるなら、最初のものが優先します。

例 206やってみよう
[foo]

[foo]: first
[foo]: second
<p><a href="first">foo</a></p>

リンクの節で註記する通り、ラベルの合致では大文字と小文字を区別しません(合致を参照)。

例 207やってみよう
[FOO]: /url

[Foo]
<p><a href="/url">Foo</a></p>
例 208やってみよう
[ΑΓΩ]: /φου

[αγω]
<p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p>

何かがリンク参照定義かどうかはそれにより定義されるリンク参照が文書で使われているかどうかとは独立です。 したがって、例えば、以下の文書にはリンク参照定義だけが含まれており、可視の内容はありません。

例 209やってみよう
[foo]: /url

以下は別のものです。

例 210やってみよう
[
foo
]: /url
bar
<p>bar</p>

以下はリンク参照定義ではありませんが、それは題の後に空白ないしタブ以外の文字があるからです。

例 211やってみよう
[foo]: /url "title" ok
<p>[foo]: /url &quot;title&quot; ok</p>

以下はリンク参照定義ですが、題がありません。

例 212やってみよう
[foo]: /url
"title" ok
<p>&quot;title&quot; ok</p>

以下はリンク参照定義ではありませんが、それは4つの空白で字下げされているからです。

例 213やってみよう
    [foo]: /url "title"

[foo]
<pre><code>[foo]: /url &quot;title&quot;
</code></pre>
<p>[foo]</p>

以下はリンク参照定義ではありませんが、それはコードブロック内で現れているからです。

例 214やってみよう
```
[foo]: /url
```

[foo]
<pre><code>[foo]: /url
</code></pre>
<p>[foo]</p>

リンク参照定義は段落に割り込めません。

例 215やってみよう
Foo
[bar]: /baz

[bar]
<p>Foo
[bar]: /baz</p>
<p>[bar]</p>

しかしながら、見出しや主題分割といった、他のブロック要素の直後に続けることができ、空行が後に続く必要はありません。

例 216やってみよう
# [Foo]
[foo]: /url
> bar
<h1><a href="/url">Foo</a></h1>
<blockquote>
<p>bar</p>
</blockquote>
例 217やってみよう
[foo]: /url
bar
===
[foo]
<h1>bar</h1>
<p><a href="/url">foo</a></p>
例 218やってみよう
[foo]: /url
===
[foo]
<p>===
<a href="/url">foo</a></p>

複数のリンク参照定義は、空行を挟むことなしに、次々に出現させられます。

例 219やってみよう
[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>

リンク参照定義は、リストやブロック引用といった、ブロックの入れ物内に出現させられます。 こうした定義は文書全体に影響し、これらが定義されている入れ物に留まりません。

例 220やってみよう
[foo]

> [foo]: /url
<p><a href="/url">foo</a></p>
<blockquote>
</blockquote>

4.8段落について

他の種類のブロックとして解釈できない空でない行の系列は段落を形成します。 段落の内容は段落の素の内容を行内として構文解析した結果です。 段落の素の内容はその1つ以上の行を連結して先頭と末尾の空白ないしタブを除くことで形成されます。

2つの段落を持つ簡単な例を示します。

例 221やってみよう
aaa

bbb
<p>aaa</p>
<p>bbb</p>

段落は複数行にわたって書けますが、空白行は入れられません。

例 222やってみよう
aaa
bbb

ccc
ddd
<p>aaa
bbb</p>
<p>ccc
ddd</p>

段落の間の複数の空行には、効果がありません。

例 223やってみよう
aaa


bbb
<p>aaa</p>
<p>bbb</p>

先頭の空白ないしタブは、飛ばされます。

例 224やってみよう
  aaa
 bbb
<p>aaa
bbb</p>

最初の後の行はどれだけ字下げしても構いませんが、これはコードブロックが段落に割り込めないためです。

例 225やってみよう
aaa
             bbb
                                       ccc
<p>aaa
bbb
ccc</p>

しかしながら、最初の行には3つまで字下げの空白が前に付いていて構いません。 4つの字下げの空白は多過ぎます。

例 226やってみよう
   aaa
bbb
<p>aaa
bbb</p>
例 227やってみよう
    aaa
bbb
<pre><code>aaa
</code></pre>
<p>bbb</p>

最後の空白ないしタブは行内の構文解析の前に切り詰められるため、2つ以上の空白で終わる段落は固い改行で終わることはありません。

例 228やってみよう
aaa     
bbb     
<p>aaa<br />
bbb</p>

4.9空白行

ブロック水準の要素の間の空行は、リスト窮屈ゆるやかかを判定するときに担う役割を除いて、無視されます。

文書の最初と最後の空白行は無視されます。

例 229やってみよう
  

aaa
  

# aaa

  
<p>aaa</p>
<h1>aaa</h1>

5入れ物ブロック

入れ物ブロックは他のブロックを内容として持つブロックです。 入れ物ブロックは2つに大別され、ブロック引用リスト項目です。 リストリスト項目のためのさらなる入れ物です。

ここでは入れ物ブロックのための構文を再帰的に定義します。 その定義の一般的な形式は次の通り。

Xがブロックの系列ならば、Xをしかじかの方法で変換した結果はこれらのブロックを内容として持つ種別Yの入れ物です。

そのため、ここでは何をもってブロック引用やリスト項目とするかをこれらがどのようにその内容から 生成 できるのかを説明することによって説明します。 これで構文を定義するには事足りるでしょうが、これらの構築物を 構文解析 する一通りの手順は与えていません(一通りの手順は後述する構文解析の戦略と題した節で供されます)。

5.1ブロック引用

ブロック引用の印には、省略可能な3つまで字下げの空白が前に付き、(a) 文字>と共にその後に続く字下げの空白があるもの、ないし (b) 単一の文字>で字下げの空白が後に続かないものからなります。

以下の規則によりブロック引用が定義されます。

  1. 基礎的な場合。 1つ以上の行の文字列 Ls が1つ以上のブロックの系列 Bs を構成するならば、 Ls の各行の始めにブロック引用の印を前に付けた結果は Bs を含むブロック引用です。

  2. 不精性。 1つ以上の行の文字列 Ls が内容 Bs を持つブロック引用を構成するならば、先頭のブロック引用の印をその行のブロック引用の印の後の空白文字やタブ文字以外の次の文字が段落継続テキストである1つ以上の行から削除した結果は Bs を内容として持つブロック引用です。 段落継続テキストは段落の内容の一部として構文解析されることになるテキストですが、段落の始めに現れないものです。

  3. 連続性。 文書には間に空行がない限り続けて2つのブロック引用を含められません。

他には何も、ブロック引用として見なされません。

以下は単純な例です。

例 230やってみよう
> # Foo
> bar
> baz
<blockquote>
<h1>Foo</h1>
<p>bar
baz</p>
</blockquote>

>の文字の後の空白ないしタブは省けます。

例 231やってみよう
># Foo
>bar
> baz
<blockquote>
<h1>Foo</h1>
<p>bar
baz</p>
</blockquote>

>の文字には3つまで字下げの空白を前に付けられます。

例 232やってみよう
   > # Foo
   > bar
 > baz
<blockquote>
<h1>Foo</h1>
<p>bar
baz</p>
</blockquote>

4文字分の空白の字下げは多過ぎます。

例 233やってみよう
    > # Foo
    > bar
    > baz
<pre><code>&gt; # Foo
&gt; bar
&gt; baz
</code></pre>

不精性の条項により段落継続テキストの前の>を省くことが許容されます。

例 234やってみよう
> # Foo
> bar
baz
<blockquote>
<h1>Foo</h1>
<p>bar
baz</p>
</blockquote>

ブロック引用には一部が不精で一部は不精でない継続行を含められます。

例 235やってみよう
> bar
baz
> foo
<blockquote>
<p>bar
baz
foo</p>
</blockquote>

不精性はブロック引用の印が前に付いていたとしたら段落の継続であったであろう行のみに適用されます。 例えば、>は以下の2つ目の行で省けませんが……

> foo
> ---

……省くと意味が変わります。

例 236やってみよう
> foo
---
<blockquote>
<p>foo</p>
</blockquote>
<hr />

同様に、2行目の> を省くと……

> - foo
> - bar

……ブロック引用は1行目の後で終わります。

例 237やってみよう
> - foo
- bar
<blockquote>
<ul>
<li>foo</li>
</ul>
</blockquote>
<ul>
<li>bar</li>
</ul>

同じ理由から、字下げないし有塀のコードブロックの後続する行の前からは> を省けません。

例 238やってみよう
>     foo
    bar
<blockquote>
<pre><code>foo
</code></pre>
</blockquote>
<pre><code>bar
</code></pre>
例 239やってみよう
> ```
foo
```
<blockquote>
<pre><code></code></pre>
</blockquote>
<p>foo</p>
<pre><code></code></pre>

なお以下の事例においては、不精な継続行になります。

例 240やってみよう
> foo
    - bar
<blockquote>
<p>foo
- bar</p>
</blockquote>

その理由については、以下に注目してください。

> foo
>     - bar

- barはリストを始めるには深く字下げされすぎており、字下げコードブロックは段落に割り込めないために字下げコードブロックにできないため、段落継続テキストなのです。

ブロック引用は空にできます。

例 241やってみよう
>
<blockquote>
</blockquote>
例 242やってみよう
>
>  
> 
<blockquote>
</blockquote>

ブロック引用には先頭や最後に空行があっても構いません。

例 243やってみよう
>
> foo
>  
<blockquote>
<p>foo</p>
</blockquote>

空行があると、必ずブロック引用が離されます。

例 244やってみよう
> foo

> bar
<blockquote>
<p>foo</p>
</blockquote>
<blockquote>
<p>bar</p>
</blockquote>

(ほとんどの現在のマークダウンの実装では、John Gruber氏の元来のMarkdown.plを含めて、この例を2つの段落を持つ単一のブロック引用として構文解析するでしょう。 しかし執筆者が2つのブロック引用にしたいか1つにしたいか決めることを許容する方がよいように思われます)

連続性の意味するところは以下のブロック引用を一緒に置くなら、単一のブロック引用になるということです。

例 245やってみよう
> foo
> bar
<blockquote>
<p>foo
bar</p>
</blockquote>

2つの段落を持つブロック引用にするには、以下を使います。

例 246やってみよう
> foo
>
> bar
<blockquote>
<p>foo</p>
<p>bar</p>
</blockquote>

ブロック引用は段落に割り込めます。

例 247やってみよう
foo
> bar
<p>foo</p>
<blockquote>
<p>bar</p>
</blockquote>

一般に、ブロック引用の前後に空行は必要ありません。

例 248やってみよう
> aaa
***
> bbb
<blockquote>
<p>aaa</p>
</blockquote>
<hr />
<blockquote>
<p>bbb</p>
</blockquote>

しかしながら、不精性のために、ブロック引用とその後に続く段落の間には空行が必要です。

例 249やってみよう
> bar
baz
<blockquote>
<p>bar
baz</p>
</blockquote>
例 250やってみよう
> bar

baz
<blockquote>
<p>bar</p>
</blockquote>
<p>baz</p>
例 251やってみよう
> bar
>
baz
<blockquote>
<p>bar</p>
</blockquote>
<p>baz</p>

不精性の帰結として任意の数の先頭の>は入れ子のブロック引用の継続行では省いて構いません。

例 252やってみよう
> > > foo
bar
<blockquote>
<blockquote>
<blockquote>
<p>foo
bar</p>
</blockquote>
</blockquote>
</blockquote>
例 253やってみよう
>>> foo
> bar
>>baz
<blockquote>
<blockquote>
<blockquote>
<p>foo
bar
baz</p>
</blockquote>
</blockquote>
</blockquote>

字下げコードブロックをブロック引用に含めるときは、ブロック引用の印>とその後に続く字下げの空白の両方が含まれることを覚えておいてください。 そのため>の後に 5つの空白 が必要です。

例 254やってみよう
>     code

>    not code
<blockquote>
<pre><code>code
</code></pre>
</blockquote>
<blockquote>
<p>not code</p>
</blockquote>

5.2リスト項目

リストの印中黒リストの印ないし順序付きリストの印です。

中黒リストの印-+、ないし*の文字です。

順序付きリストの印は1個から9個までのアラビア数字 (0-9) の系列であって、.の文字ないし)の文字のいずれかが後に続きます(長さの制限がある理由は10桁の数字だと一部のブラウザで整数の桁溢れが見られだすためです)。

以下の規則によりリスト項目が定義されます。

  1. 基礎的な場合。 1つ以上の行の系列 Ls が空白ないしタブ以外の文字から始まるブロックの系列 Bs を構成し、 M が幅 W のリストの印に1 ≤ N ≤ 4個の字下げの空白が後に続いたものであるならば、 Ls の最初の行に M とその後に続く空白を前に付け、 Ls の後続する行を W + N 個の空白で字下げした結果は、 Bs を内容として持つリスト項目です。 リスト項目の種別(中黒ないし順序付き)はそのリストの印の種別により決まります。 リスト項目が順序付きであるならば、順序付きリストの印に基づいて、開始番号も割り当てられます。

    例外は次の通り。

    1. リストの最初のリスト項目が段落に割り込むとき――つまり、さもなければ段落継続テキストとして見なされていたであろう行で始まるとき―― (a) 1つ以上の行 Ls は空行で始まってはならず、(b) リスト項目が順序付きならば、開始番号は1でなければなりません。
    2. どの行も主題分割であるならばその行はリスト項目ではありません。

例えば、 Ls が以下の行だとします。

例 255やってみよう
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 と同じ内容です。

例 256やってみよう
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つの空白で字下げされていなければなりません。

以下はリスト項目のもとに置くためにどれだけ深く字下げしなければならないかを示す例です。

例 257やってみよう
- one

 two
<ul>
<li>one</li>
</ul>
<p>two</p>
例 258やってみよう
- one

  two
<ul>
<li>
<p>one</p>
<p>two</p>
</li>
</ul>
例 259やってみよう
 -    one

     two
<ul>
<li>one</li>
</ul>
<pre><code> two
</code></pre>
例 260やってみよう
 -    one

      two
<ul>
<li>
<p>one</p>
<p>two</p>
</li>
</ul>

これはつい列の見方で考えたくなります。 つまり継続するブロックはリストの印の後の空白ないしタブ以外の最初の文字の列だけはせめて字下げされなくてはならないということです。 しかしながら、それはあまり正しくありません。 リストの印の後の字下げの空白はどれだけ相対的な字下げが必要かを決めます。 どの列でこの字下げが達するかは、以下の例で示されるように、どれだけリスト項目が他の構築物の中に埋め込まれているかによります。

例 261やってみよう
   > > 1.  one
>>
>>     two
<blockquote>
<blockquote>
<ol>
<li>
<p>one</p>
<p>two</p>
</li>
</ol>
</blockquote>
</blockquote>

ここでtwoがリストの印1.と同じ列に現れていますが、最後に含んでいるブロック引用の印の後に充分な字下げがあるため、実はリスト項目に含まれます。

逆もまたありえます。 以下の例では、単語twoはリスト項目の最初のテキストである、oneの右より奥に現れていますが、ブロック引用の印を過ぎてから充分に奥まで字下げされていないため、リスト項目の一部とは見なされません。

例 262やってみよう
>>- one
>>
  >  > two
<blockquote>
<blockquote>
<ul>
<li>one</li>
</ul>
<p>two</p>
</blockquote>
</blockquote>

なおリストの印とその後に続く何らかの内容の間には少なくとも1つの空白ないしタブが必要であるため、以下はリスト項目ではありません。

例 263やってみよう
-one

2.two
<p>-one</p>
<p>2.two</p>

リスト項目には1つ以上の空行で別れているブロックが含まれていても構いません。

例 264やってみよう
- foo


  bar
<ul>
<li>
<p>foo</p>
<p>bar</p>
</li>
</ul>

リスト項目には、どんな種類のブロックが含まれていても構いません。

例 265やってみよう
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>

字下げコードブロックを含むリスト項目ではコードブロックの範囲内の空の行は書いたままに保持されます。

例 266やってみよう
- Foo

      bar


      baz
<ul>
<li>
<p>Foo</p>
<pre><code>bar


baz
</code></pre>
</li>
</ul>

なお、順序付きリストの開始番号は、9桁以下でなければなりません。

例 267やってみよう
123456789. ok
<ol start="123456789">
<li>ok</li>
</ol>
例 268やってみよう
1234567890. not ok
<p>1234567890. not ok</p>

開始番号は0で始めても構いません。

例 269やってみよう
0. ok
<ol start="0">
<li>ok</li>
</ol>
例 270やってみよう
003. ok
<ol start="3">
<li>ok</li>
</ol>

開始番号は負であってはなりません。

例 271やってみよう
-1. not ok
<p>-1. not ok</p>
  1. 字下げされたコードで始まる項目。 行の系列 Ls が字下げコードブロックで始まるブロックの系列 Bs から構成され、かつ M が幅 W のリストの印に1つの字下げの空白が後に続いたものであるならば、 M と後に続く空白を Ls の最初の行の前に付け、 Ls の後続する行を W + 1 個の空白だけ字下げした結果は、 Bs を内容として持つリスト項目です。 行が空ならば、字下げされている必要はありません。 リスト項目の種別(中黒ないし順序付き)はリストの印の種別により決まります。 リスト項目が順序付きであるならば、順序付きリストの印に基づいて、開始番号も割り当てられます。

字下げコードブロックにはテキストがリスト項目に含まれる領域の端を越えて4つの字下げの空白が前に付かなければなりません。 以下の事例では6つの空白です。

例 272やってみよう
- foo

      bar
<ul>
<li>
<p>foo</p>
<pre><code>bar
</code></pre>
</li>
</ul>

また、以下の事例では11個の空白です。

例 273やってみよう
  10.  foo

           bar
<ol start="10">
<li>
<p>foo</p>
<pre><code>bar
</code></pre>
</li>
</ol>

リスト項目の 最初の ブロックが字下げコードブロックであるならば、規則2番目により、内容にはリストの印の後に 1つの 字下げの空白が前に付いていなければなりません。

例 274やってみよう
    indented code

paragraph

    more code
<pre><code>indented code
</code></pre>
<p>paragraph</p>
<pre><code>more code
</code></pre>
例 275やってみよう
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>

なお余剰の字下げの空白はコードブロック内の空白として解釈されます。

例 276やってみよう
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つの字下げの空白で始まっており、規則では全体を字下げしてリストの印を前に付けることでリスト項目を形成することが許容されません。

例 277やってみよう
   foo

bar
<p>foo</p>
<p>bar</p>
例 278やってみよう
-    foo

  bar
<ul>
<li>foo</li>
</ul>
<p>bar</p>

これは著しい制限ではありませんが、それはブロックに3つまでの字下げの空白が前に付いているとき、規則1番目を適用することが許容されるように、字下げはいつでも解釈を変えずに除けるからです。 そのため、上の事例については次の通り。

例 279やってみよう
-  foo

   bar
<ul>
<li>
<p>foo</p>
<p>bar</p>
</li>
</ul>
  1. 空行で始まる項目。 単一の空行で始まる行の系列 Ls が(空の場合を含めて)ブロックの系列 Bs を構成し、かつ M が幅 W のリストの印であるならば、 Ls の最初の行に M を前に付け、 Ls の後続する行の前に W + 1 個の字下げの空白を前に付けた結果は、 Bs を内容として持つリスト項目です。 行が空であるならば、字下げする必要はありません。 リスト項目の種別(中黒ないし順序付き)はリストの印の種別によって決まります。 リスト項目が順序付きならば、順序付きリストの印に基づき、開始番号も割り当てられます。

以下は、空行で始まるものの、空ではないリスト項目です。

例 280やってみよう
-
  foo
-
  ```
  bar
  ```
-
      baz
<ul>
<li>foo</li>
<li>
<pre><code>bar
</code></pre>
</li>
<li>
<pre><code>baz
</code></pre>
</li>
</ul>

リスト項目が空行で始まるとき、リストの印の後に続く空白の数により要求される字下げは変わりません。

例 281やってみよう
-   
  foo
<ul>
<li>foo</li>
</ul>

リスト項目は1つまでの空行で始められます。 以下の例では、fooはリスト項目の一部ではありません。

例 282やってみよう
-

  foo
<ul>
<li></li>
</ul>
<p>foo</p>

以下は空の中黒リスト項目です。

例 283やってみよう
- foo
-
- bar
<ul>
<li>foo</li>
<li></li>
<li>bar</li>
</ul>

リストの印の後に続く空白ないしタブがあるかどうかは重要ではありません。

例 284やってみよう
- foo
-   
- bar
<ul>
<li>foo</li>
<li></li>
<li>bar</li>
</ul>

以下は空の順序付きリスト項目です。

例 285やってみよう
1. foo
2.
3. bar
<ol>
<li>foo</li>
<li></li>
<li>bar</li>
</ol>

リストは、空のリスト項目で始まったり終わったりしても構いません。

例 286やってみよう
*
<ul>
<li></li>
</ul>

しかしながら、空のリスト項目は段落に割り込めません。

例 287やってみよう
foo
*

foo
1.
<p>foo
*</p>
<p>foo
1.</p>
  1. 字下げ。 行の系列 Ls により規則1番目、2番目、ないし3番目に従ってリスト項目が構成されるならば、 Ls の各行に3つまでの(各行とも同じ)字下げの空白を前に付けた結果もまた同じ内容と属性を持つリスト項目を構成します。 行が空であるならば、字下げされている必要はありません。

1つの空白で字下げした事例は次の通り。

例 288やってみよう
 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つの空白で字下げした事例は次の通り。

例 289やってみよう
  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つの空白で字下げした事例は次の通り。

例 290やってみよう
   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つの空白の字下げでは、コードブロックになります。

例 291やってみよう
    1.  A paragraph
        with two lines.

            indented code

        > A block quote.
<pre><code>1.  A paragraph
    with two lines.

        indented code

    &gt; A block quote.
</code></pre>
  1. 不精性。 1つ以上の行の文字列 Ls が内容 Bs を持つリスト項目を構成するならば、字下げの後の空白ないしタブ以外の次の文字が段落継続テキストである1つ以上の行から字下げの一部ないし全部を削除した結果は同じ内容と属性を持つリスト項目です。 字下げされていない行は不精な継続行と呼ばれます。

以下は不精な継続行のある例です。

例 292やってみよう
  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>

字下げは部分的に削除できます。

例 293やってみよう
  1.  A paragraph
    with two lines.
<ol>
<li>A paragraph
with two lines.</li>
</ol>

以下の例では、入れ子の構造で不精性がどう働くかを示したものです。

例 294やってみよう
> 1. > Blockquote
continued here.
<blockquote>
<ol>
<li>
<blockquote>
<p>Blockquote
continued here.</p>
</blockquote>
</li>
</ol>
</blockquote>
例 295やってみよう
> 1. > Blockquote
> continued here.
<blockquote>
<ol>
<li>
<blockquote>
<p>Blockquote
continued here.</p>
</blockquote>
</li>
</ol>
</blockquote>
  1. 以上。 規則1番目から5番目によりリスト項目と見なされないものは何らリスト項目とは見なされません。

副リストの規則は上述の一般則に従います。 副リストは段落がリスト項目に含まれるために必要とされるであろう数と同じ字下げの空白で字下げされていなければなりません。

そのため、以下の事例では2つの空白の字下げが必要です。

例 296やってみよう
- 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つでは足りません。

例 297やってみよう
- foo
 - bar
  - baz
   - boo
<ul>
<li>foo</li>
<li>bar</li>
<li>baz</li>
<li>boo</li>
</ul>

以下では4つ必要です。 なぜならリストの印の幅が広いからです。

例 298やってみよう
10) foo
    - bar
<ol start="10">
<li>foo
<ul>
<li>bar</li>
</ul>
</li>
</ol>

3つでは足りません。

例 299やってみよう
10) foo
   - bar
<ol start="10">
<li>foo</li>
</ol>
<ul>
<li>bar</li>
</ul>

リストはリスト項目中の最初のブロックでも構いません。

例 300やってみよう
- - foo
<ul>
<li>
<ul>
<li>foo</li>
</ul>
</li>
</ul>
例 301やってみよう
1. - 2. foo
<ol>
<li>
<ul>
<li>
<ol start="2">
<li>foo</li>
</ol>
</li>
</ul>
</li>
</ol>

リスト項目には見出しを含められます。

例 302やってみよう
- # Foo
- Bar
  ---
  baz
<ul>
<li>
<h1>Foo</h1>
</li>
<li>
<h2>Bar</h2>
baz</li>
</ul>

5.2.1狙い

John Gruber氏のマークダウンの仕様では、リスト項目について以下が記されています。

  1. 「リストの印は通例として左端で始まりますが、3つまでの空白で字下げされていて構いません。 リストの印には1つ以上の空白ないしタブが後に続いていなければなりません」

  2. 「リストの見栄えを良くするため、項目をぶら下がる字下げで折り返せます……しかしそうしたくなければ、しなくていいです」

  3. 「リスト項目は複数の段落からなっていて構いません。 リスト項目の後続する各段落は4つ以上の空白ないしタブのいずれかで字下げされていなければなりません」

  4. 「後続する段落のすべての行を字下げすれば見栄えが良いのですが、ここでもまた、マークダウンでは不精であることが許容されます」

  5. 「リスト項目の範囲内にブロック引用を置くには、ブロック引用の>の区切りは字下げされている必要があります」

  6. 「リスト項目の範囲内にコードブロックを置くには、コードブロックは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つの空白の規則に合致するでしょうが、他の場合では乖離があるでしょう。

5.3リストについて

リスト同じ型を持つ1つ以上のリスト項目の系列です。 リスト項目はどれだけの数の空行で別れていても構いません。

2つのリスト項目は同じ型のリストの印で始まるなら同じ型を持つものです。 2つのリストの印は (a) 同じ文字 (-+*) を使う中黒リストの印であるか (b) 同じ区切り(.ないし)のいずれか)の順序付きリストの数字であるなら同じ型です。

リストはその構成要素たるリスト項目が順序付きリストの印で始まるなら順序付きリストであって、その構成要素たるリスト項目が中黒リストの印で始まるなら中黒リストです。

順序付きリスト開始番号はその先頭のリスト項目のリスト番号で決まります。 後続するリスト項目の番号は顧みられません。

リストはその構成要素たるリスト項目のいずれかが空行で別れているか、その構成要素たるリスト項目のいずれかに間に空行がある2つのブロック水準の要素がじかに含まれるならゆるやかです。 さもなければリストは窮屈です(HTMLの出力における違いとしてゆるやかなリストの中の段落は<p>タグに包まれる一方で、窮屈なリストの中の段落はそうではありません)。

中黒ないし順序付きのリストの区切りが変わると新しいリストが始まります。

例 303やってみよう
- foo
- bar
+ baz
<ul>
<li>foo</li>
<li>bar</li>
</ul>
<ul>
<li>baz</li>
</ul>
例 304やってみよう
1. foo
2. bar
3) baz
<ol>
<li>foo</li>
<li>bar</li>
</ol>
<ol start="3">
<li>baz</li>
</ol>

CommonMarkでは、リストで段落に割り込めます。 つまり、段落とその後に続くリストを離すために空行は必要とされません。

例 305やってみよう
Foo
- bar
- baz
<p>Foo</p>
<ul>
<li>bar</li>
<li>baz</li>
</ul>

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から始まるリストのみ段落に割り込めるよう許容しました。 したがって次の通り。

例 306やってみよう
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>

それでも、以下のような事例においては、意図しない結果になります。

例 307やってみよう
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>

ですがこの規則で、紛らわしくリストと捉えられてしまう、ほとんどの場合が回避されるでしょう。

項目の間にどれだけ空行があっても構いません。

例 308やってみよう
- foo

- bar


- baz
<ul>
<li>
<p>foo</p>
</li>
<li>
<p>bar</p>
</li>
<li>
<p>baz</p>
</li>
</ul>
例 309やってみよう
- 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コメントを挿入できます。

例 310やってみよう
- foo
- bar

<!-- -->

- baz
- bim
<ul>
<li>foo</li>
<li>bar</li>
</ul>
<!-- -->
<ul>
<li>baz</li>
<li>bim</li>
</ul>
例 311やってみよう
-   foo

    notcode

-   foo

<!-- -->

    code
<ul>
<li>
<p>foo</p>
<p>notcode</p>
</li>
<li>
<p>foo</p>
</li>
</ul>
<!-- -->
<pre><code>code
</code></pre>

リスト項目は同じ水準に字下げされている必要はありません。 以下のリスト項目は同じリストの水準の項目として扱われますが、それはどれも前のリスト項目に属するに足るだけ字下げされていないためです。

例 312やってみよう
- 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>
例 313やってみよう
1. a

  2. b

   3. c
<ol>
<li>
<p>a</p>
</li>
<li>
<p>b</p>
</li>
<li>
<p>c</p>
</li>
</ol>

なお、しかしながら、リスト項目には3つの字下げの空白を越えて前に付けてはなりません。 以下では- eは段落継続行として扱われますが、これは3つの空白より多く字下げされているからです。

例 314やってみよう
- a
 - b
  - c
   - d
    - e
<ul>
<li>a</li>
<li>b</li>
<li>c</li>
<li>d
- e</li>
</ul>

そして以下では、3. cは字下げコードブロックとして扱われますが、これは4つの空白で字下げされており空行が前に付いているからです。

例 315やってみよう
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つのリスト項目の間に空行があるからです。

例 316やってみよう
- a
- b

- c
<ul>
<li>
<p>a</p>
</li>
<li>
<p>b</p>
</li>
<li>
<p>c</p>
</li>
</ul>

以下も同じで、こちらには空の2つ目の項目があります。

例 317やってみよう
* a
*

* c
<ul>
<li>
<p>a</p>
</li>
<li></li>
<li>
<p>c</p>
</li>
</ul>

項目間に空行がないにしても、以下はゆるやかなリストですが、それは1つの項目に間に空行がある2つのブロック水準の要素がじかに含まれているからです。

例 318やってみよう
- a
- b

  c
- d
<ul>
<li>
<p>a</p>
</li>
<li>
<p>b</p>
<p>c</p>
</li>
<li>
<p>d</p>
</li>
</ul>
例 319やってみよう
- a
- b

  [ref]: /url
- d
<ul>
<li>
<p>a</p>
</li>
<li>
<p>b</p>
</li>
<li>
<p>d</p>
</li>
</ul>

以下は窮屈なリストです。 なぜなら、空行がコードブロックの中にあるからです。

例 320やってみよう
- a
- ```
  b


  ```
- c
<ul>
<li>a</li>
<li>
<pre><code>b


</code></pre>
</li>
<li>c</li>
</ul>

以下は窮屈なリストですが、それは空行が副リストの2つの段落間にあるからです。 そのため副リストがゆるやかである一方で外側のリストは窮屈です。

例 321やってみよう
- a
  - b

    c
- d
<ul>
<li>a
<ul>
<li>
<p>b</p>
<p>c</p>
</li>
</ul>
</li>
<li>d</li>
</ul>

以下は窮屈なリストですが、それは空行がブロック引用内にあるからです。

例 322やってみよう
* a
  > b
  >
* c
<ul>
<li>a
<blockquote>
<p>b</p>
</blockquote>
</li>
<li>c</li>
</ul>

以下のリストは窮屈ですが、それは連続するブロック要素が空行で別れていないからです。

例 323やってみよう
- a
  > b
  ```
  c
  ```
- d
<ul>
<li>a
<blockquote>
<p>b</p>
</blockquote>
<pre><code>c
</code></pre>
</li>
<li>d</li>
</ul>

単一の段落のリストは窮屈です。

例 324やってみよう
- a
<ul>
<li>a</li>
</ul>
例 325やってみよう
- a
  - b
<ul>
<li>a
<ul>
<li>b</li>
</ul>
</li>
</ul>

以下のリストはゆるやかですが、これはリスト項目の中の2つのブロック要素間の空行のためです。

例 326やってみよう
1. ```
   foo
   ```

   bar
<ol>
<li>
<pre><code>foo
</code></pre>
<p>bar</p>
</li>
</ol>

以下の外側のリストはゆるやかですが、内側のリストは窮屈です。

例 327やってみよう
* foo
  * bar

  baz
<ul>
<li>
<p>foo</p>
<ul>
<li>bar</li>
</ul>
<p>baz</p>
</li>
</ul>
例 328やってみよう
- 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>

6行内要素

行内要素は文字の流れの始めから終わりへ(右書きの言語では、左から右へ)逐次に構文解析されます。 したがって、例えば……

例 329やってみよう
`hi`lo`
<p><code>hi</code>lo`</p>

……でhiはコードとして構文解析され、最後にある抑音符は文字通りの抑音符として残ります。

6.1コード区域について

抑音符の文字列は1つ以上の抑音符の文字 (`) からなる文字列であって抑音符が前に付くことも後に続くこともないものです。

コード区域は抑音符の文字列で始まり等しい長さの抑音符の文字列で終わります。 コード区域の内容はこれら2つの抑音符の文字列の間の1つ以上の文字であって、以下の方法で正規化されます。

以下は単純なコード区域です。

例 330やってみよう
`foo`
<p><code>foo</code></p>

以下では2つの抑音符が使われていますが、それはコードに抑音符が含まれているからです。 この例では単一の先頭と末尾の空白が切り詰められることも例証されています。

例 331やってみよう
`` foo ` bar ``
<p><code>foo ` bar</code></p>

この例では先頭と末尾の空白を切り詰めることの狙いが示されています。

例 332やってみよう
` `` `
<p><code>``</code></p>

なお、 1つ だけ空白が切り詰められます。

例 333やってみよう
`  ``  `
<p><code> `` </code></p>

切り詰めは空白が文字列の両端にあるときのみ起こります。

例 334やってみよう
` a`
<p><code> a</code></p>

空白のみ切り詰められるのであって、ユニコードの空白一般ではそうならず、以下の通りです。

例 335やってみよう
` b `
<p><code> b </code></p>

コード区域に空白しか含まれなければ、何も切り詰められません。

例 336やってみよう
` `
`  `
<p><code> </code>
<code>  </code></p>

行末は空白のように扱われます。

例 337やってみよう
``
foo
bar  
baz
``
<p><code>foo bar   baz</code></p>
例 338やってみよう
``
foo 
``
<p><code>foo </code></p>

内側の空白は縮められません。

例 339やってみよう
`foo   bar 
baz`
<p><code>foo   bar  baz</code></p>

なおブラウザでは<code>要素を呈示するときに連続する空白を縮めることが通例であるため、以下のCSSを使うことが推奨されます。

code{white-space: pre-wrap;}

なお抑音符のエスケープはコード区域では働きません。 すべての抑音符は文字通りに扱われます。

例 340やってみよう
`foo\`bar`
<p><code>foo\</code>bar`</p>

抑音符のエスケープが必要になることはありませんが、それは常に、コードにちょうど n 個の抑音符の文字からなる文字列が一切含まれないように、 n 個の抑音符の文字からなる文字列を区切りとして選べるからです。

例 341やってみよう
``foo`bar``
<p><code>foo`bar</code></p>
例 342やってみよう
` foo `` bar `
<p><code>foo `` bar</code></p>

コード区域の抑音符にはHTMLタグと自動リンクを除いてその他すべての行内の構築要素よりも高い優先度があります。 したがって、例えば、以下は強調されたテキストとして構文解析されませんが、それは2つ目の*がコード区域の一部であるためです。

例 343やってみよう
*foo`*`
<p>*foo<code>*</code></p>

また、以下はリンクとして構文解析されません。

例 344やってみよう
[not a `link](/foo`)
<p>[not a <code>link](/foo</code>)</p>

コード区域、HTMLタグ、自動リンクには同じ優先度があります。 したがって、以下はコードです。

例 345やってみよう
`<a href="`">`
<p><code>&lt;a href=&quot;</code>&quot;&gt;`</p>

ただし以下はHTMLタグです。

例 346やってみよう
<a href="`">`
<p><a href="`">`</p>

また、以下はコードです。

例 347やってみよう
`<https://foo.bar.`baz>`
<p><code>&lt;https://foo.bar.</code>baz&gt;`</p>

しかし以下は自動リンクです。

例 348やってみよう
<https://foo.bar.`baz>`
<p><a href="https://foo.bar.%60baz">https://foo.bar.`baz</a>`</p>

抑音符の文字列がそれに合致する抑音符の文字列で閉じていないときは、単に文字通りの抑音符になります。

例 349やってみよう
```foo``
<p>```foo``</p>
例 350やってみよう
`foo
<p>`foo</p>

以下の事例でも長さにおいて等しい開始と閉止の抑音符の文字列の必要性が例証されています。

例 351やってみよう
`foo``bar``
<p>`foo<code>bar</code></p>

6.2強調と強い強調

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) ユニコードの約物文字が前に付いておりユニコードの空白ないしユニコードの約物文字が後に続いているかのいずれかです。 この定義の目的のため、行の始めと終わりはユニコードの空白と見なされます。

以下は区切り連の例です。

(左側と右側の区切り連を前の文字と後の文字に基づいて区別するという発想はRoopesh Chander氏のvfmdから来ています。 vfmdでは「区切り連」の代わりに「強調の標識の文字列」という用語が使われており左側と右側の連を区別する規則はここで与えているものより少しだけ複雑です)

以下の規則により、強調と強い強調が定義されます。

  1. 単一の*の文字が強調の開始可能であるのは左側の区切り連の一部であるときでありまたそのときに限ります (if and only if; iff)。

  2. 単一の_の文字が強調の開始可能であるのは左側の区切り連の一部でありかつ (a) 右側の区切り連の一部でないか (b) ユニコードの約物文字が前に付いた右側の区切り連の一部であるかのいずれかのときでありまたそのときに限ります。

  3. 単一の*の文字が強調の閉止可能であるのは右側の区切り連の一部であるときでありまたそのときに限ります。

  4. 単一の_の文字が強調の閉止可能であるのは右側の区切り連の一部でありかつ (a) 左側の区切り連の一部ではないか (b) ユニコードの約物文字が後に続く左側の区切り連の一部であるかのいずれかのときでありまたそのときに限ります。

  5. 二重の**強い強調の開始可能であるのは左側の区切り連の一部であるときでありまたそのときに限ります。

  6. 二重である__強い強調の開始可能であるのは左側の区切り連の一部でありかつ (a) 右側の区切り連の一部でないか (b) ユニコードの約物文字が前に付く左側の区切り連の一部であるときのいずれかのときでありまたそのときに限ります。

  7. 二重である**強い強調の閉止可能であるのは右側の区切り連の一部であるときでありまたそのときに限ります。

  8. 二重である__強い強調の閉止可能であるのは右側の区切り連の一部でありかつ (a) 左側の区切り連の一部でないか (b) ユニコードの約物文字が後に続く左側の区切り連の一部であるときでありまたそのときに限ります。

  9. 強調は強調の開始可能な区切りで始まり強調の閉止可能な区切りで終わり、それには開始の区切りと同じ(_ないし*の)文字が使われます。 開始と閉止の区切りは離れた区切り連に属していなければなりません。 いずれかの区切りで強調を開始することも閉止することも両方できるならば、開始と閉止の区切りを含む区切り連の長さの和は両方の長さが3の倍数でない限り3の倍数であってはなりません。

  10. 強い強調は強い強調の開始可能な区切りで始まり強い強調の閉止可能な区切りで終わり、それには開始の区切りと同じ(_ないし*の)文字が使われます。 開始と閉止の区切りは離れた区切り連に属していなければなりません。 区切りのいずれかが強い強調を開始することも閉止することも両方できるならば、開始と閉止の区切りを含む区切り連の長さの和は両方の長さが3の倍数でない限り3の倍数であってはなりません。

  11. 文字通りの*の文字は、バックスラッシュでエスケープされていない限り、*で区切られた強調ないし**で区切られた強い強調の始めないし終わりに出現できません。

  12. 文字通りの_の文字は、バックスラッシュでエスケープされていない限り、_で区切られた強調ないし__で区切られた強い強調の始めないし終わりに出現できません。

ここで上述の規則1番目から12番目では複数の構文解析の仕方が両立することがあり、以下の原理でその曖昧さが解決されます。

  1. 入れ子の数は最小化されるべきです。 したがって、例えば、<strong>...</strong>の解釈は<em><em>...</em></em>に常に優先します。

  2. <em><strong>...</strong></em>の解釈は<strong><em>...</em></strong>に常に優先します。

  3. 2つの強調ないし強い強調になる潜在性のある区域が重なり合っているとき、つまり2つ目が1つ目の終わりの前に始まり1つ目の終わりの後に終わるとき、1つ目が優先します。 したがって、例えば、*foo _bar* baz_*foo <em>bar* baz</em>ではなく<em>foo _bar</em> baz_として構文解析されます。

  4. 同じ閉止の区切りを持つ2つの強調ないし強い強調になる潜在性のある区域があるとき、短かい方(後に開いた方)が優先します。 したがって、例えば、**foo **bar baz**<strong>foo **bar baz</strong>ではなく**foo <strong>bar baz</strong>として構文解析されます。

  5. 行内コード区域、リンク、HTMLタグは強調より固く結び付きます。 そのため、そうした要素のいずれかは含みいずれかは含まないという解釈間での選択があるとき、前者が常に勝ちます。 したがって、例えば、*[foo*](bar)<em>[foo</em>](bar)ではなく*<a href="bar">foo*</a>として構文解析されます。

これらの規則は、以降の例を通じて、分かりやすく表せます。

規則1番目に関して以下の通り。

例 352やってみよう
*foo bar*
<p><em>foo bar</em></p>

以下は強調ではありませんが、それは開始の*に空白が後に続いており、そのため左側の区切り連の一部でないからです。

例 353やってみよう
a * foo bar*
<p>a * foo bar*</p>

以下は強調ではありませんが、それは開始の*に英数字が前に付き約物が後に続いており、そのため左側の区切り連の一部ではないからです。

例 354やってみよう
a*"foo"*
<p>a*&quot;foo&quot;*</p>

ユニコードの非改行空白も、空白文字とは見なされません。

例 355やってみよう
* a *
<p>* a *</p>

ユニコードの記号も約物として見なされます。

例 356やってみよう
*$*alpha.

*£*bravo.

*€*charlie.

*𞋿*delta.
<p>*$*alpha.</p>
<p>*£*bravo.</p>
<p>*€*charlie.</p>
<p>*𞋿*delta.</p>

*による単語内の強調は許されます。

例 357やってみよう
foo*bar*
<p>foo<em>bar</em></p>
例 358やってみよう
5*6*78
<p>5<em>6</em>78</p>

規則2番目に関して以下の通り。

例 359やってみよう
_foo bar_
<p><em>foo bar</em></p>

以下は強調ではありませんが、それは開始の_に空白が後に続いているからです。

例 360やってみよう
_ foo bar_
<p>_ foo bar_</p>

以下は強調ではありませんが、それは開始の_に英数字が前に付き約物が後に続いているからです。

例 361やってみよう
a_"foo"_
<p>a_&quot;foo&quot;_</p>

_による強調は単語内では許されません。

例 362やってみよう
foo_bar_
<p>foo_bar_</p>
例 363やってみよう
5_6_78
<p>5_6_78</p>
例 364やってみよう
пристаням_стремятся_
<p>пристаням_стремятся_</p>

以下で_により強調は生成されませんが、それは1つ目の区切り連が右側であり2つ目が左側だからです。

例 365やってみよう
aa_"bb"_cc
<p>aa_&quot;bb&quot;_cc</p>

開始の区切りが左側と右側の両方であるとしても、以下は強調ですが、それは約物が前に付いているからです。

例 366やってみよう
foo-_(bar)_
<p>foo-<em>(bar)</em></p>

規則3番目に関して以下の通り。

以下は強調ではありませんが、それは閉止の区切りが開始の区切りと合致しないからです。

例 367やってみよう
_foo*
<p>_foo*</p>

以下は強調ではありませんが、それは閉止の*に空白が前に付いているからです。

例 368やってみよう
*foo bar *
<p>*foo bar *</p>

行末も空白文字と見なされます。

例 369やってみよう
*foo bar
*
<p>*foo bar
*</p>

以下は強調ではありませんが、それは2つ目の*に約物が前に付いており英数字が後に続いている(そのため右側の区切り連の一部ではない)からです。

例 370やってみよう
*(*foo)
<p>*(*foo)</p>

この制限の要点はこの例だとより飲み込みやすいです。

例 371やってみよう
*(*foo*)*
<p><em>(<em>foo</em>)</em></p>

*による単語内の強調は許されます。

例 372やってみよう
*foo*bar
<p><em>foo</em>bar</p>

規則4番目に関して以下の通り。

以下は強調ではありませんが、それは閉止の_に空白が前に付いていないからです。

例 373やってみよう
_foo bar _
<p>_foo bar _</p>

以下は強調ではありませんが、それは2つ目の_に約物が前に付いており英数字が後に続いているからです。

例 374やってみよう
_(_foo)
<p>_(_foo)</p>

以下は強調の範囲内にある強調です。

例 375やってみよう
_(_foo_)_
<p><em>(<em>foo</em>)</em></p>

単語内の強調は、_については許されません。

例 376やってみよう
_foo_bar
<p>_foo_bar</p>
例 377やってみよう
_пристаням_стремятся
<p>_пристаням_стремятся</p>
例 378やってみよう
_foo_bar_baz_
<p><em>foo_bar_baz</em></p>

以下は、閉止の区切りが左側と右側の両方であるとしても、強調ですが、それは約物が後に続いているからです。

例 379やってみよう
_(bar)_.
<p><em>(bar)</em>.</p>

規則5番目に関して以下の通り。

例 380やってみよう
**foo bar**
<p><strong>foo bar</strong></p>

以下は強い強調ではありませんが、それは開始の区切りに空白が後に続いているからです。

例 381やってみよう
** foo bar**
<p>** foo bar**</p>

以下は強い強調ではありませんが、それは開始の**に英数字が前に付いており約物が後に続いており、そのため左側の区切り連の一部でないからです。

例 382やってみよう
a**"foo"**
<p>a**&quot;foo&quot;**</p>

**による単語内の強い強調は許されます。

例 383やってみよう
foo**bar**
<p>foo<strong>bar</strong></p>

規則6番目に関して以下の通り。

例 384やってみよう
__foo bar__
<p><strong>foo bar</strong></p>

以下は強い強調ではありませんが、それは開始の区切りに空白が後に続いているからです。

例 385やってみよう
__ foo bar__
<p>__ foo bar__</p>

行末は空白文字と見なされます。

例 386やってみよう
__
foo bar__
<p>__
foo bar__</p>

以下は強い強調ではありませんが、それは開始の__に英数字が前に付いており約物が後に続いているからです。

例 387やってみよう
a__"foo"__
<p>a__&quot;foo&quot;__</p>

単語内の強い強調は、__については禁止されます。

例 388やってみよう
foo__bar__
<p>foo__bar__</p>
例 389やってみよう
5__6__78
<p>5__6__78</p>
例 390やってみよう
пристаням__стремятся__
<p>пристаням__стремятся__</p>
例 391やってみよう
__foo, __bar__, baz__
<p><strong>foo, <strong>bar</strong>, baz</strong></p>

以下は、開始の区切りが左側と右側の両方であるとしても、強い強調ですが、それは約物が前に付いているからです。

例 392やってみよう
foo-__(bar)__
<p>foo-<strong>(bar)</strong></p>

規則7番目に関して以下の通り。

以下は強い強調ではありませんが、それは閉止の区切りに空白が前に付いているからです。

例 393やってみよう
**foo bar **
<p>**foo bar **</p>

(強調された*foo bar *として解釈することもできませんが、それは規則11番目のためです)

以下は強い強調ではありませんが、それは2つ目の**に約物が前に付き英数字が後に続いているからです。

例 394やってみよう
**(**foo)
<p>**(**foo)</p>

この制限の要点は以下の例だとより飲み込みやすいです。

例 395やってみよう
*(**foo**)*
<p><em>(<strong>foo</strong>)</em></p>
例 396やってみよう
**Gomphocarpus (*Gomphocarpus physocarpus*, syn.
*Asclepias physocarpa*)**
<p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
<em>Asclepias physocarpa</em>)</strong></p>
例 397やってみよう
**foo "*bar*" foo**
<p><strong>foo &quot;<em>bar</em>&quot; foo</strong></p>

単語内の強調について以下の通りです。

例 398やってみよう
**foo**bar
<p><strong>foo</strong>bar</p>

規則8番目に関して以下の通り。

以下は強い強調ではありませんが、それは閉止の区切りに空白が前に付いているからです。

例 399やってみよう
__foo bar __
<p>__foo bar __</p>

以下は強い強調ではありませんが、それは2つ目の__に約物が前に付き英数字が後に続いているからです。

例 400やってみよう
__(__foo)
<p>__(__foo)</p>

この制限の要点はこの例だとより飲み込みやすいです。

例 401やってみよう
_(__foo__)_
<p><em>(<strong>foo</strong>)</em></p>

単語内の強い強調は、__については禁止されます。

例 402やってみよう
__foo__bar
<p>__foo__bar</p>
例 403やってみよう
__пристаням__стремятся
<p>__пристаням__стремятся</p>
例 404やってみよう
__foo__bar__baz__
<p><strong>foo__bar__baz</strong></p>

以下は、閉止の区切りが左側と右側の両方であるとしても、強い強調ですが、それは約物が後に続いているからです。

例 405やってみよう
__(bar)__.
<p><strong>(bar)</strong>.</p>

規則9番目に関して以下の通り。

あらゆる空でない行内の要素の系列は強調された区域の内容になりえます。

例 406やってみよう
*foo [bar](/url)*
<p><em>foo <a href="/url">bar</a></em></p>
例 407やってみよう
*foo
bar*
<p><em>foo
bar</em></p>

とりわけ、強調と強い強調は強調内に入れ子になりえます。

例 408やってみよう
_foo __bar__ baz_
<p><em>foo <strong>bar</strong> baz</em></p>
例 409やってみよう
_foo _bar_ baz_
<p><em>foo <em>bar</em> baz</em></p>
例 410やってみよう
__foo_ bar_
<p><em><em>foo</em> bar</em></p>
例 411やってみよう
*foo *bar**
<p><em>foo <em>bar</em></em></p>
例 412やってみよう
*foo **bar** baz*
<p><em>foo <strong>bar</strong> baz</em></p>
例 413やってみよう
*foo**bar**baz*
<p><em>foo<strong>bar</strong>baz</em></p>

なお前述の事例において、次の解釈……

<p><em>foo</em><em>bar<em></em>baz</em></p>

……は(fooの後の*のように)開くことも閉じることも両方できる区切りは開始と閉止の区切りを含む区切り連の長さの和が3の倍数なら両方の長さが3の倍数でない限りは強調を形成できないという条件により排除されます。

同じ理由のため、以下の例で2つの連続する強調に分かれたものにはなりません。

例 414やってみよう
*foo**bar*
<p><em>foo**bar</em></p>

同じくこの条件により、内部の空白が省かれている場合であっても、以下の事例はすべて強調内に入れ子になった強い強調となることが確定します。

例 415やってみよう
***foo** bar*
<p><em><strong>foo</strong> bar</em></p>
例 416やってみよう
*foo **bar***
<p><em>foo <strong>bar</strong></em></p>
例 417やってみよう
*foo**bar***
<p><em>foo<strong>bar</strong></em></p>

内部の閉止と開始の区切り連の長さが 両方とも 3の倍数のときは、ただし、それらは合致して強調が作られます。

例 418やってみよう
foo***bar***baz
<p>foo<em><strong>bar</strong></em>baz</p>
例 419やってみよう
foo******bar*********baz
<p>foo<strong><strong><strong>bar</strong></strong></strong>***baz</p>

際限のない入れ子の水準にできます。

例 420やってみよう
*foo **bar *baz* bim** bop*
<p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>
例 421やってみよう
*foo [*bar*](/url)*
<p><em>foo <a href="/url"><em>bar</em></a></em></p>

空の強調や強い強調はありえません。

例 422やってみよう
** is not an empty emphasis
<p>** is not an empty emphasis</p>
例 423やってみよう
**** is not an empty strong emphasis
<p>**** is not an empty strong emphasis</p>

規則10番目に関して以下の通り。

あらゆる空でない行内の要素の系列は強く強調された区域の内容になれます。

例 424やってみよう
**foo [bar](/url)**
<p><strong>foo <a href="/url">bar</a></strong></p>
例 425やってみよう
**foo
bar**
<p><strong>foo
bar</strong></p>

とりわけ、強調と強い強調は強い強調内に入れ子になれます。

例 426やってみよう
__foo _bar_ baz__
<p><strong>foo <em>bar</em> baz</strong></p>
例 427やってみよう
__foo __bar__ baz__
<p><strong>foo <strong>bar</strong> baz</strong></p>
例 428やってみよう
____foo__ bar__
<p><strong><strong>foo</strong> bar</strong></p>
例 429やってみよう
**foo **bar****
<p><strong>foo <strong>bar</strong></strong></p>
例 430やってみよう
**foo *bar* baz**
<p><strong>foo <em>bar</em> baz</strong></p>
例 431やってみよう
**foo*bar*baz**
<p><strong>foo<em>bar</em>baz</strong></p>
例 432やってみよう
***foo* bar**
<p><strong><em>foo</em> bar</strong></p>
例 433やってみよう
**foo *bar***
<p><strong>foo <em>bar</em></strong></p>

際限のない入れ子の水準にできます。

例 434やってみよう
**foo *bar **baz**
bim* bop**
<p><strong>foo <em>bar <strong>baz</strong>
bim</em> bop</strong></p>
例 435やってみよう
**foo [*bar*](/url)**
<p><strong>foo <a href="/url"><em>bar</em></a></strong></p>

空の強調や強い強調はありえません。

例 436やってみよう
__ is not an empty emphasis
<p>__ is not an empty emphasis</p>
例 437やってみよう
____ is not an empty strong emphasis
<p>____ is not an empty strong emphasis</p>

規則11番目に関して以下の通り。

例 438やってみよう
foo ***
<p>foo ***</p>
例 439やってみよう
foo *\**
<p>foo <em>*</em></p>
例 440やってみよう
foo *_*
<p>foo <em>_</em></p>
例 441やってみよう
foo *****
<p>foo *****</p>
例 442やってみよう
foo **\***
<p>foo <strong>*</strong></p>
例 443やってみよう
foo **_**
<p>foo <strong>_</strong></p>

なお区切りが均等に合致しないときは、規則11番目により超過する文字通りの*の文字が強調の外側に現れることが決まりますが、内側ではありません。

例 444やってみよう
**foo*
<p>*<em>foo</em></p>
例 445やってみよう
*foo**
<p><em>foo</em>*</p>
例 446やってみよう
***foo**
<p>*<strong>foo</strong></p>
例 447やってみよう
****foo*
<p>***<em>foo</em></p>
例 448やってみよう
**foo***
<p><strong>foo</strong>*</p>
例 449やってみよう
*foo****
<p><em>foo</em>***</p>

規則12番目に関して以下の通り。

例 450やってみよう
foo ___
<p>foo ___</p>
例 451やってみよう
foo _\__
<p>foo <em>_</em></p>
例 452やってみよう
foo _*_
<p>foo <em>*</em></p>
例 453やってみよう
foo _____
<p>foo _____</p>
例 454やってみよう
foo __\___
<p>foo <strong>_</strong></p>
例 455やってみよう
foo __*__
<p>foo <strong>*</strong></p>
例 456やってみよう
__foo_
<p>_<em>foo</em></p>

なお区切りが均等に合致しないときは、規則12番目により超過する文字通りの_の文字は強調の外側に現れることが決まりますが、内側ではありません。

例 457やってみよう
_foo__
<p><em>foo</em>_</p>
例 458やってみよう
___foo__
<p>_<strong>foo</strong></p>
例 459やってみよう
____foo_
<p>___<em>foo</em></p>
例 460やってみよう
__foo___
<p><strong>foo</strong>_</p>
例 461やってみよう
_foo____
<p><em>foo</em>___</p>

規則13番目により強調を強調の内側に直接入れ子にしたければ、違う区切りを使わなければならないことが示唆されます。

例 462やってみよう
**foo**
<p><strong>foo</strong></p>
例 463やってみよう
*_foo_*
<p><em><em>foo</em></em></p>
例 464やってみよう
__foo__
<p><strong>foo</strong></p>
例 465やってみよう
_*foo*_
<p><em><em>foo</em></em></p>

しかしながら、強い強調の範囲内の強い強調は区切りを切り替えることなく可能です。

例 466やってみよう
****foo****
<p><strong><strong>foo</strong></strong></p>
例 467やってみよう
____foo____
<p><strong><strong>foo</strong></strong></p>

規則13番目は好きなだけ長い区切りの系列にも適用できます。

例 468やってみよう
******foo******
<p><strong><strong><strong>foo</strong></strong></strong></p>

規則14番目に関して以下の通り。

例 469やってみよう
***foo***
<p><em><strong>foo</strong></em></p>
例 470やってみよう
_____foo_____
<p><em><strong><strong>foo</strong></strong></em></p>

規則15番目に関して以下の通り。

例 471やってみよう
*foo _bar* baz_
<p><em>foo _bar</em> baz_</p>
例 472やってみよう
*foo __bar *baz bim__ bam*
<p><em>foo <strong>bar *baz bim</strong> bam</em></p>

規則16番目に関して以下の通り。

例 473やってみよう
**foo **bar baz**
<p>**foo <strong>bar baz</strong></p>
例 474やってみよう
*foo *bar baz*
<p>*foo <em>bar baz</em></p>

規則17番目に関して以下の通り。

例 475やってみよう
*[bar*](/url)
<p>*<a href="/url">bar*</a></p>
例 476やってみよう
_foo [bar_](/url)
<p>_foo <a href="/url">bar_</a></p>
例 477やってみよう
*<img src="foo" title="*"/>
<p>*<img src="foo" title="*"/></p>
例 478やってみよう
**<a href="**">
<p>**<a href="**"></p>
例 479やってみよう
__<a href="__">
<p>__<a href="__"></p>
例 480やってみよう
*a `*`*
<p><em>a <code>*</code></em></p>
例 481やってみよう
_a `_`_
<p><em>a <code>_</code></em></p>
例 482やってみよう
**a<https://foo.bar/?q=**>
<p>**a<a href="https://foo.bar/?q=**">https://foo.bar/?q=**</a></p>
例 483やってみよう
__a<https://foo.bar/?q=__>
<p>__a<a href="https://foo.bar/?q=__">https://foo.bar/?q=__</a></p>

6.3リンク

リンクテキストにはリンク(可視のテキスト)、リンク先(リンク先であるURI)、省略可能なリンク題が含まれます。 マークダウンではリンクは2つに大別されます。 行内リンクでは宛先と題はリンクテキストの直後に与えられます。 参照リンクでは宛先と題は文書のどこかに定義されます。

リンクテキストは角括弧([])で囲まれたゼロ以上の行内の要素の系列からなります。 以下の規則が適用されます。

リンク先は次のいずれかからなります。

リンク題は以下のいずれかからなります。

リンク題は複数行にわたって構わないとはいえ、空行を含んではなりません。

行内リンクリンクテキストとその直後に続く左の丸括弧(、省略可能なリンク先、省略可能なリンク題、そして右の丸括弧)からなります。 これらの4つの構成要素は空白、タブ、1つまでの行末で別れていて構いません。 リンク先リンク題の両方が存在するなら、空白、タブ、1つまでの行末で別れて いなければならない とします。

リンクのテキストはリンクテキストの中に含まれる(取り囲む角括弧を除く)行内要素からなります。 リンクのURIはリンク先からなり、もしあるなら取り囲む<...>は除かれ、上述したようなバックスラッシュのエスケープが効果を持ちます。 リンク題はリンクの題名からなり、取り囲む区切りを除き、上述したようなバックスラッシュのエスケープが効果を持ちます。

以下は単純な行内リンクです。

例 484やってみよう
[link](/uri "title")
<p><a href="/uri" title="title">link</a></p>

題、リンクテキスト、さらには宛先も省いて構いません。

例 485やってみよう
[link](/uri)
<p><a href="/uri">link</a></p>
例 486やってみよう
[](./target.md)
<p><a href="./target.md"></a></p>
例 487やってみよう
[link]()
<p><a href="">link</a></p>
例 488やってみよう
[link](<>)
<p><a href="">link</a></p>
例 489やってみよう
[]()
<p><a href=""></a></p>

宛先には山括弧で囲まれているなら空白のみを含められます。

例 490やってみよう
[link](/my uri)
<p>[link](/my uri)</p>
例 491やってみよう
[link](</my uri>)
<p><a href="/my%20uri">link</a></p>

宛先には、山括弧で囲まれていても、行末を含められません。

例 492やってみよう
[link](foo
bar)
<p>[link](foo
bar)</p>
例 493やってみよう
[link](<foo
bar>)
<p>[link](<foo
bar>)</p>

宛先には山括弧で囲まれていれば)を含められます。

例 494やってみよう
[a](<b)c>)
<p><a href="b)c">a</a></p>

リンクを囲む山括弧はエスケープが外れていなければなりません。

例 495やってみよう
[link](<foo\>)
<p>[link](&lt;foo&gt;)</p>

以下はリンクではありませんが、それは開く山括弧が適切に合致しないからです。

例 496やってみよう
[a](<b)c
[a](<b)c>
[a](<b>c)
<p>[a](&lt;b)c
[a](&lt;b)c&gt;
[a](<b>c)</p>

リンク先の内部の丸括弧はエスケープして構いません。

例 497やってみよう
[link](\(foo\))
<p><a href="(foo)">link</a></p>

任意の数の丸括弧はエスケープなしに許容されますが、釣り合いが取れている限りにおいてです。

例 498やってみよう
[link](foo(and(bar)))
<p><a href="foo(and(bar))">link</a></p>

しかしながら、釣り合いの取れていない丸括弧があるなら、エスケープをするか<...>の形式を使う必要があります。

例 499やってみよう
[link](foo(and(bar))
<p>[link](foo(and(bar))</p>
例 500やってみよう
[link](foo\(and\(bar\))
<p><a href="foo(and(bar)">link</a></p>
例 501やってみよう
[link](<foo(and(bar)>)
<p><a href="foo(and(bar)">link</a></p>

丸括弧とその他の記号も、通常のマークダウンのように、エスケープできます。

例 502やってみよう
[link](foo\)\:)
<p><a href="foo):">link</a></p>

リンクにはフラグメントの識別子とクエリを含められます。

例 503やってみよう
[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>

なおエスケープできない文字の前のバックスラッシュはただのバックスラッシュです。

例 504やってみよう
[link](foo\bar)
<p><a href="foo%5Cbar">link</a></p>

URLエスケープ処理は宛先内では行わずそのままにしておくべきですが、それはすべてのURLエスケープされた文字もまた適正なURLの文字であるためです。 宛先の中の実体と数値的な文字参照は照応するユニコードの符号位置に、通常通りに構文解析されます。 これらはHTMLとして書き出されるときに随意でURLエスケープされていて構いませんが、本仕様ではHTMLやその他の形式でURLを呈示するための何らかの特定の方針を促進しません。 呈示器では出力においてURLをどのようにエスケープないし正規化するかについての様々な決定をして構いません。

例 505やってみよう
[link](foo%20b&auml;)
<p><a href="foo%20b%C3%A4">link</a></p>

なお、題はよく宛先として構文解析されることがあるので、宛先を省いて題を保とうとするなら、期待しない結果になるでしょう。

例 506やってみよう
[link]("title")
<p><a href="%22title%22">link</a></p>

題は単一引用符、二重引用符、丸括弧にあって構いません。

例 507やってみよう
[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>

バックスラッシュのエスケープと実体と数値的な文字参照を題で使って構いません。

例 508やってみよう
[link](/url "title \"&quot;")
<p><a href="/url" title="title &quot;&quot;">link</a></p>

題はリンクから空白、タブ、1つまでの行末を使って別れていなければなりません。 分割しない空白のような他のユニコードの空白は働きません。

例 509やってみよう
[link](/url "title")
<p><a href="/url%C2%A0%22title%22">link</a></p>

入れ子にされた釣り合いの取れた引用符はエスケープなしには許容されません。

例 510やってみよう
[link](/url "title "and" title")
<p>[link](/url &quot;title &quot;and&quot; title&quot;)</p>

しかし違う引用符の種別を使って回避するのは簡単です。

例 511やってみよう
[link](/url 'title "and" title')
<p><a href="/url" title="title &quot;and&quot; title">link</a></p>

(註:Markdown.plではたしかに二重引用符の題の内部の二重引用符が許容されており、そのテスト一式にはこれを論証するテストが含まれます。 しかしこれによりもたらされる余剰の複雑性に良い合理性を見いだしがたく、というのも二重引用符を含む題を書く上で多くの方法――バックスラッシュのエスケープ、実体と数値的な文字参照、題を囲むための違う引用符の種別の使用――が既にあるからです。 Markdown.plの題の扱いには他にも数々の妙な特徴があります。 例えば、行内リンクでは単一引用符の題が許容されていますが、参照リンクではされません。 また、行内リンクではそうではありませんが参照リンクでは、題を"で始めたり)で終わったりすることが許容されています。 Markdown.pl 1.0.1でも囲む引用符のない題が許容されていますが、1.0.2b8では許容されていません。 行内リンクとリンク参照定義で同じ方法で働く単純で、合理的な規則を取り入れることが好ましいと思われます)

空白、タブ、1つまでの行末は宛先と題の周りにおいて許容されます。

例 512やってみよう
[link](   /uri
  "title"  )
<p><a href="/uri" title="title">link</a></p>

しかしリンクテキストとその後に続く丸括弧の間では許容されません。

例 513やってみよう
[link] (/uri)
<p>[link] (/uri)</p>

リンクテキストには釣り合いの取れた角括弧が含まれていて構いませんが、釣り合いが取れていないものはそうではなく、エスケープされていないときに限ります。

例 514やってみよう
[link [foo [bar]]](/uri)
<p><a href="/uri">link [foo [bar]]</a></p>
例 515やってみよう
[link] bar](/uri)
<p>[link] bar](/uri)</p>
例 516やってみよう
[link [bar](/uri)
<p>[link <a href="/uri">bar</a></p>
例 517やってみよう
[link \[bar](/uri)
<p><a href="/uri">link [bar</a></p>

リンクテキストには行内の内容が含まれていて構いません。

例 518やってみよう
[link *foo **bar** `#`*](/uri)
<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
例 519やってみよう
[![moon](moon.jpg)](/uri)
<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>

しかしながら、どの入れ子の水準においても、リンクには別のリンクを含められません。

例 520やってみよう
[foo [bar](/uri)](/uri)
<p>[foo <a href="/uri">bar</a>](/uri)</p>
例 521やってみよう
[foo *[bar [baz](/uri)](/uri)*](/uri)
<p>[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p>
例 522やってみよう
![[[foo](uri1)](uri2)](uri3)
<p><img src="uri3" alt="[foo](uri2)" /></p>

以下の事例では強調の結び付きに対してリンクテキストの結び付きが優先することが例証されています。

例 523やってみよう
*[foo*](/uri)
<p>*<a href="/uri">foo*</a></p>
例 524やってみよう
[foo *bar](baz*)
<p><a href="baz*">foo *bar</a></p>

なおリンクの一部 ではない 角括弧は優先しません。

例 525やってみよう
*foo [bar* baz]
<p><em>foo [bar</em> baz]</p>

以下の事例ではHTMLタグ、コード区域、自動リンクがリンクの結び付きに優先することが例証されています。

例 526やってみよう
[foo <bar attr="](baz)">
<p>[foo <bar attr="](baz)"></p>
例 527やってみよう
[foo`](/uri)`
<p>[foo<code>](/uri)</code></p>
例 528やってみよう
[foo<https://example.com/?search=](uri)>
<p>[foo<a href="https://example.com/?search=%5D(uri)">https://example.com/?search=](uri)</a></p>

参照リンクには3種類あり、完全縮約簡略です。

完全参照リンクリンクテキストに文書のどこかにあるリンク参照定義合致するリンクラベルが直後に続いたものからなります。

リンクラベルはバックスラッシュでエスケープされていない左の角括弧 ([) で始まり最初の右の角括弧 (]) で終わります。 これらの角括弧の間には少なくとも1つの空白、タブ、行末でない文字がなければなりません。 エスケープされていない角括弧の文字はリンクラベルの開始と閉止の角括弧内では許容されません。 リンクラベルには角括弧内に最大で999個の文字を持たせられます。

あるラベルが別のものに合致するのはそれらの正規化された形態が等しい場合に限ります。 ラベルを正規化する上では、開始と閉止の角括弧を切り詰めて、 ユニコードの大文字と小文字の折り畳み が行われ、先頭と末尾の空白、タブ、行末が切り詰められ、連続する内部の空白、タブ、行末が単一の空白に縮められます。 複数の合致する参照リンク定義があるなら、文書で最初に来るものが使われます(そうした場合に警告を出すのが望ましいです)。

リンクのURIと題は合致するリンク参照定義により供されます。

以下は単純な例です。

例 529やってみよう
[foo][bar]

[bar]: /url "title"
<p><a href="/url" title="title">foo</a></p>

リンクテキストの規則は行内リンクと同じです。 したがって以降の通りです。

リンクテキストには釣り合いの取れた角括弧が含まれていて構いませんが、釣り合いが取れていないものはそうではなく、エスケープされていないときに限ります。

例 530やってみよう
[link [foo [bar]]][ref]

[ref]: /uri
<p><a href="/uri">link [foo [bar]]</a></p>
例 531やってみよう
[link \[bar][ref]

[ref]: /uri
<p><a href="/uri">link [bar</a></p>

リンクテキストには行内の内容が含まれていて構いません。

例 532やってみよう
[link *foo **bar** `#`*][ref]

[ref]: /uri
<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
例 533やってみよう
[![moon](moon.jpg)][ref]

[ref]: /uri
<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>

しかしながら、どの入れ子の水準においても、リンクには別のリンクを含められません。

例 534やってみよう
[foo [bar](/uri)][ref]

[ref]: /uri
<p>[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p>
例 535やってみよう
[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つの簡略参照リンクになります)

以下の事例では強調の結び付きに対するリンクテキストの結び付きの優先度が例証されています。

例 536やってみよう
*[foo*][ref]

[ref]: /uri
<p>*<a href="/uri">foo*</a></p>
例 537やってみよう
[foo *bar][ref]*

[ref]: /uri
<p><a href="/uri">foo *bar</a>*</p>

以下の事例ではHTMLタグ、コード区域、自動リンクがリンクの結び付きに優先することが例証されています。

例 538やってみよう
[foo <bar attr="][ref]">

[ref]: /uri
<p>[foo <bar attr="][ref]"></p>
例 539やってみよう
[foo`][ref]`

[ref]: /uri
<p>[foo<code>][ref]</code></p>
例 540やってみよう
[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>

合致では大文字と小文字が区別されません。

例 541やってみよう
[foo][BaR]

[bar]: /url "title"
<p><a href="/url" title="title">foo</a></p>

ユニコードの大文字と小文字の折り畳みが使われます。

例 542やってみよう
[ẞ]

[SS]: /url
<p><a href="/url">ẞ</a></p>

連続する内部の空白、タブ、行末は合致を判定する目的のために1つの空白として扱われます。

例 543やってみよう
[Foo
  bar]: /url

[Baz][Foo bar]
<p><a href="/url">Baz</a></p>

空白、タブ、行末はリンクテキストリンクラベルの間で一切許容されません。

例 544やってみよう
[foo] [bar]

[bar]: /url "title"
<p>[foo] <a href="/url" title="title">bar</a></p>
例 545やってみよう
[foo]
[bar]

[bar]: /url "title"
<p>[foo]
<a href="/url" title="title">bar</a></p>

これはJohn Gruber氏の元来のマークダウンの構文の説明からの新機軸であり、そちらではリンクテキストとリンクラベルの間の空白を陽に許容しています。 それにより行内リンクを持つ行での参照リンクがもたらされ、その行内リンクには(元来のマークダウンと本仕様の両方によれば)リンクテキストの後に空白を持たせられません。 より重要なこととして、それによりうっかり連続する簡略参照リンクに捉えられてしまうことが防がれます。 空白がリンクテキストとリンクラベルの間に許容されるならば、以下においては単一の参照リンクが得られるのであって、2つの簡略参照リンクではなく、これは意図通りです。

[foo]
[bar]

[foo]: /url1
[bar]: /url2

(なお簡略参照リンクMarkdown.plのベータ版においてGruber氏自身により導入されましたが、公式の構文の説明に含められることはありませんでした。 簡略参照リンクがなければ、リンクテキストとリンクラベルの間に空白を許容することは無害ですが、ひとたび簡略参照が導入されれば、頻繁に意図しない結果につながるために、これを許容することは危険すぎます)

複数の合致するリンク参照定義があるとき、最初のものが使われます。

例 546やってみよう
[foo]: /url1

[foo]: /url2

[bar][foo]
<p><a href="/url1">bar</a></p>

なお合致は正規化された文字列に対して行われるのであって、構文解析された行内の内容ではありません。 そのためラベルにより等価な行内の内容が定義されるにしても、以下は合致しません。

例 547やってみよう
[bar][foo\!]

[foo!]: /url
<p>[bar][foo!]</p>

バックスラッシュでエスケープされていない限り、リンクラベルには角括弧を含められません。

例 548やってみよう
[foo][ref[]

[ref[]: /uri
<p>[foo][ref[]</p>
<p>[ref[]: /uri</p>
例 549やってみよう
[foo][ref[bar]]

[ref[bar]]: /uri
<p>[foo][ref[bar]]</p>
<p>[ref[bar]]: /uri</p>
例 550やってみよう
[[[foo]]]

[[[foo]]]: /url
<p>[[[foo]]]</p>
<p>[[[foo]]]: /url</p>
例 551やってみよう
[foo][ref\[]

[ref\[]: /uri
<p><a href="/uri">foo</a></p>

なおこの例では]はバックスラッシュでエスケープされていません。

例 552やってみよう
[bar\\]: /uri

[bar\\]
<p><a href="/uri">bar\</a></p>

リンクラベルには少なくとも1つの空白、タブ、行末ではない文字が含まれていなければなりません。

例 553やってみよう
[]

[]: /uri
<p>[]</p>
<p>[]: /uri</p>
例 554やってみよう
[
 ]

[
 ]: /uri
<p>[
]</p>
<p>[
]: /uri</p>

縮約参照リンクは文書のどこかにあるリンク参照定義合致するリンクラベルに、文字列[]が後に続いたものからなります。 リンクラベルの内容は行内として構文解析され、リンクのテキストとして使われます。 リンクのURLと題は合致する参照リンク定義により供されます。 したがって、[foo][][foo][foo]と等価です。

例 555やってみよう
[foo][]

[foo]: /url "title"
<p><a href="/url" title="title">foo</a></p>
例 556やってみよう
[*foo* bar][]

[*foo* bar]: /url "title"
<p><a href="/url" title="title"><em>foo</em> bar</a></p>

リンクラベルは大文字と小文字が区別されません。

例 557やってみよう
[Foo][]

[foo]: /url "title"
<p><a href="/url" title="title">Foo</a></p>

完全参照リンクと同じく、空白、タブ、行末は2つの角括弧の対の間に許容されません。

例 558やってみよう
[foo] 
[]

[foo]: /url "title"
<p><a href="/url" title="title">foo</a>
[]</p>

簡略参照リンクは文書のどこかにあるリンク参照定義合致するリンクラベルからなり[]ないしリンクラベルが後に続かないものです。 リンクラベルの内容は行内として構文解析され、リンクのテキストとして使われます。 リンクのURIと題は合致するリンク参照定義により供されます。 したがって、[foo][foo][]と等価です。

例 559やってみよう
[foo]

[foo]: /url "title"
<p><a href="/url" title="title">foo</a></p>
例 560やってみよう
[*foo* bar]

[*foo* bar]: /url "title"
<p><a href="/url" title="title"><em>foo</em> bar</a></p>
例 561やってみよう
[[*foo* bar]]

[*foo* bar]: /url "title"
<p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p>
例 562やってみよう
[[bar [foo]

[foo]: /url
<p>[[bar <a href="/url">foo</a></p>

リンクラベルは大文字と小文字が区別されません。

例 563やってみよう
[Foo]

[foo]: /url "title"
<p><a href="/url" title="title">Foo</a></p>

リンクテキストの後の空白は保持されるべきです。

例 564やってみよう
[foo] bar

[foo]: /url
<p><a href="/url">foo</a> bar</p>

角括弧が付いたテキストがほしいだけなら、開く角括弧をバックスラッシュでエスケープしてリンクを避けられます。

例 565やってみよう
\[foo]

[foo]: /url "title"
<p>[foo]</p>

なお以下はリンクですが、それはリンクラベルが最初に後に続く閉じる角括弧で終わるからです。

例 566やってみよう
[foo*]: /url

*[foo*]
<p>*<a href="/url">foo*</a></p>

完全ないし縮約の参照は簡略参照に優先します。

例 567やってみよう
[foo][bar]

[foo]: /url1
[bar]: /url2
<p><a href="/url2">foo</a></p>
例 568やってみよう
[foo][]

[foo]: /url1
<p><a href="/url1">foo</a></p>

行内リンクも優先します。

例 569やってみよう
[foo]()

[foo]: /url1
<p><a href="">foo</a></p>
例 570やってみよう
[foo](not a link)

[foo]: /url1
<p><a href="/url1">foo</a>(not a link)</p>

以下の事例で[bar][baz]は参照として、[foo]は通常のテキストとして構文解析されます。

例 571やってみよう
[foo][bar][baz]

[baz]: /url
<p>[foo]<a href="/url">bar</a></p>

以下では、ただし、[foo][bar]は参照として構文解析されますが、それは[bar]が定義されているためです。

例 572やってみよう
[foo][bar][baz]

[baz]: /url1
[bar]: /url2
<p><a href="/url2">foo</a><a href="/url1">baz</a></p>

以下で[foo]は簡略参照として構文解析されませんが、それは([bar]が定義されていないとしても)リンクラベルが後に続くからです。

例 573やってみよう
[foo][bar][baz]

[baz]: /url1
[foo]: /url2
<p>[foo]<a href="/url1">bar</a></p>

6.4画像

画像のための構文はリンクのための構文と似ていますが、1点違いがあります。 リンクテキストの代わりに、画像の説明があります。 このための規則はリンクテキストのためのものとほぼ同じですが、(a) 画像の説明が[ではなく![で始まる点と、(b) 画像の説明にリンクが含まれていて構わない点は除きます。 画像の説明には内容として行内要素があります。 画像がHTMLに呈示されるとき、これが標準的には画像のalt属性として使われます。

例 574やってみよう
![foo](/url "title")
<p><img src="/url" alt="foo" title="title" /></p>
例 575やってみよう
![foo *bar*]

[foo *bar*]: train.jpg "train & tracks"
<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
例 576やってみよう
![foo ![bar](/url)](/url2)
<p><img src="/url2" alt="foo bar" /></p>
例 577やってみよう
![foo [bar](/url)](/url2)
<p><img src="/url2" alt="foo bar" /></p>

本仕様では構文解析に関心があり、呈示ではないとはいえ、HTMLに呈示する上では、画像の説明の素の文字列の内容のみを使うことが推奨されます。 なお上の例では、代替の属性の値はfoo barであって、foo [bar](/url)foo <a href="url">bar</a>ではありません。 素の文字列の内容のみが呈示され、書式化はされていません。

例 578やってみよう
![foo *bar*][]

[foo *bar*]: train.jpg "train & tracks"
<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
例 579やってみよう
![foo *bar*][foobar]

[FOOBAR]: train.jpg "train & tracks"
<p><img src="train.jpg" alt="foo bar" title="train &amp; tracks" /></p>
例 580やってみよう
![foo](train.jpg)
<p><img src="train.jpg" alt="foo" /></p>
例 581やってみよう
My ![foo bar](/path/to/train.jpg  "title"   )
<p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p>
例 582やってみよう
![foo](<url>)
<p><img src="url" alt="foo" /></p>
例 583やってみよう
![](/url)
<p><img src="/url" alt="" /></p>

参照風では次の通り。

例 584やってみよう
![foo][bar]

[bar]: /url
<p><img src="/url" alt="foo" /></p>
例 585やってみよう
![foo][bar]

[BAR]: /url
<p><img src="/url" alt="foo" /></p>

縮約では次の通り。

例 586やってみよう
![foo][]

[foo]: /url "title"
<p><img src="/url" alt="foo" title="title" /></p>
例 587やってみよう
![*foo* bar][]

[*foo* bar]: /url "title"
<p><img src="/url" alt="foo bar" title="title" /></p>

ラベルは大文字と小文字が区別されません。

例 588やってみよう
![Foo][]

[foo]: /url "title"
<p><img src="/url" alt="Foo" title="title" /></p>

参照リンクと同じく、空白、タブ、行末は、2つの角括弧の対の間には許容されません。

例 589やってみよう
![foo] 
[]

[foo]: /url "title"
<p><img src="/url" alt="foo" title="title" />
[]</p>

簡略では次の通り。

例 590やってみよう
![foo]

[foo]: /url "title"
<p><img src="/url" alt="foo" title="title" /></p>
例 591やってみよう
![*foo* bar]

[*foo* bar]: /url "title"
<p><img src="/url" alt="foo bar" title="title" /></p>

なおリンクラベルにはエスケープされていない角括弧を含められません。

例 592やってみよう
![[foo]]

[[foo]]: /url "title"
<p>![[foo]]</p>
<p>[[foo]]: /url &quot;title&quot;</p>

リンクラベルは大文字と小文字が区別されません。

例 593やってみよう
![Foo]

[foo]: /url "title"
<p><img src="/url" alt="Foo" title="title" /></p>

文字通りの!に角括弧の付いたテキストを後に続けたいだけなら、開きの[をバックスラッシュでエスケープできます。

例 594やってみよう
!\[foo]

[foo]: /url "title"
<p>![foo]</p>

文字通りの!の後にリンクがほしければ、!をバックスラッシュでエスケープしてください。

例 595やってみよう
\![foo]

[foo]: /url "title"
<p>!<a href="/url" title="title">foo</a></p>

6.5自動リンクについて

自動リンク<>の内部に絶対URIや電子メールアドレスがあるものです。 リンクとして構文解析され、そのリンクにはURLないし電子メールアドレスがリンクラベルとしてあります。

URIの自動リンク<、その後に続く絶対URI>が後に続いたものからなります。 URIへのリンクとして構文解析され、そのリンクにはURIがリンクのラベルとしてあります。

絶対URIとは、ここでの目的として、スキームにコロン (:) が後に続きそれにゼロ以上のアスキー制御文字空白<>以外の文字が後に続いたものからなります。 URIにこれらの文字が含まれるなら、パーセント符号化されていなければなりません(例えば空白は%20です)。

本仕様の目的のため、スキームはアスキー文字で始まりアスキー文字、数字、ないし記号の足す (“+”)、ピリオド (“.”)、ハイフン (“-”) の任意の組み合わせが後に続く2個から32個の文字の任意の系列です。

以下はいくつかの適正な自動リンクです。

例 596やってみよう
<http://foo.bar.baz>
<p><a href="http://foo.bar.baz">http://foo.bar.baz</a></p>
例 597やってみよう
<https://foo.bar.baz/test?q=hello&id=22&boolean>
<p><a href="https://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean">https://foo.bar.baz/test?q=hello&amp;id=22&amp;boolean</a></p>
例 598やってみよう
<irc://foo.bar:2233/baz>
<p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>

大文字でも大丈夫です。

例 599やってみよう
<MAILTO:FOO@BAR.BAZ>
<p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p>

なお本仕様の目的のために絶対URIとして見なされる多くの文字列は適正なURIではありませんが、それはスキーマが登録されていないか構文に別の問題があるからです。

例 600やってみよう
<a+b+c:d>
<p><a href="a+b+c:d">a+b+c:d</a></p>
例 601やってみよう
<made-up-scheme://foo,bar>
<p><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p>
例 602やってみよう
<https://../>
<p><a href="https://../">https://../</a></p>
例 603やってみよう
<localhost:5001/foo>
<p><a href="localhost:5001/foo">localhost:5001/foo</a></p>

空白は自動リンク中で許容されません。

例 604やってみよう
<https://foo.bar/baz bim>
<p>&lt;https://foo.bar/baz bim&gt;</p>

バックスラッシュのエスケープは自動リンクの内部では働きません。

例 605やってみよう
<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])?)*$/

電子メールの自動リンクの例は次の通り。

例 606やってみよう
<foo@bar.example.com>
<p><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
例 607やってみよう
<foo+special@Bar.baz-bar0.com>
<p><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a></p>

バックスラッシュのエスケープは電子メールの自動リンクの内側では働きません。

例 608やってみよう
<foo\+@bar.example.com>
<p>&lt;foo+@bar.example.com&gt;</p>

以下は自動リンクではありません。

例 609やってみよう
<>
<p>&lt;&gt;</p>
例 610やってみよう
< https://foo.bar >
<p>&lt; https://foo.bar &gt;</p>
例 611やってみよう
<m:abc>
<p>&lt;m:abc&gt;</p>
例 612やってみよう
<foo.bar.baz>
<p>&lt;foo.bar.baz&gt;</p>
例 613やってみよう
https://example.com
<p>https://example.com</p>
例 614やってみよう
foo@bar.example.com
<p>foo@bar.example.com</p>

6.6素のHTML

HTMLタグのように見える<>の間のテキストは素のHTMLタグとして構文解析されHTMLにおいてエスケープなしに呈示されます。 タグと属性名は現行のHTMLタグに制限されないため、独自のタグを(さらには、例えば、DocBookのタグも)使って構いません。

以下はタグの文法です。

タグ名はアスキー文字にゼロ以上のアスキー文字、数字、ないしハイフン (-) が後に続いたものからなります。

属性は空白、タブ、1つまでの行末、属性名、省略可能な属性値の指定からなります。

属性名はアスキー文字、_、ないし:に、ゼロ以上のアスキー文字、数字、_.:、ないし-が後に続いたものからなります(補足:これはアスキーに制限されたXMLの仕様です。 HTML5ではもっとゆるいです)。

属性値の指定は省略可能な空白、タブ、1つまでの行末、そして=の文字、省略可能な空白、タブ、1つまでの行末、そして属性値からなります。

属性値引用符のない属性値単一引用符の属性値二重引用符の属性値からなります。

引用符のない属性値は空白、タグ、行末、"'=<>、ないし`を含まない文字からなる空でない文字列です。

単一引用符の属性値''を含まないゼロ以上の文字、最後に'からなります。

二重引用符の属性値""を含まないゼロ以上の文字、最後の"からなります。

開始タグ<の文字、タグ名、ゼロ以上の属性、省略可能な空白、タブ、そして1つまでの行末、省略可能な/の文字、そして>の文字からなります。

閉止タグは文字列</タグ名、省略可能な空白、タブ、1つまでの行末、そして文字>からなります。

HTMLコメント<!--><!--->、ないし<!--、文字列-->を含まない文字からなる文字列、そして-->からなります(HTMLの仕様を参照)。

処理命令は文字列<?、文字列?>を含まない文字からなる文字列、そして文字列?>からなります。

宣言は文字列<!、アスキー文字、文字>を含まないゼロ以上の文字、そして文字>からなります。

CDATA節は文字列<![CDATA[、文字列]]>を含まない文字からなる文字列、文字列]]>からなります。

HTMLタグ開始タグ閉止タグHTMLコメント処理命令宣言CDATA節です。

以下は単純な開始タグです。

例 615やってみよう
<a><bab><c2c>
<p><a><bab><c2c></p>

空の要素は次の通り。

例 616やってみよう
<a/><b2/>
<p><a/><b2/></p>

空白は許容されます。

例 617やってみよう
<a  /><b2
data="foo" >
<p><a  /><b2
data="foo" ></p>

属性付きのものは次の通り。

例 618やってみよう
<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>

独自のタグ名が使えます。

例 619やってみよう
Foo <responsive-image src="foo.jpg" />
<p>Foo <responsive-image src="foo.jpg" /></p>

以下は不正なタグ名であって、HTMLとして構文解析されません。

例 620やってみよう
<33> <__>
<p>&lt;33&gt; &lt;__&gt;</p>

以下は不正な属性名です。

例 621やってみよう
<a h*#ref="hi">
<p>&lt;a h*#ref=&quot;hi&quot;&gt;</p>

以下は不正な属性値です。

例 622やってみよう
<a href="hi'> <a href=hi'>
<p>&lt;a href=&quot;hi'&gt; &lt;a href=hi'&gt;</p>

以下は不正な空白です。

例 623やってみよう
< a><
foo><bar/ >
<foo bar=baz
bim!bop />
<p>&lt; a&gt;&lt;
foo&gt;&lt;bar/ &gt;
&lt;foo bar=baz
bim!bop /&gt;</p>

以下は空白が欠けています。

例 624やってみよう
<a href='bar'title=title>
<p>&lt;a href='bar'title=title&gt;</p>

閉止タグは次の通り。

例 625やってみよう
</a></foo >
<p></a></foo ></p>

以下には閉止タグ中に不正な属性があります。

例 626やってみよう
</a href="foo">
<p>&lt;/a href=&quot;foo&quot;&gt;</p>

以下はコメントです。

例 627やってみよう
foo <!-- this is a --
comment - with hyphens -->
<p>foo <!-- this is a --
comment - with hyphens --></p>
例 628やってみよう
foo <!--> foo -->

foo <!---> foo -->
<p>foo <!--> foo --&gt;</p>
<p>foo <!---> foo --&gt;</p>

処理命令は次の通り。

例 629やってみよう
foo <?php echo $a; ?>
<p>foo <?php echo $a; ?></p>

宣言は次の通り。

例 630やってみよう
foo <!ELEMENT br EMPTY>
<p>foo <!ELEMENT br EMPTY></p>

CDATA節は次の通り。

例 631やってみよう
foo <![CDATA[>&<]]>
<p>foo <![CDATA[>&<]]></p>

実体と数値的な文字参照はHTMLの属性で保持されます。

例 632やってみよう
foo <a href="&ouml;">
<p>foo <a href="&ouml;"></p>

バックスラッシュのエスケープはHTMLの属性では働きません。

例 633やってみよう
foo <a href="\*">
<p>foo <a href="\*"></p>
例 634やってみよう
<a href="\"">
<p>&lt;a href=&quot;&quot;&quot;&gt;</p>

タグで改行が許容されるにしても、ブロック引用により行が行内HTMLとして構文解析されることが防がれます。

例 635やってみよう
<a
> quoted text
<p>&lt;a</p>
<blockquote>
<p>quoted text</p>
</blockquote>

6.7固い改行について

2つ以上の空白が前に付きブロックの終わりに現れない(コード区域にもHTMLタグにもない)行末は(HTMLで<br />タグとして呈示される)固い改行として構文解析されます。

例 636やってみよう
foo  
baz
<p>foo<br />
baz</p>

より可視的な代替として、行末の前のバックスラッシュを2つ以上の空白の代わりに使って構いません。

例 637やってみよう
foo\
baz
<p>foo<br />
baz</p>

2つ以上の空白が使えます。

例 638やってみよう
foo       
baz
<p>foo<br />
baz</p>

次の行の始めにある先頭の空白は無視されます。

例 639やってみよう
foo  
     bar
<p>foo<br />
bar</p>
例 640やってみよう
foo\
     bar
<p>foo<br />
bar</p>

固い改行は強調、リンク、行内の内容が許容されるその他の構築要素の内部に現れることができます。

例 641やってみよう
*foo  
bar*
<p><em>foo<br />
bar</em></p>
例 642やってみよう
*foo\
bar*
<p><em>foo<br />
bar</em></p>

固い改行はコード区域内に現れません。

例 643やってみよう
`code  
span`
<p><code>code   span</code></p>
例 644やってみよう
`code\
span`
<p><code>code\ span</code></p>

あるいはHTMLタグ内においても。

例 645やってみよう
<a href="foo  
bar">
<p><a href="foo  
bar"></p>
例 646やってみよう
<a href="foo\
bar">
<p><a href="foo\
bar"></p>

固い改行はブロックの範囲内の行内の内容を離すためのものです。 固い改行のための構文は段落でもその他のブロック要素でもその終わりでは働きません。

例 647やってみよう
foo\
<p>foo\</p>
例 648やってみよう
foo  
<p>foo</p>
例 649やってみよう
### foo\
<h3>foo\</h3>
例 650やってみよう
### foo  
<h3>foo</h3>

6.8柔らかい改行

2つ以上の空白やバックスラッシュが前に付いていない(コード区域やHTMLタグの中でない)通常の行末は柔らかい分割として構文解析されます(柔らかい改行はHTMLでは行末ないし空白として呈示して構いません。 結果はブラウザで同じになるでしょう。 以下の例では、行末が使われています)。

例 651やってみよう
foo
baz
<p>foo
baz</p>

行の終わりと次の行の始めの空白は除かれます。

例 652やってみよう
foo 
 baz
<p>foo
baz</p>

準拠する構文解析では柔らかい改行をHTMLで行末ないし空白のいずれかとして呈示して構いません。

呈示器は柔らかい改行を固い改行として呈示するオプションを供しても構いません。

6.9テキストの内容

上の規則により解釈が与えられていないあらゆる文字は素のテキストの内容として構文解析されます。

例 653やってみよう
hello $.;'there
<p>hello $.;'there</p>
例 654やってみよう
Foo χρῆν
<p>Foo χρῆν</p>

内部の空白は書いたままに保持されます。

例 655やってみよう
Multiple     spaces
<p>Multiple     spaces</p>

補遺:構文解析の戦略

本補遺ではCommonMarkの参照実装で使われている構文解析の戦略の特徴を記述します。

概観

構文解析には二段階あります。

  1. 一段階目では、入力の1つ以上の行が消費され文書のブロックの構造――段落、ブロック引用、リスト項目、その他諸々への分割――が構築されます。 テキストはこれらのブロックに割り当てられますが構文解析されません。 リンク参照定義は構文解析されリンクの対応付けが構築されます。

  2. 二段階目では、一段階目で構築されたリンク参照の対応付けを使って、段落と見出しの素のテキストの内容がマークダウンの行内の要素(文字列、コード区域、リンク、強調、その他諸々)の系列に構文解析されます。

処理における各時点で、文書は ブロック の木として表現されます。 木の根は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つ以上の方法で変えられます。

  1. 1つ以上の開いたブロックを閉じられます。
  2. 1つ以上の新しいブロックを最後の開いたブロックの子として作れます。
  3. テキストを木に残っている最後の(最深の)開いたブロックに加えられます。

いったん行がこのように木に取り込まれたら、無視することができ、そのため入力は一度に流して読めます。

各行について、以下の手続きに従っています。

  1. 最初に開いているブロックを巡回し、文書の根から始め、最後の開いているブロックまで最後の子まで降りていきます。 各ブロックではブロックが開いたままなら行が満たす条件が課されます。 例えば、ブロック引用は>の文字を要求します。 段落は空でない行を要求します。 この段階で開いているブロックのすべてないしごく一部のものに合致するかもしれません。 しかしまだ合致していないブロックは閉じられませんが、それは不精の継続行があるかもしれないからです。

  2. 次に、既存のブロック群に対する継続の印を消費した後に、新しいブロックの開始(例えばブロック引用のための>)を探します。 もし新しいブロックの開始に遭遇したら、工程1で合致していない任意のブロックを閉じて新しいブロックを最後の合致した入れ物ブロックの子として作ります。

  3. 最後に、(>のようなブロックの印、リストの印、消費された字下げの後の)行の残りを見ます。 これは最後の開いたブロック(段落、コードブロック、見出し、ないし素の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の子として、paragraphlist_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_itemlistの子として開かれます。 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"

段階2:行内の構造

いったん入力のすべてが構文解析されれば、すべての開いたブロックが閉じられます。

それから「木を歩き」、つまりすべてのノードを訪れて、段落と見出しの素の文字列の内容を行内として構文解析します。 この時点ですべてのリンク参照定義を見てきたため、参照リンクを進みながら解決していけます。

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区切りスタックでどこまで深く降りていくかの下限を設定します。 NULLなら、ずっと底まで行けます。 さもなければ、stack_bottomを訪れる前に止まります。

current_position区切りスタックstack_bottomのすぐ上の要素(またはstack_bottomがNULLなら最初の要素)を指すようにします。

ここでは各区切りの種別(*_)についてopeners_bottomを追跡しますが、これらは(3を法とする)閉止の区切り連の長さおよび閉止の区切りが開始物にもなれるかどうかが索引付けされています。 これをstack_bottomに初期化します。

それから以下を潜在的な閉止物が底を尽くまで繰り返します。

終わった後は、区切りスタックからstack_bottomの上のすべての区切りを除きます。


本文書はCommonMark Specの日本語訳です。 本文書の使用許諾は原文と同様にCC-BY-SA 4.0のもとに頒布されます。 本訳に係る著作情報は以下の通りです。

Copyright (C) 2026 gemmaro gemmaro.dev@gmail.com.

本訳に先駆けて以下の訳がなされていました。 本訳の作成にあたり主に訳語等に関してそれらを参照したところがあります。 なおメールアドレス中の「at」は「@」に読みかえてください。