扩展库 / md4c

md4c

把 CommonMark 或 GitHub 风格 Markdown 渲染成 HTML,也可直接读取 UTF-8 路径下的 Markdown 文件。

版本 0.1.0 · C / xlang · 无扩展库依赖

快速开始

import md4c

string page = md4c.html("# Title\n\nHello **xlang**.")
print(page)

string plain = md4c.html_flags("Hello <b>world</b>",
    md4c.github_flags() + md4c.no_html_flag(), 0)
print(plain)

html 默认使用 CommonMark;html_flags 接收解析标志和渲染标志。file_html(path, parserFlags, rendererFlags) 读取指定文件。负数及未知标志位在读取前拒绝,不会静默忽略。Markdown 输入必须为合法 UTF-8,最多 64 MiB;非法内容拒绝解析,超限文件在读取前拒绝。C 内存入口要求有效的 NUL 结尾字符串,超限判断使用有界扫描。

接口

入口用途
html(markdown)按 CommonMark 渲染内存中的 Markdown。
html_flags(markdown, parserFlags, rendererFlags)选择解析方言和 HTML 输出选项。
file_html(path, parserFlags, rendererFlags)读取文件并渲染,路径支持 UTF-8。
commonmark_flags / github_flags / no_html_flag常用解析标志;no_html_flag 禁用原生 HTML。
xhtml_flag / skip_utf8_bom_flag / verbatim_entities_flagHTML 渲染选项。
available / version / last_error可用性、内核版本及最近一次原生错误。

原生 HTML 默认允许。no_html_flag 不是 HTML 净化器;处理不可信 Markdown 时仍须审查链接和图片 URL,并使用应用级安全策略。

渲染选项可组合:xhtml_flag() 输出 <br /> / <img ... />;skip_utf8_bom_flag() 跳过开头 BOM;verbatim_entities_flag() 保留 &copy; 等实体拼写,默认则解码。输入64 MiB限制不等于输出或计算预算,服务端仍需应用级资源约束。

C 混编

#include "xrt.h"
#include "extlibs/md4c/md4c_native.h"

char *html = xmd4c_html("# Hello");
if (html != NULL) {
    /* 使用 html */
    xrtFree(html);
}

C 渲染结果归调用方所有,失败返回 NULL,可通过线程内 xmd4c_last_error() 取错误。XLang 通过 @owned string 直接接管 XRT 缓冲,无需复制正文;接管时仍需扫描一次取得长度。XLang 文本和路径包含内嵌 NUL 时抛出 ValueError;文件内容中的 NUL 以及内存或文件内容中的非法 UTF-8 都会被拒绝,而非截断或生成非法 HTML。

解析器或输出分配失败统一为 XERR_MEMORY / MemoryError,不交回部分HTML;文件读取保留原始XRT错误,恢复后可立即重试。随包内核基于0.5.2并含明确记录的本地修订,来源与变更见包内 third_party/UPSTREAM.md。

验证与边界

xl run release/extlibs/md4c/examples/md4c_c.c
xl run release/extlibs/md4c/examples/article.xl
xl run release/extlibs/md4c/examples/article_c.c
powershell -NoProfile -ExecutionPolicy Bypass -File release/extlibs/md4c/test/check.ps1
bash release/extlibs/md4c/test/check.sh

2026-10-29 Windows默认48阶段与Linux完整包级门禁通过:严格C、ASan/UBSan、十二个实际生成原型、两平台各十一条独立程序与共同黄金HTML。解析器CRT逐点测试210预算、184次实际失败注入归零,覆盖连续扩容、属性、引用和围栏;另有XRT输出分配及语言异常恢复。三个HTML返回仍为直接 @owned string,没有在正式路径增加分配测试包装。这些是包级证据,不代表整个xlang发布完成。