cmark
是 CommonMark 的 C 语言参考实现,CommonMark 是 Markdown 语法的合理化版本,并附带 规范。(对于 JavaScript 参考实现,请参阅 commonmark.js。)
它提供了一个共享库 (libcmark
),其中包含将 CommonMark 文档解析为抽象语法树 (AST)、操作 AST 以及将文档渲染为 HTML、groff man、LaTeX、CommonMark 或 AST 的 XML 表示形式的函数。它还提供了一个命令行程序 (cmark
),用于解析和渲染 CommonMark 文档。
此库的优点
可移植性。 该库和程序使用标准 C99 编写,没有外部依赖项。 它们已经过 MSVC、gcc、tcc 和 clang 的测试。
速度快。 cmark 可以在眨眼间渲染 Markdown 版本的战争与和平(在十年前的笔记本电脑上为 127 毫秒,而眨眼一次需要 100-400 毫秒)。 在我们的 基准测试中,cmark 比最初的 Markdown.pl
快 10,000 倍,并且与速度最快的可用 Markdown 处理器相当。
准确。 该库通过了所有 CommonMark 一致性测试。
标准化。 可以预期该库以与其他任何符合规范的解析器相同的方式解析 CommonMark。 因此,例如,您可以使用客户端上的 commonmark.js
预览将使用服务器上的 cmark
渲染的内容。
健壮。 该库已经使用 american fuzzy lop 进行了广泛的模糊测试。 该测试套件包括使许多其他 Markdown 解析器陷入瘫痪的病态情况(例如,数千层深的嵌套括号文本或块引用)。
灵活。 CommonMark 输入被解析为 AST,可以在渲染之前以编程方式对其进行操作。
多种渲染器。 支持 HTML、groff man、LaTeX、CommonMark 和自定义 XML 格式的输出。 并且很容易编写新的渲染器来支持其他格式。
免费。 BSD2 许可。
在 python、lua、ruby 和其他动态语言中使用 libcmark
非常容易:有关一些简单的示例,请参见 wrappers/
子目录。
还有一些库为 Go、Haskell、Ruby、Lua、Perl、Python、R 和 Scala 封装了 libcmark
。
构建 C 程序 (cmark
) 和共享库 (libcmark
) 需要 cmake。 如果修改了 scanners.re
,那么您还需要 re2c (>= 0.14.2),它用于从 scanners.re
生成 scanners.c
。 我们在存储库中包含了一个预生成的 scanners.c
,以减少构建依赖项。
如果您有 GNU make,您可以简单地 make
、make test
和 make install
。 这会调用 cmake 以在 build
目录中创建一个 Makefile
,然后使用该 Makefile
创建可执行文件和库。 这些二进制文件可以在 build/src
中找到。 默认安装前缀是 /usr/local
。 要更改安装前缀,如果在首次运行 make
时传递 INSTALL_PREFIX
变量:make INSTALL_PREFIX=path
。
对于更便携的方法,您可以手动使用 cmake。 cmake 知道如何为许多构建系统创建构建环境。 例如,在 FreeBSD 上
mkdir build
cd build
cmake .. # optionally: -DCMAKE_INSTALL_PREFIX=path
make # executable will be created as build/src/cmark
make test
make install
或者,要在 OSX 上创建 Xcode 项目文件
mkdir build
cd build
cmake -G Xcode ..
open cmark.xcodeproj
GNU Makefile 还为开发人员提供了一些其他目标。 运行基准测试
make bench
对于更详细的基准测试
make newbench
使用 valgrind
运行内存泄漏测试
make leakcheck
使用 clang-format
重新格式化源代码
make format
针对十个长随机生成的输入运行“模糊测试”
make fuzztest
使用 american fuzzy lop 进行更系统的模糊测试
AFL_PATH=/path/to/afl_directory make afl
也支持使用 libFuzzer 进行模糊测试,但是由于 libFuzzer 仍在积极开发中,因此可能无法与您系统安装的 clang 版本一起使用。 假设 LLVM 已在 $HOME/src/llvm/build
中构建,则可以使用以下命令运行模糊器
CC="$HOME/src/llvm/build/bin/clang" LIB_FUZZER_PATH="$HOME/src/llvm/lib/Fuzzer/libFuzzer.a" make libFuzzer
制作发布 tarball 和 zip 存档
make archive
要使用 MSVC 和 NMAKE 进行编译
nmake
如果您有 mingw32
编译器,则可以在 linux 上交叉编译 Windows 二进制文件和 dll
make mingw
这些二进制文件将在 build-mingw/windows/bin
中。
有关命令行程序和库的使用的说明,请参见 man
子目录中的 man 页面。
默认情况下,该库将清除原始 HTML 和潜在的危险链接(javascript:
、vbscript:
、data:
、file:
)。
要允许这些,请将选项 CMARK_OPT_UNSAFE
(或命令行程序的 --unsafe
)一起使用。 如果这样做,我们建议您使用特定于您需求的 HTML 清理器,以防止 XSS 攻击。
有一个 论坛用于讨论 CommonMark; 对于问题以及可能开放式的讨论,您应该使用它而不是 github 问题。 仅将 github issue tracker 用于简单、清晰、可操作的问题。
John MacFarlane 编写了原始库和程序。 块解析算法是与 David Greenspan 一起开发的。 Vicent Marti 优化了 C 实现的性能,使其速度提高了十倍。 Kārlis Gaņģis 帮助设计了一种更好的链接和强调解析算法,从而消除了几个最坏情况下的性能问题。 Nick Wellnhofer 贡献了许多改进,包括 C 库 API 的大部分内容及其测试工具。