前言¶
在 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