cmark: Haskell bindings to libcmark, CommonMark parser and renderer

[ bsd3, library, text ] [ Propose Tags ]

This package provides Haskell bindings for libcmark, the reference parser for CommonMark. 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: Conversion speed is on par with the sundown library: about 30 times faster than pandoc, 24 times faster than the Haskell markdown package, 8 times faster than cheapskate.

  • Memory footprint: Memory footprint is on par with sundown. On one sample, the library uses a fourth the memory that markdown uses, 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 one can sometimes get with other libraries.

  • 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 commonmark.js for client-side previewing.

  • Ease of installation: cmark has minimal dependencies.

cmark does not provide Haskell versions of the whole libcmark API, which is built around mutable cmark_node objects. Instead, it provides two functions:

  • markdownToHtml uses libcmark's parser and renderer for a maximally efficient conversion of CommonMark to HTML (as a Text). ("Smart punctuation" and a few other options can be enabled.)

  • parseDocument uses libcmark's parser to produce a Node tree that can be processed further using Haskell. One can transform the tree using generics, convert it to another kind of structure (such as a Pandoc object that can be rendered using pandoc's renderers) or render it using a custom rendering function.

A note on security: This library does not attempt to sanitize HTML output. We recommend using xss-sanitize to filter the output.

A note on stability: There is a good chance the API will change significantly after this early release.


[Skip to Readme]

Modules

[Index]

Downloads

Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees

Candidates

Versions [RSS] 0.1.0.0, 0.1.0.1, 0.2, 0.2.0.1, 0.2.0.2, 0.3, 0.3.0.1, 0.3.1, 0.3.2, 0.3.3, 0.3.3.1, 0.3.4, 0.3.5, 0.4.0.1, 0.4.1, 0.5.0, 0.5.1, 0.5.2, 0.5.2.1, 0.5.3, 0.5.3.1, 0.5.4, 0.5.5, 0.5.5.1, 0.5.6, 0.5.6.1, 0.5.6.3, 0.6, 0.6.1 (info)
Dependencies base (>=4.5 && <4.8), ghc-prim (>=0.2), mtl, syb, text (>=1.1 && <1.3) [details]
License BSD-3-Clause
Copyright (C) 2015 John MacFarlane
Author John MacFarlane
Maintainer jgm@berkeley.edu
Category Text
Home page https://github.com/jgm/commonmark-hs
Source repo head: git clone git://github.com/jgm/cmark-hs.git
Uploaded by JohnMacFarlane at 2015-03-16T06:21:52Z
Distributions Debian:0.6, Fedora:0.6.1, FreeBSD:0.4.0.1, LTSHaskell:0.6.1, NixOS:0.6.1, Stackage:0.6.1
Reverse Dependencies 11 direct, 166 indirect [details]
Downloads 40436 total (136 in the last 30 days)
Rating 2.25 (votes: 2) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs available [build log]
Last success reported on 2015-03-16 [all 1 reports]

Readme for cmark-0.1.0.1

[back to package description]

cmark-hs

This package provides Haskell bindings for libcmark, the reference parser for CommonMark. 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: Conversion speed is on par with the sundown library: about 30 times faster than pandoc, 24 times faster than the Haskell markdown package, 8 times faster than cheapskate.

  • Memory footprint: Memory footprint is on par with sundown. On one sample, the library uses a fourth the memory that markdown uses, 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 one can sometimes get with other libraries. For example, the input produced by this command will tie markdown and pandoc in knots:

    python -c "print ((500 * '[') + 'hi' + (500 * ']') + '(url)')"
    

    cmark handles it easily, with no slowdown.

  • 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 commonmark.js for client-side previewing.

  • Ease of installation: cmark has minimal dependencies.

cmark does not provide Haskell versions of the whole libcmark API, which is built around mutable cmark_node objects. Instead, it provides two functions:

  • markdownToHtml uses libcmark's parser and renderer for a maximally efficient conversion of CommonMark to HTML (as a Text). ("Smart punctuation" and a few other options can be enabled.)

    Prelude CMark Data.Text> markdownToHtml [optSmart] (pack "dog's *breakfast*")
    "<p>dog\8217s <em>breakfast</em></p>\n"
    
  • parseDocument uses libcmark's parser to produce a Node tree that can be processed further using Haskell. One can transform the tree using generics, convert it to another kind of structure (such as a Pandoc object that can be rendered using pandoc's renderers) or render it using a custom rendering function.

    Prelude CMark Data.Text> parseDocument  [optSmart] (pack "dog's *breakfast*")
    Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 17})) DOCUMENT [Node (Just (PosInfo {startLine = 1, startColumn = 1, endLine = 1, endColumn = 17})) PARAGRAPH [Node Nothing (TEXT "dog") [],Node Nothing (TEXT "\8217") [],Node Nothing (TEXT "s ") [],Node Nothing EMPH [Node Nothing (TEXT "breakfast") []]]]
    

A note on security: This library does not attempt to sanitize HTML output. We recommend using xss-sanitize to filter the output.

A note on stability: There is a good chance the API will change significantly after this early release.