ITADN
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

cmark

CI
tests

cmarkCommonMark 的 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 可以在眨眼之间渲染 War and Peace 的 Markdown 版本 (在一台十年前的笔记本电脑上耗时 127 毫秒, 而眨眼需要 100-400 毫秒)。 在我们的 benchmarks 中, 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, ScalaPHP

安装

构建 C 程序(cmark)和共享库(libcmark) 需要 cmake。 如果你修改了 scanners.re,那么你还需要 re2c (>= 0.14.2),它用于从 scanners.re 生成 scanners.c。 我们在 仓库中包含了一个预生成的 scanners.c 以减少构建依赖。

如果你有 GNU make,你可以简单地 makemake testmake install. This calls cmake to create a Makefile in the build 目录,然后使用该 Makefile 创建可执行文件和 库。 二进制文件可以在 build/src 中找到。 默认 安装前缀是 /usr/local。 要更改安装 前缀,如果你在第一次运行 make 时传递 INSTALL_PREFIX 变量:make INSTALL_PREFIX=path

对于更具可移植性的方法,您可以手动使用 cmakecmake 知道如何为许多构建系统创建构建环境。例如,在 FreeBSD 上:

cmake -S . -B build  # 可选:-DCMAKE_INSTALL_PREFIX=path
cmake --build build  # 可执行文件将创建为 build/src/cmark
ctest --test-dir build
cmake --install build

或者,要在 OSX 上创建 Xcode 项目文件:

cmake -S . -B build -G Xcode
open build/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 进行模糊测试。可以使用以下命令运行模糊测试器:

make libFuzzer

要创建发布 tarball 和 zip 归档:

make archive

安装(Windows)

要使用 MSVC 和 NMAKE 进行编译:

nmake /f Makefile.nmake

如果您拥有 mingw32 编译器,可以在 linux 上交叉编译 Windows 二进制文件和 dll:

make mingw

二进制文件将位于 build-mingw/windows/bin

用法

命令行程序和库的使用说明可以在 man 子目录中的手册页中找到。

安全性

默认情况下,该库会清理原始 HTML 以及潜在的 危险链接(javascript:, vbscript:, data:, file:)。

若要允许这些内容,请在命令行程序中使用选项 CMARK_OPT_UNSAFE(或 --unsafe)。如果这样做,我们建议您使用针对您特定需求的 HTML 清理器, 以防范 XSS 攻击

贡献

有一个用于讨论 CommonMark](http://talk.commonmark.org) 的论坛;对于问题以及可能开放式的讨论, 您应该使用它而不是 github issues。 仅将 github issue tracker 用于简单、明确、可操作的问题。

作者

John MacFarlane 编写了原始库和程序。 块解析算法是与 David Greenspan 共同制定的。Vicent Marti 优化了 C 实现以 提升性能,使其速度提高了十倍。 Kārlis Gaņģis 帮助 制定了更好的链接和强调解析算法, 消除了几个最坏情况下的性能问题。 Nick Wellnhofer 贡献了许多改进,包括 C 库的大部分 API 及其测试框架。