summaryrefslogtreecommitdiff
path: root/cmark/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'cmark/README.md')
-rw-r--r--cmark/README.md190
1 files changed, 190 insertions, 0 deletions
diff --git a/cmark/README.md b/cmark/README.md
new file mode 100644
index 0000000000..99d02bd619
--- /dev/null
+++ b/cmark/README.md
@@ -0,0 +1,190 @@
+cmark
+=====
+
+[![CI
+tests](https://github.com/commonmark/cmark/workflows/CI%20tests/badge.svg)](https://github.com/commonmark/cmark/actions)
+
+`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].)
+
+It provides a shared library (`libcmark`) with functions for parsing
+CommonMark documents to an abstract syntax tree (AST), manipulating
+the AST, and rendering the document to HTML, groff man, LaTeX,
+CommonMark, or an XML representation of the AST. It also provides a
+command-line program (`cmark`) for parsing and rendering CommonMark
+documents.
+
+Advantages of this library:
+
+- **Portable.** The library and program are written in standard
+ C99 and have no external dependencies. They have been tested with
+ MSVC, gcc, tcc, and clang.
+
+- **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.
+
+- **Accurate.** The library passes all CommonMark conformance tests.
+
+- **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`.
+
+- **Robust.** The library has been extensively fuzz-tested using
+ [american fuzzy lop]. The test suite includes pathological cases
+ 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 programmatically prior to rendering.
+
+- **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.
+
+- **Free.** BSD2-licensed.
+
+It is easy to use `libcmark` in python, lua, ruby, and other dynamic
+languages: see the `wrappers/` subdirectory for some simple examples.
+
+There are also libraries that wrap `libcmark` for
+[Go](https://github.com/rhinoman/go-commonmark),
+[Haskell](https://hackage.haskell.org/package/cmark),
+[Ruby](https://github.com/gjtorikian/commonmarker),
+[Lua](https://github.com/jgm/cmark-lua),
+[Perl](https://metacpan.org/release/CommonMark),
+[Python](https://pypi.org/project/umarkdown/),
+[R](https://cran.r-project.org/package=commonmark),
+[Scala](https://github.com/sparsetech/cmark-scala) and
+[PHP](https://www.php.net/manual/en/book.cmark.php).
+
+Installing
+----------
+
+Building the C program (`cmark`) and shared library (`libcmark`)
+requires [cmake]. If you modify `scanners.re`, then you will also
+need [re2c] \(>= 0.14.2\), which is used to generate `scanners.c` from
+`scanners.re`. We have included a pre-generated `scanners.c` in
+the repository to reduce build dependencies.
+
+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
+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`.
+
+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:
+
+ cmake -S . -B build # optionally: -DCMAKE_INSTALL_PREFIX=path
+ cmake --build build # executable will be created as build/src/cmark
+ ctest --test-dir build
+ cmake --install build
+
+Or, to create Xcode project files on OSX:
+
+ cmake -S . -B build -G Xcode
+ open build/cmark.xcodeproj
+
+The GNU Makefile also provides a few other targets for developers.
+To run a benchmark:
+
+ make bench
+
+For more detailed benchmarks:
+
+ make newbench
+
+To run a test for memory leaks using `valgrind`:
+
+ make leakcheck
+
+To reformat source code using `clang-format`:
+
+ make format
+
+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
+
+Fuzzing with [libFuzzer] is also supported. The fuzzer can be run with:
+
+ make libFuzzer
+
+To make a release tarball and zip archive:
+
+ make archive
+
+Installing (Windows)
+--------------------
+
+To compile with MSVC and NMAKE:
+
+ nmake /f Makefile.nmake
+
+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`.
+
+Usage
+-----
+
+Instructions for the use of the command line program and library can
+be found in the man pages in the `man` subdirectory.
+
+Security
+--------
+
+By default, the library will scrub raw HTML and potentially
+dangerous links (`javascript:`, `vbscript:`, `data:`, `file:`).
+
+To allow these, use the option `CMARK_OPT_UNSAFE` (or
+`--unsafe`) with the command line program. If doing so, we
+recommend you use a HTML sanitizer specific to your needs to
+protect against [XSS
+attacks](http://en.wikipedia.org/wiki/Cross-site_scripting).
+
+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.
+Use the [github issue tracker](http://github.com/commonmark/CommonMark/issues)
+only for simple, clear, actionable issues.
+
+Authors
+-------
+
+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.
+
+[benchmarks]: benchmarks.md
+[the spec]: http://spec.commonmark.org
+[CommonMark]: http://commonmark.org
+[cmake]: http://www.cmake.org/download/
+[re2c]: http://re2c.org
+[commonmark.js]: https://github.com/commonmark/commonmark.js
+[american fuzzy lop]: http://lcamtuf.coredump.cx/afl/
+[libFuzzer]: http://llvm.org/docs/LibFuzzer.html