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

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

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

小夜