dsh-novel-wallpaper
IdentifiedRenders a TXT novel as a dim text layer behind the DSH chat, with a draggable controller for table of contents, chapter paging, auto-scroll and reading settings.
dsh-novel-wallpaper
English | 中文
把 TXT 小说变成 DSH 的「壁纸」。正文垫在整个界面背后,一个会隐身的小浮窗负责遥控。
等模型回话的几十秒,顺手看两页小说 —— 不用多开窗口,不用切标签页,也不占着对话区。 把鼠标挪开,界面就是原来的界面。
目录
它长什么样
小说正文渲染成一个铺满窗口的文字层,压在 document.body 的 z-index: -2 上,
并且 pointer-events: none —— 它从不接触鼠标,点击永远落在真正的界面上。
上面盖一层可调浓度的压暗层(z-index: -1),再上面才是 DSH 自己的界面。
对话主区的底色被清成透明,于是文字就「透」出来了。
控制端是一个浮在半空的圆点:
| 状态 | 表现 |
|---|---|
| 平时 | 一枚半透明小圆点,几乎不占视线 |
| 鼠标悬停 | 展开成按钮条:目录 / 上一章 / ▶ / 下一章 / 书库 / ⚙ / 隐身 |
| 隐身档 | 淡到几乎看不见,但还摸得到(不然就找不回来了) |
| 位置 | 可拖动,位置会被记住 |
截图待补。 仓库目前没有截图,欢迎你装完后自己截两张放进
assets/,再按 上架规范 加一个screenshots.json,市场详情页就会用你自己的图。
安装
dsh plugin --profile web add github:kongbai-shike/dsh-novel-wallpaper
装完刷新页面即可,多数情况下不需要重启。
其它安装方式
指定 profile: 把 --profile web 换成你的 profile 名(桌面端常见的是 desktop)。
从本地目录开发: 把仓库软链到 profile 的 node_modules 下,再在 profile 的
package.json 里登记 dependencies 与 dsh.profile.bundles。DSH 的 HMR 会在你改完
client.js 后自动重载客户端半区。
卸载: dsh plugin --profile web remove @local/dsh-novel-wallpaper,或直接在
设置 → 插件里移除。
要求: DSH Web 0.1.0-rc.6 或更新版本(用到 shell.overlay 插槽与客户端快捷键服务)。
快速开始
- 把
.txt文件拖到窗口任意位置,或点浮窗 → 书库 →+。 - 在目录里点一章,按 ▶ 开始自动滚动。
- 滚轮或方向键随时接管;再按 ▶ / ❚❚ 暂停。
编码是自动识别的:UTF-8、UTF-8 BOM、UTF-16LE、UTF-16BE,都失败则回退 GB18030。 中文 TXT 乱码通常就是缺最后这一步 —— 大部分老书是 GBK/GB18030,不是 UTF-8。
自动滚动到本章结尾会停住,不会自己跳下一章。是刻意的:读到哪里由你决定。
阅读控制:滚轮与方向键
| 操作 | 效果 |
|---|---|
| 滚轮 ↓ | 往下读(正文上移) |
| 滚轮 ↑ | 往回看(正文下移) |
Ctrl + Shift + ↓ | 往下读 |
Ctrl + Shift + ↑ | 往回看 |
Ctrl + Shift + ← | 上一章 |
Ctrl + Shift + → | 下一章 |
一次滚轮 / 一次方向键的位移 = 滚动速度 × 滚轮灵敏度(设置里可调,默认 6×), 约 180ms 缓动到位。连续快滚会累加,不会每次都从头重新滑 —— 手感上就是一路滑下去, 而不是一格格地跳。
四条刻意设计的行为:
- 滚轮会「让位」。 鼠标停在还能滚动的区域(聊天记录、设置面板、目录列表)时, 滚轮归界面;滚到尽头、或停在空白处时,才轮到小说。所以「把聊天滚到底,接着往下滚」 就自然滑到小说上,不需要切换模式。 这条是必须的:小说垫在整个界面背后,全局霸占滚轮会让你再也滚不动聊天记录。
- 自动播放时滚一下 = 先暂停,转手动。
- 隐身档下滚轮和方向键全部失效 —— 老板键的意义就是把屏幕彻底还回去。
- 方向键必须带
Ctrl + Shift,且在输入框里永不生效。 因为Ctrl+Shift+←/→是打字时「按词选中」,抢过来只会让编辑更难用; 焦点在输入框时光标照常移动。
方向键注册在 DSH 自己的快捷键服务上,不是全局键盘监听。因此它焦点感知、 会和其它插件做冲突检测、也能在 DSH 设置 → 快捷键里改键。命令 id:
novel-wallpaper.scroll-up novel-wallpaper.scroll-down
novel-wallpaper.prev-chapter novel-wallpaper.next-chapter
方向键在该服务里属于保留键,
desktop:windows、desktop:macos、web:windows三个平台组合能通过校验,因此只声明了这三个默认绑定。其它平台可以在设置里自己绑。
老板键
Ctrl + Shift + `
切「隐身档」:文字不透明度降到 10%(即 90% 透明),浮窗淡到几乎看不见, 再按一次恢复。
隐身档的具体数值在设置里可调 —— 把它调成 0,就是彻底还原成原版 DSH 界面。 隐身档不会被记住,刷新后始终回到正常状态,这样浮窗永远找得回来。
设置
浮窗 → ⚙。全部设置存在 localStorage,只在本机。
| 分组 | 项 |
|---|---|
| 文字 | 字号(默认 34)、文字不透明度(0.18)、跟随主题的字体颜色、字体、行距(1.9)、字间距(0.02) |
| 背景 | 阅读器背景色(#000000)、背景浓度(0.35)、界面清底程度(1) |
| 滚动 | 滚动速度(38 px/s)、滚轮灵敏度(6×) |
| 隐身 | 隐身档不透明度(0.1) |
| 阅读 | 显示章节标题、记住阅读进度、分章正则 |
| 预设 | 看得清 / 平衡 / 极隐蔽,一键切换 |
分章正则默认是内置规则表里全部「安全」规则的并集,只匹配行首,所以正文里提到 「第一章」不会被误判成新章节。规则表、自动兜底和实测数据见 分章规则。
「界面清底程度」是反着的:1 = 把对话区底色完全清掉(文字最清楚,界面也最透)。
调低它,界面会重新变实,小说随之被压暗。
分章规则
TXT 的分章格式在野外千奇百怪,所以插件内置了一张规则表。默认值就是表里全部 「安全」规则的并集 —— 拿到一本书直接导入,通常就对了。
| 规则 | 匹配 | 例子 |
|---|---|---|
| 第 N 章 | 第 + 可选空格 + 数字 + 可选空格 + 章节回卷篇 | 第31章 九叔的二徒弟、第 31 章、第12章、第一回 |
| 卷 / 部 / 篇 | 同上,单位换成 卷部篇 | 第二卷 风起 |
| 楔子 / 番外 | 常见特殊标题 | 楔子、序章、引子、尾声、终章、完本感言 |
| 【第 N 章】 | 外层带括号 | 【第12章】降伏、(第 13 章)风叔 |
| Chapter N | 英文 | Chapter 12 Dawn |
数字两侧的空格是关键。第 31 章 标题 这种排版在盗版 TXT 里非常常见,而紧贴的
第N章 一个都匹配不上 —— 更糟的是它静默失败:一本 486 章的书会整本变成一章
「全文」,没有任何地方报错。这一条曾经就是本插件的实际 bug。
纯数字标题(12、开端、001.、12、)单列一条规则,但默认不启用:行首
孤零零一个数字偶尔是正文,宁可让你在设置里手动点一下。
自动兜底
如果当前正则在你的书上匹配不到章节(标题少于 2 个),插件会把每条内置规则都试一遍, 按「命中数最多、且标题大多是短行」挑一条最好的,然后:
- 用它重新分章;
- 在状态栏写明用的是哪条规则 —— 不会偷偷无视你手写的正则。
判定时会要求至少一半的命中行是短行(≤ 40 字)——整段正文不可能符合。如果所有规则的 「标题」都是整段正文,它宁可不猜,保持原样:猜错比不分章更糟。
换规则不用重新导入
设置里改完分章正则会立刻按新规则重新分章,并写回书库。正则框下面是一排内置规则, 点一下直接套用;也可以手写任意正则。
显示的标题会先清洗一遍:
第 31 章 九叔的二徒弟→第31章 九叔的二徒弟(数字与单位之间的空格去掉);【第12章】标题→第12章 标题(拆括号);- 标题和正文首段挤在同一行时(
第1章 标题 正文…)只保留标题。
实测
《同穿:我的名字响彻诸天》(3.0 MB / 106 万字):
| 分章数 | 结果 | |
|---|---|---|
| 修复前 | 1 | 整本变成一章「全文」,106 万字滚不到头 |
| 修复后 | 482 | 前言 + 481 章正文,标题最长 22 字,正文零丢失 |
那本书章节号编到 486,但第 119 / 166 / 167 / 371 / 439 章源文件里就没有 (盗版 TXT 常见的丢章),不是分章出错。插件分出的 481 章,就是文件里真实存在的全部。
隐私
纯客户端插件。 host 侧的 apply() 是空的。
- 正文存在浏览器 IndexedDB(TXT 动辄 5–20MB,
localStorage会直接爆配额) - 进度和设置存在 localStorage
- 不写 session log、不注册任何工具、不给模型任何入口
也就是说:agent 在结构上读不到你在看什么。 不是「我们承诺不看」,是那条路根本没修。 所有解析、分章、渲染都在浏览器里完成,不经过网络。
兼容性
- 面向 DSH Web GUI(浏览器里的
dsh web,以及内嵌同一套界面的桌面客户端)。 - 实际运行验证于 DSH Web
0.1.7-rc.2(React 18.3.1);最低要求0.1.0-rc.6。 - 透明效果纯靠 CSS:清空
--dsw-alias-bg-base这类不透明底色让下层透出来, 不依赖系统亚克力/毛玻璃,所以 Windows 上壳层材质设为off也照样工作。 - 和
dsh-plugin-wallpaper-engine不叠加:本插件不透出图片壁纸。两个都想用, 需要把本层的z-index抬到图片壁纸层之上。
设计取舍
有些地方看着「不够聪明」,其实是故意的:
为什么滚轮不直接霸占全局?
因为小说在所有东西背后。一个全局 wheel 监听会把聊天记录、设置面板、目录列表的
滚动全部吃掉 —— 那是不能接受的。所以做的是仲裁:从鼠标下的节点往上走,只要有一层
还能朝那个方向滚,就还给界面;都没得滚了,才轮到小说。代价是多走一次 DOM 链,
收益是两套滚动共存而不打架。
为什么章节读到底不自动进下一章? 自动跳章意味着你低头回个消息,回来已经读丢了。停在章末,是安全的那一侧。
为什么方向键要带修饰键,而不是直接上下左右?
不带修饰键的话,聊天框里按 ↑ 会去翻小说而不是翻输入历史,光标也会跳。
窄的收益配宽的破坏,不划算 —— 所以必须组合键,且 editable 区域直接不注册。
为什么快滚要累加而不是重新开始? 第一版每次滚动都从「上一次动画的起点」重新算,连滚时每一格都在把之前的进度抹掉, 表现为「滚得越快越不动」。现在改从当前已画出来的位置重新瞄准, 所以连续输入会叠成一段连贯的滑动。
开发
node test/logic.test.mjs # 解码 / 分章 / 字典覆盖 / 配色 24 项
node test/apply.smoke.mjs # 载入 / 壁纸层 / 滚动 / 滚轮 / 快捷键 35 项(带 DOM stub)
两个都是零依赖的 node 脚本,直接跑,不需要装任何东西。
apply.smoke.mjs 自己搭了一套最小 DOM stub,能覆盖透明的绘制路径、滚轮的边界与仲裁、
快捷键注册的形状,以及销毁时是否留下残留。
目录结构:
client.js # 全部逻辑:壁纸层、浮窗、阅读引擎、设置面板(浏览器半区)
index.js # host 半区,apply() 为空
cordis.patch.yml # dsh.bundle 清单,把插件挂进 DSH
test/ # 两个零依赖测试
改动集中在 client.js。它是一个 factory(require) 闭包,React 通过 h = createElement
使用,__internals 导出给无头测试用。
已知限制
- 只有对话主区被清成透明;侧边栏保持不透明(更隐蔽,也不影响可读性)。
想让侧栏也透,需要在
LAYER_CSS里补.dshDesktopSidebarSurface的规则。 - 目录一次性渲染全部章节。上万章的巨型文本可能略有卡顿。
- 阅读进度按书 + 章节记,跨设备不同步(本来也不该同步 —— 正文只存在本机)。
- 没有图片/EPUB 支持,只有 TXT。这是取舍:TXT 解析能全在本地跑完,不留任何网络请求。
反馈与贡献
- Bug / 功能建议:直接开 issue。 带上你的 DSH 版本、操作系统,以及「怎么复现」。
- PR:欢迎。改动前先跑一遍上面两个测试;新增行为请顺手补一条用例 —— 这个仓库的测试是零依赖的,加一条成本很低。
⭐ 如果它对你的胃口
这个插件的起点很朴素:我想在等模型回话的时候,顺手看两页小说,又不想多开一个窗口。
如果你也有过这个念头,那它大概就是为你写的。
我希望能收获你的一颗 Star。 它不会让我赚到什么,但会让我知道 「原来不只我一个人需要这个」—— 也就有理由继续把还欠着的地方磨下去: 更细的滚轮手感、更好的大字排版、多书并行、目录分卷。
一颗星,就是一个「继续做」的理由。谢谢。
许可
Comments
Loading…
Similar plugins
Local TXT novel reader in the DSH right sidebar: bookshelf with file, directory and path import, chapter table of contents with jump, click-to-turn or vertical-scroll paging, reading progress restored
★ 0
dsh plugin --profile web add dsh-novel-readerIn-browser novel reader for the dsh web GUI: online book-source search, chapter-by-chapter reading in a chat-style view, and whole-book TXT download.
★ 0
dsh plugin --profile web add github:Wodexinhaoleng-Kasssa/dsh-readerby fourzkw
DSH 右侧栏的可编辑画布 + AI 语义绘图工具(diagram_apply / diagram_read),直接读写原生 .drawio 文件
★ 32
↓ 1.2k/wk
MIT
JavaScript
Oct 19, 2026
dsh plugin --profile web add dsh-drawaiDockable Markdown preview for the DSH Web UI: side-by-side with the conversation, a per-session recently-read .md list, local relative-path images render in place, and clicking an in-chat .md referenc
★ 0
dsh plugin --profile web add dsh-md-previewby xrn1997
Read web novels inside the DSH web GUI: import legado book sources, aggregate search across sources, a bookshelf with reading progress, continuous-scroll reading, and five agent tools for search, chap
★ 1
Apache-2.0
TypeScript
Oct 2, 2026
dsh plugin --profile web add @xrn1997/dsh-novelby wbb316
DSH 插件:小说创作台 —— 给 agent 5 个 novel_* 工具 + 一个能改设定、画关系图、一键续写并流式直播的右侧栏面板
★ 5
↓ 64/wk
MIT
JavaScript
Oct 6, 2026
dsh plugin --profile web add dsh-novel