前言¶
DSH 會話裏的助手回覆經常同時帶表格、引用圖片和長段落。直接複製轉發,表格會亂、圖片只剩小預覽、長文刷屏;用系統截屏,又會因爲當前視口或滾動丟掉上下內容。這個插件要解決的問題就是把「這一條已經生成完畢的回覆」按適合閱讀的紙張重新排版,輸出成一張完整的長 PNG,直接進剪貼板。
這是什麼¶
geopanret/dsh-chat-share-image 是一個 DSH 客戶端插件,由 Geopanret 維護,分類爲客戶端。它不改變談話邏輯,只在每條已完成的助手回覆按鈕區(複製 / 好回答 / 有問題的回答那一排)新增一個相機按鈕:點一下,就把這一條回覆的完整內容渲染成 PNG 長圖並寫入系統剪貼板。Host 半邊是空殼,所有邏輯都在瀏覽器裏,不聯網、不上傳、零 Host 權限,無需重啓 DSH。
核心功能¶
下面列出的是插件 README 中已說明的能力。
- 完整內容入圖:渲染的是這一條回覆的全部內容,而不是當前視口;代碼塊、公式、長文都完整。
- 表格重新排版:截圖裏取消表格橫向滾動和單元格寬度上限,所有列、所有文字都顯示,不缺列。
- 引用圖片放大:界面上的 240/360px 小預覽,在截圖裏按原圖比例完整顯示,不裁切。
- 長文本防溢出:長 URL、不可斷詞自動換行,不會把畫布撐出邊界。
- 輸出後自檢:寫完 PNG 會解碼回讀,校驗文件非空、PNG 尺寸與 canvas 一致,不悄悄給出壞圖。
- 超長自動分段:超過單張可讀高度時按段拆成多張,第 1 張進剪貼板,其餘在 toast 裏可逐張複製或下載;超過 6 張上限時明確拒絕並提示分段。
- 主題跟隨:深 / 淺主題跟隨當前頁面。
- 剪貼板兜底:剪貼板不可用時可下載 PNG。
安裝與啓用¶
從 GitHub 發佈版安裝(推薦):
dsh plugin --profile desktop add github:Geopanret/dsh-chat-share-image#v0.2.0
首次安裝走 HMR 生效;之後 client.js 的改動由 @deepseek-ai/dsh-client-hmr 熱替換,無需重啓 DSH。
本機開發可以 link 到工作區,在 DSH 會話裏執行:
plugin_manager action=install_bundle target=D:\PLAYGROUND-DSHo\dsh-chat-share-image
安裝由 plugin_manager 寫入 profile(~/.dsh/profiles/desktop),不要手改 profile 的 package.json / cordis.patch.yml。卸載:
plugin_manager action=remove_bundle target=dsh-chat-share-image
典型用法¶
安裝啓用後,在任意一條已經完成的助手回覆上,點按鈕區新增的相機按鈕即可。插件會在瀏覽器側克隆這一行,套上只對截圖生效的紙張排版層,然後光柵化成 PNG 寫進剪貼板。
想驗證插件本身是否正常,可以在倉庫根目錄跑:
node --check client.js
node test/smoke.mjs
README 記錄的一次實時頁面實測(agent-browser 攔截 navigator.clipboard.write 取 PNG 字節)覆蓋了真實 5 列表格長回覆拆成 1584×12316、引用圖放大、深色主題、超長回覆拆成 2 張等場景。
實現方式(簡述)¶
全部邏輯在瀏覽器側的 client.js,Host 半邊的 index.js 是空殼。工作順序是:註冊按鈕入口 → 按 slot 給的 messageId 定位回覆行 DOM → 克隆後清理實時佈局凍結值 → 套紙張排版層、展開滾動裁剪、重排表格、放大引用圖 → 內聯同源 / blob / data 圖片與 webfont → 離屏測量後經 SVG <foreignObject> 以 2× 清晰度光柵化 → 回讀校驗 → 寫入剪貼板或分段。其中 SVG 必須以 base64 data URL 交給 <img>,因爲 Chromium 用 blob URL 裝載含 <foreignObject> 的 SVG 會污染 canvas,toBlob 會直接拋 SecurityError。
適用場景與注意¶
適合需要在 DSH 裏把回覆分享出去的人:羣發討論、內部同步、留檔截圖。這張圖不是界面原樣截圖,而是「按完整可讀重新排版」的版本;表格和圖片在截圖裏的呈現方式與界面滾動預覽不同。
使用前注意幾點:
- 插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證(README 標明爲 MIT)。
- 超長回覆會拆成多張 PNG,最多 6 張;單張仍受 32767px 邊長 / 6400 萬像素上限約束。
- 超過 2000px 寬的超長代碼行會自動換行,保留內容但不保留原行寬。
- 跨域且沒有 CORS 頭的遠程圖片無法嵌入 canvas,會顯示
[image: alt]佔位並計數。 - 回覆行定位依賴響應式內部的一些
data-*屬性,DSH 結構變化時按鈕會提示錯誤而不是崩潰,但需要適配。
目錄頁顯示當前爲 0 星。
結語¶
這個插件的價值在於把「轉發一條回覆」從手動截屏拼圖,變成一次點擊得到一張排版完整、可讀的長圖。實現集中在瀏覽器側,Host 端只是空殼,配合 HMR,改 client.js 後無需重啓。
目錄頁:https://www.skillhub.cn/plugins/Geopanret/dsh-chat-share-image
GitHub:https://github.com/Geopanret/dsh-chat-share-image