--- title: CommonMark Spec author: John MacFarlane version: 0.23 date: 2015-12-29 license: '[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)' ... # Introduction ## What is Markdown? Markdown is a plain text format for writing structured documents, based on conventions used for indicating formatting in email and usenet posts. It was developed in 2004 by John Gruber, who wrote the first Markdown-to-HTML converter in perl, and it soon became widely used in websites. By 2014 there were dozens of implementations in many languages. Some of them extended basic Markdown syntax with conventions for footnotes, definition lists, tables, and other constructs, and some allowed output not just in HTML but in LaTeX and many other formats. ## Why is a spec needed? John Gruber's [canonical description of Markdown's syntax](http://daringfireball.net/projects/markdown/syntax) does not specify the syntax unambiguously. Here are some examples of questions it does not answer: 1. How much indentation is needed for a sublist? The spec says that continuation paragraphs need to be indented four spaces, but is not fully explicit about sublists. It is natural to think that they, too, must be indented four spaces, but `Markdown.pl` does not require that. This is hardly a "corner case," and divergences between implementations on this issue often lead to surprises for users in real documents. (See [this comment by John Gruber](http://article.gmane.org/gmane.text.markdown.general/1997).) 2. Is a blank line needed before a block quote or heading? Most implementations do not require the blank line. However, this can lead to unexpected results in hard-wrapped text, and also to ambiguities in parsing (note that some implementations put the heading inside the blockquote, while others do not). (John Gruber has also spoken [in favor of requiring the blank lines](http://article.gmane.org/gmane.text.markdown.general/2146).) 3. Is a blank line needed before an indented code block? (`Markdown.pl` requires it, but this is not mentioned in the documentation, and some implementations do not require it.) ``` markdown paragraph code? ``` 4. What is the exact rule for determining when list items get wrapped in `
` tags? Can a list be partially "loose" and partially "tight"? What should we do with a list like this? ``` markdown 1. one 2. two 3. three ``` Or this? ``` markdown 1. one - a - b 2. two ``` (There are some relevant comments by John Gruber [here](http://article.gmane.org/gmane.text.markdown.general/2554).) 5. Can list markers be indented? Can ordered list markers be right-aligned? ``` markdown 8. item 1 9. item 2 10. item 2a ``` 6. Is this one list with a thematic break in its second item, or two lists separated by a thematic break? ``` markdown * a * * * * * * b ``` 7. When list markers change from numbers to bullets, do we have two lists or one? (The Markdown syntax description suggests two, but the perl scripts and many other implementations produce one.) ``` markdown 1. fee 2. fie - foe - fum ``` 8. What are the precedence rules for the markers of inline structure? For example, is the following a valid link, or does the code span take precedence ? ``` markdown [a backtick (`)](/url) and [another backtick (`)](/url). ``` 9. What are the precedence rules for markers of emphasis and strong emphasis? For example, how should the following be parsed? ``` markdown *foo *bar* baz* ``` 10. What are the precedence rules between block-level and inline-level structure? For example, how should the following be parsed? ``` markdown - `a long code span can contain a hyphen like this - and it can screw things up` ``` 11. Can list items include section headings? (`Markdown.pl` does not allow this, but does allow blockquotes to include headings.) ``` markdown - # Heading ``` 12. Can list items be empty? ``` markdown * a * * b ``` 13. Can link references be defined inside block quotes or list items? ``` markdown > Blockquote [foo]. > > [foo]: /url ``` 14. If there are multiple definitions for the same reference, which takes precedence? ``` markdown [foo]: /url1 [foo]: /url2 [foo][] ``` In the absence of a spec, early implementers consulted `Markdown.pl` to resolve these ambiguities. But `Markdown.pl` was quite buggy, and gave manifestly bad results in many cases, so it was not a satisfactory replacement for a spec. Because there is no unambiguous spec, implementations have diverged considerably. As a result, users are often surprised to find that a document that renders one way on one system (say, a github wiki) renders differently on another (say, converting to docbook using pandoc). To make matters worse, because nothing in Markdown counts as a "syntax error," the divergence often isn't discovered right away. ## About this document This document attempts to specify Markdown syntax unambiguously. It contains many examples with side-by-side Markdown and HTML. These are intended to double as conformance tests. An accompanying script `spec_tests.py` can be used to run the tests against any Markdown program: python test/spec_tests.py --spec spec.txt --program PROGRAM Since this document describes how Markdown is to be parsed into 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 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 an implementation without writing an abstract syntax tree renderer. This document is generated from a text file, `spec.txt`, written 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 HTML or CommonMark (which can then be converted into other formats). In the examples, the `→` character is used to represent tabs. # Preliminaries ## Characters and lines Any sequence of [character]s is a valid CommonMark document. A [character](@character) is a Unicode code point. Although some code points (for example, combining accents) do not correspond to characters in an intuitive sense, all code points count as characters for purposes of this spec. 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 to a certain encoding. A [line](@line) is a sequence of zero or more [character]s other than newline (`U+000A`) or carriage return (`U+000D`), followed by a [line ending] or by the end of file. A [line ending](@line-ending) is a newline (`U+000A`), a carriage return (`U+000D`) not followed by a newline, or a carriage return and a following newline. A line containing no characters, or a line containing only spaces (`U+0020`) or tabs (`U+0009`), is called a [blank line](@blank-line). The following definitions of character classes will be used in this spec: A [whitespace character](@whitespace-character) is a space (`U+0020`), tab (`U+0009`), newline (`U+000A`), line tabulation (`U+000B`), form feed (`U+000C`), or carriage return (`U+000D`). [Whitespace](@whitespace) is a sequence of one or more [whitespace character]s. A [Unicode whitespace character](@unicode-whitespace-character) is any code point in the Unicode `Zs` class, or a tab (`U+0009`), carriage return (`U+000D`), newline (`U+000A`), or form feed (`U+000C`). [Unicode whitespace](@unicode-whitespace) is a sequence of one or more [Unicode whitespace character]s. A [space](@space) is `U+0020`. A [non-whitespace character](@non-whitespace-character) is any character that is not a [whitespace character]. An [ASCII punctuation character](@ascii-punctuation-character) is `!`, `"`, `#`, `$`, `%`, `&`, `'`, `(`, `)`, `*`, `+`, `,`, `-`, `.`, `/`, `:`, `;`, `<`, `=`, `>`, `?`, `@`, `[`, `\`, `]`, `^`, `_`, `` ` ``, `{`, `|`, `}`, or `~`. A [punctuation character](@punctuation-character) is an [ASCII punctuation character] or anything in the Unicode classes `Pc`, `Pd`, `Pe`, `Pf`, `Pi`, `Po`, or `Ps`. ## Tabs Tabs in lines are not expanded to [spaces][space]. However, in contexts where indentation is significant for the document's structure, tabs behave as if they were replaced by spaces with a tab stop of 4 characters. . →foo→baz→→bim .
foo→baz→→bim
.
.
→foo→baz→→bim
.
foo→baz→→bim
.
.
a→a
ὐ→a
.
a→a
ὐ→a
.
.
- foo
→bar
.
foo
bar
. . foo →bar .foo→bar
foo
bar
.
## Insecure characters
For security reasons, the Unicode character `U+0000` must be replaced
with the REPLACEMENT CHARACTER (`U+FFFD`).
# Blocks and inlines
We can think of a document as a sequence of
[blocks](@block)---structural elements like paragraphs, block
quotations, lists, headings, rules, and code blocks. Some blocks (like
block quotes and list items) contain other blocks; others (like
headings and paragraphs) contain [inline](@inline) content---text,
links, emphasized text, images, code, and so on.
## Precedence
Indicators of block structure always take precedence over indicators
of inline structure. So, for example, the following is a list with
two items, not a list with one item containing a code span:
.
- `one
- two`
.
+++
. . === .===
. Not enough characters: . -- ** __ .-- ** __
. One to three spaces indent are allowed: . *** *** *** .***
.
.
Foo
***
.
Foo ***
. More than three characters may be used: . _____________________________________ ._ _ _ _ a
a------
---a---
. It is required that all of the [non-whitespace character]s be the same. So, this is not a thematic break: . *-* .-
. Thematic breaks do not need blank lines before or after: . - foo *** - bar .Foo
bar
. 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 heading], the interpretation as a [setext heading] takes precedence. Thus, for example, this is a setext heading, not a paragraph followed by a thematic break: . Foo --- bar .bar
. When both a thematic break and a list item are possible interpretations of a line, the thematic break takes precedence: . * Foo * * * * Bar .####### foo
. At least one space is required between the `#` characters and the heading's contents, unless the heading is empty. Note that many implementations currently do not require the space. However, the space was required by the [original ATX implementation](http://www.aaronsw.com/2002/atx/atx.py), and it helps prevent things like the following from being parsed as headings: . #5 bolt #hashtag .#5 bolt
#hashtag
. A tab will not work: . #→foo .#→foo
. This is not a heading, because the first `#` is escaped: . \## foo .## foo
. Contents are parsed as inlines: . # foo *bar* \*baz\* .# foo
.
.
foo
# bar
.
foo # bar
. A closing sequence of `#` characters is optional: . ## foo ## ### bar ### .Foo bar
Bar foo
. ATX headings can be empty: . ## # ### ### . . ## Setext headings A [setext heading](@setext-heading) consists of a line of text, containing at least one [non-whitespace character], with no more than 3 spaces indentation, followed by a [setext heading underline]. The line of text must be one that, were it not followed by the setext heading underline, would be interpreted as part of a paragraph: it cannot be interpretable as a [code fence], [ATX heading][ATX headings], [block quote][block quotes], [thematic break][thematic breaks], [list item][list items], or [HTML block][HTML blocks]. A [setext heading underline](@setext-heading-underline) is a sequence of `=` characters or a sequence of `-` characters, with no more than 3 spaces indentation and any number of trailing spaces. If a line containing a single `-` can be interpreted as an empty [list items], it should be interpreted this way and not as a [setext heading underline]. The heading is a level 1 heading if `=` characters are used in the [setext heading underline], and a level 2 heading if `-` characters are used. The contents of the heading are the result of parsing the first line as Markdown inline content. In general, a setext heading need not be preceded or followed by a blank line. However, it cannot interrupt a paragraph, so when a setext heading comes after a paragraph, a blank line is needed between them. Simple examples: . Foo *bar* ========= Foo *bar* --------- .Foo
---
Foo
Foo ---
. The setext heading underline cannot contain internal spaces: . Foo = = Foo --- - .Foo = =
Foo
`
of dashes"/>
. The setext heading underline cannot be a [lazy continuation line] in a list item or block quote: . > Foo --- .Foo
Foo Bar
Foo Bar ===
. But in general a blank line is not required before or after: . --- Foo --- Bar --- Baz .Baz
. Setext headings cannot be empty: . ==== .====
. Setext heading text lines must not be interpretable as block constructs other than paragraphs. So, the line of dashes in these examples gets interpreted as a thematic break: . --- --- .foo
foo
a simple
indented code block
.
If there is any ambiguity between an interpretation of indentation
as a code block and as indicating that material belongs to a [list
item][list items], the list item interpretation takes precedence:
.
- foo
bar
.
foo
bar
foo
<a/>
*hi*
- one
.
Here we have three chunks separated by blank lines:
.
chunk1
chunk2
chunk3
.
chunk1
chunk2
chunk3
.
Any initial spaces beyond four will be included in the content, even
in interior blank lines:
.
chunk1
chunk2
.
chunk1
chunk2
.
An indented code block cannot interrupt a paragraph. (This
allows hanging indents and the like.)
.
Foo
bar
.
Foo bar
. However, any non-blank line with fewer than four leading spaces ends the code block immediately. So a paragraph may occur immediately after indented code: . foo bar .foo
bar
. And indented code can occur immediately before and after other kinds of blocks: . # Heading foo Heading ------ foo ---- .foo
foo
foo
bar
.
Blank lines preceding or following an indented code block
are not included in it:
.
foo
.
foo
.
Trailing spaces are included in the code block's content:
.
foo
.
foo
.
## Fenced code blocks
A [code fence](@code-fence) is a sequence
of at least three consecutive backtick characters (`` ` ``) or
tildes (`~`). (Tildes and backticks cannot be mixed.)
A [fenced code block](@fenced-code-block)
begins with a code fence, indented no more than three spaces.
The line with the opening code fence may optionally contain some text
following the code fence; this is trimmed of leading and trailing
spaces and called the [info string](@info-string).
The [info string] may not contain any backtick
characters. (The reason for this restriction is that otherwise
some inline code would be incorrectly interpreted as the
beginning of a fenced code block.)
The content of the code block consists of all subsequent lines, until
a closing [code fence] of the same type as the code block
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
indented N spaces, then up to N spaces of indentation are removed from
each line of the content (if present). (If a content line is not
indented, it is preserved unchanged. If it is indented less than N
spaces, all of the indentation is removed.)
The closing code fence may be indented up to three spaces, and may be
followed only by spaces, which are ignored. If the end of the
containing block (or document) is reached and no closing code fence
has been found, the code block contains all of the lines after the
opening code fence until the end of the containing block (or
document). (An alternative spec would require backtracking in the
event that a closing code fence is not found. But this makes parsing
much less efficient, and there seems to be no real down side to the
behavior described here.)
A fenced code block may interrupt a paragraph, and does not require
a blank line either before or after.
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
specify the language of the code sample, and rendered in the `class`
attribute of the `code` tag. However, this spec does not mandate any
particular treatment of the [info string].
Here is a simple example with backticks:
.
```
<
>
```
.
<
>
.
With tildes:
.
~~~
<
>
~~~
.
<
>
.
The closing code fence must use the same character as the opening
fence:
.
```
aaa
~~~
```
.
aaa
~~~
.
.
~~~
aaa
```
~~~
.
aaa
```
.
The closing code fence must be at least as long as the opening fence:
.
````
aaa
```
``````
.
aaa
```
.
.
~~~~
aaa
~~~
~~~~
.
aaa
~~~
.
Unclosed code blocks are closed by the end of the document
(or the enclosing [block quote][block quotes] or [list item][list items]):
.
```
.
.
.
`````
```
aaa
.
```
aaa
.
.
> ```
> aaa
bbb
.
aaa
bbb
. A code block can have all empty lines as its content: . ``` ``` .
.
A code block can be empty:
.
```
```
.
.
Fences can be indented. If the opening fence is indented,
content lines will have equivalent opening indentation removed,
if present:
.
```
aaa
aaa
```
.
aaa
aaa
.
.
```
aaa
aaa
aaa
```
.
aaa
aaa
aaa
.
.
```
aaa
aaa
aaa
```
.
aaa
aaa
aaa
.
Four spaces indentation produces an indented code block:
.
```
aaa
```
.
```
aaa
```
.
Closing fences may be indented by 0-3 spaces, and their indentation
need not match that of the opening fence:
.
```
aaa
```
.
aaa
.
.
```
aaa
```
.
aaa
.
This is not a closing fence, because it is indented 4 spaces:
.
```
aaa
```
.
aaa
```
.
Code fences (opening and closing) cannot contain internal spaces:
.
``` ```
aaa
.
aaa
aaa
~~~ ~~
.
Fenced code blocks can interrupt paragraphs, and can be followed
directly by paragraphs, without a blank line between:
.
foo
```
bar
```
baz
.
foo
bar
baz
. Other blocks can also occur before and after fenced code blocks without an intervening blank line: . foo --- ~~~ bar ~~~ # baz .bar
def foo(x)
return 3
end
.
.
~~~~ ruby startline=3 $%@#$
def foo(x)
return 3
end
~~~~~~~
.
def foo(x)
return 3
end
.
.
````;
````
.
.
[Info string]s for backtick code blocks cannot contain backticks:
.
``` aa ```
foo
.
aa
foo
``` aaa
.
## HTML blocks
An [HTML block](@html-block) is a group of lines that is treated
as raw HTML (and will not be escaped in HTML output).
There are seven kinds of [HTML block], which can be defined
by their start and end conditions. The block begins with a line that
meets a [start condition](@start-condition) (after up to three spaces
optional indentation). It ends with the first subsequent line that
meets a matching [end condition](@end-condition), or the last line of
the document, if no line is encountered that meets the
[end condition]. If the first line meets both the [start condition]
and the [end condition], the block will contain just that line.
1. **Start condition:** line begins with the string ``, ``, or `` (case-insensitive; it
need not match the start tag).
2. **Start condition:** line begins with the string ``.
3. **Start condition:** line begins with the string ``.\
**End condition:** line contains the string `?>`.
4. **Start condition:** line begins with the string ``.
5. **Start condition:** line begins with the string
``.
6. **Start condition:** line begins the string `<` or ``
followed by one of the strings (case-insensitive) `address`,
`article`, `aside`, `base`, `basefont`, `blockquote`, `body`,
`caption`, `center`, `col`, `colgroup`, `dd`, `details`, `dialog`,
`dir`, `div`, `dl`, `dt`, `fieldset`, `figcaption`, `figure`,
`footer`, `form`, `frame`, `frameset`, `h1`, `head`, `header`, `hr`,
`html`, `iframe`, `legend`, `li`, `link`, `main`, `menu`, `menuitem`,
`meta`, `nav`, `noframes`, `ol`, `optgroup`, `option`, `p`, `param`,
`section`, `source`, `summary`, `table`, `tbody`, `td`,
`tfoot`, `th`, `thead`, `title`, `tr`, `track`, `ul`, followed
by [whitespace], the end of the line, the string `>`, or
the string `/>`.\
**End condition:** line is followed by a [blank line].
7. **Start condition:** line begins with a complete [open tag]
or [closing tag] (with any [tag name] other than `script`,
`style`, or `pre`) followed only by [whitespace]
or the end of the line.\
**End condition:** line is followed by a [blank line].
All types of [HTML blocks] except type 7 may interrupt
a paragraph. Blocks of type 7 may not interrupt a paragraph.
(This restriction is intended to prevent unwanted interpretation
of long tags inside a wrapped paragraph as starting HTML blocks.)
Some simple examples follow. Here are some basic HTML blocks
of type 6:
.
hi |
hi |
okay.
. . *foo* . Here we have two HTML blocks with a Markdown paragraph between them: .Markdown
bar
. A partial tag need not even be completed (garbage in, garbage out): . . . .foo |
foo |
foo
foo
import Text.HTML.TagSoup
main :: IO ()
main = print $ parseTags tags
.
import Text.HTML.TagSoup
main :: IO ()
main = print $ parseTags tags
.
A script tag (type 1):
.
.
.
A style tag (type 1):
.
.
.
If there is no matching end tag, the block will end at the
end of the document (or the enclosing [block quote][block quotes]
or [list item][list items]):
.
*foo*
.
foo
. . *bar* *baz* . *bar*baz
. Note that anything on the last line after the end tag will be included in the [HTML block]: . 1. *bar* . 1. *bar* . A comment (type 2): . . . A processing instruction (type 3): . '; ?> . '; ?> . A declaration (type 4): . . . CDATA (type 5): . . . The opening tag can be indented 1-3 spaces, but not 4: . .<!-- foo -->
.
.
<div>
.
An HTML block of types 1--6 can interrupt a paragraph, and need not be
preceded by a blank line.
.
Foo
Foo
Foo baz
. This rule differs from John Gruber's original Markdown syntax specification, which says: > The only restrictions are that block-level HTML elements — > e.g. `