| 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: | |||
| . | ```````````````````````````````` example | |||
| __ foo bar__ | __ foo bar__ | |||
| . | . | |||
| <p>__ foo bar__</p> | <p>__ foo bar__</p> | |||
| . | ```````````````````````````````` | |||
| A newline counts as whitespace: | A newline counts as whitespace: | |||
| . | ```````````````````````````````` example | |||
| __ | __ | |||
| foo bar__ | foo bar__ | |||
| . | . | |||
| <p>__ | <p>__ | |||
| foo bar__</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: | by an alphanumeric and followed by punctuation: | |||
| . | ```````````````````````````````` example | |||
| a__"foo"__ | a__"foo"__ | |||
| . | . | |||
| <p>a__"foo"__</p> | <p>a__"foo"__</p> | |||
| . | ```````````````````````````````` | |||
| Intraword strong emphasis is forbidden with `__`: | Intraword strong emphasis is forbidden with `__`: | |||
| . | ```````````````````````````````` 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> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| __foo, __bar__, baz__ | __foo, __bar__, baz__ | |||
| . | . | |||
| <p><strong>foo, <strong>bar</strong>, baz</strong></p> | <p><strong>foo, <strong>bar</strong>, baz</strong></p> | |||
| . | ```````````````````````````````` | |||
| This is strong emphasis, even though the opening delimiter is | This is strong 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-<strong>(bar)</strong></p> | <p>foo-<strong>(bar)</strong></p> | |||
| . | ```````````````````````````````` | |||
| Rule 7: | Rule 7: | |||
| This is not strong emphasis, because the closing delimiter is preceded | This is not strong emphasis, because the closing delimiter is preceded | |||
| by whitespace: | by whitespace: | |||
| . | ```````````````````````````````` example | |||
| **foo bar ** | **foo bar ** | |||
| . | . | |||
| <p>**foo bar **</p> | <p>**foo bar **</p> | |||
| . | ```````````````````````````````` | |||
| (Nor can it be interpreted as an emphasized `*foo bar *`, because of | (Nor can it be interpreted as an emphasized `*foo bar *`, because of | |||
| Rule 11.) | Rule 11.) | |||
| This is not strong emphasis, because the second `**` is | This is not strong 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> | |||
| . | ```````````````````````````````` | |||
| The point of this restriction is more easily appreciated | The point of this restriction is more easily appreciated | |||
| with these examples: | with these examples: | |||
| . | ```````````````````````````````` example | |||
| *(**foo**)* | *(**foo**)* | |||
| . | . | |||
| <p><em>(<strong>foo</strong>)</em></p> | <p><em>(<strong>foo</strong>)</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| **Gomphocarpus (*Gomphocarpus physocarpus*, syn. | **Gomphocarpus (*Gomphocarpus physocarpus*, syn. | |||
| *Asclepias physocarpa*)** | *Asclepias physocarpa*)** | |||
| . | . | |||
| <p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn. | <p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn. | |||
| <em>Asclepias physocarpa</em>)</strong></p> | <em>Asclepias physocarpa</em>)</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| **foo "*bar*" foo** | **foo "*bar*" foo** | |||
| . | . | |||
| <p><strong>foo "<em>bar</em>" foo</strong></p> | <p><strong>foo "<em>bar</em>" foo</strong></p> | |||
| . | ```````````````````````````````` | |||
| Intraword emphasis: | Intraword emphasis: | |||
| . | ```````````````````````````````` example | |||
| **foo**bar | **foo**bar | |||
| . | . | |||
| <p><strong>foo</strong>bar</p> | <p><strong>foo</strong>bar</p> | |||
| . | ```````````````````````````````` | |||
| Rule 8: | Rule 8: | |||
| This is not strong emphasis, because the closing delimiter is | This is not strong emphasis, because the closing delimiter is | |||
| preceded by whitespace: | preceded by whitespace: | |||
| . | ```````````````````````````````` example | |||
| __foo bar __ | __foo bar __ | |||
| . | . | |||
| <p>__foo bar __</p> | <p>__foo bar __</p> | |||
| . | ```````````````````````````````` | |||
| This is not strong emphasis, because the second `__` is | This is not strong 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> | |||
| . | ```````````````````````````````` | |||
| 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>(<strong>foo</strong>)</em></p> | <p><em>(<strong>foo</strong>)</em></p> | |||
| . | ```````````````````````````````` | |||
| Intraword strong emphasis is forbidden with `__`: | Intraword strong emphasis is forbidden with `__`: | |||
| . | ```````````````````````````````` 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><strong>foo__bar__baz</strong></p> | <p><strong>foo__bar__baz</strong></p> | |||
| . | ```````````````````````````````` | |||
| This is strong emphasis, even though the closing delimiter is | This is strong 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><strong>(bar)</strong>.</p> | <p><strong>(bar)</strong>.</p> | |||
| . | ```````````````````````````````` | |||
| Rule 9: | Rule 9: | |||
| Any nonempty sequence of inline elements can be the contents of an | Any nonempty sequence of inline elements can be the contents of an | |||
| emphasized span. | emphasized span. | |||
| . | ```````````````````````````````` example | |||
| *foo [bar](/url)* | *foo [bar](/url)* | |||
| . | . | |||
| <p><em>foo <a href="/url">bar</a></em></p> | <p><em>foo <a href="/url">bar</a></em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| *foo | *foo | |||
| bar* | bar* | |||
| . | . | |||
| <p><em>foo | <p><em>foo | |||
| bar</em></p> | bar</em></p> | |||
| . | ```````````````````````````````` | |||
| In particular, emphasis and strong emphasis can be nested | In particular, emphasis and strong emphasis can be nested | |||
| inside emphasis: | inside emphasis: | |||
| . | ```````````````````````````````` example | |||
| _foo __bar__ baz_ | _foo __bar__ baz_ | |||
| . | . | |||
| <p><em>foo <strong>bar</strong> baz</em></p> | <p><em>foo <strong>bar</strong> baz</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| _foo _bar_ baz_ | _foo _bar_ baz_ | |||
| . | . | |||
| <p><em>foo <em>bar</em> baz</em></p> | <p><em>foo <em>bar</em> baz</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| __foo_ bar_ | __foo_ bar_ | |||
| . | . | |||
| <p><em><em>foo</em> bar</em></p> | <p><em><em>foo</em> bar</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| *foo *bar** | *foo *bar** | |||
| . | . | |||
| <p><em>foo <em>bar</em></em></p> | <p><em>foo <em>bar</em></em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| *foo **bar** baz* | *foo **bar** baz* | |||
| . | . | |||
| <p><em>foo <strong>bar</strong> baz</em></p> | <p><em>foo <strong>bar</strong> baz</em></p> | |||
| . | ```````````````````````````````` | |||
| But note: | But note: | |||
| . | ```````````````````````````````` example | |||
| *foo**bar**baz* | *foo**bar**baz* | |||
| . | . | |||
| <p><em>foo</em><em>bar</em><em>baz</em></p> | <p><em>foo</em><em>bar</em><em>baz</em></p> | |||
| . | ```````````````````````````````` | |||
| The difference is that in the preceding case, the internal delimiters | The difference is that in the preceding case, the internal delimiters | |||
| [can close emphasis], while in the cases with spaces, they cannot. | [can close emphasis], while in the cases with spaces, they cannot. | |||
| . | ```````````````````````````````` example | |||
| ***foo** bar* | ***foo** bar* | |||
| . | . | |||
| <p><em><strong>foo</strong> bar</em></p> | <p><em><strong>foo</strong> bar</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| *foo **bar*** | *foo **bar*** | |||
| . | . | |||
| <p><em>foo <strong>bar</strong></em></p> | <p><em>foo <strong>bar</strong></em></p> | |||
| . | ```````````````````````````````` | |||
| Note, however, that in the following case we get no strong | Note, however, that in the following case we get no strong | |||
| emphasis, because the opening delimiter is closed by the first | emphasis, because the opening delimiter is closed by the first | |||
| `*` before `bar`: | `*` before `bar`: | |||
| . | ```````````````````````````````` example | |||
| *foo**bar*** | *foo**bar*** | |||
| . | . | |||
| <p><em>foo</em><em>bar</em>**</p> | <p><em>foo</em><em>bar</em>**</p> | |||
| . | ```````````````````````````````` | |||
| Indefinite levels of nesting are possible: | Indefinite levels of nesting are possible: | |||
| . | ```````````````````````````````` example | |||
| *foo **bar *baz* bim** bop* | *foo **bar *baz* bim** bop* | |||
| . | . | |||
| <p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p> | <p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| *foo [*bar*](/url)* | *foo [*bar*](/url)* | |||
| . | . | |||
| <p><em>foo <a href="/url"><em>bar</em></a></em></p> | <p><em>foo <a href="/url"><em>bar</em></a></em></p> | |||
| . | ```````````````````````````````` | |||
| There can be no empty emphasis or strong emphasis: | There can be no empty emphasis or strong emphasis: | |||
| . | ```````````````````````````````` example | |||
| ** is not an empty emphasis | ** is not an empty emphasis | |||
| . | . | |||
| <p>** is not an empty emphasis</p> | <p>** is not an empty emphasis</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| **** is not an empty strong emphasis | **** is not an empty strong emphasis | |||
| . | . | |||
| <p>**** is not an empty strong emphasis</p> | <p>**** is not an empty strong emphasis</p> | |||
| . | ```````````````````````````````` | |||
| Rule 10: | Rule 10: | |||
| Any nonempty sequence of inline elements can be the contents of an | Any nonempty sequence of inline elements can be the contents of an | |||
| strongly emphasized span. | strongly emphasized span. | |||
| . | ```````````````````````````````` example | |||
| **foo [bar](/url)** | **foo [bar](/url)** | |||
| . | . | |||
| <p><strong>foo <a href="/url">bar</a></strong></p> | <p><strong>foo <a href="/url">bar</a></strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| **foo | **foo | |||
| bar** | bar** | |||
| . | . | |||
| <p><strong>foo | <p><strong>foo | |||
| bar</strong></p> | bar</strong></p> | |||
| . | ```````````````````````````````` | |||
| In particular, emphasis and strong emphasis can be nested | In particular, emphasis and strong emphasis can be nested | |||
| inside strong emphasis: | inside strong emphasis: | |||
| . | ```````````````````````````````` example | |||
| __foo _bar_ baz__ | __foo _bar_ baz__ | |||
| . | . | |||
| <p><strong>foo <em>bar</em> baz</strong></p> | <p><strong>foo <em>bar</em> baz</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| __foo __bar__ baz__ | __foo __bar__ baz__ | |||
| . | . | |||
| <p><strong>foo <strong>bar</strong> baz</strong></p> | <p><strong>foo <strong>bar</strong> baz</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ____foo__ bar__ | ____foo__ bar__ | |||
| . | . | |||
| <p><strong><strong>foo</strong> bar</strong></p> | <p><strong><strong>foo</strong> bar</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| **foo **bar**** | **foo **bar**** | |||
| . | . | |||
| <p><strong>foo <strong>bar</strong></strong></p> | <p><strong>foo <strong>bar</strong></strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| **foo *bar* baz** | **foo *bar* baz** | |||
| . | . | |||
| <p><strong>foo <em>bar</em> baz</strong></p> | <p><strong>foo <em>bar</em> baz</strong></p> | |||
| . | ```````````````````````````````` | |||
| But note: | But note: | |||
| . | ```````````````````````````````` example | |||
| **foo*bar*baz** | **foo*bar*baz** | |||
| . | . | |||
| <p><em><em>foo</em>bar</em>baz**</p> | <p><em><em>foo</em>bar</em>baz**</p> | |||
| . | ```````````````````````````````` | |||
| The difference is that in the preceding case, the internal delimiters | The difference is that in the preceding case, the internal delimiters | |||
| [can close emphasis], while in the cases with spaces, they cannot. | [can close emphasis], while in the cases with spaces, they cannot. | |||
| . | ```````````````````````````````` example | |||
| ***foo* bar** | ***foo* bar** | |||
| . | . | |||
| <p><strong><em>foo</em> bar</strong></p> | <p><strong><em>foo</em> bar</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| **foo *bar*** | **foo *bar*** | |||
| . | . | |||
| <p><strong>foo <em>bar</em></strong></p> | <p><strong>foo <em>bar</em></strong></p> | |||
| . | ```````````````````````````````` | |||
| Indefinite levels of nesting are possible: | Indefinite levels of nesting are possible: | |||
| . | ```````````````````````````````` example | |||
| **foo *bar **baz** | **foo *bar **baz** | |||
| bim* bop** | bim* bop** | |||
| . | . | |||
| <p><strong>foo <em>bar <strong>baz</strong> | <p><strong>foo <em>bar <strong>baz</strong> | |||
| bim</em> bop</strong></p> | bim</em> bop</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| **foo [*bar*](/url)** | **foo [*bar*](/url)** | |||
| . | . | |||
| <p><strong>foo <a href="/url"><em>bar</em></a></strong></p> | <p><strong>foo <a href="/url"><em>bar</em></a></strong></p> | |||
| . | ```````````````````````````````` | |||
| There can be no empty emphasis or strong emphasis: | There can be no empty emphasis or strong emphasis: | |||
| . | ```````````````````````````````` example | |||
| __ is not an empty emphasis | __ is not an empty emphasis | |||
| . | . | |||
| <p>__ is not an empty emphasis</p> | <p>__ is not an empty emphasis</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ____ is not an empty strong emphasis | ____ is not an empty strong emphasis | |||
| . | . | |||
| <p>____ is not an empty strong emphasis</p> | <p>____ is not an empty strong emphasis</p> | |||
| . | ```````````````````````````````` | |||
| Rule 11: | Rule 11: | |||
| . | ```````````````````````````````` example | |||
| foo *** | foo *** | |||
| . | . | |||
| <p>foo ***</p> | <p>foo ***</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo *\** | foo *\** | |||
| . | . | |||
| <p>foo <em>*</em></p> | <p>foo <em>*</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo *_* | foo *_* | |||
| . | . | |||
| <p>foo <em>_</em></p> | <p>foo <em>_</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo ***** | foo ***** | |||
| . | . | |||
| <p>foo *****</p> | <p>foo *****</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo **\*** | foo **\*** | |||
| . | . | |||
| <p>foo <strong>*</strong></p> | <p>foo <strong>*</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo **_** | foo **_** | |||
| . | . | |||
| <p>foo <strong>_</strong></p> | <p>foo <strong>_</strong></p> | |||
| . | ```````````````````````````````` | |||
| Note that when delimiters do not match evenly, Rule 11 determines | Note that when delimiters do not match evenly, Rule 11 determines | |||
| that the excess literal `*` characters will appear outside of the | that the excess literal `*` characters will appear outside of the | |||
| emphasis, rather than inside it: | emphasis, rather than inside it: | |||
| . | ```````````````````````````````` example | |||
| **foo* | **foo* | |||
| . | . | |||
| <p>*<em>foo</em></p> | <p>*<em>foo</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| *foo** | *foo** | |||
| . | . | |||
| <p><em>foo</em>*</p> | <p><em>foo</em>*</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ***foo** | ***foo** | |||
| . | . | |||
| <p>*<strong>foo</strong></p> | <p>*<strong>foo</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ****foo* | ****foo* | |||
| . | . | |||
| <p>***<em>foo</em></p> | <p>***<em>foo</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| **foo*** | **foo*** | |||
| . | . | |||
| <p><strong>foo</strong>*</p> | <p><strong>foo</strong>*</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| *foo**** | *foo**** | |||
| . | . | |||
| <p><em>foo</em>***</p> | <p><em>foo</em>***</p> | |||
| . | ```````````````````````````````` | |||
| Rule 12: | Rule 12: | |||
| . | ```````````````````````````````` example | |||
| foo ___ | foo ___ | |||
| . | . | |||
| <p>foo ___</p> | <p>foo ___</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo _\__ | foo _\__ | |||
| . | . | |||
| <p>foo <em>_</em></p> | <p>foo <em>_</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo _*_ | foo _*_ | |||
| . | . | |||
| <p>foo <em>*</em></p> | <p>foo <em>*</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo _____ | foo _____ | |||
| . | . | |||
| <p>foo _____</p> | <p>foo _____</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo __\___ | foo __\___ | |||
| . | . | |||
| <p>foo <strong>_</strong></p> | <p>foo <strong>_</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo __*__ | foo __*__ | |||
| . | . | |||
| <p>foo <strong>*</strong></p> | <p>foo <strong>*</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| __foo_ | __foo_ | |||
| . | . | |||
| <p>_<em>foo</em></p> | <p>_<em>foo</em></p> | |||
| . | ```````````````````````````````` | |||
| Note that when delimiters do not match evenly, Rule 12 determines | Note that when delimiters do not match evenly, Rule 12 determines | |||
| that the excess literal `_` characters will appear outside of the | that the excess literal `_` characters will appear outside of the | |||
| emphasis, rather than inside it: | emphasis, rather than inside it: | |||
| . | ```````````````````````````````` example | |||
| _foo__ | _foo__ | |||
| . | . | |||
| <p><em>foo</em>_</p> | <p><em>foo</em>_</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ___foo__ | ___foo__ | |||
| . | . | |||
| <p>_<strong>foo</strong></p> | <p>_<strong>foo</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ____foo_ | ____foo_ | |||
| . | . | |||
| <p>___<em>foo</em></p> | <p>___<em>foo</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| __foo___ | __foo___ | |||
| . | . | |||
| <p><strong>foo</strong>_</p> | <p><strong>foo</strong>_</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| _foo____ | _foo____ | |||
| . | . | |||
| <p><em>foo</em>___</p> | <p><em>foo</em>___</p> | |||
| . | ```````````````````````````````` | |||
| Rule 13 implies that if you want emphasis nested directly inside | Rule 13 implies that if you want emphasis nested directly inside | |||
| emphasis, you must use different delimiters: | emphasis, you must use different delimiters: | |||
| . | ```````````````````````````````` example | |||
| **foo** | **foo** | |||
| . | . | |||
| <p><strong>foo</strong></p> | <p><strong>foo</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| *_foo_* | *_foo_* | |||
| . | . | |||
| <p><em><em>foo</em></em></p> | <p><em><em>foo</em></em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| __foo__ | __foo__ | |||
| . | . | |||
| <p><strong>foo</strong></p> | <p><strong>foo</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| _*foo*_ | _*foo*_ | |||
| . | . | |||
| <p><em><em>foo</em></em></p> | <p><em><em>foo</em></em></p> | |||
| . | ```````````````````````````````` | |||
| However, strong emphasis within strong emphasis is possible without | However, strong emphasis within strong emphasis is possible without | |||
| switching delimiters: | switching delimiters: | |||
| . | ```````````````````````````````` example | |||
| ****foo**** | ****foo**** | |||
| . | . | |||
| <p><strong><strong>foo</strong></strong></p> | <p><strong><strong>foo</strong></strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ____foo____ | ____foo____ | |||
| . | . | |||
| <p><strong><strong>foo</strong></strong></p> | <p><strong><strong>foo</strong></strong></p> | |||
| . | ```````````````````````````````` | |||
| Rule 13 can be applied to arbitrarily long sequences of | Rule 13 can be applied to arbitrarily long sequences of | |||
| delimiters: | delimiters: | |||
| . | ```````````````````````````````` example | |||
| ******foo****** | ******foo****** | |||
| . | . | |||
| <p><strong><strong><strong>foo</strong></strong></strong></p> | <p><strong><strong><strong>foo</strong></strong></strong></p> | |||
| . | ```````````````````````````````` | |||
| Rule 14: | Rule 14: | |||
| . | ```````````````````````````````` example | |||
| ***foo*** | ***foo*** | |||
| . | . | |||
| <p><strong><em>foo</em></strong></p> | <p><strong><em>foo</em></strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| _____foo_____ | _____foo_____ | |||
| . | . | |||
| <p><strong><strong><em>foo</em></strong></strong></p> | <p><strong><strong><em>foo</em></strong></strong></p> | |||
| . | ```````````````````````````````` | |||
| Rule 15: | Rule 15: | |||
| . | ```````````````````````````````` example | |||
| *foo _bar* baz_ | *foo _bar* baz_ | |||
| . | . | |||
| <p><em>foo _bar</em> baz_</p> | <p><em>foo _bar</em> baz_</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| **foo*bar** | **foo*bar** | |||
| . | . | |||
| <p><em><em>foo</em>bar</em>*</p> | <p><em><em>foo</em>bar</em>*</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| *foo __bar *baz bim__ bam* | *foo __bar *baz bim__ bam* | |||
| . | . | |||
| <p><em>foo <strong>bar *baz bim</strong> bam</em></p> | <p><em>foo <strong>bar *baz bim</strong> bam</em></p> | |||
| . | ```````````````````````````````` | |||
| Rule 16: | Rule 16: | |||
| . | ```````````````````````````````` example | |||
| **foo **bar baz** | **foo **bar baz** | |||
| . | . | |||
| <p>**foo <strong>bar baz</strong></p> | <p>**foo <strong>bar baz</strong></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| *foo *bar baz* | *foo *bar baz* | |||
| . | . | |||
| <p>*foo <em>bar baz</em></p> | <p>*foo <em>bar baz</em></p> | |||
| . | ```````````````````````````````` | |||
| Rule 17: | Rule 17: | |||
| . | ```````````````````````````````` example | |||
| *[bar*](/url) | *[bar*](/url) | |||
| . | . | |||
| <p>*<a href="/url">bar*</a></p> | <p>*<a href="/url">bar*</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| _foo [bar_](/url) | _foo [bar_](/url) | |||
| . | . | |||
| <p>_foo <a href="/url">bar_</a></p> | <p>_foo <a href="/url">bar_</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| *<img src="foo" title="*"/> | *<img src="foo" title="*"/> | |||
| . | . | |||
| <p>*<img src="foo" title="*"/></p> | <p>*<img src="foo" title="*"/></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| **<a href="**"> | **<a href="**"> | |||
| . | . | |||
| <p>**<a href="**"></p> | <p>**<a href="**"></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| __<a href="__"> | __<a href="__"> | |||
| . | . | |||
| <p>__<a href="__"></p> | <p>__<a href="__"></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| *a `*`* | *a `*`* | |||
| . | . | |||
| <p><em>a <code>*</code></em></p> | <p><em>a <code>*</code></em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| _a `_`_ | _a `_`_ | |||
| . | . | |||
| <p><em>a <code>_</code></em></p> | <p><em>a <code>_</code></em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| **a<http://foo.bar/?q=**> | **a<http://foo.bar/?q=**> | |||
| . | . | |||
| <p>**a<a href="http://foo.bar/?q=**">http://foo.bar/?q=**</a></p> | <p>**a<a href="http://foo.bar/?q=**">http://foo.bar/?q=**</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| __a<http://foo.bar/?q=__> | __a<http://foo.bar/?q=__> | |||
| . | . | |||
| <p>__a<a href="http://foo.bar/?q=__">http://foo.bar/?q=__</a></p> | <p>__a<a href="http://foo.bar/?q=__">http://foo.bar/?q=__</a></p> | |||
| . | ```````````````````````````````` | |||
| ## Links | ## Links | |||
| A link contains [link text] (the visible text), a [link destination] | A link contains [link text] (the visible text), a [link destination] | |||
| (the URI that is the link destination), and optionally a [link title]. | (the URI that is the link destination), and optionally a [link title]. | |||
| There are two basic kinds of links in Markdown. In [inline link]s the | There are two basic kinds of links in Markdown. In [inline links] the | |||
| destination and title are given immediately after the link text. In | destination and title are given immediately after the link text. In | |||
| [reference link]s the destination and title are defined elsewhere in | [reference links] the destination and title are defined elsewhere in | |||
| the document. | the document. | |||
| A [link text](@link-text) consists of a sequence of zero or more | A [link text](@) consists of a sequence of zero or more | |||
| inline elements enclosed by square brackets (`[` and `]`). The | inline elements enclosed by square brackets (`[` and `]`). The | |||
| following rules apply: | following rules apply: | |||
| - Links may not contain other links, at any level of nesting. If | - Links may not contain other links, at any level of nesting. If | |||
| multiple otherwise valid link definitions appear nested inside each | multiple otherwise valid link definitions appear nested inside each | |||
| other, the inner-most definition is used. | other, the inner-most definition is used. | |||
| - Brackets are allowed in the [link text] only if (a) they | - Brackets are allowed in the [link text] only if (a) they | |||
| are backslash-escaped or (b) they appear as a matched pair of brackets, | are backslash-escaped or (b) they appear as a matched pair of brackets, | |||
| with an open bracket `[`, a sequence of zero or more inlines, and | with an open bracket `[`, a sequence of zero or more inlines, and | |||
| a close bracket `]`. | a close bracket `]`. | |||
| - Backtick [code span]s, [autolink]s, and raw [HTML tag]s bind more tightly | - Backtick [code spans], [autolinks], and raw [HTML tags] bind more tightly | |||
| than the brackets in link text. Thus, for example, | than the brackets in link text. Thus, for example, | |||
| `` [foo`]` `` could not be a link text, since the second `]` | `` [foo`]` `` could not be a link text, since the second `]` | |||
| is part of a code span. | is part of a code span. | |||
| - The brackets in link text bind more tightly than markers for | - The brackets in link text bind more tightly than markers for | |||
| [emphasis and strong emphasis]. Thus, for example, `*[foo*](url)` is a link. | [emphasis and strong emphasis]. Thus, for example, `*[foo*](url)` is a link. | |||
| A [link destination](@link-destination) consists of either | A [link destination](@) consists of either | |||
| - a sequence of zero or more characters between an opening `<` and a | - a sequence of zero or more characters between an opening `<` and a | |||
| closing `>` that contains no line breaks or unescaped `<` or `>` | closing `>` that contains no spaces, line breaks, or unescaped | |||
| characters, or | `<` or `>` characters, or | |||
| - a nonempty sequence of characters that does not include | - a nonempty sequence of characters that does not include | |||
| ASCII space or control characters, and includes parentheses | ASCII space or control characters, and includes parentheses | |||
| only if (a) they are backslash-escaped or (b) they are part of | only if (a) they are backslash-escaped or (b) they are part of | |||
| a balanced pair of unescaped parentheses that is not itself | a balanced pair of unescaped parentheses that is not itself | |||
| inside a balanced pair of unescaped parentheses. | inside a balanced pair of unescaped parentheses. | |||
| A [link title](@link-title) consists of either | A [link title](@) consists of either | |||
| - a sequence of zero or more characters between straight double-quote | - a sequence of zero or more characters between straight double-quote | |||
| characters (`"`), including a `"` character only if it is | characters (`"`), including a `"` character only if it is | |||
| backslash-escaped, or | backslash-escaped, or | |||
| - a sequence of zero or more characters between straight single-quote | - a sequence of zero or more characters between straight single-quote | |||
| characters (`'`), including a `'` character only if it is | characters (`'`), including a `'` character only if it is | |||
| backslash-escaped, or | backslash-escaped, or | |||
| - a sequence of zero or more characters between matching parentheses | - a sequence of zero or more characters between matching parentheses | |||
| (`(...)`), including a `)` character only if it is backslash-escaped. | (`(...)`), including a `)` character only if it is backslash-escaped. | |||
| Although [link title]s may span multiple lines, they may not contain | Although [link titles] may span multiple lines, they may not contain | |||
| a [blank line]. | a [blank line]. | |||
| An [inline link](@inline-link) consists of a [link text] followed immediately | An [inline link](@) consists of a [link text] followed immediately | |||
| by a left parenthesis `(`, optional [whitespace], an optional | by a left parenthesis `(`, optional [whitespace], an optional | |||
| [link destination], an optional [link title] separated from the link | [link destination], an optional [link title] separated from the link | |||
| destination by [whitespace], optional [whitespace], and a right | destination by [whitespace], optional [whitespace], and a right | |||
| parenthesis `)`. The link's text consists of the inlines contained | parenthesis `)`. The link's text consists of the inlines contained | |||
| in the [link text] (excluding the enclosing square brackets). | in the [link text] (excluding the enclosing square brackets). | |||
| The link's URI consists of the link destination, excluding enclosing | The link's URI consists of the link destination, excluding enclosing | |||
| `<...>` if present, with backslash-escapes in effect as described | `<...>` if present, with backslash-escapes in effect as described | |||
| above. The link's title consists of the link title, excluding its | above. The link's title consists of the link title, excluding its | |||
| enclosing delimiters, with backslash-escapes in effect as described | enclosing delimiters, with backslash-escapes in effect as described | |||
| above. | above. | |||
| Here is a simple inline link: | Here is a simple inline link: | |||
| . | ```````````````````````````````` example | |||
| [link](/uri "title") | [link](/uri "title") | |||
| . | . | |||
| <p><a href="/uri" title="title">link</a></p> | <p><a href="/uri" title="title">link</a></p> | |||
| . | ```````````````````````````````` | |||
| The title may be omitted: | The title may be omitted: | |||
| . | ```````````````````````````````` example | |||
| [link](/uri) | [link](/uri) | |||
| . | . | |||
| <p><a href="/uri">link</a></p> | <p><a href="/uri">link</a></p> | |||
| . | ```````````````````````````````` | |||
| Both the title and the destination may be omitted: | Both the title and the destination may be omitted: | |||
| . | ```````````````````````````````` example | |||
| [link]() | [link]() | |||
| . | . | |||
| <p><a href="">link</a></p> | <p><a href="">link</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [link](<>) | [link](<>) | |||
| . | . | |||
| <p><a href="">link</a></p> | <p><a href="">link</a></p> | |||
| . | ```````````````````````````````` | |||
| If the destination contains spaces, it must be enclosed in pointy | The destination cannot contain spaces or line breaks, | |||
| braces: | even if enclosed in pointy brackets: | |||
| . | ```````````````````````````````` example | |||
| [link](/my uri) | [link](/my uri) | |||
| . | . | |||
| <p>[link](/my uri)</p> | <p>[link](/my uri)</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [link](</my uri>) | [link](</my uri>) | |||
| . | . | |||
| <p><a href="/my%20uri">link</a></p> | <p>[link](</my uri>)</p> | |||
| . | ```````````````````````````````` | |||
| The destination cannot contain line breaks, even with pointy braces: | ||||
| . | ```````````````````````````````` example | |||
| [link](foo | [link](foo | |||
| bar) | bar) | |||
| . | . | |||
| <p>[link](foo | <p>[link](foo | |||
| bar)</p> | bar)</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [link](<foo | [link](<foo | |||
| bar>) | bar>) | |||
| . | . | |||
| <p>[link](<foo | <p>[link](<foo | |||
| bar>)</p> | bar>)</p> | |||
| ```````````````````````````````` | ||||
| Parentheses inside the link destination may be escaped: | ||||
| ```````````````````````````````` example | ||||
| [link](\(foo\)) | ||||
| . | . | |||
| <p><a href="(foo)">link</a></p> | ||||
| ```````````````````````````````` | ||||
| One level of balanced parentheses is allowed without escaping: | One level of balanced parentheses is allowed without escaping: | |||
| . | ```````````````````````````````` example | |||
| [link]((foo)and(bar)) | [link]((foo)and(bar)) | |||
| . | . | |||
| <p><a href="(foo)and(bar)">link</a></p> | <p><a href="(foo)and(bar)">link</a></p> | |||
| . | ```````````````````````````````` | |||
| However, if you have parentheses within parentheses, you need to escape | However, if you have parentheses within parentheses, you need to escape | |||
| or use the `<...>` form: | or use the `<...>` form: | |||
| . | ```````````````````````````````` example | |||
| [link](foo(and(bar))) | [link](foo(and(bar))) | |||
| . | . | |||
| <p>[link](foo(and(bar)))</p> | <p>[link](foo(and(bar)))</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [link](foo(and\(bar\))) | [link](foo(and\(bar\))) | |||
| . | . | |||
| <p><a href="foo(and(bar))">link</a></p> | <p><a href="foo(and(bar))">link</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [link](<foo(and(bar))>) | [link](<foo(and(bar))>) | |||
| . | . | |||
| <p><a href="foo(and(bar))">link</a></p> | <p><a href="foo(and(bar))">link</a></p> | |||
| . | ```````````````````````````````` | |||
| Parentheses and other symbols can also be escaped, as usual | Parentheses and other symbols can also be escaped, as usual | |||
| in Markdown: | in Markdown: | |||
| . | ```````````````````````````````` example | |||
| [link](foo\)\:) | [link](foo\)\:) | |||
| . | . | |||
| <p><a href="foo):">link</a></p> | <p><a href="foo):">link</a></p> | |||
| . | ```````````````````````````````` | |||
| A link can contain fragment identifiers and queries: | A link can contain fragment identifiers and queries: | |||
| . | ```````````````````````````````` example | |||
| [link](#fragment) | [link](#fragment) | |||
| [link](http://example.com#fragment) | [link](http://example.com#fragment) | |||
| [link](http://example.com?foo=3#frag) | [link](http://example.com?foo=3#frag) | |||
| . | . | |||
| <p><a href="#fragment">link</a></p> | <p><a href="#fragment">link</a></p> | |||
| <p><a href="http://example.com#fragment">link</a></p> | <p><a href="http://example.com#fragment">link</a></p> | |||
| <p><a href="http://example.com?foo=3#frag">link</a></p> | <p><a href="http://example.com?foo=3#frag">link</a></p> | |||
| . | ```````````````````````````````` | |||
| Note that a backslash before a non-escapable character is | Note that a backslash before a non-escapable character is | |||
| just a backslash: | just a backslash: | |||
| . | ```````````````````````````````` example | |||
| [link](foo\bar) | [link](foo\bar) | |||
| . | . | |||
| <p><a href="foo%5Cbar">link</a></p> | <p><a href="foo%5Cbar">link</a></p> | |||
| . | ```````````````````````````````` | |||
| URL-escaping should be left alone inside the destination, as all | URL-escaping should be left alone inside the destination, as all | |||
| URL-escaped characters are also valid URL characters. Entity and | URL-escaped characters are also valid URL characters. Entity and | |||
| numerical character references in the destination will be parsed | numerical character references in the destination will be parsed | |||
| into the corresponding Unicode code points, as usual. These may | into the corresponding Unicode code points, as usual. These may | |||
| be optionally URL-escaped when written as HTML, but this spec | be optionally URL-escaped when written as HTML, but this spec | |||
| does not enforce any particular policy for rendering URLs in | does not enforce any particular policy for rendering URLs in | |||
| HTML or other formats. Renderers may make different decisions | HTML or other formats. Renderers may make different decisions | |||
| about how to escape or normalize URLs in the output. | about how to escape or normalize URLs in the output. | |||
| . | ```````````````````````````````` example | |||
| [link](foo%20bä) | [link](foo%20bä) | |||
| . | . | |||
| <p><a href="foo%20b%C3%A4">link</a></p> | <p><a href="foo%20b%C3%A4">link</a></p> | |||
| . | ```````````````````````````````` | |||
| Note that, because titles can often be parsed as destinations, | Note that, because titles can often be parsed as destinations, | |||
| if you try to omit the destination and keep the title, you'll | if you try to omit the destination and keep the title, you'll | |||
| get unexpected results: | get unexpected results: | |||
| . | ```````````````````````````````` example | |||
| [link]("title") | [link]("title") | |||
| . | . | |||
| <p><a href="%22title%22">link</a></p> | <p><a href="%22title%22">link</a></p> | |||
| . | ```````````````````````````````` | |||
| Titles may be in single quotes, double quotes, or parentheses: | Titles may be in single quotes, double quotes, or parentheses: | |||
| . | ```````````````````````````````` example | |||
| [link](/url "title") | [link](/url "title") | |||
| [link](/url 'title') | [link](/url 'title') | |||
| [link](/url (title)) | [link](/url (title)) | |||
| . | . | |||
| <p><a href="/url" title="title">link</a> | <p><a href="/url" title="title">link</a> | |||
| <a href="/url" title="title">link</a> | <a href="/url" title="title">link</a> | |||
| <a href="/url" title="title">link</a></p> | <a href="/url" title="title">link</a></p> | |||
| . | ```````````````````````````````` | |||
| Backslash escapes and entity and numeric character references | Backslash escapes and entity and numeric character references | |||
| may be used in titles: | may be used in titles: | |||
| . | ```````````````````````````````` example | |||
| [link](/url "title \""") | [link](/url "title \""") | |||
| . | . | |||
| <p><a href="/url" title="title """>link</a></p> | <p><a href="/url" title="title """>link</a></p> | |||
| . | ```````````````````````````````` | |||
| Nested balanced quotes are not allowed without escaping: | Nested balanced quotes are not allowed without escaping: | |||
| . | ```````````````````````````````` example | |||
| [link](/url "title "and" title") | [link](/url "title "and" title") | |||
| . | . | |||
| <p>[link](/url "title "and" title")</p> | <p>[link](/url "title "and" title")</p> | |||
| . | ```````````````````````````````` | |||
| But it is easy to work around this by using a different quote type: | But it is easy to work around this by using a different quote type: | |||
| . | ```````````````````````````````` example | |||
| [link](/url 'title "and" title') | [link](/url 'title "and" title') | |||
| . | . | |||
| <p><a href="/url" title="title "and" title">link</a></p> | <p><a href="/url" title="title "and" title">link</a></p> | |||
| . | ```````````````````````````````` | |||
| (Note: `Markdown.pl` did allow double quotes inside a double-quoted | (Note: `Markdown.pl` did allow double quotes inside a double-quoted | |||
| title, and its test suite included a test demonstrating this. | title, and its test suite included a test demonstrating this. | |||
| But it is hard to see a good rationale for the extra complexity this | But it is hard to see a good rationale for the extra complexity this | |||
| brings, since there are already many ways---backslash escaping, | brings, since there are already many ways---backslash escaping, | |||
| entity and numeric character references, or using a different | entity and numeric character references, or using a different | |||
| quote type for the enclosing title---to write titles containing | quote type for the enclosing title---to write titles containing | |||
| double quotes. `Markdown.pl`'s handling of titles has a number | double quotes. `Markdown.pl`'s handling of titles has a number | |||
| of other strange features. For example, it allows single-quoted | of other strange features. For example, it allows single-quoted | |||
| titles in inline links, but not reference links. And, in | titles in inline links, but not reference links. And, in | |||
| reference links but not inline links, it allows a title to begin | reference links but not inline links, it allows a title to begin | |||
| with `"` and end with `)`. `Markdown.pl` 1.0.1 even allows | with `"` and end with `)`. `Markdown.pl` 1.0.1 even allows | |||
| titles with no closing quotation mark, though 1.0.2b8 does not. | titles with no closing quotation mark, though 1.0.2b8 does not. | |||
| It seems preferable to adopt a simple, rational rule that works | It seems preferable to adopt a simple, rational rule that works | |||
| the same way in inline links and link reference definitions.) | the same way in inline links and link reference definitions.) | |||
| [Whitespace] is allowed around the destination and title: | [Whitespace] is allowed around the destination and title: | |||
| . | ```````````````````````````````` example | |||
| [link]( /uri | [link]( /uri | |||
| "title" ) | "title" ) | |||
| . | . | |||
| <p><a href="/uri" title="title">link</a></p> | <p><a href="/uri" title="title">link</a></p> | |||
| . | ```````````````````````````````` | |||
| But it is not allowed between the link text and the | But it is not allowed between the link text and the | |||
| following parenthesis: | following parenthesis: | |||
| . | ```````````````````````````````` example | |||
| [link] (/uri) | [link] (/uri) | |||
| . | . | |||
| <p>[link] (/uri)</p> | <p>[link] (/uri)</p> | |||
| . | ```````````````````````````````` | |||
| The link text may contain balanced brackets, but not unbalanced ones, | The link text may contain balanced brackets, but not unbalanced ones, | |||
| unless they are escaped: | unless they are escaped: | |||
| . | ```````````````````````````````` example | |||
| [link [foo [bar]]](/uri) | [link [foo [bar]]](/uri) | |||
| . | . | |||
| <p><a href="/uri">link [foo [bar]]</a></p> | <p><a href="/uri">link [foo [bar]]</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [link] bar](/uri) | [link] bar](/uri) | |||
| . | . | |||
| <p>[link] bar](/uri)</p> | <p>[link] bar](/uri)</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [link [bar](/uri) | [link [bar](/uri) | |||
| . | . | |||
| <p>[link <a href="/uri">bar</a></p> | <p>[link <a href="/uri">bar</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [link \[bar](/uri) | [link \[bar](/uri) | |||
| . | . | |||
| <p><a href="/uri">link [bar</a></p> | <p><a href="/uri">link [bar</a></p> | |||
| . | ```````````````````````````````` | |||
| The link text may contain inline content: | The link text may contain inline content: | |||
| . | ```````````````````````````````` example | |||
| [link *foo **bar** `#`*](/uri) | [link *foo **bar** `#`*](/uri) | |||
| . | . | |||
| <p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p> | <p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [](/uri) | [](/uri) | |||
| . | . | |||
| <p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p> | <p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p> | |||
| . | ```````````````````````````````` | |||
| However, links may not contain other links, at any level of nesting. | However, links may not contain other links, at any level of nesting. | |||
| . | ```````````````````````````````` example | |||
| [foo [bar](/uri)](/uri) | [foo [bar](/uri)](/uri) | |||
| . | . | |||
| <p>[foo <a href="/uri">bar</a>](/uri)</p> | <p>[foo <a href="/uri">bar</a>](/uri)</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [foo *[bar [baz](/uri)](/uri)*](/uri) | [foo *[bar [baz](/uri)](/uri)*](/uri) | |||
| . | . | |||
| <p>[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p> | <p>[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ](uri2)](uri3) | ](uri2)](uri3) | |||
| . | . | |||
| <p><img src="uri3" alt="[foo](uri2)" /></p> | <p><img src="uri3" alt="[foo](uri2)" /></p> | |||
| . | ```````````````````````````````` | |||
| These cases illustrate the precedence of link text grouping over | These cases illustrate the precedence of link text grouping over | |||
| emphasis grouping: | emphasis grouping: | |||
| . | ```````````````````````````````` example | |||
| *[foo*](/uri) | *[foo*](/uri) | |||
| . | . | |||
| <p>*<a href="/uri">foo*</a></p> | <p>*<a href="/uri">foo*</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [foo *bar](baz*) | [foo *bar](baz*) | |||
| . | . | |||
| <p><a href="baz*">foo *bar</a></p> | <p><a href="baz*">foo *bar</a></p> | |||
| . | ```````````````````````````````` | |||
| Note that brackets that *aren't* part of links do not take | Note that brackets that *aren't* part of links do not take | |||
| precedence: | precedence: | |||
| . | ```````````````````````````````` example | |||
| *foo [bar* baz] | *foo [bar* baz] | |||
| . | . | |||
| <p><em>foo [bar</em> baz]</p> | <p><em>foo [bar</em> baz]</p> | |||
| . | ```````````````````````````````` | |||
| These cases illustrate the precedence of HTML tags, code spans, | These cases illustrate the precedence of HTML tags, code spans, | |||
| and autolinks over link grouping: | and autolinks over link grouping: | |||
| . | ```````````````````````````````` example | |||
| [foo <bar attr="](baz)"> | [foo <bar attr="](baz)"> | |||
| . | . | |||
| <p>[foo <bar attr="](baz)"></p> | <p>[foo <bar attr="](baz)"></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [foo`](/uri)` | [foo`](/uri)` | |||
| . | . | |||
| <p>[foo<code>](/uri)</code></p> | <p>[foo<code>](/uri)</code></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [foo<http://example.com/?search=](uri)> | [foo<http://example.com/?search=](uri)> | |||
| . | . | |||
| <p>[foo<a href="http://example.com/?search=%5D(uri)">http://example.com/?search= ](uri)</a></p> | <p>[foo<a href="http://example.com/?search=%5D(uri)">http://example.com/?search= ](uri)</a></p> | |||
| . | ```````````````````````````````` | |||
| There are three kinds of [reference link](@reference-link)s: | There are three kinds of [reference link](@)s: | |||
| [full](#full-reference-link), [collapsed](#collapsed-reference-link), | [full](#full-reference-link), [collapsed](#collapsed-reference-link), | |||
| and [shortcut](#shortcut-reference-link). | and [shortcut](#shortcut-reference-link). | |||
| A [full reference link](@full-reference-link) | A [full reference link](@) | |||
| consists of a [link text] immediately followed by a [link label] | consists of a [link text] immediately followed by a [link label] | |||
| that [matches] a [link reference definition] elsewhere in the document. | that [matches] a [link reference definition] elsewhere in the document. | |||
| A [link label](@link-label) begins with a left bracket (`[`) and ends | A [link label](@) begins with a left bracket (`[`) and ends | |||
| with the first right bracket (`]`) that is not backslash-escaped. | with the first right bracket (`]`) that is not backslash-escaped. | |||
| Between these brackets there must be at least one [non-whitespace character]. | Between these brackets there must be at least one [non-whitespace character]. | |||
| Unescaped square bracket characters are not allowed in | Unescaped square bracket characters are not allowed in | |||
| [link label]s. A link label can have at most 999 | [link labels]. A link label can have at most 999 | |||
| characters inside the square brackets. | characters inside the square brackets. | |||
| One label [matches](@matches) | One label [matches](@) | |||
| another just in case their normalized forms are equal. To normalize a | another just in case their normalized forms are equal. To normalize a | |||
| label, perform the *Unicode case fold* and collapse consecutive internal | label, perform the *Unicode case fold* and collapse consecutive internal | |||
| [whitespace] to a single space. If there are multiple | [whitespace] to a single space. If there are multiple | |||
| matching reference link definitions, the one that comes first in the | matching reference link definitions, the one that comes first in the | |||
| document is used. (It is desirable in such cases to emit a warning.) | document is used. (It is desirable in such cases to emit a warning.) | |||
| The contents of the first link label are parsed as inlines, which are | The contents of the first link label are parsed as inlines, which are | |||
| used as the link's text. The link's URI and title are provided by the | used as the link's text. The link's URI and title are provided by the | |||
| matching [link reference definition]. | matching [link reference definition]. | |||
| Here is a simple example: | Here is a simple example: | |||
| . | ```````````````````````````````` example | |||
| [foo][bar] | [foo][bar] | |||
| [bar]: /url "title" | [bar]: /url "title" | |||
| . | . | |||
| <p><a href="/url" title="title">foo</a></p> | <p><a href="/url" title="title">foo</a></p> | |||
| . | ```````````````````````````````` | |||
| The rules for the [link text] are the same as with | The rules for the [link text] are the same as with | |||
| [inline link]s. Thus: | [inline links]. Thus: | |||
| The link text may contain balanced brackets, but not unbalanced ones, | The link text may contain balanced brackets, but not unbalanced ones, | |||
| unless they are escaped: | unless they are escaped: | |||
| . | ```````````````````````````````` example | |||
| [link [foo [bar]]][ref] | [link [foo [bar]]][ref] | |||
| [ref]: /uri | [ref]: /uri | |||
| . | . | |||
| <p><a href="/uri">link [foo [bar]]</a></p> | <p><a href="/uri">link [foo [bar]]</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [link \[bar][ref] | [link \[bar][ref] | |||
| [ref]: /uri | [ref]: /uri | |||
| . | . | |||
| <p><a href="/uri">link [bar</a></p> | <p><a href="/uri">link [bar</a></p> | |||
| . | ```````````````````````````````` | |||
| The link text may contain inline content: | The link text may contain inline content: | |||
| . | ```````````````````````````````` example | |||
| [link *foo **bar** `#`*][ref] | [link *foo **bar** `#`*][ref] | |||
| [ref]: /uri | [ref]: /uri | |||
| . | . | |||
| <p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p> | <p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [][ref] | [][ref] | |||
| [ref]: /uri | [ref]: /uri | |||
| . | . | |||
| <p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p> | <p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p> | |||
| . | ```````````````````````````````` | |||
| However, links may not contain other links, at any level of nesting. | However, links may not contain other links, at any level of nesting. | |||
| . | ```````````````````````````````` example | |||
| [foo [bar](/uri)][ref] | [foo [bar](/uri)][ref] | |||
| [ref]: /uri | [ref]: /uri | |||
| . | . | |||
| <p>[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p> | <p>[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [foo *bar [baz][ref]*][ref] | [foo *bar [baz][ref]*][ref] | |||
| [ref]: /uri | [ref]: /uri | |||
| . | . | |||
| <p>[foo <em>bar <a href="/uri">baz</a></em>]<a href="/uri">ref</a></p> | <p>[foo <em>bar <a href="/uri">baz</a></em>]<a href="/uri">ref</a></p> | |||
| . | ```````````````````````````````` | |||
| (In the examples above, we have two [shortcut reference link]s | (In the examples above, we have two [shortcut reference links] | |||
| instead of one [full reference link].) | instead of one [full reference link].) | |||
| The following cases illustrate the precedence of link text grouping over | The following cases illustrate the precedence of link text grouping over | |||
| emphasis grouping: | emphasis grouping: | |||
| . | ```````````````````````````````` example | |||
| *[foo*][ref] | *[foo*][ref] | |||
| [ref]: /uri | [ref]: /uri | |||
| . | . | |||
| <p>*<a href="/uri">foo*</a></p> | <p>*<a href="/uri">foo*</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [foo *bar][ref] | [foo *bar][ref] | |||
| [ref]: /uri | [ref]: /uri | |||
| . | . | |||
| <p><a href="/uri">foo *bar</a></p> | <p><a href="/uri">foo *bar</a></p> | |||
| . | ```````````````````````````````` | |||
| These cases illustrate the precedence of HTML tags, code spans, | These cases illustrate the precedence of HTML tags, code spans, | |||
| and autolinks over link grouping: | and autolinks over link grouping: | |||
| . | ```````````````````````````````` example | |||
| [foo <bar attr="][ref]"> | [foo <bar attr="][ref]"> | |||
| [ref]: /uri | [ref]: /uri | |||
| . | . | |||
| <p>[foo <bar attr="][ref]"></p> | <p>[foo <bar attr="][ref]"></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [foo`][ref]` | [foo`][ref]` | |||
| [ref]: /uri | [ref]: /uri | |||
| . | . | |||
| <p>[foo<code>][ref]</code></p> | <p>[foo<code>][ref]</code></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [foo<http://example.com/?search=][ref]> | [foo<http://example.com/?search=][ref]> | |||
| [ref]: /uri | [ref]: /uri | |||
| . | . | |||
| <p>[foo<a href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?sea rch=][ref]</a></p> | <p>[foo<a href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?sea rch=][ref]</a></p> | |||
| . | ```````````````````````````````` | |||
| Matching is case-insensitive: | Matching is case-insensitive: | |||
| . | ```````````````````````````````` example | |||
| [foo][BaR] | [foo][BaR] | |||
| [bar]: /url "title" | [bar]: /url "title" | |||
| . | . | |||
| <p><a href="/url" title="title">foo</a></p> | <p><a href="/url" title="title">foo</a></p> | |||
| . | ```````````````````````````````` | |||
| Unicode case fold is used: | Unicode case fold is used: | |||
| . | ```````````````````````````````` example | |||
| [Толпой][Толпой] is a Russian word. | [Толпой][Толпой] is a Russian word. | |||
| [ТОЛПОЙ]: /url | [ТОЛПОЙ]: /url | |||
| . | . | |||
| <p><a href="/url">Толпой</a> is a Russian word.</p> | <p><a href="/url">Толпой</a> is a Russian word.</p> | |||
| . | ```````````````````````````````` | |||
| Consecutive internal [whitespace] is treated as one space for | Consecutive internal [whitespace] is treated as one space for | |||
| purposes of determining matching: | purposes of determining matching: | |||
| . | ```````````````````````````````` example | |||
| [Foo | [Foo | |||
| bar]: /url | bar]: /url | |||
| [Baz][Foo bar] | [Baz][Foo bar] | |||
| . | . | |||
| <p><a href="/url">Baz</a></p> | <p><a href="/url">Baz</a></p> | |||
| . | ```````````````````````````````` | |||
| No [whitespace] is allowed between the [link text] and the | No [whitespace] is allowed between the [link text] and the | |||
| [link label]: | [link label]: | |||
| . | ```````````````````````````````` example | |||
| [foo] [bar] | [foo] [bar] | |||
| [bar]: /url "title" | [bar]: /url "title" | |||
| . | . | |||
| <p>[foo] <a href="/url" title="title">bar</a></p> | <p>[foo] <a href="/url" title="title">bar</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [foo] | [foo] | |||
| [bar] | [bar] | |||
| [bar]: /url "title" | [bar]: /url "title" | |||
| . | . | |||
| <p>[foo] | <p>[foo] | |||
| <a href="/url" title="title">bar</a></p> | <a href="/url" title="title">bar</a></p> | |||
| . | ```````````````````````````````` | |||
| This is a departure from John Gruber's original Markdown syntax | This is a departure from John Gruber's original Markdown syntax | |||
| description, which explicitly allows whitespace between the link | description, which explicitly allows whitespace between the link | |||
| text and the link label. It brings reference links in line with | text and the link label. It brings reference links in line with | |||
| [inline link]s, which (according to both original Markdown and | [inline links], which (according to both original Markdown and | |||
| this spec) cannot have whitespace after the link text. More | this spec) cannot have whitespace after the link text. More | |||
| importantly, it prevents inadvertent capture of consecutive | importantly, it prevents inadvertent capture of consecutive | |||
| [shortcut reference link]s. If whitespace is allowed between the | [shortcut reference links]. If whitespace is allowed between the | |||
| link text and the link label, then in the following we will have | link text and the link label, then in the following we will have | |||
| a single reference link, not two shortcut reference links, as | a single reference link, not two shortcut reference links, as | |||
| intended: | intended: | |||
| ``` markdown | ``` markdown | |||
| [foo] | [foo] | |||
| [bar] | [bar] | |||
| [foo]: /url1 | [foo]: /url1 | |||
| [bar]: /url2 | [bar]: /url2 | |||
| ``` | ``` | |||
| (Note that [shortcut reference link]s were introduced by Gruber | (Note that [shortcut reference links] were introduced by Gruber | |||
| himself in a beta version of `Markdown.pl`, but never included | himself in a beta version of `Markdown.pl`, but never included | |||
| in the official syntax description. Without shortcut reference | in the official syntax description. Without shortcut reference | |||
| links, it is harmless to allow space between the link text and | links, it is harmless to allow space between the link text and | |||
| link label; but once shortcut references are introduced, it is | link label; but once shortcut references are introduced, it is | |||
| too dangerous to allow this, as it frequently leads to | too dangerous to allow this, as it frequently leads to | |||
| unintended results.) | unintended results.) | |||
| When there are multiple matching [link reference definition]s, | When there are multiple matching [link reference definitions], | |||
| the first is used: | the first is used: | |||
| . | ```````````````````````````````` example | |||
| [foo]: /url1 | [foo]: /url1 | |||
| [foo]: /url2 | [foo]: /url2 | |||
| [bar][foo] | [bar][foo] | |||
| . | . | |||
| <p><a href="/url1">bar</a></p> | <p><a href="/url1">bar</a></p> | |||
| . | ```````````````````````````````` | |||
| Note that matching is performed on normalized strings, not parsed | Note that matching is performed on normalized strings, not parsed | |||
| inline content. So the following does not match, even though the | inline content. So the following does not match, even though the | |||
| labels define equivalent inline content: | labels define equivalent inline content: | |||
| . | ```````````````````````````````` example | |||
| [bar][foo\!] | [bar][foo\!] | |||
| [foo!]: /url | [foo!]: /url | |||
| . | . | |||
| <p>[bar][foo!]</p> | <p>[bar][foo!]</p> | |||
| . | ```````````````````````````````` | |||
| [Link label]s cannot contain brackets, unless they are | [Link labels] cannot contain brackets, unless they are | |||
| backslash-escaped: | backslash-escaped: | |||
| . | ```````````````````````````````` example | |||
| [foo][ref[] | [foo][ref[] | |||
| [ref[]: /uri | [ref[]: /uri | |||
| . | . | |||
| <p>[foo][ref[]</p> | <p>[foo][ref[]</p> | |||
| <p>[ref[]: /uri</p> | <p>[ref[]: /uri</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [foo][ref[bar]] | [foo][ref[bar]] | |||
| [ref[bar]]: /uri | [ref[bar]]: /uri | |||
| . | . | |||
| <p>[foo][ref[bar]]</p> | <p>[foo][ref[bar]]</p> | |||
| <p>[ref[bar]]: /uri</p> | <p>[ref[bar]]: /uri</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [[[foo]]] | [[[foo]]] | |||
| [[[foo]]]: /url | [[[foo]]]: /url | |||
| . | . | |||
| <p>[[[foo]]]</p> | <p>[[[foo]]]</p> | |||
| <p>[[[foo]]]: /url</p> | <p>[[[foo]]]: /url</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [foo][ref\[] | [foo][ref\[] | |||
| [ref\[]: /uri | [ref\[]: /uri | |||
| . | . | |||
| <p><a href="/uri">foo</a></p> | <p><a href="/uri">foo</a></p> | |||
| . | ```````````````````````````````` | |||
| Note that in this example `]` is not backslash-escaped: | Note that in this example `]` is not backslash-escaped: | |||
| . | ```````````````````````````````` example | |||
| [bar\\]: /uri | [bar\\]: /uri | |||
| [bar\\] | [bar\\] | |||
| . | . | |||
| <p><a href="/uri">bar\</a></p> | <p><a href="/uri">bar\</a></p> | |||
| . | ```````````````````````````````` | |||
| A [link label] must contain at least one [non-whitespace character]: | A [link label] must contain at least one [non-whitespace character]: | |||
| . | ```````````````````````````````` example | |||
| [] | [] | |||
| []: /uri | []: /uri | |||
| . | . | |||
| <p>[]</p> | <p>[]</p> | |||
| <p>[]: /uri</p> | <p>[]: /uri</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [ | [ | |||
| ] | ] | |||
| [ | [ | |||
| ]: /uri | ]: /uri | |||
| . | . | |||
| <p>[ | <p>[ | |||
| ]</p> | ]</p> | |||
| <p>[ | <p>[ | |||
| ]: /uri</p> | ]: /uri</p> | |||
| . | ```````````````````````````````` | |||
| A [collapsed reference link](@collapsed-reference-link) | A [collapsed reference link](@) | |||
| consists of a [link label] that [matches] a | consists of a [link label] that [matches] a | |||
| [link reference definition] elsewhere in the | [link reference definition] elsewhere in the | |||
| document, followed by the string `[]`. | document, followed by the string `[]`. | |||
| The contents of the first link label are parsed as inlines, | The contents of the first link label are parsed as inlines, | |||
| which are used as the link's text. The link's URI and title are | which are used as the link's text. The link's URI and title are | |||
| provided by the matching reference link definition. Thus, | provided by the matching reference link definition. Thus, | |||
| `[foo][]` is equivalent to `[foo][foo]`. | `[foo][]` is equivalent to `[foo][foo]`. | |||
| . | ```````````````````````````````` example | |||
| [foo][] | [foo][] | |||
| [foo]: /url "title" | [foo]: /url "title" | |||
| . | . | |||
| <p><a href="/url" title="title">foo</a></p> | <p><a href="/url" title="title">foo</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [*foo* bar][] | [*foo* bar][] | |||
| [*foo* bar]: /url "title" | [*foo* bar]: /url "title" | |||
| . | . | |||
| <p><a href="/url" title="title"><em>foo</em> bar</a></p> | <p><a href="/url" title="title"><em>foo</em> bar</a></p> | |||
| . | ```````````````````````````````` | |||
| The link labels are case-insensitive: | The link labels are case-insensitive: | |||
| . | ```````````````````````````````` example | |||
| [Foo][] | [Foo][] | |||
| [foo]: /url "title" | [foo]: /url "title" | |||
| . | . | |||
| <p><a href="/url" title="title">Foo</a></p> | <p><a href="/url" title="title">Foo</a></p> | |||
| . | ```````````````````````````````` | |||
| As with full reference links, [whitespace] is not | As with full reference links, [whitespace] is not | |||
| allowed between the two sets of brackets: | allowed between the two sets of brackets: | |||
| . | ```````````````````````````````` example | |||
| [foo] | [foo] | |||
| [] | [] | |||
| [foo]: /url "title" | [foo]: /url "title" | |||
| . | . | |||
| <p><a href="/url" title="title">foo</a> | <p><a href="/url" title="title">foo</a> | |||
| []</p> | []</p> | |||
| . | ```````````````````````````````` | |||
| A [shortcut reference link](@shortcut-reference-link) | A [shortcut reference link](@) | |||
| consists of a [link label] that [matches] a | consists of a [link label] that [matches] a | |||
| [link reference definition] elsewhere in the | [link reference definition] elsewhere in the | |||
| document and is not followed by `[]` or a link label. | document and is not followed by `[]` or a link label. | |||
| The contents of the first link label are parsed as inlines, | The contents of the first link label are parsed as inlines, | |||
| which are used as the link's text. the link's URI and title | which are used as the link's text. the link's URI and title | |||
| are provided by the matching link reference definition. | are provided by the matching link reference definition. | |||
| Thus, `[foo]` is equivalent to `[foo][]`. | Thus, `[foo]` is equivalent to `[foo][]`. | |||
| . | ```````````````````````````````` example | |||
| [foo] | [foo] | |||
| [foo]: /url "title" | [foo]: /url "title" | |||
| . | . | |||
| <p><a href="/url" title="title">foo</a></p> | <p><a href="/url" title="title">foo</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [*foo* bar] | [*foo* bar] | |||
| [*foo* bar]: /url "title" | [*foo* bar]: /url "title" | |||
| . | . | |||
| <p><a href="/url" title="title"><em>foo</em> bar</a></p> | <p><a href="/url" title="title"><em>foo</em> bar</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [[*foo* bar]] | [[*foo* bar]] | |||
| [*foo* bar]: /url "title" | [*foo* bar]: /url "title" | |||
| . | . | |||
| <p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p> | <p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| [[bar [foo] | [[bar [foo] | |||
| [foo]: /url | [foo]: /url | |||
| . | . | |||
| <p>[[bar <a href="/url">foo</a></p> | <p>[[bar <a href="/url">foo</a></p> | |||
| . | ```````````````````````````````` | |||
| The link labels are case-insensitive: | The link labels are case-insensitive: | |||
| . | ```````````````````````````````` example | |||
| [Foo] | [Foo] | |||
| [foo]: /url "title" | [foo]: /url "title" | |||
| . | . | |||
| <p><a href="/url" title="title">Foo</a></p> | <p><a href="/url" title="title">Foo</a></p> | |||
| . | ```````````````````````````````` | |||
| A space after the link text should be preserved: | A space after the link text should be preserved: | |||
| . | ```````````````````````````````` example | |||
| [foo] bar | [foo] bar | |||
| [foo]: /url | [foo]: /url | |||
| . | . | |||
| <p><a href="/url">foo</a> bar</p> | <p><a href="/url">foo</a> bar</p> | |||
| . | ```````````````````````````````` | |||
| If you just want bracketed text, you can backslash-escape the | If you just want bracketed text, you can backslash-escape the | |||
| opening bracket to avoid links: | opening bracket to avoid links: | |||
| . | ```````````````````````````````` example | |||
| \[foo] | \[foo] | |||
| [foo]: /url "title" | [foo]: /url "title" | |||
| . | . | |||
| <p>[foo]</p> | <p>[foo]</p> | |||
| . | ```````````````````````````````` | |||
| Note that this is a link, because a link label ends with the first | Note that this is a link, because a link label ends with the first | |||
| following closing bracket: | following closing bracket: | |||
| . | ```````````````````````````````` example | |||
| [foo*]: /url | [foo*]: /url | |||
| *[foo*] | *[foo*] | |||
| . | . | |||
| <p>*<a href="/url">foo*</a></p> | <p>*<a href="/url">foo*</a></p> | |||
| . | ```````````````````````````````` | |||
| Full references take precedence over shortcut references: | Full references take precedence over shortcut references: | |||
| . | ```````````````````````````````` example | |||
| [foo][bar] | [foo][bar] | |||
| [foo]: /url1 | [foo]: /url1 | |||
| [bar]: /url2 | [bar]: /url2 | |||
| . | . | |||
| <p><a href="/url2">foo</a></p> | <p><a href="/url2">foo</a></p> | |||
| . | ```````````````````````````````` | |||
| In the following case `[bar][baz]` is parsed as a reference, | In the following case `[bar][baz]` is parsed as a reference, | |||
| `[foo]` as normal text: | `[foo]` as normal text: | |||
| . | ```````````````````````````````` example | |||
| [foo][bar][baz] | [foo][bar][baz] | |||
| [baz]: /url | [baz]: /url | |||
| . | . | |||
| <p>[foo]<a href="/url">bar</a></p> | <p>[foo]<a href="/url">bar</a></p> | |||
| . | ```````````````````````````````` | |||
| Here, though, `[foo][bar]` is parsed as a reference, since | Here, though, `[foo][bar]` is parsed as a reference, since | |||
| `[bar]` is defined: | `[bar]` is defined: | |||
| . | ```````````````````````````````` example | |||
| [foo][bar][baz] | [foo][bar][baz] | |||
| [baz]: /url1 | [baz]: /url1 | |||
| [bar]: /url2 | [bar]: /url2 | |||
| . | . | |||
| <p><a href="/url2">foo</a><a href="/url1">baz</a></p> | <p><a href="/url2">foo</a><a href="/url1">baz</a></p> | |||
| . | ```````````````````````````````` | |||
| Here `[foo]` is not parsed as a shortcut reference, because it | Here `[foo]` is not parsed as a shortcut reference, because it | |||
| is followed by a link label (even though `[bar]` is not defined): | is followed by a link label (even though `[bar]` is not defined): | |||
| . | ```````````````````````````````` example | |||
| [foo][bar][baz] | [foo][bar][baz] | |||
| [baz]: /url1 | [baz]: /url1 | |||
| [foo]: /url2 | [foo]: /url2 | |||
| . | . | |||
| <p>[foo]<a href="/url1">bar</a></p> | <p>[foo]<a href="/url1">bar</a></p> | |||
| . | ```````````````````````````````` | |||
| ## Images | ## Images | |||
| Syntax for images is like the syntax for links, with one | Syntax for images is like the syntax for links, with one | |||
| difference. Instead of [link text], we have an | difference. Instead of [link text], we have an | |||
| [image description](@image-description). The rules for this are the | [image description](@). The rules for this are the | |||
| same as for [link text], except that (a) an | same as for [link text], except that (a) an | |||
| image description starts with ` |  | |||
| . | . | |||
| <p><img src="/url" alt="foo" title="title" /></p> | <p><img src="/url" alt="foo" title="title" /></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ![foo *bar*] | ![foo *bar*] | |||
| [foo *bar*]: train.jpg "train & tracks" | [foo *bar*]: train.jpg "train & tracks" | |||
| . | . | |||
| <p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p> | <p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ](/url2) | ](/url2) | |||
| . | . | |||
| <p><img src="/url2" alt="foo bar" /></p> | <p><img src="/url2" alt="foo bar" /></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ](/url2) | ](/url2) | |||
| . | . | |||
| <p><img src="/url2" alt="foo bar" /></p> | <p><img src="/url2" alt="foo bar" /></p> | |||
| . | ```````````````````````````````` | |||
| Though this spec is concerned with parsing, not rendering, it is | Though this spec is concerned with parsing, not rendering, it is | |||
| recommended that in rendering to HTML, only the plain string content | recommended that in rendering to HTML, only the plain string content | |||
| of the [image description] be used. Note that in | of the [image description] be used. Note that in | |||
| the above example, the alt attribute's value is `foo bar`, not `foo | the above example, the alt attribute's value is `foo bar`, not `foo | |||
| [bar](/url)` or `foo <a href="/url">bar</a>`. Only the plain string | [bar](/url)` or `foo <a href="/url">bar</a>`. Only the plain string | |||
| content is rendered, without formatting. | content is rendered, without formatting. | |||
| . | ```````````````````````````````` example | |||
| ![foo *bar*][] | ![foo *bar*][] | |||
| [foo *bar*]: train.jpg "train & tracks" | [foo *bar*]: train.jpg "train & tracks" | |||
| . | . | |||
| <p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p> | <p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ![foo *bar*][foobar] | ![foo *bar*][foobar] | |||
| [FOOBAR]: train.jpg "train & tracks" | [FOOBAR]: train.jpg "train & tracks" | |||
| . | . | |||
| <p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p> | <p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
|  |  | |||
| . | . | |||
| <p><img src="train.jpg" alt="foo" /></p> | <p><img src="train.jpg" alt="foo" /></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| My  | My  | |||
| . | . | |||
| <p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p> | <p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
|  |  | |||
| . | . | |||
| <p><img src="url" alt="foo" /></p> | <p><img src="url" alt="foo" /></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
|  |  | |||
| . | . | |||
| <p><img src="/url" alt="" /></p> | <p><img src="/url" alt="" /></p> | |||
| . | ```````````````````````````````` | |||
| Reference-style: | Reference-style: | |||
| . | ```````````````````````````````` example | |||
| ![foo][bar] | ![foo][bar] | |||
| [bar]: /url | [bar]: /url | |||
| . | . | |||
| <p><img src="/url" alt="foo" /></p> | <p><img src="/url" alt="foo" /></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ![foo][bar] | ![foo][bar] | |||
| [BAR]: /url | [BAR]: /url | |||
| . | . | |||
| <p><img src="/url" alt="foo" /></p> | <p><img src="/url" alt="foo" /></p> | |||
| . | ```````````````````````````````` | |||
| Collapsed: | Collapsed: | |||
| . | ```````````````````````````````` example | |||
| ![foo][] | ![foo][] | |||
| [foo]: /url "title" | [foo]: /url "title" | |||
| . | . | |||
| <p><img src="/url" alt="foo" title="title" /></p> | <p><img src="/url" alt="foo" title="title" /></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ![*foo* bar][] | ![*foo* bar][] | |||
| [*foo* bar]: /url "title" | [*foo* bar]: /url "title" | |||
| . | . | |||
| <p><img src="/url" alt="foo bar" title="title" /></p> | <p><img src="/url" alt="foo bar" title="title" /></p> | |||
| . | ```````````````````````````````` | |||
| The labels are case-insensitive: | The labels are case-insensitive: | |||
| . | ```````````````````````````````` example | |||
| ![Foo][] | ![Foo][] | |||
| [foo]: /url "title" | [foo]: /url "title" | |||
| . | . | |||
| <p><img src="/url" alt="Foo" title="title" /></p> | <p><img src="/url" alt="Foo" title="title" /></p> | |||
| . | ```````````````````````````````` | |||
| As with reference links, [whitespace] is not allowed | As with reference links, [whitespace] is not allowed | |||
| between the two sets of brackets: | between the two sets of brackets: | |||
| . | ```````````````````````````````` example | |||
| ![foo] | ![foo] | |||
| [] | [] | |||
| [foo]: /url "title" | [foo]: /url "title" | |||
| . | . | |||
| <p><img src="/url" alt="foo" title="title" /> | <p><img src="/url" alt="foo" title="title" /> | |||
| []</p> | []</p> | |||
| . | ```````````````````````````````` | |||
| Shortcut: | Shortcut: | |||
| . | ```````````````````````````````` example | |||
| ![foo] | ![foo] | |||
| [foo]: /url "title" | [foo]: /url "title" | |||
| . | . | |||
| <p><img src="/url" alt="foo" title="title" /></p> | <p><img src="/url" alt="foo" title="title" /></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ![*foo* bar] | ![*foo* bar] | |||
| [*foo* bar]: /url "title" | [*foo* bar]: /url "title" | |||
| . | . | |||
| <p><img src="/url" alt="foo bar" title="title" /></p> | <p><img src="/url" alt="foo bar" title="title" /></p> | |||
| . | ```````````````````````````````` | |||
| Note that link labels cannot contain unescaped brackets: | Note that link labels cannot contain unescaped brackets: | |||
| . | ```````````````````````````````` example | |||
| ![[foo]] | ![[foo]] | |||
| [[foo]]: /url "title" | [[foo]]: /url "title" | |||
| . | . | |||
| <p>![[foo]]</p> | <p>![[foo]]</p> | |||
| <p>[[foo]]: /url "title"</p> | <p>[[foo]]: /url "title"</p> | |||
| . | ```````````````````````````````` | |||
| The link labels are case-insensitive: | The link labels are case-insensitive: | |||
| . | ```````````````````````````````` example | |||
| ![Foo] | ![Foo] | |||
| [foo]: /url "title" | [foo]: /url "title" | |||
| . | . | |||
| <p><img src="/url" alt="Foo" title="title" /></p> | <p><img src="/url" alt="Foo" title="title" /></p> | |||
| . | ```````````````````````````````` | |||
| If you just want bracketed text, you can backslash-escape the | If you just want bracketed text, you can backslash-escape the | |||
| opening `!` and `[`: | opening `!` and `[`: | |||
| . | ```````````````````````````````` example | |||
| \!\[foo] | \!\[foo] | |||
| [foo]: /url "title" | [foo]: /url "title" | |||
| . | . | |||
| <p>![foo]</p> | <p>![foo]</p> | |||
| . | ```````````````````````````````` | |||
| If you want a link after a literal `!`, backslash-escape the | If you want a link after a literal `!`, backslash-escape the | |||
| `!`: | `!`: | |||
| . | ```````````````````````````````` example | |||
| \![foo] | \![foo] | |||
| [foo]: /url "title" | [foo]: /url "title" | |||
| . | . | |||
| <p>!<a href="/url" title="title">foo</a></p> | <p>!<a href="/url" title="title">foo</a></p> | |||
| . | ```````````````````````````````` | |||
| ## Autolinks | ## Autolinks | |||
| [Autolink](@autolink)s are absolute URIs and email addresses inside | [Autolink](@)s are absolute URIs and email addresses inside | |||
| `<` and `>`. They are parsed as links, with the URL or email address | `<` and `>`. They are parsed as links, with the URL or email address | |||
| as the link label. | as the link label. | |||
| A [URI autolink](@uri-autolink) consists of `<`, followed by an | A [URI autolink](@) consists of `<`, followed by an | |||
| [absolute URI] not containing `<`, followed by `>`. It is parsed as | [absolute URI] not containing `<`, followed by `>`. It is parsed as | |||
| a link to the URI, with the URI as the link's label. | a link to the URI, with the URI as the link's label. | |||
| An [absolute URI](@absolute-uri), | An [absolute URI](@), | |||
| for these purposes, consists of a [scheme] followed by a colon (`:`) | for these purposes, consists of a [scheme] followed by a colon (`:`) | |||
| followed by zero or more characters other than ASCII | followed by zero or more characters other than ASCII | |||
| [whitespace] and control characters, `<`, and `>`. If | [whitespace] and control characters, `<`, and `>`. If | |||
| the URI includes these characters, you must use percent-encoding | the URI includes these characters, they must be percent-encoded | |||
| (e.g. `%20` for a space). | (e.g. `%20` for a space). | |||
| The following [schemes](@scheme) | For purposes of this spec, a [scheme](@) is any sequence | |||
| are recognized (case-insensitive): | of 2--32 characters beginning with an ASCII letter and followed | |||
| `coap`, `doi`, `javascript`, `aaa`, `aaas`, `about`, `acap`, `cap`, | by any combination of ASCII letters, digits, or the symbols plus | |||
| `cid`, `crid`, `data`, `dav`, `dict`, `dns`, `file`, `ftp`, `geo`, `go`, | ("+"), period ("."), or hyphen ("-"). | |||
| `gopher`, `h323`, `http`, `https`, `iax`, `icap`, `im`, `imap`, `info`, | ||||
| `ipp`, `iris`, `iris.beep`, `iris.xpc`, `iris.xpcs`, `iris.lwz`, `ldap`, | ||||
| `mailto`, `mid`, `msrp`, `msrps`, `mtqp`, `mupdate`, `news`, `nfs`, | ||||
| `ni`, `nih`, `nntp`, `opaquelocktoken`, `pop`, `pres`, `rtsp`, | ||||
| `service`, `session`, `shttp`, `sieve`, `sip`, `sips`, `sms`, `snmp`,` | ||||
| soap.beep`, `soap.beeps`, `tag`, `tel`, `telnet`, `tftp`, `thismessage`, | ||||
| `tn3270`, `tip`, `tv`, `urn`, `vemmi`, `ws`, `wss`, `xcon`, | ||||
| `xcon-userid`, `xmlrpc.beep`, `xmlrpc.beeps`, `xmpp`, `z39.50r`, | ||||
| `z39.50s`, `adiumxtra`, `afp`, `afs`, `aim`, `apt`,` attachment`, `aw`, | ||||
| `beshare`, `bitcoin`, `bolo`, `callto`, `chrome`,` chrome-extension`, | ||||
| `com-eventbrite-attendee`, `content`, `cvs`,` dlna-playsingle`, | ||||
| `dlna-playcontainer`, `dtn`, `dvb`, `ed2k`, `facetime`, `feed`, | ||||
| `finger`, `fish`, `gg`, `git`, `gizmoproject`, `gtalk`, `hcp`, `icon`, | ||||
| `ipn`, `irc`, `irc6`, `ircs`, `itms`, `jar`, `jms`, `keyparc`, `lastfm`, | ||||
| `ldaps`, `magnet`, `maps`, `market`,` message`, `mms`, `ms-help`, | ||||
| `msnim`, `mumble`, `mvn`, `notes`, `oid`, `palm`, `paparazzi`, | ||||
| `platform`, `proxy`, `psyc`, `query`, `res`, `resource`, `rmi`, `rsync`, | ||||
| `rtmp`, `secondlife`, `sftp`, `sgn`, `skype`, `smb`, `soldat`, | ||||
| `spotify`, `ssh`, `steam`, `svn`, `teamspeak`, `things`, `udp`, | ||||
| `unreal`, `ut2004`, `ventrilo`, `view-source`, `webcal`, `wtai`, | ||||
| `wyciwyg`, `xfire`, `xri`, `ymsgr`. | ||||
| Here are some valid autolinks: | Here are some valid autolinks: | |||
| . | ```````````````````````````````` example | |||
| <http://foo.bar.baz> | <http://foo.bar.baz> | |||
| . | . | |||
| <p><a href="http://foo.bar.baz">http://foo.bar.baz</a></p> | <p><a href="http://foo.bar.baz">http://foo.bar.baz</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| <http://foo.bar.baz/test?q=hello&id=22&boolean> | <http://foo.bar.baz/test?q=hello&id=22&boolean> | |||
| . | . | |||
| <p><a href="http://foo.bar.baz/test?q=hello&id=22&boolean">http://foo.ba r.baz/test?q=hello&id=22&boolean</a></p> | <p><a href="http://foo.bar.baz/test?q=hello&id=22&boolean">http://foo.ba r.baz/test?q=hello&id=22&boolean</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| <irc://foo.bar:2233/baz> | <irc://foo.bar:2233/baz> | |||
| . | . | |||
| <p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p> | <p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p> | |||
| . | ```````````````````````````````` | |||
| Uppercase is also fine: | Uppercase is also fine: | |||
| . | ```````````````````````````````` example | |||
| <MAILTO:FOO@BAR.BAZ> | <MAILTO:FOO@BAR.BAZ> | |||
| . | . | |||
| <p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p> | <p><a href="MAILTO:FOO@BAR.BAZ">MAILTO:FOO@BAR.BAZ</a></p> | |||
| ```````````````````````````````` | ||||
| Note that many strings that count as [absolute URIs] for | ||||
| purposes of this spec are not valid URIs, because their | ||||
| schemes are not registered or because of other problems | ||||
| with their syntax: | ||||
| ```````````````````````````````` example | ||||
| <a+b+c:d> | ||||
| . | . | |||
| <p><a href="a+b+c:d">a+b+c:d</a></p> | ||||
| ```````````````````````````````` | ||||
| Spaces are not allowed in autolinks: | ```````````````````````````````` example | |||
| <made-up-scheme://foo,bar> | ||||
| . | ||||
| <p><a href="made-up-scheme://foo,bar">made-up-scheme://foo,bar</a></p> | ||||
| ```````````````````````````````` | ||||
| ```````````````````````````````` example | ||||
| <http://../> | ||||
| . | . | |||
| <p><a href="http://../">http://../</a></p> | ||||
| ```````````````````````````````` | ||||
| ```````````````````````````````` example | ||||
| <localhost:5001/foo> | ||||
| . | ||||
| <p><a href="localhost:5001/foo">localhost:5001/foo</a></p> | ||||
| ```````````````````````````````` | ||||
| Spaces are not allowed in autolinks: | ||||
| ```````````````````````````````` example | ||||
| <http://foo.bar/baz bim> | <http://foo.bar/baz bim> | |||
| . | . | |||
| <p><http://foo.bar/baz bim></p> | <p><http://foo.bar/baz bim></p> | |||
| . | ```````````````````````````````` | |||
| Backslash-escapes do not work inside autolinks: | Backslash-escapes do not work inside autolinks: | |||
| . | ```````````````````````````````` example | |||
| <http://example.com/\[\> | <http://example.com/\[\> | |||
| . | . | |||
| <p><a href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p> | <p><a href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p> | |||
| . | ```````````````````````````````` | |||
| An [email autolink](@email-autolink) | An [email autolink](@) | |||
| consists of `<`, followed by an [email address], | consists of `<`, followed by an [email address], | |||
| followed by `>`. The link's label is the email address, | followed by `>`. The link's label is the email address, | |||
| and the URL is `mailto:` followed by the email address. | and the URL is `mailto:` followed by the email address. | |||
| An [email address](@email-address), | An [email address](@), | |||
| for these purposes, is anything that matches | for these purposes, is anything that matches | |||
| the [non-normative regex from the HTML5 | the [non-normative regex from the HTML5 | |||
| spec](https://html.spec.whatwg.org/multipage/forms.html#e-mail-state-(type=email )): | spec](https://html.spec.whatwg.org/multipage/forms.html#e-mail-state-(type=email )): | |||
| /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0- 9])? | /^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0- 9])? | |||
| (?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/ | (?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/ | |||
| Examples of email autolinks: | Examples of email autolinks: | |||
| . | ```````````````````````````````` example | |||
| <foo@bar.example.com> | <foo@bar.example.com> | |||
| . | . | |||
| <p><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p> | <p><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| <foo+special@Bar.baz-bar0.com> | <foo+special@Bar.baz-bar0.com> | |||
| . | . | |||
| <p><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a ></p> | <p><a href="mailto:foo+special@Bar.baz-bar0.com">foo+special@Bar.baz-bar0.com</a ></p> | |||
| . | ```````````````````````````````` | |||
| Backslash-escapes do not work inside email autolinks: | Backslash-escapes do not work inside email autolinks: | |||
| . | ```````````````````````````````` example | |||
| <foo\+@bar.example.com> | <foo\+@bar.example.com> | |||
| . | . | |||
| <p><foo+@bar.example.com></p> | <p><foo+@bar.example.com></p> | |||
| . | ```````````````````````````````` | |||
| These are not autolinks: | These are not autolinks: | |||
| . | ```````````````````````````````` example | |||
| <> | <> | |||
| . | . | |||
| <p><></p> | <p><></p> | |||
| . | ```````````````````````````````` | |||
| . | ||||
| <heck://bing.bong> | ||||
| . | ||||
| <p><heck://bing.bong></p> | ||||
| . | ||||
| . | ```````````````````````````````` example | |||
| < http://foo.bar > | < http://foo.bar > | |||
| . | . | |||
| <p>< http://foo.bar ></p> | <p>< http://foo.bar ></p> | |||
| . | ```````````````````````````````` | |||
| ```````````````````````````````` example | ||||
| <m:abc> | ||||
| . | . | |||
| <p><m:abc></p> | ||||
| ```````````````````````````````` | ||||
| ```````````````````````````````` example | ||||
| <foo.bar.baz> | <foo.bar.baz> | |||
| . | . | |||
| <p><foo.bar.baz></p> | <p><foo.bar.baz></p> | |||
| . | ```````````````````````````````` | |||
| . | ||||
| <localhost:5001/foo> | ||||
| . | ||||
| <p><localhost:5001/foo></p> | ||||
| . | ||||
| . | ```````````````````````````````` example | |||
| http://example.com | http://example.com | |||
| . | . | |||
| <p>http://example.com</p> | <p>http://example.com</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo@bar.example.com | foo@bar.example.com | |||
| . | . | |||
| <p>foo@bar.example.com</p> | <p>foo@bar.example.com</p> | |||
| . | ```````````````````````````````` | |||
| ## Raw HTML | ## Raw HTML | |||
| Text between `<` and `>` that looks like an HTML tag is parsed as a | Text between `<` and `>` that looks like an HTML tag is parsed as a | |||
| raw HTML tag and will be rendered in HTML without escaping. | raw HTML tag and will be rendered in HTML without escaping. | |||
| Tag and attribute names are not limited to current HTML tags, | Tag and attribute names are not limited to current HTML tags, | |||
| so custom tags (and even, say, DocBook tags) may be used. | so custom tags (and even, say, DocBook tags) may be used. | |||
| Here is the grammar for tags: | Here is the grammar for tags: | |||
| A [tag name](@tag-name) consists of an ASCII letter | A [tag name](@) consists of an ASCII letter | |||
| followed by zero or more ASCII letters, digits, or | followed by zero or more ASCII letters, digits, or | |||
| hyphens (`-`). | hyphens (`-`). | |||
| An [attribute](@attribute) consists of [whitespace], | An [attribute](@) consists of [whitespace], | |||
| an [attribute name], and an optional | an [attribute name], and an optional | |||
| [attribute value specification]. | [attribute value specification]. | |||
| An [attribute name](@attribute-name) | An [attribute name](@) | |||
| consists of an ASCII letter, `_`, or `:`, followed by zero or more ASCII | consists of an ASCII letter, `_`, or `:`, followed by zero or more ASCII | |||
| letters, digits, `_`, `.`, `:`, or `-`. (Note: This is the XML | letters, digits, `_`, `.`, `:`, or `-`. (Note: This is the XML | |||
| specification restricted to ASCII. HTML5 is laxer.) | specification restricted to ASCII. HTML5 is laxer.) | |||
| An [attribute value specification](@attribute-value-specification) | An [attribute value specification](@) | |||
| consists of optional [whitespace], | consists of optional [whitespace], | |||
| a `=` character, optional [whitespace], and an [attribute | a `=` character, optional [whitespace], and an [attribute | |||
| value]. | value]. | |||
| An [attribute value](@attribute-value) | An [attribute value](@) | |||
| consists of an [unquoted attribute value], | consists of an [unquoted attribute value], | |||
| a [single-quoted attribute value], or a [double-quoted attribute value]. | a [single-quoted attribute value], or a [double-quoted attribute value]. | |||
| An [unquoted attribute value](@unquoted-attribute-value) | An [unquoted attribute value](@) | |||
| is a nonempty string of characters not | is a nonempty string of characters not | |||
| including spaces, `"`, `'`, `=`, `<`, `>`, or `` ` ``. | including spaces, `"`, `'`, `=`, `<`, `>`, or `` ` ``. | |||
| A [single-quoted attribute value](@single-quoted-attribute-value) | A [single-quoted attribute value](@) | |||
| consists of `'`, zero or more | consists of `'`, zero or more | |||
| characters not including `'`, and a final `'`. | characters not including `'`, and a final `'`. | |||
| A [double-quoted attribute value](@double-quoted-attribute-value) | A [double-quoted attribute value](@) | |||
| consists of `"`, zero or more | consists of `"`, zero or more | |||
| characters not including `"`, and a final `"`. | characters not including `"`, and a final `"`. | |||
| An [open tag](@open-tag) consists of a `<` character, a [tag name], | An [open tag](@) consists of a `<` character, a [tag name], | |||
| zero or more [attribute]s, optional [whitespace], an optional `/` | zero or more [attributes], optional [whitespace], an optional `/` | |||
| character, and a `>` character. | character, and a `>` character. | |||
| A [closing tag](@closing-tag) consists of the string `</`, a | A [closing tag](@) consists of the string `</`, a | |||
| [tag name], optional [whitespace], and the character `>`. | [tag name], optional [whitespace], and the character `>`. | |||
| An [HTML comment](@html-comment) consists of `<!--` + *text* + `-->`, | An [HTML comment](@) consists of `<!--` + *text* + `-->`, | |||
| where *text* does not start with `>` or `->`, does not end with `-`, | where *text* does not start with `>` or `->`, does not end with `-`, | |||
| and does not contain `--`. (See the | and does not contain `--`. (See the | |||
| [HTML5 spec](http://www.w3.org/TR/html5/syntax.html#comments).) | [HTML5 spec](http://www.w3.org/TR/html5/syntax.html#comments).) | |||
| A [processing instruction](@processing-instruction) | A [processing instruction](@) | |||
| consists of the string `<?`, a string | consists of the string `<?`, a string | |||
| of characters not including the string `?>`, and the string | of characters not including the string `?>`, and the string | |||
| `?>`. | `?>`. | |||
| A [declaration](@declaration) consists of the | A [declaration](@) consists of the | |||
| string `<!`, a name consisting of one or more uppercase ASCII letters, | string `<!`, a name consisting of one or more uppercase ASCII letters, | |||
| [whitespace], a string of characters not including the | [whitespace], a string of characters not including the | |||
| character `>`, and the character `>`. | character `>`, and the character `>`. | |||
| A [CDATA section](@cdata-section) consists of | A [CDATA section](@) consists of | |||
| the string `<![CDATA[`, a string of characters not including the string | the string `<![CDATA[`, a string of characters not including the string | |||
| `]]>`, and the string `]]>`. | `]]>`, and the string `]]>`. | |||
| An [HTML tag](@html-tag) consists of an [open tag], a [closing tag], | An [HTML tag](@) consists of an [open tag], a [closing tag], | |||
| an [HTML comment], a [processing instruction], a [declaration], | an [HTML comment], a [processing instruction], a [declaration], | |||
| or a [CDATA section]. | or a [CDATA section]. | |||
| Here are some simple open tags: | Here are some simple open tags: | |||
| . | ```````````````````````````````` example | |||
| <a><bab><c2c> | <a><bab><c2c> | |||
| . | . | |||
| <p><a><bab><c2c></p> | <p><a><bab><c2c></p> | |||
| . | ```````````````````````````````` | |||
| Empty elements: | Empty elements: | |||
| . | ```````````````````````````````` example | |||
| <a/><b2/> | <a/><b2/> | |||
| . | . | |||
| <p><a/><b2/></p> | <p><a/><b2/></p> | |||
| . | ```````````````````````````````` | |||
| [Whitespace] is allowed: | [Whitespace] is allowed: | |||
| . | ```````````````````````````````` example | |||
| <a /><b2 | <a /><b2 | |||
| data="foo" > | data="foo" > | |||
| . | . | |||
| <p><a /><b2 | <p><a /><b2 | |||
| data="foo" ></p> | data="foo" ></p> | |||
| . | ```````````````````````````````` | |||
| With attributes: | With attributes: | |||
| . | ```````````````````````````````` example | |||
| <a foo="bar" bam = 'baz <em>"</em>' | <a foo="bar" bam = 'baz <em>"</em>' | |||
| _boolean zoop:33=zoop:33 /> | _boolean zoop:33=zoop:33 /> | |||
| . | . | |||
| <p><a foo="bar" bam = 'baz <em>"</em>' | <p><a foo="bar" bam = 'baz <em>"</em>' | |||
| _boolean zoop:33=zoop:33 /></p> | _boolean zoop:33=zoop:33 /></p> | |||
| . | ```````````````````````````````` | |||
| Custom tag names can be used: | Custom tag names can be used: | |||
| . | ```````````````````````````````` example | |||
| Foo <responsive-image src="foo.jpg" /> | Foo <responsive-image src="foo.jpg" /> | |||
| . | . | |||
| <p>Foo <responsive-image src="foo.jpg" /></p> | <p>Foo <responsive-image src="foo.jpg" /></p> | |||
| . | ```````````````````````````````` | |||
| Illegal tag names, not parsed as HTML: | Illegal tag names, not parsed as HTML: | |||
| . | ```````````````````````````````` example | |||
| <33> <__> | <33> <__> | |||
| . | . | |||
| <p><33> <__></p> | <p><33> <__></p> | |||
| . | ```````````````````````````````` | |||
| Illegal attribute names: | Illegal attribute names: | |||
| . | ```````````````````````````````` example | |||
| <a h*#ref="hi"> | <a h*#ref="hi"> | |||
| . | . | |||
| <p><a h*#ref="hi"></p> | <p><a h*#ref="hi"></p> | |||
| . | ```````````````````````````````` | |||
| Illegal attribute values: | Illegal attribute values: | |||
| . | ```````````````````````````````` example | |||
| <a href="hi'> <a href=hi'> | <a href="hi'> <a href=hi'> | |||
| . | . | |||
| <p><a href="hi'> <a href=hi'></p> | <p><a href="hi'> <a href=hi'></p> | |||
| . | ```````````````````````````````` | |||
| Illegal [whitespace]: | Illegal [whitespace]: | |||
| . | ```````````````````````````````` example | |||
| < a>< | < a>< | |||
| foo><bar/ > | foo><bar/ > | |||
| . | . | |||
| <p>< a>< | <p>< a>< | |||
| foo><bar/ ></p> | foo><bar/ ></p> | |||
| . | ```````````````````````````````` | |||
| Missing [whitespace]: | Missing [whitespace]: | |||
| . | ```````````````````````````````` example | |||
| <a href='bar'title=title> | <a href='bar'title=title> | |||
| . | . | |||
| <p><a href='bar'title=title></p> | <p><a href='bar'title=title></p> | |||
| . | ```````````````````````````````` | |||
| Closing tags: | Closing tags: | |||
| . | ```````````````````````````````` example | |||
| </a></foo > | </a></foo > | |||
| . | . | |||
| <p></a></foo ></p> | <p></a></foo ></p> | |||
| . | ```````````````````````````````` | |||
| Illegal attributes in closing tag: | Illegal attributes in closing tag: | |||
| . | ```````````````````````````````` example | |||
| </a href="foo"> | </a href="foo"> | |||
| . | . | |||
| <p></a href="foo"></p> | <p></a href="foo"></p> | |||
| . | ```````````````````````````````` | |||
| Comments: | Comments: | |||
| . | ```````````````````````````````` example | |||
| foo <!-- this is a | foo <!-- this is a | |||
| comment - with hyphen --> | comment - with hyphen --> | |||
| . | . | |||
| <p>foo <!-- this is a | <p>foo <!-- this is a | |||
| comment - with hyphen --></p> | comment - with hyphen --></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo <!-- not a comment -- two hyphens --> | foo <!-- not a comment -- two hyphens --> | |||
| . | . | |||
| <p>foo <!-- not a comment -- two hyphens --></p> | <p>foo <!-- not a comment -- two hyphens --></p> | |||
| . | ```````````````````````````````` | |||
| Not comments: | Not comments: | |||
| . | ```````````````````````````````` example | |||
| foo <!--> foo --> | foo <!--> foo --> | |||
| foo <!-- foo---> | foo <!-- foo---> | |||
| . | . | |||
| <p>foo <!--> foo --></p> | <p>foo <!--> foo --></p> | |||
| <p>foo <!-- foo---></p> | <p>foo <!-- foo---></p> | |||
| . | ```````````````````````````````` | |||
| Processing instructions: | Processing instructions: | |||
| . | ```````````````````````````````` example | |||
| foo <?php echo $a; ?> | foo <?php echo $a; ?> | |||
| . | . | |||
| <p>foo <?php echo $a; ?></p> | <p>foo <?php echo $a; ?></p> | |||
| . | ```````````````````````````````` | |||
| Declarations: | Declarations: | |||
| . | ```````````````````````````````` example | |||
| foo <!ELEMENT br EMPTY> | foo <!ELEMENT br EMPTY> | |||
| . | . | |||
| <p>foo <!ELEMENT br EMPTY></p> | <p>foo <!ELEMENT br EMPTY></p> | |||
| . | ```````````````````````````````` | |||
| CDATA sections: | CDATA sections: | |||
| . | ```````````````````````````````` example | |||
| foo <![CDATA[>&<]]> | foo <![CDATA[>&<]]> | |||
| . | . | |||
| <p>foo <![CDATA[>&<]]></p> | <p>foo <![CDATA[>&<]]></p> | |||
| . | ```````````````````````````````` | |||
| Entity and numeric character references are preserved in HTML | Entity and numeric character references are preserved in HTML | |||
| attributes: | attributes: | |||
| . | ```````````````````````````````` example | |||
| foo <a href="ö"> | foo <a href="ö"> | |||
| . | . | |||
| <p>foo <a href="ö"></p> | <p>foo <a href="ö"></p> | |||
| . | ```````````````````````````````` | |||
| Backslash escapes do not work in HTML attributes: | Backslash escapes do not work in HTML attributes: | |||
| . | ```````````````````````````````` example | |||
| foo <a href="\*"> | foo <a href="\*"> | |||
| . | . | |||
| <p>foo <a href="\*"></p> | <p>foo <a href="\*"></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| <a href="\""> | <a href="\""> | |||
| . | . | |||
| <p><a href="""></p> | <p><a href="""></p> | |||
| . | ```````````````````````````````` | |||
| ## Hard line breaks | ## Hard line breaks | |||
| A line break (not in a code span or HTML tag) that is preceded | A line break (not in a code span or HTML tag) that is preceded | |||
| by two or more spaces and does not occur at the end of a block | by two or more spaces and does not occur at the end of a block | |||
| is parsed as a [hard line break](@hard-line-break) (rendered | is parsed as a [hard line break](@) (rendered | |||
| in HTML as a `<br />` tag): | in HTML as a `<br />` tag): | |||
| . | ```````````````````````````````` example | |||
| foo | foo | |||
| baz | baz | |||
| . | . | |||
| <p>foo<br /> | <p>foo<br /> | |||
| baz</p> | baz</p> | |||
| . | ```````````````````````````````` | |||
| For a more visible alternative, a backslash before the | For a more visible alternative, a backslash before the | |||
| [line ending] may be used instead of two spaces: | [line ending] may be used instead of two spaces: | |||
| . | ```````````````````````````````` example | |||
| foo\ | foo\ | |||
| baz | baz | |||
| . | . | |||
| <p>foo<br /> | <p>foo<br /> | |||
| baz</p> | baz</p> | |||
| . | ```````````````````````````````` | |||
| More than two spaces can be used: | More than two spaces can be used: | |||
| . | ```````````````````````````````` example | |||
| foo | foo | |||
| baz | baz | |||
| . | . | |||
| <p>foo<br /> | <p>foo<br /> | |||
| baz</p> | baz</p> | |||
| . | ```````````````````````````````` | |||
| Leading spaces at the beginning of the next line are ignored: | Leading spaces at the beginning of the next line are ignored: | |||
| . | ```````````````````````````````` example | |||
| foo | foo | |||
| bar | bar | |||
| . | . | |||
| <p>foo<br /> | <p>foo<br /> | |||
| bar</p> | bar</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo\ | foo\ | |||
| bar | bar | |||
| . | . | |||
| <p>foo<br /> | <p>foo<br /> | |||
| bar</p> | bar</p> | |||
| . | ```````````````````````````````` | |||
| Line breaks can occur inside emphasis, links, and other constructs | Line breaks can occur inside emphasis, links, and other constructs | |||
| that allow inline content: | that allow inline content: | |||
| . | ```````````````````````````````` example | |||
| *foo | *foo | |||
| bar* | bar* | |||
| . | . | |||
| <p><em>foo<br /> | <p><em>foo<br /> | |||
| bar</em></p> | bar</em></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| *foo\ | *foo\ | |||
| bar* | bar* | |||
| . | . | |||
| <p><em>foo<br /> | <p><em>foo<br /> | |||
| bar</em></p> | bar</em></p> | |||
| . | ```````````````````````````````` | |||
| Line breaks do not occur inside code spans | Line breaks do not occur inside code spans | |||
| . | ```````````````````````````````` example | |||
| `code | `code | |||
| span` | span` | |||
| . | . | |||
| <p><code>code span</code></p> | <p><code>code span</code></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| `code\ | `code\ | |||
| span` | span` | |||
| . | . | |||
| <p><code>code\ span</code></p> | <p><code>code\ span</code></p> | |||
| . | ```````````````````````````````` | |||
| or HTML tags: | or HTML tags: | |||
| . | ```````````````````````````````` example | |||
| <a href="foo | <a href="foo | |||
| bar"> | bar"> | |||
| . | . | |||
| <p><a href="foo | <p><a href="foo | |||
| bar"></p> | bar"></p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| <a href="foo\ | <a href="foo\ | |||
| bar"> | bar"> | |||
| . | . | |||
| <p><a href="foo\ | <p><a href="foo\ | |||
| bar"></p> | bar"></p> | |||
| . | ```````````````````````````````` | |||
| Hard line breaks are for separating inline content within a block. | Hard line breaks are for separating inline content within a block. | |||
| Neither syntax for hard line breaks works at the end of a paragraph or | Neither syntax for hard line breaks works at the end of a paragraph or | |||
| other block element: | other block element: | |||
| . | ```````````````````````````````` example | |||
| foo\ | foo\ | |||
| . | . | |||
| <p>foo\</p> | <p>foo\</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| foo | foo | |||
| . | . | |||
| <p>foo</p> | <p>foo</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ### foo\ | ### foo\ | |||
| . | . | |||
| <h3>foo\</h3> | <h3>foo\</h3> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| ### foo | ### foo | |||
| . | . | |||
| <h3>foo</h3> | <h3>foo</h3> | |||
| . | ```````````````````````````````` | |||
| ## Soft line breaks | ## Soft line breaks | |||
| A regular line break (not in a code span or HTML tag) that is not | A regular line break (not in a code span or HTML tag) that is not | |||
| preceded by two or more spaces or a backslash is parsed as a | preceded by two or more spaces or a backslash is parsed as a | |||
| softbreak. (A softbreak may be rendered in HTML either as a | softbreak. (A softbreak may be rendered in HTML either as a | |||
| [line ending] or as a space. The result will be the same in | [line ending] or as a space. The result will be the same in | |||
| browsers. In the examples here, a [line ending] will be used.) | browsers. In the examples here, a [line ending] will be used.) | |||
| . | ```````````````````````````````` example | |||
| foo | foo | |||
| baz | baz | |||
| . | . | |||
| <p>foo | <p>foo | |||
| baz</p> | baz</p> | |||
| . | ```````````````````````````````` | |||
| Spaces at the end of the line and beginning of the next line are | Spaces at the end of the line and beginning of the next line are | |||
| removed: | removed: | |||
| . | ```````````````````````````````` example | |||
| foo | foo | |||
| baz | baz | |||
| . | . | |||
| <p>foo | <p>foo | |||
| baz</p> | baz</p> | |||
| . | ```````````````````````````````` | |||
| A conforming parser may render a soft line break in HTML either as a | A conforming parser may render a soft line break in HTML either as a | |||
| line break or as a space. | line break or as a space. | |||
| A renderer may also provide an option to render soft line breaks | A renderer may also provide an option to render soft line breaks | |||
| as hard line breaks. | as hard line breaks. | |||
| ## Textual content | ## Textual content | |||
| Any characters not given an interpretation by the above rules will | Any characters not given an interpretation by the above rules will | |||
| be parsed as plain textual content. | be parsed as plain textual content. | |||
| . | ```````````````````````````````` example | |||
| hello $.;'there | hello $.;'there | |||
| . | . | |||
| <p>hello $.;'there</p> | <p>hello $.;'there</p> | |||
| . | ```````````````````````````````` | |||
| . | ```````````````````````````````` example | |||
| Foo χρῆν | Foo χρῆν | |||
| . | . | |||
| <p>Foo χρῆν</p> | <p>Foo χρῆν</p> | |||
| . | ```````````````````````````````` | |||
| Internal spaces are preserved verbatim: | Internal spaces are preserved verbatim: | |||
| . | ```````````````````````````````` example | |||
| Multiple spaces | Multiple spaces | |||
| . | . | |||
| <p>Multiple spaces</p> | <p>Multiple spaces</p> | |||
| . | ```````````````````````````````` | |||
| <!-- END TESTS --> | <!-- END TESTS --> | |||
| # Appendix: A parsing strategy {-} | # Appendix: A parsing strategy | |||
| In this appendix we describe some features of the parsing strategy | In this appendix we describe some features of the parsing strategy | |||
| used in the CommonMark reference implementations. | used in the CommonMark reference implementations. | |||
| ## Overview {-} | ## Overview | |||
| Parsing has two phases: | Parsing has two phases: | |||
| 1. In the first phase, lines of input are consumed and the block | 1. In the first phase, lines of input are consumed and the block | |||
| structure of the document---its division into paragraphs, block quotes, | structure of the document---its division into paragraphs, block quotes, | |||
| list items, and so on---is constructed. Text is assigned to these | list items, and so on---is constructed. Text is assigned to these | |||
| blocks but not parsed. Link reference definitions are parsed and a | blocks but not parsed. Link reference definitions are parsed and a | |||
| map of links is constructed. | map of links is constructed. | |||
| 2. In the second phase, the raw text contents of paragraphs and headings | 2. In the second phase, the raw text contents of paragraphs and headings | |||
| skipping to change at line 8144 | skipping to change at line 8246 | |||
| "Lorem ipsum dolor\nsit amet." | "Lorem ipsum dolor\nsit amet." | |||
| -> list (type=bullet tight=true bullet_char=-) | -> list (type=bullet tight=true bullet_char=-) | |||
| list_item | list_item | |||
| paragraph | paragraph | |||
| "Qui *quodsi iracundia*" | "Qui *quodsi iracundia*" | |||
| -> list_item | -> list_item | |||
| -> paragraph | -> paragraph | |||
| "aliquando id" | "aliquando id" | |||
| ``` | ``` | |||
| ## Phase 1: block structure {-} | ## Phase 1: block structure | |||
| Each line that is processed has an effect on this tree. The line is | Each line that is processed has an effect on this tree. The line is | |||
| analyzed and, depending on its contents, the document may be altered | analyzed and, depending on its contents, the document may be altered | |||
| in one or more of the following ways: | in one or more of the following ways: | |||
| 1. One or more open blocks may be closed. | 1. One or more open blocks may be closed. | |||
| 2. One or more new blocks may be created as children of the | 2. One or more new blocks may be created as children of the | |||
| last open block. | last open block. | |||
| 3. Text may be added to the last (deepest) open block remaining | 3. Text may be added to the last (deepest) open block remaining | |||
| on the tree. | on the tree. | |||
| skipping to change at line 8181 | skipping to change at line 8283 | |||
| blocks, we look for new block starts (e.g. `>` for a block quote. | blocks, we look for new block starts (e.g. `>` for a block quote. | |||
| If we encounter a new block start, we close any blocks unmatched | If we encounter a new block start, we close any blocks unmatched | |||
| in step 1 before creating the new block as a child of the last | in step 1 before creating the new block as a child of the last | |||
| matched block. | matched block. | |||
| 3. Finally, we look at the remainder of the line (after block | 3. Finally, we look at the remainder of the line (after block | |||
| markers like `>`, list markers, and indentation have been consumed). | markers like `>`, list markers, and indentation have been consumed). | |||
| This is text that can be incorporated into the last open | This is text that can be incorporated into the last open | |||
| block (a paragraph, code block, heading, or raw HTML). | block (a paragraph, code block, heading, or raw HTML). | |||
| Setext headings are formed when we detect that the second line of | Setext headings are formed when we see a line of a paragraph | |||
| a paragraph is a setext heading line. | that is a setext heading line. | |||
| Reference link definitions are detected when a paragraph is closed; | Reference link definitions are detected when a paragraph is closed; | |||
| the accumulated text lines are parsed to see if they begin with | the accumulated text lines are parsed to see if they begin with | |||
| one or more reference link definitions. Any remainder becomes a | one or more reference link definitions. Any remainder becomes a | |||
| normal paragraph. | normal paragraph. | |||
| We can see how this works by considering how the tree above is | We can see how this works by considering how the tree above is | |||
| generated by four lines of Markdown: | generated by four lines of Markdown: | |||
| ``` markdown | ``` markdown | |||
| skipping to change at line 8286 | skipping to change at line 8388 | |||
| "Lorem ipsum dolor\nsit amet." | "Lorem ipsum dolor\nsit amet." | |||
| -> list (type=bullet tight=true bullet_char=-) | -> list (type=bullet tight=true bullet_char=-) | |||
| list_item | list_item | |||
| paragraph | paragraph | |||
| "Qui *quodsi iracundia*" | "Qui *quodsi iracundia*" | |||
| -> list_item | -> list_item | |||
| -> paragraph | -> paragraph | |||
| "aliquando id" | "aliquando id" | |||
| ``` | ``` | |||
| ## Phase 2: inline structure {-} | ## Phase 2: inline structure | |||
| Once all of the input has been parsed, all open blocks are closed. | Once all of the input has been parsed, all open blocks are closed. | |||
| We then "walk the tree," visiting every node, and parse raw | We then "walk the tree," visiting every node, and parse raw | |||
| string contents of paragraphs and headings as inlines. At this | string contents of paragraphs and headings as inlines. At this | |||
| point we have seen all the link reference definitions, so we can | point we have seen all the link reference definitions, so we can | |||
| resolve reference links as we go. | resolve reference links as we go. | |||
| ``` tree | ``` tree | |||
| document | document | |||
| skipping to change at line 8317 | skipping to change at line 8419 | |||
| str "quodsi iracundia" | str "quodsi iracundia" | |||
| list_item | list_item | |||
| paragraph | paragraph | |||
| str "aliquando id" | str "aliquando id" | |||
| ``` | ``` | |||
| Notice how the [line ending] in the first paragraph has | Notice how the [line ending] in the first paragraph has | |||
| been parsed as a `softbreak`, and the asterisks in the first list item | been parsed as a `softbreak`, and the asterisks in the first list item | |||
| have become an `emph`. | have become an `emph`. | |||
| ### An algorithm for parsing nested emphasis and links {-} | ### An algorithm for parsing nested emphasis and links | |||
| By far the trickiest part of inline parsing is handling emphasis, | By far the trickiest part of inline parsing is handling emphasis, | |||
| strong emphasis, links, and images. This is done using the following | strong emphasis, links, and images. This is done using the following | |||
| algorithm. | algorithm. | |||
| When we're parsing inlines and we hit either | When we're parsing inlines and we hit either | |||
| - a run of `*` or `_` characters, or | - a run of `*` or `_` characters, or | |||
| - a `[` or `. | add a pointer to this text node to the [delimiter stack](@). | |||
| The [delimiter stack] is a doubly linked list. Each | The [delimiter stack] is a doubly linked list. Each | |||
| element contains a pointer to a text node, plus information about | element contains a pointer to a text node, plus information about | |||
| - the type of delimiter (`[`, `![`, `*`, `_`) | - the type of delimiter (`[`, `![`, `*`, `_`) | |||
| - the number of delimiters, | - the number of delimiters, | |||
| - whether the delimiter is "active" (all are active to start), and | - whether the delimiter is "active" (all are active to start), and | |||
| - whether the delimiter is a potential opener, a potential closer, | - whether the delimiter is a potential opener, a potential closer, | |||
| or both (which depends on what sort of characters precede | or both (which depends on what sort of characters precede | |||
| and follow the delimiters). | and follow the delimiters). | |||
| When we hit a `]` character, we call the *look for link or image* | When we hit a `]` character, we call the *look for link or image* | |||
| procedure (see below). | procedure (see below). | |||
| When we hit the end of the input, we call the *process emphasis* | When we hit the end of the input, we call the *process emphasis* | |||
| procedure (see below), with `stack_bottom` = NULL. | procedure (see below), with `stack_bottom` = NULL. | |||
| #### *look for link or image* {-} | #### *look for link or image* | |||
| Starting at the top of the delimiter stack, we look backwards | Starting at the top of the delimiter stack, we look backwards | |||
| through the stack for an opening `[` or `![` delimiter. | through the stack for an opening `[` or `![` delimiter. | |||
| - If we don't find one, we return a literal text node `]`. | - If we don't find one, we return a literal text node `]`. | |||
| - If we do find one, but it's not *active*, we remove the inactive | - If we do find one, but it's not *active*, we remove the inactive | |||
| delimiter from the stack, and return a literal text node `]`. | delimiter from the stack, and return a literal text node `]`. | |||
| - If we find one and it's active, then we parse ahead to see if | - If we find one and it's active, then we parse ahead to see if | |||
| skipping to change at line 8378 | skipping to change at line 8480 | |||
| * We run *process emphasis* on these inlines, with the `[` opener | * We run *process emphasis* on these inlines, with the `[` opener | |||
| as `stack_bottom`. | as `stack_bottom`. | |||
| * We remove the opening delimiter. | * We remove the opening delimiter. | |||
| * If we have a link (and not an image), we also set all | * If we have a link (and not an image), we also set all | |||
| `[` delimiters before the opening delimiter to *inactive*. (This | `[` delimiters before the opening delimiter to *inactive*. (This | |||
| will prevent us from getting links within links.) | will prevent us from getting links within links.) | |||
| #### *process emphasis* {-} | #### *process emphasis* | |||
| Parameter `stack_bottom` sets a lower bound to how far we | Parameter `stack_bottom` sets a lower bound to how far we | |||
| descend in the [delimiter stack]. If it is NULL, we can | descend in the [delimiter stack]. If it is NULL, we can | |||
| go all the way to the bottom. Otherwise, we stop before | go all the way to the bottom. Otherwise, we stop before | |||
| visiting `stack_bottom`. | visiting `stack_bottom`. | |||
| Let `current_position` point to the element on the [delimiter stack] | Let `current_position` point to the element on the [delimiter stack] | |||
| just above `stack_bottom` (or the first element if `stack_bottom` | just above `stack_bottom` (or the first element if `stack_bottom` | |||
| is NULL). | is NULL). | |||
| End of changes. 1354 change blocks. | ||||
| 1417 lines changed or deleted | 1519 lines changed or added | |||
This html diff was produced by rfcdiff 1.41. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||