DSH Markdown Copy:把選中的會話內容複製成可編輯的 Markdown 源碼

前言

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) / ![alt](src)
.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。

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

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

小夜