通过 C++23 模块使用 MD4C:一个快速的 CommonMark / GFM Markdown C 解析器。
English · 简体中文 · Upstream · Releases · mcpp · Index
上游 C API 保持不变:md_parse、MD_PARSER、MD_BLOCK_*、md_html 都是上游的全局名字。
解析器来自 compat.md4c 0.5.3;本包加上上游的第二个库 md4c-html(HTML 渲染器),并把
MD_FLAG_* 宏映射成常量。每次 CI 都通过模块运行上游自己的测试集(CommonMark 0.31.2 规范、
GFM 扩展、回归用例,共 808 个例子)。
import mcpplibs.mwrap.md4c;:解析 API(md_parse、回调、各种 detail),并重新导出下面两个模块import mcpplibs.mwrap.md4c.html;:md_html,Markdown 直接转 HTMLimport mcpplibs.mwrap.md4c.macros;:MD_FLAG_*、MD_DIALECT_*、MD_HTML_FLAG_*,位于mcpplibs::mwrap::md4c::macros
更多模块 API -> 用法与 API
mcpp new notes --template mcpplibs.mwrap.md4c@0.5.3
cd notes
mcpp run默认模板用 GitHub 扩展把一篇文档渲染成 HTML,并通过 md_parse 的回调打印标题大纲。
[dependencies]
"mcpplibs.mwrap.md4c" = "0.5.3"import std;
import mcpplibs.mwrap.md4c;
namespace macros = mcpplibs::mwrap::md4c::macros;
int main() {
std::string_view md = "# Hello\n\n- [x] *modules*\n";
std::string html;
md_html(md.data(), static_cast<MD_SIZE>(md.size()),
[](const MD_CHAR* s, MD_SIZE n, void* out) { static_cast<std::string*>(out)->append(s, n); },
&html, macros::MD_DIALECT_GITHUB, 0);
std::print("{}", html);
}具名模块不能导出宏;对象式的宏以原名映射为 inline constexpr unsigned:
macros::MD_FLAG_TABLES、macros::MD_DIALECT_GITHUB、macros::MD_HTML_FLAG_XHTML。
同一个翻译单元如果还包含了 <md4c.h>,宏是生效的,连 macros::MD_FLAG_TABLES 里的名字也会被展开;
这时直接用宏本身(见 tests/header_mix_test.cpp)。
- examples/md2html:支持上游
md2html的选项,读标准输入或文件; tools/run_conformance.py 用它驱动上游的test/run-testsuite.py。
Linux、macOS、Windows 的 CI 构建模块、运行测试、导出审计(tools/check_exports.py: 两个头文件的每个公开名字都已导出)和上游一致性测试集;另一个作业把默认模板当作已安装的包来创建并运行。
封装部分为 Apache-2.0,归属 mcpp-community;MD4C 本身仍是 MIT。 上游原始 README 和许可证、vendored 的 md4c-html 源码及其校验和见 upstream/documents.json。