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 Lexical0.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 入口没有业务逻辑。
已知限制
- 快速输入
**abc**时,格式闭合会增加一个原生撤销分组:先退到**abc*,再退到空。源文不丢,重做可恢复,但不等同于纯原生的一次撤销体验。 - 多行或跨原生节点、跨引用的公式保留源码;不能声称所有矩阵或多行公式都可实时预览。
- 列表、任务项、表格保留文本,不提供交互控件;Markdown 图片不加载,链接不跳转。不是完整富文本编辑器。
- 文档上限 100000 个 JavaScript 字符单位、公式上限 200、单公式上限 4000,原生分段上限 6000;扫描预算耗尽时停止增强,保留输入。
- 当前 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、删除会话或改动其他插件。
真机验收清单
- 无开关自动呈现格式,点击/方向键/删除和跨行选择可继续编辑源文。
- 截图粘贴、拖入图片、附件按钮、文字+图片混合剪贴板;图片前后继续输入不丢文字或附件,不要求重贴。
- Windows 拼音候选确认、连续合成;Enter 不误发;快速撤销/重做、中文和 emoji 光标正确。
- 原生
/、@引用与 chip、新会话、运行中、审批、队列和切换会话均保持原功能。 - 明/暗主题、窄屏与长公式滚动;卸载恢复原生。真实发送必须另经用户确认。
插件自身 MIT。第三方声明从实际打包依赖生成:原生版使用 Lezer、KaTeX、DOMPurify 和字体,不带 CodeMirror 编辑器或 DSH 私有运行时。当前根目录的 THIRD_PARTY_NOTICES.md 已与 native-rc2-1 客户端一同发布,并复核摘要一致。