样式与组件定制
库输出稳定的 wtr-* 类名与一组 CSS 变量。页面结构、文案、标题锚点和组件外观都可以在不改源码的情况下调整。
样式
引入一次页面样式:
- 库不设置全局元素样式,页面字体默认继承自宿主。
- 根容器是
div.wtr-view;自有类名以wtr-前缀开头,同时保留一部分 MediaWiki 兼容类名。 - 内联样式只保留白名单内的排版与外观声明,危险值整条丢弃;严格 CSP 下可按需放行
style-src。
CSS 变量
变量定义在 :root,可以在任意祖先覆盖:
深色主题可以通过 [data-wtr-theme="dark"] 或宿主自己的选择器覆盖同一组变量。
容器属性
className 与 containerProps.className 会和 wtr-view 合并。containerProps 在类型层排除了 dangerouslySetInnerHTML。
文案
所有用户可见的占位与提示都来自 labels。准备选项接受 Partial<WikitextLabels>,未提供的字段沿用默认英文文案。
实际生效的文案会写入 WikitextRenderDocument.meta.labels,视图与组件读取同一份文案。
标题锚点
- 锚点由移除标记后的标题文本生成:空白转为
_,重复 id 按大小写不敏感追加_2、_3,空标题使用section-{n}。 - 语义标题与源码
h1–h6都参与锚点生成。 idPrefix只在instance下生效;未传时使用 ReactuseId生成的实例前缀。- 视图同时映射标题
id、文档内#fragment链接和表格headers属性。
标题列表直接读取渲染快照:
组件覆盖
覆盖点按优先级从高到低排列:
semanticComponents[type]:替换整个 wiki 语义结构。components[tag]:替换默认 HAST 结构内部的 HTML 标签。- 原生元素。
HTML 组件
components 按 HAST 标签名映射,键可以是 p、table、img、a 等。组件会收到经过安全校验的属性、node(HAST 元素)、document、可选的 semantic 节点与 origin。不要把非 DOM 属性直接展开到原生元素上。
语义组件
可覆盖的语义类型:
semanticComponents.extension会收到除ref外的扩展节点;ref使用reference,<references>不产生组件调用。semanticComponents.reference只替换<sup>,文末引用区仍由库生成。WikitextFragment必须在WikitextView的 Context 内使用,nodes必须是当前渲染文档中的同一批节点对象。它适合渲染默认转换函数不会输出的子内容,例如模板参数、文件说明和ref内容。
components 与 semanticComponents 属于可信代码;组件输出的 HTML 不再经过库清洗。解析函数返回的 URL 已在准备阶段校验,但组件仍应避免把未经验证的输入插入危险属性。
读取上下文
useWikitextContext()提供document、索引、组件表、idPrefix、mapId、mapHref与onRenderError。useWikitextLabels()读取当前渲染快照的文案。useWikitextIds()提供toDomId与toHref。
这些 Hook 与 WikitextFragment 必须在 <WikitextView> 内使用。
插件
wikitextPlugins在克隆的语义树上运行;rehypePlugins在 HAST 转换后、最终清洗前运行。- 插件签名沿用 unified 的
(tree, file),其中file是 VFile。 - 原始解析快照不会被修改;准备后会对工作树重新分配 id。
- 同步入口不接受异步插件,异步插件需要
prepareWikitextAsync。 - 最终安全清洗始终在 rehype 插件之后执行,插件不能绕过白名单与图片授权。
插件列表是结构化数组,元素可以是插件函数或 [plugin, options] 元组,按顺序执行。
安全策略
prepareOptions.policy 可以调整 URL 与标签白名单。默认值:
policy 与默认值单层浅合并;数组字段整体替换。class 只按 [A-Za-z0-9_-] 安全字符集过滤,不提供放宽或收窄选项。需要白名单之外的标签、属性或富展示时,优先通过 /view 的组件覆盖实现,不要放宽清洗规则。
自定义语义节点
自定义节点需要同时扩展 WikitextNodeMap 并在 prepareOptions.handlers 注册对应的 HAST 转换函数。未注册转换函数的节点会产生诊断并降级为源码卡片。转换函数的上下文、预算与转换细节见准备 API。