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/
子目录中的一些简单示例。
还有一些库封装了 libcmark
,用于 Go、Haskell、Ruby、Lua、Perl、Python、R、Tcl、Scala 和 Node.js。
构建 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 issues。仅将 github issue 跟踪器 用于简单、清晰、可操作的问题。
John MacFarlane 编写了原始的库和程序。块解析算法是与 David Greenspan 一起制定的。Vicent Marti 优化了 C 实现以提高性能,将其速度提高了十倍。Kārlis Gaņģis 帮助制定了更好的链接和强调解析算法,消除了几个最坏情况下的性能问题。Nick Wellnhofer 贡献了许多改进,包括 C 库的大部分 API 及其测试工具。