Couldn't find wdiff. Falling back to builtin diff colouring...
| spec.txt | spec.txt | |||
|---|---|---|---|---|
| --- | --- | |||
| title: CommonMark Spec | title: CommonMark Spec | |||
| author: John MacFarlane | author: John MacFarlane | |||
| version: 0.26 | version: 0.27 | |||
| date: '2016-07-15' | date: '2016-11-18' | |||
| 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 1872 ¶ | skipping to change at line 1872 ¶ | |||
| ## HTML blocks | ## HTML blocks | |||
| An [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](@) (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](@), or the last line of | meets a matching [end condition](@), or the last line of | |||
| the document or other [container block](@), if no line is encountered that meets the | the document or other [container block]), if no line is encountered that meets t he | |||
| [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 1902 ¶ | skipping to change at line 1902 ¶ | |||
| 5. **Start condition:** line begins with the string | 5. **Start condition:** line begins with the string | |||
| `<![CDATA[`.\ | `<![CDATA[`.\ | |||
| **End condition:** line contains the string `]]>`. | **End condition:** line contains the string `]]>`. | |||
| 6. **Start condition:** line begins the string `<` or `</` | 6. **Start condition:** line begins the string `<` or `</` | |||
| followed by one of the strings (case-insensitive) `address`, | followed by one of the strings (case-insensitive) `address`, | |||
| `article`, `aside`, `base`, `basefont`, `blockquote`, `body`, | `article`, `aside`, `base`, `basefont`, `blockquote`, `body`, | |||
| `caption`, `center`, `col`, `colgroup`, `dd`, `details`, `dialog`, | `caption`, `center`, `col`, `colgroup`, `dd`, `details`, `dialog`, | |||
| `dir`, `div`, `dl`, `dt`, `fieldset`, `figcaption`, `figure`, | `dir`, `div`, `dl`, `dt`, `fieldset`, `figcaption`, `figure`, | |||
| `footer`, `form`, `frame`, `frameset`, `h1`, `head`, `header`, `hr`, | `footer`, `form`, `frame`, `frameset`, | |||
| `h1`, `h2`, `h3`, `h4`, `h5`, `h6`, `head`, `header`, `hr`, | ||||
| `html`, `iframe`, `legend`, `li`, `link`, `main`, `menu`, `menuitem`, | `html`, `iframe`, `legend`, `li`, `link`, `main`, `menu`, `menuitem`, | |||
| `meta`, `nav`, `noframes`, `ol`, `optgroup`, `option`, `p`, `param`, | `meta`, `nav`, `noframes`, `ol`, `optgroup`, `option`, `p`, `param`, | |||
| `section`, `source`, `summary`, `table`, `tbody`, `td`, | `section`, `source`, `summary`, `table`, `tbody`, `td`, | |||
| `tfoot`, `th`, `thead`, `title`, `tr`, `track`, `ul`, followed | `tfoot`, `th`, `thead`, `title`, `tr`, `track`, `ul`, followed | |||
| by [whitespace], the end of the line, the string `>`, or | by [whitespace], the end of the line, the string `>`, or | |||
| the string `/>`.\ | the string `/>`.\ | |||
| **End condition:** line is followed by a [blank line]. | **End condition:** line is followed by a [blank line]. | |||
| 7. **Start condition:** line begins with a complete [open tag] | 7. **Start condition:** line begins with a complete [open tag] | |||
| or [closing tag] (with any [tag name] other than `script`, | or [closing tag] (with any [tag name] other than `script`, | |||
| skipping to change at line 3415 ¶ | skipping to change at line 3416 ¶ | |||
| 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 1 ≤ *N* ≤ 4 spaces, then the result | marker of width *W* followed by 1 ≤ *N* ≤ 4 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. | |||
| Exceptions: When the list item interrupts a paragraph---that | Exceptions: When the first list item in a [list] interrupts | |||
| is, when it starts on a line that would otherwise count as | a paragraph---that is, when it starts on a line that would | |||
| [paragraph continuation text]---then (a) the lines *Ls* must | otherwise count as [paragraph continuation text]---then (a) | |||
| not begin with a blank line, and (b) if the list item is | the lines *Ls* must not begin with a blank line, and (b) if | |||
| ordered, the start number must be 1. | the list item is ordered, the start number must be 1. | |||
| For example, let *Ls* be the lines | For example, let *Ls* be the lines | |||
| ```````````````````````````````` example | ```````````````````````````````` example | |||
| A paragraph | A paragraph | |||
| with two lines. | with two lines. | |||
| indented code | indented code | |||
| > A block quote. | > A block quote. | |||
| skipping to change at line 4458 ¶ | skipping to change at line 4459 ¶ | |||
| 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](@) 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 any number of blank lines. | |||
| blank lines end all containing lists. | ||||
| Two list items are [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](@) | A list is an [ordered list](@) | |||
| if its constituent list items begin with | if its constituent list items begin with | |||
| skipping to change at line 4535 ¶ | skipping to change at line 4535 ¶ | |||
| <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: | |||
| ```````````````````````````````` markdown | ``` markdown | |||
| 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. | |||
| ```````````````````````````````` | ``` | |||
| Oddly, though, `Markdown.pl` *does* allow a blockquote to | Oddly, though, `Markdown.pl` *does* allow a blockquote to | |||
| interrupt a paragraph, even though the same considerations might | interrupt a paragraph, even though the same considerations might | |||
| apply. | apply. | |||
| In CommonMark, we do allow lists to interrupt paragraphs, for | In CommonMark, we do allow lists to interrupt paragraphs, for | |||
| two reasons. First, it is natural and not uncommon for people | two reasons. First, it is natural and not uncommon for people | |||
| to start lists without blank lines: | to start lists without blank lines: | |||
| I need to buy | ``` markdown | |||
| - new shoes | I need to buy | |||
| - a coat | - new shoes | |||
| - a plane ticket | - a coat | |||
| - a plane ticket | ||||
| ``` | ||||
| Second, we are attracted to a | Second, we are attracted to a | |||
| > [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 | ``` markdown | |||
| - new shoes | * I need to buy | |||
| - a coat | - new shoes | |||
| - a plane ticket | - a coat | |||
| - a plane ticket | ||||
| ``` | ||||
| is a list item containing a paragraph followed by a nested sublist, | is a list item containing a paragraph followed by a nested sublist, | |||
| as all Markdown implementations agree it is (though the paragraph | as all Markdown implementations agree it is (though the paragraph | |||
| may be rendered without `<p>` tags, since the list is "tight"), | may be rendered without `<p>` tags, since the list is "tight"), | |||
| then | then | |||
| I need to buy | ``` markdown | |||
| - new shoes | I need to buy | |||
| - a coat | - new shoes | |||
| - a plane ticket | - a coat | |||
| - a plane ticket | ||||
| ``` | ||||
| by itself should be a paragraph followed by a nested sublist. | by itself should be a paragraph followed by a nested sublist. | |||
| Since it is well established Markdown practice to allow lists to | Since it is well established Markdown practice to allow lists to | |||
| interrupt paragraphs inside list items, the [principle of | interrupt paragraphs inside list items, the [principle of | |||
| uniformity] requires us to allow this outside list items as | uniformity] requires us to allow this outside list items as | |||
| well. ([reStructuredText](http://docutils.sourceforge.net/rst.html) | well. ([reStructuredText](http://docutils.sourceforge.net/rst.html) | |||
| takes a different approach, requiring blank lines before lists | takes a different approach, requiring blank lines before lists | |||
| even inside other list items.) | even inside other list items.) | |||
| skipping to change at line 5343 ¶ | skipping to change at line 5350 ¶ | |||
| Interior spaces and [line endings] 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 | ```````````````````````````````` example | |||
| `foo bar | `foo bar | |||
| baz` | baz` | |||
| . | . | |||
| <p><code>foo bar baz</code></p> | <p><code>foo bar baz</code></p> | |||
| ```````````````````````````````` | ```````````````````````````````` | |||
| Not all [Unicode whitespace] (for instance, non-breaking space) is | ||||
| collapsed, however: | ||||
| ```````````````````````````````` example | ||||
| `a b` | ||||
| . | ||||
| <p><code>a b</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 endings]. 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 | |||
| skipping to change at line 6158 ¶ | skipping to change at line 6174 ¶ | |||
| <p><em>foo<strong>bar</strong>baz</em></p> | <p><em>foo<strong>bar</strong>baz</em></p> | |||
| ```````````````````````````````` | ```````````````````````````````` | |||
| Note that in the preceding case, the interpretation | Note that in the preceding case, the interpretation | |||
| ``` markdown | ``` markdown | |||
| <p><em>foo</em><em>bar<em></em>baz</em></p> | <p><em>foo</em><em>bar<em></em>baz</em></p> | |||
| ``` | ``` | |||
| is precluded by the condition that a delimiter that | is precluded by the condition that a delimiter that | |||
| can both open and close (like the `*` after `foo` | can both open and close (like the `*` after `foo`) | |||
| cannot form emphasis if the sum of the lengths of | cannot form emphasis if the sum of the lengths of | |||
| the delimiter runs containing the opening and | the delimiter runs containing the opening and | |||
| closing delimiters is a multiple of 3. | closing delimiters is a multiple of 3. | |||
| The same condition ensures that the following | The same condition ensures that the following | |||
| cases are all strong emphasis nested inside | cases are all strong emphasis nested inside | |||
| emphasis, even when the interior spaces are | emphasis, even when the interior spaces are | |||
| omitted: | omitted: | |||
| ```````````````````````````````` example | ```````````````````````````````` example | |||
| skipping to change at line 6186 ¶ | skipping to change at line 6202 ¶ | |||
| . | . | |||
| <p><em>foo <strong>bar</strong></em></p> | <p><em>foo <strong>bar</strong></em></p> | |||
| ```````````````````````````````` | ```````````````````````````````` | |||
| ```````````````````````````````` example | ```````````````````````````````` example | |||
| *foo**bar*** | *foo**bar*** | |||
| . | . | |||
| <p><em>foo<strong>bar</strong></em></p> | <p><em>foo<strong>bar</strong></em></p> | |||
| ```````````````````````````````` | ```````````````````````````````` | |||
| ```````````````````````````````` example | ||||
| *foo**bar*** | ||||
| . | ||||
| <p><em>foo<strong>bar</strong></em></p> | ||||
| ```````````````````````````````` | ||||
| Indefinite levels of nesting are possible: | Indefinite levels of nesting are possible: | |||
| ```````````````````````````````` example | ```````````````````````````````` 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 | ```````````````````````````````` example | |||
| *foo [*bar*](/url)* | *foo [*bar*](/url)* | |||
| skipping to change at line 6871 ¶ | skipping to change at line 6881 ¶ | |||
| 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 | ```````````````````````````````` 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> | |||
| ```````````````````````````````` | ```````````````````````````````` | |||
| Titles must be separated from the link using a [whitespace]. | ||||
| Other [Unicode whitespace] like non-breaking space doesn't work. | ||||
| ```````````````````````````````` example | ||||
| [link](/url "title") | ||||
| . | ||||
| <p><a href="/url%C2%A0%22title%22">link</a></p> | ||||
| ```````````````````````````````` | ||||
| Nested balanced quotes are not allowed without escaping: | Nested balanced quotes are not allowed without escaping: | |||
| ```````````````````````````````` example | ```````````````````````````````` 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: | |||
| skipping to change at line 7477 ¶ | skipping to change at line 7496 ¶ | |||
| following closing bracket: | following closing bracket: | |||
| ```````````````````````````````` example | ```````````````````````````````` 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 and compact references take precedence over shortcut | |||
| references: | ||||
| ```````````````````````````````` example | ```````````````````````````````` 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> | |||
| ```````````````````````````````` | ```````````````````````````````` | |||
| ```````````````````````````````` example | ||||
| [foo][] | ||||
| [foo]: /url1 | ||||
| . | ||||
| <p><a href="/url1">foo</a></p> | ||||
| ```````````````````````````````` | ||||
| Inline links also take precedence: | ||||
| ```````````````````````````````` example | ||||
| [foo]() | ||||
| [foo]: /url1 | ||||
| . | ||||
| <p><a href="">foo</a></p> | ||||
| ```````````````````````````````` | ||||
| ```````````````````````````````` example | ||||
| [foo](not a link) | ||||
| [foo]: /url1 | ||||
| . | ||||
| <p><a href="/url1">foo</a>(not a link)</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 | ```````````````````````````````` 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> | |||
| ```````````````````````````````` | ```````````````````````````````` | |||
| skipping to change at line 8410 ¶ | skipping to change at line 8456 ¶ | |||
| 1. First we iterate through the open blocks, starting with the | 1. First we iterate through the open blocks, starting with the | |||
| root document, and descending through last children down to the last | root document, and descending through last children down to the last | |||
| open block. Each block imposes a condition that the line must satisfy | open block. Each block imposes a condition that the line must satisfy | |||
| if the block is to remain open. For example, a block quote requires a | if the block is to remain open. For example, a block quote requires a | |||
| `>` character. A paragraph requires a non-blank line. | `>` character. A paragraph requires a non-blank line. | |||
| In this phase we may match all or just some of the open | In this phase we may match all or just some of the open | |||
| blocks. But we cannot close unmatched blocks yet, because we may have a | blocks. But we cannot close unmatched blocks yet, because we may have a | |||
| [lazy continuation line]. | [lazy continuation line]. | |||
| 2. Next, after consuming the continuation markers for existing | 2. Next, after consuming the continuation markers for existing | |||
| 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 see a line of a paragraph | Setext headings are formed when we see a line of a paragraph | |||
| End of changes. 17 change blocks. | ||||
| 34 lines changed or deleted | 80 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||