spec.txt | spec.txt | |||
---|---|---|---|---|
--- | --- | |||
title: CommonMark Spec | title: CommonMark Spec | |||
author: | author: | |||
- John MacFarlane | - John MacFarlane | |||
version: 0.12 | version: 0.13 | |||
date: 2014-11-10 | date: 2014-12-10 | |||
... | ... | |||
# 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 | |||
the first Markdown-to-HTML converter in perl, and it soon became | the first Markdown-to-HTML converter in perl, and it soon became | |||
skipping to change at line 173 | skipping to change at line 173 | |||
a document that renders one way on one system (say, a github wiki) | a document that renders one way on one system (say, a github wiki) | |||
renders differently on another (say, converting to docbook using | renders differently on another (say, converting to docbook using | |||
pandoc). To make matters worse, because nothing in Markdown counts | pandoc). To make matters worse, because nothing in Markdown counts | |||
as a "syntax error," the divergence often isn't discovered right away. | as a "syntax error," the divergence often isn't discovered right away. | |||
## About this document | ## About this document | |||
This document attempts to specify Markdown syntax unambiguously. | This document attempts to specify Markdown syntax unambiguously. | |||
It contains many examples with side-by-side Markdown and | It contains many examples with side-by-side Markdown and | |||
HTML. These are intended to double as conformance tests. An | HTML. These are intended to double as conformance tests. An | |||
accompanying script `runtests.pl` can be used to run the tests | accompanying script `spec_tests.py` can be used to run the tests | |||
against any Markdown program: | against any Markdown program: | |||
perl runtests.pl spec.txt PROGRAM | python test/spec_tests.py --spec spec.txt --program PROGRAM | |||
Since this document describes how Markdown is to be parsed into | Since this document describes how Markdown is to be parsed into | |||
an abstract syntax tree, it would have made sense to use an abstract | an abstract syntax tree, it would have made sense to use an abstract | |||
representation of the syntax tree instead of HTML. But HTML is capable | representation of the syntax tree instead of HTML. But HTML is capable | |||
of representing the structural distinctions we need to make, and the | of representing the structural distinctions we need to make, and the | |||
choice of HTML for the tests makes it possible to run the tests against | choice of HTML for the tests makes it possible to run the tests against | |||
an implementation without writing an abstract syntax tree renderer. | an implementation without writing an abstract syntax tree renderer. | |||
This document is generated from a text file, `spec.txt`, written | This document is generated from a text file, `spec.txt`, written | |||
in Markdown with a small extension for the side-by-side tests. | in Markdown with a small extension for the side-by-side tests. | |||
skipping to change at line 226 | skipping to change at line 226 | |||
<pre><code>a a | <pre><code>a a | |||
ὐ a | ὐ a | |||
</code></pre> | </code></pre> | |||
. | . | |||
Line endings are replaced by newline characters (LF). | Line endings are replaced by newline characters (LF). | |||
A line containing no characters, or a line containing only spaces (after | A line containing no characters, or a line containing only spaces (after | |||
tab expansion), is called a [blank line](@blank-line). | tab expansion), is called a [blank line](@blank-line). | |||
For security reasons, a conforming parser must strip or replace the | ||||
Unicode character `U+0000`. | ||||
# 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 | [blocks](@block)---structural | |||
elements like paragraphs, block quotations, | elements like paragraphs, block quotations, | |||
lists, headers, rules, and code blocks. Blocks can contain other | lists, headers, rules, and code blocks. Blocks can contain other | |||
blocks, or they can contain [inline](@inline) content: | blocks, or they can contain [inline](@inline) content: | |||
words, spaces, links, emphasized text, images, and inline code. | words, spaces, links, emphasized text, images, and inline code. | |||
## Precedence | ## Precedence | |||
skipping to change at line 471 | skipping to change at line 474 | |||
. | . | |||
If you want a horizontal rule in a list item, use a different bullet: | If you want a horizontal rule in a list item, use a different bullet: | |||
. | . | |||
- Foo | - Foo | |||
- * * * | - * * * | |||
. | . | |||
<ul> | <ul> | |||
<li>Foo</li> | <li>Foo</li> | |||
<li><hr /></li> | <li> | |||
<hr /> | ||||
</li> | ||||
</ul> | </ul> | |||
. | . | |||
## ATX headers | ## ATX headers | |||
An [ATX header](@atx-header) | An [ATX header](@atx-header) | |||
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 `#` characters. The opening sequence | closing sequence of any number of `#` characters. The opening sequence | |||
of `#` characters cannot be followed directly by a nonspace character. | of `#` characters cannot be followed directly by a nonspace character. | |||
skipping to change at line 2516 | skipping to change at line 2521 | |||
. | . | |||
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><p>A paragraph | <li> | |||
<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></li> | </blockquote> | |||
</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 nonspace character, then blocks | the list marker and the next nonspace 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. | |||
skipping to change at line 2554 | skipping to change at line 2561 | |||
</ul> | </ul> | |||
<p>two</p> | <p>two</p> | |||
. | . | |||
. | . | |||
- one | - one | |||
two | two | |||
. | . | |||
<ul> | <ul> | |||
<li><p>one</p> | <li> | |||
<p>two</p></li> | <p>one</p> | |||
<p>two</p> | ||||
</li> | ||||
</ul> | </ul> | |||
. | . | |||
. | . | |||
- one | - one | |||
two | two | |||
. | . | |||
<ul> | <ul> | |||
<li>one</li> | <li>one</li> | |||
skipping to change at line 2577 | skipping to change at line 2586 | |||
<pre><code> two | <pre><code> two | |||
</code></pre> | </code></pre> | |||
. | . | |||
. | . | |||
- one | - one | |||
two | two | |||
. | . | |||
<ul> | <ul> | |||
<li><p>one</p> | <li> | |||
<p>two</p></li> | <p>one</p> | |||
<p>two</p> | ||||
</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 nonspace | blocks must be indented at least to the column of the first nonspace | |||
character after the list marker. However, that is not quite right. | character after the list marker. However, that is not quite right. | |||
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: | |||
. | . | |||
> > 1. one | > > 1. one | |||
>> | >> | |||
>> two | >> two | |||
. | . | |||
<blockquote> | <blockquote> | |||
<blockquote> | <blockquote> | |||
<ol> | <ol> | |||
<li><p>one</p> | <li> | |||
<p>two</p></li> | <p>one</p> | |||
<p>two</p> | ||||
</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 | |||
sufficent indentation after the last containing blockquote marker. | sufficent 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` | |||
skipping to change at line 2649 | skipping to change at line 2662 | |||
bar | bar | |||
- ``` | - ``` | |||
foo | foo | |||
bar | bar | |||
``` | ``` | |||
. | . | |||
<ul> | <ul> | |||
<li><p>foo</p> | <li> | |||
<p>bar</p></li> | <p>foo</p> | |||
<li><p>foo</p></li> | <p>bar</p> | |||
</li> | ||||
<li> | ||||
<p>foo</p> | ||||
</li> | ||||
</ul> | </ul> | |||
<p>bar</p> | <p>bar</p> | |||
<ul> | <ul> | |||
<li><pre><code>foo | <li> | |||
<pre><code>foo | ||||
bar | bar | |||
</code></pre></li> | </code></pre> | |||
</li> | ||||
</ul> | </ul> | |||
. | . | |||
A list item may contain any kind of block: | A list item may contain any kind of block: | |||
. | . | |||
1. foo | 1. foo | |||
``` | ``` | |||
bar | bar | |||
``` | ``` | |||
baz | baz | |||
> bam | > bam | |||
. | . | |||
<ol> | <ol> | |||
<li><p>foo</p> | <li> | |||
<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></li> | </blockquote> | |||
</li> | ||||
</ol> | </ol> | |||
. | . | |||
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 *M* of width *W* followed by | and *M* is a list marker *M* 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. | |||
skipping to change at line 2708 | skipping to change at line 2729 | |||
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: | |||
. | . | |||
- foo | - foo | |||
bar | bar | |||
. | . | |||
<ul> | <ul> | |||
<li><p>foo</p> | <li> | |||
<p>foo</p> | ||||
<pre><code>bar | <pre><code>bar | |||
</code></pre></li> | </code></pre> | |||
</li> | ||||
</ul> | </ul> | |||
. | . | |||
And in this case it is 11 spaces: | And in this case it is 11 spaces: | |||
. | . | |||
10. foo | 10. foo | |||
bar | bar | |||
. | . | |||
<ol start="10"> | <ol start="10"> | |||
<li><p>foo</p> | <li> | |||
<p>foo</p> | ||||
<pre><code>bar | <pre><code>bar | |||
</code></pre></li> | </code></pre> | |||
</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: | |||
. | . | |||
indented code | indented code | |||
skipping to change at line 2754 | skipping to change at line 2779 | |||
. | . | |||
. | . | |||
1. indented code | 1. indented code | |||
paragraph | paragraph | |||
more code | more code | |||
. | . | |||
<ol> | <ol> | |||
<li><pre><code>indented code | <li> | |||
<pre><code>indented code | ||||
</code></pre> | </code></pre> | |||
<p>paragraph</p> | <p>paragraph</p> | |||
<pre><code>more code | <pre><code>more code | |||
</code></pre></li> | </code></pre> | |||
</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: | |||
. | . | |||
1. indented code | 1. indented code | |||
paragraph | paragraph | |||
more code | more code | |||
. | . | |||
<ol> | <ol> | |||
<li><pre><code> indented code | <li> | |||
<pre><code> indented code | ||||
</code></pre> | </code></pre> | |||
<p>paragraph</p> | <p>paragraph</p> | |||
<pre><code>more code | <pre><code>more code | |||
</code></pre></li> | </code></pre> | |||
</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 nonspace | in which the lines to be included in a list item begin with a nonspace | |||
character, and (b) cases in which they begin with an indented code | character, and (b) cases in which 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: | |||
skipping to change at line 2819 | skipping to change at line 2848 | |||
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: | |||
. | . | |||
- foo | - foo | |||
bar | bar | |||
. | . | |||
<ul> | <ul> | |||
<li><p>foo</p> | <li> | |||
<p>bar</p></li> | <p>foo</p> | |||
<p>bar</p> | ||||
</li> | ||||
</ul> | </ul> | |||
. | . | |||
3. **Indentation.** If a sequence of lines *Ls* constitutes a list item | 3. **Indentation.** If a sequence of lines *Ls* constitutes a list item | |||
according to rule #1 or #2, then the result of indenting each line | according to rule #1 or #2, then the result of indenting each line | |||
of *L* by 1-3 spaces (the same for each line) also constitutes a | of *L* 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: | |||
. | . | |||
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><p>A paragraph | <li> | |||
<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></li> | </blockquote> | |||
</li> | ||||
</ol> | </ol> | |||
. | . | |||
Indented two spaces: | Indented two spaces: | |||
. | . | |||
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><p>A paragraph | <li> | |||
<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></li> | </blockquote> | |||
</li> | ||||
</ol> | </ol> | |||
. | . | |||
Indented three spaces: | Indented three spaces: | |||
. | . | |||
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><p>A paragraph | <li> | |||
<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></li> | </blockquote> | |||
</li> | ||||
</ol> | </ol> | |||
. | . | |||
Four spaces indent gives a code block: | Four spaces indent gives a code block: | |||
. | . | |||
1. A paragraph | 1. A paragraph | |||
with two lines. | with two lines. | |||
indented code | indented code | |||
skipping to change at line 2933 | skipping to change at line 2970 | |||
. | . | |||
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><p>A paragraph | <li> | |||
<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></li> | </blockquote> | |||
</li> | ||||
</ol> | </ol> | |||
. | . | |||
Indentation can be partially deleted: | Indentation can be partially deleted: | |||
. | . | |||
1. A paragraph | 1. A paragraph | |||
with two lines. | with two lines. | |||
. | . | |||
<ol> | <ol> | |||
skipping to change at line 2963 | skipping to change at line 3002 | |||
. | . | |||
These examples show how laziness can work in nested structures: | These examples show how laziness can work in nested structures: | |||
. | . | |||
> 1. > Blockquote | > 1. > Blockquote | |||
continued here. | continued here. | |||
. | . | |||
<blockquote> | <blockquote> | |||
<ol> | <ol> | |||
<li><blockquote> | <li> | |||
<blockquote> | ||||
<p>Blockquote | <p>Blockquote | |||
continued here.</p> | continued here.</p> | |||
</blockquote></li> | </blockquote> | |||
</li> | ||||
</ol> | </ol> | |||
</blockquote> | </blockquote> | |||
. | . | |||
. | . | |||
> 1. > Blockquote | > 1. > Blockquote | |||
> continued here. | > continued here. | |||
. | . | |||
<blockquote> | <blockquote> | |||
<ol> | <ol> | |||
<li><blockquote> | <li> | |||
<blockquote> | ||||
<p>Blockquote | <p>Blockquote | |||
continued here.</p> | continued here.</p> | |||
</blockquote></li> | </blockquote> | |||
</li> | ||||
</ol> | </ol> | |||
</blockquote> | </blockquote> | |||
. | . | |||
5. **That's all.** Nothing that is not counted as a list item by rules | 5. **That's all.** Nothing that is not counted as a list item by rules | |||
#1--4 counts as a [list item](#list-item). | #1--4 counts as a [list item](#list-item). | |||
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. | |||
skipping to change at line 3005 | skipping to change at line 3048 | |||
- 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></li> | </ul> | |||
</ul></li> | </li> | |||
</ul> | ||||
</li> | ||||
</ul> | </ul> | |||
. | . | |||
One is not enough: | One is not enough: | |||
. | . | |||
- foo | - foo | |||
- bar | - bar | |||
- baz | - baz | |||
. | . | |||
skipping to change at line 3034 | skipping to change at line 3079 | |||
Here we need four, because the list marker is wider: | Here we need four, because the list marker is wider: | |||
. | . | |||
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></li> | </ul> | |||
</li> | ||||
</ol> | </ol> | |||
. | . | |||
Three is not enough: | Three is not enough: | |||
. | . | |||
10) foo | 10) foo | |||
- bar | - bar | |||
. | . | |||
<ol start="10"> | <ol start="10"> | |||
skipping to change at line 3058 | skipping to change at line 3104 | |||
<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: | |||
. | . | |||
- - foo | - - foo | |||
. | . | |||
<ul> | <ul> | |||
<li><ul> | <li> | |||
<ul> | ||||
<li>foo</li> | <li>foo</li> | |||
</ul></li> | </ul> | |||
</li> | ||||
</ul> | </ul> | |||
. | . | |||
. | . | |||
1. - 2. foo | 1. - 2. foo | |||
. | . | |||
<ol> | <ol> | |||
<li><ul> | <li> | |||
<li><ol start="2"> | <ul> | |||
<li> | ||||
<ol start="2"> | ||||
<li>foo</li> | <li>foo</li> | |||
</ol></li> | </ol> | |||
</ul></li> | </li> | |||
</ul> | ||||
</li> | ||||
</ol> | </ol> | |||
. | . | |||
A list item may be empty: | A list item may be empty: | |||
. | . | |||
- foo | - foo | |||
- | - | |||
- bar | - bar | |||
. | . | |||
skipping to change at line 3107 | skipping to change at line 3159 | |||
A list item can contain a header: | A list item can contain a header: | |||
. | . | |||
- # Foo | - # Foo | |||
- Bar | - Bar | |||
--- | --- | |||
baz | baz | |||
. | . | |||
<ul> | <ul> | |||
<li><h1>Foo</h1></li> | <li> | |||
<li><h2>Bar</h2> | <h1>Foo</h1> | |||
<p>baz</p></li> | </li> | |||
<li> | ||||
<h2>Bar</h2> | ||||
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." | |||
skipping to change at line 3204 | skipping to change at line 3259 | |||
<p>bar</p> | <p>bar</p> | |||
<ul> | <ul> | |||
<li>baz</li> | <li>baz</li> | |||
</ul> | </ul> | |||
``` | ``` | |||
as the four-space rule demands, rather than a single list, | as the four-space rule demands, rather than a single list, | |||
``` html | ``` html | |||
<ul> | <ul> | |||
<li><p>foo</p> | <li> | |||
<p>foo</p> | ||||
<p>bar</p> | <p>bar</p> | |||
<ul> | <ul> | |||
<li>baz</li> | <li>baz</li> | |||
</ul></li> | </ul> | |||
</li> | ||||
</ul> | </ul> | |||
``` | ``` | |||
The choice of four spaces is arbitrary. It can be learned, but it is | The choice of four spaces is arbitrary. It can be learned, but it is | |||
not likely to be guessed, and it trips up beginners regularly. | not likely to be guessed, and it trips up beginners regularly. | |||
Would it help to adopt a two-space rule? The problem is that such | Would it help to adopt a two-space rule? The problem is that such | |||
a rule, together with the rule allowing 1--3 spaces indentation of the | a rule, together with the rule allowing 1--3 spaces indentation of the | |||
initial list marker, allows text that is indented *less than* the | initial list marker, allows text that is indented *less than* the | |||
original list marker to be included in the list item. For example, | original list marker to be included in the list item. For example, | |||
skipping to change at line 3231 | skipping to change at line 3288 | |||
``` markdown | ``` markdown | |||
- one | - one | |||
two | two | |||
``` | ``` | |||
as a single list item, with `two` a continuation paragraph: | as a single list item, with `two` a continuation paragraph: | |||
``` html | ``` html | |||
<ul> | <ul> | |||
<li><p>one</p> | <li> | |||
<p>two</p></li> | <p>one</p> | |||
<p>two</p> | ||||
</li> | ||||
</ul> | </ul> | |||
``` | ``` | |||
and similarly | and similarly | |||
``` markdown | ``` markdown | |||
> - one | > - one | |||
> | > | |||
> two | > two | |||
``` | ``` | |||
as | as | |||
``` html | ``` html | |||
<blockquote> | <blockquote> | |||
<ul> | <ul> | |||
<li><p>one</p> | <li> | |||
<p>two</p></li> | <p>one</p> | |||
<p>two</p> | ||||
</li> | ||||
</ul> | </ul> | |||
</blockquote> | </blockquote> | |||
``` | ``` | |||
This is extremely unintuitive. | This is extremely unintuitive. | |||
Rather than requiring a fixed indent from the margin, we could require | Rather than requiring a fixed indent from the margin, we could require | |||
a fixed indent (say, two spaces, or even one space) from the list marker (which | a fixed indent (say, two spaces, or even one space) from the list marker (which | |||
may itself be indented). This proposal would remove the last anomaly | may itself be indented). This proposal would remove the last anomaly | |||
discussed. Unlike the spec presented above, it would count the following | discussed. Unlike the spec presented above, it would count the following | |||
skipping to change at line 3447 | skipping to change at line 3508 | |||
a list: | a list: | |||
. | . | |||
- foo | - foo | |||
- bar | - bar | |||
- baz | - baz | |||
. | . | |||
<ul> | <ul> | |||
<li><p>foo</p></li> | <li> | |||
<li><p>bar</p></li> | <p>foo</p> | |||
</li> | ||||
<li> | ||||
<p>bar</p> | ||||
</li> | ||||
</ul> | </ul> | |||
<ul> | <ul> | |||
<li>baz</li> | <li>baz</li> | |||
</ul> | </ul> | |||
. | . | |||
As illustrated above in the section on [list items](#list-item), | As illustrated above in the section on [list items](#list-item), | |||
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: | |||
skipping to change at line 3489 | skipping to change at line 3554 | |||
- 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></li> | </ul> | |||
</ul></li> | </li> | |||
</ul> | ||||
</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: | |||
skipping to change at line 3528 | skipping to change at line 3595 | |||
. | . | |||
- foo | - foo | |||
notcode | notcode | |||
- foo | - foo | |||
code | code | |||
. | . | |||
<ul> | <ul> | |||
<li><p>foo</p> | <li> | |||
<p>notcode</p></li> | <p>foo</p> | |||
<li><p>foo</p></li> | <p>notcode</p> | |||
</li> | ||||
<li> | ||||
<p>foo</p> | ||||
</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: | |||
skipping to change at line 3571 | skipping to change at line 3642 | |||
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: | |||
. | . | |||
- a | - a | |||
- b | - b | |||
- c | - c | |||
. | . | |||
<ul> | <ul> | |||
<li><p>a</p></li> | <li> | |||
<li><p>b</p></li> | <p>a</p> | |||
<li><p>c</p></li> | </li> | |||
<li> | ||||
<p>b</p> | ||||
</li> | ||||
<li> | ||||
<p>c</p> | ||||
</li> | ||||
</ul> | </ul> | |||
. | . | |||
So is this, with a empty second item: | So is this, with a empty second item: | |||
. | . | |||
* a | * a | |||
* | * | |||
* c | * c | |||
. | . | |||
<ul> | <ul> | |||
<li><p>a</p></li> | <li> | |||
<p>a</p> | ||||
</li> | ||||
<li></li> | <li></li> | |||
<li><p>c</p></li> | <li> | |||
<p>c</p> | ||||
</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: | |||
. | . | |||
- a | - a | |||
- b | - b | |||
c | c | |||
- d | - d | |||
. | . | |||
<ul> | <ul> | |||
<li><p>a</p></li> | <li> | |||
<li><p>b</p> | <p>a</p> | |||
<p>c</p></li> | </li> | |||
<li><p>d</p></li> | <li> | |||
<p>b</p> | ||||
<p>c</p> | ||||
</li> | ||||
<li> | ||||
<p>d</p> | ||||
</li> | ||||
</ul> | </ul> | |||
. | . | |||
. | . | |||
- a | - a | |||
- b | - b | |||
[ref]: /url | [ref]: /url | |||
- d | - d | |||
. | . | |||
<ul> | <ul> | |||
<li><p>a</p></li> | <li> | |||
<li><p>b</p></li> | <p>a</p> | |||
<li><p>d</p></li> | </li> | |||
<li> | ||||
<p>b</p> | ||||
</li> | ||||
<li> | ||||
<p>d</p> | ||||
</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: | |||
. | . | |||
- a | - a | |||
- ``` | - ``` | |||
b | b | |||
``` | ``` | |||
- c | - c | |||
. | . | |||
<ul> | <ul> | |||
<li>a</li> | <li>a</li> | |||
<li><pre><code>b | <li> | |||
<pre><code>b | ||||
</code></pre></li> | </code></pre> | |||
</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: | |||
. | . | |||
- a | - a | |||
- b | - b | |||
c | c | |||
- d | - d | |||
. | . | |||
<ul> | <ul> | |||
<li>a | <li>a | |||
<ul> | <ul> | |||
<li><p>b</p> | <li> | |||
<p>c</p></li> | <p>b</p> | |||
</ul></li> | <p>c</p> | |||
</li> | ||||
</ul> | ||||
</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: | |||
. | . | |||
* a | * a | |||
> b | > b | |||
> | > | |||
* c | * c | |||
. | . | |||
<ul> | <ul> | |||
<li>a | <li>a | |||
<blockquote> | <blockquote> | |||
<p>b</p> | <p>b</p> | |||
</blockquote></li> | </blockquote> | |||
</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: | |||
. | . | |||
- a | - a | |||
> b | > b | |||
skipping to change at line 3700 | skipping to change at line 3799 | |||
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></li> | </code></pre> | |||
</li> | ||||
<li>d</li> | <li>d</li> | |||
</ul> | </ul> | |||
. | . | |||
A single-paragraph list is tight: | A single-paragraph list is tight: | |||
. | . | |||
- a | - a | |||
. | . | |||
<ul> | <ul> | |||
skipping to change at line 3723 | skipping to change at line 3823 | |||
. | . | |||
. | . | |||
- a | - a | |||
- b | - b | |||
. | . | |||
<ul> | <ul> | |||
<li>a | <li>a | |||
<ul> | <ul> | |||
<li>b</li> | <li>b</li> | |||
</ul></li> | </ul> | |||
</li> | ||||
</ul> | </ul> | |||
. | . | |||
Here the outer list is loose, the inner list tight: | Here the outer list is loose, the inner list tight: | |||
. | . | |||
* foo | * foo | |||
* bar | * bar | |||
baz | baz | |||
. | . | |||
<ul> | <ul> | |||
<li><p>foo</p> | <li> | |||
<p>foo</p> | ||||
<ul> | <ul> | |||
<li>bar</li> | <li>bar</li> | |||
</ul> | </ul> | |||
<p>baz</p></li> | <p>baz</p> | |||
</li> | ||||
</ul> | </ul> | |||
. | . | |||
. | . | |||
- a | - a | |||
- b | - b | |||
- c | - c | |||
- d | - d | |||
- e | - e | |||
- f | - f | |||
. | . | |||
<ul> | <ul> | |||
<li><p>a</p> | <li> | |||
<p>a</p> | ||||
<ul> | <ul> | |||
<li>b</li> | <li>b</li> | |||
<li>c</li> | <li>c</li> | |||
</ul></li> | </ul> | |||
<li><p>d</p> | </li> | |||
<li> | ||||
<p>d</p> | ||||
<ul> | <ul> | |||
<li>e</li> | <li>e</li> | |||
<li>f</li> | <li>f</li> | |||
</ul></li> | </ul> | |||
</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 | |||
. | . | |||
skipping to change at line 5766 | skipping to change at line 5873 | |||
The link labels are case-insensitive: | The link labels are case-insensitive: | |||
. | . | |||
[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: | ||||
. | ||||
[foo] bar | ||||
[foo]: /url | ||||
. | ||||
<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: | |||
. | . | |||
\[foo] | \[foo] | |||
[foo]: /url "title" | [foo]: /url "title" | |||
. | . | |||
<p>[foo]</p> | <p>[foo]</p> | |||
. | . | |||
skipping to change at line 6600 | skipping to change at line 6717 | |||
<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. | |||
## Strings | ## 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 string content. | be parsed as plain textual content. | |||
. | . | |||
hello $.;'there | hello $.;'there | |||
. | . | |||
<p>hello $.;'there</p> | <p>hello $.;'there</p> | |||
. | . | |||
. | . | |||
Foo χρῆν | Foo χρῆν | |||
. | . | |||
End of changes. 69 change blocks. | ||||
95 lines changed or deleted | 212 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/ |