cmark (original) (raw)
This version can be pinned in stack with:cmark-0.6.1@sha256:5994e5d56d286e857063375154eac4128aea835ec867955963c27237823b8085,3361
Module documentation for 0.6.1
cmark-hs
This package provides Haskell bindings for libcmark, the reference parser for CommonMark, a fully specified variant of Markdown. It includes sources for libcmark and does not require prior installation of the C library.
cmark provides the following advantages over existing Markdown libraries for Haskell:
- Speed: cmark can render a Markdown version of War and Peace in the blink of an eye. Conversion speed is on par with thesundown library, though we were unable to benchmark precisely, because sundown raised a malloc error when compiled into our benchmark suite. Relative to other Haskell Markdown libraries: cmark was 82 times faster than cheapskate, 59 times faster thanmarkdown, 105 times faster than pandoc, and 3 times faster than discount.
- Memory footprint: Memory footprint is on par with sundown. On one sample, the library uses a fourth the memory that markdownuses, and less than a tenth the memory that pandoc uses.
- Robustness: cmark can handle whatever is thrown at it, without the exponential blowups in parsing time that sometimes afflict other libraries. (The input
bench/full-sample.md
, for example, causes both pandoc and markdown to grind to a halt.) libcmark has been extensively fuzz-tested. - Accuracy: cmark passes the CommonMark spec’s suite of over 600 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 commonmark.js for client-side previewing.
- Multiple renderers. Output in HTML, groff man, LaTeX, CommonMark, and a custom XML format is supported. And it is easy to write new renderers to support other formats.
- Ease of installation: cmark is portable and has minimal dependencies.
cmark does not provide Haskell versions of the whole libcmarkAPI, 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 xss-sanitize to filter the output, or enabling optSafe
to filter out all raw HTML and potentially dangerous URLs.
A note on stability: There is a good chance the API will change significantly after this early release.