跳到正文

ADR-0104:显式、有界的离线 HTML/CSS 布局 ​

状态 ​

已接受。支持子集与边界见 HTML 导入指南,文件验收见阶段一百零四。

背景 ​

默认 HTML 导入将段落、标题、列表、表格和行内内容映射为可编辑语义模型。Flex/Grid/定位是布局约束,强行变成语义表格会改变来源、编辑及跨格式损失;保留 CSS 字符串也不能证明几何被实现。扩展需要继续使用显式字体、有界资源和共同分页引擎,并保持默认导入契约。

决定 ​

  1. 默认模式保留语义流。调用方显式选择 .layoutMode(true),将有限盒约束编译成不可变 ComponentBlock 树;适配器单向依赖组件及通用绘制核心,不引入浏览器运行时或后端依赖。
  2. 媒体环境和查询 viewport 由调用方明确给出。输出 @page 规则不改变查询 viewport;选择器、级联和媒体先有界解析,再产生真实模型格式或组件几何。所有源树先执行安全校验,隐藏和未命中条件不能绕过拒绝。
  3. 盒、Flex、Grid、定位只实现文档子集。Flex 要求明确 basis/主轴尺寸,列 Flex 要求明确高度;Grid 使用有限轨道、正行号与 span。每棵树、测量、轨道和占位工作都有预算,不做内在浏览器排版或无限探测。
  4. 叶子通过现有语义放置复用原文、显式物理字体、图片、待解析字段和链接。段落/标题使用内部无边框单格语义桥,表格直接使用已有语义表格组件。TableFormat.drawBorders 默认 true,旧构造器保持行为;只有显式 false 才去边框。
  5. 视觉位置和 order 不改逻辑来源顺序。全局 ID 同时预留宿主与内部语义后代,叶源 ID 不被宿主复用;链接在最终组件变换与页偏移确定后解析。内部桥不变成公共导入表格或通用可编辑 CSS DOM。
  6. 编译盒采用原子分页;外层显式 break 进入真实分页,盒内 break 通过专用 DEGRADE 实际移除。放不进完整新页或父盒就失败,不裁切、缩字或生成无限空页。
  7. 不支持声明按功能报告 ERROR/WARN/IGNORE,后两者必须执行明确 DEGRADE/DISCARD,并保留实际损失。内在 Flex 可降级为块流;未支持的运行时叶只能按声明移除。目标格式无法表达运行时组件时默认拒绝,显式移除整棵子树,不伪装成语义保留。

影响 ​

默认 HTML 的可编辑性和严谨损失边界保持。需要 CSS 几何的调用方获得真实布局组件与后端输出,也承担原子盒、有限语法及运行时组件编辑/转换的明确边界。独立验证使用源 HTML 的 Chromium 几何、最终 PDF 的 Poppler/PDFium 与 SVG 的 resvg,分别核对可见盒、文本、分页、链接和实际损失;浏览器只参与验证,不进入导入库。