准备 /hast
/hast 不加载解析器与 React。它把解析快照转换为已清洗的渲染快照。
基本用法
准备阶段依次执行以下步骤:
- 克隆语义树,运行
wikitextPlugins。 - 校验工作树的结构、节点数与深度,重新分配路径式 id,并清除该 root 的查询缓存。
- 调用
resolveLink、resolveImage与handlers,把语义树转换为 HAST。 - 运行
rehypePlugins。 - 执行最终清洗与整理,写入目录、引用区、分类底栏与图片授权,生成
WikitextRenderDocument。
原始解析快照不会被修改。
选项
插件列表是结构化数组,元素可以是插件函数或 [plugin, options] 元组,按顺序执行。插件签名沿用 unified 的 (tree, file),file 是 VFile。
- 同步接口遇到异步插件抛
WikitextPrepareError,错误码ASYNC_PLUGIN_IN_SYNC_PATH。 - 异步接口支持异步插件;React 渲染前应完成准备。
- 准备后的工作树仍受固定预算约束:50,000 节点、深度 1,000。该值不能通过解析选项修改。
- 插件处理后的节点会重新编号;此前持有的
flattenNodes结果或 id 索引不会自动更新。 handlers返回undefined表示回退到内建规则,返回null表示显式丢弃节点。
解析函数
本节把 resolveLink 与 resolveImage 回调统称为解析函数。
链接
图片
null保持占位;返回对象才授权资源。src只允许http:/https:;相对图片默认关闭。- 尺寸限制在 1–4096,最终
<img>固定带loading="lazy"。 context.document是原始解析快照,context.ast与context.node是本次工作树。
解析函数只返回普通数据,不返回 React 元素。需要自定义外观时使用视图的 semanticComponents。
安全策略
默认值:
- 与默认值做单层浅合并。
- 数组字段整体替换;需要保留默认数组时以
DEFAULT_PREPARE_POLICY为基准展开。 class统一按[A-Za-z0-9_-]安全字符集过滤;不存在放宽或收窄 class 的 policy 选项。DEFAULT_PREPARE_POLICY已冻结。- 非法字段(policy 字段类型、labels 字段类型、
headingIdStrategy枚举、handlers形状)在开始处理前抛WikitextPrepareError("PREPARE_FAILED")。 - 最终 HAST 与恢复快照共用同一组固定预算(50,000 节点、深度 1,000);超限时准备阶段直接失败,库产生的合法快照总能被恢复。
文案与标题
labels由准备阶段与默认值浅合并,最终写入meta.labels。- 默认文案与字段见定制指南。
headingIdStrategy决定逻辑锚点与 DOM id 的映射;headings保存nodeId、level、text与可选id。- 锚点由移除标记后的标题文本生成;语义标题与源码
h1–h6都参与。
渲染快照
meta 包含实际生效的策略、文案、标题策略与解析函数授权的图片地址。目录、引用区与分类底栏已经包含在 hast 中,不新增快照字段。
handlers
handlers 把自定义语义节点转换为 HAST。未注册转换函数的节点会产生诊断并降级为源码卡片。
context 提供原始文档、工作树、文案、策略、解析函数、转换函数、只读的 authorizedImages 与 diagnostics,以及 reportDiagnostic、convert、convertChildren。handlers 优先于内建转换,注册内建类型(例如 heading)会覆盖默认实现。转换结果仍会经过 rehype 插件与最终清洗;链接与图片的最终属性、图片授权和目录由整理阶段统一决定。
URL 与属性工具
sanitizeHref允许http:、https:、mailto:;sanitizeImageUrl只允许http:、https:。allowRelative默认关闭。sanitizedAttributesToProps传入tag时按标签白名单过滤;省略时返回表格相关属性的并集。- 源码 HTML 的
data-node-id、data-node-type、data-wikitext等库保留属性会被移除。
序列化
恢复函数校验 AST 与渲染快照的结构版本、根节点、HAST 结构与固定节点预算,并重新执行最终清洗与整理。仍不能把任意第三方 HAST 直接交给视图。
诊断
准备阶段的诊断会合并到渲染快照,stage 可能是:
wikitext:语义树插件或转换。hast:HAST 转换。rehype:rehype 插件。sanitize:清洗。finalize:最终整理。
diagnostics 与 meta 一起可用于调试或上报;单条诊断不会中断整页渲染。