2010-12-01 21:29:50 +00:00
|
|
|
|
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
|
2012-05-04 14:36:04 +00:00
|
|
|
|
LEG grammars --, which itself is based on the parser used
|
2010-12-01 21:29:50 +00:00
|
|
|
|
by peg-markdown.
|
|
|
|
|
|
|
|
|
|
[markdown]: http://daringfireball.net/projects/markdown/
|
|
|
|
|
[peg-markdown]: https://github.com/jgm/peg-markdown
|
|
|
|
|
[peg]: https://github.com/pointlander/peg
|
|
|
|
|
[Go]: http://golang.org/
|
|
|
|
|
|
|
|
|
|
Support for HTML output is implemented, but Groff and LaTeX
|
2012-05-04 10:42:16 +00:00
|
|
|
|
output have not been ported. The output is identical
|
2010-12-01 21:29:50 +00:00
|
|
|
|
to that of peg-markdown.
|
|
|
|
|
|
2012-05-04 14:36:04 +00:00
|
|
|
|
I try to keep the grammar in sync with the C version, by
|
|
|
|
|
cherry-picking relevant changes. In the commit history the
|
|
|
|
|
corresponding revisions have a suffix *[jgm/peg-markdown].*
|
|
|
|
|
|
2011-07-04 16:13:48 +00:00
|
|
|
|
A simple benchmark has been done by comparing the
|
2012-05-04 14:36:04 +00:00
|
|
|
|
execution times of the Go binary (cmd/main.go) and the
|
2011-07-04 16:13:48 +00:00
|
|
|
|
original C implementation's binary needed for processing
|
|
|
|
|
a Markdown document, which had been created by
|
|
|
|
|
concatenating ten [Markdown syntax descriptions][syntax].
|
|
|
|
|
|
|
|
|
|
[syntax]: http://daringfireball.net/projects/markdown/syntax.text
|
|
|
|
|
|
2012-05-04 14:36:04 +00:00
|
|
|
|
The C version is still around 1.3x faster than the Go version.
|
2011-07-04 16:13:48 +00:00
|
|
|
|
|
2010-12-01 21:29:50 +00:00
|
|
|
|
|
|
|
|
|
## Installation
|
|
|
|
|
|
2012-04-20 23:44:22 +00:00
|
|
|
|
Provided you have a copy of Go 1, and git is available,
|
2010-12-01 21:29:50 +00:00
|
|
|
|
|
2012-04-20 23:44:22 +00:00
|
|
|
|
go get github.com/knieriem/markdown
|
2010-12-01 21:29:50 +00:00
|
|
|
|
|
2012-04-20 23:44:22 +00:00
|
|
|
|
should download and install the package according to
|
|
|
|
|
your GOPATH settings.
|
2010-12-01 21:29:50 +00:00
|
|
|
|
|
2012-05-04 14:36:04 +00:00
|
|
|
|
See doc.go for an example how to use the package. There has
|
|
|
|
|
been an API change recently: Where you previously wrote
|
|
|
|
|
|
|
|
|
|
buf, err := ioutil.ReadAll(os.Stdin)
|
|
|
|
|
...
|
|
|
|
|
doc := markdown.Parse(string(buf), markdown.Extensions{Smart: true})
|
|
|
|
|
doc.WriteHtml(w)
|
|
|
|
|
|
|
|
|
|
you would now write:
|
|
|
|
|
|
|
|
|
|
p := markdown.NewParser(&markdown.Extensions{Smart: true})
|
|
|
|
|
|
|
|
|
|
w := bufio.NewWriter(os.Stdout)
|
|
|
|
|
p.Markdown(os.Stdin, markdown.ToHTML(w))
|
|
|
|
|
w.Flush()
|
|
|
|
|
|
|
|
|
|
One purpose of the change is to have a Parser that can be
|
|
|
|
|
reused between invocations of the converter.
|
|
|
|
|
|
|
|
|
|
---
|
2010-12-01 21:29:50 +00:00
|
|
|
|
|
|
|
|
|
To create the command line program *markdown,* run
|
|
|
|
|
|
2012-04-20 23:44:22 +00:00
|
|
|
|
go build github.com/knieriem/markdown/cmd/markdown
|
2010-12-01 21:29:50 +00:00
|
|
|
|
|
2012-04-20 23:44:22 +00:00
|
|
|
|
the binary should then be available in the current directory.
|
2010-12-01 21:29:50 +00:00
|
|
|
|
|
2012-05-04 10:42:16 +00:00
|
|
|
|
To run tests, type
|
2010-12-01 21:29:50 +00:00
|
|
|
|
|
2012-05-04 10:42:16 +00:00
|
|
|
|
go test github.com/knieriem/markdown
|
2010-12-01 21:29:50 +00:00
|
|
|
|
|
2012-05-04 10:42:16 +00:00
|
|
|
|
At the moment, tests are based on the .text files from the
|
|
|
|
|
Markdown 1.0.3 test suite created by John Gruber, [imported from
|
|
|
|
|
peg-markdown][testsuite]. The output of the conversion of these
|
|
|
|
|
.text files to html is compared to the output of peg-markdown.
|
2010-12-13 18:44:11 +00:00
|
|
|
|
|
2012-05-04 10:42:16 +00:00
|
|
|
|
[testsuite]: https://github.com/jgm/peg-markdown/tree/master/MarkdownTest_1.0.3
|
2012-04-20 23:44:22 +00:00
|
|
|
|
|
2010-12-13 18:44:11 +00:00
|
|
|
|
## Development
|
|
|
|
|
|
2012-04-20 23:44:22 +00:00
|
|
|
|
There is not yet a way to create a Go source file like
|
|
|
|
|
`parser.leg.go` automatically from another file, `parser.leg`,
|
|
|
|
|
when building packages and commands using the Go tool. To make
|
|
|
|
|
*markdown* installable using `go get`, `parser.leg.go` has
|
|
|
|
|
been added to the VCS.
|
|
|
|
|
|
2012-05-04 10:42:16 +00:00
|
|
|
|
`Make parser` will update `parser.leg.go` using `leg` – which
|
|
|
|
|
is part of [knieriem/peg][] at github –, if parser.leg has
|
2012-04-20 23:44:22 +00:00
|
|
|
|
been changed, or if the Go file is missing. If a copy of *peg*
|
|
|
|
|
is not yet present on your system, run
|
|
|
|
|
|
|
|
|
|
go get github.com/knieriem/peg
|
|
|
|
|
|
|
|
|
|
Then `make parser` should succeed.
|
|
|
|
|
|
2010-12-01 21:29:50 +00:00
|
|
|
|
[knieriem/peg]: https://github.com/knieriem/peg
|
|
|
|
|
|
2010-12-13 18:36:35 +00:00
|
|
|
|
|
|
|
|
|
## Extensions
|
|
|
|
|
|
|
|
|
|
In addition to the extensions already present in peg-markdown,
|
|
|
|
|
this package also supports definition lists (option `-dlists`)
|
|
|
|
|
similar to the way they are described in the documentation of
|
|
|
|
|
[PHP Markdown Extra][].
|
|
|
|
|
|
2010-12-13 18:44:11 +00:00
|
|
|
|
Definitions (`<dd>...</dd>`) are implemented using [`ListTight`][ListTight]
|
2010-12-13 18:36:35 +00:00
|
|
|
|
and `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 `:` and `~` can be used.
|
|
|
|
|
|
|
|
|
|
[PHP Markdown Extra]: http://michelf.com/projects/php-markdown/extra/#def-list
|
|
|
|
|
[ListTight]: https://github.com/knieriem/markdown/blob/master/parser.leg#L191
|
|
|
|
|
|
|
|
|
|
|
2010-12-01 21:29:50 +00:00
|
|
|
|
## Todo
|
|
|
|
|
|
2012-05-04 14:36:04 +00:00
|
|
|
|
* Port tables and perhaps other extensions from [fletcher/peg-multimarkdown][mmd].
|
2010-12-01 21:29:50 +00:00
|
|
|
|
|
|
|
|
|
## Subdirectory Index
|
|
|
|
|
|
2012-04-29 22:56:41 +00:00
|
|
|
|
* cmd/markdown – command line program `markdown`
|
2010-12-01 21:29:50 +00:00
|
|
|
|
|
2012-05-04 14:36:04 +00:00
|
|
|
|
[mmd]: https://github.com/fletcher/peg-multimarkdown
|