前言¶
在 DeepSeek Harness Web 里,模型给出的结果经常以 Markdown 表格呈现:数据汇总、对比清单、配置项说明。想把这些表格拿走用的时候,常规做法是手动选中表格单元格,再复制粘贴;表格较宽、跨页或带较多列时,容易选错区域,得到一段格式错乱的文本。想直接得到一张可粘贴到微信、飞书或 issue 里的表格图片,一般还得另开截图工具。
下面介绍 jiongboy/dsh-table-copy。它是一个客户端插件,在每张 Markdown 表格右上角放一个两按钮的小工具条:左边按钮把表格以 PNG 图片写入剪贴板,右边按钮把表格以 Markdown 文本写入剪贴板。
这是什么¶
一句话定位:为 DeepSeek Harness Web 中所有 Markdown 渲染出的表格添加 Hover 工具栏,支持复制为 Markdown 文本或 PNG 图片。
- 维护者:
jiongboy - 分类:客户端
- 星标:0
- 许可证:MIT
- 版本:
0.1.0(见package.json)
它解决的是「Markdown 表格取用不便」:不需要选中、不需要截图工具,鼠标悬停即出现工具条,点击即得到格式化结果。插件适配浅色和深色主题,背景、字体、边框随当前主题导出,暗色主题下的表格导出结果也是暗色。
全部能力在客户端完成:无网络请求、无文件系统访问、不新增后端路由,只操作剪贴板。
安装与启用¶
安装命令来自 README。插件尚未发布到 npm,README 中该路径标注为 # from npm (after publishing):
# from npm (after publishing)
dsh plugin --profile web add dsh-table-copy
# or straight from GitHub
dsh plugin --profile web add github:jiongboy/dsh-table-copy
安装后重载 Web UI(Cmd/Ctrl+R),插件会出现在「插件 → 已安装插件」中。卸载命令:
dsh plugin --profile web remove dsh-table-copy
要注意的是,插件以当前 dsh 进程的权限运行,安装前应检查源码内容与许可证(MIT)。
典型用法¶
操作不涉及命令行参数,README 给出的使用流程:
- 把指针悬停在任意一张 Markdown 表格上,表格右上角淡入一个两按钮的工具条。
- 左按钮(image):表格以 PNG 写入剪贴板。若浏览器拒绝写入图片,同一个 PNG 会改为下载。
- 右按钮(copy):表格以 Markdown 写入剪贴板,格式为表头行、
| --- |分隔行和数据行;按钮闪过对勾,并用 toast 提示完成。
工具条平时不占位,只在悬停时出现。导出的 PNG 按 2× 分辨率截取,可直接粘贴到微信、飞书、文档或 issue。
原理与已知限制¶
插件分为主机侧和浏览器侧两部分。
- 主机侧
lib/index.js只声明插件身份,不注册路由、不提供服务。 - 浏览器侧
lib/client.js挂在MutationObserver上,找到 Markdown 容器内的每个<table>,向其追加<caption class="dtc-tools">。 - 表格节点本身不被包裹或移动,因为该 DOM 树归 React 管理,额外包裹会在接下来的流式重渲染中被丢弃;
<caption>是表格的子节点,渲染器重建表格时会被重新加上。 <caption>和工具条都使用position: sticky; right: 0,宽表格横向滚动时按钮始终钉在可视右边缘。- Markdown 导出读取
table.rows,逐格折叠空白并转义|。 - 图片导出克隆表格,为每个节点内联计算样式(48 个属性白名单),把克隆体包进
foreignObjectSVG,加载为图片后绘制到 2× canvas,再调用canvas.toBlob("image/png")。 - 背景取第一个不透明祖先的背景色,因此暗色主题的表格导出为暗色,而不是白底。
已知限制来自 README:
- SVG 必须以
data:URL 传递。blob:URL 在 Chromium 中会污染 canvas,toBlob()抛出SecurityError。 - 图片按渲染宽度截图:被横向滚出视图的列仍会被捕获,因为克隆表格保持
width: max-content的完整尺寸。 - 表格内链接保留颜色和文字,但在 PNG 中不可点击。
- 只有 Markdown 渲染出的表格会被装饰,产品界面自身的表格(设置页、插件列表)不受影响。
开发与调试¶
README 给出的检查方式:
node --check lib/client.js && node --check lib/index.js # 语法检查
# 确认客户端 bundle 是否已加载到运行中的实例
curl -sN --max-time 5 http://127.0.0.1:55102/plugins/events | head -c 2000
浏览器侧是一个普通脚本,通过 window.__ModuleLoader__.load({ id, factory }) 注册,并非 ESM。工厂函数返回 { name, inject, apply },与 dsh-pet、dsh-md-plus 使用同一契约。package.json 中 dsh.bundle.patch 指向 ./cordis.patch.yml,dsh.client.platform 为 web,engines.node 要求 >=22.19.0。
适用场景¶
适合使用 DSH Web 界面、经常需要从模型输出中取表格内容的开发者:把配置项、数据汇总或对比表格直接转成可粘贴的图片或 Markdown。全部处理在浏览器端完成,不经过额外服务,适合对数据不出本机有要求的用法。
需要注意:插件以当前 dsh 进程权限运行,历史输出中的表格与插件渲染的表格在视觉上没有区别,务必在安装前阅读源码与许可证,确认符合自身使用场景。
小结¶
dsh-table-copy 做的事很小:给 Markdown 表格加一个悬停工具条,把表格按 Markdown 或 PNG 放进剪贴板。实现上看,它用 MutationObserver 加 <caption> 的方式绕过了 React 管理 DOM 的限制,客户端侧无网络请求,限制也写在 README 里。
目录页:https://www.skillhub.cn/plugins/jiongboy/dsh-table-copy
GitHub:https://github.com/jiongboy/dsh-table-copy