🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

Markdown 换行保留 wangjiezhe/dsh-md-linebreak

DeepSeek Harness
wangjiezhe31 天前有提交已提供中文文档扫描:未发现敏感能力

让 Markdown 正文里的单个换行按原样显示,不再被合并成一行

30/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分

数据截至 2026/10/1 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。

该插件未发布到 npm,按作者文档从 GitHub 源安装即可(静态检查只覆盖 npm 路径,不代表插件不可用)。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add wangjiezhe/dsh-md-linebreak
该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)

状态速览

判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态
信任档位:需留意
是什么
dsh 原生插件 · other
装得上吗
实装验证未通过(unknown),装前请到仓库确认最近更新与 issue
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 31 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
⚠︎ 实装验证未通过(unknown · 2026/10/1) ——可能是验证环境差异,装前建议到 GitHub 仓库确认最近更新与 issue。
社区实装还没有人打卡 · 装过的第一个就是你
安装兼容性检查需源码安装

仓库 package.json 标记 private,未发布到 npm,需从源码安装

展开查看检查明细 ↓

以下结论由程序自动检查 npm 包、engines 声明与入口文件得出,未做人工实机验证——能装不等于用着没问题。

✗npm 包@workspace/dsh-md-linebreak(未发布到 npm,仅可源码安装)
✓Node 引擎未声明 engines.node
✓dsh CLI 依赖要求 >=0.2.0-rc.1 · 最新 0.2.1-rc.2 兼容
✓入口文件main/exports/bin 已声明

源码安装时若 pnpm 拦截 prepare 脚本,按其提示在 pnpm-workspace.yaml 的 allowBuilds 中放行后重跑。

验证方式:npm registry 存在性 + package.json 静态校验 · 最后检查 2026/10/20 04:30:20

安全扫描自动 · 静态分析源码
v2.7.0
🟢 扫描:未发现敏感能力尚无人工评估
展开查看扫描说明与证据 ↓

静态扫描未发现敏感能力:最多只发网络请求、读取自身元数据或只读文件,未发现执行命令、文件写入或敏感信息读取。

扫描于 2026/11/1(0 天前) · 范围 入口闭包 + 全包扫描 · 来源 GitHub 仓库

静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。

依赖的 DSH / Cordis 模块
@deepseek-ai/dsh
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个

功能亮点

  • 单个换行原样显示
  • 软换行视为硬换行

将软换行视为硬换行

README

由 DeepSeek 最新模型翻译生成
dsh-md-linebreak — 正文里的换行不再被合并 它解决的问题 Web 客户端把 Markdown 交给 MarkdownText 渲染,而 CommonMark 的软换行(正文里单独一个换行)在渲染树里只是一个文本节点里的 \n: case "text": return node.value 文本节点里的换行在 HTML 里是可折叠空白,所以源码写了多行的段落会被画成一行: 第一行第二行 → 显示为「第一行 第二行」 DSH 对用户自己发的消息是保留换行的(气泡用 white-space: pre-wrap),只有渲染出来的 Markdown 会丢——这个插件补的就是这一处。
展开完整文档(README 剩余 1 节)
dsh-md-linebreak — 正文里的换行不再被合并

它解决的问题

Web 客户端把 Markdown 交给 MarkdownText 渲染,而 CommonMark 的软换行(正文里单独一个换行)在渲染树里只是一个文本节点里的 \n:

case "text": return node.value

文本节点里的换行在 HTML 里是可折叠空白,所以源码写了多行的段落会被画成一行:

第一行第二行 → 显示为「第一行 第二行」

DSH 对用户自己发的消息是保留换行的(气泡用 white-space: pre-wrap),只有渲染出来的 Markdown 会丢——这个插件补的就是这一处。

它做了什么

宿主半边在每次采集注入表时(HTTP 服务每次响应 index.html,以及 host 启动时那一次采集)往表里推一行 style(webserver/index-inject),规则是:

:is([class='_markdown_'], [data-dsh-part='message-body']) :is(p, td, th) { white-space: pre-line }
:is([class='_markdown_'], [data-dsh-part='message-body']) li:not(:has(> :is(p, ul, ol, pre, blockquote, div, table, hr, h1, h2, h3, h4, h5, h6))) { white-space: pre-line }

