| spec.txt | | spec.txt | |
| --- | | --- | |
| title: CommonMark Spec | | title: CommonMark Spec | |
| author: John MacFarlane | | author: John MacFarlane | |
|
| version: 0.23 | | version: 0.24 | |
| date: 2015-12-29 | | date: '2016-01-12' | |
| license: '[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)' | | license: '[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)' | |
| ... | | ... | |
| | | | |
| # Introduction | | # Introduction | |
| | | | |
| ## What is Markdown? | | ## What is Markdown? | |
| | | | |
| Markdown is a plain text format for writing structured documents, | | Markdown is a plain text format for writing structured documents, | |
| based on conventions used for indicating formatting in email and | | based on conventions used for indicating formatting in email and | |
| usenet posts. It was developed in 2004 by John Gruber, who wrote | | usenet posts. It was developed in 2004 by John Gruber, who wrote | |
| | | | |
| skipping to change at line 204 | | skipping to change at line 204 | |
| in Markdown with a small extension for the side-by-side tests. | | in Markdown with a small extension for the side-by-side tests. | |
| The script `tools/makespec.py` can be used to convert `spec.txt` into | | The script `tools/makespec.py` can be used to convert `spec.txt` into | |
| HTML or CommonMark (which can then be converted into other formats). | | HTML or CommonMark (which can then be converted into other formats). | |
| | | | |
| In the examples, the `→` character is used to represent tabs. | | In the examples, the `→` character is used to represent tabs. | |
| | | | |
| # Preliminaries | | # Preliminaries | |
| | | | |
| ## Characters and lines | | ## Characters and lines | |
| | | | |
|
| Any sequence of [character]s is a valid CommonMark | | Any sequence of [characters] is a valid CommonMark | |
| document. | | document. | |
| | | | |
|
| A [character](@character) is a Unicode code point. Although some | | A [character](@) is a Unicode code point. Although some | |
| code points (for example, combining accents) do not correspond to | | code points (for example, combining accents) do not correspond to | |
| characters in an intuitive sense, all code points count as characters | | characters in an intuitive sense, all code points count as characters | |
| for purposes of this spec. | | for purposes of this spec. | |
| | | | |
| This spec does not specify an encoding; it thinks of lines as composed | | This spec does not specify an encoding; it thinks of lines as composed | |
|
| of [character]s rather than bytes. A conforming parser may be limited | | of [characters] rather than bytes. A conforming parser may be limited | |
| to a certain encoding. | | to a certain encoding. | |
| | | | |
|
| A [line](@line) is a sequence of zero or more [character]s | | A [line](@) is a sequence of zero or more [characters] | |
| other than newline (`U+000A`) or carriage return (`U+000D`), | | other than newline (`U+000A`) or carriage return (`U+000D`), | |
| followed by a [line ending] or by the end of file. | | followed by a [line ending] or by the end of file. | |
| | | | |
|
| A [line ending](@line-ending) is a newline (`U+000A`), a carriage return | | A [line ending](@) is a newline (`U+000A`), a carriage return | |
| (`U+000D`) not followed by a newline, or a carriage return and a | | (`U+000D`) not followed by a newline, or a carriage return and a | |
| following newline. | | following newline. | |
| | | | |
| A line containing no characters, or a line containing only spaces | | A line containing no characters, or a line containing only spaces | |
|
| (`U+0020`) or tabs (`U+0009`), is called a [blank line](@blank-line). | | (`U+0020`) or tabs (`U+0009`), is called a [blank line](@). | |
| | | | |
| The following definitions of character classes will be used in this spec: | | The following definitions of character classes will be used in this spec: | |
| | | | |
|
| A [whitespace character](@whitespace-character) is a space | | A [whitespace character](@) is a space | |
| (`U+0020`), tab (`U+0009`), newline (`U+000A`), line tabulation (`U+000B`), | | (`U+0020`), tab (`U+0009`), newline (`U+000A`), line tabulation (`U+000B`), | |
| form feed (`U+000C`), or carriage return (`U+000D`). | | form feed (`U+000C`), or carriage return (`U+000D`). | |
| | | | |
|
| [Whitespace](@whitespace) is a sequence of one or more [whitespace | | [Whitespace](@) is a sequence of one or more [whitespace | |
| character]s. | | characters]. | |
| | | | |
|
| A [Unicode whitespace character](@unicode-whitespace-character) is | | A [Unicode whitespace character](@) is | |
| any code point in the Unicode `Zs` class, or a tab (`U+0009`), | | any code point in the Unicode `Zs` class, or a tab (`U+0009`), | |
| carriage return (`U+000D`), newline (`U+000A`), or form feed | | carriage return (`U+000D`), newline (`U+000A`), or form feed | |
| (`U+000C`). | | (`U+000C`). | |
| | | | |
|
| [Unicode whitespace](@unicode-whitespace) is a sequence of one | | [Unicode whitespace](@) is a sequence of one | |
| or more [Unicode whitespace character]s. | | or more [Unicode whitespace characters]. | |
| | | | |
|
| A [space](@space) is `U+0020`. | | A [space](@) is `U+0020`. | |
| | | | |
|
| A [non-whitespace character](@non-whitespace-character) is any character | | A [non-whitespace character](@) is any character | |
| that is not a [whitespace character]. | | that is not a [whitespace character]. | |
| | | | |
|
| An [ASCII punctuation character](@ascii-punctuation-character) | | An [ASCII punctuation character](@) | |
| is `!`, `"`, `#`, `$`, `%`, `&`, `'`, `(`, `)`, | | is `!`, `"`, `#`, `$`, `%`, `&`, `'`, `(`, `)`, | |
| `*`, `+`, `,`, `-`, `.`, `/`, `:`, `;`, `<`, `=`, `>`, `?`, `@`, | | `*`, `+`, `,`, `-`, `.`, `/`, `:`, `;`, `<`, `=`, `>`, `?`, `@`, | |
| `[`, `\`, `]`, `^`, `_`, `` ` ``, `{`, `|`, `}`, or `~`. | | `[`, `\`, `]`, `^`, `_`, `` ` ``, `{`, `|`, `}`, or `~`. | |
| | | | |
|
| A [punctuation character](@punctuation-character) is an [ASCII | | A [punctuation character](@) is an [ASCII | |
| punctuation character] or anything in | | punctuation character] or anything in | |
| the Unicode classes `Pc`, `Pd`, `Pe`, `Pf`, `Pi`, `Po`, or `Ps`. | | the Unicode classes `Pc`, `Pd`, `Pe`, `Pf`, `Pi`, `Po`, or `Ps`. | |
| | | | |
| ## Tabs | | ## Tabs | |
| | | | |
|
| Tabs in lines are not expanded to [spaces][space]. However, | | Tabs in lines are not expanded to [spaces]. However, | |
| in contexts where indentation is significant for the | | in contexts where indentation is significant for the | |
| document's structure, tabs behave as if they were replaced | | document's structure, tabs behave as if they were replaced | |
| by spaces with a tab stop of 4 characters. | | by spaces with a tab stop of 4 characters. | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| →foo→baz→→bim | | →foo→baz→→bim | |
| . | | . | |
| <pre><code>foo→baz→→bim | | <pre><code>foo→baz→→bim | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| →foo→baz→→bim | | →foo→baz→→bim | |
| . | | . | |
| <pre><code>foo→baz→→bim | | <pre><code>foo→baz→→bim | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| a→a | | a→a | |
| ὐ→a | | ὐ→a | |
| . | | . | |
| <pre><code>a→a | | <pre><code>a→a | |
| ὐ→a | | ὐ→a | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| | | | |
| →bar | | →bar | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>foo</p> | | <p>foo</p> | |
| <p>bar</p> | | <p>bar</p> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| >→foo→bar | | >→foo→bar | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>foo→bar</p> | | <p>foo→bar</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo | | foo | |
| →bar | | →bar | |
| . | | . | |
| <pre><code>foo | | <pre><code>foo | |
| bar | | bar | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| ## Insecure characters | | ## Insecure characters | |
| | | | |
| For security reasons, the Unicode character `U+0000` must be replaced | | For security reasons, the Unicode character `U+0000` must be replaced | |
|
| with the replacement character (`U+FFFD`). | | with the REPLACEMENT CHARACTER (`U+FFFD`). | |
| | | | |
| # Blocks and inlines | | # Blocks and inlines | |
| | | | |
| We can think of a document as a sequence of | | We can think of a document as a sequence of | |
|
| [blocks](@block)---structural elements like paragraphs, block | | [blocks](@)---structural elements like paragraphs, block | |
| quotations, lists, headings, rules, and code blocks. Some blocks (like | | quotations, lists, headings, rules, and code blocks. Some blocks (like | |
| block quotes and list items) contain other blocks; others (like | | block quotes and list items) contain other blocks; others (like | |
|
| headings and paragraphs) contain [inline](@inline) content---text, | | headings and paragraphs) contain [inline](@) content---text, | |
| links, emphasized text, images, code, and so on. | | links, emphasized text, images, code, and so on. | |
| | | | |
| ## Precedence | | ## Precedence | |
| | | | |
| Indicators of block structure always take precedence over indicators | | Indicators of block structure always take precedence over indicators | |
| of inline structure. So, for example, the following is a list with | | of inline structure. So, for example, the following is a list with | |
| two items, not a list with one item containing a code span: | | two items, not a list with one item containing a code span: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - `one | | - `one | |
| - two` | | - two` | |
| . | | . | |
| <ul> | | <ul> | |
| <li>`one</li> | | <li>`one</li> | |
| <li>two`</li> | | <li>two`</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This means that parsing can proceed in two steps: first, the block | | This means that parsing can proceed in two steps: first, the block | |
| structure of the document can be discerned; second, text lines inside | | structure of the document can be discerned; second, text lines inside | |
| paragraphs, headings, and other block constructs can be parsed for inline | | paragraphs, headings, and other block constructs can be parsed for inline | |
| structure. The second step requires information about link reference | | structure. The second step requires information about link reference | |
| definitions that will be available only at the end of the first | | definitions that will be available only at the end of the first | |
| step. Note that the first step requires processing lines in sequence, | | step. Note that the first step requires processing lines in sequence, | |
| but the second can be parallelized, since the inline parsing of | | but the second can be parallelized, since the inline parsing of | |
| one block element does not affect the inline parsing of any other. | | one block element does not affect the inline parsing of any other. | |
| | | | |
| ## Container blocks and leaf blocks | | ## Container blocks and leaf blocks | |
| | | | |
| We can divide blocks into two types: | | We can divide blocks into two types: | |
|
| [container block](@container-block)s, | | [container block](@)s, | |
| which can contain other blocks, and [leaf block](@leaf-block)s, | | which can contain other blocks, and [leaf block](@)s, | |
| which cannot. | | which cannot. | |
| | | | |
| # Leaf blocks | | # Leaf blocks | |
| | | | |
| This section describes the different kinds of leaf block that make up a | | This section describes the different kinds of leaf block that make up a | |
| Markdown document. | | Markdown document. | |
| | | | |
| ## Thematic breaks | | ## Thematic breaks | |
| | | | |
| A line consisting of 0-3 spaces of indentation, followed by a sequence | | A line consisting of 0-3 spaces of indentation, followed by a sequence | |
| of three or more matching `-`, `_`, or `*` characters, each followed | | of three or more matching `-`, `_`, or `*` characters, each followed | |
| optionally by any number of spaces, forms a | | optionally by any number of spaces, forms a | |
|
| [thematic break](@thematic-break). | | [thematic break](@). | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| *** | | *** | |
| --- | | --- | |
| ___ | | ___ | |
| . | | . | |
| <hr /> | | <hr /> | |
| <hr /> | | <hr /> | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Wrong characters: | | Wrong characters: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| +++ | | +++ | |
| . | | . | |
| <p>+++</p> | | <p>+++</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| === | | === | |
| . | | . | |
| <p>===</p> | | <p>===</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Not enough characters: | | Not enough characters: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| -- | | -- | |
| ** | | ** | |
| __ | | __ | |
| . | | . | |
| <p>-- | | <p>-- | |
| ** | | ** | |
| __</p> | | __</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| One to three spaces indent are allowed: | | One to three spaces indent are allowed: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| *** | | *** | |
| *** | | *** | |
| *** | | *** | |
| . | | . | |
| <hr /> | | <hr /> | |
| <hr /> | | <hr /> | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Four spaces is too many: | | Four spaces is too many: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| *** | | *** | |
| . | | . | |
| <pre><code>*** | | <pre><code>*** | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| *** | | *** | |
| . | | . | |
| <p>Foo | | <p>Foo | |
| ***</p> | | ***</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| More than three characters may be used: | | More than three characters may be used: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| _____________________________________ | | _____________________________________ | |
| . | | . | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Spaces are allowed between the characters: | | Spaces are allowed between the characters: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - - - | | - - - | |
| . | | . | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ** * ** * ** * ** | | ** * ** * ** * ** | |
| . | | . | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - - - - | | - - - - | |
| . | | . | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Spaces are allowed at the end: | | Spaces are allowed at the end: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - - - - | | - - - - | |
| . | | . | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| However, no other characters may occur in the line: | | However, no other characters may occur in the line: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| _ _ _ _ a | | _ _ _ _ a | |
| | | | |
| a------ | | a------ | |
| | | | |
| ---a--- | | ---a--- | |
| . | | . | |
| <p>_ _ _ _ a</p> | | <p>_ _ _ _ a</p> | |
| <p>a------</p> | | <p>a------</p> | |
| <p>---a---</p> | | <p>---a---</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| It is required that all of the [non-whitespace character]s be the same. | | It is required that all of the [non-whitespace characters] be the same. | |
| So, this is not a thematic break: | | So, this is not a thematic break: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| *-* | | *-* | |
| . | | . | |
| <p><em>-</em></p> | | <p><em>-</em></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Thematic breaks do not need blank lines before or after: | | Thematic breaks do not need blank lines before or after: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| *** | | *** | |
| - bar | | - bar | |
| . | | . | |
| <ul> | | <ul> | |
| <li>foo</li> | | <li>foo</li> | |
| </ul> | | </ul> | |
| <hr /> | | <hr /> | |
| <ul> | | <ul> | |
| <li>bar</li> | | <li>bar</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Thematic breaks can interrupt a paragraph: | | Thematic breaks can interrupt a paragraph: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| *** | | *** | |
| bar | | bar | |
| . | | . | |
| <p>Foo</p> | | <p>Foo</p> | |
| <hr /> | | <hr /> | |
| <p>bar</p> | | <p>bar</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| If a line of dashes that meets the above conditions for being a | | If a line of dashes that meets the above conditions for being a | |
| thematic break could also be interpreted as the underline of a [setext | | thematic break could also be interpreted as the underline of a [setext | |
| heading], the interpretation as a | | heading], the interpretation as a | |
| [setext heading] takes precedence. Thus, for example, | | [setext heading] takes precedence. Thus, for example, | |
| this is a setext heading, not a paragraph followed by a thematic break: | | this is a setext heading, not a paragraph followed by a thematic break: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| --- | | --- | |
| bar | | bar | |
| . | | . | |
| <h2>Foo</h2> | | <h2>Foo</h2> | |
| <p>bar</p> | | <p>bar</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| When both a thematic break and a list item are possible | | When both a thematic break and a list item are possible | |
| interpretations of a line, the thematic break takes precedence: | | interpretations of a line, the thematic break takes precedence: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| * Foo | | * Foo | |
| * * * | | * * * | |
| * Bar | | * Bar | |
| . | | . | |
| <ul> | | <ul> | |
| <li>Foo</li> | | <li>Foo</li> | |
| </ul> | | </ul> | |
| <hr /> | | <hr /> | |
| <ul> | | <ul> | |
| <li>Bar</li> | | <li>Bar</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| If you want a thematic break in a list item, use a different bullet: | | If you want a thematic break in a list item, use a different bullet: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - Foo | | - Foo | |
| - * * * | | - * * * | |
| . | | . | |
| <ul> | | <ul> | |
| <li>Foo</li> | | <li>Foo</li> | |
| <li> | | <li> | |
| <hr /> | | <hr /> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| ## ATX headings | | ## ATX headings | |
| | | | |
|
| An [ATX heading](@atx-heading) | | An [ATX heading](@) | |
| consists of a string of characters, parsed as inline content, between an | | consists of a string of characters, parsed as inline content, between an | |
| opening sequence of 1--6 unescaped `#` characters and an optional | | opening sequence of 1--6 unescaped `#` characters and an optional | |
| closing sequence of any number of unescaped `#` characters. | | closing sequence of any number of unescaped `#` characters. | |
| The opening sequence of `#` characters must be followed by a | | The opening sequence of `#` characters must be followed by a | |
| [space] or by the end of line. The optional closing sequence of `#`s must be | | [space] or by the end of line. The optional closing sequence of `#`s must be | |
| preceded by a [space] and may be followed by spaces only. The opening | | preceded by a [space] and may be followed by spaces only. The opening | |
| `#` character may be indented 0-3 spaces. The raw contents of the | | `#` character may be indented 0-3 spaces. The raw contents of the | |
| heading are stripped of leading and trailing spaces before being parsed | | heading are stripped of leading and trailing spaces before being parsed | |
| as inline content. The heading level is equal to the number of `#` | | as inline content. The heading level is equal to the number of `#` | |
| characters in the opening sequence. | | characters in the opening sequence. | |
| | | | |
| Simple headings: | | Simple headings: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| # foo | | # foo | |
| ## foo | | ## foo | |
| ### foo | | ### foo | |
| #### foo | | #### foo | |
| ##### foo | | ##### foo | |
| ###### foo | | ###### foo | |
| . | | . | |
| <h1>foo</h1> | | <h1>foo</h1> | |
| <h2>foo</h2> | | <h2>foo</h2> | |
| <h3>foo</h3> | | <h3>foo</h3> | |
| <h4>foo</h4> | | <h4>foo</h4> | |
| <h5>foo</h5> | | <h5>foo</h5> | |
| <h6>foo</h6> | | <h6>foo</h6> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| More than six `#` characters is not a heading: | | More than six `#` characters is not a heading: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ####### foo | | ####### foo | |
| . | | . | |
| <p>####### foo</p> | | <p>####### foo</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| At least one space is required between the `#` characters and the | | At least one space is required between the `#` characters and the | |
| heading's contents, unless the heading is empty. Note that many | | heading's contents, unless the heading is empty. Note that many | |
| implementations currently do not require the space. However, the | | implementations currently do not require the space. However, the | |
| space was required by the | | space was required by the | |
| [original ATX implementation](http://www.aaronsw.com/2002/atx/atx.py), | | [original ATX implementation](http://www.aaronsw.com/2002/atx/atx.py), | |
| and it helps prevent things like the following from being parsed as | | and it helps prevent things like the following from being parsed as | |
| headings: | | headings: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| #5 bolt | | #5 bolt | |
| | | | |
| #hashtag | | #hashtag | |
| . | | . | |
| <p>#5 bolt</p> | | <p>#5 bolt</p> | |
| <p>#hashtag</p> | | <p>#hashtag</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A tab will not work: | | A tab will not work: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| #→foo | | #→foo | |
| . | | . | |
| <p>#→foo</p> | | <p>#→foo</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not a heading, because the first `#` is escaped: | | This is not a heading, because the first `#` is escaped: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| \## foo | | \## foo | |
| . | | . | |
| <p>## foo</p> | | <p>## foo</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Contents are parsed as inlines: | | Contents are parsed as inlines: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| # foo *bar* \*baz\* | | # foo *bar* \*baz\* | |
| . | | . | |
| <h1>foo <em>bar</em> *baz*</h1> | | <h1>foo <em>bar</em> *baz*</h1> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Leading and trailing blanks are ignored in parsing inline content: | | Leading and trailing blanks are ignored in parsing inline content: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| # foo | | # foo | |
| . | | . | |
| <h1>foo</h1> | | <h1>foo</h1> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| One to three spaces indentation are allowed: | | One to three spaces indentation are allowed: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ### foo | | ### foo | |
| ## foo | | ## foo | |
| # foo | | # foo | |
| . | | . | |
| <h3>foo</h3> | | <h3>foo</h3> | |
| <h2>foo</h2> | | <h2>foo</h2> | |
| <h1>foo</h1> | | <h1>foo</h1> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Four spaces are too much: | | Four spaces are too much: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| # foo | | # foo | |
| . | | . | |
| <pre><code># foo | | <pre><code># foo | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo | | foo | |
| # bar | | # bar | |
| . | | . | |
| <p>foo | | <p>foo | |
| # bar</p> | | # bar</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A closing sequence of `#` characters is optional: | | A closing sequence of `#` characters is optional: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ## foo ## | | ## foo ## | |
| ### bar ### | | ### bar ### | |
| . | | . | |
| <h2>foo</h2> | | <h2>foo</h2> | |
| <h3>bar</h3> | | <h3>bar</h3> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| It need not be the same length as the opening sequence: | | It need not be the same length as the opening sequence: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| # foo ################################## | | # foo ################################## | |
| ##### foo ## | | ##### foo ## | |
| . | | . | |
| <h1>foo</h1> | | <h1>foo</h1> | |
| <h5>foo</h5> | | <h5>foo</h5> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Spaces are allowed after the closing sequence: | | Spaces are allowed after the closing sequence: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ### foo ### | | ### foo ### | |
| . | | . | |
| <h3>foo</h3> | | <h3>foo</h3> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| A sequence of `#` characters with anything but [space]s following it | | A sequence of `#` characters with anything but [spaces] following it | |
| is not a closing sequence, but counts as part of the contents of the | | is not a closing sequence, but counts as part of the contents of the | |
| heading: | | heading: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ### foo ### b | | ### foo ### b | |
| . | | . | |
| <h3>foo ### b</h3> | | <h3>foo ### b</h3> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The closing sequence must be preceded by a space: | | The closing sequence must be preceded by a space: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| # foo# | | # foo# | |
| . | | . | |
| <h1>foo#</h1> | | <h1>foo#</h1> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Backslash-escaped `#` characters do not count as part | | Backslash-escaped `#` characters do not count as part | |
| of the closing sequence: | | of the closing sequence: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ### foo \### | | ### foo \### | |
| ## foo #\## | | ## foo #\## | |
| # foo \# | | # foo \# | |
| . | | . | |
| <h3>foo ###</h3> | | <h3>foo ###</h3> | |
| <h2>foo ###</h2> | | <h2>foo ###</h2> | |
| <h1>foo #</h1> | | <h1>foo #</h1> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| ATX headings need not be separated from surrounding content by blank | | ATX headings need not be separated from surrounding content by blank | |
| lines, and they can interrupt paragraphs: | | lines, and they can interrupt paragraphs: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| **** | | **** | |
| ## foo | | ## foo | |
| **** | | **** | |
| . | | . | |
| <hr /> | | <hr /> | |
| <h2>foo</h2> | | <h2>foo</h2> | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo bar | | Foo bar | |
| # baz | | # baz | |
| Bar foo | | Bar foo | |
| . | | . | |
| <p>Foo bar</p> | | <p>Foo bar</p> | |
| <h1>baz</h1> | | <h1>baz</h1> | |
| <p>Bar foo</p> | | <p>Bar foo</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| ATX headings can be empty: | | ATX headings can be empty: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ## | | ## | |
| # | | # | |
| ### ### | | ### ### | |
| . | | . | |
| <h2></h2> | | <h2></h2> | |
| <h1></h1> | | <h1></h1> | |
| <h3></h3> | | <h3></h3> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| ## Setext headings | | ## Setext headings | |
| | | | |
|
| A [setext heading](@setext-heading) | | A [setext heading](@) consists of one or more | |
| consists of a line of text, containing at least one [non-whitespace character], | | lines of text, each containing at least one [non-whitespace | |
| with no more than 3 spaces indentation, followed by a [setext heading | | character], with no more than 3 spaces indentation, followed by | |
| underline]. The line of text must be | | a [setext heading underline]. The lines of text must be such | |
| one that, were it not followed by the setext heading underline, | | that, were they not followed by the setext heading underline, | |
| would be interpreted as part of a paragraph: it cannot be | | they would be interpreted as a paragraph: they cannot be | |
| interpretable as a [code fence], [ATX heading][ATX headings], | | interpretable as a [code fence], [ATX heading][ATX headings], | |
| [block quote][block quotes], [thematic break][thematic breaks], | | [block quote][block quotes], [thematic break][thematic breaks], | |
| [list item][list items], or [HTML block][HTML blocks]. | | [list item][list items], or [HTML block][HTML blocks]. | |
| | | | |
|
| A [setext heading underline](@setext-heading-underline) is a sequence of | | A [setext heading underline](@) is a sequence of | |
| `=` characters or a sequence of `-` characters, with no more than 3 | | `=` characters or a sequence of `-` characters, with no more than 3 | |
| spaces indentation and any number of trailing spaces. If a line | | spaces indentation and any number of trailing spaces. If a line | |
| containing a single `-` can be interpreted as an | | containing a single `-` can be interpreted as an | |
| empty [list items], it should be interpreted this way | | empty [list items], it should be interpreted this way | |
| and not as a [setext heading underline]. | | and not as a [setext heading underline]. | |
| | | | |
|
| The heading is a level 1 heading if `=` characters are used in the | | The heading is a level 1 heading if `=` characters are used in | |
| [setext heading underline], and a level 2 | | the [setext heading underline], and a level 2 heading if `-` | |
| heading if `-` characters are used. The contents of the heading are the | | characters are used. The contents of the heading are the result | |
| result of parsing the first line as Markdown inline content. | | of parsing the preceding lines of text as CommonMark inline | |
| | | content. | |
| | | | |
| In general, a setext heading need not be preceded or followed by a | | In general, a setext heading need not be preceded or followed by a | |
| blank line. However, it cannot interrupt a paragraph, so when a | | blank line. However, it cannot interrupt a paragraph, so when a | |
| setext heading comes after a paragraph, a blank line is needed between | | setext heading comes after a paragraph, a blank line is needed between | |
| them. | | them. | |
| | | | |
| Simple examples: | | Simple examples: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo *bar* | | Foo *bar* | |
| ========= | | ========= | |
| | | | |
| Foo *bar* | | Foo *bar* | |
| --------- | | --------- | |
| . | | . | |
| <h1>Foo <em>bar</em></h1> | | <h1>Foo <em>bar</em></h1> | |
| <h2>Foo <em>bar</em></h2> | | <h2>Foo <em>bar</em></h2> | |
|
| | | ```````````````````````````````` | |
| | | | |
| | | The content of the header may span more than one line: | |
| | | | |
| | | ```````````````````````````````` example | |
| | | Foo *bar | |
| | | baz* | |
| | | ==== | |
| . | | . | |
|
| | | <h1>Foo <em>bar | |
| | | baz</em></h1> | |
| | | ```````````````````````````````` | |
| | | | |
| The underlining can be any length: | | The underlining can be any length: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| ------------------------- | | ------------------------- | |
| | | | |
| Foo | | Foo | |
| = | | = | |
| . | | . | |
| <h2>Foo</h2> | | <h2>Foo</h2> | |
| <h1>Foo</h1> | | <h1>Foo</h1> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The heading content can be indented up to three spaces, and need | | The heading content can be indented up to three spaces, and need | |
| not line up with the underlining: | | not line up with the underlining: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| --- | | --- | |
| | | | |
| Foo | | Foo | |
| ----- | | ----- | |
| | | | |
| Foo | | Foo | |
| === | | === | |
| . | | . | |
| <h2>Foo</h2> | | <h2>Foo</h2> | |
| <h2>Foo</h2> | | <h2>Foo</h2> | |
| <h1>Foo</h1> | | <h1>Foo</h1> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Four spaces indent is too much: | | Four spaces indent is too much: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| --- | | --- | |
| | | | |
| Foo | | Foo | |
| --- | | --- | |
| . | | . | |
| <pre><code>Foo | | <pre><code>Foo | |
| --- | | --- | |
| | | | |
| Foo | | Foo | |
| </code></pre> | | </code></pre> | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The setext heading underline can be indented up to three spaces, and | | The setext heading underline can be indented up to three spaces, and | |
| may have trailing spaces: | | may have trailing spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| ---- | | ---- | |
| . | | . | |
| <h2>Foo</h2> | | <h2>Foo</h2> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Four spaces is too much: | | Four spaces is too much: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| --- | | --- | |
| . | | . | |
| <p>Foo | | <p>Foo | |
| ---</p> | | ---</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The setext heading underline cannot contain internal spaces: | | The setext heading underline cannot contain internal spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| = = | | = = | |
| | | | |
| Foo | | Foo | |
| --- - | | --- - | |
| . | | . | |
| <p>Foo | | <p>Foo | |
| = =</p> | | = =</p> | |
| <p>Foo</p> | | <p>Foo</p> | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Trailing spaces in the content line do not cause a line break: | | Trailing spaces in the content line do not cause a line break: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| ----- | | ----- | |
| . | | . | |
| <h2>Foo</h2> | | <h2>Foo</h2> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Nor does a backslash at the end: | | Nor does a backslash at the end: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo\ | | Foo\ | |
| ---- | | ---- | |
| . | | . | |
| <h2>Foo\</h2> | | <h2>Foo\</h2> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Since indicators of block structure take precedence over | | Since indicators of block structure take precedence over | |
| indicators of inline structure, the following are setext headings: | | indicators of inline structure, the following are setext headings: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| `Foo | | `Foo | |
| ---- | | ---- | |
| ` | | ` | |
| | | | |
| <a title="a lot | | <a title="a lot | |
| --- | | --- | |
| of dashes"/> | | of dashes"/> | |
| . | | . | |
| <h2>`Foo</h2> | | <h2>`Foo</h2> | |
| <p>`</p> | | <p>`</p> | |
| <h2><a title="a lot</h2> | | <h2><a title="a lot</h2> | |
| <p>of dashes"/></p> | | <p>of dashes"/></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The setext heading underline cannot be a [lazy continuation | | The setext heading underline cannot be a [lazy continuation | |
| line] in a list item or block quote: | | line] in a list item or block quote: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > Foo | | > Foo | |
| --- | | --- | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>Foo</p> | | <p>Foo</p> | |
| </blockquote> | | </blockquote> | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| | | ```````````````````````````````` example | |
| | | > foo | |
| | | bar | |
| | | === | |
| . | | . | |
|
| | | <blockquote> | |
| | | <p>foo | |
| | | bar | |
| | | ===</p> | |
| | | </blockquote> | |
| | | ```````````````````````````````` | |
| | | | |
| | | ```````````````````````````````` example | |
| - Foo | | - Foo | |
| --- | | --- | |
| . | | . | |
| <ul> | | <ul> | |
| <li>Foo</li> | | <li>Foo</li> | |
| </ul> | | </ul> | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| A setext heading cannot interrupt a paragraph: | | A blank line is needed between a paragraph and a following | |
| | | setext heading, since otherwise the paragraph becomes part | |
| | | of the heading's content: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| Bar | | Bar | |
| --- | | --- | |
|
| | | | |
| Foo | | | |
| Bar | | | |
| === | | | |
| . | | | |
| <p>Foo | | | |
| Bar</p> | | | |
| <hr /> | | | |
| <p>Foo | | | |
| Bar | | | |
| ===</p> | | | |
| . | | . | |
|
| | | <h2>Foo | |
| | | Bar</h2> | |
| | | ```````````````````````````````` | |
| | | | |
|
| But in general a blank line is not required before or after: | | But in general a blank line is not required before or after | |
| | | setext headings: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| --- | | --- | |
| Foo | | Foo | |
| --- | | --- | |
| Bar | | Bar | |
| --- | | --- | |
| Baz | | Baz | |
| . | | . | |
| <hr /> | | <hr /> | |
| <h2>Foo</h2> | | <h2>Foo</h2> | |
| <h2>Bar</h2> | | <h2>Bar</h2> | |
| <p>Baz</p> | | <p>Baz</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Setext headings cannot be empty: | | Setext headings cannot be empty: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| | | | |
| ==== | | ==== | |
| . | | . | |
| <p>====</p> | | <p>====</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Setext heading text lines must not be interpretable as block | | Setext heading text lines must not be interpretable as block | |
| constructs other than paragraphs. So, the line of dashes | | constructs other than paragraphs. So, the line of dashes | |
| in these examples gets interpreted as a thematic break: | | in these examples gets interpreted as a thematic break: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| --- | | --- | |
| --- | | --- | |
| . | | . | |
| <hr /> | | <hr /> | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| ----- | | ----- | |
| . | | . | |
| <ul> | | <ul> | |
| <li>foo</li> | | <li>foo</li> | |
| </ul> | | </ul> | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo | | foo | |
| --- | | --- | |
| . | | . | |
| <pre><code>foo | | <pre><code>foo | |
| </code></pre> | | </code></pre> | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > foo | | > foo | |
| ----- | | ----- | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>foo</p> | | <p>foo</p> | |
| </blockquote> | | </blockquote> | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| If you want a heading with `> foo` as its literal text, you can | | If you want a heading with `> foo` as its literal text, you can | |
| use backslash escapes: | | use backslash escapes: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| \> foo | | \> foo | |
| ------ | | ------ | |
| . | | . | |
| <h2>> foo</h2> | | <h2>> foo</h2> | |
|
| | | ```````````````````````````````` | |
| | | | |
| | | **Compatibility note:** Most existing Markdown implementations | |
| | | do not allow the text of setext headings to span multiple lines. | |
| | | But there is no consensus about how to interpret | |
| | | | |
| | | ``` markdown | |
| | | Foo | |
| | | bar | |
| | | --- | |
| | | baz | |
| | | ``` | |
| | | | |
| | | One can find four different interpretations: | |
| | | | |
| | | 1. paragraph "Foo", heading "bar", paragraph "baz" | |
| | | 2. paragraph "Foo bar", thematic break, paragraph "baz" | |
| | | 3. paragraph "Foo bar --- baz" | |
| | | 4. heading "Foo bar", paragraph "baz" | |
| | | | |
| | | We find interpretation 4 most natural, and interpretation 4 | |
| | | increases the expressive power of CommonMark, by allowing | |
| | | multiline headings. Authors who want interpretation 1 can | |
| | | put a blank line after the first paragraph: | |
| | | | |
| | | ```````````````````````````````` example | |
| | | Foo | |
| | | | |
| | | bar | |
| | | --- | |
| | | baz | |
| | | . | |
| | | <p>Foo</p> | |
| | | <h2>bar</h2> | |
| | | <p>baz</p> | |
| | | ```````````````````````````````` | |
| | | | |
| | | Authors who want interpretation 2 can put blank lines around | |
| | | the thematic break, | |
| | | | |
| | | ```````````````````````````````` example | |
| | | Foo | |
| | | bar | |
| | | | |
| | | --- | |
| | | | |
| | | baz | |
| | | . | |
| | | <p>Foo | |
| | | bar</p> | |
| | | <hr /> | |
| | | <p>baz</p> | |
| | | ```````````````````````````````` | |
| | | | |
| | | or use a thematic break that cannot count as a [setext heading | |
| | | line], such as | |
| | | | |
| | | ```````````````````````````````` example | |
| | | Foo | |
| | | bar | |
| | | * * * | |
| | | baz | |
| . | | . | |
|
| | | <p>Foo | |
| | | bar</p> | |
| | | <hr /> | |
| | | <p>baz</p> | |
| | | ```````````````````````````````` | |
| | | | |
| | | Authors who want interpretation 3 can use backslash escapes: | |
| | | | |
| | | ```````````````````````````````` example | |
| | | Foo | |
| | | bar | |
| | | \--- | |
| | | baz | |
| | | . | |
| | | <p>Foo | |
| | | bar | |
| | | --- | |
| | | baz</p> | |
| | | ```````````````````````````````` | |
| | | | |
| ## Indented code blocks | | ## Indented code blocks | |
| | | | |
|
| An [indented code block](@indented-code-block) is composed of one or more | | An [indented code block](@) is composed of one or more | |
| [indented chunk]s separated by blank lines. | | [indented chunks] separated by blank lines. | |
| An [indented chunk](@indented-chunk) is a sequence of non-blank lines, | | An [indented chunk](@) is a sequence of non-blank lines, | |
| each indented four or more spaces. The contents of the code block are | | each indented four or more spaces. The contents of the code block are | |
| the literal contents of the lines, including trailing | | the literal contents of the lines, including trailing | |
|
| [line ending]s, minus four spaces of indentation. | | [line endings], minus four spaces of indentation. | |
| An indented code block has no [info string]. | | An indented code block has no [info string]. | |
| | | | |
| An indented code block cannot interrupt a paragraph, so there must be | | An indented code block cannot interrupt a paragraph, so there must be | |
| a blank line between a paragraph and a following indented code block. | | a blank line between a paragraph and a following indented code block. | |
| (A blank line is not needed, however, between a code block and a following | | (A blank line is not needed, however, between a code block and a following | |
| paragraph.) | | paragraph.) | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| a simple | | a simple | |
| indented code block | | indented code block | |
| . | | . | |
| <pre><code>a simple | | <pre><code>a simple | |
| indented code block | | indented code block | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| If there is any ambiguity between an interpretation of indentation | | If there is any ambiguity between an interpretation of indentation | |
| as a code block and as indicating that material belongs to a [list | | as a code block and as indicating that material belongs to a [list | |
| item][list items], the list item interpretation takes precedence: | | item][list items], the list item interpretation takes precedence: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| | | | |
| bar | | bar | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>foo</p> | | <p>foo</p> | |
| <p>bar</p> | | <p>bar</p> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. foo | | 1. foo | |
| | | | |
| - bar | | - bar | |
| . | | . | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <p>foo</p> | | <p>foo</p> | |
| <ul> | | <ul> | |
| <li>bar</li> | | <li>bar</li> | |
| </ul> | | </ul> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The contents of a code block are literal text, and do not get parsed | | The contents of a code block are literal text, and do not get parsed | |
| as Markdown: | | as Markdown: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <a/> | | <a/> | |
| *hi* | | *hi* | |
| | | | |
| - one | | - one | |
| . | | . | |
| <pre><code><a/> | | <pre><code><a/> | |
| *hi* | | *hi* | |
| | | | |
| - one | | - one | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Here we have three chunks separated by blank lines: | | Here we have three chunks separated by blank lines: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| chunk1 | | chunk1 | |
| | | | |
| chunk2 | | chunk2 | |
| | | | |
| chunk3 | | chunk3 | |
| . | | . | |
| <pre><code>chunk1 | | <pre><code>chunk1 | |
| | | | |
| chunk2 | | chunk2 | |
| | | | |
| chunk3 | | chunk3 | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Any initial spaces beyond four will be included in the content, even | | Any initial spaces beyond four will be included in the content, even | |
| in interior blank lines: | | in interior blank lines: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| chunk1 | | chunk1 | |
| | | | |
| chunk2 | | chunk2 | |
| . | | . | |
| <pre><code>chunk1 | | <pre><code>chunk1 | |
| | | | |
| chunk2 | | chunk2 | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| An indented code block cannot interrupt a paragraph. (This | | An indented code block cannot interrupt a paragraph. (This | |
| allows hanging indents and the like.) | | allows hanging indents and the like.) | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| bar | | bar | |
| | | | |
| . | | . | |
| <p>Foo | | <p>Foo | |
| bar</p> | | bar</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| However, any non-blank line with fewer than four leading spaces ends | | However, any non-blank line with fewer than four leading spaces ends | |
| the code block immediately. So a paragraph may occur immediately | | the code block immediately. So a paragraph may occur immediately | |
| after indented code: | | after indented code: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo | | foo | |
| bar | | bar | |
| . | | . | |
| <pre><code>foo | | <pre><code>foo | |
| </code></pre> | | </code></pre> | |
| <p>bar</p> | | <p>bar</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| And indented code can occur immediately before and after other kinds of | | And indented code can occur immediately before and after other kinds of | |
| blocks: | | blocks: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| # Heading | | # Heading | |
| foo | | foo | |
| Heading | | Heading | |
| ------ | | ------ | |
| foo | | foo | |
| ---- | | ---- | |
| . | | . | |
| <h1>Heading</h1> | | <h1>Heading</h1> | |
| <pre><code>foo | | <pre><code>foo | |
| </code></pre> | | </code></pre> | |
| <h2>Heading</h2> | | <h2>Heading</h2> | |
| <pre><code>foo | | <pre><code>foo | |
| </code></pre> | | </code></pre> | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The first line can be indented more than four spaces: | | The first line can be indented more than four spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo | | foo | |
| bar | | bar | |
| . | | . | |
| <pre><code> foo | | <pre><code> foo | |
| bar | | bar | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Blank lines preceding or following an indented code block | | Blank lines preceding or following an indented code block | |
| are not included in it: | | are not included in it: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| | | | |
| foo | | foo | |
| | | | |
| . | | . | |
| <pre><code>foo | | <pre><code>foo | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Trailing spaces are included in the code block's content: | | Trailing spaces are included in the code block's content: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo | | foo | |
| . | | . | |
| <pre><code>foo | | <pre><code>foo | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| ## Fenced code blocks | | ## Fenced code blocks | |
| | | | |
|
| A [code fence](@code-fence) is a sequence | | A [code fence](@) is a sequence | |
| of at least three consecutive backtick characters (`` ` ``) or | | of at least three consecutive backtick characters (`` ` ``) or | |
| tildes (`~`). (Tildes and backticks cannot be mixed.) | | tildes (`~`). (Tildes and backticks cannot be mixed.) | |
|
| A [fenced code block](@fenced-code-block) | | A [fenced code block](@) | |
| begins with a code fence, indented no more than three spaces. | | begins with a code fence, indented no more than three spaces. | |
| | | | |
| The line with the opening code fence may optionally contain some text | | The line with the opening code fence may optionally contain some text | |
| following the code fence; this is trimmed of leading and trailing | | following the code fence; this is trimmed of leading and trailing | |
|
| spaces and called the [info string](@info-string). | | spaces and called the [info string](@). | |
| The [info string] may not contain any backtick | | The [info string] may not contain any backtick | |
| characters. (The reason for this restriction is that otherwise | | characters. (The reason for this restriction is that otherwise | |
| some inline code would be incorrectly interpreted as the | | some inline code would be incorrectly interpreted as the | |
| beginning of a fenced code block.) | | beginning of a fenced code block.) | |
| | | | |
| The content of the code block consists of all subsequent lines, until | | The content of the code block consists of all subsequent lines, until | |
| a closing [code fence] of the same type as the code block | | a closing [code fence] of the same type as the code block | |
| began with (backticks or tildes), and with at least as many backticks | | began with (backticks or tildes), and with at least as many backticks | |
| or tildes as the opening code fence. If the leading code fence is | | or tildes as the opening code fence. If the leading code fence is | |
| indented N spaces, then up to N spaces of indentation are removed from | | indented N spaces, then up to N spaces of indentation are removed from | |
| | | | |
| skipping to change at line 1291 | | skipping to change at line 1391 | |
| a blank line either before or after. | | a blank line either before or after. | |
| | | | |
| The content of a code fence is treated as literal text, not parsed | | The content of a code fence is treated as literal text, not parsed | |
| as inlines. The first word of the [info string] is typically used to | | as inlines. The first word of the [info string] is typically used to | |
| specify the language of the code sample, and rendered in the `class` | | specify the language of the code sample, and rendered in the `class` | |
| attribute of the `code` tag. However, this spec does not mandate any | | attribute of the `code` tag. However, this spec does not mandate any | |
| particular treatment of the [info string]. | | particular treatment of the [info string]. | |
| | | | |
| Here is a simple example with backticks: | | Here is a simple example with backticks: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| < | | < | |
| > | | > | |
| ``` | | ``` | |
| . | | . | |
| <pre><code>< | | <pre><code>< | |
| > | | > | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| With tildes: | | With tildes: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ~~~ | | ~~~ | |
| < | | < | |
| > | | > | |
| ~~~ | | ~~~ | |
| . | | . | |
| <pre><code>< | | <pre><code>< | |
| > | | > | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The closing code fence must use the same character as the opening | | The closing code fence must use the same character as the opening | |
| fence: | | fence: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| aaa | | aaa | |
| ~~~ | | ~~~ | |
| ``` | | ``` | |
| . | | . | |
| <pre><code>aaa | | <pre><code>aaa | |
| ~~~ | | ~~~ | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ~~~ | | ~~~ | |
| aaa | | aaa | |
| ``` | | ``` | |
| ~~~ | | ~~~ | |
| . | | . | |
| <pre><code>aaa | | <pre><code>aaa | |
| ``` | | ``` | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The closing code fence must be at least as long as the opening fence: | | The closing code fence must be at least as long as the opening fence: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ```` | | ```` | |
| aaa | | aaa | |
| ``` | | ``` | |
| `````` | | `````` | |
| . | | . | |
| <pre><code>aaa | | <pre><code>aaa | |
| ``` | | ``` | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ~~~~ | | ~~~~ | |
| aaa | | aaa | |
| ~~~ | | ~~~ | |
| ~~~~ | | ~~~~ | |
| . | | . | |
| <pre><code>aaa | | <pre><code>aaa | |
| ~~~ | | ~~~ | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Unclosed code blocks are closed by the end of the document | | Unclosed code blocks are closed by the end of the document | |
| (or the enclosing [block quote][block quotes] or [list item][list items]): | | (or the enclosing [block quote][block quotes] or [list item][list items]): | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| . | | . | |
| <pre><code></code></pre> | | <pre><code></code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ````` | | ````` | |
| | | | |
| ``` | | ``` | |
| aaa | | aaa | |
| . | | . | |
| <pre><code> | | <pre><code> | |
| ``` | | ``` | |
| aaa | | aaa | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > ``` | | > ``` | |
| > aaa | | > aaa | |
| | | | |
| bbb | | bbb | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <pre><code>aaa | | <pre><code>aaa | |
| </code></pre> | | </code></pre> | |
| </blockquote> | | </blockquote> | |
| <p>bbb</p> | | <p>bbb</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A code block can have all empty lines as its content: | | A code block can have all empty lines as its content: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| | | | |
| ``` | | ``` | |
| . | | . | |
| <pre><code> | | <pre><code> | |
| | | | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A code block can be empty: | | A code block can be empty: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| ``` | | ``` | |
| . | | . | |
| <pre><code></code></pre> | | <pre><code></code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Fences can be indented. If the opening fence is indented, | | Fences can be indented. If the opening fence is indented, | |
| content lines will have equivalent opening indentation removed, | | content lines will have equivalent opening indentation removed, | |
| if present: | | if present: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| aaa | | aaa | |
| aaa | | aaa | |
| ``` | | ``` | |
| . | | . | |
| <pre><code>aaa | | <pre><code>aaa | |
| aaa | | aaa | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| aaa | | aaa | |
| aaa | | aaa | |
| aaa | | aaa | |
| ``` | | ``` | |
| . | | . | |
| <pre><code>aaa | | <pre><code>aaa | |
| aaa | | aaa | |
| aaa | | aaa | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| aaa | | aaa | |
| aaa | | aaa | |
| aaa | | aaa | |
| ``` | | ``` | |
| . | | . | |
| <pre><code>aaa | | <pre><code>aaa | |
| aaa | | aaa | |
| aaa | | aaa | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Four spaces indentation produces an indented code block: | | Four spaces indentation produces an indented code block: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| aaa | | aaa | |
| ``` | | ``` | |
| . | | . | |
| <pre><code>``` | | <pre><code>``` | |
| aaa | | aaa | |
| ``` | | ``` | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Closing fences may be indented by 0-3 spaces, and their indentation | | Closing fences may be indented by 0-3 spaces, and their indentation | |
| need not match that of the opening fence: | | need not match that of the opening fence: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| aaa | | aaa | |
| ``` | | ``` | |
| . | | . | |
| <pre><code>aaa | | <pre><code>aaa | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| aaa | | aaa | |
| ``` | | ``` | |
| . | | . | |
| <pre><code>aaa | | <pre><code>aaa | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not a closing fence, because it is indented 4 spaces: | | This is not a closing fence, because it is indented 4 spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| aaa | | aaa | |
| ``` | | ``` | |
| . | | . | |
| <pre><code>aaa | | <pre><code>aaa | |
| ``` | | ``` | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Code fences (opening and closing) cannot contain internal spaces: | | Code fences (opening and closing) cannot contain internal spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` ``` | | ``` ``` | |
| aaa | | aaa | |
| . | | . | |
| <p><code></code> | | <p><code></code> | |
| aaa</p> | | aaa</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ~~~~~~ | | ~~~~~~ | |
| aaa | | aaa | |
| ~~~ ~~ | | ~~~ ~~ | |
| . | | . | |
| <pre><code>aaa | | <pre><code>aaa | |
| ~~~ ~~ | | ~~~ ~~ | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Fenced code blocks can interrupt paragraphs, and can be followed | | Fenced code blocks can interrupt paragraphs, and can be followed | |
| directly by paragraphs, without a blank line between: | | directly by paragraphs, without a blank line between: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo | | foo | |
| ``` | | ``` | |
| bar | | bar | |
| ``` | | ``` | |
| baz | | baz | |
| . | | . | |
| <p>foo</p> | | <p>foo</p> | |
| <pre><code>bar | | <pre><code>bar | |
| </code></pre> | | </code></pre> | |
| <p>baz</p> | | <p>baz</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Other blocks can also occur before and after fenced code blocks | | Other blocks can also occur before and after fenced code blocks | |
| without an intervening blank line: | | without an intervening blank line: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo | | foo | |
| --- | | --- | |
| ~~~ | | ~~~ | |
| bar | | bar | |
| ~~~ | | ~~~ | |
| # baz | | # baz | |
| . | | . | |
| <h2>foo</h2> | | <h2>foo</h2> | |
| <pre><code>bar | | <pre><code>bar | |
| </code></pre> | | </code></pre> | |
| <h1>baz</h1> | | <h1>baz</h1> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| An [info string] can be provided after the opening code fence. | | An [info string] can be provided after the opening code fence. | |
| Opening and closing spaces will be stripped, and the first word, prefixed | | Opening and closing spaces will be stripped, and the first word, prefixed | |
| with `language-`, is used as the value for the `class` attribute of the | | with `language-`, is used as the value for the `class` attribute of the | |
| `code` element within the enclosing `pre` element. | | `code` element within the enclosing `pre` element. | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ```ruby | | ```ruby | |
| def foo(x) | | def foo(x) | |
| return 3 | | return 3 | |
| end | | end | |
| ``` | | ``` | |
| . | | . | |
| <pre><code class="language-ruby">def foo(x) | | <pre><code class="language-ruby">def foo(x) | |
| return 3 | | return 3 | |
| end | | end | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ~~~~ ruby startline=3 $%@#$ | | ~~~~ ruby startline=3 $%@#$ | |
| def foo(x) | | def foo(x) | |
| return 3 | | return 3 | |
| end | | end | |
| ~~~~~~~ | | ~~~~~~~ | |
| . | | . | |
| <pre><code class="language-ruby">def foo(x) | | <pre><code class="language-ruby">def foo(x) | |
| return 3 | | return 3 | |
| end | | end | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ````; | | ````; | |
| ```` | | ```` | |
| . | | . | |
| <pre><code class="language-;"></code></pre> | | <pre><code class="language-;"></code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| [Info string]s for backtick code blocks cannot contain backticks: | | [Info strings] for backtick code blocks cannot contain backticks: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` aa ``` | | ``` aa ``` | |
| foo | | foo | |
| . | | . | |
| <p><code>aa</code> | | <p><code>aa</code> | |
| foo</p> | | foo</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| Closing code fences cannot have [info string]s: | | Closing code fences cannot have [info strings]: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| ``` aaa | | ``` aaa | |
| ``` | | ``` | |
| . | | . | |
| <pre><code>``` aaa | | <pre><code>``` aaa | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| ## HTML blocks | | ## HTML blocks | |
| | | | |
|
| An [HTML block](@html-block) is a group of lines that is treated | | An [HTML block](@) is a group of lines that is treated | |
| as raw HTML (and will not be escaped in HTML output). | | as raw HTML (and will not be escaped in HTML output). | |
| | | | |
| There are seven kinds of [HTML block], which can be defined | | There are seven kinds of [HTML block], which can be defined | |
| by their start and end conditions. The block begins with a line that | | by their start and end conditions. The block begins with a line that | |
|
| meets a [start condition](@start-condition) (after up to three spaces | | meets a [start condition](@) (after up to three spaces | |
| optional indentation). It ends with the first subsequent line that | | optional indentation). It ends with the first subsequent line that | |
|
| meets a matching [end condition](@end-condition), or the last line of | | meets a matching [end condition](@), or the last line of | |
| the document, if no line is encountered that meets the | | the document, if no line is encountered that meets the | |
| [end condition]. If the first line meets both the [start condition] | | [end condition]. If the first line meets both the [start condition] | |
| and the [end condition], the block will contain just that line. | | and the [end condition], the block will contain just that line. | |
| | | | |
| 1. **Start condition:** line begins with the string `<script`, | | 1. **Start condition:** line begins with the string `<script`, | |
| `<pre`, or `<style` (case-insensitive), followed by whitespace, | | `<pre`, or `<style` (case-insensitive), followed by whitespace, | |
| the string `>`, or the end of the line.\ | | the string `>`, or the end of the line.\ | |
| **End condition:** line contains an end tag | | **End condition:** line contains an end tag | |
| `</script>`, `</pre>`, or `</style>` (case-insensitive; it | | `</script>`, `</pre>`, or `</style>` (case-insensitive; it | |
| need not match the start tag). | | need not match the start tag). | |
| | | | |
| skipping to change at line 1681 | | skipping to change at line 1781 | |
| **End condition:** line is followed by a [blank line]. | | **End condition:** line is followed by a [blank line]. | |
| | | | |
| All types of [HTML blocks] except type 7 may interrupt | | All types of [HTML blocks] except type 7 may interrupt | |
| a paragraph. Blocks of type 7 may not interrupt a paragraph. | | a paragraph. Blocks of type 7 may not interrupt a paragraph. | |
| (This restriction is intended to prevent unwanted interpretation | | (This restriction is intended to prevent unwanted interpretation | |
| of long tags inside a wrapped paragraph as starting HTML blocks.) | | of long tags inside a wrapped paragraph as starting HTML blocks.) | |
| | | | |
| Some simple examples follow. Here are some basic HTML blocks | | Some simple examples follow. Here are some basic HTML blocks | |
| of type 6: | | of type 6: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <table> | | <table> | |
| <tr> | | <tr> | |
| <td> | | <td> | |
| hi | | hi | |
| </td> | | </td> | |
| </tr> | | </tr> | |
| </table> | | </table> | |
| | | | |
| okay. | | okay. | |
| . | | . | |
| <table> | | <table> | |
| <tr> | | <tr> | |
| <td> | | <td> | |
| hi | | hi | |
| </td> | | </td> | |
| </tr> | | </tr> | |
| </table> | | </table> | |
| <p>okay.</p> | | <p>okay.</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <div> | | <div> | |
| *hello* | | *hello* | |
| <foo><a> | | <foo><a> | |
| . | | . | |
| <div> | | <div> | |
| *hello* | | *hello* | |
| <foo><a> | | <foo><a> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A block can also start with a closing tag: | | A block can also start with a closing tag: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| </div> | | </div> | |
| *foo* | | *foo* | |
| . | | . | |
| </div> | | </div> | |
| *foo* | | *foo* | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Here we have two HTML blocks with a Markdown paragraph between them: | | Here we have two HTML blocks with a Markdown paragraph between them: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <DIV CLASS="foo"> | | <DIV CLASS="foo"> | |
| | | | |
| *Markdown* | | *Markdown* | |
| | | | |
| </DIV> | | </DIV> | |
| . | | . | |
| <DIV CLASS="foo"> | | <DIV CLASS="foo"> | |
| <p><em>Markdown</em></p> | | <p><em>Markdown</em></p> | |
| </DIV> | | </DIV> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The tag on the first line can be partial, as long | | The tag on the first line can be partial, as long | |
| as it is split where there would be whitespace: | | as it is split where there would be whitespace: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <div id="foo" | | <div id="foo" | |
| class="bar"> | | class="bar"> | |
| </div> | | </div> | |
| . | | . | |
| <div id="foo" | | <div id="foo" | |
| class="bar"> | | class="bar"> | |
| </div> | | </div> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <div id="foo" class="bar | | <div id="foo" class="bar | |
| baz"> | | baz"> | |
| </div> | | </div> | |
| . | | . | |
| <div id="foo" class="bar | | <div id="foo" class="bar | |
| baz"> | | baz"> | |
| </div> | | </div> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| An open tag need not be closed: | | An open tag need not be closed: | |
|
| . | | ```````````````````````````````` example | |
| <div> | | <div> | |
| *foo* | | *foo* | |
| | | | |
| *bar* | | *bar* | |
| . | | . | |
| <div> | | <div> | |
| *foo* | | *foo* | |
| <p><em>bar</em></p> | | <p><em>bar</em></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A partial tag need not even be completed (garbage | | A partial tag need not even be completed (garbage | |
| in, garbage out): | | in, garbage out): | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <div id="foo" | | <div id="foo" | |
| *hi* | | *hi* | |
| . | | . | |
| <div id="foo" | | <div id="foo" | |
| *hi* | | *hi* | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <div class | | <div class | |
| foo | | foo | |
| . | | . | |
| <div class | | <div class | |
| foo | | foo | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The initial tag doesn't even need to be a valid | | The initial tag doesn't even need to be a valid | |
| tag, as long as it starts like one: | | tag, as long as it starts like one: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <div *???-&&&-<--- | | <div *???-&&&-<--- | |
| *foo* | | *foo* | |
| . | | . | |
| <div *???-&&&-<--- | | <div *???-&&&-<--- | |
| *foo* | | *foo* | |
|
| . | | ```````````````````````````````` | |
| | | | |
| In type 6 blocks, the initial tag need not be on a line by | | In type 6 blocks, the initial tag need not be on a line by | |
| itself: | | itself: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <div><a href="bar">*foo*</a></div> | | <div><a href="bar">*foo*</a></div> | |
| . | | . | |
| <div><a href="bar">*foo*</a></div> | | <div><a href="bar">*foo*</a></div> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <table><tr><td> | | <table><tr><td> | |
| foo | | foo | |
| </td></tr></table> | | </td></tr></table> | |
| . | | . | |
| <table><tr><td> | | <table><tr><td> | |
| foo | | foo | |
| </td></tr></table> | | </td></tr></table> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Everything until the next blank line or end of document | | Everything until the next blank line or end of document | |
| gets included in the HTML block. So, in the following | | gets included in the HTML block. So, in the following | |
| example, what looks like a Markdown code block | | example, what looks like a Markdown code block | |
| is actually part of the HTML block, which continues until a blank | | is actually part of the HTML block, which continues until a blank | |
| line or the end of the document is reached: | | line or the end of the document is reached: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <div></div> | | <div></div> | |
| ``` c | | ``` c | |
| int x = 33; | | int x = 33; | |
| ``` | | ``` | |
| . | | . | |
| <div></div> | | <div></div> | |
| ``` c | | ``` c | |
| int x = 33; | | int x = 33; | |
| ``` | | ``` | |
|
| . | | ```````````````````````````````` | |
| | | | |
| To start an [HTML block] with a tag that is *not* in the | | To start an [HTML block] with a tag that is *not* in the | |
| list of block-level tags in (6), you must put the tag by | | list of block-level tags in (6), you must put the tag by | |
| itself on the first line (and it must be complete): | | itself on the first line (and it must be complete): | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <a href="foo"> | | <a href="foo"> | |
| *bar* | | *bar* | |
| </a> | | </a> | |
| . | | . | |
| <a href="foo"> | | <a href="foo"> | |
| *bar* | | *bar* | |
| </a> | | </a> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| In type 7 blocks, the [tag name] can be anything: | | In type 7 blocks, the [tag name] can be anything: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <Warning> | | <Warning> | |
| *bar* | | *bar* | |
| </Warning> | | </Warning> | |
| . | | . | |
| <Warning> | | <Warning> | |
| *bar* | | *bar* | |
| </Warning> | | </Warning> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <i class="foo"> | | <i class="foo"> | |
| *bar* | | *bar* | |
| </i> | | </i> | |
| . | | . | |
| <i class="foo"> | | <i class="foo"> | |
| *bar* | | *bar* | |
| </i> | | </i> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| </ins> | | </ins> | |
| *bar* | | *bar* | |
| . | | . | |
| </ins> | | </ins> | |
| *bar* | | *bar* | |
|
| . | | ```````````````````````````````` | |
| | | | |
| These rules are designed to allow us to work with tags that | | These rules are designed to allow us to work with tags that | |
| can function as either block-level or inline-level tags. | | can function as either block-level or inline-level tags. | |
| The `<del>` tag is a nice example. We can surround content with | | The `<del>` tag is a nice example. We can surround content with | |
| `<del>` tags in three different ways. In this case, we get a raw | | `<del>` tags in three different ways. In this case, we get a raw | |
| HTML block, because the `<del>` tag is on a line by itself: | | HTML block, because the `<del>` tag is on a line by itself: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <del> | | <del> | |
| *foo* | | *foo* | |
| </del> | | </del> | |
| . | | . | |
| <del> | | <del> | |
| *foo* | | *foo* | |
| </del> | | </del> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| In this case, we get a raw HTML block that just includes | | In this case, we get a raw HTML block that just includes | |
| the `<del>` tag (because it ends with the following blank | | the `<del>` tag (because it ends with the following blank | |
| line). So the contents get interpreted as CommonMark: | | line). So the contents get interpreted as CommonMark: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <del> | | <del> | |
| | | | |
| *foo* | | *foo* | |
| | | | |
| </del> | | </del> | |
| . | | . | |
| <del> | | <del> | |
| <p><em>foo</em></p> | | <p><em>foo</em></p> | |
| </del> | | </del> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Finally, in this case, the `<del>` tags are interpreted | | Finally, in this case, the `<del>` tags are interpreted | |
| as [raw HTML] *inside* the CommonMark paragraph. (Because | | as [raw HTML] *inside* the CommonMark paragraph. (Because | |
| the tag is not on a line by itself, we get inline HTML | | the tag is not on a line by itself, we get inline HTML | |
| rather than an [HTML block].) | | rather than an [HTML block].) | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <del>*foo*</del> | | <del>*foo*</del> | |
| . | | . | |
| <p><del><em>foo</em></del></p> | | <p><del><em>foo</em></del></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| HTML tags designed to contain literal content | | HTML tags designed to contain literal content | |
| (`script`, `style`, `pre`), comments, processing instructions, | | (`script`, `style`, `pre`), comments, processing instructions, | |
| and declarations are treated somewhat differently. | | and declarations are treated somewhat differently. | |
| Instead of ending at the first blank line, these blocks | | Instead of ending at the first blank line, these blocks | |
| end at the first line containing a corresponding end tag. | | end at the first line containing a corresponding end tag. | |
| As a result, these blocks can contain blank lines: | | As a result, these blocks can contain blank lines: | |
| | | | |
| A pre tag (type 1): | | A pre tag (type 1): | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <pre language="haskell"><code> | | <pre language="haskell"><code> | |
| import Text.HTML.TagSoup | | import Text.HTML.TagSoup | |
| | | | |
| main :: IO () | | main :: IO () | |
| main = print $ parseTags tags | | main = print $ parseTags tags | |
| </code></pre> | | </code></pre> | |
| . | | . | |
| <pre language="haskell"><code> | | <pre language="haskell"><code> | |
| import Text.HTML.TagSoup | | import Text.HTML.TagSoup | |
| | | | |
| main :: IO () | | main :: IO () | |
| main = print $ parseTags tags | | main = print $ parseTags tags | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A script tag (type 1): | | A script tag (type 1): | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <script type="text/javascript"> | | <script type="text/javascript"> | |
| // JavaScript example | | // JavaScript example | |
| | | | |
| document.getElementById("demo").innerHTML = "Hello JavaScript!"; | | document.getElementById("demo").innerHTML = "Hello JavaScript!"; | |
| </script> | | </script> | |
| . | | . | |
| <script type="text/javascript"> | | <script type="text/javascript"> | |
| // JavaScript example | | // JavaScript example | |
| | | | |
| document.getElementById("demo").innerHTML = "Hello JavaScript!"; | | document.getElementById("demo").innerHTML = "Hello JavaScript!"; | |
| </script> | | </script> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A style tag (type 1): | | A style tag (type 1): | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <style | | <style | |
| type="text/css"> | | type="text/css"> | |
| h1 {color:red;} | | h1 {color:red;} | |
| | | | |
| p {color:blue;} | | p {color:blue;} | |
| </style> | | </style> | |
| . | | . | |
| <style | | <style | |
| type="text/css"> | | type="text/css"> | |
| h1 {color:red;} | | h1 {color:red;} | |
| | | | |
| p {color:blue;} | | p {color:blue;} | |
| </style> | | </style> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| If there is no matching end tag, the block will end at the | | If there is no matching end tag, the block will end at the | |
| end of the document (or the enclosing [block quote][block quotes] | | end of the document (or the enclosing [block quote][block quotes] | |
| or [list item][list items]): | | or [list item][list items]): | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <style | | <style | |
| type="text/css"> | | type="text/css"> | |
| | | | |
| foo | | foo | |
| . | | . | |
| <style | | <style | |
| type="text/css"> | | type="text/css"> | |
| | | | |
| foo | | foo | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > <div> | | > <div> | |
| > foo | | > foo | |
| | | | |
| bar | | bar | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <div> | | <div> | |
| foo | | foo | |
| </blockquote> | | </blockquote> | |
| <p>bar</p> | | <p>bar</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - <div> | | - <div> | |
| - foo | | - foo | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <div> | | <div> | |
| </li> | | </li> | |
| <li>foo</li> | | <li>foo</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The end tag can occur on the same line as the start tag: | | The end tag can occur on the same line as the start tag: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <style>p{color:red;}</style> | | <style>p{color:red;}</style> | |
| *foo* | | *foo* | |
| . | | . | |
| <style>p{color:red;}</style> | | <style>p{color:red;}</style> | |
| <p><em>foo</em></p> | | <p><em>foo</em></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <!-- foo -->*bar* | | <!-- foo -->*bar* | |
| *baz* | | *baz* | |
| . | | . | |
| <!-- foo -->*bar* | | <!-- foo -->*bar* | |
| <p><em>baz</em></p> | | <p><em>baz</em></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Note that anything on the last line after the | | Note that anything on the last line after the | |
| end tag will be included in the [HTML block]: | | end tag will be included in the [HTML block]: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <script> | | <script> | |
| foo | | foo | |
| </script>1. *bar* | | </script>1. *bar* | |
| . | | . | |
| <script> | | <script> | |
| foo | | foo | |
| </script>1. *bar* | | </script>1. *bar* | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A comment (type 2): | | A comment (type 2): | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <!-- Foo | | <!-- Foo | |
| | | | |
| bar | | bar | |
| baz --> | | baz --> | |
| . | | . | |
| <!-- Foo | | <!-- Foo | |
| | | | |
| bar | | bar | |
| baz --> | | baz --> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A processing instruction (type 3): | | A processing instruction (type 3): | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <?php | | <?php | |
| | | | |
| echo '>'; | | echo '>'; | |
| | | | |
| ?> | | ?> | |
| . | | . | |
| <?php | | <?php | |
| | | | |
| echo '>'; | | echo '>'; | |
| | | | |
| ?> | | ?> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A declaration (type 4): | | A declaration (type 4): | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <!DOCTYPE html> | | <!DOCTYPE html> | |
| . | | . | |
| <!DOCTYPE html> | | <!DOCTYPE html> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| CDATA (type 5): | | CDATA (type 5): | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <![CDATA[ | | <![CDATA[ | |
| function matchwo(a,b) | | function matchwo(a,b) | |
| { | | { | |
| if (a < b && a < 0) then { | | if (a < b && a < 0) then { | |
| return 1; | | return 1; | |
| | | | |
| } else { | | } else { | |
| | | | |
| return 0; | | return 0; | |
| } | | } | |
| | | | |
| skipping to change at line 2122 | | skipping to change at line 2222 | |
| { | | { | |
| if (a < b && a < 0) then { | | if (a < b && a < 0) then { | |
| return 1; | | return 1; | |
| | | | |
| } else { | | } else { | |
| | | | |
| return 0; | | return 0; | |
| } | | } | |
| } | | } | |
| ]]> | | ]]> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The opening tag can be indented 1-3 spaces, but not 4: | | The opening tag can be indented 1-3 spaces, but not 4: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <!-- foo --> | | <!-- foo --> | |
| | | | |
| <!-- foo --> | | <!-- foo --> | |
| . | | . | |
| <!-- foo --> | | <!-- foo --> | |
| <pre><code><!-- foo --> | | <pre><code><!-- foo --> | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <div> | | <div> | |
| | | | |
| <div> | | <div> | |
| . | | . | |
| <div> | | <div> | |
| <pre><code><div> | | <pre><code><div> | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| An HTML block of types 1--6 can interrupt a paragraph, and need not be | | An HTML block of types 1--6 can interrupt a paragraph, and need not be | |
| preceded by a blank line. | | preceded by a blank line. | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| <div> | | <div> | |
| bar | | bar | |
| </div> | | </div> | |
| . | | . | |
| <p>Foo</p> | | <p>Foo</p> | |
| <div> | | <div> | |
| bar | | bar | |
| </div> | | </div> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| However, a following blank line is needed, except at the end of | | However, a following blank line is needed, except at the end of | |
| a document, and except for blocks of types 1--5, above: | | a document, and except for blocks of types 1--5, above: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <div> | | <div> | |
| bar | | bar | |
| </div> | | </div> | |
| *foo* | | *foo* | |
| . | | . | |
| <div> | | <div> | |
| bar | | bar | |
| </div> | | </div> | |
| *foo* | | *foo* | |
|
| . | | ```````````````````````````````` | |
| | | | |
| HTML blocks of type 7 cannot interrupt a paragraph: | | HTML blocks of type 7 cannot interrupt a paragraph: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| <a href="bar"> | | <a href="bar"> | |
| baz | | baz | |
| . | | . | |
| <p>Foo | | <p>Foo | |
| <a href="bar"> | | <a href="bar"> | |
| baz</p> | | baz</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This rule differs from John Gruber's original Markdown syntax | | This rule differs from John Gruber's original Markdown syntax | |
| specification, which says: | | specification, which says: | |
| | | | |
| > The only restrictions are that block-level HTML elements — | | > The only restrictions are that block-level HTML elements — | |
| > e.g. `<div>`, `<table>`, `<pre>`, `<p>`, etc. — must be separated from | | > e.g. `<div>`, `<table>`, `<pre>`, `<p>`, etc. — must be separated from | |
| > surrounding content by blank lines, and the start and end tags of the | | > surrounding content by blank lines, and the start and end tags of the | |
| > block should not be indented with tabs or spaces. | | > block should not be indented with tabs or spaces. | |
| | | | |
| In some ways Gruber's rule is more restrictive than the one given | | In some ways Gruber's rule is more restrictive than the one given | |
| | | | |
| skipping to change at line 2218 | | skipping to change at line 2318 | |
| than the one given here, since it allows blank lines to occur inside | | than the one given here, since it allows blank lines to occur inside | |
| an HTML block. There are two reasons for disallowing them here. | | an HTML block. There are two reasons for disallowing them here. | |
| First, it removes the need to parse balanced tags, which is | | First, it removes the need to parse balanced tags, which is | |
| expensive and can require backtracking from the end of the document | | expensive and can require backtracking from the end of the document | |
| if no matching end tag is found. Second, it provides a very simple | | if no matching end tag is found. Second, it provides a very simple | |
| and flexible way of including Markdown content inside HTML tags: | | and flexible way of including Markdown content inside HTML tags: | |
| simply separate the Markdown from the HTML using blank lines: | | simply separate the Markdown from the HTML using blank lines: | |
| | | | |
| Compare: | | Compare: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <div> | | <div> | |
| | | | |
| *Emphasized* text. | | *Emphasized* text. | |
| | | | |
| </div> | | </div> | |
| . | | . | |
| <div> | | <div> | |
| <p><em>Emphasized</em> text.</p> | | <p><em>Emphasized</em> text.</p> | |
| </div> | | </div> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <div> | | <div> | |
| *Emphasized* text. | | *Emphasized* text. | |
| </div> | | </div> | |
| . | | . | |
| <div> | | <div> | |
| *Emphasized* text. | | *Emphasized* text. | |
| </div> | | </div> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Some Markdown implementations have adopted a convention of | | Some Markdown implementations have adopted a convention of | |
| interpreting content inside tags as text if the open tag has | | interpreting content inside tags as text if the open tag has | |
| the attribute `markdown=1`. The rule given above seems a simpler and | | the attribute `markdown=1`. The rule given above seems a simpler and | |
| more elegant way of achieving the same expressive power, which is also | | more elegant way of achieving the same expressive power, which is also | |
| much simpler to parse. | | much simpler to parse. | |
| | | | |
| The main potential drawback is that one can no longer paste HTML | | The main potential drawback is that one can no longer paste HTML | |
| blocks into Markdown documents with 100% reliability. However, | | blocks into Markdown documents with 100% reliability. However, | |
| *in most cases* this will work fine, because the blank lines in | | *in most cases* this will work fine, because the blank lines in | |
| HTML are usually followed by HTML block tags. For example: | | HTML are usually followed by HTML block tags. For example: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <table> | | <table> | |
| | | | |
| <tr> | | <tr> | |
| | | | |
| <td> | | <td> | |
| Hi | | Hi | |
| </td> | | </td> | |
| | | | |
| </tr> | | </tr> | |
| | | | |
| </table> | | </table> | |
| . | | . | |
| <table> | | <table> | |
| <tr> | | <tr> | |
| <td> | | <td> | |
| Hi | | Hi | |
| </td> | | </td> | |
| </tr> | | </tr> | |
| </table> | | </table> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| There are problems, however, if the inner tags are indented | | There are problems, however, if the inner tags are indented | |
| *and* separated by spaces, as then they will be interpreted as | | *and* separated by spaces, as then they will be interpreted as | |
| an indented code block: | | an indented code block: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <table> | | <table> | |
| | | | |
| <tr> | | <tr> | |
| | | | |
| <td> | | <td> | |
| Hi | | Hi | |
| </td> | | </td> | |
| | | | |
| </tr> | | </tr> | |
| | | | |
| </table> | | </table> | |
| . | | . | |
| <table> | | <table> | |
| <tr> | | <tr> | |
| <pre><code><td> | | <pre><code><td> | |
| Hi | | Hi | |
| </td> | | </td> | |
| </code></pre> | | </code></pre> | |
| </tr> | | </tr> | |
| </table> | | </table> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Fortunately, blank lines are usually not necessary and can be | | Fortunately, blank lines are usually not necessary and can be | |
| deleted. The exception is inside `<pre>` tags, but as described | | deleted. The exception is inside `<pre>` tags, but as described | |
| above, raw HTML blocks starting with `<pre>` *can* contain blank | | above, raw HTML blocks starting with `<pre>` *can* contain blank | |
| lines. | | lines. | |
| | | | |
| ## Link reference definitions | | ## Link reference definitions | |
| | | | |
|
| A [link reference definition](@link-reference-definition) | | A [link reference definition](@) | |
| consists of a [link label], indented up to three spaces, followed | | consists of a [link label], indented up to three spaces, followed | |
| by a colon (`:`), optional [whitespace] (including up to one | | by a colon (`:`), optional [whitespace] (including up to one | |
| [line ending]), a [link destination], | | [line ending]), a [link destination], | |
| optional [whitespace] (including up to one | | optional [whitespace] (including up to one | |
| [line ending]), and an optional [link | | [line ending]), and an optional [link | |
| title], which if it is present must be separated | | title], which if it is present must be separated | |
| from the [link destination] by [whitespace]. | | from the [link destination] by [whitespace]. | |
|
| No further [non-whitespace character]s may occur on the line. | | No further [non-whitespace characters] may occur on the line. | |
| | | | |
| A [link reference definition] | | A [link reference definition] | |
| does not correspond to a structural element of a document. Instead, it | | does not correspond to a structural element of a document. Instead, it | |
|
| defines a label which can be used in [reference link]s | | defines a label which can be used in [reference links] | |
| and reference-style [images] elsewhere in the document. [Link | | and reference-style [images] elsewhere in the document. [Link | |
| reference definitions] can come either before or after the links that use | | reference definitions] can come either before or after the links that use | |
| them. | | them. | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo]: /url "title" | | [foo]: /url "title" | |
| | | | |
| [foo] | | [foo] | |
| . | | . | |
| <p><a href="/url" title="title">foo</a></p> | | <p><a href="/url" title="title">foo</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo]: | | [foo]: | |
| /url | | /url | |
| 'the title' | | 'the title' | |
| | | | |
| [foo] | | [foo] | |
| . | | . | |
| <p><a href="/url" title="the title">foo</a></p> | | <p><a href="/url" title="the title">foo</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [Foo*bar\]]:my_(url) 'title (with parens)' | | [Foo*bar\]]:my_(url) 'title (with parens)' | |
| | | | |
| [Foo*bar\]] | | [Foo*bar\]] | |
| . | | . | |
| <p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p> | | <p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [Foo bar]: | | [Foo bar]: | |
|
| <my url> | | <my%20url> | |
| 'title' | | 'title' | |
| | | | |
| [Foo bar] | | [Foo bar] | |
| . | | . | |
| <p><a href="my%20url" title="title">Foo bar</a></p> | | <p><a href="my%20url" title="title">Foo bar</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The title may extend over multiple lines: | | The title may extend over multiple lines: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo]: /url ' | | [foo]: /url ' | |
| title | | title | |
| line1 | | line1 | |
| line2 | | line2 | |
| ' | | ' | |
| | | | |
| [foo] | | [foo] | |
| . | | . | |
| <p><a href="/url" title=" | | <p><a href="/url" title=" | |
| title | | title | |
| line1 | | line1 | |
| line2 | | line2 | |
| ">foo</a></p> | | ">foo</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| However, it may not contain a [blank line]: | | However, it may not contain a [blank line]: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo]: /url 'title | | [foo]: /url 'title | |
| | | | |
| with blank line' | | with blank line' | |
| | | | |
| [foo] | | [foo] | |
| . | | . | |
| <p>[foo]: /url 'title</p> | | <p>[foo]: /url 'title</p> | |
| <p>with blank line'</p> | | <p>with blank line'</p> | |
| <p>[foo]</p> | | <p>[foo]</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The title may be omitted: | | The title may be omitted: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo]: | | [foo]: | |
| /url | | /url | |
| | | | |
| [foo] | | [foo] | |
| . | | . | |
| <p><a href="/url">foo</a></p> | | <p><a href="/url">foo</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The link destination may not be omitted: | | The link destination may not be omitted: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo]: | | [foo]: | |
| | | | |
| [foo] | | [foo] | |
| . | | . | |
| <p>[foo]:</p> | | <p>[foo]:</p> | |
| <p>[foo]</p> | | <p>[foo]</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Both title and destination can contain backslash escapes | | Both title and destination can contain backslash escapes | |
| and literal backslashes: | | and literal backslashes: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo]: /url\bar\*baz "foo\"bar\baz" | | [foo]: /url\bar\*baz "foo\"bar\baz" | |
| | | | |
| [foo] | | [foo] | |
| . | | . | |
| <p><a href="/url%5Cbar*baz" title="foo"bar\baz">foo</a></p> | | <p><a href="/url%5Cbar*baz" title="foo"bar\baz">foo</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A link can come before its corresponding definition: | | A link can come before its corresponding definition: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo] | | [foo] | |
| | | | |
| [foo]: url | | [foo]: url | |
| . | | . | |
| <p><a href="url">foo</a></p> | | <p><a href="url">foo</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| If there are several matching definitions, the first one takes | | If there are several matching definitions, the first one takes | |
| precedence: | | precedence: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo] | | [foo] | |
| | | | |
| [foo]: first | | [foo]: first | |
| [foo]: second | | [foo]: second | |
| . | | . | |
| <p><a href="first">foo</a></p> | | <p><a href="first">foo</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| As noted in the section on [Links], matching of labels is | | As noted in the section on [Links], matching of labels is | |
| case-insensitive (see [matches]). | | case-insensitive (see [matches]). | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [FOO]: /url | | [FOO]: /url | |
| | | | |
| [Foo] | | [Foo] | |
| . | | . | |
| <p><a href="/url">Foo</a></p> | | <p><a href="/url">Foo</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [ΑΓΩ]: /φου | | [ΑΓΩ]: /φου | |
| | | | |
| [αγω] | | [αγω] | |
| . | | . | |
| <p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p> | | <p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Here is a link reference definition with no corresponding link. | | Here is a link reference definition with no corresponding link. | |
| It contributes nothing to the document. | | It contributes nothing to the document. | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo]: /url | | [foo]: /url | |
| . | | . | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Here is another one: | | Here is another one: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [ | | [ | |
| foo | | foo | |
| ]: /url | | ]: /url | |
| bar | | bar | |
| . | | . | |
| <p>bar</p> | | <p>bar</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not a link reference definition, because there are | | This is not a link reference definition, because there are | |
|
| [non-whitespace character]s after the title: | | [non-whitespace characters] after the title: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo]: /url "title" ok | | [foo]: /url "title" ok | |
| . | | . | |
| <p>[foo]: /url "title" ok</p> | | <p>[foo]: /url "title" ok</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is a link reference definition, but it has no title: | | This is a link reference definition, but it has no title: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo]: /url | | [foo]: /url | |
| "title" ok | | "title" ok | |
| . | | . | |
| <p>"title" ok</p> | | <p>"title" ok</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not a link reference definition, because it is indented | | This is not a link reference definition, because it is indented | |
| four spaces: | | four spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo]: /url "title" | | [foo]: /url "title" | |
| | | | |
| [foo] | | [foo] | |
| . | | . | |
| <pre><code>[foo]: /url "title" | | <pre><code>[foo]: /url "title" | |
| </code></pre> | | </code></pre> | |
| <p>[foo]</p> | | <p>[foo]</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not a link reference definition, because it occurs inside | | This is not a link reference definition, because it occurs inside | |
| a code block: | | a code block: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` | | ``` | |
| [foo]: /url | | [foo]: /url | |
| ``` | | ``` | |
| | | | |
| [foo] | | [foo] | |
| . | | . | |
| <pre><code>[foo]: /url | | <pre><code>[foo]: /url | |
| </code></pre> | | </code></pre> | |
| <p>[foo]</p> | | <p>[foo]</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A [link reference definition] cannot interrupt a paragraph. | | A [link reference definition] cannot interrupt a paragraph. | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| [bar]: /baz | | [bar]: /baz | |
| | | | |
| [bar] | | [bar] | |
| . | | . | |
| <p>Foo | | <p>Foo | |
| [bar]: /baz</p> | | [bar]: /baz</p> | |
| <p>[bar]</p> | | <p>[bar]</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| However, it can directly follow other block elements, such as headings | | However, it can directly follow other block elements, such as headings | |
| and thematic breaks, and it need not be followed by a blank line. | | and thematic breaks, and it need not be followed by a blank line. | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| # [Foo] | | # [Foo] | |
| [foo]: /url | | [foo]: /url | |
| > bar | | > bar | |
| . | | . | |
| <h1><a href="/url">Foo</a></h1> | | <h1><a href="/url">Foo</a></h1> | |
| <blockquote> | | <blockquote> | |
| <p>bar</p> | | <p>bar</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| Several [link reference definition]s | | Several [link reference definitions] | |
| can occur one after another, without intervening blank lines. | | can occur one after another, without intervening blank lines. | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo]: /foo-url "foo" | | [foo]: /foo-url "foo" | |
| [bar]: /bar-url | | [bar]: /bar-url | |
| "bar" | | "bar" | |
| [baz]: /baz-url | | [baz]: /baz-url | |
| | | | |
| [foo], | | [foo], | |
| [bar], | | [bar], | |
| [baz] | | [baz] | |
| . | | . | |
| <p><a href="/foo-url" title="foo">foo</a>, | | <p><a href="/foo-url" title="foo">foo</a>, | |
| <a href="/bar-url" title="bar">bar</a>, | | <a href="/bar-url" title="bar">bar</a>, | |
| <a href="/baz-url">baz</a></p> | | <a href="/baz-url">baz</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| [Link reference definition]s can occur | | [Link reference definitions] can occur | |
| inside block containers, like lists and block quotations. They | | inside block containers, like lists and block quotations. They | |
| affect the entire document, not just the container in which they | | affect the entire document, not just the container in which they | |
| are defined: | | are defined: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo] | | [foo] | |
| | | | |
| > [foo]: /url | | > [foo]: /url | |
| . | | . | |
| <p><a href="/url">foo</a></p> | | <p><a href="/url">foo</a></p> | |
| <blockquote> | | <blockquote> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| ## Paragraphs | | ## Paragraphs | |
| | | | |
| A sequence of non-blank lines that cannot be interpreted as other | | A sequence of non-blank lines that cannot be interpreted as other | |
|
| kinds of blocks forms a [paragraph](@paragraph). | | kinds of blocks forms a [paragraph](@). | |
| The contents of the paragraph are the result of parsing the | | The contents of the paragraph are the result of parsing the | |
| paragraph's raw content as inlines. The paragraph's raw content | | paragraph's raw content as inlines. The paragraph's raw content | |
| is formed by concatenating the lines and removing initial and final | | is formed by concatenating the lines and removing initial and final | |
| [whitespace]. | | [whitespace]. | |
| | | | |
| A simple example with two paragraphs: | | A simple example with two paragraphs: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| aaa | | aaa | |
| | | | |
| bbb | | bbb | |
| . | | . | |
| <p>aaa</p> | | <p>aaa</p> | |
| <p>bbb</p> | | <p>bbb</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Paragraphs can contain multiple lines, but no blank lines: | | Paragraphs can contain multiple lines, but no blank lines: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| aaa | | aaa | |
| bbb | | bbb | |
| | | | |
| ccc | | ccc | |
| ddd | | ddd | |
| . | | . | |
| <p>aaa | | <p>aaa | |
| bbb</p> | | bbb</p> | |
| <p>ccc | | <p>ccc | |
| ddd</p> | | ddd</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Multiple blank lines between paragraph have no effect: | | Multiple blank lines between paragraph have no effect: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| aaa | | aaa | |
| | | | |
| bbb | | bbb | |
| . | | . | |
| <p>aaa</p> | | <p>aaa</p> | |
| <p>bbb</p> | | <p>bbb</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Leading spaces are skipped: | | Leading spaces are skipped: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| aaa | | aaa | |
| bbb | | bbb | |
| . | | . | |
| <p>aaa | | <p>aaa | |
| bbb</p> | | bbb</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Lines after the first may be indented any amount, since indented | | Lines after the first may be indented any amount, since indented | |
| code blocks cannot interrupt paragraphs. | | code blocks cannot interrupt paragraphs. | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| aaa | | aaa | |
| bbb | | bbb | |
| ccc | | ccc | |
| . | | . | |
| <p>aaa | | <p>aaa | |
| bbb | | bbb | |
| ccc</p> | | ccc</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| However, the first line may be indented at most three spaces, | | However, the first line may be indented at most three spaces, | |
| or an indented code block will be triggered: | | or an indented code block will be triggered: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| aaa | | aaa | |
| bbb | | bbb | |
| . | | . | |
| <p>aaa | | <p>aaa | |
| bbb</p> | | bbb</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| aaa | | aaa | |
| bbb | | bbb | |
| . | | . | |
| <pre><code>aaa | | <pre><code>aaa | |
| </code></pre> | | </code></pre> | |
| <p>bbb</p> | | <p>bbb</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Final spaces are stripped before inline parsing, so a paragraph | | Final spaces are stripped before inline parsing, so a paragraph | |
| that ends with two or more spaces will not end with a [hard line | | that ends with two or more spaces will not end with a [hard line | |
| break]: | | break]: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| aaa | | aaa | |
| bbb | | bbb | |
| . | | . | |
| <p>aaa<br /> | | <p>aaa<br /> | |
| bbb</p> | | bbb</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| ## Blank lines | | ## Blank lines | |
| | | | |
|
| [Blank line]s between block-level elements are ignored, | | [Blank lines] between block-level elements are ignored, | |
| except for the role they play in determining whether a [list] | | except for the role they play in determining whether a [list] | |
| is [tight] or [loose]. | | is [tight] or [loose]. | |
| | | | |
| Blank lines at the beginning and end of the document are also ignored. | | Blank lines at the beginning and end of the document are also ignored. | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| | | | |
| aaa | | aaa | |
| | | | |
| # aaa | | # aaa | |
| | | | |
| . | | . | |
| <p>aaa</p> | | <p>aaa</p> | |
| <h1>aaa</h1> | | <h1>aaa</h1> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| # Container blocks | | # Container blocks | |
| | | | |
| A [container block] is a block that has other | | A [container block] is a block that has other | |
| blocks as its contents. There are two basic kinds of container blocks: | | blocks as its contents. There are two basic kinds of container blocks: | |
| [block quotes] and [list items]. | | [block quotes] and [list items]. | |
| [Lists] are meta-containers for [list items]. | | [Lists] are meta-containers for [list items]. | |
| | | | |
| We define the syntax for container blocks recursively. The general | | We define the syntax for container blocks recursively. The general | |
| form of the definition is: | | form of the definition is: | |
| | | | |
| skipping to change at line 2733 | | skipping to change at line 2833 | |
| > with these blocks as its content. | | > with these blocks as its content. | |
| | | | |
| So, we explain what counts as a block quote or list item by explaining | | So, we explain what counts as a block quote or list item by explaining | |
| how these can be *generated* from their contents. This should suffice | | how these can be *generated* from their contents. This should suffice | |
| to define the syntax, although it does not give a recipe for *parsing* | | to define the syntax, although it does not give a recipe for *parsing* | |
| these constructions. (A recipe is provided below in the section entitled | | these constructions. (A recipe is provided below in the section entitled | |
| [A parsing strategy](#appendix-a-parsing-strategy).) | | [A parsing strategy](#appendix-a-parsing-strategy).) | |
| | | | |
| ## Block quotes | | ## Block quotes | |
| | | | |
|
| A [block quote marker](@block-quote-marker) | | A [block quote marker](@) | |
| consists of 0-3 spaces of initial indent, plus (a) the character `>` together | | consists of 0-3 spaces of initial indent, plus (a) the character `>` together | |
| with a following space, or (b) a single character `>` not followed by a space. | | with a following space, or (b) a single character `>` not followed by a space. | |
| | | | |
| The following rules define [block quotes]: | | The following rules define [block quotes]: | |
| | | | |
| 1. **Basic case.** If a string of lines *Ls* constitute a sequence | | 1. **Basic case.** If a string of lines *Ls* constitute a sequence | |
| of blocks *Bs*, then the result of prepending a [block quote | | of blocks *Bs*, then the result of prepending a [block quote | |
| marker] to the beginning of each line in *Ls* | | marker] to the beginning of each line in *Ls* | |
| is a [block quote](#block-quotes) containing *Bs*. | | is a [block quote](#block-quotes) containing *Bs*. | |
| | | | |
| 2. **Laziness.** If a string of lines *Ls* constitute a [block | | 2. **Laziness.** If a string of lines *Ls* constitute a [block | |
| quote](#block-quotes) with contents *Bs*, then the result of deleting | | quote](#block-quotes) with contents *Bs*, then the result of deleting | |
| the initial [block quote marker] from one or | | the initial [block quote marker] from one or | |
| more lines in which the next [non-whitespace character] after the [block | | more lines in which the next [non-whitespace character] after the [block | |
| quote marker] is [paragraph continuation | | quote marker] is [paragraph continuation | |
| text] is a block quote with *Bs* as its content. | | text] is a block quote with *Bs* as its content. | |
|
| [Paragraph continuation text](@paragraph-continuation-text) is text | | [Paragraph continuation text](@) is text | |
| that will be parsed as part of the content of a paragraph, but does | | that will be parsed as part of the content of a paragraph, but does | |
| not occur at the beginning of the paragraph. | | not occur at the beginning of the paragraph. | |
| | | | |
| 3. **Consecutiveness.** A document cannot contain two [block | | 3. **Consecutiveness.** A document cannot contain two [block | |
| quotes] in a row unless there is a [blank line] between them. | | quotes] in a row unless there is a [blank line] between them. | |
| | | | |
| Nothing else counts as a [block quote](#block-quotes). | | Nothing else counts as a [block quote](#block-quotes). | |
| | | | |
| Here is a simple example: | | Here is a simple example: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > # Foo | | > # Foo | |
| > bar | | > bar | |
| > baz | | > baz | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <h1>Foo</h1> | | <h1>Foo</h1> | |
| <p>bar | | <p>bar | |
| baz</p> | | baz</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The spaces after the `>` characters can be omitted: | | The spaces after the `>` characters can be omitted: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ># Foo | | ># Foo | |
| >bar | | >bar | |
| > baz | | > baz | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <h1>Foo</h1> | | <h1>Foo</h1> | |
| <p>bar | | <p>bar | |
| baz</p> | | baz</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The `>` characters can be indented 1-3 spaces: | | The `>` characters can be indented 1-3 spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > # Foo | | > # Foo | |
| > bar | | > bar | |
| > baz | | > baz | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <h1>Foo</h1> | | <h1>Foo</h1> | |
| <p>bar | | <p>bar | |
| baz</p> | | baz</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Four spaces gives us a code block: | | Four spaces gives us a code block: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > # Foo | | > # Foo | |
| > bar | | > bar | |
| > baz | | > baz | |
| . | | . | |
| <pre><code>> # Foo | | <pre><code>> # Foo | |
| > bar | | > bar | |
| > baz | | > baz | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The Laziness clause allows us to omit the `>` before a | | The Laziness clause allows us to omit the `>` before a | |
| paragraph continuation line: | | paragraph continuation line: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > # Foo | | > # Foo | |
| > bar | | > bar | |
| baz | | baz | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <h1>Foo</h1> | | <h1>Foo</h1> | |
| <p>bar | | <p>bar | |
| baz</p> | | baz</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A block quote can contain some lazy and some non-lazy | | A block quote can contain some lazy and some non-lazy | |
| continuation lines: | | continuation lines: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > bar | | > bar | |
| baz | | baz | |
| > foo | | > foo | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>bar | | <p>bar | |
| baz | | baz | |
| foo</p> | | foo</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Laziness only applies to lines that would have been continuations of | | Laziness only applies to lines that would have been continuations of | |
|
| paragraphs had they been prepended with [block quote marker]s. | | paragraphs had they been prepended with [block quote markers]. | |
| For example, the `> ` cannot be omitted in the second line of | | For example, the `> ` cannot be omitted in the second line of | |
| | | | |
| ``` markdown | | ``` markdown | |
| > foo | | > foo | |
| > --- | | > --- | |
| ``` | | ``` | |
| | | | |
| without changing the meaning: | | without changing the meaning: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > foo | | > foo | |
| --- | | --- | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>foo</p> | | <p>foo</p> | |
| </blockquote> | | </blockquote> | |
| <hr /> | | <hr /> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Similarly, if we omit the `> ` in the second line of | | Similarly, if we omit the `> ` in the second line of | |
| | | | |
| ``` markdown | | ``` markdown | |
| > - foo | | > - foo | |
| > - bar | | > - bar | |
| ``` | | ``` | |
| | | | |
| then the block quote ends after the first line: | | then the block quote ends after the first line: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > - foo | | > - foo | |
| - bar | | - bar | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <ul> | | <ul> | |
| <li>foo</li> | | <li>foo</li> | |
| </ul> | | </ul> | |
| </blockquote> | | </blockquote> | |
| <ul> | | <ul> | |
| <li>bar</li> | | <li>bar</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| For the same reason, we can't omit the `> ` in front of | | For the same reason, we can't omit the `> ` in front of | |
| subsequent lines of an indented or fenced code block: | | subsequent lines of an indented or fenced code block: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > foo | | > foo | |
| bar | | bar | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <pre><code>foo | | <pre><code>foo | |
| </code></pre> | | </code></pre> | |
| </blockquote> | | </blockquote> | |
| <pre><code>bar | | <pre><code>bar | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > ``` | | > ``` | |
| foo | | foo | |
| ``` | | ``` | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <pre><code></code></pre> | | <pre><code></code></pre> | |
| </blockquote> | | </blockquote> | |
| <p>foo</p> | | <p>foo</p> | |
| <pre><code></code></pre> | | <pre><code></code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Note that in the following case, we have a paragraph | | Note that in the following case, we have a paragraph | |
| continuation line: | | continuation line: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > foo | | > foo | |
| - bar | | - bar | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>foo | | <p>foo | |
| - bar</p> | | - bar</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| To see why, note that in | | To see why, note that in | |
| | | | |
| ```markdown | | ```markdown | |
| > foo | | > foo | |
| > - bar | | > - bar | |
| ``` | | ``` | |
| | | | |
| the `- bar` is indented too far to start a list, and can't | | the `- bar` is indented too far to start a list, and can't | |
| be an indented code block because indented code blocks cannot | | be an indented code block because indented code blocks cannot | |
| interrupt paragraphs, so it is a [paragraph continuation line]. | | interrupt paragraphs, so it is a [paragraph continuation line]. | |
| | | | |
| A block quote can be empty: | | A block quote can be empty: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > | | > | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > | | > | |
| > | | > | |
| > | | > | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A block quote can have initial or final blank lines: | | A block quote can have initial or final blank lines: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > | | > | |
| > foo | | > foo | |
| > | | > | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>foo</p> | | <p>foo</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A blank line always separates block quotes: | | A blank line always separates block quotes: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > foo | | > foo | |
| | | | |
| > bar | | > bar | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>foo</p> | | <p>foo</p> | |
| </blockquote> | | </blockquote> | |
| <blockquote> | | <blockquote> | |
| <p>bar</p> | | <p>bar</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| (Most current Markdown implementations, including John Gruber's | | (Most current Markdown implementations, including John Gruber's | |
| original `Markdown.pl`, will parse this example as a single block quote | | original `Markdown.pl`, will parse this example as a single block quote | |
| with two paragraphs. But it seems better to allow the author to decide | | with two paragraphs. But it seems better to allow the author to decide | |
| whether two block quotes or one are wanted.) | | whether two block quotes or one are wanted.) | |
| | | | |
| Consecutiveness means that if we put these block quotes together, | | Consecutiveness means that if we put these block quotes together, | |
| we get a single block quote: | | we get a single block quote: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > foo | | > foo | |
| > bar | | > bar | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>foo | | <p>foo | |
| bar</p> | | bar</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| To get a block quote with two paragraphs, use: | | To get a block quote with two paragraphs, use: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > foo | | > foo | |
| > | | > | |
| > bar | | > bar | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>foo</p> | | <p>foo</p> | |
| <p>bar</p> | | <p>bar</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Block quotes can interrupt paragraphs: | | Block quotes can interrupt paragraphs: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo | | foo | |
| > bar | | > bar | |
| . | | . | |
| <p>foo</p> | | <p>foo</p> | |
| <blockquote> | | <blockquote> | |
| <p>bar</p> | | <p>bar</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| In general, blank lines are not needed before or after block | | In general, blank lines are not needed before or after block | |
| quotes: | | quotes: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > aaa | | > aaa | |
| *** | | *** | |
| > bbb | | > bbb | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>aaa</p> | | <p>aaa</p> | |
| </blockquote> | | </blockquote> | |
| <hr /> | | <hr /> | |
| <blockquote> | | <blockquote> | |
| <p>bbb</p> | | <p>bbb</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| However, because of laziness, a blank line is needed between | | However, because of laziness, a blank line is needed between | |
| a block quote and a following paragraph: | | a block quote and a following paragraph: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > bar | | > bar | |
| baz | | baz | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>bar | | <p>bar | |
| baz</p> | | baz</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > bar | | > bar | |
| | | | |
| baz | | baz | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>bar</p> | | <p>bar</p> | |
| </blockquote> | | </blockquote> | |
| <p>baz</p> | | <p>baz</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > bar | | > bar | |
| > | | > | |
| baz | | baz | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <p>bar</p> | | <p>bar</p> | |
| </blockquote> | | </blockquote> | |
| <p>baz</p> | | <p>baz</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| It is a consequence of the Laziness rule that any number | | It is a consequence of the Laziness rule that any number | |
| of initial `>`s may be omitted on a continuation line of a | | of initial `>`s may be omitted on a continuation line of a | |
| nested block quote: | | nested block quote: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > > > foo | | > > > foo | |
| bar | | bar | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <blockquote> | | <blockquote> | |
| <blockquote> | | <blockquote> | |
| <p>foo | | <p>foo | |
| bar</p> | | bar</p> | |
| </blockquote> | | </blockquote> | |
| </blockquote> | | </blockquote> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| >>> foo | | >>> foo | |
| > bar | | > bar | |
| >>baz | | >>baz | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <blockquote> | | <blockquote> | |
| <blockquote> | | <blockquote> | |
| <p>foo | | <p>foo | |
| bar | | bar | |
| baz</p> | | baz</p> | |
| </blockquote> | | </blockquote> | |
| </blockquote> | | </blockquote> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| When including an indented code block in a block quote, | | When including an indented code block in a block quote, | |
| remember that the [block quote marker] includes | | remember that the [block quote marker] includes | |
| both the `>` and a following space. So *five spaces* are needed after | | both the `>` and a following space. So *five spaces* are needed after | |
| the `>`: | | the `>`: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > code | | > code | |
| | | | |
| > not code | | > not code | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <pre><code>code | | <pre><code>code | |
| </code></pre> | | </code></pre> | |
| </blockquote> | | </blockquote> | |
| <blockquote> | | <blockquote> | |
| <p>not code</p> | | <p>not code</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| ## List items | | ## List items | |
| | | | |
|
| A [list marker](@list-marker) is a | | A [list marker](@) is a | |
| [bullet list marker] or an [ordered list marker]. | | [bullet list marker] or an [ordered list marker]. | |
| | | | |
|
| A [bullet list marker](@bullet-list-marker) | | A [bullet list marker](@) | |
| is a `-`, `+`, or `*` character. | | is a `-`, `+`, or `*` character. | |
| | | | |
|
| An [ordered list marker](@ordered-list-marker) | | An [ordered list marker](@) | |
| is a sequence of 1--9 arabic digits (`0-9`), followed by either a | | is a sequence of 1--9 arabic digits (`0-9`), followed by either a | |
| `.` character or a `)` character. (The reason for the length | | `.` character or a `)` character. (The reason for the length | |
| limit is that with 10 digits we start seeing integer overflows | | limit is that with 10 digits we start seeing integer overflows | |
| in some browsers.) | | in some browsers.) | |
| | | | |
| The following rules define [list items]: | | The following rules define [list items]: | |
| | | | |
| 1. **Basic case.** If a sequence of lines *Ls* constitute a sequence of | | 1. **Basic case.** If a sequence of lines *Ls* constitute a sequence of | |
| blocks *Bs* starting with a [non-whitespace character] and not separated | | blocks *Bs* starting with a [non-whitespace character] and not separated | |
| from each other by more than one blank line, and *M* is a list | | from each other by more than one blank line, and *M* is a list | |
| marker of width *W* followed by 0 < *N* < 5 spaces, then the result | | marker of width *W* followed by 0 < *N* < 5 spaces, then the result | |
| of prepending *M* and the following spaces to the first line of | | of prepending *M* and the following spaces to the first line of | |
| *Ls*, and indenting subsequent lines of *Ls* by *W + N* spaces, is a | | *Ls*, and indenting subsequent lines of *Ls* by *W + N* spaces, is a | |
| list item with *Bs* as its contents. The type of the list item | | list item with *Bs* as its contents. The type of the list item | |
| (bullet or ordered) is determined by the type of its list marker. | | (bullet or ordered) is determined by the type of its list marker. | |
| If the list item is ordered, then it is also assigned a start | | If the list item is ordered, then it is also assigned a start | |
| number, based on the ordered list marker. | | number, based on the ordered list marker. | |
| | | | |
| For example, let *Ls* be the lines | | For example, let *Ls* be the lines | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| A paragraph | | A paragraph | |
| with two lines. | | with two lines. | |
| | | | |
| indented code | | indented code | |
| | | | |
| > A block quote. | | > A block quote. | |
| . | | . | |
| <p>A paragraph | | <p>A paragraph | |
| with two lines.</p> | | with two lines.</p> | |
| <pre><code>indented code | | <pre><code>indented code | |
| </code></pre> | | </code></pre> | |
| <blockquote> | | <blockquote> | |
| <p>A block quote.</p> | | <p>A block quote.</p> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| And let *M* be the marker `1.`, and *N* = 2. Then rule #1 says | | And let *M* be the marker `1.`, and *N* = 2. Then rule #1 says | |
| that the following is an ordered list item with start number 1, | | that the following is an ordered list item with start number 1, | |
| and the same contents as *Ls*: | | and the same contents as *Ls*: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. A paragraph | | 1. A paragraph | |
| with two lines. | | with two lines. | |
| | | | |
| indented code | | indented code | |
| | | | |
| > A block quote. | | > A block quote. | |
| . | | . | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <p>A paragraph | | <p>A paragraph | |
| with two lines.</p> | | with two lines.</p> | |
| <pre><code>indented code | | <pre><code>indented code | |
| </code></pre> | | </code></pre> | |
| <blockquote> | | <blockquote> | |
| <p>A block quote.</p> | | <p>A block quote.</p> | |
| </blockquote> | | </blockquote> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The most important thing to notice is that the position of | | The most important thing to notice is that the position of | |
| the text after the list marker determines how much indentation | | the text after the list marker determines how much indentation | |
| is needed in subsequent blocks in the list item. If the list | | is needed in subsequent blocks in the list item. If the list | |
| marker takes up two spaces, and there are three spaces between | | marker takes up two spaces, and there are three spaces between | |
| the list marker and the next [non-whitespace character], then blocks | | the list marker and the next [non-whitespace character], then blocks | |
| must be indented five spaces in order to fall under the list | | must be indented five spaces in order to fall under the list | |
| item. | | item. | |
| | | | |
| Here are some examples showing how far content must be indented to be | | Here are some examples showing how far content must be indented to be | |
| put under the list item: | | put under the list item: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - one | | - one | |
| | | | |
| two | | two | |
| . | | . | |
| <ul> | | <ul> | |
| <li>one</li> | | <li>one</li> | |
| </ul> | | </ul> | |
| <p>two</p> | | <p>two</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - one | | - one | |
| | | | |
| two | | two | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>one</p> | | <p>one</p> | |
| <p>two</p> | | <p>two</p> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - one | | - one | |
| | | | |
| two | | two | |
| . | | . | |
| <ul> | | <ul> | |
| <li>one</li> | | <li>one</li> | |
| </ul> | | </ul> | |
| <pre><code> two | | <pre><code> two | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - one | | - one | |
| | | | |
| two | | two | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>one</p> | | <p>one</p> | |
| <p>two</p> | | <p>two</p> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| It is tempting to think of this in terms of columns: the continuation | | It is tempting to think of this in terms of columns: the continuation | |
| blocks must be indented at least to the column of the first | | blocks must be indented at least to the column of the first | |
| [non-whitespace character] after the list marker. However, that is not quite rig
ht. | | [non-whitespace character] after the list marker. However, that is not quite rig
ht. | |
| The spaces after the list marker determine how much relative indentation | | The spaces after the list marker determine how much relative indentation | |
| is needed. Which column this indentation reaches will depend on | | is needed. Which column this indentation reaches will depend on | |
| how the list item is embedded in other constructions, as shown by | | how the list item is embedded in other constructions, as shown by | |
| this example: | | this example: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > > 1. one | | > > 1. one | |
| >> | | >> | |
| >> two | | >> two | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <blockquote> | | <blockquote> | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <p>one</p> | | <p>one</p> | |
| <p>two</p> | | <p>two</p> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
| </blockquote> | | </blockquote> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Here `two` occurs in the same column as the list marker `1.`, | | Here `two` occurs in the same column as the list marker `1.`, | |
| but is actually contained in the list item, because there is | | but is actually contained in the list item, because there is | |
| sufficient indentation after the last containing blockquote marker. | | sufficient indentation after the last containing blockquote marker. | |
| | | | |
| The converse is also possible. In the following example, the word `two` | | The converse is also possible. In the following example, the word `two` | |
| occurs far to the right of the initial text of the list item, `one`, but | | occurs far to the right of the initial text of the list item, `one`, but | |
| it is not considered part of the list item, because it is not indented | | it is not considered part of the list item, because it is not indented | |
| far enough past the blockquote marker: | | far enough past the blockquote marker: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| >>- one | | >>- one | |
| >> | | >> | |
| > > two | | > > two | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <blockquote> | | <blockquote> | |
| <ul> | | <ul> | |
| <li>one</li> | | <li>one</li> | |
| </ul> | | </ul> | |
| <p>two</p> | | <p>two</p> | |
| </blockquote> | | </blockquote> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Note that at least one space is needed between the list marker and | | Note that at least one space is needed between the list marker and | |
| any following content, so these are not list items: | | any following content, so these are not list items: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| -one | | -one | |
| | | | |
| 2.two | | 2.two | |
| . | | . | |
| <p>-one</p> | | <p>-one</p> | |
| <p>2.two</p> | | <p>2.two</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A list item may not contain blocks that are separated by more than | | A list item may not contain blocks that are separated by more than | |
| one blank line. Thus, two blank lines will end a list, unless the | | one blank line. Thus, two blank lines will end a list, unless the | |
| two blanks are contained in a [fenced code block]. | | two blanks are contained in a [fenced code block]. | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| | | | |
| bar | | bar | |
| | | | |
| - foo | | - foo | |
| | | | |
| bar | | bar | |
| | | | |
| - ``` | | - ``` | |
| foo | | foo | |
| | | | |
| skipping to change at line 3380 | | skipping to change at line 3480 | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <pre><code>foo | | <pre><code>foo | |
| | | | |
| bar | | bar | |
| </code></pre> | | </code></pre> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A list item may contain any kind of block: | | A list item may contain any kind of block: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. foo | | 1. foo | |
| | | | |
| ``` | | ``` | |
| bar | | bar | |
| ``` | | ``` | |
| | | | |
| baz | | baz | |
| | | | |
| > bam | | > bam | |
| . | | . | |
| | | | |
| skipping to change at line 3406 | | skipping to change at line 3506 | |
| <li> | | <li> | |
| <p>foo</p> | | <p>foo</p> | |
| <pre><code>bar | | <pre><code>bar | |
| </code></pre> | | </code></pre> | |
| <p>baz</p> | | <p>baz</p> | |
| <blockquote> | | <blockquote> | |
| <p>bam</p> | | <p>bam</p> | |
| </blockquote> | | </blockquote> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A list item that contains an indented code block will preserve | | A list item that contains an indented code block will preserve | |
| empty lines within the code block verbatim, unless there are two | | empty lines within the code block verbatim, unless there are two | |
| or more empty lines in a row (since as described above, two | | or more empty lines in a row (since as described above, two | |
| blank lines end the list): | | blank lines end the list): | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - Foo | | - Foo | |
| | | | |
| bar | | bar | |
| | | | |
| baz | | baz | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>Foo</p> | | <p>Foo</p> | |
| <pre><code>bar | | <pre><code>bar | |
| | | | |
| baz | | baz | |
| </code></pre> | | </code></pre> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - Foo | | - Foo | |
| | | | |
| bar | | bar | |
| | | | |
| baz | | baz | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>Foo</p> | | <p>Foo</p> | |
| <pre><code>bar | | <pre><code>bar | |
| </code></pre> | | </code></pre> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
| <pre><code> baz | | <pre><code> baz | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Note that ordered list start numbers must be nine digits or less: | | Note that ordered list start numbers must be nine digits or less: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 123456789. ok | | 123456789. ok | |
| . | | . | |
| <ol start="123456789"> | | <ol start="123456789"> | |
| <li>ok</li> | | <li>ok</li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1234567890. not ok | | 1234567890. not ok | |
| . | | . | |
| <p>1234567890. not ok</p> | | <p>1234567890. not ok</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A start number may begin with 0s: | | A start number may begin with 0s: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 0. ok | | 0. ok | |
| . | | . | |
| <ol start="0"> | | <ol start="0"> | |
| <li>ok</li> | | <li>ok</li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 003. ok | | 003. ok | |
| . | | . | |
| <ol start="3"> | | <ol start="3"> | |
| <li>ok</li> | | <li>ok</li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A start number may not be negative: | | A start number may not be negative: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| -1. not ok | | -1. not ok | |
| . | | . | |
| <p>-1. not ok</p> | | <p>-1. not ok</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| 2. **Item starting with indented code.** If a sequence of lines *Ls* | | 2. **Item starting with indented code.** If a sequence of lines *Ls* | |
| constitute a sequence of blocks *Bs* starting with an indented code | | constitute a sequence of blocks *Bs* starting with an indented code | |
| block and not separated from each other by more than one blank line, | | block and not separated from each other by more than one blank line, | |
| and *M* is a list marker of width *W* followed by | | and *M* is a list marker of width *W* followed by | |
| one space, then the result of prepending *M* and the following | | one space, then the result of prepending *M* and the following | |
| space to the first line of *Ls*, and indenting subsequent lines of | | space to the first line of *Ls*, and indenting subsequent lines of | |
| *Ls* by *W + 1* spaces, is a list item with *Bs* as its contents. | | *Ls* by *W + 1* spaces, is a list item with *Bs* as its contents. | |
| If a line is empty, then it need not be indented. The type of the | | If a line is empty, then it need not be indented. The type of the | |
| list item (bullet or ordered) is determined by the type of its list | | list item (bullet or ordered) is determined by the type of its list | |
| marker. If the list item is ordered, then it is also assigned a | | marker. If the list item is ordered, then it is also assigned a | |
| start number, based on the ordered list marker. | | start number, based on the ordered list marker. | |
| | | | |
| An indented code block will have to be indented four spaces beyond | | An indented code block will have to be indented four spaces beyond | |
| the edge of the region where text will be included in the list item. | | the edge of the region where text will be included in the list item. | |
| In the following case that is 6 spaces: | | In the following case that is 6 spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| | | | |
| bar | | bar | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>foo</p> | | <p>foo</p> | |
| <pre><code>bar | | <pre><code>bar | |
| </code></pre> | | </code></pre> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| And in this case it is 11 spaces: | | And in this case it is 11 spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 10. foo | | 10. foo | |
| | | | |
| bar | | bar | |
| . | | . | |
| <ol start="10"> | | <ol start="10"> | |
| <li> | | <li> | |
| <p>foo</p> | | <p>foo</p> | |
| <pre><code>bar | | <pre><code>bar | |
| </code></pre> | | </code></pre> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| If the *first* block in the list item is an indented code block, | | If the *first* block in the list item is an indented code block, | |
| then by rule #2, the contents must be indented *one* space after the | | then by rule #2, the contents must be indented *one* space after the | |
| list marker: | | list marker: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| indented code | | indented code | |
| | | | |
| paragraph | | paragraph | |
| | | | |
| more code | | more code | |
| . | | . | |
| <pre><code>indented code | | <pre><code>indented code | |
| </code></pre> | | </code></pre> | |
| <p>paragraph</p> | | <p>paragraph</p> | |
| <pre><code>more code | | <pre><code>more code | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. indented code | | 1. indented code | |
| | | | |
| paragraph | | paragraph | |
| | | | |
| more code | | more code | |
| . | | . | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <pre><code>indented code | | <pre><code>indented code | |
| </code></pre> | | </code></pre> | |
| <p>paragraph</p> | | <p>paragraph</p> | |
| <pre><code>more code | | <pre><code>more code | |
| </code></pre> | | </code></pre> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Note that an additional space indent is interpreted as space | | Note that an additional space indent is interpreted as space | |
| inside the code block: | | inside the code block: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. indented code | | 1. indented code | |
| | | | |
| paragraph | | paragraph | |
| | | | |
| more code | | more code | |
| . | | . | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <pre><code> indented code | | <pre><code> indented code | |
| </code></pre> | | </code></pre> | |
| <p>paragraph</p> | | <p>paragraph</p> | |
| <pre><code>more code | | <pre><code>more code | |
| </code></pre> | | </code></pre> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Note that rules #1 and #2 only apply to two cases: (a) cases | | Note that rules #1 and #2 only apply to two cases: (a) cases | |
| in which the lines to be included in a list item begin with a | | in which the lines to be included in a list item begin with a | |
| [non-whitespace character], and (b) cases in which | | [non-whitespace character], and (b) cases in which | |
| they begin with an indented code | | they begin with an indented code | |
| block. In a case like the following, where the first block begins with | | block. In a case like the following, where the first block begins with | |
| a three-space indent, the rules do not allow us to form a list item by | | a three-space indent, the rules do not allow us to form a list item by | |
| indenting the whole thing and prepending a list marker: | | indenting the whole thing and prepending a list marker: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo | | foo | |
| | | | |
| bar | | bar | |
| . | | . | |
| <p>foo</p> | | <p>foo</p> | |
| <p>bar</p> | | <p>bar</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| | | | |
| bar | | bar | |
| . | | . | |
| <ul> | | <ul> | |
| <li>foo</li> | | <li>foo</li> | |
| </ul> | | </ul> | |
| <p>bar</p> | | <p>bar</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not a significant restriction, because when a block begins | | This is not a significant restriction, because when a block begins | |
| with 1-3 spaces indent, the indentation can always be removed without | | with 1-3 spaces indent, the indentation can always be removed without | |
| a change in interpretation, allowing rule #1 to be applied. So, in | | a change in interpretation, allowing rule #1 to be applied. So, in | |
| the above case: | | the above case: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| | | | |
| bar | | bar | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>foo</p> | | <p>foo</p> | |
| <p>bar</p> | | <p>bar</p> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| 3. **Item starting with a blank line.** If a sequence of lines *Ls* | | 3. **Item starting with a blank line.** If a sequence of lines *Ls* | |
| starting with a single [blank line] constitute a (possibly empty) | | starting with a single [blank line] constitute a (possibly empty) | |
| sequence of blocks *Bs*, not separated from each other by more than | | sequence of blocks *Bs*, not separated from each other by more than | |
| one blank line, and *M* is a list marker of width *W*, | | one blank line, and *M* is a list marker of width *W*, | |
| then the result of prepending *M* to the first line of *Ls*, and | | then the result of prepending *M* to the first line of *Ls*, and | |
| indenting subsequent lines of *Ls* by *W + 1* spaces, is a list | | indenting subsequent lines of *Ls* by *W + 1* spaces, is a list | |
| item with *Bs* as its contents. | | item with *Bs* as its contents. | |
| If a line is empty, then it need not be indented. The type of the | | If a line is empty, then it need not be indented. The type of the | |
| list item (bullet or ordered) is determined by the type of its list | | list item (bullet or ordered) is determined by the type of its list | |
| marker. If the list item is ordered, then it is also assigned a | | marker. If the list item is ordered, then it is also assigned a | |
| start number, based on the ordered list marker. | | start number, based on the ordered list marker. | |
| | | | |
| Here are some list items that start with a blank line but are not empty: | | Here are some list items that start with a blank line but are not empty: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - | | - | |
| foo | | foo | |
| - | | - | |
| ``` | | ``` | |
| bar | | bar | |
| ``` | | ``` | |
| - | | - | |
| baz | | baz | |
| . | | . | |
| <ul> | | <ul> | |
| <li>foo</li> | | <li>foo</li> | |
| <li> | | <li> | |
| <pre><code>bar | | <pre><code>bar | |
| </code></pre> | | </code></pre> | |
| </li> | | </li> | |
| <li> | | <li> | |
| <pre><code>baz | | <pre><code>baz | |
| </code></pre> | | </code></pre> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A list item can begin with at most one blank line. | | A list item can begin with at most one blank line. | |
| In the following example, `foo` is not part of the list | | In the following example, `foo` is not part of the list | |
| item: | | item: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - | | - | |
| | | | |
| foo | | foo | |
| . | | . | |
| <ul> | | <ul> | |
| <li></li> | | <li></li> | |
| </ul> | | </ul> | |
| <p>foo</p> | | <p>foo</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Here is an empty bullet list item: | | Here is an empty bullet list item: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| - | | - | |
| - bar | | - bar | |
| . | | . | |
| <ul> | | <ul> | |
| <li>foo</li> | | <li>foo</li> | |
| <li></li> | | <li></li> | |
| <li>bar</li> | | <li>bar</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| It does not matter whether there are spaces following the [list marker]: | | It does not matter whether there are spaces following the [list marker]: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| - | | - | |
| - bar | | - bar | |
| . | | . | |
| <ul> | | <ul> | |
| <li>foo</li> | | <li>foo</li> | |
| <li></li> | | <li></li> | |
| <li>bar</li> | | <li>bar</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Here is an empty ordered list item: | | Here is an empty ordered list item: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. foo | | 1. foo | |
| 2. | | 2. | |
| 3. bar | | 3. bar | |
| . | | . | |
| <ol> | | <ol> | |
| <li>foo</li> | | <li>foo</li> | |
| <li></li> | | <li></li> | |
| <li>bar</li> | | <li>bar</li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A list may start or end with an empty list item: | | A list may start or end with an empty list item: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| * | | * | |
| . | | . | |
| <ul> | | <ul> | |
| <li></li> | | <li></li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| 4. **Indentation.** If a sequence of lines *Ls* constitutes a list item | | 4. **Indentation.** If a sequence of lines *Ls* constitutes a list item | |
| according to rule #1, #2, or #3, then the result of indenting each line | | according to rule #1, #2, or #3, then the result of indenting each line | |
| of *Ls* by 1-3 spaces (the same for each line) also constitutes a | | of *Ls* by 1-3 spaces (the same for each line) also constitutes a | |
| list item with the same contents and attributes. If a line is | | list item with the same contents and attributes. If a line is | |
| empty, then it need not be indented. | | empty, then it need not be indented. | |
| | | | |
| Indented one space: | | Indented one space: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. A paragraph | | 1. A paragraph | |
| with two lines. | | with two lines. | |
| | | | |
| indented code | | indented code | |
| | | | |
| > A block quote. | | > A block quote. | |
| . | | . | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <p>A paragraph | | <p>A paragraph | |
| with two lines.</p> | | with two lines.</p> | |
| <pre><code>indented code | | <pre><code>indented code | |
| </code></pre> | | </code></pre> | |
| <blockquote> | | <blockquote> | |
| <p>A block quote.</p> | | <p>A block quote.</p> | |
| </blockquote> | | </blockquote> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Indented two spaces: | | Indented two spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. A paragraph | | 1. A paragraph | |
| with two lines. | | with two lines. | |
| | | | |
| indented code | | indented code | |
| | | | |
| > A block quote. | | > A block quote. | |
| . | | . | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <p>A paragraph | | <p>A paragraph | |
| with two lines.</p> | | with two lines.</p> | |
| <pre><code>indented code | | <pre><code>indented code | |
| </code></pre> | | </code></pre> | |
| <blockquote> | | <blockquote> | |
| <p>A block quote.</p> | | <p>A block quote.</p> | |
| </blockquote> | | </blockquote> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Indented three spaces: | | Indented three spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. A paragraph | | 1. A paragraph | |
| with two lines. | | with two lines. | |
| | | | |
| indented code | | indented code | |
| | | | |
| > A block quote. | | > A block quote. | |
| . | | . | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <p>A paragraph | | <p>A paragraph | |
| with two lines.</p> | | with two lines.</p> | |
| <pre><code>indented code | | <pre><code>indented code | |
| </code></pre> | | </code></pre> | |
| <blockquote> | | <blockquote> | |
| <p>A block quote.</p> | | <p>A block quote.</p> | |
| </blockquote> | | </blockquote> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Four spaces indent gives a code block: | | Four spaces indent gives a code block: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. A paragraph | | 1. A paragraph | |
| with two lines. | | with two lines. | |
| | | | |
| indented code | | indented code | |
| | | | |
| > A block quote. | | > A block quote. | |
| . | | . | |
| <pre><code>1. A paragraph | | <pre><code>1. A paragraph | |
| with two lines. | | with two lines. | |
| | | | |
| indented code | | indented code | |
| | | | |
| > A block quote. | | > A block quote. | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| 5. **Laziness.** If a string of lines *Ls* constitute a [list | | 5. **Laziness.** If a string of lines *Ls* constitute a [list | |
| item](#list-items) with contents *Bs*, then the result of deleting | | item](#list-items) with contents *Bs*, then the result of deleting | |
| some or all of the indentation from one or more lines in which the | | some or all of the indentation from one or more lines in which the | |
| next [non-whitespace character] after the indentation is | | next [non-whitespace character] after the indentation is | |
| [paragraph continuation text] is a | | [paragraph continuation text] is a | |
| list item with the same contents and attributes. The unindented | | list item with the same contents and attributes. The unindented | |
| lines are called | | lines are called | |
|
| [lazy continuation line](@lazy-continuation-line)s. | | [lazy continuation line](@)s. | |
| | | | |
|
| Here is an example with [lazy continuation line]s: | | Here is an example with [lazy continuation lines]: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. A paragraph | | 1. A paragraph | |
| with two lines. | | with two lines. | |
| | | | |
| indented code | | indented code | |
| | | | |
| > A block quote. | | > A block quote. | |
| . | | . | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <p>A paragraph | | <p>A paragraph | |
| with two lines.</p> | | with two lines.</p> | |
| <pre><code>indented code | | <pre><code>indented code | |
| </code></pre> | | </code></pre> | |
| <blockquote> | | <blockquote> | |
| <p>A block quote.</p> | | <p>A block quote.</p> | |
| </blockquote> | | </blockquote> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Indentation can be partially deleted: | | Indentation can be partially deleted: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. A paragraph | | 1. A paragraph | |
| with two lines. | | with two lines. | |
| . | | . | |
| <ol> | | <ol> | |
| <li>A paragraph | | <li>A paragraph | |
| with two lines.</li> | | with two lines.</li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| These examples show how laziness can work in nested structures: | | These examples show how laziness can work in nested structures: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > 1. > Blockquote | | > 1. > Blockquote | |
| continued here. | | continued here. | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <blockquote> | | <blockquote> | |
| <p>Blockquote | | <p>Blockquote | |
| continued here.</p> | | continued here.</p> | |
| </blockquote> | | </blockquote> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| > 1. > Blockquote | | > 1. > Blockquote | |
| > continued here. | | > continued here. | |
| . | | . | |
| <blockquote> | | <blockquote> | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <blockquote> | | <blockquote> | |
| <p>Blockquote | | <p>Blockquote | |
| continued here.</p> | | continued here.</p> | |
| </blockquote> | | </blockquote> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
| </blockquote> | | </blockquote> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| 6. **That's all.** Nothing that is not counted as a list item by rules | | 6. **That's all.** Nothing that is not counted as a list item by rules | |
| #1--5 counts as a [list item](#list-items). | | #1--5 counts as a [list item](#list-items). | |
| | | | |
| The rules for sublists follow from the general rules above. A sublist | | The rules for sublists follow from the general rules above. A sublist | |
| must be indented the same number of spaces a paragraph would need to be | | must be indented the same number of spaces a paragraph would need to be | |
| in order to be included in the list item. | | in order to be included in the list item. | |
| | | | |
| So, in this case we need two spaces indent: | | So, in this case we need two spaces indent: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| - bar | | - bar | |
| - baz | | - baz | |
| . | | . | |
| <ul> | | <ul> | |
| <li>foo | | <li>foo | |
| <ul> | | <ul> | |
| <li>bar | | <li>bar | |
| <ul> | | <ul> | |
| <li>baz</li> | | <li>baz</li> | |
| </ul> | | </ul> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| One is not enough: | | One is not enough: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| - bar | | - bar | |
| - baz | | - baz | |
| . | | . | |
| <ul> | | <ul> | |
| <li>foo</li> | | <li>foo</li> | |
| <li>bar</li> | | <li>bar</li> | |
| <li>baz</li> | | <li>baz</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Here we need four, because the list marker is wider: | | Here we need four, because the list marker is wider: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 10) foo | | 10) foo | |
| - bar | | - bar | |
| . | | . | |
| <ol start="10"> | | <ol start="10"> | |
| <li>foo | | <li>foo | |
| <ul> | | <ul> | |
| <li>bar</li> | | <li>bar</li> | |
| </ul> | | </ul> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Three is not enough: | | Three is not enough: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 10) foo | | 10) foo | |
| - bar | | - bar | |
| . | | . | |
| <ol start="10"> | | <ol start="10"> | |
| <li>foo</li> | | <li>foo</li> | |
| </ol> | | </ol> | |
| <ul> | | <ul> | |
| <li>bar</li> | | <li>bar</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A list may be the first block in a list item: | | A list may be the first block in a list item: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - - foo | | - - foo | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <ul> | | <ul> | |
| <li>foo</li> | | <li>foo</li> | |
| </ul> | | </ul> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. - 2. foo | | 1. - 2. foo | |
| . | | . | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <ol start="2"> | | <ol start="2"> | |
| <li>foo</li> | | <li>foo</li> | |
| </ol> | | </ol> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A list item can contain a heading: | | A list item can contain a heading: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - # Foo | | - # Foo | |
| - Bar | | - Bar | |
| --- | | --- | |
| baz | | baz | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <h1>Foo</h1> | | <h1>Foo</h1> | |
| </li> | | </li> | |
| <li> | | <li> | |
| <h2>Bar</h2> | | <h2>Bar</h2> | |
| baz</li> | | baz</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| ### Motivation | | ### Motivation | |
| | | | |
| John Gruber's Markdown spec says the following about list items: | | John Gruber's Markdown spec says the following about list items: | |
| | | | |
| 1. "List markers typically start at the left margin, but may be indented | | 1. "List markers typically start at the left margin, but may be indented | |
| by up to three spaces. List markers must be followed by one or more | | by up to three spaces. List markers must be followed by one or more | |
| spaces or a tab." | | spaces or a tab." | |
| | | | |
| 2. "To make lists look nice, you can wrap items with hanging indents.... | | 2. "To make lists look nice, you can wrap items with hanging indents.... | |
| | | | |
| skipping to change at line 4222 | | skipping to change at line 4322 | |
| The one case that needs special treatment is a list item that *starts* | | The one case that needs special treatment is a list item that *starts* | |
| with indented code. How much indentation is required in that case, since | | with indented code. How much indentation is required in that case, since | |
| we don't have a "first paragraph" to measure from? Rule #2 simply stipulates | | we don't have a "first paragraph" to measure from? Rule #2 simply stipulates | |
| that in such cases, we require one space indentation from the list marker | | that in such cases, we require one space indentation from the list marker | |
| (and then the normal four spaces for the indented code). This will match the | | (and then the normal four spaces for the indented code). This will match the | |
| four-space rule in cases where the list marker plus its initial indentation | | four-space rule in cases where the list marker plus its initial indentation | |
| takes four spaces (a common case), but diverge in other cases. | | takes four spaces (a common case), but diverge in other cases. | |
| | | | |
| ## Lists | | ## Lists | |
| | | | |
|
| A [list](@list) is a sequence of one or more | | A [list](@) is a sequence of one or more | |
| list items [of the same type]. The list items | | list items [of the same type]. The list items | |
| may be separated by single [blank lines], but two | | may be separated by single [blank lines], but two | |
| blank lines end all containing lists. | | blank lines end all containing lists. | |
| | | | |
|
| Two list items are [of the same type](@of-the-same-type) | | Two list items are [of the same type](@) | |
| if they begin with a [list marker] of the same type. | | if they begin with a [list marker] of the same type. | |
| Two list markers are of the | | Two list markers are of the | |
| same type if (a) they are bullet list markers using the same character | | same type if (a) they are bullet list markers using the same character | |
| (`-`, `+`, or `*`) or (b) they are ordered list numbers with the same | | (`-`, `+`, or `*`) or (b) they are ordered list numbers with the same | |
| delimiter (either `.` or `)`). | | delimiter (either `.` or `)`). | |
| | | | |
|
| A list is an [ordered list](@ordered-list) | | A list is an [ordered list](@) | |
| if its constituent list items begin with | | if its constituent list items begin with | |
|
| [ordered list marker]s, and a | | [ordered list markers], and a | |
| [bullet list](@bullet-list) if its constituent list | | [bullet list](@) if its constituent list | |
| items begin with [bullet list marker]s. | | items begin with [bullet list markers]. | |
| | | | |
|
| The [start number](@start-number) | | The [start number](@) | |
| of an [ordered list] is determined by the list number of | | of an [ordered list] is determined by the list number of | |
| its initial list item. The numbers of subsequent list items are | | its initial list item. The numbers of subsequent list items are | |
| disregarded. | | disregarded. | |
| | | | |
|
| A list is [loose](@loose) if any of its constituent | | A list is [loose](@) if any of its constituent | |
| list items are separated by blank lines, or if any of its constituent | | list items are separated by blank lines, or if any of its constituent | |
| list items directly contain two block-level elements with a blank line | | list items directly contain two block-level elements with a blank line | |
|
| between them. Otherwise a list is [tight](@tight). | | between them. Otherwise a list is [tight](@). | |
| (The difference in HTML output is that paragraphs in a loose list are | | (The difference in HTML output is that paragraphs in a loose list are | |
| wrapped in `<p>` tags, while paragraphs in a tight list are not.) | | wrapped in `<p>` tags, while paragraphs in a tight list are not.) | |
| | | | |
| Changing the bullet or ordered list delimiter starts a new list: | | Changing the bullet or ordered list delimiter starts a new list: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| - bar | | - bar | |
| + baz | | + baz | |
| . | | . | |
| <ul> | | <ul> | |
| <li>foo</li> | | <li>foo</li> | |
| <li>bar</li> | | <li>bar</li> | |
| </ul> | | </ul> | |
| <ul> | | <ul> | |
| <li>baz</li> | | <li>baz</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. foo | | 1. foo | |
| 2. bar | | 2. bar | |
| 3) baz | | 3) baz | |
| . | | . | |
| <ol> | | <ol> | |
| <li>foo</li> | | <li>foo</li> | |
| <li>bar</li> | | <li>bar</li> | |
| </ol> | | </ol> | |
| <ol start="3"> | | <ol start="3"> | |
| <li>baz</li> | | <li>baz</li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| In CommonMark, a list can interrupt a paragraph. That is, | | In CommonMark, a list can interrupt a paragraph. That is, | |
| no blank line is needed to separate a paragraph from a following | | no blank line is needed to separate a paragraph from a following | |
| list: | | list: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| Foo | | Foo | |
| - bar | | - bar | |
| - baz | | - baz | |
| . | | . | |
| <p>Foo</p> | | <p>Foo</p> | |
| <ul> | | <ul> | |
| <li>bar</li> | | <li>bar</li> | |
| <li>baz</li> | | <li>baz</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| `Markdown.pl` does not allow this, through fear of triggering a list | | `Markdown.pl` does not allow this, through fear of triggering a list | |
| via a numeral in a hard-wrapped line: | | via a numeral in a hard-wrapped line: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| The number of windows in my house is | | The number of windows in my house is | |
| 14. The number of doors is 6. | | 14. The number of doors is 6. | |
| . | | . | |
| <p>The number of windows in my house is</p> | | <p>The number of windows in my house is</p> | |
| <ol start="14"> | | <ol start="14"> | |
| <li>The number of doors is 6.</li> | | <li>The number of doors is 6.</li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Oddly, `Markdown.pl` *does* allow a blockquote to interrupt a paragraph, | | Oddly, `Markdown.pl` *does* allow a blockquote to interrupt a paragraph, | |
| even though the same considerations might apply. We think that the two | | even though the same considerations might apply. We think that the two | |
| cases should be treated the same. Here are two reasons for allowing | | cases should be treated the same. Here are two reasons for allowing | |
| lists to interrupt paragraphs: | | lists to interrupt paragraphs: | |
| | | | |
| First, it is natural and not uncommon for people to start lists without | | First, it is natural and not uncommon for people to start lists without | |
| blank lines: | | blank lines: | |
| | | | |
| I need to buy | | I need to buy | |
| - new shoes | | - new shoes | |
| - a coat | | - a coat | |
| - a plane ticket | | - a plane ticket | |
| | | | |
| Second, we are attracted to a | | Second, we are attracted to a | |
| | | | |
|
| > [principle of uniformity](@principle-of-uniformity): | | > [principle of uniformity](@): | |
| > if a chunk of text has a certain | | > if a chunk of text has a certain | |
| > meaning, it will continue to have the same meaning when put into a | | > meaning, it will continue to have the same meaning when put into a | |
| > container block (such as a list item or blockquote). | | > container block (such as a list item or blockquote). | |
| | | | |
| (Indeed, the spec for [list items] and [block quotes] presupposes | | (Indeed, the spec for [list items] and [block quotes] presupposes | |
| this principle.) This principle implies that if | | this principle.) This principle implies that if | |
| | | | |
| * I need to buy | | * I need to buy | |
| - new shoes | | - new shoes | |
| - a coat | | - a coat | |
| | | | |
| skipping to change at line 4366 | | skipping to change at line 4466 | |
| | | | |
| 2. Require blank lines in none of these places. | | 2. Require blank lines in none of these places. | |
| | | | |
| [reStructuredText](http://docutils.sourceforge.net/rst.html) takes | | [reStructuredText](http://docutils.sourceforge.net/rst.html) takes | |
| the first approach, for which there is much to be said. But the second | | the first approach, for which there is much to be said. But the second | |
| seems more consistent with established practice with Markdown. | | seems more consistent with established practice with Markdown. | |
| | | | |
| There can be blank lines between items, but two blank lines end | | There can be blank lines between items, but two blank lines end | |
| a list: | | a list: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| | | | |
| - bar | | - bar | |
| | | | |
| - baz | | - baz | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>foo</p> | | <p>foo</p> | |
| </li> | | </li> | |
| <li> | | <li> | |
| <p>bar</p> | | <p>bar</p> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
| <ul> | | <ul> | |
| <li>baz</li> | | <li>baz</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| As illustrated above in the section on [list items], | | As illustrated above in the section on [list items], | |
| two blank lines between blocks *within* a list item will also end a | | two blank lines between blocks *within* a list item will also end a | |
| list: | | list: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| | | | |
| bar | | bar | |
| - baz | | - baz | |
| . | | . | |
| <ul> | | <ul> | |
| <li>foo</li> | | <li>foo</li> | |
| </ul> | | </ul> | |
| <p>bar</p> | | <p>bar</p> | |
| <ul> | | <ul> | |
| <li>baz</li> | | <li>baz</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Indeed, two blank lines will end *all* containing lists: | | Indeed, two blank lines will end *all* containing lists: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| - bar | | - bar | |
| - baz | | - baz | |
| | | | |
| bim | | bim | |
| . | | . | |
| <ul> | | <ul> | |
| <li>foo | | <li>foo | |
| <ul> | | <ul> | |
| <li>bar | | <li>bar | |
| <ul> | | <ul> | |
| <li>baz</li> | | <li>baz</li> | |
| </ul> | | </ul> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
| <pre><code> bim | | <pre><code> bim | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Thus, two blank lines can be used to separate consecutive lists of | | Thus, two blank lines can be used to separate consecutive lists of | |
| the same type, or to separate a list from an indented code block | | the same type, or to separate a list from an indented code block | |
| that would otherwise be parsed as a subparagraph of the final list | | that would otherwise be parsed as a subparagraph of the final list | |
| item: | | item: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| - bar | | - bar | |
| | | | |
| - baz | | - baz | |
| - bim | | - bim | |
| . | | . | |
| <ul> | | <ul> | |
| <li>foo</li> | | <li>foo</li> | |
| <li>bar</li> | | <li>bar</li> | |
| </ul> | | </ul> | |
| <ul> | | <ul> | |
| <li>baz</li> | | <li>baz</li> | |
| <li>bim</li> | | <li>bim</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - foo | | - foo | |
| | | | |
| notcode | | notcode | |
| | | | |
| - foo | | - foo | |
| | | | |
| code | | code | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>foo</p> | | <p>foo</p> | |
| <p>notcode</p> | | <p>notcode</p> | |
| </li> | | </li> | |
| <li> | | <li> | |
| <p>foo</p> | | <p>foo</p> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
| <pre><code>code | | <pre><code>code | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| List items need not be indented to the same level. The following | | List items need not be indented to the same level. The following | |
| list items will be treated as items at the same list level, | | list items will be treated as items at the same list level, | |
| since none is indented enough to belong to the previous list | | since none is indented enough to belong to the previous list | |
| item: | | item: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - a | | - a | |
| - b | | - b | |
| - c | | - c | |
| - d | | - d | |
| - e | | - e | |
| - f | | - f | |
| - g | | - g | |
| - h | | - h | |
| - i | | - i | |
| . | | . | |
| | | | |
| skipping to change at line 4500 | | skipping to change at line 4600 | |
| <li>a</li> | | <li>a</li> | |
| <li>b</li> | | <li>b</li> | |
| <li>c</li> | | <li>c</li> | |
| <li>d</li> | | <li>d</li> | |
| <li>e</li> | | <li>e</li> | |
| <li>f</li> | | <li>f</li> | |
| <li>g</li> | | <li>g</li> | |
| <li>h</li> | | <li>h</li> | |
| <li>i</li> | | <li>i</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. a | | 1. a | |
| | | | |
| 2. b | | 2. b | |
| | | | |
| 3. c | | 3. c | |
| . | | . | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <p>a</p> | | <p>a</p> | |
| </li> | | </li> | |
| <li> | | <li> | |
| <p>b</p> | | <p>b</p> | |
| </li> | | </li> | |
| <li> | | <li> | |
| <p>c</p> | | <p>c</p> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is a loose list, because there is a blank line between | | This is a loose list, because there is a blank line between | |
| two of the list items: | | two of the list items: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - a | | - a | |
| - b | | - b | |
| | | | |
| - c | | - c | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>a</p> | | <p>a</p> | |
| </li> | | </li> | |
| <li> | | <li> | |
| <p>b</p> | | <p>b</p> | |
| </li> | | </li> | |
| <li> | | <li> | |
| <p>c</p> | | <p>c</p> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| So is this, with a empty second item: | | So is this, with a empty second item: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| * a | | * a | |
| * | | * | |
| | | | |
| * c | | * c | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>a</p> | | <p>a</p> | |
| </li> | | </li> | |
| <li></li> | | <li></li> | |
| <li> | | <li> | |
| <p>c</p> | | <p>c</p> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| These are loose lists, even though there is no space between the items, | | These are loose lists, even though there is no space between the items, | |
| because one of the items directly contains two block-level elements | | because one of the items directly contains two block-level elements | |
| with a blank line between them: | | with a blank line between them: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - a | | - a | |
| - b | | - b | |
| | | | |
| c | | c | |
| - d | | - d | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>a</p> | | <p>a</p> | |
| </li> | | </li> | |
| <li> | | <li> | |
| <p>b</p> | | <p>b</p> | |
| <p>c</p> | | <p>c</p> | |
| </li> | | </li> | |
| <li> | | <li> | |
| <p>d</p> | | <p>d</p> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - a | | - a | |
| - b | | - b | |
| | | | |
| [ref]: /url | | [ref]: /url | |
| - d | | - d | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>a</p> | | <p>a</p> | |
| </li> | | </li> | |
| <li> | | <li> | |
| <p>b</p> | | <p>b</p> | |
| </li> | | </li> | |
| <li> | | <li> | |
| <p>d</p> | | <p>d</p> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is a tight list, because the blank lines are in a code block: | | This is a tight list, because the blank lines are in a code block: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - a | | - a | |
| - ``` | | - ``` | |
| b | | b | |
| | | | |
| ``` | | ``` | |
| - c | | - c | |
| . | | . | |
| <ul> | | <ul> | |
| <li>a</li> | | <li>a</li> | |
| <li> | | <li> | |
| <pre><code>b | | <pre><code>b | |
| | | | |
| </code></pre> | | </code></pre> | |
| </li> | | </li> | |
| <li>c</li> | | <li>c</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is a tight list, because the blank line is between two | | This is a tight list, because the blank line is between two | |
| paragraphs of a sublist. So the sublist is loose while | | paragraphs of a sublist. So the sublist is loose while | |
| the outer list is tight: | | the outer list is tight: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - a | | - a | |
| - b | | - b | |
| | | | |
| c | | c | |
| - d | | - d | |
| . | | . | |
| <ul> | | <ul> | |
| <li>a | | <li>a | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>b</p> | | <p>b</p> | |
| <p>c</p> | | <p>c</p> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
| </li> | | </li> | |
| <li>d</li> | | <li>d</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is a tight list, because the blank line is inside the | | This is a tight list, because the blank line is inside the | |
| block quote: | | block quote: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| * a | | * a | |
| > b | | > b | |
| > | | > | |
| * c | | * c | |
| . | | . | |
| <ul> | | <ul> | |
| <li>a | | <li>a | |
| <blockquote> | | <blockquote> | |
| <p>b</p> | | <p>b</p> | |
| </blockquote> | | </blockquote> | |
| </li> | | </li> | |
| <li>c</li> | | <li>c</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This list is tight, because the consecutive block elements | | This list is tight, because the consecutive block elements | |
| are not separated by blank lines: | | are not separated by blank lines: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - a | | - a | |
| > b | | > b | |
| ``` | | ``` | |
| c | | c | |
| ``` | | ``` | |
| - d | | - d | |
| . | | . | |
| <ul> | | <ul> | |
| <li>a | | <li>a | |
| <blockquote> | | <blockquote> | |
| <p>b</p> | | <p>b</p> | |
| </blockquote> | | </blockquote> | |
| <pre><code>c | | <pre><code>c | |
| </code></pre> | | </code></pre> | |
| </li> | | </li> | |
| <li>d</li> | | <li>d</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A single-paragraph list is tight: | | A single-paragraph list is tight: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - a | | - a | |
| . | | . | |
| <ul> | | <ul> | |
| <li>a</li> | | <li>a</li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - a | | - a | |
| - b | | - b | |
| . | | . | |
| <ul> | | <ul> | |
| <li>a | | <li>a | |
| <ul> | | <ul> | |
| <li>b</li> | | <li>b</li> | |
| </ul> | | </ul> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This list is loose, because of the blank line between the | | This list is loose, because of the blank line between the | |
| two block elements in the list item: | | two block elements in the list item: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 1. ``` | | 1. ``` | |
| foo | | foo | |
| ``` | | ``` | |
| | | | |
| bar | | bar | |
| . | | . | |
| <ol> | | <ol> | |
| <li> | | <li> | |
| <pre><code>foo | | <pre><code>foo | |
| </code></pre> | | </code></pre> | |
| <p>bar</p> | | <p>bar</p> | |
| </li> | | </li> | |
| </ol> | | </ol> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Here the outer list is loose, the inner list tight: | | Here the outer list is loose, the inner list tight: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| * foo | | * foo | |
| * bar | | * bar | |
| | | | |
| baz | | baz | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| <p>foo</p> | | <p>foo</p> | |
| <ul> | | <ul> | |
| <li>bar</li> | | <li>bar</li> | |
| </ul> | | </ul> | |
| <p>baz</p> | | <p>baz</p> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| - a | | - a | |
| - b | | - b | |
| - c | | - c | |
| | | | |
| - d | | - d | |
| - e | | - e | |
| - f | | - f | |
| . | | . | |
| <ul> | | <ul> | |
| <li> | | <li> | |
| | | | |
| skipping to change at line 4781 | | skipping to change at line 4881 | |
| </ul> | | </ul> | |
| </li> | | </li> | |
| <li> | | <li> | |
| <p>d</p> | | <p>d</p> | |
| <ul> | | <ul> | |
| <li>e</li> | | <li>e</li> | |
| <li>f</li> | | <li>f</li> | |
| </ul> | | </ul> | |
| </li> | | </li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| # Inlines | | # Inlines | |
| | | | |
| Inlines are parsed sequentially from the beginning of the character | | Inlines are parsed sequentially from the beginning of the character | |
| stream to the end (left to right, in left-to-right languages). | | stream to the end (left to right, in left-to-right languages). | |
| Thus, for example, in | | Thus, for example, in | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| `hi`lo` | | `hi`lo` | |
| . | | . | |
| <p><code>hi</code>lo`</p> | | <p><code>hi</code>lo`</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| `hi` is parsed as code, leaving the backtick at the end as a literal | | `hi` is parsed as code, leaving the backtick at the end as a literal | |
| backtick. | | backtick. | |
| | | | |
| ## Backslash escapes | | ## Backslash escapes | |
| | | | |
| Any ASCII punctuation character may be backslash-escaped: | | Any ASCII punctuation character may be backslash-escaped: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~ | | \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~ | |
| . | | . | |
| <p>!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~</p> | | <p>!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Backslashes before other characters are treated as literal | | Backslashes before other characters are treated as literal | |
| backslashes: | | backslashes: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| \→\A\a\ \3\φ\« | | \→\A\a\ \3\φ\« | |
| . | | . | |
| <p>\→\A\a\ \3\φ\«</p> | | <p>\→\A\a\ \3\φ\«</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Escaped characters are treated as regular characters and do | | Escaped characters are treated as regular characters and do | |
| not have their usual Markdown meanings: | | not have their usual Markdown meanings: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| \*not emphasized* | | \*not emphasized* | |
| \<br/> not a tag | | \<br/> not a tag | |
| \[not a link](/foo) | | \[not a link](/foo) | |
| \`not code` | | \`not code` | |
| 1\. not a list | | 1\. not a list | |
| \* not a list | | \* not a list | |
| \# not a heading | | \# not a heading | |
| \[foo]: /url "not a reference" | | \[foo]: /url "not a reference" | |
| . | | . | |
| <p>*not emphasized* | | <p>*not emphasized* | |
| <br/> not a tag | | <br/> not a tag | |
| [not a link](/foo) | | [not a link](/foo) | |
| `not code` | | `not code` | |
| 1. not a list | | 1. not a list | |
| * not a list | | * not a list | |
| # not a heading | | # not a heading | |
| [foo]: /url "not a reference"</p> | | [foo]: /url "not a reference"</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| If a backslash is itself escaped, the following character is not: | | If a backslash is itself escaped, the following character is not: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| \\*emphasis* | | \\*emphasis* | |
| . | | . | |
| <p>\<em>emphasis</em></p> | | <p>\<em>emphasis</em></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A backslash at the end of the line is a [hard line break]: | | A backslash at the end of the line is a [hard line break]: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo\ | | foo\ | |
| bar | | bar | |
| . | | . | |
| <p>foo<br /> | | <p>foo<br /> | |
| bar</p> | | bar</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Backslash escapes do not work in code blocks, code spans, autolinks, or | | Backslash escapes do not work in code blocks, code spans, autolinks, or | |
| raw HTML: | | raw HTML: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| `` \[\` `` | | `` \[\` `` | |
| . | | . | |
| <p><code>\[\`</code></p> | | <p><code>\[\`</code></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| \[\] | | \[\] | |
| . | | . | |
| <pre><code>\[\] | | <pre><code>\[\] | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ~~~ | | ~~~ | |
| \[\] | | \[\] | |
| ~~~ | | ~~~ | |
| . | | . | |
| <pre><code>\[\] | | <pre><code>\[\] | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <http://example.com?find=\*> | | <http://example.com?find=\*> | |
| . | | . | |
| <p><a href="http://example.com?find=%5C*">http://example.com?find=\*</a></p> | | <p><a href="http://example.com?find=%5C*">http://example.com?find=\*</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <a href="/bar\/)"> | | <a href="/bar\/)"> | |
| . | | . | |
| <a href="/bar\/)"> | | <a href="/bar\/)"> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| But they work in all other contexts, including URLs and link titles, | | But they work in all other contexts, including URLs and link titles, | |
|
| link references, and [info string]s in [fenced code block]s: | | link references, and [info strings] in [fenced code blocks]: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo](/bar\* "ti\*tle") | | [foo](/bar\* "ti\*tle") | |
| . | | . | |
| <p><a href="/bar*" title="ti*tle">foo</a></p> | | <p><a href="/bar*" title="ti*tle">foo</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo] | | [foo] | |
| | | | |
| [foo]: /bar\* "ti\*tle" | | [foo]: /bar\* "ti\*tle" | |
| . | | . | |
| <p><a href="/bar*" title="ti*tle">foo</a></p> | | <p><a href="/bar*" title="ti*tle">foo</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` foo\+bar | | ``` foo\+bar | |
| foo | | foo | |
| ``` | | ``` | |
| . | | . | |
| <pre><code class="language-foo+bar">foo | | <pre><code class="language-foo+bar">foo | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| ## Entity and numeric character references | | ## Entity and numeric character references | |
| | | | |
| All valid HTML entity references and numeric character | | All valid HTML entity references and numeric character | |
|
| references, except those occuring in code blocks, code spans, | | references, except those occuring in code blocks and code spans, | |
| and raw HTML, are recognized as such and treated as equivalent to the | | are recognized as such and treated as equivalent to the | |
| corresponding Unicode characters. Conforming CommonMark parsers | | corresponding Unicode characters. Conforming CommonMark parsers | |
| need not store information about whether a particular character | | need not store information about whether a particular character | |
| was represented in the source using a Unicode character or | | was represented in the source using a Unicode character or | |
| an entity reference. | | an entity reference. | |
| | | | |
|
| [Entity references](@entity-references) consist of `&` + any of the valid | | [Entity references](@) consist of `&` + any of the valid | |
| HTML5 entity names + `;`. The | | HTML5 entity names + `;`. The | |
| document <https://html.spec.whatwg.org/multipage/entities.json> | | document <https://html.spec.whatwg.org/multipage/entities.json> | |
| is used as an authoritative source for the valid entity | | is used as an authoritative source for the valid entity | |
| references and their corresponding code points. | | references and their corresponding code points. | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| & © Æ Ď | | & © Æ Ď | |
| ¾ ℋ ⅆ | | ¾ ℋ ⅆ | |
| ∲ ≧̸ | | ∲ ≧̸ | |
| . | | . | |
| <p> & © Æ Ď | | <p> & © Æ Ď | |
| ¾ ℋ ⅆ | | ¾ ℋ ⅆ | |
| ∲ ≧̸</p> | | ∲ ≧̸</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| [Decimal numeric character | | [Decimal numeric character | |
|
| references](@decimal-numeric-character-references) | | references](@) | |
| consist of `&#` + a string of 1--8 arabic digits + `;`. A | | consist of `&#` + a string of 1--8 arabic digits + `;`. A | |
| numeric character reference is parsed as the corresponding | | numeric character reference is parsed as the corresponding | |
| Unicode character. Invalid Unicode code points will be replaced by | | Unicode character. Invalid Unicode code points will be replaced by | |
|
| the "unknown code point" character (`U+FFFD`). For security reasons, | | the REPLACEMENT CHARACTER (`U+FFFD`). For security reasons, | |
| the code point `U+0000` will also be replaced by `U+FFFD`. | | the code point `U+0000` will also be replaced by `U+FFFD`. | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| # Ӓ Ϡ � � | | # Ӓ Ϡ � � | |
| . | | . | |
| <p># Ӓ Ϡ � �</p> | | <p># Ӓ Ϡ � �</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| [Hexadecimal numeric character | | [Hexadecimal numeric character | |
|
| references](@hexadecimal-numeric-character-references) consist of `&#` + | | references](@) consist of `&#` + | |
| either `X` or `x` + a string of 1-8 hexadecimal digits + `;`. | | either `X` or `x` + a string of 1-8 hexadecimal digits + `;`. | |
| They too are parsed as the corresponding Unicode character (this | | They too are parsed as the corresponding Unicode character (this | |
| time specified with a hexadecimal numeral instead of decimal). | | time specified with a hexadecimal numeral instead of decimal). | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| " ആ ಫ | | " ആ ಫ | |
| . | | . | |
| <p>" ആ ಫ</p> | | <p>" ആ ಫ</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Here are some nonentities: | | Here are some nonentities: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
|   &x; &#; &#x; | |   &x; &#; &#x; | |
|
| &ThisIsWayTooLongToBeAnEntityIsntIt; &hi?; | | &ThisIsNotDefined; &hi?; | |
| . | | . | |
| <p>&nbsp &x; &#; &#x; | | <p>&nbsp &x; &#; &#x; | |
|
| &ThisIsWayTooLongToBeAnEntityIsntIt; &hi?;</p> | | &ThisIsNotDefined; &hi?;</p> | |
| . | | ```````````````````````````````` | |
| | | | |
| Although HTML5 does accept some entity references | | Although HTML5 does accept some entity references | |
| without a trailing semicolon (such as `©`), these are not | | without a trailing semicolon (such as `©`), these are not | |
| recognized here, because it makes the grammar too ambiguous: | | recognized here, because it makes the grammar too ambiguous: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| © | | © | |
| . | | . | |
| <p>&copy</p> | | <p>&copy</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Strings that are not on the list of HTML5 named entities are not | | Strings that are not on the list of HTML5 named entities are not | |
| recognized as entity references either: | | recognized as entity references either: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| &MadeUpEntity; | | &MadeUpEntity; | |
| . | | . | |
| <p>&MadeUpEntity;</p> | | <p>&MadeUpEntity;</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Entity and numeric character references are recognized in any | | Entity and numeric character references are recognized in any | |
|
| context besides code spans or code blocks or raw HTML, including | | context besides code spans or code blocks, including | |
| URLs, [link title]s, and [fenced code block][] [info string]s: | | URLs, [link titles], and [fenced code block][] [info strings]: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <a href="öö.html"> | | <a href="öö.html"> | |
| . | | . | |
| <a href="öö.html"> | | <a href="öö.html"> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo](/föö "föö") | | [foo](/föö "föö") | |
| . | | . | |
| <p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p> | | <p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [foo] | | [foo] | |
| | | | |
| [foo]: /föö "föö" | | [foo]: /föö "föö" | |
| . | | . | |
| <p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p> | | <p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ``` föö | | ``` föö | |
| foo | | foo | |
| ``` | | ``` | |
| . | | . | |
| <pre><code class="language-föö">foo | | <pre><code class="language-föö">foo | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Entity and numeric character references are treated as literal | | Entity and numeric character references are treated as literal | |
|
| text in code spans and code blocks, and in raw HTML: | | text in code spans and code blocks: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| `föö` | | `föö` | |
| . | | . | |
| <p><code>f&ouml;&ouml;</code></p> | | <p><code>f&ouml;&ouml;</code></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| föfö | | föfö | |
| . | | . | |
| <pre><code>f&ouml;f&ouml; | | <pre><code>f&ouml;f&ouml; | |
| </code></pre> | | </code></pre> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| . | | | |
| <a href="föfö"/> | | | |
| . | | | |
| <a href="föfö"/> | | | |
| . | | | |
| | | | |
| ## Code spans | | ## Code spans | |
| | | | |
|
| A [backtick string](@backtick-string) | | A [backtick string](@) | |
| is a string of one or more backtick characters (`` ` ``) that is neither | | is a string of one or more backtick characters (`` ` ``) that is neither | |
| preceded nor followed by a backtick. | | preceded nor followed by a backtick. | |
| | | | |
|
| A [code span](@code-span) begins with a backtick string and ends with | | A [code span](@) begins with a backtick string and ends with | |
| a backtick string of equal length. The contents of the code span are | | a backtick string of equal length. The contents of the code span are | |
| the characters between the two backtick strings, with leading and | | the characters between the two backtick strings, with leading and | |
|
| trailing spaces and [line ending]s removed, and | | trailing spaces and [line endings] removed, and | |
| [whitespace] collapsed to single spaces. | | [whitespace] collapsed to single spaces. | |
| | | | |
| This is a simple code span: | | This is a simple code span: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| `foo` | | `foo` | |
| . | | . | |
| <p><code>foo</code></p> | | <p><code>foo</code></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Here two backticks are used, because the code contains a backtick. | | Here two backticks are used, because the code contains a backtick. | |
| This example also illustrates stripping of leading and trailing spaces: | | This example also illustrates stripping of leading and trailing spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| `` foo ` bar `` | | `` foo ` bar `` | |
| . | | . | |
| <p><code>foo ` bar</code></p> | | <p><code>foo ` bar</code></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This example shows the motivation for stripping leading and trailing | | This example shows the motivation for stripping leading and trailing | |
| spaces: | | spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ` `` ` | | ` `` ` | |
| . | | . | |
| <p><code>``</code></p> | | <p><code>``</code></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| [Line ending]s are treated like spaces: | | [Line endings] are treated like spaces: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| `` | | `` | |
| foo | | foo | |
| `` | | `` | |
| . | | . | |
| <p><code>foo</code></p> | | <p><code>foo</code></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| Interior spaces and [line ending]s are collapsed into | | Interior spaces and [line endings] are collapsed into | |
| single spaces, just as they would be by a browser: | | single spaces, just as they would be by a browser: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| `foo bar | | `foo bar | |
| baz` | | baz` | |
| . | | . | |
| <p><code>foo bar baz</code></p> | | <p><code>foo bar baz</code></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Q: Why not just leave the spaces, since browsers will collapse them | | Q: Why not just leave the spaces, since browsers will collapse them | |
| anyway? A: Because we might be targeting a non-HTML format, and we | | anyway? A: Because we might be targeting a non-HTML format, and we | |
| shouldn't rely on HTML-specific rendering assumptions. | | shouldn't rely on HTML-specific rendering assumptions. | |
| | | | |
| (Existing implementations differ in their treatment of internal | | (Existing implementations differ in their treatment of internal | |
|
| spaces and [line ending]s. Some, including `Markdown.pl` and | | spaces and [line endings]. Some, including `Markdown.pl` and | |
| `showdown`, convert an internal [line ending] into a | | `showdown`, convert an internal [line ending] into a | |
| `<br />` tag. But this makes things difficult for those who like to | | `<br />` tag. But this makes things difficult for those who like to | |
| hard-wrap their paragraphs, since a line break in the midst of a code | | hard-wrap their paragraphs, since a line break in the midst of a code | |
| span will cause an unintended line break in the output. Others just | | span will cause an unintended line break in the output. Others just | |
| leave internal spaces as they are, which is fine if only HTML is being | | leave internal spaces as they are, which is fine if only HTML is being | |
| targeted.) | | targeted.) | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| `foo `` bar` | | `foo `` bar` | |
| . | | . | |
| <p><code>foo `` bar</code></p> | | <p><code>foo `` bar</code></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Note that backslash escapes do not work in code spans. All backslashes | | Note that backslash escapes do not work in code spans. All backslashes | |
| are treated literally: | | are treated literally: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| `foo\`bar` | | `foo\`bar` | |
| . | | . | |
| <p><code>foo\</code>bar`</p> | | <p><code>foo\</code>bar`</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Backslash escapes are never needed, because one can always choose a | | Backslash escapes are never needed, because one can always choose a | |
| string of *n* backtick characters as delimiters, where the code does | | string of *n* backtick characters as delimiters, where the code does | |
| not contain any strings of exactly *n* backtick characters. | | not contain any strings of exactly *n* backtick characters. | |
| | | | |
| Code span backticks have higher precedence than any other inline | | Code span backticks have higher precedence than any other inline | |
| constructs except HTML tags and autolinks. Thus, for example, this is | | constructs except HTML tags and autolinks. Thus, for example, this is | |
| not parsed as emphasized text, since the second `*` is part of a code | | not parsed as emphasized text, since the second `*` is part of a code | |
| span: | | span: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| *foo`*` | | *foo`*` | |
| . | | . | |
| <p>*foo<code>*</code></p> | | <p>*foo<code>*</code></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| And this is not parsed as a link: | | And this is not parsed as a link: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| [not a `link](/foo`) | | [not a `link](/foo`) | |
| . | | . | |
| <p>[not a <code>link](/foo</code>)</p> | | <p>[not a <code>link](/foo</code>)</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Code spans, HTML tags, and autolinks have the same precedence. | | Code spans, HTML tags, and autolinks have the same precedence. | |
| Thus, this is code: | | Thus, this is code: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| `<a href="`">` | | `<a href="`">` | |
| . | | . | |
| <p><code><a href="</code>">`</p> | | <p><code><a href="</code>">`</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| But this is an HTML tag: | | But this is an HTML tag: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <a href="`">` | | <a href="`">` | |
| . | | . | |
| <p><a href="`">`</p> | | <p><a href="`">`</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| And this is code: | | And this is code: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| `<http://foo.bar.`baz>` | | `<http://foo.bar.`baz>` | |
| . | | . | |
| <p><code><http://foo.bar.</code>baz>`</p> | | <p><code><http://foo.bar.</code>baz>`</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| But this is an autolink: | | But this is an autolink: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| <http://foo.bar.`baz>` | | <http://foo.bar.`baz>` | |
| . | | . | |
| <p><a href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p> | | <p><a href="http://foo.bar.%60baz">http://foo.bar.`baz</a>`</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| When a backtick string is not closed by a matching backtick string, | | When a backtick string is not closed by a matching backtick string, | |
| we just have literal backticks: | | we just have literal backticks: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ```foo`` | | ```foo`` | |
| . | | . | |
| <p>```foo``</p> | | <p>```foo``</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| `foo | | `foo | |
| . | | . | |
| <p>`foo</p> | | <p>`foo</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| ## Emphasis and strong emphasis | | ## Emphasis and strong emphasis | |
| | | | |
| John Gruber's original [Markdown syntax | | John Gruber's original [Markdown syntax | |
| description](http://daringfireball.net/projects/markdown/syntax#em) says: | | description](http://daringfireball.net/projects/markdown/syntax#em) says: | |
| | | | |
| > Markdown treats asterisks (`*`) and underscores (`_`) as indicators of | | > Markdown treats asterisks (`*`) and underscores (`_`) as indicators of | |
| > emphasis. Text wrapped with one `*` or `_` will be wrapped with an HTML | | > emphasis. Text wrapped with one `*` or `_` will be wrapped with an HTML | |
| > `<em>` tag; double `*`'s or `_`'s will be wrapped with an HTML `<strong>` | | > `<em>` tag; double `*`'s or `_`'s will be wrapped with an HTML `<strong>` | |
| > tag. | | > tag. | |
| | | | |
| skipping to change at line 5260 | | skipping to change at line 5354 | |
| spans, but users often do not.) | | spans, but users often do not.) | |
| | | | |
| ``` markdown | | ``` markdown | |
| internal emphasis: foo*bar*baz | | internal emphasis: foo*bar*baz | |
| no emphasis: foo_bar_baz | | no emphasis: foo_bar_baz | |
| ``` | | ``` | |
| | | | |
| The rules given below capture all of these patterns, while allowing | | The rules given below capture all of these patterns, while allowing | |
| for efficient parsing strategies that do not backtrack. | | for efficient parsing strategies that do not backtrack. | |
| | | | |
|
| First, some definitions. A [delimiter run](@delimiter-run) is either | | First, some definitions. A [delimiter run](@) is either | |
| a sequence of one or more `*` characters that is not preceded or | | a sequence of one or more `*` characters that is not preceded or | |
| followed by a `*` character, or a sequence of one or more `_` | | followed by a `*` character, or a sequence of one or more `_` | |
| characters that is not preceded or followed by a `_` character. | | characters that is not preceded or followed by a `_` character. | |
| | | | |
|
| A [left-flanking delimiter run](@left-flanking-delimiter-run) is | | A [left-flanking delimiter run](@) is | |
| a [delimiter run] that is (a) not followed by [Unicode whitespace], | | a [delimiter run] that is (a) not followed by [Unicode whitespace], | |
| and (b) either not followed by a [punctuation character], or | | and (b) either not followed by a [punctuation character], or | |
| preceded by [Unicode whitespace] or a [punctuation character]. | | preceded by [Unicode whitespace] or a [punctuation character]. | |
| For purposes of this definition, the beginning and the end of | | For purposes of this definition, the beginning and the end of | |
| the line count as Unicode whitespace. | | the line count as Unicode whitespace. | |
| | | | |
|
| A [right-flanking delimiter run](@right-flanking-delimiter-run) is | | A [right-flanking delimiter run](@) is | |
| a [delimiter run] that is (a) not preceded by [Unicode whitespace], | | a [delimiter run] that is (a) not preceded by [Unicode whitespace], | |
| and (b) either not preceded by a [punctuation character], or | | and (b) either not preceded by a [punctuation character], or | |
| followed by [Unicode whitespace] or a [punctuation character]. | | followed by [Unicode whitespace] or a [punctuation character]. | |
| For purposes of this definition, the beginning and the end of | | For purposes of this definition, the beginning and the end of | |
| the line count as Unicode whitespace. | | the line count as Unicode whitespace. | |
| | | | |
| Here are some examples of delimiter runs. | | Here are some examples of delimiter runs. | |
| | | | |
| - left-flanking but not right-flanking: | | - left-flanking but not right-flanking: | |
| | | | |
| | | | |
| skipping to change at line 5323 | | skipping to change at line 5417 | |
| (The idea of distinguishing left-flanking and right-flanking | | (The idea of distinguishing left-flanking and right-flanking | |
| delimiter runs based on the character before and the character | | delimiter runs based on the character before and the character | |
| after comes from Roopesh Chander's | | after comes from Roopesh Chander's | |
| [vfmd](http://www.vfmd.org/vfmd-spec/specification/#procedure-for-identifying-em
phasis-tags). | | [vfmd](http://www.vfmd.org/vfmd-spec/specification/#procedure-for-identifying-em
phasis-tags). | |
| vfmd uses the terminology "emphasis indicator string" instead of "delimiter | | vfmd uses the terminology "emphasis indicator string" instead of "delimiter | |
| run," and its rules for distinguishing left- and right-flanking runs | | run," and its rules for distinguishing left- and right-flanking runs | |
| are a bit more complex than the ones given here.) | | are a bit more complex than the ones given here.) | |
| | | | |
| The following rules define emphasis and strong emphasis: | | The following rules define emphasis and strong emphasis: | |
| | | | |
|
| 1. A single `*` character [can open emphasis](@can-open-emphasis) | | 1. A single `*` character [can open emphasis](@) | |
| iff (if and only if) it is part of a [left-flanking delimiter run]. | | iff (if and only if) it is part of a [left-flanking delimiter run]. | |
| | | | |
| 2. A single `_` character [can open emphasis] iff | | 2. A single `_` character [can open emphasis] iff | |
| it is part of a [left-flanking delimiter run] | | it is part of a [left-flanking delimiter run] | |
| and either (a) not part of a [right-flanking delimiter run] | | and either (a) not part of a [right-flanking delimiter run] | |
| or (b) part of a [right-flanking delimiter run] | | or (b) part of a [right-flanking delimiter run] | |
| preceded by punctuation. | | preceded by punctuation. | |
| | | | |
|
| 3. A single `*` character [can close emphasis](@can-close-emphasis) | | 3. A single `*` character [can close emphasis](@) | |
| iff it is part of a [right-flanking delimiter run]. | | iff it is part of a [right-flanking delimiter run]. | |
| | | | |
| 4. A single `_` character [can close emphasis] iff | | 4. A single `_` character [can close emphasis] iff | |
| it is part of a [right-flanking delimiter run] | | it is part of a [right-flanking delimiter run] | |
| and either (a) not part of a [left-flanking delimiter run] | | and either (a) not part of a [left-flanking delimiter run] | |
| or (b) part of a [left-flanking delimiter run] | | or (b) part of a [left-flanking delimiter run] | |
| followed by punctuation. | | followed by punctuation. | |
| | | | |
|
| 5. A double `**` [can open strong emphasis](@can-open-strong-emphasis) | | 5. A double `**` [can open strong emphasis](@) | |
| iff it is part of a [left-flanking delimiter run]. | | iff it is part of a [left-flanking delimiter run]. | |
| | | | |
| 6. A double `__` [can open strong emphasis] iff | | 6. A double `__` [can open strong emphasis] iff | |
| it is part of a [left-flanking delimiter run] | | it is part of a [left-flanking delimiter run] | |
| and either (a) not part of a [right-flanking delimiter run] | | and either (a) not part of a [right-flanking delimiter run] | |
| or (b) part of a [right-flanking delimiter run] | | or (b) part of a [right-flanking delimiter run] | |
| preceded by punctuation. | | preceded by punctuation. | |
| | | | |
|
| 7. A double `**` [can close strong emphasis](@can-close-strong-emphasis) | | 7. A double `**` [can close strong emphasis](@) | |
| iff it is part of a [right-flanking delimiter run]. | | iff it is part of a [right-flanking delimiter run]. | |
| | | | |
| 8. A double `__` [can close strong emphasis] | | 8. A double `__` [can close strong emphasis] | |
| it is part of a [right-flanking delimiter run] | | it is part of a [right-flanking delimiter run] | |
| and either (a) not part of a [left-flanking delimiter run] | | and either (a) not part of a [left-flanking delimiter run] | |
| or (b) part of a [left-flanking delimiter run] | | or (b) part of a [left-flanking delimiter run] | |
| followed by punctuation. | | followed by punctuation. | |
| | | | |
| 9. Emphasis begins with a delimiter that [can open emphasis] and ends | | 9. Emphasis begins with a delimiter that [can open emphasis] and ends | |
| with a delimiter that [can close emphasis], and that uses the same | | with a delimiter that [can close emphasis], and that uses the same | |
| | | | |
| skipping to change at line 5417 | | skipping to change at line 5511 | |
| than emphasis. So, when there is a choice between an interpretation | | than emphasis. So, when there is a choice between an interpretation | |
| that contains one of these elements and one that does not, the | | that contains one of these elements and one that does not, the | |
| former always wins. Thus, for example, `*[foo*](bar)` is | | former always wins. Thus, for example, `*[foo*](bar)` is | |
| parsed as `*<a href="bar">foo*</a>` rather than as | | parsed as `*<a href="bar">foo*</a>` rather than as | |
| `<em>[foo</em>](bar)`. | | `<em>[foo</em>](bar)`. | |
| | | | |
| These rules can be illustrated through a series of examples. | | These rules can be illustrated through a series of examples. | |
| | | | |
| Rule 1: | | Rule 1: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| *foo bar* | | *foo bar* | |
| . | | . | |
| <p><em>foo bar</em></p> | | <p><em>foo bar</em></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not emphasis, because the opening `*` is followed by | | This is not emphasis, because the opening `*` is followed by | |
| whitespace, and hence not part of a [left-flanking delimiter run]: | | whitespace, and hence not part of a [left-flanking delimiter run]: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| a * foo bar* | | a * foo bar* | |
| . | | . | |
| <p>a * foo bar*</p> | | <p>a * foo bar*</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not emphasis, because the opening `*` is preceded | | This is not emphasis, because the opening `*` is preceded | |
| by an alphanumeric and followed by punctuation, and hence | | by an alphanumeric and followed by punctuation, and hence | |
| not part of a [left-flanking delimiter run]: | | not part of a [left-flanking delimiter run]: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| a*"foo"* | | a*"foo"* | |
| . | | . | |
| <p>a*"foo"*</p> | | <p>a*"foo"*</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Unicode nonbreaking spaces count as whitespace, too: | | Unicode nonbreaking spaces count as whitespace, too: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| * a * | | * a * | |
| . | | . | |
| <p>* a *</p> | | <p>* a *</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Intraword emphasis with `*` is permitted: | | Intraword emphasis with `*` is permitted: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo*bar* | | foo*bar* | |
| . | | . | |
| <p>foo<em>bar</em></p> | | <p>foo<em>bar</em></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 5*6*78 | | 5*6*78 | |
| . | | . | |
| <p>5<em>6</em>78</p> | | <p>5<em>6</em>78</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Rule 2: | | Rule 2: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| _foo bar_ | | _foo bar_ | |
| . | | . | |
| <p><em>foo bar</em></p> | | <p><em>foo bar</em></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not emphasis, because the opening `_` is followed by | | This is not emphasis, because the opening `_` is followed by | |
| whitespace: | | whitespace: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| _ foo bar_ | | _ foo bar_ | |
| . | | . | |
| <p>_ foo bar_</p> | | <p>_ foo bar_</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not emphasis, because the opening `_` is preceded | | This is not emphasis, because the opening `_` is preceded | |
| by an alphanumeric and followed by punctuation: | | by an alphanumeric and followed by punctuation: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| a_"foo"_ | | a_"foo"_ | |
| . | | . | |
| <p>a_"foo"_</p> | | <p>a_"foo"_</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Emphasis with `_` is not allowed inside words: | | Emphasis with `_` is not allowed inside words: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo_bar_ | | foo_bar_ | |
| . | | . | |
| <p>foo_bar_</p> | | <p>foo_bar_</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| 5_6_78 | | 5_6_78 | |
| . | | . | |
| <p>5_6_78</p> | | <p>5_6_78</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| пристаням_стремятся_ | | пристаням_стремятся_ | |
| . | | . | |
| <p>пристаням_стремятся_</p> | | <p>пристаням_стремятся_</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Here `_` does not generate emphasis, because the first delimiter run | | Here `_` does not generate emphasis, because the first delimiter run | |
| is right-flanking and the second left-flanking: | | is right-flanking and the second left-flanking: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| aa_"bb"_cc | | aa_"bb"_cc | |
| . | | . | |
| <p>aa_"bb"_cc</p> | | <p>aa_"bb"_cc</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is emphasis, even though the opening delimiter is | | This is emphasis, even though the opening delimiter is | |
| both left- and right-flanking, because it is preceded by | | both left- and right-flanking, because it is preceded by | |
| punctuation: | | punctuation: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo-_(bar)_ | | foo-_(bar)_ | |
| . | | . | |
| <p>foo-<em>(bar)</em></p> | | <p>foo-<em>(bar)</em></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Rule 3: | | Rule 3: | |
| | | | |
| This is not emphasis, because the closing delimiter does | | This is not emphasis, because the closing delimiter does | |
| not match the opening delimiter: | | not match the opening delimiter: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| _foo* | | _foo* | |
| . | | . | |
| <p>_foo*</p> | | <p>_foo*</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not emphasis, because the closing `*` is preceded by | | This is not emphasis, because the closing `*` is preceded by | |
| whitespace: | | whitespace: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| *foo bar * | | *foo bar * | |
| . | | . | |
| <p>*foo bar *</p> | | <p>*foo bar *</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| A newline also counts as whitespace: | | A newline also counts as whitespace: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| *foo bar | | *foo bar | |
| * | | * | |
| . | | . | |
| <p>*foo bar</p> | | <p>*foo bar</p> | |
| <ul> | | <ul> | |
| <li></li> | | <li></li> | |
| </ul> | | </ul> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not emphasis, because the second `*` is | | This is not emphasis, because the second `*` is | |
| preceded by punctuation and followed by an alphanumeric | | preceded by punctuation and followed by an alphanumeric | |
| (hence it is not part of a [right-flanking delimiter run]: | | (hence it is not part of a [right-flanking delimiter run]: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| *(*foo) | | *(*foo) | |
| . | | . | |
| <p>*(*foo)</p> | | <p>*(*foo)</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| The point of this restriction is more easily appreciated | | The point of this restriction is more easily appreciated | |
| with this example: | | with this example: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| *(*foo*)* | | *(*foo*)* | |
| . | | . | |
| <p><em>(<em>foo</em>)</em></p> | | <p><em>(<em>foo</em>)</em></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Intraword emphasis with `*` is allowed: | | Intraword emphasis with `*` is allowed: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| *foo*bar | | *foo*bar | |
| . | | . | |
| <p><em>foo</em>bar</p> | | <p><em>foo</em>bar</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Rule 4: | | Rule 4: | |
| | | | |
| This is not emphasis, because the closing `_` is preceded by | | This is not emphasis, because the closing `_` is preceded by | |
| whitespace: | | whitespace: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| _foo bar _ | | _foo bar _ | |
| . | | . | |
| <p>_foo bar _</p> | | <p>_foo bar _</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not emphasis, because the second `_` is | | This is not emphasis, because the second `_` is | |
| preceded by punctuation and followed by an alphanumeric: | | preceded by punctuation and followed by an alphanumeric: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| _(_foo) | | _(_foo) | |
| . | | . | |
| <p>_(_foo)</p> | | <p>_(_foo)</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is emphasis within emphasis: | | This is emphasis within emphasis: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| _(_foo_)_ | | _(_foo_)_ | |
| . | | . | |
| <p><em>(<em>foo</em>)</em></p> | | <p><em>(<em>foo</em>)</em></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Intraword emphasis is disallowed for `_`: | | Intraword emphasis is disallowed for `_`: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| _foo_bar | | _foo_bar | |
| . | | . | |
| <p>_foo_bar</p> | | <p>_foo_bar</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| _пристаням_стремятся | | _пристаням_стремятся | |
| . | | . | |
| <p>_пристаням_стремятся</p> | | <p>_пристаням_стремятся</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| _foo_bar_baz_ | | _foo_bar_baz_ | |
| . | | . | |
| <p><em>foo_bar_baz</em></p> | | <p><em>foo_bar_baz</em></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is emphasis, even though the closing delimiter is | | This is emphasis, even though the closing delimiter is | |
| both left- and right-flanking, because it is followed by | | both left- and right-flanking, because it is followed by | |
| punctuation: | | punctuation: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| _(bar)_. | | _(bar)_. | |
| . | | . | |
| <p><em>(bar)</em>.</p> | | <p><em>(bar)</em>.</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Rule 5: | | Rule 5: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| **foo bar** | | **foo bar** | |
| . | | . | |
| <p><strong>foo bar</strong></p> | | <p><strong>foo bar</strong></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not strong emphasis, because the opening delimiter is | | This is not strong emphasis, because the opening delimiter is | |
| followed by whitespace: | | followed by whitespace: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| ** foo bar** | | ** foo bar** | |
| . | | . | |
| <p>** foo bar**</p> | | <p>** foo bar**</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not strong emphasis, because the opening `**` is preceded | | This is not strong emphasis, because the opening `**` is preceded | |
| by an alphanumeric and followed by punctuation, and hence | | by an alphanumeric and followed by punctuation, and hence | |
| not part of a [left-flanking delimiter run]: | | not part of a [left-flanking delimiter run]: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| a**"foo"** | | a**"foo"** | |
| . | | . | |
| <p>a**"foo"**</p> | | <p>a**"foo"**</p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Intraword strong emphasis with `**` is permitted: | | Intraword strong emphasis with `**` is permitted: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| foo**bar** | | foo**bar** | |
| . | | . | |
| <p>foo<strong>bar</strong></p> | | <p>foo<strong>bar</strong></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| Rule 6: | | Rule 6: | |
| | | | |
|
| . | | ```````````````````````````````` example | |
| __foo bar__ | | __foo bar__ | |
| . | | . | |
| <p><strong>foo bar</strong></p> | | <p><strong>foo bar</strong></p> | |
|
| . | | ```````````````````````````````` | |
| | | | |
| This is not strong emphasis, because the opening delimiter is | | This is not strong emphasis, because the opening delimiter is | |
| followed by whitespace: | | followed by whitespace: | |