DSH 原生 Markdown / LaTeX 输入增强
源码候选状态(2026-10-25)
本轮只修改源码、检查脚本与回归测试。lib/ 运行产物、第三方声明和 profile 保持原状,在线插件没有更新。以下修复要经过另行发布才会在在线插件生效。
- 列表预览与续行共用解析结果,支持空格、Tab、缩进、引用容器以及
1./1)编号。空项退出保留容器前缀,单次撤销同时回退换行和继承标记。 - 隔离检查默认使用系统临时目录。显式输出目录必须是插件目录之外的绝对路径。Chrome / Chromium 按平台查找,也可用
DSH_TEST_CHROME指定。 - 已发送消息的公式按每轮最多 80 次尝试分批处理,待办队列自动续排并在消息之间轮转。单条消息允许范围内的第 81–200 个公式不再永久遗漏。
- 链接标题、引用定义和引用键保持源码,不再把其中的美元符号误作公式。可见链接文字仍支持公式。
- 闭合代码围栏使用解析器提供的准确范围,保留引用前缀和列表缩进。未闭合围栏继续显示源码。
- 公式内的星号、删除线标记和括号不再干扰外部 Markdown。未闭合公式内的列表保持源码,不再触发自动续行。
- 浏览器探针通过候选包的 Slot 生命周期组件挂载适配器,覆盖候选包的挂载与卸载链路。
- 构建时的 CSS 作用域处理同时消费声明块,避免内嵌字体触发正则的平方级回溯。优化前后的运行产物逐字节一致。
兼容目标是 CommonMark 0.31.2 与 GFM 的语法识别和源码保真。原生输入增强保留任务列表、表格、链接、图片和 HTML 的可编辑文本,不提供完整 HTML 视觉渲染。编辑期预览门控仍保留:裸标题标记、没有分隔空白的引用标记、未闭合围栏先显示源码。这些显示策略不代表对应内容不符合 CommonMark。
隔离回归使用官方 rc.2 和审阅后的本机桌面运行时,两套各 149 项全部通过,均无跳过。独立 Chrome 对两份运行时各完成 16 项检查,包含候选包生命周期挂载与卸载。官方 CommonMark 的 652 个示例与 GFM 的 677 个示例通过范围检查和真实原生编辑器源码往返检查。额外 210 个 Markdown / TeX 交叉样例通过节点边界检查。这些检查不证明 HTML 视觉结果完全一致,也不替代真实输入法或图片混输验收。
历史发布记录(2026-10-17)
13:38 已授权切换为无额外开关的原生增强版,随后连续修复:14:43 光标可见、14:52「# 需空格」、15:05 合成保持渲染并识别列表、15:25 合成状态自愈并让列表同样需空格、15:45 实例自愈并实现列表续行、16:05 隐藏源码不再收集拼写波浪线、16:15 公式收尾保持源码几何、16:21 自己发出的消息也渲染公式,当前修订 native-rc2-9,包版本仍为 0.1.0。 用户确认接受插件内私有适配风险,并逐次确认所有草稿“已保存或无需保留”。13:38 替换客户端及对应第三方声明;其后八次各只替换客户端(声明与 Host 入口逐字节未变);都未改 DSH 本体或 profile、未刷新/重启应用、未发送测试消息。
本目录以 link: 被正在运行的 desktop profile 引用。隔离回归随修订推进:rc2-1 为 90/90 与 Chrome 6/6,rc2-2 为 91/91 与 7/7,rc2-3 为 92/92 与 8/8,rc2-4 为 94/94 与 10/10,rc2-5 为 95/95 与 10/10,rc2-6 为 98/98 与 11/11,rc2-7 为 99/99 与 12/12,rc2-8 为 99/99 与 12/12,rc2-9 为 104/104 与 12/12。切换后实时 Slot 已出现 live-markdown-math-native active,旧按钮注册消失,说明响应页面已注册新版客户端;DOM 根增强属性、真实图片混输和 Windows 输入法仍待现场验收。发送后的消息渲染由 DSH 自己的渲染器负责(其流式阶段不解析数学),不属本插件。本轮详细核验报告保存在作者本地,未随本仓库发布。
2026-10-17 已针对 DSH 0.2.1-rc.2 完成兼容收口: 声明 engines.dsh 为 >=0.2.1-rc.2 <0.3.0;原生 fixture 更新为 0.2.1 提取客户端(SHA256 843dbcd884e05d77e525bf84b9e6dce180fd49ac8486a3c75591c291f09c9afa)并适配 0.2.1 新增的 CommandChipNode;claim 回归改为断言命令 chip 投影;适配器失败现在经 console.warn 上报一次。0.2.1 原生套件为 122/122,无 fixture 的默认套件为 67 通过、55 跳过(原生组按设计跳过);隔离 Chrome 对 0.2.1 DraftEditorRuntime 的 Markdown、TeX、列表续行与卸载恢复均通过。未改 DSH 本体、profile、安装状态或启用状态。
新方案怎样使用
候选版实际加载后,在原来的 DSH 输入框直接输入即可,没有 MD + TeX 开关、第二编辑器或额外预览面板。
- 标题、粗体、斜体、删除线、引用、行内代码和代码块自动获得对应样式;光标进入标记时显示可编辑源码。
- 标题采用编辑期预览门控:单独一行
#/##仍显示为普通文本(便于输入#include、#tag),补上空格后才转为标题。 - 列表支持
-/*/+、1.和1),普通项的标记后需要空格或 Tab。裸无序标记、1.5、1.打保持源码;空的有序标记保留既有预览例外。 - 列表续行:在
1. 内容后换行会自动补出2.(项目符号同理),在仍为空的项上再换行则撤掉标记、该行变回普通行。换行与标记属于同一次更新,撤销一次即可整体回退;这是插件唯一会写入草稿的内容,且只写标记本身。 - 公式在光标离开后才折叠:光标停在收尾定界符上时源码保持自身几何,完成公式不会再挪动后面的文字与光标,也不会把光标留在渲染框内部。
- 隐藏的源码不会被拼写检查标注(波浪线不会堆在公式上),渲染浮层带不透明底色。
- 自己发出的消息也会渲染公式:在官方用户气泡里做显示层替换,原文保留为透明可选文本,公式装饰不参与选中;助手消息、代码块与输入框保持各自渲染。
- 预览保留编辑期门控:
>、>引用、未闭合的围栏代码块(、js)保持可见源码,便于继续输入。 - 中文输入法合成期间保持已渲染的显示(只暂停样式转换与整帧重绘,公式浮层跟随占位框),且合成状态会自愈:失焦、合成事件落在编辑器之外、长时间静默都不会让视图停止更新。
- 单行公式支持
$…$、$$…$$、\(…\)、\[…\]。光标离开公式后显示排版,直接单击可进入原生 TeX 文本编辑。 - 被隐藏的源码保留字体度量(只让字形透明,并以逐元素实测的负字距抵消占位宽度),因此光标在
#、**、反引号或$…$内部保持可见,公式后的光标落在渲染框边缘。 - Markdown / TeX 源文始终保留。标题标记、反引号等仅在显示层隐藏,不转换成发送用 HTML。
- 图片粘贴、拖放、附件按钮、混合剪贴板、
/命令、@引用、Enter、队列与发送仍归 DSH 管理。插件只被动观察原生换行意图,不接管按键、粘贴、拖放或提交,也不调用全量草稿写入。 - 不完整、非法、超限或无法安全布局的内容回退为可读源码,不限制原生输入。
图片链路未被接管不等于已通过真实图片验收。 必须在当前 GUI 中完成“输入文字 → 粘贴截图 → 继续输入格式文本”等检查,才能确认用户目标完成。
实现与兼容边界
- 增强当前 DSH
0.2.1-rc.2的 resident Lexical0.49.0/DraftEditorRuntime,不捆绑另一份 Lexical,不替换 contenteditable 根。0.2.1 将已认领命令表示为原子CommandChipNode,插件在内部布局投影中把它与引用 chip 一样记为 U+FFFC。 - 私有入口为会话 binding 的 Context 与
conversation.input.for(binding.ctx).editor。conversation.input.overlay只承载生命周期组件,该组件返回 null;它本身不是公开的编辑器扩展接口。 - 对普通、安全 TextNode 做有界分段,使用插件自有样式元数据。引用节点、claim、chip 和其他来源的样式保持原状;源文、occurrences 与 attachmentIds 不由插件重建。
- 公式显示在原生根之外的
pointer-events:none层,不向 Lexical 管理的 DOM 插入 KaTeX 子节点;按原生滚动容器裁切。单击公式只在默认事件之后调整原生选区;Shift 点击、拖动、双击不由此逻辑接管。 - 输入法合成期间暂停拆分与装饰;合成结束后延迟 32ms 结算。卸载不回写草稿,不重建根或历史栈。
- 包元数据通过
engines.dsh=>=0.2.1-rc.2 <0.3.0声明兼容宿主范围;运行时仍以 namespace、方法、节点类型的结构兼容检查兜底,检查不通过则不增强。结构相同也不保证未来版本语义相同,DSH 升级后必须重新验证。 - KaTeX
trust:false、宏展开/尺寸限制和 DOMPurify;不执行原始 HTML,不加载远程图片、字体、CDN、遥测或服务。React 使用宿主单例;Host 入口没有业务逻辑。
已知限制
- 快速输入
**abc**时,格式闭合会增加一个原生撤销分组:先退到**abc*,再退到空。源文不丢,重做可恢复,但不等同于纯原生的一次撤销体验。 - 多行或跨原生节点、跨引用的公式保留源码;不能声称所有矩阵或多行公式都可实时预览。
- 列表、任务项、表格保留文本,不提供交互控件;Markdown 图片不加载,链接不跳转。不是完整富文本编辑器。
- 文档上限 100000 个 JavaScript 字符单位、公式上限 200、单公式上限 4000,原生分段上限 6000;扫描预算耗尽时停止增强,保留输入。
- 当前 GUI 明暗主题、窄屏、真实 Windows 输入法、系统剪贴板图片及真实发送仍待验收。
- 0.2.1 的已发送用户文本经
conversation.user.textFactory 渲染;插件只在[data-chat-flow-kind="user"]下满足单字符串子节点的plainRunspan 上做显示层替换。若 DSH 改变该私有 DOM 结构,发送消息的公式会静默停止渲染(原文与复制不受影响);输入框适配失败则只上报一次console.warn并回退原生输入。
安全构建与测试
已验证 Node.js 24.21.0,使用现有 npm 锁定依赖。不要为测试直接运行默认 npm run build:它写入链接中的 lib/,等同于发布到在用插件。
在安装开发依赖的源码副本中运行隔离检查。运行时文件必须通过 test/native-runtime.mjs 的已审阅 SHA256 白名单,不包含在交付包内。
macOS / Linux:
DSH_NATIVE_RUNTIME='/absolute/path/to/reviewed/client.js' npm run check:browser
Windows PowerShell:
$env:DSH_NATIVE_RUNTIME='<已审阅的 0.2.1-rc.2 运行时提取副本>\runtime\lib\client.js'
$env:DSH_LMM_BUILD_DIR='<隔离输出目录>'
node scripts/check.mjs --browser
npm run check:强制要求原生运行时 fixture;向显式候选目录或自动生成的临时目录构建,再运行 audit/native/client/markdown/math/chat-math/package/styles 八组测试,结束时复核在线客户端摘要未变。npm run check:browser:再启动独立 headless Chrome,验证实际 DOM 排版、点击、光标、删除与滚动;只操作自己的临时页面/浏览器,不连接 DSH。可用DSH_TEST_CHROME指定浏览器程序。node scripts/build.mjs --out <隔离目录>:构建候选客户端、Host 空入口与对应第三方声明;隔离输出禁止位于链接插件目录内。npm test:仅跑上述八组测试,不构建;原生相关组需要正确 fixture(未设置DSH_NATIVE_RUNTIME时按设计跳过)。验收优先使用强制校验的check。npm run test:legacy:旧架构历史回归,不能作为新架构验收。旧离线 CodeMirror demo 也不是当前原生方案的演示。
原生 fixture 的完整 SHA256 与来源由 test/native-runtime.mjs 维护,包括历史 0.2.1-rc.2 提取客户端、官方 npm 0.2.1-rc.2 包及审阅后的本机桌面客户端。未知摘要仍会拒绝执行。fixture 的 resident editor 错误处理器会记录异常,测试释放时断言无错误。
JSDOM 验证包括源文/选区、倒向选择、emoji/中文、引用/附件投影、原生撤销重做、合成事件屏障、复制导出和卸载。模拟图片命令只证明透传与继续编辑,不验证真实上传。隔离 Chrome 检查也不等于当前 GUI 或操作系统输入法验收。
发布与回退
以下安装状态来自 2026-10-17 的历史环境,不代表当前机器的在线状态。本轮没有安装或发布插件。历史 desktop profile 使用版本 0.1.0,本地依赖为:
"dsh-live-markdown-math": "link:<本仓库的绝对路径>"
包内 bundle patch 已提供 live-markdown-math 挂载,不要手工重复插入 profile。本次用户已确认切换与草稿安全,13:38 仅发布两项运行产物,未改 Host、注册、依赖或启用状态;版本和 profile 摘要均已复核。后续替换或回退仍须相应确认并保存未发送草稿,不得以刷新验证为由丢弃内容。
本次只读 Slot 已核验新 overlay 注册与旧按钮注册消失;仍未核验 DOM 根属性,也不保证所有其他页面已同步。不承诺通用 HMR,不代用户重启。
临时备份仅保留七天。历史版本的差量包与回退包保存在作者本地,未随本仓库发布;它们各只含客户端与声明,不是独立可安装插件包;使用前核验摘要及当前基线。回退只涉及本插件,不得覆盖 profile、删除会话或改动其他插件。
真机验收清单
- 无开关自动呈现格式,点击/方向键/删除和跨行选择可继续编辑源文。
- 截图粘贴、拖入图片、附件按钮、文字+图片混合剪贴板;图片前后继续输入不丢文字或附件,不要求重贴。
- Windows 拼音候选确认、连续合成;Enter 不误发;快速撤销/重做、中文和 emoji 光标正确。
- 原生
/、@引用与 chip、新会话、运行中、审批、队列和切换会话均保持原功能。 - 明/暗主题、窄屏与长公式滚动;卸载恢复原生。真实发送必须另经用户确认。
插件自身 MIT。第三方声明从实际打包依赖生成:原生版使用 Lezer、KaTeX、DOMPurify 和字体,不带 CodeMirror 编辑器或 DSH 私有运行时。当前根目录的 THIRD_PARTY_NOTICES.md 已与 native-rc2-1 客户端一同发布,并复核摘要一致。
No comments yet. Be the first to write one.