2015-04-16 22:55:05 +03:00
|
|
|
cmark
|
|
|
|
=====
|
2014-07-22 09:29:16 +04:00
|
|
|
|
2015-05-07 00:07:33 +03:00
|
|
|
[![Build Status]](https://travis-ci.org/jgm/cmark)
|
|
|
|
[![Windows Build Status]](https://ci.appveyor.com/project/jgm/cmark)
|
|
|
|
|
2015-04-16 22:55:05 +03:00
|
|
|
`cmark` is the C reference implementation of [CommonMark], a
|
|
|
|
rationalized version of Markdown syntax with a [spec][the spec].
|
|
|
|
(For the JavaScript reference implementation, see
|
|
|
|
[commonmark.js].)
|
2014-08-14 09:28:18 +04:00
|
|
|
|
2015-01-25 08:47:46 +03:00
|
|
|
It provides a shared library (`libcmark`) with functions for parsing
|
|
|
|
CommonMark documents to an abstract syntax tree (AST), manipulating
|
2015-07-04 08:12:49 +03:00
|
|
|
the AST, and rendering the document to HTML, groff man, LaTeX,
|
2015-03-22 03:36:02 +03:00
|
|
|
CommonMark, or an XML representation of the AST. It also provides a
|
|
|
|
command-line program (`cmark`) for parsing and rendering CommonMark
|
|
|
|
documents.
|
2015-01-25 08:47:46 +03:00
|
|
|
|
2015-04-16 22:55:05 +03:00
|
|
|
Advantages of this library:
|
|
|
|
|
|
|
|
- **Portable.** The library and program are written in standard
|
2015-06-17 19:13:50 +03:00
|
|
|
C99 and have no external dependencies. They have been tested with
|
2015-04-16 22:55:05 +03:00
|
|
|
MSVC, gcc, tcc, and clang.
|
|
|
|
|
2015-06-17 19:13:50 +03:00
|
|
|
- **Fast.** cmark can render a Markdown version of *War and Peace* in
|
|
|
|
the blink of an eye (127 milliseconds on a ten year old laptop,
|
|
|
|
vs. 100-400 milliseconds for an eye blink). In our [benchmarks],
|
|
|
|
cmark is 10,000 times faster than the original `Markdown.pl`, and
|
|
|
|
on par with the very fastest available Markdown processors.
|
2015-04-16 22:55:05 +03:00
|
|
|
|
|
|
|
- **Accurate.** The library passes all CommonMark conformance tests.
|
|
|
|
|
2015-04-16 23:57:29 +03:00
|
|
|
- **Standardized.** The library can be expected to parse CommonMark
|
|
|
|
the same way as any other conforming parser. So, for example,
|
|
|
|
you can use `commonmark.js` on the client to preview content that
|
|
|
|
will be rendered on the server using `cmark`.
|
|
|
|
|
2015-04-16 22:55:05 +03:00
|
|
|
- **Robust.** The library has been extensively fuzz-tested using
|
2015-06-17 19:20:30 +03:00
|
|
|
[american fuzzy lop]. The test suite includes pathological cases
|
2015-04-16 22:55:05 +03:00
|
|
|
that bring many other Markdown parsers to a crawl (for example,
|
|
|
|
thousands-deep nested bracketed text or block quotes).
|
|
|
|
|
|
|
|
- **Flexible.** CommonMark input is parsed to an AST which can be
|
|
|
|
manipulated programatically prior to rendering.
|
|
|
|
|
2015-07-04 08:12:49 +03:00
|
|
|
- **Multiple renderers.** Output in HTML, groff man, LaTeX, CommonMark,
|
2015-04-16 22:55:05 +03:00
|
|
|
and a custom XML format is supported. And it is easy to write new
|
|
|
|
renderers to support other formats.
|
|
|
|
|
|
|
|
- **Free.** BSD2-licensed.
|
2015-01-25 08:47:46 +03:00
|
|
|
|
|
|
|
It is easy to use `libcmark` in python, lua, ruby, and other dynamic
|
|
|
|
languages: see the `wrappers/` subdirectory for some simple examples.
|
2015-01-25 08:33:22 +03:00
|
|
|
|
2015-05-07 00:49:37 +03:00
|
|
|
There are also libraries that wrap `libcmark` for
|
|
|
|
[go](https://github.com/rhinoman/go-commonmark),
|
|
|
|
[Haskell](http://hackage.haskell.org/package/cmark),
|
2015-05-13 20:21:03 +03:00
|
|
|
[ruby](https://github.com/gjtorikian/commonmarker),
|
2015-12-28 11:28:07 +03:00
|
|
|
[lua](https://github.com/jgm/cmark-lua),
|
2015-05-28 18:21:52 +03:00
|
|
|
[Perl](https://metacpan.org/release/CommonMark), and
|
|
|
|
[R](http://cran.r-project.org/package=commonmark).
|
2015-01-25 08:33:22 +03:00
|
|
|
|
2015-01-25 08:28:29 +03:00
|
|
|
Installing
|
|
|
|
----------
|
2014-11-07 22:15:18 +03:00
|
|
|
|
2014-11-12 07:45:30 +03:00
|
|
|
Building the C program (`cmark`) and shared library (`libcmark`)
|
2014-12-02 07:38:17 +03:00
|
|
|
requires [cmake]. If you modify `scanners.re`, then you will also
|
2016-07-13 19:34:41 +03:00
|
|
|
need [re2c] \(>= 0.14.2\), which is used to generate `scanners.c` from
|
2014-12-02 07:38:17 +03:00
|
|
|
`scanners.re`. We have included a pre-generated `scanners.c` in
|
|
|
|
the repository to reduce build dependencies.
|
2014-11-12 07:45:30 +03:00
|
|
|
|
2014-11-13 00:17:06 +03:00
|
|
|
If you have GNU make, you can simply `make`, `make test`, and `make
|
|
|
|
install`. This calls [cmake] to create a `Makefile` in the `build`
|
|
|
|
directory, then uses that `Makefile` to create the executable and
|
2015-01-24 18:24:16 +03:00
|
|
|
library. The binaries can be found in `build/src`. The default
|
|
|
|
installation prefix is `/usr/local`. To change the installation
|
|
|
|
prefix, pass the `INSTALL_PREFIX` variable if you run `make` for the
|
|
|
|
first time: `make INSTALL_PREFIX=path`.
|
2014-11-12 07:45:30 +03:00
|
|
|
|
2014-11-13 00:17:06 +03:00
|
|
|
For a more portable method, you can use [cmake] manually. [cmake] knows
|
|
|
|
how to create build environments for many build systems. For example,
|
|
|
|
on FreeBSD:
|
2014-11-07 22:15:18 +03:00
|
|
|
|
|
|
|
mkdir build
|
|
|
|
cd build
|
2014-11-13 00:17:06 +03:00
|
|
|
cmake .. # optionally: -DCMAKE_INSTALL_PREFIX=path
|
2015-01-07 09:23:31 +03:00
|
|
|
make # executable will be created as build/src/cmark
|
2014-11-13 00:17:06 +03:00
|
|
|
make test
|
2014-11-07 22:15:18 +03:00
|
|
|
make install
|
|
|
|
|
2014-11-13 00:17:06 +03:00
|
|
|
Or, to create Xcode project files on OSX:
|
2014-11-07 22:15:18 +03:00
|
|
|
|
2014-11-13 00:17:06 +03:00
|
|
|
mkdir build
|
|
|
|
cd build
|
|
|
|
cmake -G Xcode ..
|
2015-01-22 11:37:38 +03:00
|
|
|
open cmark.xcodeproj
|
2014-11-12 07:45:30 +03:00
|
|
|
|
2014-11-13 00:17:06 +03:00
|
|
|
The GNU Makefile also provides a few other targets for developers.
|
2015-01-13 08:09:17 +03:00
|
|
|
To run a benchmark:
|
|
|
|
|
|
|
|
make bench
|
|
|
|
|
|
|
|
To run a test for memory leaks using `valgrind`:
|
2014-11-12 18:51:06 +03:00
|
|
|
|
|
|
|
make leakcheck
|
|
|
|
|
2015-01-13 08:09:17 +03:00
|
|
|
To reformat source code using `astyle`:
|
|
|
|
|
|
|
|
make astyle
|
|
|
|
|
2015-06-17 19:20:30 +03:00
|
|
|
To run a "fuzz test" against ten long randomly generated inputs:
|
|
|
|
|
|
|
|
make fuzztest
|
|
|
|
|
|
|
|
To do a more systematic fuzz test with [american fuzzy lop]:
|
|
|
|
|
|
|
|
AFL_PATH=/path/to/afl_directory make afl
|
|
|
|
|
2014-11-17 03:00:36 +03:00
|
|
|
To make a release tarball and zip archive:
|
2014-11-12 18:51:06 +03:00
|
|
|
|
2014-11-17 03:00:36 +03:00
|
|
|
make archive
|
2014-11-12 18:43:17 +03:00
|
|
|
|
2015-01-25 08:28:29 +03:00
|
|
|
Installing (Windows)
|
|
|
|
--------------------
|
2014-11-14 19:27:16 +03:00
|
|
|
|
2014-11-25 00:01:45 +03:00
|
|
|
To compile with MSVC and NMAKE:
|
|
|
|
|
|
|
|
nmake
|
|
|
|
|
2014-11-14 19:27:16 +03:00
|
|
|
You can cross-compile a Windows binary and dll on linux if you have the
|
|
|
|
`mingw32` compiler:
|
|
|
|
|
|
|
|
make mingw
|
|
|
|
|
|
|
|
The binaries will be in `build-mingw/windows/bin`.
|
|
|
|
|
2015-01-25 08:28:29 +03:00
|
|
|
Usage
|
|
|
|
-----
|
|
|
|
|
|
|
|
Instructions for the use of the command line program and library can
|
|
|
|
be found in the man pages in the `man` subdirectory.
|
|
|
|
|
2015-07-13 19:21:35 +03:00
|
|
|
Security
|
|
|
|
--------
|
|
|
|
|
|
|
|
By default, the library will pass through raw HTML and potentially
|
|
|
|
dangerous links (`javascript:`, `vbscript:`, `data:`, `file:`).
|
|
|
|
|
|
|
|
It is recommended that users either disable this potentially unsafe
|
|
|
|
feature by using the option `CMARK_OPT_SAFE` (or `--safe` with the
|
|
|
|
command-line program), or run the output through an HTML sanitizer
|
|
|
|
to protect against
|
2015-01-25 08:28:29 +03:00
|
|
|
[XSS attacks](http://en.wikipedia.org/wiki/Cross-site_scripting).
|
2014-10-26 23:27:38 +03:00
|
|
|
|
|
|
|
Contributing
|
|
|
|
------------
|
|
|
|
|
|
|
|
There is a [forum for discussing
|
|
|
|
CommonMark](http://talk.commonmark.org); you should use it instead of
|
|
|
|
github issues for questions and possibly open-ended discussions.
|
2014-11-14 02:42:29 +03:00
|
|
|
Use the [github issue tracker](http://github.com/jgm/CommonMark/issues)
|
2014-10-26 23:27:38 +03:00
|
|
|
only for simple, clear, actionable issues.
|
|
|
|
|
2014-11-23 04:20:41 +03:00
|
|
|
Authors
|
|
|
|
-------
|
|
|
|
|
2015-01-25 08:28:29 +03:00
|
|
|
John MacFarlane wrote the original library and program.
|
|
|
|
The block parsing algorithm was worked out together with David
|
|
|
|
Greenspan. Vicent Marti optimized the C implementation for
|
|
|
|
performance, increasing its speed tenfold. Kārlis Gaņģis helped
|
|
|
|
work out a better parsing algorithm for links and emphasis,
|
|
|
|
eliminating several worst-case performance issues.
|
|
|
|
Nick Wellnhofer contributed many improvements, including
|
|
|
|
most of the C library's API and its test harness.
|
2014-11-13 00:17:06 +03:00
|
|
|
|
2015-04-16 22:55:05 +03:00
|
|
|
[benchmarks]: benchmarks.md
|
|
|
|
[the spec]: http://spec.commonmark.org
|
|
|
|
[CommonMark]: http://commonmark.org
|
2014-11-07 22:15:18 +03:00
|
|
|
[cmake]: http://www.cmake.org/download/
|
2014-11-12 07:48:09 +03:00
|
|
|
[re2c]: http://re2c.org
|
2015-04-16 22:55:05 +03:00
|
|
|
[commonmark.js]: https://github.com/jgm/commonmark.js
|
2015-05-07 00:07:33 +03:00
|
|
|
[Build Status]: https://img.shields.io/travis/jgm/cmark/master.svg?style=flat
|
|
|
|
[Windows Build Status]: https://ci.appveyor.com/api/projects/status/32r7s2skrgm9ubva?svg=true
|
2015-06-17 19:20:30 +03:00
|
|
|
[american fuzzy lop]: http://lcamtuf.coredump.cx/afl/
|