This is an implementation of John Gruber's markdown in Go. It is a translation of peg-markdown, written by John MacFarlane in C, into Go. It is using a modified version of Andrew J Snodgrass' PEG parser peg -- now supporting LEG grammars --, which is itself based on the parser used by peg-markdown.
Support for HTML output is implemented, but Groff and LaTeX output have not been ported. The output should be identical to that of peg-markdown.
A simple benchmark has been done by comparing the execution time of the Go binary (cmd/main.go) and the original C implementation's binary needed for processing a Markdown document, which had been created by concatenating ten Markdown syntax descriptions.
In December 2010, the
8g compiled Go version still was
around 3.5 times slower than the original C version.
In the meantime Go compilers and runtime have been improved,
which reduced the factor down to around 2.5 for both
for the unmodified sources.
After some current changes to the peg/leg parser generator
the Markdown parser can take advantage of the switch optimization
now. This further reduced the execution time difference
to 1.9x for
Provided you have a recent copy of Go, and git is available,
should install the package into
$GOROOT/src/pkg/github.com/knieriem/markdown, and build
See doc.go for an example how to use the package.
To create the command line program markdown, run
cd $GOROOT/src/pkg/github.com/knieriem/markdown gomake cmd
the binary should then be available in subdirectory cmd.
To run the Markdown 1.0.3 test suite, type
This will download peg-markdown, in case you have
available, build cmd/markdown, and run the test suite.
The test suite will fail on one test, for the same reason which applies to peg-markdown, because the grammar is the same. See the original README for details.
Goinstall is creating its own Makefiles to build
packages, based on the
.go files found in the directory.
It would not know about
parser.leg.go, which had to be built
leg from the
parser.leg grammar source file first.
Because of this, to make markdown installable using
parser.leg.go has been added to the VCS.
Make will update
leg, which is part of
knieriem/peg at github, if parser.leg has been changed. If
a copy of this package has not yet been downloaded -- i.e. no
./peg is present --,
make will perform the
necessary steps automatically (run
make peg to manually
To update knieriem/peg run
gomake update-peg. This will
fetch available revisions from github, and remove the old
In addition to the extensions already present in peg-markdown,
this package also supports definition lists (option
similar to the way they are described in the documentation of
PHP Markdown Extra.
<dd>...</dd>) are implemented using
ListLoose, on which bullet lists and ordered lists are based
already. If there is an empty line between the definition title and
the first definition, a loose list is expected, a tight list otherwise.
As definition item markers both
~ can be used.
Rename element key identifiers, so that they are not public
Where appropriate, use more idiomatic Go code
peg – PEG parser generator (modified) from Andrew J Snodgrass
peg/leg – LEG parser generator, based on PEG
cmd – command line program