dsh-table-copy:给 Markdown 表格加一个 Hover 工具栏,一键复制为 Markdown 或 PNG

前言

在 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 给出的使用流程:

  1. 把指针悬停在任意一张 Markdown 表格上,表格右上角淡入一个两按钮的工具条。
  2. 左按钮(image):表格以 PNG 写入剪贴板。若浏览器拒绝写入图片,同一个 PNG 会改为下载。
  3. 右按钮(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 个属性白名单),把克隆体包进 foreignObject SVG,加载为图片后绘制到 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

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

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

小夜