cmark-gfm
是 CommonMark 的 C 语言参考实现的扩展版本。CommonMark 是 Markdown 语法的一个理性化版本,并附带规范。本仓库在 上游实现 的基础上,添加了 GitHub Flavored Markdown 扩展,具体定义见 规范。
随着上游项目的演进,cmark
中的更改将被拉取到本 cmark-gfm
项目仓库中。原始的 cmark
仓库可以在这里找到:https://github.com/commonmark/cmark。
README 的其余部分与上游源代码保持一致。请注意,此分支生成的库和二进制文件都带有 -gfm
后缀,以便将它们与上游版本区分开。
原始的 cmark
代码是在 BSD2 许可证下发布的。此许可证同样适用于本 cmark-gfm
仓库中包含的 Swift 代码。
它提供了一个共享库 (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、Tcl、Scala 和 Node.js 封装了 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
中构建,则可以使用以下命令运行 fuzzer
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
子目录中的手册页。
默认情况下,该库将清除原始 HTML 和潜在危险的链接(javascript:
、vbscript:
、data:
、file:
)。
要允许这些,请将选项 CMARK_OPT_UNSAFE
(或 --unsafe
)与命令行程序一起使用。如果这样做,我们建议您使用特定于您需求的 HTML 清理器来防止 XSS 攻击。
有一个 论坛用于讨论 CommonMark;对于问题和可能开放式的讨论,您应该使用它而不是 github issues。仅将 github issue 跟踪器 用于简单、清晰、可操作的问题。
John MacFarlane 编写了原始的库和程序。块解析算法是与 David Greenspan 一起研究出来的。Vicent Marti 优化了 C 实现的性能,使其速度提高了十倍。Kārlis Gaņģis 帮助设计了更好的链接和强调解析算法,消除了几个最坏情况下的性能问题。Nick Wellnhofer 贡献了许多改进,包括 C 库的大部分 API 及其测试工具。