Hello everyone, Awhile back for the potluck I posted a CommonMark[0] parser I written in pure Guile Scheme which outputs SXML. Today I have decided to release version 0.1, it currently supports parsing almost the entire CommonMark spec besides block and inline HTML. guile-commonmark will not support block and inline HTML as the spec allows malformed HTML to be written which can't be transformed to SXML. guile-commonmark also follows a slightly older version of the spec and one of the major differences are tabs are expanded into spaces(including tabs in code blocks).
Here is an example usage: (use-modules (commonmark) (sxml simple)) (define doc "A CommonMark Document =============== Here is some *scheme* `code` ```scheme (display \"Hello, World!\") ``` 1. A list 2. Another item in a list Read more about [CommonMark](http://commonmark.org/)") ;; Parse the CommonMark document into sxml (define doc-sxml (commonmark->sxml doc)) ;; Writes to current output port (sxml->xml doc-sxml) (newline) Which outputs(formatted for readability): <h1>A CommonMark Document</h1> <p>Here is some <em>scheme</em> <code>code</code></p> <pre> <code class="language-scheme">(display "Hello, World!") </code> </pre> <ol> <li>A list</li> <li>Another item in a list</li> </ol> <p>Read more about <a href="http://commonmark.org/">CommonMark</a></p> You may download the release at https://github.com/OrangeShark/guile-commonmark/releases/download/v0.1/guile-commonmark-0.1.tar.gz GNU Guix users can install guile-commonmark using the attached guix.scm file guile-commonmark is still a young project, so expect plenty of bugs. Please report any bugs to https://github.com/OrangeShark/guile-commonmark As a bonus for haunt users, here is an example using guile-commonmark as a reader to generate a blog written in markdown. (use-modules (haunt asset) (haunt builder blog) (haunt builder atom) (haunt reader) (haunt site) (haunt post) (commonmark)) (define commonmark-reader (make-reader (make-file-extension-matcher "md") (lambda (file) (call-with-input-file file (lambda (port) (values (read-metadata-headers port) (commonmark->sxml port))))))) (site #:title "Built with Guile" #:domain "example.com" #:default-metadata '((author . "Eva Luator") (email . "e...@example.com")) #:readers (list commonmark-reader) #:builders (list (blog) (atom-feed) (atom-feeds-by-tag))) Now just save the above as haunt.scm and put your markdown blog posts in the posts directory with a .md extension and run `haunt build`. Here is an example blog post: title: Hello World! date: 2016-07-24 10:00 tags: guile, commonmark, scheme --- A CommonMark Document =============== Here is some *scheme* `code` ```scheme (display "Hello, World!") ``` 1. A list 2. Another item in a list Read more about [CommonMark](http://commonmark.org/) Please note the header on top portion of the post which allows you to add metadata to your blog posts for haunt. Thanks, Erik [0]: http://commonmark.org/
(use-modules (guix packages) (guix licenses) (guix build-system gnu) (guix download) (gnu packages guile)) (package (name "guile-commonmark") (version "0.1") (source (origin (method url-fetch) (uri (string-append "https://github.com/OrangeShark/guile-commonmark/releases/download/v" version "/guile-commonmark-" version ".tar.gz")) (sha256 (base32 "12cb5fqvvgc87f5xp0ih5az305wnjia89l5jba83d0r2p8bfy0b0")))) (build-system gnu-build-system) (inputs `(("guile" ,guile-2.0))) (synopsis "CommonMark parser for GNU Guile") (description "guile-commonmark is a library for parsing CommonMark, a fully specified variant of Markdown.") (home-page "https://github.com/OrangeShark/guile-commonmark") (license lgpl3+))