← Back to home@lyufeng000

dsh-live-markdown-math

DSH 原生 Markdown / LaTeX 输入增强:在原生 Lexical 输入框里无开关实时呈现标题、列表、粗体、代码与 KaTeX 公式。

Stars
0
Language
JavaScript
Created
Oct 16, 2026
Updated
Oct 16, 2026

Introduction

DSH 原生 Markdown / LaTeX 输入增强

当前状态(2026-10-16)

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 自己的渲染器负责(其流式阶段不解析数学),不属本插件。本轮详细核验报告保存在作者本地,未随本仓库发布。

新方案怎样使用

候选版实际加载后,在原来的 DSH 输入框直接输入即可,没有 MD + TeX 开关、第二编辑器或额外预览面板。

  • 标题、粗体、斜体、删除线、引用、行内代码和代码块自动获得对应样式;光标进入标记时显示可编辑源码。
  • 标题只在语法真正成立后预览:单独一行 #/## 仍显示为普通文本(便于输入 #include、#tag),补上空格后才转为标题。
  • 列表同样识别:-/*/+ 与 1. 必须后跟空格(或制表符)才成列表——裸 -、1.、1.5、1.打 都保持普通源码;识别后隐藏源码标记并显示仅用于显示的圆点或源码编号。
  • 列表续行:在 1. 内容 后换行会自动补出 2.(项目符号同理),在仍为空的项上再换行则撤掉标记、该行变回普通行。换行与标记属于同一次更新,撤销一次即可整体回退;这是插件唯一会写入草稿的内容,且只写标记本身。
  • 公式在光标离开后才折叠:光标停在收尾定界符上时源码保持自身几何,完成公式不会再挪动后面的文字与光标,也不会把光标留在渲染框内部。
  • 隐藏的源码不会被拼写检查标注(波浪线不会堆在公式上),渲染浮层带不透明底色。
  • 自己发出的消息也会渲染公式:在官方用户气泡里做显示层替换,原文保留在 DOM 中且不参与选中,因此选中/复制仍是 $…$ 原文;助手消息、代码块与输入框一概不碰。
  • 语法门控查全:所有需要空格或闭合才算成立的标记都等到那时才变换,>、>引用、未闭合的围栏代码块(、js)都保持完全可见的源码。
  • 中文输入法合成期间保持已渲染的显示(只暂停样式转换与整帧重绘,公式浮层跟随占位框),且合成状态会自愈:失焦、合成事件落在编辑器之外、长时间静默都不会让视图停止更新。
  • 单行公式支持 $…$、$$…$$、\(…\)、\[…\]。光标离开公式后显示排版,直接单击可进入原生 TeX 文本编辑。
  • 被隐藏的源码保留字体度量(只让字形透明,并以逐元素实测的负字距抵消占位宽度),因此光标在 #、**、反引号或 $…$ 内部保持可见,公式后的光标落在渲染框边缘。
  • Markdown / TeX 源文始终保留。标题标记、反引号等仅在显示层隐藏,不转换成发送用 HTML。
  • 图片粘贴、拖放、附件按钮、混合剪贴板、/ 命令、@ 引用、Enter、队列与发送仍归 DSH 管理。插件没有自己的粘贴、拖放、输入按键或提交监听器,也不调用全量草稿写入。
  • 不完整、非法、超限或无法安全布局的内容回退为可读源码,不限制原生输入。

图片链路未被接管不等于已通过真实图片验收。 必须在当前 GUI 中完成“输入文字 → 粘贴截图 → 继续输入格式文本”等检查,才能确认用户目标完成。

实现与兼容边界

  • 增强当前 DSH 0.2.0-rc.2 的 resident Lexical 0.49.0 / DraftEditorRuntime,不捆绑另一份 Lexical,不替换 contenteditable 根。
  • 私有入口为会话 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 结算。卸载不回写草稿,不重建根或历史栈。
  • 当前采用 namespace、方法、节点类型的结构兼容检查,不是精确宿主版本号锁。检查不通过则不增强;结构相同也不保证未来版本语义相同,DSH 升级后必须重新验证。
  • KaTeX trust:false、宏展开/尺寸限制和 DOMPurify;不执行原始 HTML,不加载远程图片、字体、CDN、遥测或服务。React 使用宿主单例;Host 入口没有业务逻辑。

已知限制

  1. 快速输入 **abc** 时,格式闭合会增加一个原生撤销分组:先退到 **abc*,再退到空。源文不丢,重做可恢复,但不等同于纯原生的一次撤销体验。
  2. 多行或跨原生节点、跨引用的公式保留源码;不能声称所有矩阵或多行公式都可实时预览。
  3. 列表、任务项、表格保留文本,不提供交互控件;Markdown 图片不加载,链接不跳转。不是完整富文本编辑器。
  4. 文档上限 100000 个 JavaScript 字符单位、公式上限 200、单公式上限 4000,原生分段上限 6000;扫描预算耗尽时停止增强,保留输入。
  5. 当前 GUI 明暗主题、窄屏、真实 Windows 输入法、系统剪贴板图片及真实发送仍待验收。

安全构建与测试

已验证 Node.js 24.21.0,使用现有 npm 锁定依赖。不要为测试直接运行默认 npm run build:它写入链接中的 lib/,等同于发布到在用插件。

在插件目录运行隔离检查(运行时文件必须是审阅过的本机 rc.2 提取副本,不包含在交付包内):

$env:DSH_NATIVE_RUNTIME='<已审阅的 rc.2 运行时提取副本>\runtime\lib\client.js'
$env:DSH_LMM_BUILD_DIR='<隔离输出目录>'
node scripts/check.mjs --browser
  • npm run check:强制要求原生运行时 fixture;向显式候选目录或自动生成的临时目录构建,再运行 native/client/markdown/math/package/styles 六组测试,结束时复核在线客户端摘要未变。
  • npm run check:browser:再启动独立 headless Chrome,验证实际 DOM 排版、点击、光标、删除与滚动;只操作自己的临时页面/浏览器,不连接 DSH。可用 DSH_TEST_CHROME 指定浏览器程序。
  • node scripts/build.mjs --out <隔离目录>:构建候选客户端、Host 空入口与对应第三方声明;隔离输出禁止位于链接插件目录内。
  • npm test:仅跑上述六组测试,不构建;调用者必须提供候选产物和正确 fixture。验收优先使用强制校验的 check。
  • npm run test:legacy:旧架构历史回归,不能作为新架构验收。旧离线 CodeMirror demo 也不是当前原生方案的演示。

原生 fixture SHA256:64843c950b829f44feed3248af6c46bbd620cf85e7c687b4f7f60e1ec4eb4782。fixture 的 resident editor 错误处理器会记录异常,测试释放时断言无错误,避免吞错造成假通过。

JSDOM 验证包括源文/选区、倒向选择、emoji/中文、引用/附件投影、原生撤销重做、合成事件屏障、复制导出和卸载。模拟图片命令只证明透传与继续编辑,不验证真实上传。隔离 Chrome 检查也不等于当前 GUI 或操作系统输入法验收。

发布与回退

当前 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、删除会话或改动其他插件。

真机验收清单

  1. 无开关自动呈现格式,点击/方向键/删除和跨行选择可继续编辑源文。
  2. 截图粘贴、拖入图片、附件按钮、文字+图片混合剪贴板;图片前后继续输入不丢文字或附件,不要求重贴。
  3. Windows 拼音候选确认、连续合成;Enter 不误发;快速撤销/重做、中文和 emoji 光标正确。
  4. 原生 /、@ 引用与 chip、新会话、运行中、审批、队列和切换会话均保持原功能。
  5. 明/暗主题、窄屏与长公式滚动;卸载恢复原生。真实发送必须另经用户确认。

插件自身 MIT。第三方声明从实际打包依赖生成:原生版使用 Lezer、KaTeX、DOMPurify 和字体,不带 CodeMirror 编辑器或 DSH 私有运行时。当前根目录的 THIRD_PARTY_NOTICES.md 已与 native-rc2-1 客户端一同发布,并复核摘要一致。