前言¶
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) /  |
.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。