前言¶
DSH 的消息是用 Markdown 渲染出來的,屏幕上是標題、列表、代碼塊、表格和公式,但一旦用鼠標選中再複製,剪貼板裏通常只剩渲染後的純文本。把這段文本粘進編輯器或筆記,結構沒了,代碼塊沒了,回頭還得手改。另一個做法是用每條消息自帶的複製按鈕,但它只能整條複製,沒法只摘一段。
下面介紹的 drinkerqvb/dsh-markdown-copy 就是解決這個中間地帶的:在瀏覽器複製事件裏讀取選區,還原成 Markdown 源碼寫進剪貼板。
這是什麼¶
drinkerqvb/dsh-markdown-copy 由 DrinkerqvB 維護,是一個客戶端(Web 平臺)插件。它解決的問題很具體:鼠標選中一段會話內容後按 Ctrl+C(或走右鍵菜單“複製”),得到的應該是可繼續編輯的 Markdown 源碼,而不是渲染後的純文本。
它不改 DSH 的渲染邏輯,只在瀏覽器 copy 事件(捕獲階段)裏介入:判斷選區是否完全落在對話流 [data-chat-flow] 內,如果是,就遍歷選中的 DOM 片段重新生成 Markdown,再覆蓋 text/plain。粘貼到編輯器或筆記裏拿到的是可編輯的 Markdown。
核心功能¶
插件的行爲邊界在 README 裏寫得很明確:
- 只處理選區完全落在對話流
[data-chat-flow]內的複製。 - 輸入框、多行編輯框、可編輯區域的複製不受影響。
- 選區可以跨多條消息,輸出按文檔順序排列。
- 內置的“複製”按鈕保持原樣,DSH 自帶按鈕輸出的本來就是 Markdown 源碼。
- 選區落在表格或代碼塊內部時,會擴展到整個表格 / 整個代碼塊,保證結構完整。
- 選區落在行內構件(加粗、斜體、行內代碼、鏈接、公式、標題、引用、列表項)內部時,按祖先鏈補回對應標記,只輸出選中的文字。
轉換規則由 DOM 節點類型決定,README 裏給出了對照表:
| DOM | 生成的 Markdown |
|---|---|
h1–h6 |
# … ###### |
p、塊級容器 |
段落,之間空一行 |
ul / ol / 嵌套列表 |
- / 1.,嵌套縮進 2 空格,任務列表輸出 [x] / [ ] |
blockquote |
每行加 > |
pre / .md-code-block |
圍欄代碼塊,語言取自代碼塊 banner 的語言標籤 |
table |
GFM 表格,按單元格對齊方式輸出對齊行 |
strong / em / del |
** / * / ~~ |
code |
反引號,按內容自適應圍欄長度 |
a / img |
[text](href) /  |
.katex / .katex-display |
$…$ / $$…$$,TeX 取自 KaTeX 的 application/x-tex 註解 |
hr、br |
---、\ 換行 |
[data-clock] 操作行、代碼塊 banner |
跳過 |
轉義與“渲染等價”¶
正文文本會逐字符轉義(*、反引號、[、]、<、成對 $、行首塊語法、&entity; 等,按上下文判斷),保證粘貼後重新渲染的結果與屏幕上選中的內容一致。代碼圍欄、行內代碼、公式和鏈接目標屬於各自的語法,不做轉義。
這條契約是渲染等價,不是逐字節還原。渲染階段已經消耗掉的源寫法(\# 與 #、* 與 - 列表標記等)在 DOM 裏無法區分,任何實現都恢復不了。需要與模型原文逐字節一致時,用每條消息自帶的複製按鈕,這正是 README 裏保持不變的原因。
安裝與啓用¶
在 DSH 裏執行官方安裝命令:
dsh plugin add https://github.com/DrinkerqvB/dsh-markdown-copy
安裝到桌面客戶端後刷新會話頁面即可生效,無需重啓。插件當前版本爲 0.1.1,許可證爲 MIT。
典型用法¶
裝好後不需要額外配置,直接在會話頁裏操作即可,下面這個流程可以復現:
1、用鼠標在對話流 [data-chat-flow] 裏選中一段內容,例如幾條消息裏的列表加上一個代碼塊。
2、按 Ctrl+C(或右鍵菜單“複製”)。
3、把剪貼板內容粘進編輯器,檢查標題、列表縮進、代碼圍欄和語言標籤是否還原爲可編輯的 Markdown 源碼。
選區落在表格或代碼塊的一部分時,整段構件都會被輸出;想只要其中某個單元格,需要直接選中那部分行內文本,或改用消息自帶的複製按鈕取整條原文。
適用場景與注意¶
適合需要在 DSH 會話裏摘取片段、整理到筆記或文檔裏的開發者。插件以當前 DSH 進程的權限運行,安裝前應先檢查源碼與許可證(MIT)。
有幾個已知限制要留意:
- 逐字節還原不可行,這一點見上一節。
- 選中表格或代碼塊的一部分時會把整個構件輸出,內容多於選中的部分。
- 模型原文裏的原始 HTML 標籤在 DSH 裏本就不渲染,不會出現在輸出中。
結尾¶
drinkerqvb/dsh-markdown-copy 補的是“選中即複製 Markdown”這個點:不改渲染、不碰輸入框、不干擾自帶複製按鈕,只在選區落在對話流內時把 DOM 還原成源碼。目錄頁在 https://www.skillhub.cn/plugins/DrinkerqvB/dsh-markdown-copy,源碼在 https://github.com/DrinkerqvB/dsh-markdown-copy。
需要自己改轉換規則或調試時,可以看倉庫裏的開發部分:src/copy-markdown.js 是純函數腳本,node build.mjs 由它生成 client.js,測試在 jsdom 裏直接加載源碼,提交前需重新運行 node build.mjs。