言章:Markdown
言章 1.0.1 的安全 Markdown 节点、HTML 渲染、目录、预算和可信扩展边界。
言章(yanxu-markdown)是言序的安全 Markdown 解析、结构化节点、目录和 HTML 渲染库。当前稳定版为 1.0.1:普通文字、代码、链接属性与标题锚点都通过言页的安全构造边界输出,原始 HTML 不会直接透传。
版本与安装
| 项目 | 稳定值 |
|---|---|
| 包名 | 言章 |
| 版本 / 公开标签 | 1.0.1 / v1.0.1 |
| 最低言序 | 1.1.12 |
| 稳定依赖 | 言页 1.0.0,标签 v1.0.0,范围 ^1.0 |
| 构建目标 | 字节码 |
yanbao add 言章 \
--git https://github.com/yanxulang/yanxu-markdown.git \
--rev v1.0.1 \
--version '^1.0'[依赖]
言章 = { git = "https://github.com/yanxulang/yanxu-markdown.git", 修订 = "v1.0.1", 版 = "^1.0" }v1.0.1 是修复锁文件内容校验漂移后的正式补丁标签;不要继续固定旧的 v1.0.0。应提交生成的 言序.lock,让言章、言页及其修订与内容校验一同锁定。
核心能力:解析、渲染与目录
引「包:言章」为 言章;
定 源码:文 为 「# 言章 <安全>\n\n欢迎使用 **言序** 和 [文档](https://yanxu.dev)。」;
定 各节点:列<典> 为 言章.解析(源码);
定 HTML:文 为 言章.渲染节点(各节点);
定 各目录:列<典> 为 言章.目录(源码);
言 HTML;
言 各目录;HTML 中的 <安全>会被转义,受支持的 Markdown 标记正常渲染。只需要 HTML 时可直接调用 渲染HTML;需要检查或改写块结构时先调用 解析,再用 渲染节点。
重复标题会在单份文档内生成确定且唯一的 Unicode 锚点:
定 各项 为 言章.目录(「# 入门\n\n## 入门\n\n## 入门」);三个锚点依次为 入门、入门-2和入门-3。跨文档全局唯一仍需要调用方增加命名空间。
支持的语法与入口
支持范围包括:
- 一至六级标题、段落和分隔线;
- 平坦的有序/无序列表与引用;
- 严格闭合的三个反引号围栏代码和行内代码;
- 粗体、强调、删除线、链接和图片;
- 唯一标题锚点与目录。
| 场景 | 入口 |
|---|---|
| 直接得到安全 HTML | 渲染HTML |
| 为不可信输入收紧预算 | 渲染受限 |
| 检查或改写块节点 | 解析、解析受限 |
| 渲染调用方节点 | 渲染节点、渲染节点受限 |
| 只处理内联标记 | 渲染内联、渲染内联受限 |
| 生成目录 | 目录、目录受限 |
| 逐片写出 HTML | 流式渲染、流式渲染节点 |
| 不使用异常控制流 | 尝试解析、尝试渲染 |
手工节点不是受信输入。渲染器会拒绝未知节点类型、缺失字段、错误字段类型、越界标题层级和非文字列表项目。
对不可信输入设置预算
定 限制:典 为 {
「最大输入字符」:65536,
「最大行数」:4096,
「最大块节点」:2048,
「最大列表项目」:512,
「最大内联深度」:16,
「最大输出字符」:262144,
「最大片段」:8192
};
定 HTML:文 为 言章.渲染受限(源码,限制);面向外部内容应使用受限入口,而不是把库的较大硬上限当作业务配额。输出预算按 Unicode 字符计数,网络响应或文件写出还需在应用层限制 UTF-8 字节与总耗时。
流式输出
法 写响应片段(片段:文):空 则
# 交给调用方拥有的有界写入器
归 空;
终
定 统计:典 为 言章.流式渲染(源码,写响应片段,限制);
言 统计【「块节点数」】;
言 统计【「字符数」】;
言 统计【「片段数」】;流式 API 先完成 Markdown 块解析,再逐块输出 HTML;它减少完整 HTML 的额外收集,但不会消除完整节点列。回调是同步的,背压、取消、超时和外部写入错误由调用方处理。若后续片段失败,已经写出的片段不会自动撤回;需要原子正文时使用 渲染受限。
链接与可信扩展
普通链接允许 HTTP、HTTPS、邮件、电话、相对地址和片段,并拒绝控制字符、脚本和数据协议。图片地址比普通链接更严格,还拒绝邮件、电话和片段地址。协议检查不验证主机信誉、重定向、同源或业务授权。
扩展块是显式信任升级:
法 写可信片段(写入法:法):空 则
写入法(「<mark>已审计常量</mark>」);
归 空;
终
定 节点 为 言章.扩展块(写可信片段);扩展输出仍受总输出预算约束,但不会被清洗或转义。生成器及其输入必须全部可信,不能把用户文字直接插入扩展片段。
错误、权限与安全边界
定 结果:典 为 言章.尝试渲染(源码);
若 非 结果【「成功」】 则
言 结果【「错误」】【「代码」】;
终公开失败使用稳定 YANZHANG_*代码;捕获抛出型入口后也可调用 错误详情。完整详情包含位置和踪迹,返回不可信客户端前应过滤。
言章清单不申请文件、网络、监听、环境、进程或原生扩展权限。它依赖的言页也固定在公开稳定标签;依赖图中的权限不会被页面代码动态扩大。
已知限制
- 不是完整 CommonMark 或 GFM 实现,不支持嵌套列表、表格、脚注、任务列表和引用式链接。
- 不解析、清洗或透传原始 HTML;未知 HTML 写法按普通文字转义。
- 围栏代码只支持三个反引号,结束行修整后必须严格等于三个反引号。
- URL 策略只判断字符与协议,不检查实际目标、重定向、同源或访问权限。
- 流式接口不是增量 Markdown 解析器,也不提供异步背压、取消或事务式回滚。
扩展块不会自动净化输入,只能用于已审计生成器和可信数据。