DSH Markdown Copy:把选中的会话内容复制成可编辑的 Markdown 源码

前言

DSH 的消息是用 Markdown 渲染出来的,屏幕上是标题、列表、代码块、表格和公式,但一旦用鼠标选中再复制,剪贴板里通常只剩渲染后的纯文本。把这段文本粘进编辑器或笔记,结构没了,代码块没了,回头还得手改。另一个做法是用每条消息自带的复制按钮,但它只能整条复制,没法只摘一段。

下面介绍的 drinkerqvb/dsh-markdown-copy 就是解决这个中间地带的:在浏览器复制事件里读取选区,还原成 Markdown 源码写进剪贴板。

这是什么

drinkerqvb/dsh-markdown-copy 由 DrinkerqvB 维护,是一个客户端(Web 平台)插件。它解决的问题很具体:鼠标选中一段会话内容后按 Ctrl+C(或走右键菜单“复制”),得到的应该是可继续编辑的 Markdown 源码,而不是渲染后的纯文本。

它不改 DSH 的渲染逻辑,只在浏览器 copy 事件(捕获阶段)里介入:判断选区是否完全落在对话流 [data-chat-flow] 内,如果是,就遍历选中的 DOM 片段重新生成 Markdown,再覆盖 text/plain。粘贴到编辑器或笔记里拿到的是可编辑的 Markdown。

核心功能

插件的行为边界在 README 里写得很明确:

  • 只处理选区完全落在对话流 [data-chat-flow] 内的复制。
  • 输入框、多行编辑框、可编辑区域的复制不受影响。
  • 选区可以跨多条消息,输出按文档顺序排列。
  • 内置的“复制”按钮保持原样,DSH 自带按钮输出的本来就是 Markdown 源码。
  • 选区落在表格或代码块内部时,会扩展到整个表格 / 整个代码块,保证结构完整。
  • 选区落在行内构件(加粗、斜体、行内代码、链接、公式、标题、引用、列表项)内部时,按祖先链补回对应标记,只输出选中的文字。

转换规则由 DOM 节点类型决定,README 里给出了对照表:

DOM 生成的 Markdown
h1–h6 # … ######
p、块级容器 段落,之间空一行
ul / ol / 嵌套列表 - / 1.,嵌套缩进 2 空格,任务列表输出 [x] / [ ]
blockquote 每行加 >
pre / .md-code-block 围栏代码块,语言取自代码块 banner 的语言标签
table GFM 表格,按单元格对齐方式输出对齐行
strong / em / del ** / * / ~~
code 反引号,按内容自适应围栏长度
a / img [text](href) / ![alt](src)
.katex / .katex-display $…$ / $$…$$,TeX 取自 KaTeX 的 application/x-tex 注解
hr、br ---、\ 换行
[data-clock] 操作行、代码块 banner 跳过

转义与“渲染等价”

正文文本会逐字符转义(*、反引号、[、]、<、成对 $、行首块语法、&entity; 等,按上下文判断),保证粘贴后重新渲染的结果与屏幕上选中的内容一致。代码围栏、行内代码、公式和链接目标属于各自的语法,不做转义。

这条契约是渲染等价,不是逐字节还原。渲染阶段已经消耗掉的源写法(\# 与 #、* 与 - 列表标记等)在 DOM 里无法区分,任何实现都恢复不了。需要与模型原文逐字节一致时,用每条消息自带的复制按钮,这正是 README 里保持不变的原因。

安装与启用

在 DSH 里执行官方安装命令:

dsh plugin add https://github.com/DrinkerqvB/dsh-markdown-copy

安装到桌面客户端后刷新会话页面即可生效,无需重启。插件当前版本为 0.1.1,许可证为 MIT。

典型用法

装好后不需要额外配置,直接在会话页里操作即可,下面这个流程可以复现:

1、用鼠标在对话流 [data-chat-flow] 里选中一段内容,例如几条消息里的列表加上一个代码块。
2、按 Ctrl+C(或右键菜单“复制”)。
3、把剪贴板内容粘进编辑器,检查标题、列表缩进、代码围栏和语言标签是否还原为可编辑的 Markdown 源码。

选区落在表格或代码块的一部分时,整段构件都会被输出;想只要其中某个单元格,需要直接选中那部分行内文本,或改用消息自带的复制按钮取整条原文。

适用场景与注意

适合需要在 DSH 会话里摘取片段、整理到笔记或文档里的开发者。插件以当前 DSH 进程的权限运行,安装前应先检查源码与许可证(MIT)。

有几个已知限制要留意:

  • 逐字节还原不可行,这一点见上一节。
  • 选中表格或代码块的一部分时会把整个构件输出,内容多于选中的部分。
  • 模型原文里的原始 HTML 标签在 DSH 里本就不渲染,不会出现在输出中。

结尾

drinkerqvb/dsh-markdown-copy 补的是“选中即复制 Markdown”这个点:不改渲染、不碰输入框、不干扰自带复制按钮,只在选区落在对话流内时把 DOM 还原成源码。目录页在 https://www.skillhub.cn/plugins/DrinkerqvB/dsh-markdown-copy,源码在 https://github.com/DrinkerqvB/dsh-markdown-copy。

需要自己改转换规则或调试时,可以看仓库里的开发部分:src/copy-markdown.js 是纯函数脚本,node build.mjs 由它生成 client.js,测试在 jsdom 里直接加载源码,提交前需重新运行 node build.mjs。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