# dsh-novel-reader 📖 **在 DeepSeek Harness Web 界面中摸鱼看小说的插件。** 在等待模型运行的间隙,把小说 `txt` 导入进来,用一个可拖动、可调整大小的悬浮窗 分页阅读——窗口小到不挡聊天界面,还能一键切换成"纯文字透明模式"彻底隐形。 [![dsh-plugin](https://img.shields.io/badge/dsh--plugin-v1.1.1-blue)](https://github.com/topics/dsh-plugin) [![GitHub release](https://img.shields.io/github/v/release/1024483906-pixel/dsh-novel-reader?include_prereleases&sort=semver&label=release)](https://github.com/1024483906-pixel/dsh-novel-reader/releases) [![License](https://img.shields.io/github/license/1024483906-pixel/dsh-novel-reader)](LICENSE) [![GitHub repo](https://img.shields.io/badge/github-dsh--novel--reader-181717?logo=github)](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