# dsh-novel-reader 📖
**在 DeepSeek Harness Web 界面中摸鱼看小说的插件。**
在等待模型运行的间隙,把小说 `txt` 导入进来,用一个可拖动、可调整大小的悬浮窗
分页阅读——窗口小到不挡聊天界面,还能一键切换成"纯文字透明模式"彻底隐形。
[](https://github.com/topics/dsh-plugin)
[](https://github.com/1024483906-pixel/dsh-novel-reader/releases)
[](LICENSE)
[](https://github.com/1024483906-pixel/dsh-novel-reader)
---
## 🚀 安装
### 方式一:从 GitHub 安装(推荐,无需构建授权)
本插件是**预构建分发**(`lib/` 构建产物已随仓库发布,无需 `prepare` 脚本,
也不会触发 pnpm 的构建授权提示):
```bash
dsh plugin --profile web add github:1024483906-pixel/dsh-novel-reader
```
> 参考官方文档 [打包与安装插件](https://deepseek-harness.github.io/deepseek-harness/develop/basic/publish):
> 分发预构建产物(而非源码 + `prepare` 脚本)时,用户不需要做任何构建授权。
### 方式二:本地路径安装(开发用)
```bash
cd D:\dsh插件
node D:\dsh\node_modules\@deepseek-ai\dsh\lib\bin.js plugin --profile web add link:./dsh-novel-reader
```
以上任意方式安装后,重启 DSH(如 `D:\dsh\restart-dsh.ps1`),刷新
`http://127.0.0.1:3080`,右下角出现 📖 悬浮球即安装成功。
> 也可以把 `dsh-novel-reader/` 目录复制到任意位置,再用 `link:<绝对路径>` 安装。
---
## ✨ 功能特性
### 📚 小说管理
- **txt 导入**:点击悬浮窗标题栏 → 书架 → `导入新书`,用浏览器文件选择器选择本地
`.txt` 小说(UTF-8),自动上传并加入书架。
- **书架切换**:导入多本后,点标题栏 `书` 打开书架,当前书 📖 高亮,点击即可切换。
- **独立进度**:每本书的阅读进度、字号、窗口位置/大小、透明模式状态**各自独立保存**,
切换书目互不干扰,重启 DSH 后自动恢复。
### 📖 阅读体验
- **字幕条式阅读**:窗口默认为约两行高的迷你字幕条,放在角落不挡视线;拖动四边/
右下角拖柄可任意放大,变成舒适的多行阅读窗。
- **多方式翻页**:
- 鼠标滚轮滑动逐行翻页
- 方向键 `↑`/`↓` 逐行、`←`/`→` 整页
- 底栏 `上一页` / `下一页` 按钮
- **页码显示**:底栏显示 `第 X / Y 页`(按当前窗口大小计算的"一屏一页"),读到
末尾显示"已到末尾"。
- **字号调节**:`A−` / `A+` 按钮,或 `Ctrl + =` / `Ctrl + -` 快捷键,范围 12–32px。
### 🧭 章节与搜索
- **章节导航**:点标题栏 `章` 打开章节列表,自动识别常见的章节标题格式:
`第X章` / `第X节` / `第X回` / `第X卷` / `第X部` / `第X集` / `第X篇` / `Chapter N`,
当前章节高亮,点击一键跳转。
- **全文搜索**:`Ctrl+F` 或点标题栏 `搜` 打开搜索条,输入关键词回车搜索
(大小写不敏感,最多 200 条结果,带上下文片段),`↑上` / `↓下` 在结果间循环跳转。
### 🎨 透明模式
点标题栏 `透` 开启:窗口背景、边框、标题栏、底栏全部消失,**只剩下文字悬浮在
界面上**,彻底不挡内容。该模式下:
- 拖动文字即可移动位置
- 双击文字或按 `Esc` 退出透明模式
- 支持滚轮/方向键继续翻页阅读
- 透明模式下显示的行数(窗口高度一致的前提下)与普通模式相同,切换不跳动
### 🖱️ 窗口控制
- 标题栏拖动移动位置;窗口四边(上/下/左/右)+ 右下角拖柄均可拖动调整大小
(最小 140×90,约一行高)
- 窗口默认出现在页面右下角,打开后自动收进视口边缘
- 拖动窗口/悬浮球**不会**打断阅读进度(拖动结束后不会误触发翻页或重置)
---
## 📸 截图预览
---
## 📖 快速上手
1. 点击右下角 📖 悬浮球 → 阅读器展开
2. 标题栏点 `书` → `导入新书` → 选择一本 `.txt` 小说
3. 滚轮滚动开始阅读;`章` 跳章节;`Ctrl+F` 搜内容;`透` 进入透明模式
4. 看完合上——进度自动保存,下次打开接着读
## ⌨️ 快捷键一览
| 按键 | 功能 |
|---|---|
| `↑` / `↓` | 上一行 / 下一行 |
| `←` / `→` | 上一页 / 下一页 |
| `Ctrl+F` | 打开搜索 |
| `Ctrl+=` / `Ctrl+-` | 增大 / 减小字号 |
| `Esc` | 关闭搜索/章节/书架;退出透明模式 |
## 💾 数据存储
书籍与进度存储在 **`$DSH_HOME/novel-reader/`**(`$DSH_HOME` 通常是
`D:\dsh\.dsh`,以环境变量为准):
```
novel-reader/
├── books/.txt # 导入的小说原文(UTF-8)
├── books/.chapters.json # 章节索引(自动解析,可重建)
├── books.json # 书架元数据
└── progress.json # 每本书的进度/窗口偏好
```
数据只保存在本地,**不会上传**任何书籍内容。
## 🗑️ 卸载
```bash
node D:\dsh\node_modules\@deepseek-ai\dsh\lib\bin.js plugin --profile web remove dsh-novel-reader
```
重启后生效;`$DSH_HOME/novel-reader/` 下的书籍数据会保留(如需删除请手动清理)。
---
## 🧱 项目结构
```
dsh-novel-reader/
├── package.json # 插件清单(dsh.bundle / dsh.client 声明)
├── cordis.patch.yml # 插件注册行
├── lib/
│ ├── index.js # 主机半体:HTTP 路由 + 数据持久化(Node)
│ ├── client.js # 浏览器半体:悬浮窗 UI(手写 bundle,零构建依赖)
│ ├── store.js # 纯函数数据层:章节解析 / 全文搜索 / 原子写入
│ └── *.test.js # node:test 单元测试
└── README.md
```
- **主机半体**:Cordis 插件,注册 `/novel/books` `/novel/upload` `/novel/content`
`/novel/chapters` `/novel/search` `/novel/progress` 六个路由,文本与状态
原子写入磁盘。
- **浏览器半体**:注册进 DSH 的 `shell.overlay` 槽位,纯 `React.createElement`
手写,不依赖构建工具链,跟随 DSH 客户端模块系统加载。
- **测试**:`cd dsh-novel-reader && node --test lib/`(14 个用例:章节解析、
全文搜索、存储读写、路径穿越防护等)。
## 📄 License
MIT