haskell
This package provides Haskell bindings for
<https://github.com/jgm/cmark libcmark>, the reference
parser for <http://commonmark.org CommonMark>, a fully
specified variant of Markdown. It includes sources for
libcmark (0.19.0) and does not require prior installation of the
C library.
cmark provides the following advantages over existing
Markdown libraries for Haskell:
- Speed: Conversion speed is on par with the
<https://hackage.haskell.org/package/sundown sundown>
library. We were unable to measure precisely
against
<https://hackage.haskell.org/package/sundown sundown>,
which raised a malloc error when compiled into our
benchmark suite. Relative to other implementations:
cmark was 82 times faster than
<https://hackage.haskell.org/package/cheapskate cheapskate>,
59 times faster than
<https://hackage.haskell.org/package/markdown markdown>,
105 times faster than
<https://hackage.haskell.org/package/pandoc pandoc>,
and 2.8 times faster than
<https://hackage.haskell.org/package/discount discount>.
- Memory footprint: Memory footprint is on par with
<https://hackage.haskell.org/package/sundown sundown>.
On one sample, the library uses a fourth the memory that
<https://hackage.haskell.org/package/markdown markdown>
uses, and less than a tenth the memory that
<https://hackage.haskell.org/package/pandoc pandoc>
uses.
- Robustness: cmark can handle whatever is thrown
at it, without the exponential blowups in parsing
time one can sometimes get with other libraries.
(The input @bench\/full-sample.md@, for example,
causes both
<https://hackage.haskell.org/package/pandoc pandoc>
and
<https://hackage.haskell.org/package/markdown markdown>
to grind to a halt.)
- Accuracy: cmark passes the CommonMark spec\'s
suite of over 500 conformance tests.
- Standardization: Since there is a spec and a
comprehensive suite of tests, we can have a high
degree of confidence that any two CommonMark
implementations will behave the same. Thus, for
example, one could use this library for server-side
rendering and
<https://github.com/jgm/commonmark.js commonmark.js>
for client-side previewing.
- Ease of installation: cmark is portable and has
minimal dependencies.
cmark does not provide Haskell versions of the whole
<https://github.com/jgm/cmark libcmark> API, which is
built around mutable @cmark_node@ objects. Instead, it
provides functions for converting CommonMark to HTML
(and other formats), and a function for converting
CommonMark to a @Node@ tree that can be processed
further using Haskell.
A note on security: This library does not attempt
to sanitize HTML output. We recommend using
<https://hackage.haskell.org/package/xss-sanitize xss-sanitize>
to filter the output.
A note on stability: There is a good chance the API
will change significantly after this early release.
jgm/commonmark-hs