2017-07-21 05:44:55 +08:00
|
|
|
|
---
|
|
|
|
|
title: CommonMark Spec
|
|
|
|
|
author: John MacFarlane
|
2019-10-08 19:00:22 +08:00
|
|
|
|
version: 0.29
|
|
|
|
|
date: '2019-04-06'
|
2017-07-21 05:44:55 +08:00
|
|
|
|
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,
|
2018-03-08 09:19:32 +08:00
|
|
|
|
based on conventions for indicating formatting in email
|
|
|
|
|
and usenet posts. It was developed by John Gruber (with
|
|
|
|
|
help from Aaron Swartz) and released in 2004 in the form of a
|
|
|
|
|
[syntax description](http://daringfireball.net/projects/markdown/syntax)
|
|
|
|
|
and a Perl script (`Markdown.pl`) for converting Markdown to
|
|
|
|
|
HTML. In the next decade, dozens of implementations were
|
2017-07-21 05:44:55 +08:00
|
|
|
|
developed in many languages. Some extended the original
|
|
|
|
|
Markdown syntax with conventions for footnotes, tables, and
|
|
|
|
|
other document elements. Some allowed Markdown documents to be
|
|
|
|
|
rendered in formats other than HTML. Websites like Reddit,
|
|
|
|
|
StackOverflow, and GitHub had millions of people using Markdown.
|
|
|
|
|
And Markdown started to be used beyond the web, to author books,
|
|
|
|
|
articles, slide shows, letters, and lecture notes.
|
|
|
|
|
|
|
|
|
|
What distinguishes Markdown from many other lightweight markup
|
|
|
|
|
syntaxes, which are often easier to write, is its readability.
|
|
|
|
|
As Gruber writes:
|
|
|
|
|
|
|
|
|
|
> The overriding design goal for Markdown's formatting syntax is
|
|
|
|
|
> to make it as readable as possible. The idea is that a
|
|
|
|
|
> Markdown-formatted document should be publishable as-is, as
|
|
|
|
|
> plain text, without looking like it's been marked up with tags
|
|
|
|
|
> or formatting instructions.
|
|
|
|
|
> (<http://daringfireball.net/projects/markdown/>)
|
|
|
|
|
|
|
|
|
|
The point can be illustrated by comparing a sample of
|
|
|
|
|
[AsciiDoc](http://www.methods.co.nz/asciidoc/) with
|
|
|
|
|
an equivalent sample of Markdown. Here is a sample of
|
|
|
|
|
AsciiDoc from the AsciiDoc manual:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
1. List item one.
|
|
|
|
|
+
|
|
|
|
|
List item one continued with a second paragraph followed by an
|
|
|
|
|
Indented block.
|
|
|
|
|
+
|
|
|
|
|
.................
|
|
|
|
|
$ ls *.sh
|
|
|
|
|
$ mv *.sh ~/tmp
|
|
|
|
|
.................
|
|
|
|
|
+
|
|
|
|
|
List item continued with a third paragraph.
|
|
|
|
|
|
|
|
|
|
2. List item two continued with an open block.
|
|
|
|
|
+
|
|
|
|
|
--
|
|
|
|
|
This paragraph is part of the preceding list item.
|
|
|
|
|
|
|
|
|
|
a. This list is nested and does not require explicit item
|
|
|
|
|
continuation.
|
|
|
|
|
+
|
|
|
|
|
This paragraph is part of the preceding list item.
|
|
|
|
|
|
|
|
|
|
b. List item b.
|
|
|
|
|
|
|
|
|
|
This paragraph belongs to item two of the outer list.
|
|
|
|
|
--
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
And here is the equivalent in Markdown:
|
|
|
|
|
```
|
|
|
|
|
1. List item one.
|
|
|
|
|
|
|
|
|
|
List item one continued with a second paragraph followed by an
|
|
|
|
|
Indented block.
|
|
|
|
|
|
|
|
|
|
$ ls *.sh
|
|
|
|
|
$ mv *.sh ~/tmp
|
|
|
|
|
|
|
|
|
|
List item continued with a third paragraph.
|
|
|
|
|
|
|
|
|
|
2. List item two continued with an open block.
|
|
|
|
|
|
|
|
|
|
This paragraph is part of the preceding list item.
|
|
|
|
|
|
|
|
|
|
1. This list is nested and does not require explicit item continuation.
|
|
|
|
|
|
|
|
|
|
This paragraph is part of the preceding list item.
|
|
|
|
|
|
|
|
|
|
2. List item b.
|
|
|
|
|
|
|
|
|
|
This paragraph belongs to item two of the outer list.
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The AsciiDoc version is, arguably, easier to write. You don't need
|
|
|
|
|
to worry about indentation. But the Markdown version is much easier
|
|
|
|
|
to read. The nesting of list items is apparent to the eye in the
|
|
|
|
|
source, not just in the processed document.
|
|
|
|
|
|
|
|
|
|
## 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 `<p>` 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
|
2019-10-08 19:00:22 +08:00
|
|
|
|
a document that renders one way on one system (say, a GitHub wiki)
|
2017-07-21 05:44:55 +08:00
|
|
|
|
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 [characters] is a valid CommonMark
|
|
|
|
|
document.
|
|
|
|
|
|
|
|
|
|
A [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 [characters] rather than bytes. A conforming parser may be limited
|
|
|
|
|
to a certain encoding.
|
|
|
|
|
|
|
|
|
|
A [line](@) is a sequence of zero or more [characters]
|
|
|
|
|
other than newline (`U+000A`) or carriage return (`U+000D`),
|
|
|
|
|
followed by a [line ending] or by the end of file.
|
|
|
|
|
|
|
|
|
|
A [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](@).
|
|
|
|
|
|
|
|
|
|
The following definitions of character classes will be used in this spec:
|
|
|
|
|
|
|
|
|
|
A [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](@) is a sequence of one or more [whitespace
|
|
|
|
|
characters].
|
|
|
|
|
|
|
|
|
|
A [Unicode whitespace character](@) is
|
2018-03-08 09:19:32 +08:00
|
|
|
|
any code point in the Unicode `Zs` general category, or a tab (`U+0009`),
|
2017-07-21 05:44:55 +08:00
|
|
|
|
carriage return (`U+000D`), newline (`U+000A`), or form feed
|
|
|
|
|
(`U+000C`).
|
|
|
|
|
|
|
|
|
|
[Unicode whitespace](@) is a sequence of one
|
|
|
|
|
or more [Unicode whitespace characters].
|
|
|
|
|
|
|
|
|
|
A [space](@) is `U+0020`.
|
|
|
|
|
|
|
|
|
|
A [non-whitespace character](@) is any character
|
|
|
|
|
that is not a [whitespace character].
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
An [ASCII control character](@) is a character between `U+0000–1F` (both
|
|
|
|
|
including) or `U+007F`.
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
An [ASCII punctuation character](@)
|
|
|
|
|
is `!`, `"`, `#`, `$`, `%`, `&`, `'`, `(`, `)`,
|
2019-10-08 19:00:22 +08:00
|
|
|
|
`*`, `+`, `,`, `-`, `.`, `/` (U+0021–2F),
|
|
|
|
|
`:`, `;`, `<`, `=`, `>`, `?`, `@` (U+003A–0040),
|
|
|
|
|
`[`, `\`, `]`, `^`, `_`, `` ` `` (U+005B–0060),
|
|
|
|
|
`{`, `|`, `}`, or `~` (U+007B–007E).
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
A [punctuation character](@) is an [ASCII
|
|
|
|
|
punctuation character] or anything in
|
2018-03-08 09:19:32 +08:00
|
|
|
|
the general Unicode categories `Pc`, `Pd`, `Pe`, `Pf`, `Pi`, `Po`, or `Ps`.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
## Tabs
|
|
|
|
|
|
|
|
|
|
Tabs in lines are not expanded to [spaces]. However,
|
|
|
|
|
in contexts where whitespace helps to define block structure,
|
|
|
|
|
tabs behave as if they were replaced by spaces with a tab stop
|
|
|
|
|
of 4 characters.
|
|
|
|
|
|
|
|
|
|
Thus, for example, a tab can be used instead of four spaces
|
|
|
|
|
in an indented code block. (Note, however, that internal
|
|
|
|
|
tabs are passed through as literal tabs, not expanded to
|
|
|
|
|
spaces.)
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
→foo→baz→→bim
|
|
|
|
|
.
|
|
|
|
|
<pre><code>foo→baz→→bim
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
→foo→baz→→bim
|
|
|
|
|
.
|
|
|
|
|
<pre><code>foo→baz→→bim
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
a→a
|
|
|
|
|
ὐ→a
|
|
|
|
|
.
|
|
|
|
|
<pre><code>a→a
|
|
|
|
|
ὐ→a
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
In the following example, a continuation paragraph of a list
|
|
|
|
|
item is indented with a tab; this has exactly the same effect
|
|
|
|
|
as indentation with four spaces would:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- foo
|
|
|
|
|
|
|
|
|
|
→bar
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- foo
|
|
|
|
|
|
|
|
|
|
→→bar
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<pre><code> bar
|
|
|
|
|
</code></pre>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
Normally the `>` that begins a block quote may be followed
|
|
|
|
|
optionally by a space, which is not considered part of the
|
|
|
|
|
content. In the following case `>` is followed by a tab,
|
2018-03-08 09:19:32 +08:00
|
|
|
|
which is treated as if it were expanded into three spaces.
|
|
|
|
|
Since one of these spaces is considered part of the
|
2017-07-21 05:44:55 +08:00
|
|
|
|
delimiter, `foo` is considered to be indented six spaces
|
|
|
|
|
inside the block quote context, so we get an indented
|
|
|
|
|
code block starting with two spaces.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
>→→foo
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<pre><code> foo
|
|
|
|
|
</code></pre>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
-→→foo
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<pre><code> foo
|
|
|
|
|
</code></pre>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo
|
|
|
|
|
→bar
|
|
|
|
|
.
|
|
|
|
|
<pre><code>foo
|
|
|
|
|
bar
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- foo
|
|
|
|
|
- bar
|
|
|
|
|
→ - baz
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>foo
|
|
|
|
|
<ul>
|
|
|
|
|
<li>bar
|
|
|
|
|
<ul>
|
|
|
|
|
<li>baz</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
#→Foo
|
|
|
|
|
.
|
|
|
|
|
<h1>Foo</h1>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*→*→*→
|
|
|
|
|
.
|
|
|
|
|
<hr />
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Insecure characters
|
|
|
|
|
|
|
|
|
|
For security reasons, the Unicode character `U+0000` must be replaced
|
|
|
|
|
with the REPLACEMENT CHARACTER (`U+FFFD`).
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
## Backslash escapes
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Any ASCII punctuation character may be backslash-escaped:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
\!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\:\;\<\=\>\?\@\[\\\]\^\_\`\{\|\}\~
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Backslashes before other characters are treated as literal
|
|
|
|
|
backslashes:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
\→\A\a\ \3\φ\«
|
|
|
|
|
.
|
|
|
|
|
<p>\→\A\a\ \3\φ\«</p>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Escaped characters are treated as regular characters and do
|
|
|
|
|
not have their usual Markdown meanings:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
\*not emphasized*
|
|
|
|
|
\<br/> not a tag
|
|
|
|
|
\[not a link](/foo)
|
|
|
|
|
\`not code`
|
|
|
|
|
1\. not a list
|
|
|
|
|
\* not a list
|
|
|
|
|
\# not a heading
|
|
|
|
|
\[foo]: /url "not a reference"
|
|
|
|
|
\ö not a character entity
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>*not emphasized*
|
|
|
|
|
<br/> not a tag
|
|
|
|
|
[not a link](/foo)
|
|
|
|
|
`not code`
|
|
|
|
|
1. not a list
|
|
|
|
|
* not a list
|
|
|
|
|
# not a heading
|
|
|
|
|
[foo]: /url "not a reference"
|
|
|
|
|
&ouml; not a character entity</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
If a backslash is itself escaped, the following character is not:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
\\*emphasis*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>\<em>emphasis</em></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
A backslash at the end of the line is a [hard line break]:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
foo\
|
|
|
|
|
bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>foo<br />
|
|
|
|
|
bar</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Backslash escapes do not work in code blocks, code spans, autolinks, or
|
|
|
|
|
raw HTML:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
`` \[\` ``
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><code>\[\`</code></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
\[\]
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>\[\]
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
~~~
|
|
|
|
|
\[\]
|
|
|
|
|
~~~
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>\[\]
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<http://example.com?find=\*>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><a href="http://example.com?find=%5C*">http://example.com?find=\*</a></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<a href="/bar\/)">
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<a href="/bar\/)">
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
But they work in all other contexts, including URLs and link titles,
|
|
|
|
|
link references, and [info strings] in [fenced code blocks]:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[foo](/bar\* "ti\*tle")
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><a href="/bar*" title="ti*tle">foo</a></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[foo]
|
|
|
|
|
|
|
|
|
|
[foo]: /bar\* "ti\*tle"
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><a href="/bar*" title="ti*tle">foo</a></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
``` foo\+bar
|
|
|
|
|
foo
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code class="language-foo+bar">foo
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
## Entity and numeric character references
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Valid HTML entity references and numeric character references
|
|
|
|
|
can be used in place of the corresponding Unicode character,
|
|
|
|
|
with the following exceptions:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- Entity and character references are not recognized in code
|
|
|
|
|
blocks and code spans.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- Entity and character references cannot stand in place of
|
|
|
|
|
special characters that define structural elements in
|
|
|
|
|
CommonMark. For example, although `*` can be used
|
|
|
|
|
in place of a literal `*` character, `*` cannot replace
|
|
|
|
|
`*` in emphasis delimiters, bullet list markers, or thematic
|
|
|
|
|
breaks.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Conforming CommonMark parsers need not store information about
|
|
|
|
|
whether a particular character was represented in the source
|
|
|
|
|
using a Unicode character or an entity reference.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[Entity references](@) consist of `&` + any of the valid
|
|
|
|
|
HTML5 entity names + `;`. The
|
|
|
|
|
document <https://html.spec.whatwg.org/multipage/entities.json>
|
|
|
|
|
is used as an authoritative source for the valid entity
|
|
|
|
|
references and their corresponding code points.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
& © Æ Ď
|
|
|
|
|
¾ ℋ ⅆ
|
|
|
|
|
∲ ≧̸
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p> & © Æ Ď
|
|
|
|
|
¾ ℋ ⅆ
|
|
|
|
|
∲ ≧̸</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[Decimal numeric character
|
|
|
|
|
references](@)
|
|
|
|
|
consist of `&#` + a string of 1--7 arabic digits + `;`. A
|
|
|
|
|
numeric character reference is parsed as the corresponding
|
|
|
|
|
Unicode character. Invalid Unicode code points will be replaced by
|
|
|
|
|
the REPLACEMENT CHARACTER (`U+FFFD`). For security reasons,
|
|
|
|
|
the code point `U+0000` will also be replaced by `U+FFFD`.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
# Ӓ Ϡ �
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p># Ӓ Ϡ <20></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[Hexadecimal numeric character
|
|
|
|
|
references](@) consist of `&#` +
|
|
|
|
|
either `X` or `x` + a string of 1-6 hexadecimal digits + `;`.
|
|
|
|
|
They too are parsed as the corresponding Unicode character (this
|
|
|
|
|
time specified with a hexadecimal numeral instead of decimal).
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
" ആ ಫ
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>" ആ ಫ</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Here are some nonentities:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
  &x; &#; &#x;
|
|
|
|
|
�
|
|
|
|
|
&#abcdef0;
|
|
|
|
|
&ThisIsNotDefined; &hi?;
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>&nbsp &x; &#; &#x;
|
|
|
|
|
&#87654321;
|
|
|
|
|
&#abcdef0;
|
|
|
|
|
&ThisIsNotDefined; &hi?;</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Although HTML5 does accept some entity references
|
|
|
|
|
without a trailing semicolon (such as `©`), these are not
|
|
|
|
|
recognized here, because it makes the grammar too ambiguous:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
©
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>&copy</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Strings that are not on the list of HTML5 named entities are not
|
|
|
|
|
recognized as entity references either:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
&MadeUpEntity;
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>&MadeUpEntity;</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Entity and numeric character references are recognized in any
|
|
|
|
|
context besides code spans or code blocks, including
|
|
|
|
|
URLs, [link titles], and [fenced code block][] [info strings]:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<a href="öö.html">
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<a href="öö.html">
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo](/föö "föö")
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[foo]
|
|
|
|
|
|
|
|
|
|
[foo]: /föö "föö"
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><a href="/f%C3%B6%C3%B6" title="föö">foo</a></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
``` föö
|
|
|
|
|
foo
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code class="language-föö">foo
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Entity and numeric character references are treated as literal
|
|
|
|
|
text in code spans and code blocks:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
`föö`
|
|
|
|
|
.
|
|
|
|
|
<p><code>f&ouml;&ouml;</code></p>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
föfö
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>f&ouml;f&ouml;
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Entity and numeric character references cannot be used
|
|
|
|
|
in place of symbols indicating structure in CommonMark
|
|
|
|
|
documents.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
*foo*
|
|
|
|
|
*foo*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>*foo*
|
|
|
|
|
<em>foo</em></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
* foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
* foo
|
|
|
|
|
.
|
|
|
|
|
<p>* foo</p>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
foo bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>foo
|
|
|
|
|
|
|
|
|
|
bar</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
	foo
|
|
|
|
|
.
|
|
|
|
|
<p>→foo</p>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[a](url "tit")
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>[a](url "tit")</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
|
|
|
|
|
# Blocks and inlines
|
|
|
|
|
|
|
|
|
|
We can think of a document as a sequence of
|
|
|
|
|
[blocks](@)---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](@) content---text,
|
|
|
|
|
links, emphasized text, images, code spans, 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:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- `one
|
|
|
|
|
- two`
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>`one</li>
|
|
|
|
|
<li>two`</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
This means that parsing can proceed in two steps: first, the block
|
|
|
|
|
structure of the document can be discerned; second, text lines inside
|
|
|
|
|
paragraphs, headings, and other block constructs can be parsed for inline
|
|
|
|
|
structure. The second step requires information about link reference
|
|
|
|
|
definitions that will be available only at the end of the first
|
|
|
|
|
step. Note that the first step requires processing lines in sequence,
|
|
|
|
|
but the second can be parallelized, since the inline parsing of
|
|
|
|
|
one block element does not affect the inline parsing of any other.
|
|
|
|
|
|
|
|
|
|
## Container blocks and leaf blocks
|
|
|
|
|
|
|
|
|
|
We can divide blocks into two types:
|
|
|
|
|
[container blocks](@),
|
|
|
|
|
which can contain other blocks, and [leaf blocks](@),
|
|
|
|
|
which cannot.
|
|
|
|
|
|
|
|
|
|
# Leaf blocks
|
|
|
|
|
|
|
|
|
|
This section describes the different kinds of leaf block that make up a
|
|
|
|
|
Markdown document.
|
|
|
|
|
|
|
|
|
|
## Thematic breaks
|
|
|
|
|
|
|
|
|
|
A line consisting of 0-3 spaces of indentation, followed by a sequence
|
|
|
|
|
of three or more matching `-`, `_`, or `*` characters, each followed
|
|
|
|
|
optionally by any number of spaces or tabs, forms a
|
|
|
|
|
[thematic break](@).
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
***
|
|
|
|
|
---
|
|
|
|
|
___
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<hr />
|
|
|
|
|
<hr />
|
|
|
|
|
<hr />
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Wrong characters:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
+++
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>+++</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
===
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>===</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Not enough characters:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
--
|
|
|
|
|
**
|
|
|
|
|
__
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>--
|
|
|
|
|
**
|
|
|
|
|
__</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
One to three spaces indent are allowed:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
***
|
|
|
|
|
***
|
|
|
|
|
***
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<hr />
|
|
|
|
|
<hr />
|
|
|
|
|
<hr />
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Four spaces is too many:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
***
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>***
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
|
|
|
|
***
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>Foo
|
|
|
|
|
***</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
More than three characters may be used:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
_____________________________________
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<hr />
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Spaces are allowed between the characters:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- - -
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
|
|
|
|
<hr />
|
2019-10-08 19:00:22 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
** * ** * ** * **
|
|
|
|
|
.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
<hr />
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- - - -
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<hr />
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Spaces are allowed at the end:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- - - -
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<hr />
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
However, no other characters may occur in the line:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_ _ _ _ a
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
a------
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
---a---
|
|
|
|
|
.
|
|
|
|
|
<p>_ _ _ _ a</p>
|
|
|
|
|
<p>a------</p>
|
|
|
|
|
<p>---a---</p>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
It is required that all of the [non-whitespace characters] be the same.
|
|
|
|
|
So, this is not a thematic break:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
*-*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><em>-</em></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Thematic breaks do not need blank lines before or after:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- foo
|
|
|
|
|
***
|
|
|
|
|
- bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
</ul>
|
|
|
|
|
<hr />
|
|
|
|
|
<ul>
|
|
|
|
|
<li>bar</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Thematic breaks can interrupt a paragraph:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
Foo
|
2019-10-08 19:00:22 +08:00
|
|
|
|
***
|
|
|
|
|
bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>Foo</p>
|
|
|
|
|
<hr />
|
|
|
|
|
<p>bar</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
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:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
---
|
2019-10-08 19:00:22 +08:00
|
|
|
|
bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
|
|
|
|
<h2>Foo</h2>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>bar</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
When both a thematic break and a list item are possible
|
|
|
|
|
interpretations of a line, the thematic break takes precedence:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
* Foo
|
|
|
|
|
* * *
|
|
|
|
|
* Bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>Foo</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
<hr />
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>Bar</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
If you want a thematic break in a list item, use a different bullet:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- Foo
|
|
|
|
|
- * * *
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>Foo</li>
|
|
|
|
|
<li>
|
|
|
|
|
<hr />
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
## ATX headings
|
|
|
|
|
|
|
|
|
|
An [ATX heading](@)
|
|
|
|
|
consists of a string of characters, parsed as inline content, between an
|
|
|
|
|
opening sequence of 1--6 unescaped `#` characters and an optional
|
|
|
|
|
closing sequence of any number of unescaped `#` characters.
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
heading are stripped of leading and trailing spaces before being parsed
|
|
|
|
|
as inline content. The heading level is equal to the number of `#`
|
|
|
|
|
characters in the opening sequence.
|
|
|
|
|
|
|
|
|
|
Simple headings:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
# foo
|
|
|
|
|
## foo
|
|
|
|
|
### foo
|
|
|
|
|
#### foo
|
|
|
|
|
##### foo
|
|
|
|
|
###### foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h1>foo</h1>
|
|
|
|
|
<h2>foo</h2>
|
|
|
|
|
<h3>foo</h3>
|
|
|
|
|
<h4>foo</h4>
|
|
|
|
|
<h5>foo</h5>
|
|
|
|
|
<h6>foo</h6>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
More than six `#` characters is not a heading:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
####### foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>####### foo</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
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:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
#5 bolt
|
|
|
|
|
|
|
|
|
|
#hashtag
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>#5 bolt</p>
|
|
|
|
|
<p>#hashtag</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
This is not a heading, because the first `#` is escaped:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
\## foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>## foo</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Contents are parsed as inlines:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
# foo *bar* \*baz\*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h1>foo <em>bar</em> *baz*</h1>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Leading and trailing [whitespace] is ignored in parsing inline content:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
# foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h1>foo</h1>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
One to three spaces indentation are allowed:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
### foo
|
|
|
|
|
## foo
|
|
|
|
|
# foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h3>foo</h3>
|
|
|
|
|
<h2>foo</h2>
|
|
|
|
|
<h1>foo</h1>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Four spaces are too much:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
# foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code># foo
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
foo
|
|
|
|
|
# bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>foo
|
|
|
|
|
# bar</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
A closing sequence of `#` characters is optional:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
## foo ##
|
|
|
|
|
### bar ###
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h2>foo</h2>
|
|
|
|
|
<h3>bar</h3>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
It need not be the same length as the opening sequence:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
# foo ##################################
|
|
|
|
|
##### foo ##
|
|
|
|
|
.
|
|
|
|
|
<h1>foo</h1>
|
|
|
|
|
<h5>foo</h5>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
|
|
|
|
|
Spaces are allowed after the closing sequence:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
### foo ###
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h3>foo</h3>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
A sequence of `#` characters with anything but [spaces] following it
|
|
|
|
|
is not a closing sequence, but counts as part of the contents of the
|
|
|
|
|
heading:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
### foo ### b
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h3>foo ### b</h3>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The closing sequence must be preceded by a space:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
# foo#
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h1>foo#</h1>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Backslash-escaped `#` characters do not count as part
|
|
|
|
|
of the closing sequence:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
### foo \###
|
|
|
|
|
## foo #\##
|
|
|
|
|
# foo \#
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h3>foo ###</h3>
|
|
|
|
|
<h2>foo ###</h2>
|
|
|
|
|
<h1>foo #</h1>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
ATX headings need not be separated from surrounding content by blank
|
|
|
|
|
lines, and they can interrupt paragraphs:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
****
|
|
|
|
|
## foo
|
|
|
|
|
****
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<hr />
|
|
|
|
|
<h2>foo</h2>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
<hr />
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
Foo bar
|
|
|
|
|
# baz
|
|
|
|
|
Bar foo
|
|
|
|
|
.
|
|
|
|
|
<p>Foo bar</p>
|
|
|
|
|
<h1>baz</h1>
|
|
|
|
|
<p>Bar foo</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ATX headings can be empty:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
##
|
|
|
|
|
#
|
|
|
|
|
### ###
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h2></h2>
|
|
|
|
|
<h1></h1>
|
|
|
|
|
<h3></h3>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
## Setext headings
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
A [setext heading](@) consists of one or more
|
|
|
|
|
lines of text, each containing at least one [non-whitespace
|
|
|
|
|
character], with no more than 3 spaces indentation, followed by
|
|
|
|
|
a [setext heading underline]. The lines of text must be such
|
|
|
|
|
that, were they not followed by the setext heading underline,
|
|
|
|
|
they would be interpreted as a paragraph: they 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].
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
A [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].
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
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 preceding lines of text as CommonMark inline
|
|
|
|
|
content.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
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:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo *bar*
|
|
|
|
|
=========
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo *bar*
|
|
|
|
|
---------
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h1>Foo <em>bar</em></h1>
|
|
|
|
|
<h2>Foo <em>bar</em></h2>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The content of the header may span more than one line:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo *bar
|
|
|
|
|
baz*
|
|
|
|
|
====
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h1>Foo <em>bar
|
|
|
|
|
baz</em></h1>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The contents are the result of parsing the headings's raw
|
|
|
|
|
content as inlines. The heading's raw content is formed by
|
|
|
|
|
concatenating the lines and removing initial and final
|
|
|
|
|
[whitespace].
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo *bar
|
|
|
|
|
baz*→
|
|
|
|
|
====
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h1>Foo <em>bar
|
|
|
|
|
baz</em></h1>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The underlining can be any length:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
Foo
|
2019-10-08 19:00:22 +08:00
|
|
|
|
-------------------------
|
|
|
|
|
|
|
|
|
|
Foo
|
|
|
|
|
=
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h2>Foo</h2>
|
|
|
|
|
<h1>Foo</h1>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The heading content can be indented up to three spaces, and need
|
|
|
|
|
not line up with the underlining:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
Foo
|
|
|
|
|
---
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
|
|
|
|
-----
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
|
|
|
|
===
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h2>Foo</h2>
|
|
|
|
|
<h2>Foo</h2>
|
|
|
|
|
<h1>Foo</h1>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Four spaces indent is too much:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
Foo
|
|
|
|
|
---
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>Foo
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
Foo
|
|
|
|
|
</code></pre>
|
|
|
|
|
<hr />
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The setext heading underline can be indented up to three spaces, and
|
|
|
|
|
may have trailing spaces:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
Foo
|
|
|
|
|
----
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h2>Foo</h2>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Four spaces is too much:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
|
|
|
|
---
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>Foo
|
|
|
|
|
---</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The setext heading underline cannot contain internal spaces:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
|
|
|
|
= =
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
|
|
|
|
--- -
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>Foo
|
|
|
|
|
= =</p>
|
|
|
|
|
<p>Foo</p>
|
|
|
|
|
<hr />
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Trailing spaces in the content line do not cause a line break:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
|
|
|
|
-----
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h2>Foo</h2>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Nor does a backslash at the end:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo\
|
|
|
|
|
----
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h2>Foo\</h2>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Since indicators of block structure take precedence over
|
|
|
|
|
indicators of inline structure, the following are setext headings:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
`Foo
|
|
|
|
|
----
|
|
|
|
|
`
|
|
|
|
|
|
|
|
|
|
<a title="a lot
|
|
|
|
|
---
|
|
|
|
|
of dashes"/>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h2>`Foo</h2>
|
|
|
|
|
<p>`</p>
|
|
|
|
|
<h2><a title="a lot</h2>
|
|
|
|
|
<p>of dashes"/></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The setext heading underline cannot be a [lazy continuation
|
|
|
|
|
line] in a list item or block quote:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
> Foo
|
|
|
|
|
---
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<blockquote>
|
|
|
|
|
<p>Foo</p>
|
|
|
|
|
</blockquote>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
<hr />
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
> foo
|
|
|
|
|
bar
|
|
|
|
|
===
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<blockquote>
|
|
|
|
|
<p>foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
bar
|
2019-10-08 19:00:22 +08:00
|
|
|
|
===</p>
|
|
|
|
|
</blockquote>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- Foo
|
|
|
|
|
---
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>Foo</li>
|
|
|
|
|
</ul>
|
|
|
|
|
<hr />
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
A blank line is needed between a paragraph and a following
|
|
|
|
|
setext heading, since otherwise the paragraph becomes part
|
|
|
|
|
of the heading's content:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
|
|
|
|
Bar
|
|
|
|
|
---
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h2>Foo
|
|
|
|
|
Bar</h2>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
But in general a blank line is not required before or after
|
|
|
|
|
setext headings:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
---
|
|
|
|
|
Foo
|
|
|
|
|
---
|
|
|
|
|
Bar
|
|
|
|
|
---
|
|
|
|
|
Baz
|
|
|
|
|
.
|
|
|
|
|
<hr />
|
|
|
|
|
<h2>Foo</h2>
|
|
|
|
|
<h2>Bar</h2>
|
|
|
|
|
<p>Baz</p>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Setext headings cannot be empty:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
====
|
|
|
|
|
.
|
|
|
|
|
<p>====</p>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
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:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
---
|
|
|
|
|
---
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<hr />
|
|
|
|
|
<hr />
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2018-03-08 09:19:32 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- foo
|
|
|
|
|
-----
|
2018-03-08 09:19:32 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
</ul>
|
|
|
|
|
<hr />
|
2018-03-08 09:19:32 +08:00
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
foo
|
|
|
|
|
---
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</code></pre>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<hr />
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
> foo
|
|
|
|
|
-----
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<blockquote>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
<hr />
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
If you want a heading with `> foo` as its literal text, you can
|
|
|
|
|
use backslash escapes:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
\> foo
|
|
|
|
|
------
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h2>> foo</h2>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
**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
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
``` markdown
|
|
|
|
|
Foo
|
|
|
|
|
bar
|
|
|
|
|
---
|
|
|
|
|
baz
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
One can find four different interpretations:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
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"
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
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:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
bar
|
|
|
|
|
---
|
|
|
|
|
baz
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>Foo</p>
|
|
|
|
|
<h2>bar</h2>
|
|
|
|
|
<p>baz</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Authors who want interpretation 2 can put blank lines around
|
|
|
|
|
the thematic break,
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
|
|
|
|
bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
baz
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>Foo
|
|
|
|
|
bar</p>
|
|
|
|
|
<hr />
|
|
|
|
|
<p>baz</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
or use a thematic break that cannot count as a [setext heading
|
|
|
|
|
underline], such as
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
|
|
|
|
bar
|
|
|
|
|
* * *
|
|
|
|
|
baz
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>Foo
|
|
|
|
|
bar</p>
|
|
|
|
|
<hr />
|
|
|
|
|
<p>baz</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Authors who want interpretation 3 can use backslash escapes:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
|
|
|
|
bar
|
|
|
|
|
\---
|
|
|
|
|
baz
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>Foo
|
|
|
|
|
bar
|
|
|
|
|
---
|
|
|
|
|
baz</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
## Indented code blocks
|
|
|
|
|
|
|
|
|
|
An [indented code block](@) is composed of one or more
|
|
|
|
|
[indented chunks] separated by 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
|
|
|
|
|
the literal contents of the lines, including trailing
|
|
|
|
|
[line endings], minus four spaces of indentation.
|
|
|
|
|
An indented code block has no [info string].
|
|
|
|
|
|
|
|
|
|
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 is not needed, however, between a code block and a following
|
|
|
|
|
paragraph.)
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
a simple
|
|
|
|
|
indented code block
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>a simple
|
|
|
|
|
indented code block
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
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:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- foo
|
|
|
|
|
|
|
|
|
|
bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
1. foo
|
|
|
|
|
|
|
|
|
|
- bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>bar</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
|
|
|
|
|
The contents of a code block are literal text, and do not get parsed
|
|
|
|
|
as Markdown:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<a/>
|
|
|
|
|
*hi*
|
|
|
|
|
|
|
|
|
|
- one
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code><a/>
|
|
|
|
|
*hi*
|
|
|
|
|
|
|
|
|
|
- one
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Here we have three chunks separated by blank lines:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
chunk1
|
|
|
|
|
|
|
|
|
|
chunk2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
chunk3
|
|
|
|
|
.
|
|
|
|
|
<pre><code>chunk1
|
|
|
|
|
|
|
|
|
|
chunk2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
chunk3
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Any initial spaces beyond four will be included in the content, even
|
|
|
|
|
in interior blank lines:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
chunk1
|
|
|
|
|
|
|
|
|
|
chunk2
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>chunk1
|
|
|
|
|
|
|
|
|
|
chunk2
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
An indented code block cannot interrupt a paragraph. (This
|
|
|
|
|
allows hanging indents and the like.)
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Foo
|
|
|
|
|
bar
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>Foo
|
|
|
|
|
bar</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
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:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
foo
|
|
|
|
|
bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>foo
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>bar</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
And indented code can occur immediately before and after other kinds of
|
|
|
|
|
blocks:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
# Heading
|
|
|
|
|
foo
|
|
|
|
|
Heading
|
|
|
|
|
------
|
|
|
|
|
foo
|
|
|
|
|
----
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h1>Heading</h1>
|
|
|
|
|
<pre><code>foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</code></pre>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h2>Heading</h2>
|
|
|
|
|
<pre><code>foo
|
|
|
|
|
</code></pre>
|
|
|
|
|
<hr />
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The first line can be indented more than four spaces:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
foo
|
|
|
|
|
bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code> foo
|
|
|
|
|
bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Blank lines preceding or following an indented code block
|
|
|
|
|
are not included in it:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foo
|
|
|
|
|
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Trailing spaces are included in the code block's content:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
|
|
|
|
|
## Fenced code blocks
|
|
|
|
|
|
|
|
|
|
A [code fence](@) is a sequence
|
|
|
|
|
of at least three consecutive backtick characters (`` ` ``) or
|
|
|
|
|
tildes (`~`). (Tildes and backticks cannot be mixed.)
|
|
|
|
|
A [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
|
|
|
|
|
whitespace and called the [info string](@). If the [info string] comes
|
|
|
|
|
after a backtick fence, it 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:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```
|
|
|
|
|
<
|
|
|
|
|
>
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code><
|
|
|
|
|
>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
With tildes:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
~~~
|
|
|
|
|
<
|
|
|
|
|
>
|
|
|
|
|
~~~
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code><
|
|
|
|
|
>
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Fewer than three backticks is not enough:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
``
|
2017-07-21 05:44:55 +08:00
|
|
|
|
foo
|
2019-10-08 19:00:22 +08:00
|
|
|
|
``
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><code>foo</code></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The closing code fence must use the same character as the opening
|
|
|
|
|
fence:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
```
|
2019-10-08 19:00:22 +08:00
|
|
|
|
aaa
|
|
|
|
|
~~~
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```
|
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>aaa
|
|
|
|
|
~~~
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
~~~
|
|
|
|
|
aaa
|
|
|
|
|
```
|
|
|
|
|
~~~
|
|
|
|
|
.
|
|
|
|
|
<pre><code>aaa
|
|
|
|
|
```
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The closing code fence must be at least as long as the opening fence:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
````
|
|
|
|
|
aaa
|
|
|
|
|
```
|
|
|
|
|
``````
|
|
|
|
|
.
|
|
|
|
|
<pre><code>aaa
|
|
|
|
|
```
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
~~~~
|
|
|
|
|
aaa
|
|
|
|
|
~~~
|
|
|
|
|
~~~~
|
|
|
|
|
.
|
|
|
|
|
<pre><code>aaa
|
|
|
|
|
~~~
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Unclosed code blocks are closed by the end of the document
|
|
|
|
|
(or the enclosing [block quote][block quotes] or [list item][list items]):
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
```
|
|
|
|
|
.
|
|
|
|
|
<pre><code></code></pre>
|
|
|
|
|
````````````````````````````````
|
2018-03-08 09:19:32 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
`````
|
2018-03-08 09:19:32 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```
|
|
|
|
|
aaa
|
2018-03-08 09:19:32 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>
|
|
|
|
|
```
|
|
|
|
|
aaa
|
|
|
|
|
</code></pre>
|
2018-03-08 09:19:32 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
> ```
|
|
|
|
|
> aaa
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
bbb
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<blockquote>
|
|
|
|
|
<pre><code>aaa
|
|
|
|
|
</code></pre>
|
|
|
|
|
</blockquote>
|
|
|
|
|
<p>bbb</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
A code block can have all empty lines as its content:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>
|
|
|
|
|
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
A code block can be empty:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code></code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Fences can be indented. If the opening fence is indented,
|
|
|
|
|
content lines will have equivalent opening indentation removed,
|
|
|
|
|
if present:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```
|
|
|
|
|
aaa
|
|
|
|
|
aaa
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>aaa
|
|
|
|
|
aaa
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```
|
|
|
|
|
aaa
|
|
|
|
|
aaa
|
|
|
|
|
aaa
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>aaa
|
|
|
|
|
aaa
|
|
|
|
|
aaa
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```
|
|
|
|
|
aaa
|
|
|
|
|
aaa
|
|
|
|
|
aaa
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>aaa
|
|
|
|
|
aaa
|
|
|
|
|
aaa
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Four spaces indentation produces an indented code block:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
```
|
|
|
|
|
aaa
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>```
|
|
|
|
|
aaa
|
|
|
|
|
```
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Closing fences may be indented by 0-3 spaces, and their indentation
|
|
|
|
|
need not match that of the opening fence:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```
|
|
|
|
|
aaa
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>aaa
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```
|
|
|
|
|
aaa
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>aaa
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
This is not a closing fence, because it is indented 4 spaces:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```
|
|
|
|
|
aaa
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>aaa
|
|
|
|
|
```
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
|
|
|
|
|
Code fences (opening and closing) cannot contain internal spaces:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
``` ```
|
|
|
|
|
aaa
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><code> </code>
|
|
|
|
|
aaa</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
~~~~~~
|
|
|
|
|
aaa
|
|
|
|
|
~~~ ~~
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>aaa
|
|
|
|
|
~~~ ~~
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Fenced code blocks can interrupt paragraphs, and can be followed
|
|
|
|
|
directly by paragraphs, without a blank line between:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```
|
2019-10-08 19:00:22 +08:00
|
|
|
|
bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```
|
2019-10-08 19:00:22 +08:00
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<pre><code>bar
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>baz</p>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Other blocks can also occur before and after fenced code blocks
|
|
|
|
|
without an intervening blank line:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
foo
|
|
|
|
|
---
|
|
|
|
|
~~~
|
|
|
|
|
bar
|
|
|
|
|
~~~
|
|
|
|
|
# baz
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<h2>foo</h2>
|
|
|
|
|
<pre><code>bar
|
|
|
|
|
</code></pre>
|
|
|
|
|
<h1>baz</h1>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
An [info string] can be provided after the opening code fence.
|
|
|
|
|
Although this spec doesn't mandate any particular treatment of
|
|
|
|
|
the info string, the first word is typically used to specify
|
|
|
|
|
the language of the code block. In HTML output, the language is
|
|
|
|
|
normally indicated by adding a class to the `code` element consisting
|
|
|
|
|
of `language-` followed by the language name.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```ruby
|
|
|
|
|
def foo(x)
|
|
|
|
|
return 3
|
|
|
|
|
end
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code class="language-ruby">def foo(x)
|
|
|
|
|
return 3
|
|
|
|
|
end
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
~~~~ ruby startline=3 $%@#$
|
|
|
|
|
def foo(x)
|
|
|
|
|
return 3
|
|
|
|
|
end
|
|
|
|
|
~~~~~~~
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code class="language-ruby">def foo(x)
|
|
|
|
|
return 3
|
|
|
|
|
end
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
````;
|
|
|
|
|
````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code class="language-;"></code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[Info strings] for backtick code blocks cannot contain backticks:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
``` aa ```
|
|
|
|
|
foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><code>aa</code>
|
|
|
|
|
foo</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[Info strings] for tilde code blocks can contain backticks and tildes:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
~~~ aa ``` ~~~
|
|
|
|
|
foo
|
|
|
|
|
~~~
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code class="language-aa">foo
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Closing code fences cannot have [info strings]:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```
|
|
|
|
|
``` aaa
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<pre><code>``` aaa
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
## HTML blocks
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
An [HTML block](@) is a group of lines that is treated
|
|
|
|
|
as raw HTML (and will not be escaped in HTML output).
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
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](@) (after up to three spaces optional indentation).
|
|
|
|
|
It ends with the first subsequent line that meets a matching [end
|
|
|
|
|
condition](@), or the last line of the document, or the last line of
|
|
|
|
|
the [container block](#container-blocks) containing the current HTML
|
|
|
|
|
block, 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.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
1. **Start condition:** line begins with the string `<script`,
|
|
|
|
|
`<pre`, or `<style` (case-insensitive), followed by whitespace,
|
|
|
|
|
the string `>`, or the end of the line.\
|
|
|
|
|
**End condition:** line contains an end tag
|
|
|
|
|
`</script>`, `</pre>`, or `</style>` (case-insensitive; it
|
|
|
|
|
need not match the start tag).
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
2. **Start condition:** line begins with the string `<!--`.\
|
|
|
|
|
**End condition:** line contains the string `-->`.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
3. **Start condition:** line begins with the string `<?`.\
|
|
|
|
|
**End condition:** line contains the string `?>`.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
4. **Start condition:** line begins with the string `<!`
|
|
|
|
|
followed by an uppercase ASCII letter.\
|
|
|
|
|
**End condition:** line contains the character `>`.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
5. **Start condition:** line begins with the string
|
|
|
|
|
`<![CDATA[`.\
|
|
|
|
|
**End condition:** line contains the string `]]>`.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
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`, `h2`, `h3`, `h4`, `h5`, `h6`, `head`, `header`, `hr`,
|
|
|
|
|
`html`, `iframe`, `legend`, `li`, `link`, `main`, `menu`, `menuitem`,
|
|
|
|
|
`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].
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
7. **Start condition:** line begins with a complete [open tag]
|
|
|
|
|
(with any [tag name] other than `script`,
|
|
|
|
|
`style`, or `pre`) or a complete [closing tag],
|
|
|
|
|
followed only by [whitespace] or the end of the line.\
|
|
|
|
|
**End condition:** line is followed by a [blank line].
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
HTML blocks continue until they are closed by their appropriate
|
|
|
|
|
[end condition], or the last line of the document or other [container
|
|
|
|
|
block](#container-blocks). This means any HTML **within an HTML
|
|
|
|
|
block** that might otherwise be recognised as a start condition will
|
|
|
|
|
be ignored by the parser and passed through as-is, without changing
|
|
|
|
|
the parser's state.
|
|
|
|
|
|
|
|
|
|
For instance, `<pre>` within a HTML block started by `<table>` will not affect
|
|
|
|
|
the parser state; as the HTML block was started in by start condition 6, it
|
|
|
|
|
will end at any blank line. This can be surprising:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<table><tr><td>
|
|
|
|
|
<pre>
|
|
|
|
|
**Hello**,
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
_world_.
|
|
|
|
|
</pre>
|
|
|
|
|
</td></tr></table>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<table><tr><td>
|
|
|
|
|
<pre>
|
|
|
|
|
**Hello**,
|
|
|
|
|
<p><em>world</em>.
|
|
|
|
|
</pre></p>
|
|
|
|
|
</td></tr></table>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
In this case, the HTML block is terminated by the newline — the `**Hello**`
|
|
|
|
|
text remains verbatim — and regular parsing resumes, with a paragraph,
|
|
|
|
|
emphasised `world` and inline and block HTML following.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
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:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<table>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>
|
|
|
|
|
hi
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
okay.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<table>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>
|
|
|
|
|
hi
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
<p>okay.</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<div>
|
|
|
|
|
*hello*
|
|
|
|
|
<foo><a>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<div>
|
|
|
|
|
*hello*
|
|
|
|
|
<foo><a>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
A block can also start with a closing tag:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
</div>
|
|
|
|
|
*foo*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
</div>
|
|
|
|
|
*foo*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Here we have two HTML blocks with a Markdown paragraph between them:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<DIV CLASS="foo">
|
|
|
|
|
|
|
|
|
|
*Markdown*
|
|
|
|
|
|
|
|
|
|
</DIV>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<DIV CLASS="foo">
|
|
|
|
|
<p><em>Markdown</em></p>
|
|
|
|
|
</DIV>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The tag on the first line can be partial, as long
|
|
|
|
|
as it is split where there would be whitespace:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<div id="foo"
|
|
|
|
|
class="bar">
|
|
|
|
|
</div>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<div id="foo"
|
|
|
|
|
class="bar">
|
|
|
|
|
</div>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<div id="foo" class="bar
|
|
|
|
|
baz">
|
|
|
|
|
</div>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<div id="foo" class="bar
|
|
|
|
|
baz">
|
|
|
|
|
</div>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
An open tag need not be closed:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<div>
|
|
|
|
|
*foo*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
*bar*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<div>
|
|
|
|
|
*foo*
|
|
|
|
|
<p><em>bar</em></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
A partial tag need not even be completed (garbage
|
|
|
|
|
in, garbage out):
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<div id="foo"
|
|
|
|
|
*hi*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<div id="foo"
|
|
|
|
|
*hi*
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<div class
|
|
|
|
|
foo
|
|
|
|
|
.
|
|
|
|
|
<div class
|
|
|
|
|
foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The initial tag doesn't even need to be a valid
|
|
|
|
|
tag, as long as it starts like one:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<div *???-&&&-<---
|
|
|
|
|
*foo*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<div *???-&&&-<---
|
|
|
|
|
*foo*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
In type 6 blocks, the initial tag need not be on a line by
|
|
|
|
|
itself:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<div><a href="bar">*foo*</a></div>
|
|
|
|
|
.
|
|
|
|
|
<div><a href="bar">*foo*</a></div>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<table><tr><td>
|
|
|
|
|
foo
|
|
|
|
|
</td></tr></table>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<table><tr><td>
|
|
|
|
|
foo
|
|
|
|
|
</td></tr></table>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Everything until the next blank line or end of document
|
|
|
|
|
gets included in the HTML block. So, in the following
|
|
|
|
|
example, what looks like a Markdown code block
|
|
|
|
|
is actually part of the HTML block, which continues until a blank
|
|
|
|
|
line or the end of the document is reached:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<div></div>
|
|
|
|
|
``` c
|
|
|
|
|
int x = 33;
|
|
|
|
|
```
|
|
|
|
|
.
|
|
|
|
|
<div></div>
|
|
|
|
|
``` c
|
|
|
|
|
int x = 33;
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
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
|
|
|
|
|
itself on the first line (and it must be complete):
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<a href="foo">
|
|
|
|
|
*bar*
|
|
|
|
|
</a>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<a href="foo">
|
|
|
|
|
*bar*
|
|
|
|
|
</a>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
In type 7 blocks, the [tag name] can be anything:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<Warning>
|
|
|
|
|
*bar*
|
|
|
|
|
</Warning>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<Warning>
|
|
|
|
|
*bar*
|
|
|
|
|
</Warning>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<i class="foo">
|
|
|
|
|
*bar*
|
|
|
|
|
</i>
|
|
|
|
|
.
|
|
|
|
|
<i class="foo">
|
|
|
|
|
*bar*
|
|
|
|
|
</i>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
</ins>
|
|
|
|
|
*bar*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
</ins>
|
|
|
|
|
*bar*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
These rules are designed to allow us to work with tags that
|
|
|
|
|
can function as either block-level or inline-level tags.
|
|
|
|
|
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
|
|
|
|
|
HTML block, because the `<del>` tag is on a line by itself:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<del>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
*foo*
|
2019-10-08 19:00:22 +08:00
|
|
|
|
</del>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<del>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
*foo*
|
2019-10-08 19:00:22 +08:00
|
|
|
|
</del>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
In this case, we get a raw HTML block that just includes
|
|
|
|
|
the `<del>` tag (because it ends with the following blank
|
|
|
|
|
line). So the contents get interpreted as CommonMark:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<del>
|
|
|
|
|
|
|
|
|
|
*foo*
|
|
|
|
|
|
|
|
|
|
</del>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<del>
|
|
|
|
|
<p><em>foo</em></p>
|
|
|
|
|
</del>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Finally, in this case, the `<del>` tags are interpreted
|
|
|
|
|
as [raw HTML] *inside* the CommonMark paragraph. (Because
|
|
|
|
|
the tag is not on a line by itself, we get inline HTML
|
|
|
|
|
rather than an [HTML block].)
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<del>*foo*</del>
|
|
|
|
|
.
|
|
|
|
|
<p><del><em>foo</em></del></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HTML tags designed to contain literal content
|
|
|
|
|
(`script`, `style`, `pre`), comments, processing instructions,
|
|
|
|
|
and declarations are treated somewhat differently.
|
|
|
|
|
Instead of ending at the first blank line, these blocks
|
|
|
|
|
end at the first line containing a corresponding end tag.
|
|
|
|
|
As a result, these blocks can contain blank lines:
|
|
|
|
|
|
|
|
|
|
A pre tag (type 1):
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<pre language="haskell"><code>
|
|
|
|
|
import Text.HTML.TagSoup
|
|
|
|
|
|
|
|
|
|
main :: IO ()
|
|
|
|
|
main = print $ parseTags tags
|
|
|
|
|
</code></pre>
|
|
|
|
|
okay
|
|
|
|
|
.
|
|
|
|
|
<pre language="haskell"><code>
|
|
|
|
|
import Text.HTML.TagSoup
|
|
|
|
|
|
|
|
|
|
main :: IO ()
|
|
|
|
|
main = print $ parseTags tags
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>okay</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A script tag (type 1):
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<script type="text/javascript">
|
|
|
|
|
// JavaScript example
|
|
|
|
|
|
|
|
|
|
document.getElementById("demo").innerHTML = "Hello JavaScript!";
|
|
|
|
|
</script>
|
|
|
|
|
okay
|
|
|
|
|
.
|
|
|
|
|
<script type="text/javascript">
|
|
|
|
|
// JavaScript example
|
|
|
|
|
|
|
|
|
|
document.getElementById("demo").innerHTML = "Hello JavaScript!";
|
|
|
|
|
</script>
|
|
|
|
|
<p>okay</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A style tag (type 1):
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<style
|
|
|
|
|
type="text/css">
|
|
|
|
|
h1 {color:red;}
|
|
|
|
|
|
|
|
|
|
p {color:blue;}
|
|
|
|
|
</style>
|
|
|
|
|
okay
|
|
|
|
|
.
|
|
|
|
|
<style
|
|
|
|
|
type="text/css">
|
|
|
|
|
h1 {color:red;}
|
|
|
|
|
|
|
|
|
|
p {color:blue;}
|
|
|
|
|
</style>
|
|
|
|
|
<p>okay</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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]):
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<style
|
|
|
|
|
type="text/css">
|
|
|
|
|
|
|
|
|
|
foo
|
|
|
|
|
.
|
|
|
|
|
<style
|
|
|
|
|
type="text/css">
|
|
|
|
|
|
|
|
|
|
foo
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> <div>
|
|
|
|
|
> foo
|
|
|
|
|
|
|
|
|
|
bar
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<div>
|
|
|
|
|
foo
|
|
|
|
|
</blockquote>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- <div>
|
|
|
|
|
- foo
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<div>
|
|
|
|
|
</li>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The end tag can occur on the same line as the start tag:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<style>p{color:red;}</style>
|
|
|
|
|
*foo*
|
|
|
|
|
.
|
|
|
|
|
<style>p{color:red;}</style>
|
|
|
|
|
<p><em>foo</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<!-- foo -->*bar*
|
|
|
|
|
*baz*
|
|
|
|
|
.
|
|
|
|
|
<!-- foo -->*bar*
|
|
|
|
|
<p><em>baz</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that anything on the last line after the
|
|
|
|
|
end tag will be included in the [HTML block]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<script>
|
|
|
|
|
foo
|
|
|
|
|
</script>1. *bar*
|
|
|
|
|
.
|
|
|
|
|
<script>
|
|
|
|
|
foo
|
|
|
|
|
</script>1. *bar*
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A comment (type 2):
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<!-- Foo
|
|
|
|
|
|
|
|
|
|
bar
|
|
|
|
|
baz -->
|
|
|
|
|
okay
|
|
|
|
|
.
|
|
|
|
|
<!-- Foo
|
|
|
|
|
|
|
|
|
|
bar
|
|
|
|
|
baz -->
|
|
|
|
|
<p>okay</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A processing instruction (type 3):
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
echo '>';
|
|
|
|
|
|
|
|
|
|
?>
|
|
|
|
|
okay
|
|
|
|
|
.
|
|
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
echo '>';
|
|
|
|
|
|
|
|
|
|
?>
|
|
|
|
|
<p>okay</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A declaration (type 4):
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
.
|
|
|
|
|
<!DOCTYPE html>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CDATA (type 5):
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<![CDATA[
|
|
|
|
|
function matchwo(a,b)
|
|
|
|
|
{
|
|
|
|
|
if (a < b && a < 0) then {
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]]>
|
|
|
|
|
okay
|
|
|
|
|
.
|
|
|
|
|
<![CDATA[
|
|
|
|
|
function matchwo(a,b)
|
|
|
|
|
{
|
|
|
|
|
if (a < b && a < 0) then {
|
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
]]>
|
|
|
|
|
<p>okay</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The opening tag can be indented 1-3 spaces, but not 4:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<!-- foo -->
|
|
|
|
|
|
|
|
|
|
<!-- foo -->
|
|
|
|
|
.
|
|
|
|
|
<!-- foo -->
|
|
|
|
|
<pre><code><!-- foo -->
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<div>
|
|
|
|
|
|
|
|
|
|
<div>
|
|
|
|
|
.
|
|
|
|
|
<div>
|
|
|
|
|
<pre><code><div>
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
An HTML block of types 1--6 can interrupt a paragraph, and need not be
|
|
|
|
|
preceded by a blank line.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
Foo
|
|
|
|
|
<div>
|
|
|
|
|
bar
|
|
|
|
|
</div>
|
|
|
|
|
.
|
|
|
|
|
<p>Foo</p>
|
|
|
|
|
<div>
|
|
|
|
|
bar
|
|
|
|
|
</div>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
However, a following blank line is needed, except at the end of
|
|
|
|
|
a document, and except for blocks of types 1--5, [above][HTML
|
|
|
|
|
block]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<div>
|
|
|
|
|
bar
|
|
|
|
|
</div>
|
|
|
|
|
*foo*
|
|
|
|
|
.
|
|
|
|
|
<div>
|
|
|
|
|
bar
|
|
|
|
|
</div>
|
|
|
|
|
*foo*
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
HTML blocks of type 7 cannot interrupt a paragraph:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
Foo
|
|
|
|
|
<a href="bar">
|
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<p>Foo
|
|
|
|
|
<a href="bar">
|
|
|
|
|
baz</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This rule differs from John Gruber's original Markdown syntax
|
|
|
|
|
specification, which says:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
> The only restrictions are that block-level HTML elements —
|
|
|
|
|
> e.g. `<div>`, `<table>`, `<pre>`, `<p>`, etc. — must be separated from
|
|
|
|
|
> surrounding content by blank lines, and the start and end tags of the
|
|
|
|
|
> block should not be indented with tabs or spaces.
|
|
|
|
|
|
|
|
|
|
In some ways Gruber's rule is more restrictive than the one given
|
|
|
|
|
here:
|
|
|
|
|
|
|
|
|
|
- It requires that an HTML block be preceded by a blank line.
|
|
|
|
|
- It does not allow the start tag to be indented.
|
|
|
|
|
- It requires a matching end tag, which it also does not allow to
|
|
|
|
|
be indented.
|
|
|
|
|
|
|
|
|
|
Most Markdown implementations (including some of Gruber's own) do not
|
|
|
|
|
respect all of these restrictions.
|
|
|
|
|
|
|
|
|
|
There is one respect, however, in which Gruber's rule is more liberal
|
|
|
|
|
than the one given here, since it allows blank lines to occur inside
|
|
|
|
|
an HTML block. There are two reasons for disallowing them here.
|
|
|
|
|
First, it removes the need to parse balanced tags, which is
|
|
|
|
|
expensive and can require backtracking from the end of the document
|
|
|
|
|
if no matching end tag is found. Second, it provides a very simple
|
|
|
|
|
and flexible way of including Markdown content inside HTML tags:
|
|
|
|
|
simply separate the Markdown from the HTML using blank lines:
|
|
|
|
|
|
|
|
|
|
Compare:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<div>
|
|
|
|
|
|
|
|
|
|
*Emphasized* text.
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
.
|
|
|
|
|
<div>
|
|
|
|
|
<p><em>Emphasized</em> text.</p>
|
|
|
|
|
</div>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<div>
|
|
|
|
|
*Emphasized* text.
|
|
|
|
|
</div>
|
|
|
|
|
.
|
|
|
|
|
<div>
|
|
|
|
|
*Emphasized* text.
|
|
|
|
|
</div>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Some Markdown implementations have adopted a convention of
|
|
|
|
|
interpreting content inside tags as text if the open tag has
|
|
|
|
|
the attribute `markdown=1`. The rule given above seems a simpler and
|
|
|
|
|
more elegant way of achieving the same expressive power, which is also
|
|
|
|
|
much simpler to parse.
|
|
|
|
|
|
|
|
|
|
The main potential drawback is that one can no longer paste HTML
|
|
|
|
|
blocks into Markdown documents with 100% reliability. However,
|
|
|
|
|
*in most cases* this will work fine, because the blank lines in
|
|
|
|
|
HTML are usually followed by HTML block tags. For example:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<table>
|
|
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
|
|
|
|
|
|
<td>
|
|
|
|
|
Hi
|
|
|
|
|
</td>
|
|
|
|
|
|
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
|
|
</table>
|
|
|
|
|
.
|
|
|
|
|
<table>
|
|
|
|
|
<tr>
|
|
|
|
|
<td>
|
|
|
|
|
Hi
|
|
|
|
|
</td>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
There are problems, however, if the inner tags are indented
|
|
|
|
|
*and* separated by spaces, as then they will be interpreted as
|
|
|
|
|
an indented code block:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<table>
|
|
|
|
|
|
|
|
|
|
<tr>
|
|
|
|
|
|
|
|
|
|
<td>
|
|
|
|
|
Hi
|
|
|
|
|
</td>
|
|
|
|
|
|
|
|
|
|
</tr>
|
|
|
|
|
|
|
|
|
|
</table>
|
|
|
|
|
.
|
|
|
|
|
<table>
|
|
|
|
|
<tr>
|
|
|
|
|
<pre><code><td>
|
|
|
|
|
Hi
|
|
|
|
|
</td>
|
|
|
|
|
</code></pre>
|
|
|
|
|
</tr>
|
|
|
|
|
</table>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Fortunately, blank lines are usually not necessary and can be
|
|
|
|
|
deleted. The exception is inside `<pre>` tags, but as described
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[above][HTML blocks], raw HTML blocks starting with `<pre>`
|
|
|
|
|
*can* contain blank lines.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
## Link reference definitions
|
|
|
|
|
|
|
|
|
|
A [link reference definition](@)
|
|
|
|
|
consists of a [link label], indented up to three spaces, followed
|
|
|
|
|
by a colon (`:`), optional [whitespace] (including up to one
|
|
|
|
|
[line ending]), a [link destination],
|
|
|
|
|
optional [whitespace] (including up to one
|
|
|
|
|
[line ending]), and an optional [link
|
|
|
|
|
title], which if it is present must be separated
|
|
|
|
|
from the [link destination] by [whitespace].
|
|
|
|
|
No further [non-whitespace characters] may occur on the line.
|
|
|
|
|
|
|
|
|
|
A [link reference definition]
|
|
|
|
|
does not correspond to a structural element of a document. Instead, it
|
|
|
|
|
defines a label which can be used in [reference links]
|
|
|
|
|
and reference-style [images] elsewhere in the document. [Link
|
|
|
|
|
reference definitions] can come either before or after the links that use
|
|
|
|
|
them.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
|
|
|
|
|
[foo]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="title">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]:
|
|
|
|
|
/url
|
|
|
|
|
'the title'
|
|
|
|
|
|
|
|
|
|
[foo]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="the title">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[Foo*bar\]]:my_(url) 'title (with parens)'
|
|
|
|
|
|
|
|
|
|
[Foo*bar\]]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="my_(url)" title="title (with parens)">Foo*bar]</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[Foo bar]:
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<my url>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
'title'
|
|
|
|
|
|
|
|
|
|
[Foo bar]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="my%20url" title="title">Foo bar</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The title may extend over multiple lines:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: /url '
|
|
|
|
|
title
|
|
|
|
|
line1
|
|
|
|
|
line2
|
|
|
|
|
'
|
|
|
|
|
|
|
|
|
|
[foo]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="
|
|
|
|
|
title
|
|
|
|
|
line1
|
|
|
|
|
line2
|
|
|
|
|
">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
However, it may not contain a [blank line]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: /url 'title
|
|
|
|
|
|
|
|
|
|
with blank line'
|
|
|
|
|
|
|
|
|
|
[foo]
|
|
|
|
|
.
|
|
|
|
|
<p>[foo]: /url 'title</p>
|
|
|
|
|
<p>with blank line'</p>
|
|
|
|
|
<p>[foo]</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The title may be omitted:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]:
|
|
|
|
|
/url
|
|
|
|
|
|
|
|
|
|
[foo]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The link destination may not be omitted:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]:
|
|
|
|
|
|
|
|
|
|
[foo]
|
|
|
|
|
.
|
|
|
|
|
<p>[foo]:</p>
|
|
|
|
|
<p>[foo]</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
However, an empty link destination may be specified using
|
|
|
|
|
angle brackets:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: <>
|
|
|
|
|
|
|
|
|
|
[foo]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
The title must be separated from the link destination by
|
|
|
|
|
whitespace:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: <bar>(baz)
|
|
|
|
|
|
|
|
|
|
[foo]
|
|
|
|
|
.
|
|
|
|
|
<p>[foo]: <bar>(baz)</p>
|
|
|
|
|
<p>[foo]</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
Both title and destination can contain backslash escapes
|
|
|
|
|
and literal backslashes:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: /url\bar\*baz "foo\"bar\baz"
|
|
|
|
|
|
|
|
|
|
[foo]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url%5Cbar*baz" title="foo"bar\baz">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A link can come before its corresponding definition:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]
|
|
|
|
|
|
|
|
|
|
[foo]: url
|
|
|
|
|
.
|
|
|
|
|
<p><a href="url">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If there are several matching definitions, the first one takes
|
|
|
|
|
precedence:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]
|
|
|
|
|
|
|
|
|
|
[foo]: first
|
|
|
|
|
[foo]: second
|
|
|
|
|
.
|
|
|
|
|
<p><a href="first">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
As noted in the section on [Links], matching of labels is
|
|
|
|
|
case-insensitive (see [matches]).
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[FOO]: /url
|
|
|
|
|
|
|
|
|
|
[Foo]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url">Foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[ΑΓΩ]: /φου
|
|
|
|
|
|
|
|
|
|
[αγω]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/%CF%86%CE%BF%CF%85">αγω</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Here is a link reference definition with no corresponding link.
|
|
|
|
|
It contributes nothing to the document.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: /url
|
|
|
|
|
.
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Here is another one:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[
|
|
|
|
|
foo
|
|
|
|
|
]: /url
|
|
|
|
|
bar
|
|
|
|
|
.
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not a link reference definition, because there are
|
|
|
|
|
[non-whitespace characters] after the title:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: /url "title" ok
|
|
|
|
|
.
|
|
|
|
|
<p>[foo]: /url "title" ok</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is a link reference definition, but it has no title:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: /url
|
|
|
|
|
"title" ok
|
|
|
|
|
.
|
|
|
|
|
<p>"title" ok</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not a link reference definition, because it is indented
|
|
|
|
|
four spaces:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
|
|
|
|
|
[foo]
|
|
|
|
|
.
|
|
|
|
|
<pre><code>[foo]: /url "title"
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>[foo]</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not a link reference definition, because it occurs inside
|
|
|
|
|
a code block:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
```
|
|
|
|
|
[foo]: /url
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
[foo]
|
|
|
|
|
.
|
|
|
|
|
<pre><code>[foo]: /url
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>[foo]</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A [link reference definition] cannot interrupt a paragraph.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
Foo
|
|
|
|
|
[bar]: /baz
|
|
|
|
|
|
|
|
|
|
[bar]
|
|
|
|
|
.
|
|
|
|
|
<p>Foo
|
|
|
|
|
[bar]: /baz</p>
|
|
|
|
|
<p>[bar]</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
However, it can directly follow other block elements, such as headings
|
|
|
|
|
and thematic breaks, and it need not be followed by a blank line.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
# [Foo]
|
|
|
|
|
[foo]: /url
|
|
|
|
|
> bar
|
|
|
|
|
.
|
|
|
|
|
<h1><a href="/url">Foo</a></h1>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: /url
|
|
|
|
|
bar
|
|
|
|
|
===
|
|
|
|
|
[foo]
|
|
|
|
|
.
|
|
|
|
|
<h1>bar</h1>
|
|
|
|
|
<p><a href="/url">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: /url
|
|
|
|
|
===
|
|
|
|
|
[foo]
|
|
|
|
|
.
|
|
|
|
|
<p>===
|
|
|
|
|
<a href="/url">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
Several [link reference definitions]
|
|
|
|
|
can occur one after another, without intervening blank lines.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: /foo-url "foo"
|
|
|
|
|
[bar]: /bar-url
|
|
|
|
|
"bar"
|
|
|
|
|
[baz]: /baz-url
|
|
|
|
|
|
|
|
|
|
[foo],
|
|
|
|
|
[bar],
|
|
|
|
|
[baz]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/foo-url" title="foo">foo</a>,
|
|
|
|
|
<a href="/bar-url" title="bar">bar</a>,
|
|
|
|
|
<a href="/baz-url">baz</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Link reference definitions] can occur
|
|
|
|
|
inside block containers, like lists and block quotations. They
|
|
|
|
|
affect the entire document, not just the container in which they
|
|
|
|
|
are defined:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]
|
|
|
|
|
|
|
|
|
|
> [foo]: /url
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url">foo</a></p>
|
|
|
|
|
<blockquote>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Whether something is a [link reference definition] is
|
|
|
|
|
independent of whether the link reference it defines is
|
|
|
|
|
used in the document. Thus, for example, the following
|
|
|
|
|
document contains just a link reference definition, and
|
|
|
|
|
no visible content:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: /url
|
|
|
|
|
.
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
## Paragraphs
|
|
|
|
|
|
|
|
|
|
A sequence of non-blank lines that cannot be interpreted as other
|
|
|
|
|
kinds of blocks forms a [paragraph](@).
|
|
|
|
|
The contents of the paragraph are the result of parsing the
|
|
|
|
|
paragraph's raw content as inlines. The paragraph's raw content
|
|
|
|
|
is formed by concatenating the lines and removing initial and final
|
|
|
|
|
[whitespace].
|
|
|
|
|
|
|
|
|
|
A simple example with two paragraphs:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
aaa
|
|
|
|
|
|
|
|
|
|
bbb
|
|
|
|
|
.
|
|
|
|
|
<p>aaa</p>
|
|
|
|
|
<p>bbb</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Paragraphs can contain multiple lines, but no blank lines:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
aaa
|
|
|
|
|
bbb
|
|
|
|
|
|
|
|
|
|
ccc
|
|
|
|
|
ddd
|
|
|
|
|
.
|
|
|
|
|
<p>aaa
|
|
|
|
|
bbb</p>
|
|
|
|
|
<p>ccc
|
|
|
|
|
ddd</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Multiple blank lines between paragraph have no effect:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
aaa
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bbb
|
|
|
|
|
.
|
|
|
|
|
<p>aaa</p>
|
|
|
|
|
<p>bbb</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Leading spaces are skipped:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
aaa
|
|
|
|
|
bbb
|
|
|
|
|
.
|
|
|
|
|
<p>aaa
|
|
|
|
|
bbb</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Lines after the first may be indented any amount, since indented
|
|
|
|
|
code blocks cannot interrupt paragraphs.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
aaa
|
|
|
|
|
bbb
|
|
|
|
|
ccc
|
|
|
|
|
.
|
|
|
|
|
<p>aaa
|
|
|
|
|
bbb
|
|
|
|
|
ccc</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
However, the first line may be indented at most three spaces,
|
|
|
|
|
or an indented code block will be triggered:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
aaa
|
|
|
|
|
bbb
|
|
|
|
|
.
|
|
|
|
|
<p>aaa
|
|
|
|
|
bbb</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
aaa
|
|
|
|
|
bbb
|
|
|
|
|
.
|
|
|
|
|
<pre><code>aaa
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>bbb</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Final spaces are stripped before inline parsing, so a paragraph
|
|
|
|
|
that ends with two or more spaces will not end with a [hard line
|
|
|
|
|
break]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
aaa
|
|
|
|
|
bbb
|
|
|
|
|
.
|
|
|
|
|
<p>aaa<br />
|
|
|
|
|
bbb</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Blank lines
|
|
|
|
|
|
|
|
|
|
[Blank lines] between block-level elements are ignored,
|
|
|
|
|
except for the role they play in determining whether a [list]
|
|
|
|
|
is [tight] or [loose].
|
|
|
|
|
|
|
|
|
|
Blank lines at the beginning and end of the document are also ignored.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
aaa
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# aaa
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
.
|
|
|
|
|
<p>aaa</p>
|
|
|
|
|
<h1>aaa</h1>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Container blocks
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
A [container block](#container-blocks) is a block that has other
|
2017-07-21 05:44:55 +08:00
|
|
|
|
blocks as its contents. There are two basic kinds of container blocks:
|
|
|
|
|
[block quotes] and [list items].
|
|
|
|
|
[Lists] are meta-containers for [list items].
|
|
|
|
|
|
|
|
|
|
We define the syntax for container blocks recursively. The general
|
|
|
|
|
form of the definition is:
|
|
|
|
|
|
|
|
|
|
> If X is a sequence of blocks, then the result of
|
|
|
|
|
> transforming X in such-and-such a way is a container of type Y
|
|
|
|
|
> with these blocks as its content.
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
to define the syntax, although it does not give a recipe for *parsing*
|
|
|
|
|
these constructions. (A recipe is provided below in the section entitled
|
|
|
|
|
[A parsing strategy](#appendix-a-parsing-strategy).)
|
|
|
|
|
|
|
|
|
|
## Block quotes
|
|
|
|
|
|
|
|
|
|
A [block quote marker](@)
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
The following rules define [block quotes]:
|
|
|
|
|
|
|
|
|
|
1. **Basic case.** If a string of lines *Ls* constitute a sequence
|
|
|
|
|
of blocks *Bs*, then the result of prepending a [block quote
|
|
|
|
|
marker] to the beginning of each line in *Ls*
|
|
|
|
|
is a [block quote](#block-quotes) containing *Bs*.
|
|
|
|
|
|
|
|
|
|
2. **Laziness.** If a string of lines *Ls* constitute a [block
|
|
|
|
|
quote](#block-quotes) with contents *Bs*, then the result of deleting
|
|
|
|
|
the initial [block quote marker] from one or
|
|
|
|
|
more lines in which the next [non-whitespace character] after the [block
|
|
|
|
|
quote marker] is [paragraph continuation
|
|
|
|
|
text] is a block quote with *Bs* as its content.
|
|
|
|
|
[Paragraph continuation text](@) is text
|
|
|
|
|
that will be parsed as part of the content of a paragraph, but does
|
|
|
|
|
not occur at the beginning of the paragraph.
|
|
|
|
|
|
|
|
|
|
3. **Consecutiveness.** A document cannot contain two [block
|
|
|
|
|
quotes] in a row unless there is a [blank line] between them.
|
|
|
|
|
|
|
|
|
|
Nothing else counts as a [block quote](#block-quotes).
|
|
|
|
|
|
|
|
|
|
Here is a simple example:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> # Foo
|
|
|
|
|
> bar
|
|
|
|
|
> baz
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<h1>Foo</h1>
|
|
|
|
|
<p>bar
|
|
|
|
|
baz</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The spaces after the `>` characters can be omitted:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
># Foo
|
|
|
|
|
>bar
|
|
|
|
|
> baz
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<h1>Foo</h1>
|
|
|
|
|
<p>bar
|
|
|
|
|
baz</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The `>` characters can be indented 1-3 spaces:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> # Foo
|
|
|
|
|
> bar
|
|
|
|
|
> baz
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<h1>Foo</h1>
|
|
|
|
|
<p>bar
|
|
|
|
|
baz</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Four spaces gives us a code block:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> # Foo
|
|
|
|
|
> bar
|
|
|
|
|
> baz
|
|
|
|
|
.
|
|
|
|
|
<pre><code>> # Foo
|
|
|
|
|
> bar
|
|
|
|
|
> baz
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The Laziness clause allows us to omit the `>` before
|
|
|
|
|
[paragraph continuation text]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> # Foo
|
|
|
|
|
> bar
|
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<h1>Foo</h1>
|
|
|
|
|
<p>bar
|
|
|
|
|
baz</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A block quote can contain some lazy and some non-lazy
|
|
|
|
|
continuation lines:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> bar
|
|
|
|
|
baz
|
|
|
|
|
> foo
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>bar
|
|
|
|
|
baz
|
|
|
|
|
foo</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Laziness only applies to lines that would have been continuations of
|
|
|
|
|
paragraphs had they been prepended with [block quote markers].
|
|
|
|
|
For example, the `> ` cannot be omitted in the second line of
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
> foo
|
|
|
|
|
> ---
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
without changing the meaning:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> foo
|
|
|
|
|
---
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
<hr />
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Similarly, if we omit the `> ` in the second line of
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
> - foo
|
|
|
|
|
> - bar
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
then the block quote ends after the first line:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> - foo
|
|
|
|
|
- bar
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</blockquote>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>bar</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
For the same reason, we can't omit the `> ` in front of
|
|
|
|
|
subsequent lines of an indented or fenced code block:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> foo
|
|
|
|
|
bar
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<pre><code>foo
|
|
|
|
|
</code></pre>
|
|
|
|
|
</blockquote>
|
|
|
|
|
<pre><code>bar
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> ```
|
|
|
|
|
foo
|
|
|
|
|
```
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<pre><code></code></pre>
|
|
|
|
|
</blockquote>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<pre><code></code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that in the following case, we have a [lazy
|
|
|
|
|
continuation line]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> foo
|
|
|
|
|
- bar
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>foo
|
|
|
|
|
- bar</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
To see why, note that in
|
|
|
|
|
|
|
|
|
|
```markdown
|
|
|
|
|
> foo
|
|
|
|
|
> - bar
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
the `- bar` is indented too far to start a list, and can't
|
|
|
|
|
be an indented code block because indented code blocks cannot
|
|
|
|
|
interrupt paragraphs, so it is [paragraph continuation text].
|
|
|
|
|
|
|
|
|
|
A block quote can be empty:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
>
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
>
|
|
|
|
|
>
|
|
|
|
|
>
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A block quote can have initial or final blank lines:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
>
|
|
|
|
|
> foo
|
|
|
|
|
>
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A blank line always separates block quotes:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> foo
|
|
|
|
|
|
|
|
|
|
> bar
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(Most current Markdown implementations, including John Gruber's
|
|
|
|
|
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
|
|
|
|
|
whether two block quotes or one are wanted.)
|
|
|
|
|
|
|
|
|
|
Consecutiveness means that if we put these block quotes together,
|
|
|
|
|
we get a single block quote:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> foo
|
|
|
|
|
> bar
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>foo
|
|
|
|
|
bar</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
To get a block quote with two paragraphs, use:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> foo
|
|
|
|
|
>
|
|
|
|
|
> bar
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Block quotes can interrupt paragraphs:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo
|
|
|
|
|
> bar
|
|
|
|
|
.
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
In general, blank lines are not needed before or after block
|
|
|
|
|
quotes:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> aaa
|
|
|
|
|
***
|
|
|
|
|
> bbb
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>aaa</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
<hr />
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>bbb</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
However, because of laziness, a blank line is needed between
|
|
|
|
|
a block quote and a following paragraph:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> bar
|
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>bar
|
|
|
|
|
baz</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> bar
|
|
|
|
|
|
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
<p>baz</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> bar
|
|
|
|
|
>
|
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
<p>baz</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
It is a consequence of the Laziness rule that any number
|
|
|
|
|
of initial `>`s may be omitted on a continuation line of a
|
|
|
|
|
nested block quote:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> > > foo
|
|
|
|
|
bar
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>foo
|
|
|
|
|
bar</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
>>> foo
|
|
|
|
|
> bar
|
|
|
|
|
>>baz
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>foo
|
|
|
|
|
bar
|
|
|
|
|
baz</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
When including an indented code block in a block quote,
|
|
|
|
|
remember that the [block quote marker] includes
|
|
|
|
|
both the `>` and a following space. So *five spaces* are needed after
|
|
|
|
|
the `>`:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> code
|
|
|
|
|
|
|
|
|
|
> not code
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<pre><code>code
|
|
|
|
|
</code></pre>
|
|
|
|
|
</blockquote>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>not code</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## List items
|
|
|
|
|
|
|
|
|
|
A [list marker](@) is a
|
|
|
|
|
[bullet list marker] or an [ordered list marker].
|
|
|
|
|
|
|
|
|
|
A [bullet list marker](@)
|
|
|
|
|
is a `-`, `+`, or `*` character.
|
|
|
|
|
|
|
|
|
|
An [ordered list marker](@)
|
|
|
|
|
is a sequence of 1--9 arabic digits (`0-9`), followed by either a
|
|
|
|
|
`.` character or a `)` character. (The reason for the length
|
|
|
|
|
limit is that with 10 digits we start seeing integer overflows
|
|
|
|
|
in some browsers.)
|
|
|
|
|
|
|
|
|
|
The following rules define [list items]:
|
|
|
|
|
|
|
|
|
|
1. **Basic case.** If a sequence of lines *Ls* constitute a sequence of
|
2019-10-08 19:00:22 +08:00
|
|
|
|
blocks *Bs* starting with a [non-whitespace character], and *M* is a
|
|
|
|
|
list marker of width *W* followed by 1 ≤ *N* ≤ 4 spaces, then the result
|
2017-07-21 05:44:55 +08:00
|
|
|
|
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
|
|
|
|
|
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.
|
|
|
|
|
If the list item is ordered, then it is also assigned a start
|
|
|
|
|
number, based on the ordered list marker.
|
|
|
|
|
|
2018-03-08 09:19:32 +08:00
|
|
|
|
Exceptions:
|
|
|
|
|
|
|
|
|
|
1. When the first list item in a [list] interrupts
|
|
|
|
|
a paragraph---that is, when it starts on a line that would
|
|
|
|
|
otherwise count as [paragraph continuation text]---then (a)
|
|
|
|
|
the lines *Ls* must not begin with a blank line, and (b) if
|
|
|
|
|
the list item is ordered, the start number must be 1.
|
|
|
|
|
2. If any line is a [thematic break][thematic breaks] then
|
|
|
|
|
that line is not a list item.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
For example, let *Ls* be the lines
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
A paragraph
|
|
|
|
|
with two lines.
|
|
|
|
|
|
|
|
|
|
indented code
|
|
|
|
|
|
|
|
|
|
> A block quote.
|
|
|
|
|
.
|
|
|
|
|
<p>A paragraph
|
|
|
|
|
with two lines.</p>
|
|
|
|
|
<pre><code>indented code
|
|
|
|
|
</code></pre>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>A block quote.</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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,
|
|
|
|
|
and the same contents as *Ls*:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1. A paragraph
|
|
|
|
|
with two lines.
|
|
|
|
|
|
|
|
|
|
indented code
|
|
|
|
|
|
|
|
|
|
> A block quote.
|
|
|
|
|
.
|
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<p>A paragraph
|
|
|
|
|
with two lines.</p>
|
|
|
|
|
<pre><code>indented code
|
|
|
|
|
</code></pre>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>A block quote.</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The most important thing to notice is that the position of
|
|
|
|
|
the text after the list marker determines how much indentation
|
|
|
|
|
is needed in subsequent blocks in the list item. If the list
|
|
|
|
|
marker takes up two spaces, and there are three spaces between
|
|
|
|
|
the list marker and the next [non-whitespace character], then blocks
|
|
|
|
|
must be indented five spaces in order to fall under the list
|
|
|
|
|
item.
|
|
|
|
|
|
|
|
|
|
Here are some examples showing how far content must be indented to be
|
|
|
|
|
put under the list item:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- one
|
|
|
|
|
|
|
|
|
|
two
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>one</li>
|
|
|
|
|
</ul>
|
|
|
|
|
<p>two</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- one
|
|
|
|
|
|
|
|
|
|
two
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>one</p>
|
|
|
|
|
<p>two</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- one
|
|
|
|
|
|
|
|
|
|
two
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>one</li>
|
|
|
|
|
</ul>
|
|
|
|
|
<pre><code> two
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- one
|
|
|
|
|
|
|
|
|
|
two
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>one</p>
|
|
|
|
|
<p>two</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
[non-whitespace character] after the list marker. However, that is not quite right.
|
|
|
|
|
The spaces after the list marker determine how much relative indentation
|
|
|
|
|
is needed. Which column this indentation reaches will depend on
|
|
|
|
|
how the list item is embedded in other constructions, as shown by
|
|
|
|
|
this example:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> > 1. one
|
|
|
|
|
>>
|
|
|
|
|
>> two
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<p>one</p>
|
|
|
|
|
<p>two</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Here `two` occurs in the same column as the list marker `1.`,
|
|
|
|
|
but is actually contained in the list item, because there is
|
|
|
|
|
sufficient indentation after the last containing blockquote marker.
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
it is not considered part of the list item, because it is not indented
|
|
|
|
|
far enough past the blockquote marker:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
>>- one
|
|
|
|
|
>>
|
|
|
|
|
> > two
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>one</li>
|
|
|
|
|
</ul>
|
|
|
|
|
<p>two</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that at least one space is needed between the list marker and
|
|
|
|
|
any following content, so these are not list items:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
-one
|
|
|
|
|
|
|
|
|
|
2.two
|
|
|
|
|
.
|
|
|
|
|
<p>-one</p>
|
|
|
|
|
<p>2.two</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A list item may contain blocks that are separated by more than
|
|
|
|
|
one blank line.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- foo
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bar
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A list item may contain any kind of block:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1. foo
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
bar
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
baz
|
|
|
|
|
|
|
|
|
|
> bam
|
|
|
|
|
.
|
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<pre><code>bar
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>baz</p>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>bam</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A list item that contains an indented code block will preserve
|
|
|
|
|
empty lines within the code block verbatim.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- Foo
|
|
|
|
|
|
|
|
|
|
bar
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>Foo</p>
|
|
|
|
|
<pre><code>bar
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
baz
|
|
|
|
|
</code></pre>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
Note that ordered list start numbers must be nine digits or less:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
123456789. ok
|
|
|
|
|
.
|
|
|
|
|
<ol start="123456789">
|
|
|
|
|
<li>ok</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1234567890. not ok
|
|
|
|
|
.
|
|
|
|
|
<p>1234567890. not ok</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A start number may begin with 0s:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
0. ok
|
|
|
|
|
.
|
|
|
|
|
<ol start="0">
|
|
|
|
|
<li>ok</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
003. ok
|
|
|
|
|
.
|
|
|
|
|
<ol start="3">
|
|
|
|
|
<li>ok</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A start number may not be negative:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
-1. not ok
|
|
|
|
|
.
|
|
|
|
|
<p>-1. not ok</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2. **Item starting with indented code.** If a sequence of lines *Ls*
|
|
|
|
|
constitute a sequence of blocks *Bs* starting with an indented code
|
2019-10-08 19:00:22 +08:00
|
|
|
|
block, and *M* is a list marker of width *W* followed by
|
2017-07-21 05:44:55 +08:00
|
|
|
|
one space, then the result of prepending *M* and the following
|
|
|
|
|
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.
|
|
|
|
|
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
|
|
|
|
|
marker. If the list item is ordered, then it is also assigned a
|
|
|
|
|
start number, based on the ordered list marker.
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
In the following case that is 6 spaces:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- foo
|
|
|
|
|
|
|
|
|
|
bar
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<pre><code>bar
|
|
|
|
|
</code></pre>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
And in this case it is 11 spaces:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
10. foo
|
|
|
|
|
|
|
|
|
|
bar
|
|
|
|
|
.
|
|
|
|
|
<ol start="10">
|
|
|
|
|
<li>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<pre><code>bar
|
|
|
|
|
</code></pre>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
list marker:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
indented code
|
|
|
|
|
|
|
|
|
|
paragraph
|
|
|
|
|
|
|
|
|
|
more code
|
|
|
|
|
.
|
|
|
|
|
<pre><code>indented code
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>paragraph</p>
|
|
|
|
|
<pre><code>more code
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1. indented code
|
|
|
|
|
|
|
|
|
|
paragraph
|
|
|
|
|
|
|
|
|
|
more code
|
|
|
|
|
.
|
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<pre><code>indented code
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>paragraph</p>
|
|
|
|
|
<pre><code>more code
|
|
|
|
|
</code></pre>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that an additional space indent is interpreted as space
|
|
|
|
|
inside the code block:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1. indented code
|
|
|
|
|
|
|
|
|
|
paragraph
|
|
|
|
|
|
|
|
|
|
more code
|
|
|
|
|
.
|
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<pre><code> indented code
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>paragraph</p>
|
|
|
|
|
<pre><code>more code
|
|
|
|
|
</code></pre>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
[non-whitespace 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
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo
|
|
|
|
|
|
|
|
|
|
bar
|
|
|
|
|
.
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- foo
|
|
|
|
|
|
|
|
|
|
bar
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
</ul>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not a significant restriction, because when a block begins
|
|
|
|
|
with 1-3 spaces indent, the indentation can always be removed without
|
|
|
|
|
a change in interpretation, allowing rule #1 to be applied. So, in
|
|
|
|
|
the above case:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- foo
|
|
|
|
|
|
|
|
|
|
bar
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
3. **Item starting with a blank line.** If a sequence of lines *Ls*
|
|
|
|
|
starting with a single [blank line] constitute a (possibly empty)
|
|
|
|
|
sequence of blocks *Bs*, not separated from each other by more than
|
|
|
|
|
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
|
|
|
|
|
indenting subsequent lines of *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
|
|
|
|
|
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
|
|
|
|
|
start number, based on the ordered list marker.
|
|
|
|
|
|
|
|
|
|
Here are some list items that start with a blank line but are not empty:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
-
|
|
|
|
|
foo
|
|
|
|
|
-
|
|
|
|
|
```
|
|
|
|
|
bar
|
|
|
|
|
```
|
|
|
|
|
-
|
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
<li>
|
|
|
|
|
<pre><code>bar
|
|
|
|
|
</code></pre>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<pre><code>baz
|
|
|
|
|
</code></pre>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
When the list item starts with a blank line, the number of spaces
|
|
|
|
|
following the list marker doesn't change the required indentation:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
-
|
|
|
|
|
foo
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A list item can begin with at most one blank line.
|
|
|
|
|
In the following example, `foo` is not part of the list
|
|
|
|
|
item:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
-
|
|
|
|
|
|
|
|
|
|
foo
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li></li>
|
|
|
|
|
</ul>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Here is an empty bullet list item:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- foo
|
|
|
|
|
-
|
|
|
|
|
- bar
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
<li></li>
|
|
|
|
|
<li>bar</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
It does not matter whether there are spaces following the [list marker]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- foo
|
|
|
|
|
-
|
|
|
|
|
- bar
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
<li></li>
|
|
|
|
|
<li>bar</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Here is an empty ordered list item:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1. foo
|
|
|
|
|
2.
|
|
|
|
|
3. bar
|
|
|
|
|
.
|
|
|
|
|
<ol>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
<li></li>
|
|
|
|
|
<li>bar</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A list may start or end with an empty list item:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li></li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
However, an empty list item cannot interrupt a paragraph:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo
|
|
|
|
|
*
|
|
|
|
|
|
|
|
|
|
foo
|
|
|
|
|
1.
|
|
|
|
|
.
|
|
|
|
|
<p>foo
|
|
|
|
|
*</p>
|
|
|
|
|
<p>foo
|
|
|
|
|
1.</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
empty, then it need not be indented.
|
|
|
|
|
|
|
|
|
|
Indented one space:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1. A paragraph
|
|
|
|
|
with two lines.
|
|
|
|
|
|
|
|
|
|
indented code
|
|
|
|
|
|
|
|
|
|
> A block quote.
|
|
|
|
|
.
|
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<p>A paragraph
|
|
|
|
|
with two lines.</p>
|
|
|
|
|
<pre><code>indented code
|
|
|
|
|
</code></pre>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>A block quote.</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Indented two spaces:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1. A paragraph
|
|
|
|
|
with two lines.
|
|
|
|
|
|
|
|
|
|
indented code
|
|
|
|
|
|
|
|
|
|
> A block quote.
|
|
|
|
|
.
|
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<p>A paragraph
|
|
|
|
|
with two lines.</p>
|
|
|
|
|
<pre><code>indented code
|
|
|
|
|
</code></pre>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>A block quote.</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Indented three spaces:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1. A paragraph
|
|
|
|
|
with two lines.
|
|
|
|
|
|
|
|
|
|
indented code
|
|
|
|
|
|
|
|
|
|
> A block quote.
|
|
|
|
|
.
|
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<p>A paragraph
|
|
|
|
|
with two lines.</p>
|
|
|
|
|
<pre><code>indented code
|
|
|
|
|
</code></pre>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>A block quote.</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Four spaces indent gives a code block:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1. A paragraph
|
|
|
|
|
with two lines.
|
|
|
|
|
|
|
|
|
|
indented code
|
|
|
|
|
|
|
|
|
|
> A block quote.
|
|
|
|
|
.
|
|
|
|
|
<pre><code>1. A paragraph
|
|
|
|
|
with two lines.
|
|
|
|
|
|
|
|
|
|
indented code
|
|
|
|
|
|
|
|
|
|
> A block quote.
|
|
|
|
|
</code></pre>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5. **Laziness.** If a string of lines *Ls* constitute a [list
|
|
|
|
|
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
|
|
|
|
|
next [non-whitespace character] after the indentation is
|
|
|
|
|
[paragraph continuation text] is a
|
|
|
|
|
list item with the same contents and attributes. The unindented
|
|
|
|
|
lines are called
|
|
|
|
|
[lazy continuation line](@)s.
|
|
|
|
|
|
|
|
|
|
Here is an example with [lazy continuation lines]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1. A paragraph
|
|
|
|
|
with two lines.
|
|
|
|
|
|
|
|
|
|
indented code
|
|
|
|
|
|
|
|
|
|
> A block quote.
|
|
|
|
|
.
|
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<p>A paragraph
|
|
|
|
|
with two lines.</p>
|
|
|
|
|
<pre><code>indented code
|
|
|
|
|
</code></pre>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>A block quote.</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Indentation can be partially deleted:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1. A paragraph
|
|
|
|
|
with two lines.
|
|
|
|
|
.
|
|
|
|
|
<ol>
|
|
|
|
|
<li>A paragraph
|
|
|
|
|
with two lines.</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
These examples show how laziness can work in nested structures:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> 1. > Blockquote
|
|
|
|
|
continued here.
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>Blockquote
|
|
|
|
|
continued here.</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
> 1. > Blockquote
|
|
|
|
|
> continued here.
|
|
|
|
|
.
|
|
|
|
|
<blockquote>
|
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>Blockquote
|
|
|
|
|
continued here.</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
</blockquote>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
6. **That's all.** Nothing that is not counted as a list item by rules
|
|
|
|
|
#1--5 counts as a [list item](#list-items).
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The rules for sublists follow from the general rules
|
|
|
|
|
[above][List items]. A sublist must be indented the same number
|
|
|
|
|
of spaces a paragraph would need to be in order to be included
|
|
|
|
|
in the list item.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
So, in this case we need two spaces indent:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- foo
|
|
|
|
|
- bar
|
|
|
|
|
- baz
|
|
|
|
|
- boo
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>foo
|
|
|
|
|
<ul>
|
|
|
|
|
<li>bar
|
|
|
|
|
<ul>
|
|
|
|
|
<li>baz
|
|
|
|
|
<ul>
|
|
|
|
|
<li>boo</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
One is not enough:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- foo
|
|
|
|
|
- bar
|
|
|
|
|
- baz
|
|
|
|
|
- boo
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
<li>bar</li>
|
|
|
|
|
<li>baz</li>
|
|
|
|
|
<li>boo</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Here we need four, because the list marker is wider:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
10) foo
|
|
|
|
|
- bar
|
|
|
|
|
.
|
|
|
|
|
<ol start="10">
|
|
|
|
|
<li>foo
|
|
|
|
|
<ul>
|
|
|
|
|
<li>bar</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Three is not enough:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
10) foo
|
|
|
|
|
- bar
|
|
|
|
|
.
|
|
|
|
|
<ol start="10">
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
</ol>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>bar</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A list may be the first block in a list item:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- - foo
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1. - 2. foo
|
|
|
|
|
.
|
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<ol start="2">
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
</ol>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A list item can contain a heading:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- # Foo
|
|
|
|
|
- Bar
|
|
|
|
|
---
|
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<h1>Foo</h1>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<h2>Bar</h2>
|
|
|
|
|
baz</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Motivation
|
|
|
|
|
|
|
|
|
|
John Gruber's Markdown spec says the following about list items:
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
spaces or a tab."
|
|
|
|
|
|
|
|
|
|
2. "To make lists look nice, you can wrap items with hanging indents....
|
|
|
|
|
But if you don't want to, you don't have to."
|
|
|
|
|
|
|
|
|
|
3. "List items may consist of multiple paragraphs. Each subsequent
|
|
|
|
|
paragraph in a list item must be indented by either 4 spaces or one
|
|
|
|
|
tab."
|
|
|
|
|
|
|
|
|
|
4. "It looks nice if you indent every line of the subsequent paragraphs,
|
|
|
|
|
but here again, Markdown will allow you to be lazy."
|
|
|
|
|
|
|
|
|
|
5. "To put a blockquote within a list item, the blockquote's `>`
|
|
|
|
|
delimiters need to be indented."
|
|
|
|
|
|
|
|
|
|
6. "To put a code block within a list item, the code block needs to be
|
|
|
|
|
indented twice — 8 spaces or two tabs."
|
|
|
|
|
|
|
|
|
|
These rules specify that a paragraph under a list item must be indented
|
|
|
|
|
four spaces (presumably, from the left margin, rather than the start of
|
|
|
|
|
the list marker, but this is not said), and that code under a list item
|
|
|
|
|
must be indented eight spaces instead of the usual four. They also say
|
|
|
|
|
that a block quote must be indented, but not by how much; however, the
|
|
|
|
|
example given has four spaces indentation. Although nothing is said
|
|
|
|
|
about other kinds of block-level content, it is certainly reasonable to
|
|
|
|
|
infer that *all* block elements under a list item, including other
|
|
|
|
|
lists, must be indented four spaces. This principle has been called the
|
|
|
|
|
*four-space rule*.
|
|
|
|
|
|
|
|
|
|
The four-space rule is clear and principled, and if the reference
|
|
|
|
|
implementation `Markdown.pl` had followed it, it probably would have
|
|
|
|
|
become the standard. However, `Markdown.pl` allowed paragraphs and
|
|
|
|
|
sublists to start with only two spaces indentation, at least on the
|
|
|
|
|
outer level. Worse, its behavior was inconsistent: a sublist of an
|
|
|
|
|
outer-level list needed two spaces indentation, but a sublist of this
|
|
|
|
|
sublist needed three spaces. It is not surprising, then, that different
|
|
|
|
|
implementations of Markdown have developed very different rules for
|
|
|
|
|
determining what comes under a list item. (Pandoc and python-Markdown,
|
|
|
|
|
for example, stuck with Gruber's syntax description and the four-space
|
|
|
|
|
rule, while discount, redcarpet, marked, PHP Markdown, and others
|
|
|
|
|
followed `Markdown.pl`'s behavior more closely.)
|
|
|
|
|
|
|
|
|
|
Unfortunately, given the divergences between implementations, there
|
|
|
|
|
is no way to give a spec for list items that will be guaranteed not
|
|
|
|
|
to break any existing documents. However, the spec given here should
|
|
|
|
|
correctly handle lists formatted with either the four-space rule or
|
|
|
|
|
the more forgiving `Markdown.pl` behavior, provided they are laid out
|
|
|
|
|
in a way that is natural for a human to read.
|
|
|
|
|
|
|
|
|
|
The strategy here is to let the width and indentation of the list marker
|
|
|
|
|
determine the indentation necessary for blocks to fall under the list
|
|
|
|
|
item, rather than having a fixed and arbitrary number. The writer can
|
|
|
|
|
think of the body of the list item as a unit which gets indented to the
|
|
|
|
|
right enough to fit the list marker (and any indentation on the list
|
|
|
|
|
marker). (The laziness rule, #5, then allows continuation lines to be
|
|
|
|
|
unindented if needed.)
|
|
|
|
|
|
|
|
|
|
This rule is superior, we claim, to any rule requiring a fixed level of
|
|
|
|
|
indentation from the margin. The four-space rule is clear but
|
|
|
|
|
unnatural. It is quite unintuitive that
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
- foo
|
|
|
|
|
|
|
|
|
|
bar
|
|
|
|
|
|
|
|
|
|
- baz
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
should be parsed as two lists with an intervening paragraph,
|
|
|
|
|
|
|
|
|
|
``` html
|
|
|
|
|
<ul>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
</ul>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>baz</li>
|
|
|
|
|
</ul>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
as the four-space rule demands, rather than a single list,
|
|
|
|
|
|
|
|
|
|
``` html
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>baz</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
initial list marker, allows text that is indented *less than* the
|
|
|
|
|
original list marker to be included in the list item. For example,
|
|
|
|
|
`Markdown.pl` parses
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
- one
|
|
|
|
|
|
|
|
|
|
two
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
as a single list item, with `two` a continuation paragraph:
|
|
|
|
|
|
|
|
|
|
``` html
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>one</p>
|
|
|
|
|
<p>two</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
and similarly
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
> - one
|
|
|
|
|
>
|
|
|
|
|
> two
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
as
|
|
|
|
|
|
|
|
|
|
``` html
|
|
|
|
|
<blockquote>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>one</p>
|
|
|
|
|
<p>two</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</blockquote>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
This is extremely unintuitive.
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
may itself be indented). This proposal would remove the last anomaly
|
|
|
|
|
discussed. Unlike the spec presented above, it would count the following
|
|
|
|
|
as a list item with a subparagraph, even though the paragraph `bar`
|
|
|
|
|
is not indented as far as the first paragraph `foo`:
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
10. foo
|
|
|
|
|
|
|
|
|
|
bar
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Arguably this text does read like a list item with `bar` as a subparagraph,
|
|
|
|
|
which may count in favor of the proposal. However, on this proposal indented
|
|
|
|
|
code would have to be indented six spaces after the list marker. And this
|
|
|
|
|
would break a lot of existing Markdown, which has the pattern:
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
1. foo
|
|
|
|
|
|
|
|
|
|
indented code
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
where the code is indented eight spaces. The spec above, by contrast, will
|
|
|
|
|
parse this text as expected, since the code block's indentation is measured
|
|
|
|
|
from the beginning of `foo`.
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
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
|
|
|
|
|
(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
|
|
|
|
|
takes four spaces (a common case), but diverge in other cases.
|
|
|
|
|
|
|
|
|
|
## Lists
|
|
|
|
|
|
|
|
|
|
A [list](@) is a sequence of one or more
|
|
|
|
|
list items [of the same type]. The list items
|
|
|
|
|
may be separated by any number of blank lines.
|
|
|
|
|
|
|
|
|
|
Two list items are [of the same type](@)
|
|
|
|
|
if they begin with a [list marker] of the same type.
|
|
|
|
|
Two list markers are of the
|
|
|
|
|
same type if (a) they are bullet list markers using the same character
|
|
|
|
|
(`-`, `+`, or `*`) or (b) they are ordered list numbers with the same
|
|
|
|
|
delimiter (either `.` or `)`).
|
|
|
|
|
|
|
|
|
|
A list is an [ordered list](@)
|
|
|
|
|
if its constituent list items begin with
|
|
|
|
|
[ordered list markers], and a
|
|
|
|
|
[bullet list](@) if its constituent list
|
|
|
|
|
items begin with [bullet list markers].
|
|
|
|
|
|
|
|
|
|
The [start number](@)
|
|
|
|
|
of an [ordered list] is determined by the list number of
|
|
|
|
|
its initial list item. The numbers of subsequent list items are
|
|
|
|
|
disregarded.
|
|
|
|
|
|
|
|
|
|
A list is [loose](@) 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
|
|
|
|
|
between them. Otherwise a list is [tight](@).
|
|
|
|
|
(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.)
|
|
|
|
|
|
|
|
|
|
Changing the bullet or ordered list delimiter starts a new list:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- foo
|
|
|
|
|
- bar
|
|
|
|
|
+ baz
|
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
<li>bar</li>
|
|
|
|
|
</ul>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>baz</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
1. foo
|
|
|
|
|
2. bar
|
|
|
|
|
3) baz
|
|
|
|
|
.
|
|
|
|
|
<ol>
|
|
|
|
|
<li>foo</li>
|
|
|
|
|
<li>bar</li>
|
|
|
|
|
</ol>
|
|
|
|
|
<ol start="3">
|
|
|
|
|
<li>baz</li>
|
|
|
|
|
</ol>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
In CommonMark, a list can interrupt a paragraph. That is,
|
|
|
|
|
no blank line is needed to separate a paragraph from a following
|
|
|
|
|
list:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
Foo
|
|
|
|
|
- bar
|
|
|
|
|
- baz
|
|
|
|
|
.
|
|
|
|
|
<p>Foo</p>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>bar</li>
|
|
|
|
|
<li>baz</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
`Markdown.pl` does not allow this, through fear of triggering a list
|
|
|
|
|
via a numeral in a hard-wrapped line:
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
The number of windows in my house is
|
|
|
|
|
14. The number of doors is 6.
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Oddly, though, `Markdown.pl` *does* allow a blockquote to
|
|
|
|
|
interrupt a paragraph, even though the same considerations might
|
|
|
|
|
apply.
|
|
|
|
|
|
|
|
|
|
In CommonMark, we do allow lists to interrupt paragraphs, for
|
|
|
|
|
two reasons. First, it is natural and not uncommon for people
|
|
|
|
|
to start lists without blank lines:
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
I need to buy
|
|
|
|
|
- new shoes
|
|
|
|
|
- a coat
|
|
|
|
|
- a plane ticket
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Second, we are attracted to a
|
|
|
|
|
|
|
|
|
|
> [principle of uniformity](@):
|
|
|
|
|
> if a chunk of text has a certain
|
|
|
|
|
> meaning, it will continue to have the same meaning when put into a
|
|
|
|
|
> container block (such as a list item or blockquote).
|
|
|
|
|
|
|
|
|
|
(Indeed, the spec for [list items] and [block quotes] presupposes
|
|
|
|
|
this principle.) This principle implies that if
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
* I need to buy
|
|
|
|
|
- new shoes
|
|
|
|
|
- a coat
|
|
|
|
|
- a plane ticket
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
is a list item containing a paragraph followed by a nested sublist,
|
|
|
|
|
as all Markdown implementations agree it is (though the paragraph
|
|
|
|
|
may be rendered without `<p>` tags, since the list is "tight"),
|
|
|
|
|
then
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
I need to buy
|
|
|
|
|
- new shoes
|
|
|
|
|
- a coat
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- a plane ticket
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
by itself should be a paragraph followed by a nested sublist.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Since it is well established Markdown practice to allow lists to
|
|
|
|
|
interrupt paragraphs inside list items, the [principle of
|
|
|
|
|
uniformity] requires us to allow this outside list items as
|
|
|
|
|
well. ([reStructuredText](http://docutils.sourceforge.net/rst.html)
|
|
|
|
|
takes a different approach, requiring blank lines before lists
|
|
|
|
|
even inside other list items.)
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
In order to solve of unwanted lists in paragraphs with
|
|
|
|
|
hard-wrapped numerals, we allow only lists starting with `1` to
|
|
|
|
|
interrupt paragraphs. Thus,
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The number of windows in my house is
|
|
|
|
|
14. The number of doors is 6.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>The number of windows in my house is
|
|
|
|
|
14. The number of doors is 6.</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
We may still get an unintended result in cases like
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The number of windows in my house is
|
|
|
|
|
1. The number of doors is 6.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>The number of windows in my house is</p>
|
|
|
|
|
<ol>
|
|
|
|
|
<li>The number of doors is 6.</li>
|
|
|
|
|
</ol>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
but this rule should prevent most spurious list captures.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
There can be any number of blank lines between items:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- baz
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>foo</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>bar</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</li>
|
|
|
|
|
<li>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>baz</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- foo
|
|
|
|
|
- bar
|
|
|
|
|
- baz
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
bim
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
|
|
|
|
<ul>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<li>foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
<ul>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<li>bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>baz</p>
|
|
|
|
|
<p>bim</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
To separate consecutive lists of 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 item, you can insert a blank HTML
|
|
|
|
|
comment:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- foo
|
|
|
|
|
- bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<!-- -->
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- baz
|
|
|
|
|
- bim
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
|
|
|
|
<ul>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<li>foo</li>
|
|
|
|
|
<li>bar</li>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</ul>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<!-- -->
|
2017-07-21 05:44:55 +08:00
|
|
|
|
<ul>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<li>baz</li>
|
|
|
|
|
<li>bim</li>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
notcode
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- foo
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<!-- -->
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
code
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>foo</p>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p>notcode</p>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>foo</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<!-- -->
|
|
|
|
|
<pre><code>code
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
List items need not be indented to the same level. The following
|
|
|
|
|
list items will be treated as items at the same list level,
|
|
|
|
|
since none is indented enough to belong to the previous list
|
|
|
|
|
item:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
- a
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- b
|
2017-07-21 05:44:55 +08:00
|
|
|
|
- c
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- d
|
2017-07-21 05:44:55 +08:00
|
|
|
|
- e
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- f
|
|
|
|
|
- g
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
|
|
|
|
<ul>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<li>a</li>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
<li>b</li>
|
|
|
|
|
<li>c</li>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<li>d</li>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
<li>e</li>
|
|
|
|
|
<li>f</li>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<li>g</li>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
</ul>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
1. a
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
2. b
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
3. c
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<p>a</p>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>b</p>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>c</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Note, however, that list items may not be indented more than
|
|
|
|
|
three spaces. Here `- e` is treated as a paragraph continuation
|
|
|
|
|
line, because it is indented more than three spaces:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- a
|
|
|
|
|
- b
|
|
|
|
|
- c
|
|
|
|
|
- d
|
|
|
|
|
- e
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>a</li>
|
|
|
|
|
<li>b</li>
|
|
|
|
|
<li>c</li>
|
|
|
|
|
<li>d
|
|
|
|
|
- e</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
And here, `3. c` is treated as in indented code block,
|
|
|
|
|
because it is indented four spaces and preceded by a
|
|
|
|
|
blank line.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
1. a
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
2. b
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
3. c
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<p>a</p>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>b</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
|
|
|
|
<pre><code>3. c
|
|
|
|
|
</code></pre>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
This is a loose list, because there is a blank line between
|
|
|
|
|
two of the list items:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- a
|
|
|
|
|
- b
|
|
|
|
|
|
|
|
|
|
- c
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>a</p>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>b</p>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>c</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
So is this, with a empty second item:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
* a
|
|
|
|
|
*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
* c
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>a</p>
|
|
|
|
|
</li>
|
|
|
|
|
<li></li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>c</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
These are loose lists, even though there is no space between the items,
|
|
|
|
|
because one of the items directly contains two block-level elements
|
|
|
|
|
with a blank line between them:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- a
|
|
|
|
|
- b
|
|
|
|
|
|
|
|
|
|
c
|
|
|
|
|
- d
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>a</p>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>b</p>
|
|
|
|
|
<p>c</p>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>d</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- a
|
|
|
|
|
- b
|
|
|
|
|
|
|
|
|
|
[ref]: /url
|
|
|
|
|
- d
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>a</p>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>b</p>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>d</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
This is a tight list, because the blank lines are in a code block:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- a
|
|
|
|
|
- ```
|
|
|
|
|
b
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```
|
|
|
|
|
- c
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>a</li>
|
|
|
|
|
<li>
|
|
|
|
|
<pre><code>b
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</code></pre>
|
2019-10-08 19:00:22 +08:00
|
|
|
|
</li>
|
|
|
|
|
<li>c</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
This is a tight list, because the blank line is between two
|
|
|
|
|
paragraphs of a sublist. So the sublist is loose while
|
|
|
|
|
the outer list is tight:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- a
|
|
|
|
|
- b
|
|
|
|
|
|
|
|
|
|
c
|
|
|
|
|
- d
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>a
|
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>b</p>
|
|
|
|
|
<p>c</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
<li>d</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
This is a tight list, because the blank line is inside the
|
|
|
|
|
block quote:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
* a
|
|
|
|
|
> b
|
|
|
|
|
>
|
|
|
|
|
* c
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>a
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>b</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
</li>
|
|
|
|
|
<li>c</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
This list is tight, because the consecutive block elements
|
|
|
|
|
are not separated by blank lines:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- a
|
|
|
|
|
> b
|
|
|
|
|
```
|
|
|
|
|
c
|
|
|
|
|
```
|
|
|
|
|
- d
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>a
|
|
|
|
|
<blockquote>
|
|
|
|
|
<p>b</p>
|
|
|
|
|
</blockquote>
|
|
|
|
|
<pre><code>c
|
|
|
|
|
</code></pre>
|
|
|
|
|
</li>
|
|
|
|
|
<li>d</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
A single-paragraph list is tight:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- a
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>a</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- a
|
|
|
|
|
- b
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>a
|
|
|
|
|
<ul>
|
|
|
|
|
<li>b</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
This list is loose, because of the blank line between the
|
|
|
|
|
two block elements in the list item:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
1. ```
|
|
|
|
|
foo
|
|
|
|
|
```
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ol>
|
|
|
|
|
<li>
|
|
|
|
|
<pre><code>foo
|
|
|
|
|
</code></pre>
|
|
|
|
|
<p>bar</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ol>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Here the outer list is loose, the inner list tight:
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
* foo
|
|
|
|
|
* bar
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
baz
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>bar</li>
|
|
|
|
|
</ul>
|
|
|
|
|
<p>baz</p>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- a
|
|
|
|
|
- b
|
|
|
|
|
- c
|
|
|
|
|
|
|
|
|
|
- d
|
|
|
|
|
- e
|
|
|
|
|
- f
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<ul>
|
|
|
|
|
<li>
|
|
|
|
|
<p>a</p>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>b</li>
|
|
|
|
|
<li>c</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
<li>
|
|
|
|
|
<p>d</p>
|
|
|
|
|
<ul>
|
|
|
|
|
<li>e</li>
|
|
|
|
|
<li>f</li>
|
|
|
|
|
</ul>
|
|
|
|
|
</li>
|
|
|
|
|
</ul>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
# Inlines
|
|
|
|
|
|
|
|
|
|
Inlines are parsed sequentially from the beginning of the character
|
|
|
|
|
stream to the end (left to right, in left-to-right languages).
|
|
|
|
|
Thus, for example, in
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
`hi`lo`
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><code>hi</code>lo`</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
`hi` is parsed as code, leaving the backtick at the end as a literal
|
|
|
|
|
backtick.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Code spans
|
|
|
|
|
|
|
|
|
|
A [backtick string](@)
|
|
|
|
|
is a string of one or more backtick characters (`` ` ``) that is neither
|
|
|
|
|
preceded nor followed by a backtick.
|
|
|
|
|
|
|
|
|
|
A [code span](@) begins with a backtick string and ends with
|
|
|
|
|
a backtick string of equal length. The contents of the code span are
|
2019-10-08 19:00:22 +08:00
|
|
|
|
the characters between these two backtick strings, normalized in the
|
|
|
|
|
following ways:
|
|
|
|
|
|
|
|
|
|
- First, [line endings] are converted to [spaces].
|
|
|
|
|
- If the resulting string both begins *and* ends with a [space]
|
|
|
|
|
character, but does not consist entirely of [space]
|
|
|
|
|
characters, a single [space] character is removed from the
|
|
|
|
|
front and back. This allows you to include code that begins
|
|
|
|
|
or ends with backtick characters, which must be separated by
|
|
|
|
|
whitespace from the opening or closing backtick strings.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
This is a simple code span:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
`foo`
|
|
|
|
|
.
|
|
|
|
|
<p><code>foo</code></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Here two backticks are used, because the code contains a backtick.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
This example also illustrates stripping of a single leading and
|
|
|
|
|
trailing space:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
`` foo ` bar ``
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
|
|
|
|
<p><code>foo ` bar</code></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This example shows the motivation for stripping leading and trailing
|
|
|
|
|
spaces:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
` `` `
|
|
|
|
|
.
|
|
|
|
|
<p><code>``</code></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Note that only *one* space is stripped:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
` `` `
|
|
|
|
|
.
|
|
|
|
|
<p><code> `` </code></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
The stripping only happens if the space is on both
|
|
|
|
|
sides of the string:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
` a`
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><code> a</code></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Only [spaces], and not [unicode whitespace] in general, are
|
|
|
|
|
stripped in this way:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
` b `
|
|
|
|
|
.
|
|
|
|
|
<p><code> b </code></p>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
No stripping occurs if the code span contains only spaces:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
` `
|
|
|
|
|
` `
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><code> </code>
|
|
|
|
|
<code> </code></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[Line endings] are treated like spaces:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
``
|
|
|
|
|
foo
|
|
|
|
|
bar
|
|
|
|
|
baz
|
|
|
|
|
``
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><code>foo bar baz</code></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
``
|
|
|
|
|
foo
|
|
|
|
|
``
|
|
|
|
|
.
|
|
|
|
|
<p><code>foo </code></p>
|
|
|
|
|
````````````````````````````````
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Interior spaces are not collapsed:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
`foo bar
|
|
|
|
|
baz`
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><code>foo bar baz</code></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
Note that browsers will typically collapse consecutive spaces
|
|
|
|
|
when rendering `<code>` elements, so it is recommended that
|
|
|
|
|
the following CSS be used:
|
|
|
|
|
|
|
|
|
|
code{white-space: pre-wrap;}
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
Note that backslash escapes do not work in code spans. All backslashes
|
|
|
|
|
are treated literally:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
`foo\`bar`
|
|
|
|
|
.
|
|
|
|
|
<p><code>foo\</code>bar`</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Backslash escapes are never needed, because one can always choose a
|
|
|
|
|
string of *n* backtick characters as delimiters, where the code does
|
|
|
|
|
not contain any strings of exactly *n* backtick characters.
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
``foo`bar``
|
|
|
|
|
.
|
|
|
|
|
<p><code>foo`bar</code></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
` foo `` bar `
|
|
|
|
|
.
|
|
|
|
|
<p><code>foo `` bar</code></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
Code span backticks have higher precedence than any other inline
|
|
|
|
|
constructs except HTML tags and autolinks. Thus, for example, this is
|
|
|
|
|
not parsed as emphasized text, since the second `*` is part of a code
|
|
|
|
|
span:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo`*`
|
|
|
|
|
.
|
|
|
|
|
<p>*foo<code>*</code></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
And this is not parsed as a link:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[not a `link](/foo`)
|
|
|
|
|
.
|
|
|
|
|
<p>[not a <code>link](/foo</code>)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Code spans, HTML tags, and autolinks have the same precedence.
|
|
|
|
|
Thus, this is code:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
`<a href="`">`
|
|
|
|
|
.
|
|
|
|
|
<p><code><a href="</code>">`</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
But this is an HTML tag:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<a href="`">`
|
|
|
|
|
.
|
|
|
|
|
<p><a href="`">`</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
And this is code:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
`<http://foo.bar.`baz>`
|
|
|
|
|
.
|
|
|
|
|
<p><code><http://foo.bar.</code>baz>`</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
But this is an autolink:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<http://foo.bar.`baz>`
|
|
|
|
|
.
|
|
|
|
|
<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,
|
|
|
|
|
we just have literal backticks:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
```foo``
|
|
|
|
|
.
|
|
|
|
|
<p>```foo``</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
`foo
|
|
|
|
|
.
|
|
|
|
|
<p>`foo</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2018-03-08 09:19:32 +08:00
|
|
|
|
The following case also illustrates the need for opening and
|
|
|
|
|
closing backtick strings to be equal in length:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
`foo``bar``
|
|
|
|
|
.
|
|
|
|
|
<p>`foo<code>bar</code></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
## Emphasis and strong emphasis
|
|
|
|
|
|
|
|
|
|
John Gruber's original [Markdown syntax
|
|
|
|
|
description](http://daringfireball.net/projects/markdown/syntax#em) says:
|
|
|
|
|
|
|
|
|
|
> Markdown treats asterisks (`*`) and underscores (`_`) as indicators of
|
|
|
|
|
> 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>`
|
|
|
|
|
> tag.
|
|
|
|
|
|
|
|
|
|
This is enough for most users, but these rules leave much undecided,
|
|
|
|
|
especially when it comes to nested emphasis. The original
|
|
|
|
|
`Markdown.pl` test suite makes it clear that triple `***` and
|
|
|
|
|
`___` delimiters can be used for strong emphasis, and most
|
|
|
|
|
implementations have also allowed the following patterns:
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
***strong emph***
|
|
|
|
|
***strong** in emph*
|
|
|
|
|
***emph* in strong**
|
|
|
|
|
**in strong *emph***
|
|
|
|
|
*in emph **strong***
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The following patterns are less widely supported, but the intent
|
|
|
|
|
is clear and they are useful (especially in contexts like bibliography
|
|
|
|
|
entries):
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
*emph *with emph* in it*
|
|
|
|
|
**strong **with strong** in it**
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Many implementations have also restricted intraword emphasis to
|
|
|
|
|
the `*` forms, to avoid unwanted emphasis in words containing
|
|
|
|
|
internal underscores. (It is best practice to put these in code
|
|
|
|
|
spans, but users often do not.)
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
internal emphasis: foo*bar*baz
|
|
|
|
|
no emphasis: foo_bar_baz
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The rules given below capture all of these patterns, while allowing
|
|
|
|
|
for efficient parsing strategies that do not backtrack.
|
|
|
|
|
|
|
|
|
|
First, some definitions. A [delimiter run](@) is either
|
|
|
|
|
a sequence of one or more `*` characters that is not preceded or
|
2018-03-08 09:19:32 +08:00
|
|
|
|
followed by a non-backslash-escaped `*` character, or a sequence
|
|
|
|
|
of one or more `_` characters that is not preceded or followed by
|
|
|
|
|
a non-backslash-escaped `_` character.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
A [left-flanking delimiter run](@) is
|
2019-10-08 19:00:22 +08:00
|
|
|
|
a [delimiter run] that is (1) not followed by [Unicode whitespace],
|
|
|
|
|
and either (2a) not followed by a [punctuation character], or
|
|
|
|
|
(2b) followed by a [punctuation character] and
|
2017-07-21 05:44:55 +08:00
|
|
|
|
preceded by [Unicode whitespace] or a [punctuation character].
|
|
|
|
|
For purposes of this definition, the beginning and the end of
|
|
|
|
|
the line count as Unicode whitespace.
|
|
|
|
|
|
|
|
|
|
A [right-flanking delimiter run](@) is
|
2019-10-08 19:00:22 +08:00
|
|
|
|
a [delimiter run] that is (1) not preceded by [Unicode whitespace],
|
|
|
|
|
and either (2a) not preceded by a [punctuation character], or
|
|
|
|
|
(2b) preceded by a [punctuation character] and
|
2017-07-21 05:44:55 +08:00
|
|
|
|
followed by [Unicode whitespace] or a [punctuation character].
|
|
|
|
|
For purposes of this definition, the beginning and the end of
|
|
|
|
|
the line count as Unicode whitespace.
|
|
|
|
|
|
|
|
|
|
Here are some examples of delimiter runs.
|
|
|
|
|
|
|
|
|
|
- left-flanking but not right-flanking:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
***abc
|
|
|
|
|
_abc
|
|
|
|
|
**"abc"
|
|
|
|
|
_"abc"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- right-flanking but not left-flanking:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
abc***
|
|
|
|
|
abc_
|
|
|
|
|
"abc"**
|
|
|
|
|
"abc"_
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- Both left and right-flanking:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
abc***def
|
|
|
|
|
"abc"_"def"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
- Neither left nor right-flanking:
|
|
|
|
|
|
|
|
|
|
```
|
|
|
|
|
abc *** def
|
|
|
|
|
a _ b
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
(The idea of distinguishing left-flanking and right-flanking
|
|
|
|
|
delimiter runs based on the character before and the character
|
|
|
|
|
after comes from Roopesh Chander's
|
|
|
|
|
[vfmd](http://www.vfmd.org/vfmd-spec/specification/#procedure-for-identifying-emphasis-tags).
|
|
|
|
|
vfmd uses the terminology "emphasis indicator string" instead of "delimiter
|
|
|
|
|
run," and its rules for distinguishing left- and right-flanking runs
|
|
|
|
|
are a bit more complex than the ones given here.)
|
|
|
|
|
|
|
|
|
|
The following rules define emphasis and strong emphasis:
|
|
|
|
|
|
|
|
|
|
1. A single `*` character [can open emphasis](@)
|
|
|
|
|
iff (if and only if) it is part of a [left-flanking delimiter run].
|
|
|
|
|
|
|
|
|
|
2. A single `_` character [can open emphasis] iff
|
|
|
|
|
it is part of a [left-flanking delimiter run]
|
|
|
|
|
and either (a) not part of a [right-flanking delimiter run]
|
|
|
|
|
or (b) part of a [right-flanking delimiter run]
|
|
|
|
|
preceded by punctuation.
|
|
|
|
|
|
|
|
|
|
3. A single `*` character [can close emphasis](@)
|
|
|
|
|
iff it is part of a [right-flanking delimiter run].
|
|
|
|
|
|
|
|
|
|
4. A single `_` character [can close emphasis] iff
|
|
|
|
|
it is part of a [right-flanking delimiter run]
|
|
|
|
|
and either (a) not part of a [left-flanking delimiter run]
|
|
|
|
|
or (b) part of a [left-flanking delimiter run]
|
|
|
|
|
followed by punctuation.
|
|
|
|
|
|
|
|
|
|
5. A double `**` [can open strong emphasis](@)
|
|
|
|
|
iff it is part of a [left-flanking delimiter run].
|
|
|
|
|
|
|
|
|
|
6. A double `__` [can open strong emphasis] iff
|
|
|
|
|
it is part of a [left-flanking delimiter run]
|
|
|
|
|
and either (a) not part of a [right-flanking delimiter run]
|
|
|
|
|
or (b) part of a [right-flanking delimiter run]
|
|
|
|
|
preceded by punctuation.
|
|
|
|
|
|
|
|
|
|
7. A double `**` [can close strong emphasis](@)
|
|
|
|
|
iff it is part of a [right-flanking delimiter run].
|
|
|
|
|
|
2018-03-08 09:19:32 +08:00
|
|
|
|
8. A double `__` [can close strong emphasis] iff
|
2017-07-21 05:44:55 +08:00
|
|
|
|
it is part of a [right-flanking delimiter run]
|
|
|
|
|
and either (a) not part of a [left-flanking delimiter run]
|
|
|
|
|
or (b) part of a [left-flanking delimiter run]
|
|
|
|
|
followed by punctuation.
|
|
|
|
|
|
|
|
|
|
9. Emphasis begins with a delimiter that [can open emphasis] and ends
|
|
|
|
|
with a delimiter that [can close emphasis], and that uses the same
|
|
|
|
|
character (`_` or `*`) as the opening delimiter. The
|
|
|
|
|
opening and closing delimiters must belong to separate
|
|
|
|
|
[delimiter runs]. If one of the delimiters can both
|
|
|
|
|
open and close emphasis, then the sum of the lengths of the
|
|
|
|
|
delimiter runs containing the opening and closing delimiters
|
2019-10-08 19:00:22 +08:00
|
|
|
|
must not be a multiple of 3 unless both lengths are
|
|
|
|
|
multiples of 3.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
10. Strong emphasis begins with a delimiter that
|
|
|
|
|
[can open strong emphasis] and ends with a delimiter that
|
|
|
|
|
[can close strong emphasis], and that uses the same character
|
|
|
|
|
(`_` or `*`) as the opening delimiter. The
|
|
|
|
|
opening and closing delimiters must belong to separate
|
|
|
|
|
[delimiter runs]. If one of the delimiters can both open
|
|
|
|
|
and close strong emphasis, then the sum of the lengths of
|
|
|
|
|
the delimiter runs containing the opening and closing
|
2019-10-08 19:00:22 +08:00
|
|
|
|
delimiters must not be a multiple of 3 unless both lengths
|
|
|
|
|
are multiples of 3.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
11. A literal `*` character cannot occur at the beginning or end of
|
|
|
|
|
`*`-delimited emphasis or `**`-delimited strong emphasis, unless it
|
|
|
|
|
is backslash-escaped.
|
|
|
|
|
|
|
|
|
|
12. A literal `_` character cannot occur at the beginning or end of
|
|
|
|
|
`_`-delimited emphasis or `__`-delimited strong emphasis, unless it
|
|
|
|
|
is backslash-escaped.
|
|
|
|
|
|
|
|
|
|
Where rules 1--12 above are compatible with multiple parsings,
|
|
|
|
|
the following principles resolve ambiguity:
|
|
|
|
|
|
|
|
|
|
13. The number of nestings should be minimized. Thus, for example,
|
|
|
|
|
an interpretation `<strong>...</strong>` is always preferred to
|
|
|
|
|
`<em><em>...</em></em>`.
|
|
|
|
|
|
2018-03-08 09:19:32 +08:00
|
|
|
|
14. An interpretation `<em><strong>...</strong></em>` is always
|
|
|
|
|
preferred to `<strong><em>...</em></strong>`.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
15. When two potential emphasis or strong emphasis spans overlap,
|
|
|
|
|
so that the second begins before the first ends and ends after
|
|
|
|
|
the first ends, the first takes precedence. Thus, for example,
|
|
|
|
|
`*foo _bar* baz_` is parsed as `<em>foo _bar</em> baz_` rather
|
|
|
|
|
than `*foo <em>bar* baz</em>`.
|
|
|
|
|
|
|
|
|
|
16. When there are two potential emphasis or strong emphasis spans
|
|
|
|
|
with the same closing delimiter, the shorter one (the one that
|
|
|
|
|
opens later) takes precedence. Thus, for example,
|
|
|
|
|
`**foo **bar baz**` is parsed as `**foo <strong>bar baz</strong>`
|
|
|
|
|
rather than `<strong>foo **bar baz</strong>`.
|
|
|
|
|
|
|
|
|
|
17. Inline code spans, links, images, and HTML tags group more tightly
|
|
|
|
|
than emphasis. So, when there is a choice between an interpretation
|
|
|
|
|
that contains one of these elements and one that does not, the
|
|
|
|
|
former always wins. Thus, for example, `*[foo*](bar)` is
|
|
|
|
|
parsed as `*<a href="bar">foo*</a>` rather than as
|
|
|
|
|
`<em>[foo</em>](bar)`.
|
|
|
|
|
|
|
|
|
|
These rules can be illustrated through a series of examples.
|
|
|
|
|
|
|
|
|
|
Rule 1:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo bar*
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo bar</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not emphasis, because the opening `*` is followed by
|
|
|
|
|
whitespace, and hence not part of a [left-flanking delimiter run]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
a * foo bar*
|
|
|
|
|
.
|
|
|
|
|
<p>a * foo bar*</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not emphasis, because the opening `*` is preceded
|
|
|
|
|
by an alphanumeric and followed by punctuation, and hence
|
|
|
|
|
not part of a [left-flanking delimiter run]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
a*"foo"*
|
|
|
|
|
.
|
|
|
|
|
<p>a*"foo"*</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Unicode nonbreaking spaces count as whitespace, too:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
* a *
|
|
|
|
|
.
|
|
|
|
|
<p>* a *</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Intraword emphasis with `*` is permitted:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo*bar*
|
|
|
|
|
.
|
|
|
|
|
<p>foo<em>bar</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
5*6*78
|
|
|
|
|
.
|
|
|
|
|
<p>5<em>6</em>78</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 2:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_foo bar_
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo bar</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not emphasis, because the opening `_` is followed by
|
|
|
|
|
whitespace:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_ foo bar_
|
|
|
|
|
.
|
|
|
|
|
<p>_ foo bar_</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not emphasis, because the opening `_` is preceded
|
|
|
|
|
by an alphanumeric and followed by punctuation:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
a_"foo"_
|
|
|
|
|
.
|
|
|
|
|
<p>a_"foo"_</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Emphasis with `_` is not allowed inside words:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo_bar_
|
|
|
|
|
.
|
|
|
|
|
<p>foo_bar_</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
5_6_78
|
|
|
|
|
.
|
|
|
|
|
<p>5_6_78</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
пристаням_стремятся_
|
|
|
|
|
.
|
|
|
|
|
<p>пристаням_стремятся_</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Here `_` does not generate emphasis, because the first delimiter run
|
|
|
|
|
is right-flanking and the second left-flanking:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
aa_"bb"_cc
|
|
|
|
|
.
|
|
|
|
|
<p>aa_"bb"_cc</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is emphasis, even though the opening delimiter is
|
|
|
|
|
both left- and right-flanking, because it is preceded by
|
|
|
|
|
punctuation:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo-_(bar)_
|
|
|
|
|
.
|
|
|
|
|
<p>foo-<em>(bar)</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 3:
|
|
|
|
|
|
|
|
|
|
This is not emphasis, because the closing delimiter does
|
|
|
|
|
not match the opening delimiter:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_foo*
|
|
|
|
|
.
|
|
|
|
|
<p>_foo*</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not emphasis, because the closing `*` is preceded by
|
|
|
|
|
whitespace:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo bar *
|
|
|
|
|
.
|
|
|
|
|
<p>*foo bar *</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A newline also counts as whitespace:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo bar
|
|
|
|
|
*
|
|
|
|
|
.
|
|
|
|
|
<p>*foo bar
|
|
|
|
|
*</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not emphasis, because the second `*` is
|
|
|
|
|
preceded by punctuation and followed by an alphanumeric
|
|
|
|
|
(hence it is not part of a [right-flanking delimiter run]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*(*foo)
|
|
|
|
|
.
|
|
|
|
|
<p>*(*foo)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The point of this restriction is more easily appreciated
|
|
|
|
|
with this example:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*(*foo*)*
|
|
|
|
|
.
|
|
|
|
|
<p><em>(<em>foo</em>)</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Intraword emphasis with `*` is allowed:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo*bar
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo</em>bar</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 4:
|
|
|
|
|
|
|
|
|
|
This is not emphasis, because the closing `_` is preceded by
|
|
|
|
|
whitespace:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_foo bar _
|
|
|
|
|
.
|
|
|
|
|
<p>_foo bar _</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not emphasis, because the second `_` is
|
|
|
|
|
preceded by punctuation and followed by an alphanumeric:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_(_foo)
|
|
|
|
|
.
|
|
|
|
|
<p>_(_foo)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is emphasis within emphasis:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_(_foo_)_
|
|
|
|
|
.
|
|
|
|
|
<p><em>(<em>foo</em>)</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Intraword emphasis is disallowed for `_`:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_foo_bar
|
|
|
|
|
.
|
|
|
|
|
<p>_foo_bar</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_пристаням_стремятся
|
|
|
|
|
.
|
|
|
|
|
<p>_пристаням_стремятся</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_foo_bar_baz_
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo_bar_baz</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is emphasis, even though the closing delimiter is
|
|
|
|
|
both left- and right-flanking, because it is followed by
|
|
|
|
|
punctuation:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_(bar)_.
|
|
|
|
|
.
|
|
|
|
|
<p><em>(bar)</em>.</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 5:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo bar**
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo bar</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not strong emphasis, because the opening delimiter is
|
|
|
|
|
followed by whitespace:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
** foo bar**
|
|
|
|
|
.
|
|
|
|
|
<p>** foo bar**</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not strong emphasis, because the opening `**` is preceded
|
|
|
|
|
by an alphanumeric and followed by punctuation, and hence
|
|
|
|
|
not part of a [left-flanking delimiter run]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
a**"foo"**
|
|
|
|
|
.
|
|
|
|
|
<p>a**"foo"**</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Intraword strong emphasis with `**` is permitted:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo**bar**
|
|
|
|
|
.
|
|
|
|
|
<p>foo<strong>bar</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 6:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__foo bar__
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo bar</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not strong emphasis, because the opening delimiter is
|
|
|
|
|
followed by whitespace:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__ foo bar__
|
|
|
|
|
.
|
|
|
|
|
<p>__ foo bar__</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A newline counts as whitespace:
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__
|
|
|
|
|
foo bar__
|
|
|
|
|
.
|
|
|
|
|
<p>__
|
|
|
|
|
foo bar__</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not strong emphasis, because the opening `__` is preceded
|
|
|
|
|
by an alphanumeric and followed by punctuation:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
a__"foo"__
|
|
|
|
|
.
|
|
|
|
|
<p>a__"foo"__</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Intraword strong emphasis is forbidden with `__`:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo__bar__
|
|
|
|
|
.
|
|
|
|
|
<p>foo__bar__</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
5__6__78
|
|
|
|
|
.
|
|
|
|
|
<p>5__6__78</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
пристаням__стремятся__
|
|
|
|
|
.
|
|
|
|
|
<p>пристаням__стремятся__</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__foo, __bar__, baz__
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo, <strong>bar</strong>, baz</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is strong emphasis, even though the opening delimiter is
|
|
|
|
|
both left- and right-flanking, because it is preceded by
|
|
|
|
|
punctuation:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo-__(bar)__
|
|
|
|
|
.
|
|
|
|
|
<p>foo-<strong>(bar)</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 7:
|
|
|
|
|
|
|
|
|
|
This is not strong emphasis, because the closing delimiter is preceded
|
|
|
|
|
by whitespace:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo bar **
|
|
|
|
|
.
|
|
|
|
|
<p>**foo bar **</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(Nor can it be interpreted as an emphasized `*foo bar *`, because of
|
|
|
|
|
Rule 11.)
|
|
|
|
|
|
|
|
|
|
This is not strong emphasis, because the second `**` is
|
|
|
|
|
preceded by punctuation and followed by an alphanumeric:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**(**foo)
|
|
|
|
|
.
|
|
|
|
|
<p>**(**foo)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The point of this restriction is more easily appreciated
|
|
|
|
|
with these examples:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*(**foo**)*
|
|
|
|
|
.
|
|
|
|
|
<p><em>(<strong>foo</strong>)</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**Gomphocarpus (*Gomphocarpus physocarpus*, syn.
|
|
|
|
|
*Asclepias physocarpa*)**
|
|
|
|
|
.
|
|
|
|
|
<p><strong>Gomphocarpus (<em>Gomphocarpus physocarpus</em>, syn.
|
|
|
|
|
<em>Asclepias physocarpa</em>)</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo "*bar*" foo**
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo "<em>bar</em>" foo</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Intraword emphasis:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo**bar
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo</strong>bar</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 8:
|
|
|
|
|
|
|
|
|
|
This is not strong emphasis, because the closing delimiter is
|
|
|
|
|
preceded by whitespace:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__foo bar __
|
|
|
|
|
.
|
|
|
|
|
<p>__foo bar __</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is not strong emphasis, because the second `__` is
|
|
|
|
|
preceded by punctuation and followed by an alphanumeric:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__(__foo)
|
|
|
|
|
.
|
|
|
|
|
<p>__(__foo)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The point of this restriction is more easily appreciated
|
|
|
|
|
with this example:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_(__foo__)_
|
|
|
|
|
.
|
|
|
|
|
<p><em>(<strong>foo</strong>)</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Intraword strong emphasis is forbidden with `__`:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__foo__bar
|
|
|
|
|
.
|
|
|
|
|
<p>__foo__bar</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__пристаням__стремятся
|
|
|
|
|
.
|
|
|
|
|
<p>__пристаням__стремятся</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__foo__bar__baz__
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo__bar__baz</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is strong emphasis, even though the closing delimiter is
|
|
|
|
|
both left- and right-flanking, because it is followed by
|
|
|
|
|
punctuation:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__(bar)__.
|
|
|
|
|
.
|
|
|
|
|
<p><strong>(bar)</strong>.</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 9:
|
|
|
|
|
|
|
|
|
|
Any nonempty sequence of inline elements can be the contents of an
|
|
|
|
|
emphasized span.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo [bar](/url)*
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo <a href="/url">bar</a></em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo
|
|
|
|
|
bar*
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo
|
|
|
|
|
bar</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
In particular, emphasis and strong emphasis can be nested
|
|
|
|
|
inside emphasis:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_foo __bar__ baz_
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo <strong>bar</strong> baz</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_foo _bar_ baz_
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo <em>bar</em> baz</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__foo_ bar_
|
|
|
|
|
.
|
|
|
|
|
<p><em><em>foo</em> bar</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo *bar**
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo <em>bar</em></em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo **bar** baz*
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo <strong>bar</strong> baz</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo**bar**baz*
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo<strong>bar</strong>baz</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
Note that in the preceding case, the interpretation
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
<p><em>foo</em><em>bar<em></em>baz</em></p>
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
is precluded by the condition that a delimiter that
|
|
|
|
|
can both open and close (like the `*` after `foo`)
|
|
|
|
|
cannot form emphasis if the sum of the lengths of
|
|
|
|
|
the delimiter runs containing the opening and
|
2019-10-08 19:00:22 +08:00
|
|
|
|
closing delimiters is a multiple of 3 unless
|
|
|
|
|
both lengths are multiples of 3.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
For the same reason, we don't get two consecutive
|
|
|
|
|
emphasis sections in this example:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo**bar*
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo**bar</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
The same condition ensures that the following
|
|
|
|
|
cases are all strong emphasis nested inside
|
|
|
|
|
emphasis, even when the interior spaces are
|
|
|
|
|
omitted:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
***foo** bar*
|
|
|
|
|
.
|
|
|
|
|
<p><em><strong>foo</strong> bar</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo **bar***
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo <strong>bar</strong></em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo**bar***
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo<strong>bar</strong></em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
When the lengths of the interior closing and opening
|
|
|
|
|
delimiter runs are *both* multiples of 3, though,
|
|
|
|
|
they can match to create emphasis:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo***bar***baz
|
|
|
|
|
.
|
|
|
|
|
<p>foo<em><strong>bar</strong></em>baz</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo******bar*********baz
|
|
|
|
|
.
|
|
|
|
|
<p>foo<strong><strong><strong>bar</strong></strong></strong>***baz</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
Indefinite levels of nesting are possible:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo **bar *baz* bim** bop*
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo <strong>bar <em>baz</em> bim</strong> bop</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo [*bar*](/url)*
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo <a href="/url"><em>bar</em></a></em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
There can be no empty emphasis or strong emphasis:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
** is not an empty emphasis
|
|
|
|
|
.
|
|
|
|
|
<p>** is not an empty emphasis</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**** is not an empty strong emphasis
|
|
|
|
|
.
|
|
|
|
|
<p>**** is not an empty strong emphasis</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 10:
|
|
|
|
|
|
|
|
|
|
Any nonempty sequence of inline elements can be the contents of an
|
|
|
|
|
strongly emphasized span.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo [bar](/url)**
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo <a href="/url">bar</a></strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo
|
|
|
|
|
bar**
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo
|
|
|
|
|
bar</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
In particular, emphasis and strong emphasis can be nested
|
|
|
|
|
inside strong emphasis:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__foo _bar_ baz__
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo <em>bar</em> baz</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__foo __bar__ baz__
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo <strong>bar</strong> baz</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
____foo__ bar__
|
|
|
|
|
.
|
|
|
|
|
<p><strong><strong>foo</strong> bar</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo **bar****
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo <strong>bar</strong></strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo *bar* baz**
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo <em>bar</em> baz</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo*bar*baz**
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo<em>bar</em>baz</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
***foo* bar**
|
|
|
|
|
.
|
|
|
|
|
<p><strong><em>foo</em> bar</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo *bar***
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo <em>bar</em></strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Indefinite levels of nesting are possible:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo *bar **baz**
|
|
|
|
|
bim* bop**
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo <em>bar <strong>baz</strong>
|
|
|
|
|
bim</em> bop</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo [*bar*](/url)**
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo <a href="/url"><em>bar</em></a></strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
There can be no empty emphasis or strong emphasis:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__ is not an empty emphasis
|
|
|
|
|
.
|
|
|
|
|
<p>__ is not an empty emphasis</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
____ is not an empty strong emphasis
|
|
|
|
|
.
|
|
|
|
|
<p>____ is not an empty strong emphasis</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 11:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo ***
|
|
|
|
|
.
|
|
|
|
|
<p>foo ***</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo *\**
|
|
|
|
|
.
|
|
|
|
|
<p>foo <em>*</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo *_*
|
|
|
|
|
.
|
|
|
|
|
<p>foo <em>_</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo *****
|
|
|
|
|
.
|
|
|
|
|
<p>foo *****</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo **\***
|
|
|
|
|
.
|
|
|
|
|
<p>foo <strong>*</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo **_**
|
|
|
|
|
.
|
|
|
|
|
<p>foo <strong>_</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that when delimiters do not match evenly, Rule 11 determines
|
|
|
|
|
that the excess literal `*` characters will appear outside of the
|
|
|
|
|
emphasis, rather than inside it:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo*
|
|
|
|
|
.
|
|
|
|
|
<p>*<em>foo</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo**
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo</em>*</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
***foo**
|
|
|
|
|
.
|
|
|
|
|
<p>*<strong>foo</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
****foo*
|
|
|
|
|
.
|
|
|
|
|
<p>***<em>foo</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo***
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo</strong>*</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo****
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo</em>***</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 12:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo ___
|
|
|
|
|
.
|
|
|
|
|
<p>foo ___</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo _\__
|
|
|
|
|
.
|
|
|
|
|
<p>foo <em>_</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo _*_
|
|
|
|
|
.
|
|
|
|
|
<p>foo <em>*</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo _____
|
|
|
|
|
.
|
|
|
|
|
<p>foo _____</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo __\___
|
|
|
|
|
.
|
|
|
|
|
<p>foo <strong>_</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo __*__
|
|
|
|
|
.
|
|
|
|
|
<p>foo <strong>*</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__foo_
|
|
|
|
|
.
|
|
|
|
|
<p>_<em>foo</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that when delimiters do not match evenly, Rule 12 determines
|
|
|
|
|
that the excess literal `_` characters will appear outside of the
|
|
|
|
|
emphasis, rather than inside it:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_foo__
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo</em>_</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
___foo__
|
|
|
|
|
.
|
|
|
|
|
<p>_<strong>foo</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
____foo_
|
|
|
|
|
.
|
|
|
|
|
<p>___<em>foo</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__foo___
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo</strong>_</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_foo____
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo</em>___</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 13 implies that if you want emphasis nested directly inside
|
|
|
|
|
emphasis, you must use different delimiters:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo**
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*_foo_*
|
|
|
|
|
.
|
|
|
|
|
<p><em><em>foo</em></em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__foo__
|
|
|
|
|
.
|
|
|
|
|
<p><strong>foo</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_*foo*_
|
|
|
|
|
.
|
|
|
|
|
<p><em><em>foo</em></em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
However, strong emphasis within strong emphasis is possible without
|
|
|
|
|
switching delimiters:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
****foo****
|
|
|
|
|
.
|
|
|
|
|
<p><strong><strong>foo</strong></strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
____foo____
|
|
|
|
|
.
|
|
|
|
|
<p><strong><strong>foo</strong></strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 13 can be applied to arbitrarily long sequences of
|
|
|
|
|
delimiters:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
******foo******
|
|
|
|
|
.
|
|
|
|
|
<p><strong><strong><strong>foo</strong></strong></strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 14:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
***foo***
|
|
|
|
|
.
|
2018-03-08 09:19:32 +08:00
|
|
|
|
<p><em><strong>foo</strong></em></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_____foo_____
|
|
|
|
|
.
|
2018-03-08 09:19:32 +08:00
|
|
|
|
<p><em><strong><strong>foo</strong></strong></em></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 15:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo _bar* baz_
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo _bar</em> baz_</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo __bar *baz bim__ bam*
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo <strong>bar *baz bim</strong> bam</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 16:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**foo **bar baz**
|
|
|
|
|
.
|
|
|
|
|
<p>**foo <strong>bar baz</strong></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo *bar baz*
|
|
|
|
|
.
|
|
|
|
|
<p>*foo <em>bar baz</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Rule 17:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*[bar*](/url)
|
|
|
|
|
.
|
|
|
|
|
<p>*<a href="/url">bar*</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_foo [bar_](/url)
|
|
|
|
|
.
|
|
|
|
|
<p>_foo <a href="/url">bar_</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*<img src="foo" title="*"/>
|
|
|
|
|
.
|
|
|
|
|
<p>*<img src="foo" title="*"/></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**<a href="**">
|
|
|
|
|
.
|
|
|
|
|
<p>**<a href="**"></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__<a href="__">
|
|
|
|
|
.
|
|
|
|
|
<p>__<a href="__"></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*a `*`*
|
|
|
|
|
.
|
|
|
|
|
<p><em>a <code>*</code></em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
_a `_`_
|
|
|
|
|
.
|
|
|
|
|
<p><em>a <code>_</code></em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
**a<http://foo.bar/?q=**>
|
|
|
|
|
.
|
|
|
|
|
<p>**a<a href="http://foo.bar/?q=**">http://foo.bar/?q=**</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
__a<http://foo.bar/?q=__>
|
|
|
|
|
.
|
|
|
|
|
<p>__a<a href="http://foo.bar/?q=__">http://foo.bar/?q=__</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Links
|
|
|
|
|
|
|
|
|
|
A link contains [link text] (the visible text), a [link destination]
|
|
|
|
|
(the URI that is the link destination), and optionally a [link title].
|
|
|
|
|
There are two basic kinds of links in Markdown. In [inline links] the
|
|
|
|
|
destination and title are given immediately after the link text. In
|
|
|
|
|
[reference links] the destination and title are defined elsewhere in
|
|
|
|
|
the document.
|
|
|
|
|
|
|
|
|
|
A [link text](@) consists of a sequence of zero or more
|
|
|
|
|
inline elements enclosed by square brackets (`[` and `]`). The
|
|
|
|
|
following rules apply:
|
|
|
|
|
|
|
|
|
|
- Links may not contain other links, at any level of nesting. If
|
|
|
|
|
multiple otherwise valid link definitions appear nested inside each
|
|
|
|
|
other, the inner-most definition is used.
|
|
|
|
|
|
|
|
|
|
- Brackets are allowed in the [link text] only if (a) they
|
|
|
|
|
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
|
|
|
|
|
a close bracket `]`.
|
|
|
|
|
|
|
|
|
|
- Backtick [code spans], [autolinks], and raw [HTML tags] bind more tightly
|
|
|
|
|
than the brackets in link text. Thus, for example,
|
|
|
|
|
`` [foo`]` `` could not be a link text, since the second `]`
|
|
|
|
|
is part of a code span.
|
|
|
|
|
|
|
|
|
|
- The brackets in link text bind more tightly than markers for
|
|
|
|
|
[emphasis and strong emphasis]. Thus, for example, `*[foo*](url)` is a link.
|
|
|
|
|
|
|
|
|
|
A [link destination](@) consists of either
|
|
|
|
|
|
|
|
|
|
- a sequence of zero or more characters between an opening `<` and a
|
2019-10-08 19:00:22 +08:00
|
|
|
|
closing `>` that contains no line breaks or unescaped
|
2017-07-21 05:44:55 +08:00
|
|
|
|
`<` or `>` characters, or
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- a nonempty sequence of characters that does not start with `<`,
|
|
|
|
|
does not include [ASCII control characters][ASCII control character]
|
|
|
|
|
or [whitespace][], and includes parentheses only if (a) they are
|
|
|
|
|
backslash-escaped or (b) they are part of a balanced pair of
|
|
|
|
|
unescaped parentheses.
|
|
|
|
|
(Implementations may impose limits on parentheses nesting to
|
|
|
|
|
avoid performance issues, but at least three levels of nesting
|
|
|
|
|
should be supported.)
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
A [link title](@) consists of either
|
|
|
|
|
|
|
|
|
|
- a sequence of zero or more characters between straight double-quote
|
|
|
|
|
characters (`"`), including a `"` character only if it is
|
|
|
|
|
backslash-escaped, or
|
|
|
|
|
|
|
|
|
|
- a sequence of zero or more characters between straight single-quote
|
|
|
|
|
characters (`'`), including a `'` character only if it is
|
|
|
|
|
backslash-escaped, or
|
|
|
|
|
|
|
|
|
|
- a sequence of zero or more characters between matching parentheses
|
2019-10-08 19:00:22 +08:00
|
|
|
|
(`(...)`), including a `(` or `)` character only if it is
|
|
|
|
|
backslash-escaped.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
Although [link titles] may span multiple lines, they may not contain
|
|
|
|
|
a [blank line].
|
|
|
|
|
|
|
|
|
|
An [inline link](@) consists of a [link text] followed immediately
|
|
|
|
|
by a left parenthesis `(`, optional [whitespace], an optional
|
|
|
|
|
[link destination], an optional [link title] separated from the link
|
|
|
|
|
destination by [whitespace], optional [whitespace], and a right
|
|
|
|
|
parenthesis `)`. The link's text consists of the inlines contained
|
|
|
|
|
in the [link text] (excluding the enclosing square brackets).
|
|
|
|
|
The link's URI consists of the link destination, excluding enclosing
|
|
|
|
|
`<...>` if present, with backslash-escapes in effect as described
|
|
|
|
|
above. The link's title consists of the link title, excluding its
|
|
|
|
|
enclosing delimiters, with backslash-escapes in effect as described
|
|
|
|
|
above.
|
|
|
|
|
|
|
|
|
|
Here is a simple inline link:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](/uri "title")
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/uri" title="title">link</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The title may be omitted:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](/uri)
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/uri">link</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Both the title and the destination may be omitted:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link]()
|
|
|
|
|
.
|
|
|
|
|
<p><a href="">link</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](<>)
|
|
|
|
|
.
|
|
|
|
|
<p><a href="">link</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The destination can only contain spaces if it is
|
|
|
|
|
enclosed in pointy brackets:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](/my uri)
|
|
|
|
|
.
|
|
|
|
|
<p>[link](/my uri)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](</my uri>)
|
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><a href="/my%20uri">link</a></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The destination cannot contain line breaks,
|
|
|
|
|
even if enclosed in pointy brackets:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](foo
|
|
|
|
|
bar)
|
|
|
|
|
.
|
|
|
|
|
<p>[link](foo
|
|
|
|
|
bar)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](<foo
|
|
|
|
|
bar>)
|
|
|
|
|
.
|
|
|
|
|
<p>[link](<foo
|
|
|
|
|
bar>)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The destination can contain `)` if it is enclosed
|
|
|
|
|
in pointy brackets:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[a](<b)c>)
|
|
|
|
|
.
|
|
|
|
|
<p><a href="b)c">a</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
Pointy brackets that enclose links must be unescaped:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](<foo\>)
|
|
|
|
|
.
|
|
|
|
|
<p>[link](<foo>)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
These are not links, because the opening pointy bracket
|
|
|
|
|
is not matched properly:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[a](<b)c
|
|
|
|
|
[a](<b)c>
|
|
|
|
|
[a](<b>c)
|
|
|
|
|
.
|
|
|
|
|
<p>[a](<b)c
|
|
|
|
|
[a](<b)c>
|
|
|
|
|
[a](<b>c)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2017-07-21 05:44:55 +08:00
|
|
|
|
Parentheses inside the link destination may be escaped:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](\(foo\))
|
|
|
|
|
.
|
|
|
|
|
<p><a href="(foo)">link</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2018-03-08 09:19:32 +08:00
|
|
|
|
Any number of parentheses are allowed without escaping, as long as they are
|
|
|
|
|
balanced:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](foo(and(bar)))
|
|
|
|
|
.
|
2018-03-08 09:19:32 +08:00
|
|
|
|
<p><a href="foo(and(bar))">link</a></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
2018-03-08 09:19:32 +08:00
|
|
|
|
However, if you have unbalanced parentheses, you need to escape or use the
|
|
|
|
|
`<...>` form:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2018-03-08 09:19:32 +08:00
|
|
|
|
[link](foo\(and\(bar\))
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2018-03-08 09:19:32 +08:00
|
|
|
|
<p><a href="foo(and(bar)">link</a></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2018-03-08 09:19:32 +08:00
|
|
|
|
[link](<foo(and(bar)>)
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2018-03-08 09:19:32 +08:00
|
|
|
|
<p><a href="foo(and(bar)">link</a></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Parentheses and other symbols can also be escaped, as usual
|
|
|
|
|
in Markdown:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](foo\)\:)
|
|
|
|
|
.
|
|
|
|
|
<p><a href="foo):">link</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A link can contain fragment identifiers and queries:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](#fragment)
|
|
|
|
|
|
|
|
|
|
[link](http://example.com#fragment)
|
|
|
|
|
|
|
|
|
|
[link](http://example.com?foo=3#frag)
|
|
|
|
|
.
|
|
|
|
|
<p><a href="#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>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that a backslash before a non-escapable character is
|
|
|
|
|
just a backslash:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](foo\bar)
|
|
|
|
|
.
|
|
|
|
|
<p><a href="foo%5Cbar">link</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
URL-escaping should be left alone inside the destination, as all
|
|
|
|
|
URL-escaped characters are also valid URL characters. Entity and
|
|
|
|
|
numerical character references in the destination will be parsed
|
|
|
|
|
into the corresponding Unicode code points, as usual. These may
|
|
|
|
|
be optionally URL-escaped when written as HTML, but this spec
|
|
|
|
|
does not enforce any particular policy for rendering URLs in
|
|
|
|
|
HTML or other formats. Renderers may make different decisions
|
|
|
|
|
about how to escape or normalize URLs in the output.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](foo%20bä)
|
|
|
|
|
.
|
|
|
|
|
<p><a href="foo%20b%C3%A4">link</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that, because titles can often be parsed as destinations,
|
|
|
|
|
if you try to omit the destination and keep the title, you'll
|
|
|
|
|
get unexpected results:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link]("title")
|
|
|
|
|
.
|
|
|
|
|
<p><a href="%22title%22">link</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Titles may be in single quotes, double quotes, or parentheses:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](/url "title")
|
|
|
|
|
[link](/url 'title')
|
|
|
|
|
[link](/url (title))
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="title">link</a>
|
|
|
|
|
<a href="/url" title="title">link</a>
|
|
|
|
|
<a href="/url" title="title">link</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Backslash escapes and entity and numeric character references
|
|
|
|
|
may be used in titles:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](/url "title \""")
|
|
|
|
|
.
|
|
|
|
|
<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:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](/url "title "and" title")
|
|
|
|
|
.
|
|
|
|
|
<p>[link](/url "title "and" title")</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
But it is easy to work around this by using a different quote type:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link](/url 'title "and" title')
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="title "and" title">link</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(Note: `Markdown.pl` did allow double quotes inside a double-quoted
|
|
|
|
|
title, and its test suite included a test demonstrating this.
|
|
|
|
|
But it is hard to see a good rationale for the extra complexity this
|
|
|
|
|
brings, since there are already many ways---backslash escaping,
|
|
|
|
|
entity and numeric character references, or using a different
|
|
|
|
|
quote type for the enclosing title---to write titles containing
|
|
|
|
|
double quotes. `Markdown.pl`'s handling of titles has a number
|
|
|
|
|
of other strange features. For example, it allows single-quoted
|
|
|
|
|
titles in inline links, but not reference links. And, in
|
|
|
|
|
reference links but not inline links, it allows a title to begin
|
|
|
|
|
with `"` and end with `)`. `Markdown.pl` 1.0.1 even allows
|
|
|
|
|
titles with no closing quotation mark, though 1.0.2b8 does not.
|
|
|
|
|
It seems preferable to adopt a simple, rational rule that works
|
|
|
|
|
the same way in inline links and link reference definitions.)
|
|
|
|
|
|
|
|
|
|
[Whitespace] is allowed around the destination and title:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link]( /uri
|
|
|
|
|
"title" )
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/uri" title="title">link</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
But it is not allowed between the link text and the
|
|
|
|
|
following parenthesis:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link] (/uri)
|
|
|
|
|
.
|
|
|
|
|
<p>[link] (/uri)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The link text may contain balanced brackets, but not unbalanced ones,
|
|
|
|
|
unless they are escaped:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link [foo [bar]]](/uri)
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/uri">link [foo [bar]]</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link] bar](/uri)
|
|
|
|
|
.
|
|
|
|
|
<p>[link] bar](/uri)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link [bar](/uri)
|
|
|
|
|
.
|
|
|
|
|
<p>[link <a href="/uri">bar</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link \[bar](/uri)
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/uri">link [bar</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The link text may contain inline content:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link *foo **bar** `#`*](/uri)
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[![moon](moon.jpg)](/uri)
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
However, links may not contain other links, at any level of nesting.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo [bar](/uri)](/uri)
|
|
|
|
|
.
|
|
|
|
|
<p>[foo <a href="/uri">bar</a>](/uri)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo *[bar [baz](/uri)](/uri)*](/uri)
|
|
|
|
|
.
|
|
|
|
|
<p>[foo <em>[bar <a href="/uri">baz</a>](/uri)</em>](/uri)</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![[[foo](uri1)](uri2)](uri3)
|
|
|
|
|
.
|
|
|
|
|
<p><img src="uri3" alt="[foo](uri2)" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
These cases illustrate the precedence of link text grouping over
|
|
|
|
|
emphasis grouping:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*[foo*](/uri)
|
|
|
|
|
.
|
|
|
|
|
<p>*<a href="/uri">foo*</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo *bar](baz*)
|
|
|
|
|
.
|
|
|
|
|
<p><a href="baz*">foo *bar</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that brackets that *aren't* part of links do not take
|
|
|
|
|
precedence:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo [bar* baz]
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo [bar</em> baz]</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
These cases illustrate the precedence of HTML tags, code spans,
|
|
|
|
|
and autolinks over link grouping:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo <bar attr="](baz)">
|
|
|
|
|
.
|
|
|
|
|
<p>[foo <bar attr="](baz)"></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo`](/uri)`
|
|
|
|
|
.
|
|
|
|
|
<p>[foo<code>](/uri)</code></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo<http://example.com/?search=](uri)>
|
|
|
|
|
.
|
|
|
|
|
<p>[foo<a href="http://example.com/?search=%5D(uri)">http://example.com/?search=](uri)</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
There are three kinds of [reference link](@)s:
|
|
|
|
|
[full](#full-reference-link), [collapsed](#collapsed-reference-link),
|
|
|
|
|
and [shortcut](#shortcut-reference-link).
|
|
|
|
|
|
|
|
|
|
A [full reference link](@)
|
|
|
|
|
consists of a [link text] immediately followed by a [link label]
|
|
|
|
|
that [matches] a [link reference definition] elsewhere in the document.
|
|
|
|
|
|
|
|
|
|
A [link label](@) begins with a left bracket (`[`) and ends
|
|
|
|
|
with the first right bracket (`]`) that is not backslash-escaped.
|
|
|
|
|
Between these brackets there must be at least one [non-whitespace character].
|
2018-03-08 09:19:32 +08:00
|
|
|
|
Unescaped square bracket characters are not allowed inside the
|
|
|
|
|
opening and closing square brackets of [link labels]. A link
|
|
|
|
|
label can have at most 999 characters inside the square
|
|
|
|
|
brackets.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
One label [matches](@)
|
|
|
|
|
another just in case their normalized forms are equal. To normalize a
|
2018-03-08 09:19:32 +08:00
|
|
|
|
label, strip off the opening and closing brackets,
|
|
|
|
|
perform the *Unicode case fold*, strip leading and trailing
|
|
|
|
|
[whitespace] and collapse consecutive internal
|
2017-07-21 05:44:55 +08:00
|
|
|
|
[whitespace] to a single space. If there are multiple
|
|
|
|
|
matching reference link definitions, the one that comes first in the
|
|
|
|
|
document is used. (It is desirable in such cases to emit a warning.)
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
The link's URI and title are provided by the matching [link
|
|
|
|
|
reference definition].
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
Here is a simple example:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo][bar]
|
|
|
|
|
|
|
|
|
|
[bar]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="title">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The rules for the [link text] are the same as with
|
|
|
|
|
[inline links]. Thus:
|
|
|
|
|
|
|
|
|
|
The link text may contain balanced brackets, but not unbalanced ones,
|
|
|
|
|
unless they are escaped:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link [foo [bar]]][ref]
|
|
|
|
|
|
|
|
|
|
[ref]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/uri">link [foo [bar]]</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link \[bar][ref]
|
|
|
|
|
|
|
|
|
|
[ref]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/uri">link [bar</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The link text may contain inline content:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[link *foo **bar** `#`*][ref]
|
|
|
|
|
|
|
|
|
|
[ref]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/uri">link <em>foo <strong>bar</strong> <code>#</code></em></a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[![moon](moon.jpg)][ref]
|
|
|
|
|
|
|
|
|
|
[ref]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/uri"><img src="moon.jpg" alt="moon" /></a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
However, links may not contain other links, at any level of nesting.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo [bar](/uri)][ref]
|
|
|
|
|
|
|
|
|
|
[ref]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p>[foo <a href="/uri">bar</a>]<a href="/uri">ref</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo *bar [baz][ref]*][ref]
|
|
|
|
|
|
|
|
|
|
[ref]: /uri
|
|
|
|
|
.
|
|
|
|
|
<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 links]
|
|
|
|
|
instead of one [full reference link].)
|
|
|
|
|
|
|
|
|
|
The following cases illustrate the precedence of link text grouping over
|
|
|
|
|
emphasis grouping:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*[foo*][ref]
|
|
|
|
|
|
|
|
|
|
[ref]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p>*<a href="/uri">foo*</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[foo *bar][ref]*
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
[ref]: /uri
|
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><a href="/uri">foo *bar</a>*</p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
These cases illustrate the precedence of HTML tags, code spans,
|
|
|
|
|
and autolinks over link grouping:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo <bar attr="][ref]">
|
|
|
|
|
|
|
|
|
|
[ref]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p>[foo <bar attr="][ref]"></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo`][ref]`
|
|
|
|
|
|
|
|
|
|
[ref]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p>[foo<code>][ref]</code></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo<http://example.com/?search=][ref]>
|
|
|
|
|
|
|
|
|
|
[ref]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p>[foo<a href="http://example.com/?search=%5D%5Bref%5D">http://example.com/?search=][ref]</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Matching is case-insensitive:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo][BaR]
|
|
|
|
|
|
|
|
|
|
[bar]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="title">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Unicode case fold is used:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[ẞ]
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[SS]: /url
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><a href="/url">ẞ</a></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Consecutive internal [whitespace] is treated as one space for
|
|
|
|
|
purposes of determining matching:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[Foo
|
|
|
|
|
bar]: /url
|
|
|
|
|
|
|
|
|
|
[Baz][Foo bar]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url">Baz</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
No [whitespace] is allowed between the [link text] and the
|
|
|
|
|
[link label]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo] [bar]
|
|
|
|
|
|
|
|
|
|
[bar]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p>[foo] <a href="/url" title="title">bar</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]
|
|
|
|
|
[bar]
|
|
|
|
|
|
|
|
|
|
[bar]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p>[foo]
|
|
|
|
|
<a href="/url" title="title">bar</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
This is a departure from John Gruber's original Markdown syntax
|
|
|
|
|
description, which explicitly allows whitespace between the link
|
|
|
|
|
text and the link label. It brings reference links in line with
|
|
|
|
|
[inline links], which (according to both original Markdown and
|
|
|
|
|
this spec) cannot have whitespace after the link text. More
|
|
|
|
|
importantly, it prevents inadvertent capture of consecutive
|
|
|
|
|
[shortcut reference links]. If whitespace is allowed between the
|
|
|
|
|
link text and the link label, then in the following we will have
|
|
|
|
|
a single reference link, not two shortcut reference links, as
|
|
|
|
|
intended:
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
[foo]
|
|
|
|
|
[bar]
|
|
|
|
|
|
|
|
|
|
[foo]: /url1
|
|
|
|
|
[bar]: /url2
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
(Note that [shortcut reference links] were introduced by Gruber
|
|
|
|
|
himself in a beta version of `Markdown.pl`, but never included
|
|
|
|
|
in the official syntax description. Without shortcut reference
|
|
|
|
|
links, it is harmless to allow space between the link text and
|
|
|
|
|
link label; but once shortcut references are introduced, it is
|
|
|
|
|
too dangerous to allow this, as it frequently leads to
|
|
|
|
|
unintended results.)
|
|
|
|
|
|
|
|
|
|
When there are multiple matching [link reference definitions],
|
|
|
|
|
the first is used:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]: /url1
|
|
|
|
|
|
|
|
|
|
[foo]: /url2
|
|
|
|
|
|
|
|
|
|
[bar][foo]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url1">bar</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that matching is performed on normalized strings, not parsed
|
|
|
|
|
inline content. So the following does not match, even though the
|
|
|
|
|
labels define equivalent inline content:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[bar][foo\!]
|
|
|
|
|
|
|
|
|
|
[foo!]: /url
|
|
|
|
|
.
|
|
|
|
|
<p>[bar][foo!]</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Link labels] cannot contain brackets, unless they are
|
|
|
|
|
backslash-escaped:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo][ref[]
|
|
|
|
|
|
|
|
|
|
[ref[]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p>[foo][ref[]</p>
|
|
|
|
|
<p>[ref[]: /uri</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo][ref[bar]]
|
|
|
|
|
|
|
|
|
|
[ref[bar]]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p>[foo][ref[bar]]</p>
|
|
|
|
|
<p>[ref[bar]]: /uri</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[[[foo]]]
|
|
|
|
|
|
|
|
|
|
[[[foo]]]: /url
|
|
|
|
|
.
|
|
|
|
|
<p>[[[foo]]]</p>
|
|
|
|
|
<p>[[[foo]]]: /url</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo][ref\[]
|
|
|
|
|
|
|
|
|
|
[ref\[]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/uri">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that in this example `]` is not backslash-escaped:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[bar\\]: /uri
|
|
|
|
|
|
|
|
|
|
[bar\\]
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/uri">bar\</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A [link label] must contain at least one [non-whitespace character]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[]
|
|
|
|
|
|
|
|
|
|
[]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p>[]</p>
|
|
|
|
|
<p>[]: /uri</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
[
|
|
|
|
|
]: /uri
|
|
|
|
|
.
|
|
|
|
|
<p>[
|
|
|
|
|
]</p>
|
|
|
|
|
<p>[
|
|
|
|
|
]: /uri</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A [collapsed reference link](@)
|
|
|
|
|
consists of a [link label] that [matches] a
|
|
|
|
|
[link reference definition] elsewhere in the
|
|
|
|
|
document, followed by the string `[]`.
|
|
|
|
|
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 matching reference link definition. Thus,
|
|
|
|
|
`[foo][]` is equivalent to `[foo][foo]`.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo][]
|
|
|
|
|
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="title">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[*foo* bar][]
|
|
|
|
|
|
|
|
|
|
[*foo* bar]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="title"><em>foo</em> bar</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The link labels are case-insensitive:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[Foo][]
|
|
|
|
|
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="title">Foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
As with full reference links, [whitespace] is not
|
|
|
|
|
allowed between the two sets of brackets:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]
|
|
|
|
|
[]
|
|
|
|
|
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="title">foo</a>
|
|
|
|
|
[]</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A [shortcut reference link](@)
|
|
|
|
|
consists of a [link label] that [matches] a
|
|
|
|
|
[link reference definition] elsewhere in the
|
|
|
|
|
document and is not followed by `[]` or a link label.
|
|
|
|
|
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 matching link reference definition.
|
|
|
|
|
Thus, `[foo]` is equivalent to `[foo][]`.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo]
|
|
|
|
|
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="title">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[*foo* bar]
|
|
|
|
|
|
|
|
|
|
[*foo* bar]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="title"><em>foo</em> bar</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[[*foo* bar]]
|
|
|
|
|
|
|
|
|
|
[*foo* bar]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p>[<a href="/url" title="title"><em>foo</em> bar</a>]</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[[bar [foo]
|
|
|
|
|
|
|
|
|
|
[foo]: /url
|
|
|
|
|
.
|
|
|
|
|
<p>[[bar <a href="/url">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The link labels are case-insensitive:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[Foo]
|
|
|
|
|
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url" title="title">Foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A space after the link text should be preserved:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo] bar
|
|
|
|
|
|
|
|
|
|
[foo]: /url
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url">foo</a> bar</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If you just want bracketed text, you can backslash-escape the
|
|
|
|
|
opening bracket to avoid links:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
\[foo]
|
|
|
|
|
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p>[foo]</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that this is a link, because a link label ends with the first
|
|
|
|
|
following closing bracket:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo*]: /url
|
|
|
|
|
|
|
|
|
|
*[foo*]
|
|
|
|
|
.
|
|
|
|
|
<p>*<a href="/url">foo*</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Full and compact references take precedence over shortcut
|
|
|
|
|
references:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo][bar]
|
|
|
|
|
|
|
|
|
|
[foo]: /url1
|
|
|
|
|
[bar]: /url2
|
|
|
|
|
.
|
|
|
|
|
<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,
|
|
|
|
|
`[foo]` as normal text:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo][bar][baz]
|
|
|
|
|
|
|
|
|
|
[baz]: /url
|
|
|
|
|
.
|
|
|
|
|
<p>[foo]<a href="/url">bar</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Here, though, `[foo][bar]` is parsed as a reference, since
|
|
|
|
|
`[bar]` is defined:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo][bar][baz]
|
|
|
|
|
|
|
|
|
|
[baz]: /url1
|
|
|
|
|
[bar]: /url2
|
|
|
|
|
.
|
|
|
|
|
<p><a href="/url2">foo</a><a href="/url1">baz</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Here `[foo]` is not parsed as a shortcut reference, because it
|
|
|
|
|
is followed by a link label (even though `[bar]` is not defined):
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
[foo][bar][baz]
|
|
|
|
|
|
|
|
|
|
[baz]: /url1
|
|
|
|
|
[foo]: /url2
|
|
|
|
|
.
|
|
|
|
|
<p>[foo]<a href="/url1">bar</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Images
|
|
|
|
|
|
|
|
|
|
Syntax for images is like the syntax for links, with one
|
|
|
|
|
difference. Instead of [link text], we have an
|
|
|
|
|
[image description](@). The rules for this are the
|
|
|
|
|
same as for [link text], except that (a) an
|
|
|
|
|
image description starts with `![` rather than `[`, and
|
|
|
|
|
(b) an image description may contain links.
|
|
|
|
|
An image description has inline elements
|
|
|
|
|
as its contents. When an image is rendered to HTML,
|
|
|
|
|
this is standardly used as the image's `alt` attribute.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![foo](/url "title")
|
|
|
|
|
.
|
|
|
|
|
<p><img src="/url" alt="foo" title="title" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![foo *bar*]
|
|
|
|
|
|
|
|
|
|
[foo *bar*]: train.jpg "train & tracks"
|
|
|
|
|
.
|
|
|
|
|
<p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![foo ![bar](/url)](/url2)
|
|
|
|
|
.
|
|
|
|
|
<p><img src="/url2" alt="foo bar" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![foo [bar](/url)](/url2)
|
|
|
|
|
.
|
|
|
|
|
<p><img src="/url2" alt="foo bar" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Though this spec is concerned with parsing, not rendering, it is
|
|
|
|
|
recommended that in rendering to HTML, only the plain string content
|
|
|
|
|
of the [image description] be used. Note that in
|
|
|
|
|
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
|
|
|
|
|
content is rendered, without formatting.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![foo *bar*][]
|
|
|
|
|
|
|
|
|
|
[foo *bar*]: train.jpg "train & tracks"
|
|
|
|
|
.
|
|
|
|
|
<p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![foo *bar*][foobar]
|
|
|
|
|
|
|
|
|
|
[FOOBAR]: train.jpg "train & tracks"
|
|
|
|
|
.
|
|
|
|
|
<p><img src="train.jpg" alt="foo bar" title="train & tracks" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![foo](train.jpg)
|
|
|
|
|
.
|
|
|
|
|
<p><img src="train.jpg" alt="foo" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
My ![foo bar](/path/to/train.jpg "title" )
|
|
|
|
|
.
|
|
|
|
|
<p>My <img src="/path/to/train.jpg" alt="foo bar" title="title" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![foo](<url>)
|
|
|
|
|
.
|
|
|
|
|
<p><img src="url" alt="foo" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![](/url)
|
|
|
|
|
.
|
|
|
|
|
<p><img src="/url" alt="" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Reference-style:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![foo][bar]
|
|
|
|
|
|
|
|
|
|
[bar]: /url
|
|
|
|
|
.
|
|
|
|
|
<p><img src="/url" alt="foo" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![foo][bar]
|
|
|
|
|
|
|
|
|
|
[BAR]: /url
|
|
|
|
|
.
|
|
|
|
|
<p><img src="/url" alt="foo" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Collapsed:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![foo][]
|
|
|
|
|
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><img src="/url" alt="foo" title="title" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![*foo* bar][]
|
|
|
|
|
|
|
|
|
|
[*foo* bar]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><img src="/url" alt="foo bar" title="title" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The labels are case-insensitive:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![Foo][]
|
|
|
|
|
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><img src="/url" alt="Foo" title="title" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
As with reference links, [whitespace] is not allowed
|
|
|
|
|
between the two sets of brackets:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![foo]
|
|
|
|
|
[]
|
|
|
|
|
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><img src="/url" alt="foo" title="title" />
|
|
|
|
|
[]</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Shortcut:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![foo]
|
|
|
|
|
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><img src="/url" alt="foo" title="title" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![*foo* bar]
|
|
|
|
|
|
|
|
|
|
[*foo* bar]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><img src="/url" alt="foo bar" title="title" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Note that link labels cannot contain unescaped brackets:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![[foo]]
|
|
|
|
|
|
|
|
|
|
[[foo]]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p>![[foo]]</p>
|
|
|
|
|
<p>[[foo]]: /url "title"</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
The link labels are case-insensitive:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
![Foo]
|
|
|
|
|
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p><img src="/url" alt="Foo" title="title" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
2018-03-08 09:19:32 +08:00
|
|
|
|
If you just want a literal `!` followed by bracketed text, you can
|
|
|
|
|
backslash-escape the opening `[`:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2018-03-08 09:19:32 +08:00
|
|
|
|
!\[foo]
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p>![foo]</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
If you want a link after a literal `!`, backslash-escape the
|
|
|
|
|
`!`:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
\![foo]
|
|
|
|
|
|
|
|
|
|
[foo]: /url "title"
|
|
|
|
|
.
|
|
|
|
|
<p>!<a href="/url" title="title">foo</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Autolinks
|
|
|
|
|
|
|
|
|
|
[Autolink](@)s are absolute URIs and email addresses inside
|
|
|
|
|
`<` and `>`. They are parsed as links, with the URL or email address
|
|
|
|
|
as the link label.
|
|
|
|
|
|
|
|
|
|
A [URI autolink](@) consists of `<`, followed by an
|
2019-10-08 19:00:22 +08:00
|
|
|
|
[absolute URI] followed by `>`. It is parsed as
|
2017-07-21 05:44:55 +08:00
|
|
|
|
a link to the URI, with the URI as the link's label.
|
|
|
|
|
|
|
|
|
|
An [absolute URI](@),
|
|
|
|
|
for these purposes, consists of a [scheme] followed by a colon (`:`)
|
2019-10-08 19:00:22 +08:00
|
|
|
|
followed by zero or more characters other [ASCII control
|
|
|
|
|
characters][ASCII control character] or [whitespace][] , `<`, and `>`.
|
|
|
|
|
If the URI includes these characters, they must be percent-encoded
|
2017-07-21 05:44:55 +08:00
|
|
|
|
(e.g. `%20` for a space).
|
|
|
|
|
|
|
|
|
|
For purposes of this spec, a [scheme](@) is any sequence
|
|
|
|
|
of 2--32 characters beginning with an ASCII letter and followed
|
|
|
|
|
by any combination of ASCII letters, digits, or the symbols plus
|
|
|
|
|
("+"), period ("."), or hyphen ("-").
|
|
|
|
|
|
|
|
|
|
Here are some valid autolinks:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<http://foo.bar.baz>
|
|
|
|
|
.
|
|
|
|
|
<p><a href="http://foo.bar.baz">http://foo.bar.baz</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<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.bar.baz/test?q=hello&id=22&boolean</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<irc://foo.bar:2233/baz>
|
|
|
|
|
.
|
|
|
|
|
<p><a href="irc://foo.bar:2233/baz">irc://foo.bar:2233/baz</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Uppercase is also fine:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<MAILTO:FOO@BAR.BAZ>
|
|
|
|
|
.
|
|
|
|
|
<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>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` 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>
|
|
|
|
|
.
|
|
|
|
|
<p><http://foo.bar/baz bim></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Backslash-escapes do not work inside autolinks:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<http://example.com/\[\>
|
|
|
|
|
.
|
|
|
|
|
<p><a href="http://example.com/%5C%5B%5C">http://example.com/\[\</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
An [email autolink](@)
|
|
|
|
|
consists of `<`, followed by an [email address],
|
|
|
|
|
followed by `>`. The link's label is the email address,
|
|
|
|
|
and the URL is `mailto:` followed by the email address.
|
|
|
|
|
|
|
|
|
|
An [email address](@),
|
|
|
|
|
for these purposes, is anything that matches
|
|
|
|
|
the [non-normative regex from the HTML5
|
|
|
|
|
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-]{0,61}[a-zA-Z0-9])?)*$/
|
|
|
|
|
|
|
|
|
|
Examples of email autolinks:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<foo@bar.example.com>
|
|
|
|
|
.
|
|
|
|
|
<p><a href="mailto:foo@bar.example.com">foo@bar.example.com</a></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<foo+special@Bar.baz-bar0.com>
|
|
|
|
|
.
|
|
|
|
|
<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:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<foo\+@bar.example.com>
|
|
|
|
|
.
|
|
|
|
|
<p><foo+@bar.example.com></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
These are not autolinks:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<>
|
|
|
|
|
.
|
|
|
|
|
<p><></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
< http://foo.bar >
|
|
|
|
|
.
|
|
|
|
|
<p>< http://foo.bar ></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<m:abc>
|
|
|
|
|
.
|
|
|
|
|
<p><m:abc></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<foo.bar.baz>
|
|
|
|
|
.
|
|
|
|
|
<p><foo.bar.baz></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
http://example.com
|
|
|
|
|
.
|
|
|
|
|
<p>http://example.com</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo@bar.example.com
|
|
|
|
|
.
|
|
|
|
|
<p>foo@bar.example.com</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Raw HTML
|
|
|
|
|
|
|
|
|
|
Text between `<` and `>` that looks like an HTML tag is parsed as a
|
|
|
|
|
raw HTML tag and will be rendered in HTML without escaping.
|
|
|
|
|
Tag and attribute names are not limited to current HTML tags,
|
|
|
|
|
so custom tags (and even, say, DocBook tags) may be used.
|
|
|
|
|
|
|
|
|
|
Here is the grammar for tags:
|
|
|
|
|
|
|
|
|
|
A [tag name](@) consists of an ASCII letter
|
|
|
|
|
followed by zero or more ASCII letters, digits, or
|
|
|
|
|
hyphens (`-`).
|
|
|
|
|
|
|
|
|
|
An [attribute](@) consists of [whitespace],
|
|
|
|
|
an [attribute name], and an optional
|
|
|
|
|
[attribute value specification].
|
|
|
|
|
|
|
|
|
|
An [attribute name](@)
|
|
|
|
|
consists of an ASCII letter, `_`, or `:`, followed by zero or more ASCII
|
|
|
|
|
letters, digits, `_`, `.`, `:`, or `-`. (Note: This is the XML
|
|
|
|
|
specification restricted to ASCII. HTML5 is laxer.)
|
|
|
|
|
|
|
|
|
|
An [attribute value specification](@)
|
|
|
|
|
consists of optional [whitespace],
|
|
|
|
|
a `=` character, optional [whitespace], and an [attribute
|
|
|
|
|
value].
|
|
|
|
|
|
|
|
|
|
An [attribute value](@)
|
|
|
|
|
consists of an [unquoted attribute value],
|
|
|
|
|
a [single-quoted attribute value], or a [double-quoted attribute value].
|
|
|
|
|
|
|
|
|
|
An [unquoted attribute value](@)
|
|
|
|
|
is a nonempty string of characters not
|
2018-03-08 09:19:32 +08:00
|
|
|
|
including [whitespace], `"`, `'`, `=`, `<`, `>`, or `` ` ``.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
A [single-quoted attribute value](@)
|
|
|
|
|
consists of `'`, zero or more
|
|
|
|
|
characters not including `'`, and a final `'`.
|
|
|
|
|
|
|
|
|
|
A [double-quoted attribute value](@)
|
|
|
|
|
consists of `"`, zero or more
|
|
|
|
|
characters not including `"`, and a final `"`.
|
|
|
|
|
|
|
|
|
|
An [open tag](@) consists of a `<` character, a [tag name],
|
|
|
|
|
zero or more [attributes], optional [whitespace], an optional `/`
|
|
|
|
|
character, and a `>` character.
|
|
|
|
|
|
|
|
|
|
A [closing tag](@) consists of the string `</`, a
|
|
|
|
|
[tag name], optional [whitespace], and the character `>`.
|
|
|
|
|
|
|
|
|
|
An [HTML comment](@) consists of `<!--` + *text* + `-->`,
|
|
|
|
|
where *text* does not start with `>` or `->`, does not end with `-`,
|
|
|
|
|
and does not contain `--`. (See the
|
|
|
|
|
[HTML5 spec](http://www.w3.org/TR/html5/syntax.html#comments).)
|
|
|
|
|
|
|
|
|
|
A [processing instruction](@)
|
|
|
|
|
consists of the string `<?`, a string
|
|
|
|
|
of characters not including the string `?>`, and the string
|
|
|
|
|
`?>`.
|
|
|
|
|
|
|
|
|
|
A [declaration](@) consists of the
|
|
|
|
|
string `<!`, a name consisting of one or more uppercase ASCII letters,
|
|
|
|
|
[whitespace], a string of characters not including the
|
|
|
|
|
character `>`, and the character `>`.
|
|
|
|
|
|
|
|
|
|
A [CDATA section](@) consists of
|
|
|
|
|
the string `<![CDATA[`, a string of characters not including the string
|
|
|
|
|
`]]>`, and the string `]]>`.
|
|
|
|
|
|
|
|
|
|
An [HTML tag](@) consists of an [open tag], a [closing tag],
|
|
|
|
|
an [HTML comment], a [processing instruction], a [declaration],
|
|
|
|
|
or a [CDATA section].
|
|
|
|
|
|
|
|
|
|
Here are some simple open tags:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<a><bab><c2c>
|
|
|
|
|
.
|
|
|
|
|
<p><a><bab><c2c></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Empty elements:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<a/><b2/>
|
|
|
|
|
.
|
|
|
|
|
<p><a/><b2/></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
[Whitespace] is allowed:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<a /><b2
|
|
|
|
|
data="foo" >
|
|
|
|
|
.
|
|
|
|
|
<p><a /><b2
|
|
|
|
|
data="foo" ></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
With attributes:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<a foo="bar" bam = 'baz <em>"</em>'
|
|
|
|
|
_boolean zoop:33=zoop:33 />
|
|
|
|
|
.
|
|
|
|
|
<p><a foo="bar" bam = 'baz <em>"</em>'
|
|
|
|
|
_boolean zoop:33=zoop:33 /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Custom tag names can be used:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
Foo <responsive-image src="foo.jpg" />
|
|
|
|
|
.
|
|
|
|
|
<p>Foo <responsive-image src="foo.jpg" /></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Illegal tag names, not parsed as HTML:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<33> <__>
|
|
|
|
|
.
|
|
|
|
|
<p><33> <__></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Illegal attribute names:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<a h*#ref="hi">
|
|
|
|
|
.
|
|
|
|
|
<p><a h*#ref="hi"></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Illegal attribute values:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<a href="hi'> <a href=hi'>
|
|
|
|
|
.
|
|
|
|
|
<p><a href="hi'> <a href=hi'></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Illegal [whitespace]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
< a><
|
|
|
|
|
foo><bar/ >
|
2018-03-08 09:19:32 +08:00
|
|
|
|
<foo bar=baz
|
|
|
|
|
bim!bop />
|
2017-07-21 05:44:55 +08:00
|
|
|
|
.
|
|
|
|
|
<p>< a><
|
2018-03-08 09:19:32 +08:00
|
|
|
|
foo><bar/ >
|
|
|
|
|
<foo bar=baz
|
|
|
|
|
bim!bop /></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Missing [whitespace]:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<a href='bar'title=title>
|
|
|
|
|
.
|
|
|
|
|
<p><a href='bar'title=title></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Closing tags:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
</a></foo >
|
|
|
|
|
.
|
|
|
|
|
<p></a></foo ></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Illegal attributes in closing tag:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
</a href="foo">
|
|
|
|
|
.
|
|
|
|
|
<p></a href="foo"></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Comments:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo <!-- this is a
|
|
|
|
|
comment - with hyphen -->
|
|
|
|
|
.
|
|
|
|
|
<p>foo <!-- this is a
|
|
|
|
|
comment - with hyphen --></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo <!-- not a comment -- two hyphens -->
|
|
|
|
|
.
|
|
|
|
|
<p>foo <!-- not a comment -- two hyphens --></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Not comments:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo <!--> foo -->
|
|
|
|
|
|
|
|
|
|
foo <!-- foo--->
|
|
|
|
|
.
|
|
|
|
|
<p>foo <!--> foo --></p>
|
|
|
|
|
<p>foo <!-- foo---></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Processing instructions:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo <?php echo $a; ?>
|
|
|
|
|
.
|
|
|
|
|
<p>foo <?php echo $a; ?></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Declarations:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo <!ELEMENT br EMPTY>
|
|
|
|
|
.
|
|
|
|
|
<p>foo <!ELEMENT br EMPTY></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
CDATA sections:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo <![CDATA[>&<]]>
|
|
|
|
|
.
|
|
|
|
|
<p>foo <![CDATA[>&<]]></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Entity and numeric character references are preserved in HTML
|
|
|
|
|
attributes:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo <a href="ö">
|
|
|
|
|
.
|
|
|
|
|
<p>foo <a href="ö"></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Backslash escapes do not work in HTML attributes:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo <a href="\*">
|
|
|
|
|
.
|
|
|
|
|
<p>foo <a href="\*"></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<a href="\"">
|
|
|
|
|
.
|
|
|
|
|
<p><a href="""></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Hard line breaks
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
is parsed as a [hard line break](@) (rendered
|
|
|
|
|
in HTML as a `<br />` tag):
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo
|
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<p>foo<br />
|
|
|
|
|
baz</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
For a more visible alternative, a backslash before the
|
|
|
|
|
[line ending] may be used instead of two spaces:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo\
|
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<p>foo<br />
|
|
|
|
|
baz</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
More than two spaces can be used:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo
|
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<p>foo<br />
|
|
|
|
|
baz</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Leading spaces at the beginning of the next line are ignored:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo
|
|
|
|
|
bar
|
|
|
|
|
.
|
|
|
|
|
<p>foo<br />
|
|
|
|
|
bar</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo\
|
|
|
|
|
bar
|
|
|
|
|
.
|
|
|
|
|
<p>foo<br />
|
|
|
|
|
bar</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Line breaks can occur inside emphasis, links, and other constructs
|
|
|
|
|
that allow inline content:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo
|
|
|
|
|
bar*
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo<br />
|
|
|
|
|
bar</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
*foo\
|
|
|
|
|
bar*
|
|
|
|
|
.
|
|
|
|
|
<p><em>foo<br />
|
|
|
|
|
bar</em></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Line breaks do not occur inside code spans
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
2019-10-08 19:00:22 +08:00
|
|
|
|
`code
|
2017-07-21 05:44:55 +08:00
|
|
|
|
span`
|
|
|
|
|
.
|
2019-10-08 19:00:22 +08:00
|
|
|
|
<p><code>code span</code></p>
|
2017-07-21 05:44:55 +08:00
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
`code\
|
|
|
|
|
span`
|
|
|
|
|
.
|
|
|
|
|
<p><code>code\ span</code></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
or HTML tags:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<a href="foo
|
|
|
|
|
bar">
|
|
|
|
|
.
|
|
|
|
|
<p><a href="foo
|
|
|
|
|
bar"></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
<a href="foo\
|
|
|
|
|
bar">
|
|
|
|
|
.
|
|
|
|
|
<p><a href="foo\
|
|
|
|
|
bar"></p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
other block element:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo\
|
|
|
|
|
.
|
|
|
|
|
<p>foo\</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo
|
|
|
|
|
.
|
|
|
|
|
<p>foo</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
### foo\
|
|
|
|
|
.
|
|
|
|
|
<h3>foo\</h3>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
### foo
|
|
|
|
|
.
|
|
|
|
|
<h3>foo</h3>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## Soft line breaks
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
[softbreak](@). (A softbreak may be rendered in HTML either as a
|
|
|
|
|
[line ending] or as a space. The result will be the same in
|
|
|
|
|
browsers. In the examples here, a [line ending] will be used.)
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo
|
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<p>foo
|
|
|
|
|
baz</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Spaces at the end of the line and beginning of the next line are
|
|
|
|
|
removed:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
foo
|
|
|
|
|
baz
|
|
|
|
|
.
|
|
|
|
|
<p>foo
|
|
|
|
|
baz</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
A conforming parser may render a soft line break in HTML either as a
|
|
|
|
|
line break or as a space.
|
|
|
|
|
|
|
|
|
|
A renderer may also provide an option to render soft line breaks
|
|
|
|
|
as hard line breaks.
|
|
|
|
|
|
|
|
|
|
## Textual content
|
|
|
|
|
|
|
|
|
|
Any characters not given an interpretation by the above rules will
|
|
|
|
|
be parsed as plain textual content.
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
hello $.;'there
|
|
|
|
|
.
|
|
|
|
|
<p>hello $.;'there</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
Foo χρῆν
|
|
|
|
|
.
|
|
|
|
|
<p>Foo χρῆν</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Internal spaces are preserved verbatim:
|
|
|
|
|
|
|
|
|
|
```````````````````````````````` example
|
|
|
|
|
Multiple spaces
|
|
|
|
|
.
|
|
|
|
|
<p>Multiple spaces</p>
|
|
|
|
|
````````````````````````````````
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- END TESTS -->
|
|
|
|
|
|
|
|
|
|
# Appendix: A parsing strategy
|
|
|
|
|
|
|
|
|
|
In this appendix we describe some features of the parsing strategy
|
|
|
|
|
used in the CommonMark reference implementations.
|
|
|
|
|
|
|
|
|
|
## Overview
|
|
|
|
|
|
|
|
|
|
Parsing has two phases:
|
|
|
|
|
|
|
|
|
|
1. In the first phase, lines of input are consumed and the block
|
|
|
|
|
structure of the document---its division into paragraphs, block quotes,
|
|
|
|
|
list items, and so on---is constructed. Text is assigned to these
|
|
|
|
|
blocks but not parsed. Link reference definitions are parsed and a
|
|
|
|
|
map of links is constructed.
|
|
|
|
|
|
|
|
|
|
2. In the second phase, the raw text contents of paragraphs and headings
|
|
|
|
|
are parsed into sequences of Markdown inline elements (strings,
|
|
|
|
|
code spans, links, emphasis, and so on), using the map of link
|
|
|
|
|
references constructed in phase 1.
|
|
|
|
|
|
|
|
|
|
At each point in processing, the document is represented as a tree of
|
|
|
|
|
**blocks**. The root of the tree is a `document` block. The `document`
|
|
|
|
|
may have any number of other blocks as **children**. These children
|
|
|
|
|
may, in turn, have other blocks as children. The last child of a block
|
|
|
|
|
is normally considered **open**, meaning that subsequent lines of input
|
|
|
|
|
can alter its contents. (Blocks that are not open are **closed**.)
|
|
|
|
|
Here, for example, is a possible document tree, with the open blocks
|
|
|
|
|
marked by arrows:
|
|
|
|
|
|
|
|
|
|
``` tree
|
|
|
|
|
-> document
|
|
|
|
|
-> block_quote
|
|
|
|
|
paragraph
|
|
|
|
|
"Lorem ipsum dolor\nsit amet."
|
|
|
|
|
-> list (type=bullet tight=true bullet_char=-)
|
|
|
|
|
list_item
|
|
|
|
|
paragraph
|
|
|
|
|
"Qui *quodsi iracundia*"
|
|
|
|
|
-> list_item
|
|
|
|
|
-> paragraph
|
|
|
|
|
"aliquando id"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Phase 1: block structure
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
in one or more of the following ways:
|
|
|
|
|
|
|
|
|
|
1. One or more open blocks may be closed.
|
|
|
|
|
2. One or more new blocks may be created as children of the
|
|
|
|
|
last open block.
|
|
|
|
|
3. Text may be added to the last (deepest) open block remaining
|
|
|
|
|
on the tree.
|
|
|
|
|
|
|
|
|
|
Once a line has been incorporated into the tree in this way,
|
|
|
|
|
it can be discarded, so input can be read in a stream.
|
|
|
|
|
|
|
|
|
|
For each line, we follow this procedure:
|
|
|
|
|
|
|
|
|
|
1. First we iterate through the open blocks, starting with the
|
|
|
|
|
root document, and descending through last children down to the last
|
|
|
|
|
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
|
|
|
|
|
`>` character. A paragraph requires a non-blank line.
|
|
|
|
|
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
|
|
|
|
|
[lazy continuation line].
|
|
|
|
|
|
|
|
|
|
2. Next, after consuming the continuation markers for existing
|
|
|
|
|
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
|
|
|
|
|
in step 1 before creating the new block as a child of the last
|
2019-10-08 19:00:22 +08:00
|
|
|
|
matched container block.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
3. Finally, we look at the remainder of the line (after block
|
|
|
|
|
markers like `>`, list markers, and indentation have been consumed).
|
|
|
|
|
This is text that can be incorporated into the last open
|
|
|
|
|
block (a paragraph, code block, heading, or raw HTML).
|
|
|
|
|
|
|
|
|
|
Setext headings are formed when we see a line of a paragraph
|
|
|
|
|
that is a [setext heading underline].
|
|
|
|
|
|
|
|
|
|
Reference link definitions are detected when a paragraph is closed;
|
|
|
|
|
the accumulated text lines are parsed to see if they begin with
|
|
|
|
|
one or more reference link definitions. Any remainder becomes a
|
|
|
|
|
normal paragraph.
|
|
|
|
|
|
|
|
|
|
We can see how this works by considering how the tree above is
|
|
|
|
|
generated by four lines of Markdown:
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
> Lorem ipsum dolor
|
|
|
|
|
sit amet.
|
|
|
|
|
> - Qui *quodsi iracundia*
|
|
|
|
|
> - aliquando id
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
At the outset, our document model is just
|
|
|
|
|
|
|
|
|
|
``` tree
|
|
|
|
|
-> document
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The first line of our text,
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
> Lorem ipsum dolor
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
causes a `block_quote` block to be created as a child of our
|
|
|
|
|
open `document` block, and a `paragraph` block as a child of
|
|
|
|
|
the `block_quote`. Then the text is added to the last open
|
|
|
|
|
block, the `paragraph`:
|
|
|
|
|
|
|
|
|
|
``` tree
|
|
|
|
|
-> document
|
|
|
|
|
-> block_quote
|
|
|
|
|
-> paragraph
|
|
|
|
|
"Lorem ipsum dolor"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The next line,
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
sit amet.
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
is a "lazy continuation" of the open `paragraph`, so it gets added
|
|
|
|
|
to the paragraph's text:
|
|
|
|
|
|
|
|
|
|
``` tree
|
|
|
|
|
-> document
|
|
|
|
|
-> block_quote
|
|
|
|
|
-> paragraph
|
|
|
|
|
"Lorem ipsum dolor\nsit amet."
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The third line,
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
> - Qui *quodsi iracundia*
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
causes the `paragraph` block to be closed, and a new `list` block
|
|
|
|
|
opened as a child of the `block_quote`. A `list_item` is also
|
|
|
|
|
added as a child of the `list`, and a `paragraph` as a child of
|
|
|
|
|
the `list_item`. The text is then added to the new `paragraph`:
|
|
|
|
|
|
|
|
|
|
``` tree
|
|
|
|
|
-> document
|
|
|
|
|
-> block_quote
|
|
|
|
|
paragraph
|
|
|
|
|
"Lorem ipsum dolor\nsit amet."
|
|
|
|
|
-> list (type=bullet tight=true bullet_char=-)
|
|
|
|
|
-> list_item
|
|
|
|
|
-> paragraph
|
|
|
|
|
"Qui *quodsi iracundia*"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
The fourth line,
|
|
|
|
|
|
|
|
|
|
``` markdown
|
|
|
|
|
> - aliquando id
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
causes the `list_item` (and its child the `paragraph`) to be closed,
|
|
|
|
|
and a new `list_item` opened up as child of the `list`. A `paragraph`
|
|
|
|
|
is added as a child of the new `list_item`, to contain the text.
|
|
|
|
|
We thus obtain the final tree:
|
|
|
|
|
|
|
|
|
|
``` tree
|
|
|
|
|
-> document
|
|
|
|
|
-> block_quote
|
|
|
|
|
paragraph
|
|
|
|
|
"Lorem ipsum dolor\nsit amet."
|
|
|
|
|
-> list (type=bullet tight=true bullet_char=-)
|
|
|
|
|
list_item
|
|
|
|
|
paragraph
|
|
|
|
|
"Qui *quodsi iracundia*"
|
|
|
|
|
-> list_item
|
|
|
|
|
-> paragraph
|
|
|
|
|
"aliquando id"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## Phase 2: inline structure
|
|
|
|
|
|
|
|
|
|
Once all of the input has been parsed, all open blocks are closed.
|
|
|
|
|
|
|
|
|
|
We then "walk the tree," visiting every node, and parse raw
|
|
|
|
|
string contents of paragraphs and headings as inlines. At this
|
|
|
|
|
point we have seen all the link reference definitions, so we can
|
|
|
|
|
resolve reference links as we go.
|
|
|
|
|
|
|
|
|
|
``` tree
|
|
|
|
|
document
|
|
|
|
|
block_quote
|
|
|
|
|
paragraph
|
|
|
|
|
str "Lorem ipsum dolor"
|
|
|
|
|
softbreak
|
|
|
|
|
str "sit amet."
|
|
|
|
|
list (type=bullet tight=true bullet_char=-)
|
|
|
|
|
list_item
|
|
|
|
|
paragraph
|
|
|
|
|
str "Qui "
|
|
|
|
|
emph
|
|
|
|
|
str "quodsi iracundia"
|
|
|
|
|
list_item
|
|
|
|
|
paragraph
|
|
|
|
|
str "aliquando id"
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
Notice how the [line ending] in the first paragraph has
|
|
|
|
|
been parsed as a `softbreak`, and the asterisks in the first list item
|
|
|
|
|
have become an `emph`.
|
|
|
|
|
|
|
|
|
|
### An algorithm for parsing nested emphasis and links
|
|
|
|
|
|
|
|
|
|
By far the trickiest part of inline parsing is handling emphasis,
|
|
|
|
|
strong emphasis, links, and images. This is done using the following
|
|
|
|
|
algorithm.
|
|
|
|
|
|
|
|
|
|
When we're parsing inlines and we hit either
|
|
|
|
|
|
|
|
|
|
- a run of `*` or `_` characters, or
|
|
|
|
|
- a `[` or `![`
|
|
|
|
|
|
|
|
|
|
we insert a text node with these symbols as its literal content, and we
|
|
|
|
|
add a pointer to this text node to the [delimiter stack](@).
|
|
|
|
|
|
|
|
|
|
The [delimiter stack] is a doubly linked list. Each
|
|
|
|
|
element contains a pointer to a text node, plus information about
|
|
|
|
|
|
|
|
|
|
- the type of delimiter (`[`, `![`, `*`, `_`)
|
|
|
|
|
- the number of delimiters,
|
|
|
|
|
- whether the delimiter is "active" (all are active to start), and
|
|
|
|
|
- whether the delimiter is a potential opener, a potential closer,
|
|
|
|
|
or both (which depends on what sort of characters precede
|
|
|
|
|
and follow the delimiters).
|
|
|
|
|
|
|
|
|
|
When we hit a `]` character, we call the *look for link or image*
|
|
|
|
|
procedure (see below).
|
|
|
|
|
|
|
|
|
|
When we hit the end of the input, we call the *process emphasis*
|
|
|
|
|
procedure (see below), with `stack_bottom` = NULL.
|
|
|
|
|
|
|
|
|
|
#### *look for link or image*
|
|
|
|
|
|
|
|
|
|
Starting at the top of the delimiter stack, we look backwards
|
|
|
|
|
through the stack for an opening `[` or `![` delimiter.
|
|
|
|
|
|
|
|
|
|
- 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
|
|
|
|
|
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
|
|
|
|
|
we have an inline link/image, reference link/image, compact reference
|
|
|
|
|
link/image, or shortcut reference link/image.
|
|
|
|
|
|
|
|
|
|
+ If we don't, then we remove the opening delimiter from the
|
|
|
|
|
delimiter stack and return a literal text node `]`.
|
|
|
|
|
|
|
|
|
|
+ If we do, then
|
|
|
|
|
|
|
|
|
|
* We return a link or image node whose children are the inlines
|
|
|
|
|
after the text node pointed to by the opening delimiter.
|
|
|
|
|
|
|
|
|
|
* We run *process emphasis* on these inlines, with the `[` opener
|
|
|
|
|
as `stack_bottom`.
|
|
|
|
|
|
|
|
|
|
* We remove the opening delimiter.
|
|
|
|
|
|
|
|
|
|
* If we have a link (and not an image), we also set all
|
|
|
|
|
`[` delimiters before the opening delimiter to *inactive*. (This
|
|
|
|
|
will prevent us from getting links within links.)
|
|
|
|
|
|
|
|
|
|
#### *process emphasis*
|
|
|
|
|
|
|
|
|
|
Parameter `stack_bottom` sets a lower bound to how far we
|
|
|
|
|
descend in the [delimiter stack]. If it is NULL, we can
|
|
|
|
|
go all the way to the bottom. Otherwise, we stop before
|
|
|
|
|
visiting `stack_bottom`.
|
|
|
|
|
|
|
|
|
|
Let `current_position` point to the element on the [delimiter stack]
|
|
|
|
|
just above `stack_bottom` (or the first element if `stack_bottom`
|
|
|
|
|
is NULL).
|
|
|
|
|
|
|
|
|
|
We keep track of the `openers_bottom` for each delimiter
|
2019-10-08 19:00:22 +08:00
|
|
|
|
type (`*`, `_`) and each length of the closing delimiter run
|
|
|
|
|
(modulo 3). Initialize this to `stack_bottom`.
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
Then we repeat the following until we run out of potential
|
|
|
|
|
closers:
|
|
|
|
|
|
|
|
|
|
- Move `current_position` forward in the delimiter stack (if needed)
|
|
|
|
|
until we find the first potential closer with delimiter `*` or `_`.
|
|
|
|
|
(This will be the potential closer closest
|
|
|
|
|
to the beginning of the input -- the first one in parse order.)
|
|
|
|
|
|
|
|
|
|
- Now, look back in the stack (staying above `stack_bottom` and
|
|
|
|
|
the `openers_bottom` for this delimiter type) for the
|
|
|
|
|
first matching potential opener ("matching" means same delimiter).
|
|
|
|
|
|
|
|
|
|
- If one is found:
|
|
|
|
|
|
|
|
|
|
+ Figure out whether we have emphasis or strong emphasis:
|
|
|
|
|
if both closer and opener spans have length >= 2, we have
|
|
|
|
|
strong, otherwise regular.
|
|
|
|
|
|
|
|
|
|
+ Insert an emph or strong emph node accordingly, after
|
|
|
|
|
the text node corresponding to the opener.
|
|
|
|
|
|
|
|
|
|
+ Remove any delimiters between the opener and closer from
|
|
|
|
|
the delimiter stack.
|
|
|
|
|
|
|
|
|
|
+ Remove 1 (for regular emph) or 2 (for strong emph) delimiters
|
|
|
|
|
from the opening and closing text nodes. If they become empty
|
|
|
|
|
as a result, remove them and remove the corresponding element
|
|
|
|
|
of the delimiter stack. If the closing node is removed, reset
|
|
|
|
|
`current_position` to the next element in the stack.
|
|
|
|
|
|
2019-10-08 19:00:22 +08:00
|
|
|
|
- If none is found:
|
2017-07-21 05:44:55 +08:00
|
|
|
|
|
|
|
|
|
+ Set `openers_bottom` to the element before `current_position`.
|
|
|
|
|
(We know that there are no openers for this kind of closer up to and
|
|
|
|
|
including this point, so this puts a lower bound on future searches.)
|
|
|
|
|
|
|
|
|
|
+ If the closer at `current_position` is not a potential opener,
|
|
|
|
|
remove it from the delimiter stack (since we know it can't
|
|
|
|
|
be a closer either).
|
|
|
|
|
|
|
|
|
|
+ Advance `current_position` to the next element in the stack.
|
|
|
|
|
|
|
|
|
|
After we're done, we remove all delimiters above `stack_bottom` from the
|
|
|
|
|
delimiter stack.
|
|
|
|
|
|