2014-09-06 13:28:25 +04:00
|
|
|
CommonMark
|
2014-09-07 06:00:47 +04:00
|
|
|
==========
|
2014-07-22 09:29:16 +04:00
|
|
|
|
2014-09-07 06:26:06 +04:00
|
|
|
CommonMark is a [specification of Markdown syntax][the spec],
|
2014-09-08 18:16:36 +04:00
|
|
|
together with BSD3-licensed implementations (`stmd`) in C and JavaScript.
|
2014-08-14 09:28:18 +04:00
|
|
|
|
|
|
|
The implementations
|
|
|
|
-------------------
|
2014-07-22 09:29:16 +04:00
|
|
|
|
|
|
|
The C implementation provides both a library and a standalone program
|
2014-09-07 06:26:06 +04:00
|
|
|
`stmd` that converts Markdown to HTML. It is written in standard C99
|
2014-08-14 09:28:18 +04:00
|
|
|
and has no library dependencies. (However, if you check it out from the
|
2014-08-14 10:13:33 +04:00
|
|
|
repository, you'll need [`re2c`](http://re2c.org) to generate
|
|
|
|
`scanners.c` from `scanners.re`. This is only a build dependency for
|
|
|
|
developers, since `scanners.c` can be provided in a released source
|
|
|
|
tarball.)
|
2014-07-22 09:29:16 +04:00
|
|
|
|
2014-08-14 09:28:18 +04:00
|
|
|
Usage: stmd [FILE*]
|
|
|
|
Options: --help, -h Print usage information
|
|
|
|
--ast Print AST instead of HTML
|
|
|
|
--version Print version
|
|
|
|
|
2014-09-08 18:16:36 +04:00
|
|
|
The JavaScript implementation is a single JavaScript file, with
|
2014-10-24 23:02:34 +04:00
|
|
|
no dependencies, that can be linked to in an HTML page. (To build,
|
|
|
|
it, do `make js/stmd.js`---this requires `browserify`, which you can
|
|
|
|
get using `npm install -g browserify`.) A command-line
|
|
|
|
version (using `node.js`) is also provided (`js/bin/markdown`), and
|
|
|
|
there is a "dingus" for playing with it interactively. (`make dingus`
|
|
|
|
will start this.)
|
2014-07-22 09:29:16 +04:00
|
|
|
|
2014-08-14 09:41:26 +04:00
|
|
|
[Try it now!](http://jgm.github.io/stmd/js/)
|
|
|
|
|
|
|
|
[The spec] contains over 400 embedded examples which serve as conformance
|
2014-08-14 09:28:18 +04:00
|
|
|
tests. To run the tests for `stmd`, do `make test`. To run them for
|
2014-09-07 06:26:06 +04:00
|
|
|
another Markdown program, say `myprog`, do `make test PROG=myprog`. To
|
2014-08-14 09:28:18 +04:00
|
|
|
run the tests for `stmd.js`, do `make testjs`.
|
|
|
|
|
2014-08-14 09:41:26 +04:00
|
|
|
[The spec]: http://jgm.github.io/stmd/spec.html
|
|
|
|
|
2014-08-14 09:28:18 +04:00
|
|
|
The spec
|
|
|
|
--------
|
2014-07-22 09:29:16 +04:00
|
|
|
|
2014-09-07 06:26:06 +04:00
|
|
|
The source of [the spec] is `spec.txt`. This is basically a Markdown
|
2014-07-22 09:29:16 +04:00
|
|
|
file, with code examples written in a shorthand form:
|
|
|
|
|
|
|
|
.
|
2014-09-07 06:26:06 +04:00
|
|
|
Markdown source
|
2014-07-22 09:29:16 +04:00
|
|
|
.
|
|
|
|
expected HTML output
|
|
|
|
.
|
|
|
|
|
2014-08-14 09:28:18 +04:00
|
|
|
To build an HTML version of the spec, do `make spec.html`. To build a
|
|
|
|
PDF version, do `make spec.pdf`. Both these commands require that
|
|
|
|
pandoc is installed, and creating a PDF requires a latex installation.
|
|
|
|
|
|
|
|
The spec is written from the point of view of the human writer, not
|
|
|
|
the computer reader. It is not an algorithm---an English translation of
|
|
|
|
a computer program---but a declarative description of what counts as a block
|
|
|
|
quote, a code block, and each of the other structural elements that can
|
2014-09-07 06:26:06 +04:00
|
|
|
make up a Markdown document.
|
2014-08-14 09:28:18 +04:00
|
|
|
|
|
|
|
Because John Gruber's [canonical syntax
|
|
|
|
description](http://daringfireball.net/projects/markdown/syntax) leaves
|
|
|
|
many aspects of the syntax undetermined, writing a precise spec requires
|
|
|
|
making a large number of decisions, many of them somewhat arbitrary.
|
|
|
|
In making them, I have appealed to existing conventions and
|
|
|
|
considerations of simplicity, readability, expressive power, and
|
|
|
|
consistency. I have tried to ensure that "normal" documents in the many
|
2014-09-07 06:26:06 +04:00
|
|
|
incompatible existing implementations of Markdown will render, as far as
|
2014-08-14 09:28:18 +04:00
|
|
|
possible, as their authors intended. And I have tried to make the rules
|
|
|
|
for different elements work together harmoniously. In places where
|
|
|
|
different decisions could have been made (for example, the rules
|
|
|
|
governing list indentation), I have explained the rationale for
|
|
|
|
my choices. In a few cases, I have departed slightly from the canonical
|
2014-09-07 06:26:06 +04:00
|
|
|
syntax description, in ways that I think further the goals of Markdown
|
2014-08-14 09:28:18 +04:00
|
|
|
as stated in that description.
|
|
|
|
|
|
|
|
For the most part, I have limited myself to the basic elements
|
|
|
|
described in Gruber's canonical syntax description, eschewing extensions
|
|
|
|
like footnotes and definition lists. It is important to get the core
|
|
|
|
right before considering such things. However, I have included a visible
|
|
|
|
syntax for line breaks and fenced code blocks.
|
|
|
|
|
|
|
|
In all of this, I have been guided by eight years experience writing
|
2014-09-07 06:26:06 +04:00
|
|
|
Markdown implementations in several languages, including the first
|
|
|
|
Markdown parser not based on regular expression substitutions
|
2014-08-14 09:47:37 +04:00
|
|
|
([pandoc](http://github.com/jgm/pandoc)) and the first markdown parsers
|
2014-08-14 09:28:18 +04:00
|
|
|
based on PEG grammars
|
|
|
|
([peg-markdown](http://github.com/jgm/peg-markdown),
|
2014-08-14 09:47:37 +04:00
|
|
|
[lunamark](http://github.com/jgm/lunamark)). Maintaining these projects
|
2014-08-14 09:28:18 +04:00
|
|
|
and responding to years of user feedback have given me a good sense of
|
2014-09-07 06:26:06 +04:00
|
|
|
the complexities involved in parsing Markdown, and of the various design
|
2014-08-14 09:28:18 +04:00
|
|
|
decisions that can be made. I have also explored differences between
|
2014-09-07 06:26:06 +04:00
|
|
|
Markdown implementations extensively using [babelmark
|
2014-08-14 09:28:18 +04:00
|
|
|
2](http://johnmacfarlane.net/babelmark2/). In the early phases of
|
|
|
|
working out the spec, I benefited greatly from collaboration with David
|
2014-09-07 06:26:06 +04:00
|
|
|
Greenspan, and from feedback from several industrial users of Markdown,
|
2014-08-14 09:28:18 +04:00
|
|
|
including Jeff Atwood, Vincent Marti, and Neil Williams.
|