- pre-line 就是全部修复:换行按换行显示,其余空白(空格、制表符)照常折叠,长行仍然在容器边缘自动折行。等价于 GFM 的 breaks: true。
如果你想让被换行的源码连缩进也逐字保留,把 pre-line 换成 pre-wrap 即可(就在 lib/index.js 的 STYLE 里,改一处)。
- 代码不动:pre / code 有自己的 white-space 策略;列表项只在内容是行内时才命中规则——渲染器会在容器的块级子节点之间插入装饰性换行文本节点,pre-line 会把那些画成空行,所以带嵌套列表 / 代码块 / 段落的列表项被排除在外。
- 两个锚点:[class*="_markdown_"] 是 MarkdownText 的根类(CSS Modules 会写成
_markdown__,稳定的部分是本地名),[data-dsh-part="message-body"]
是皮肤中心语义属性契约里「助手消息正文」的官方锚点(启用皮肤时才存在)。任一命中即可。

为什么走 index 注入表

那张表有两个消费者:webserver 每次响应 index.html 时把行渲染进 ;Desktop 壳在启动 payload 里收到同一批行。一行同时覆盖两种载体。因此:

- 不写入 harness home,也不修改已安装的应用文件(app.asar 一个字节都不动);
- 升级 DSH 不会把它冲掉,规则失效也只会表现成「换行又被合并」;
- 卸掉这个 bundle,下一次 host 启动(用浏览器访问 HTTP 端口的话则是刷新)后就没有这条规则了。

怎么生效 / 怎么验证

1. 重启 DSH(桌面端必须重启,原因见下)。
2. 回到会话里看一条正文写了多行的回复:每一行各自占一行。
3. 校验行确实被推入注入表(不需要浏览器): $node tools\dsh-env\run-mdlinebreak.mjs

其中一项用真实 cordis 派发 + 官方 renderIndexInjections 渲染真实的 dist/index.html,断言这条 落在 里、__DSH_BOOT_READY__ 未被扰动。
4. cordis_inspect_query(platform: host, provider: Config, method: listConfigs, input: {name: '@workspace/dsh-md-linebreak'})
应能看到 include:md-linebreak 这一行,且状态不是 inactive。

为什么桌面端要重启

注入表有两个消费者:HTTP 服务的每次 index 响应,以及桌面壳的启动 payload。浏览器直接访问 http://127.0.0.1:19387 时,刷新即可(每次响应重新收集);桌面端的窗口加载的是 dsh-app://app/(应用自有协议,Electron main 从 app.asar 里的同一份 dist 提供),注入行不是从 index.html 里读的,而是窗口启动时经 IPC 取「host ready 那一刻采集的那一份」(dsh-desktop-host/lib/index.js 的 ready 消息 → lib/main.js 的
ipcMain.handle(DESKTOP_IPC.boot))。新增的行因此只在下一次 host 启动时进入窗口,
刷新页面拿到的是同一份 payload。

怎么关掉

设置 → 插件里禁用这个 bundle,然后重启(或刷新,见上)。
彻底移除:plugin_manager(remove_bundle, target: "@workspace/dsh-md-linebreak")。

安装与维护

安装(会写入 profile 的 node_modules 与 dsh.profile.bundles)
plugin_manager(install_bundle, target: "file:C:\Users\wangjiezhe\Documents\deepseek-harness\default-workspace\dsh-md-linebreak")
改完源码后同步到已安装副本(pnpm 是 COPY,不是 junction) pwsh -File dsh-md-linebreak\sync-installed.ps1 校验:逐文件 SHA256 + 关键标记 $node tools\dsh-env\verify-installed.mjs

dsh-md-linebreak/
package.json dsh.bundle.patch 指向 cordis.patch.yml
预览分享卡片长什么样 ↓wangjiezhe/dsh-md-linebreak
分享 · DeepSeek Harness Hub
wangjiezhe/dsh-md-linebreak

让 Markdown 正文里的单个换行按原样显示,不再被合并成一行

回到顶部