cmark-gfm
是 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 tracker 用于简单、清晰、可操作的问题。
John MacFarlane 编写了原始库和程序。 块解析算法是与 David Greenspan 共同完成的。 Vicent Marti 优化了 C 实现以提高性能,使其速度提高了十倍。 Kārlis Gaņģis 帮助设计了一种更好的链接和强调解析算法,消除了几个最坏情况下的性能问题。 Nick Wellnhofer 贡献了许多改进,包括 C 库的大部分 API 及其测试工具。