cmark-gfm
是 CommonMark C 参考实现的扩展版本。 CommonMark 是一种规范化的 Markdown 语法,具有规范。 此存储库将 GitHub Flavored Markdown 扩展添加到 上游实现,如 规范中所定义。
cmark
上游的更改将会被拉取到 cmark-gfm
项目存储库中,随着上游项目的演变而更新。原始的 cmark
存储库可以在这里找到:https://github.com/commonmark/cmark。
README 的其余部分与上游来源保持不变。 请注意,此 fork 生成的库和二进制文件都带有 -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
中构建,则可以使用以下命令运行模糊器
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 及其测试工具。