ADR-0107:画布编辑与两种显示模式
- 状态:接受
- 日期:2026-10-30
背景
模板设计需要在画布中直接输入富文本、选择对象及调整几何。以预览图片替换编辑 DOM 会丢失光标和输入法状态;浏览器排版不能保证与 Java 引擎分页一致。
决策
设计器引入 React/TypeScript 画布和 ProseMirror 富文本编辑器,逐步接入既有工作台。原有 XML、资源、诊断及导出入口共用同一工作区,不另建模板文件格式。依赖版本及完整性固定在前端锁文件,运行依赖原始 MIT 文本随应用分发。
提供便捷编辑和精确排版。便捷编辑即时呈现模板文字及变量标记,活动输入期间保留浏览器编辑状态,不逐键请求 Java;完成编辑后校验并更新布局。此模式的文字显示是近似效果。精确排版使用 Java 引擎绑定测试数据、换行、分页及生成预览,输入经防抖刷新。切换模式不改变 XML、资源或撤销记录。输入 DOM 与预览图片独立,刷新图片不重建正在使用的编辑器。
画布使用单击选择、双击或 Enter/F2 编辑;选中后可直接拖动拖柄,也可在正文中长按拖动,无须切换选择/文字工具。短按与待触发拖动分离,提前松开、移动超过阈值或取消时不写入修改。
自动占位/固定位置属于组件的持久排版属性,拖动只遵循属性,不能隐式转换。默认自动占位组件按正文顺序分配空间,拖动显示插入线并排序;同级多选保留源码顺序作为整体移动。Alt+↑/↓ 及可见的上移/下移按钮提供等价入口。动态表格、列表及循环/条件按整个语义模板操作,不将展开数据拍平。只有显式设为固定位置的组件自由移动、显示边缘缩放控件并响应坐标方向键;新粘贴图片默认进入正文流。
结构化编辑保留模板变量、图片、字段和行内 XML;多种文字格式序列化为单个合法 span,而非模板不接受的嵌套 span。按原始 XML 路径及稳定 ID 回写,重复输入不会重复插入新段落。表格单元格由实际 IR 几何映射到模板锚点,合并及动态行使用其源模板。
自由定位复用 foreground/background 的语义 box。增加可选的文档物理页选择、剩余宽高填充及内容自动高度;原构造入口仍表示每页重复的固定框。固定框通过 body-flow 声明遮盖或上下避让,缺省 OVERLAP 保持正文原布局;AVOID 在 Java 布局阶段排除对象占据的纵向区间,保留上方正文,碰撞内容移至下方并正常续页。避让覆盖正文全宽,不提供左右环绕,也不依赖浏览器占位。恢复自动占位时按当前页面和纵向位置放回邻近正文组件。
指定目标页超出当前正文页数时,在声明节内补足空正文页,并执行原页数预算;目标与声明节或选定变体不匹配时拒绝。生成目录与显式物理页选择或上下避让的组合先拒绝,避免目录插页后悄悄改变目标及分页。
结果与边界
浏览器负责交互草稿,Java 保持最终排版和导出职责。几何使用 pt,尺寸/坐标/页数继续有界校验,超高内容失败而非截断。旋转沿用既有框内拟合变换,不改变正文分页。
首批自由定位支持顶层段落、图片段落和表格;标题、列表及循环/条件容器继续按语义流排版,不能通过转换成普通文字丢失语义。复杂表格、页区及模板结构保留属性和 XML 编辑入口。DOCX 等无法映射页面图层的目标继续执行既有损失策略。本决定不承诺通用 Word 编辑、浏览器与引擎完全等价或任意文件无损修改。
本决定替代 ADR-0106 中“不引入前端构建工具”和“仅语义流”的范围;独立应用、显式资源、本地服务及核心依赖方向保持原契约。操作与验证入口见设计器指南。