https://github.com/hiphish/cl-cmark
CommonMark implementation for Common Lisp based on libcmark. This system wraps the official reference implementation library, written in C, and provides lispy bindings for Common Lisp.
https://github.com/hiphish/cl-cmark
common-lisp commonmark lisp mark
Last synced: about 2 months ago
JSON representation
CommonMark implementation for Common Lisp based on libcmark. This system wraps the official reference implementation library, written in C, and provides lispy bindings for Common Lisp.
- Host: GitHub
- URL: https://github.com/hiphish/cl-cmark
- Owner: HiPhish
- License: bsd-2-clause
- Created: 2022-06-10T22:10:01.000Z (almost 3 years ago)
- Default Branch: master
- Last Pushed: 2023-11-07T19:57:19.000Z (over 1 year ago)
- Last Synced: 2025-01-26T04:41:36.686Z (4 months ago)
- Topics: common-lisp, commonmark, lisp, mark
- Language: Common Lisp
- Homepage: https://gitlab.com/HiPhish/cl-cmark
- Size: 192 KB
- Stars: 2
- Watchers: 2
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.rst
- Changelog: CHANGELOG.rst
- License: LICENSE.txt
Awesome Lists containing this project
README
.. default-role:: code
###################################
libcmark bindings for Common Lisp
###################################This system implements bindings for the CommonMark_ reference implementation
library cmark_. It allows us to parse a CommonMark document into a tree of
nodes, which we can then transform and traverse.Installation
############This project uses ASDF_ as its build system. There are two systems provided:
`cmark` (what you most likely want) and `libcmark.` In either case, you will
need the following:- A Lisp implementation which supports CFFI_
- CFFI
- The native cmark_ library installed on your systemFor further dependencies please refer to the `cmark.asd`_ file.
Using
#####There are two separate systems. The `cmark` system is a high-level lispy system
which most users will want to use. It provides most of the functionality of the
C library using idiomatic and native Common Lisp concepts. It depends on the
`libcmark` system.The `libcmark` system is just a set of thin bindings over the C API using CFFI.
It is mostly a 1:1 binding and you will most likely only need it if you want to
create your own high-level system on top of it. The `libcmark` system can be
loaded without loading the `cmark` system.The documentation is written in `GNU Texinfo`_, you can build it via the
provided makefile: `make doc` will build the documentation in HTML and GNU Info
formats.Example
=======Let us parse a small CommonMark document and print the node tree.
.. code-block:: lisp
(defpackage #:cmark-user
(:use #:cl #:cmark))
(in-package #:cmark-user)(defvar *document-tree* (cmark::parse-document "Hello *world*!")
"Parse the document into a tree of nodes")(defun print-node (node &optional (level 0))
"Recursively print each node and its children at progressively deeper
levels"
(format t "~&~A~A"
(make-string (* 2 level) :initial-element #\Space)
(class-name (class-of node)))
(dolist (child (cmark::node-children node))
(print-node child (1+ level))))(print-node *DOCUMENT-TREE*)
This produces the following output:
.. code-block::
DOCUMENT-NODE
PARAGRAPH-NODE
TEXT-NODE
EMPH-NODE
TEXT-NODE
TEXT-NODERoadmap
#######The project is pretty much feature complete. There are a few things that would
be nice to have, but they are by no means blockers for a stable release. Here
is a list of the remaining tasks:- Maybe custom printed representation for node classes?
License
#######Released under the `BSD-2-Clause` license. See the LICENSE_ file for details.
.. ----------------------------------------------------------------------------
.. _CommonMark: https://commonmark.org/
.. _cmark: https://github.com/commonmark/cmark
.. _GNU Texinfo: https://www.gnu.org/software/texinfo/
.. _ASDF: https://asdf.common-lisp.dev/
.. _CFFI: https://cffi.common-lisp.dev/
.. _cmark.asd: cmark.asd
.. _LICENSE: LICENSE.txt