English · 简体中文

# dsh-paperpanel 把本机文件夹里的**论文(PDF/Word/TXT/MD)与数据(CSV/TSV/Excel)**整理成 Zotero 式数据库, 以 **DSH Web 右侧悬浮抽屉**形态呈现:右侧看文献、屏幕中间阅读、边读边做笔记、表格即改即存。 ## 功能特性 - **数据库面板**(右侧悬浮抽屉,`shell.overlay`,不占用内置 `details` 席位): 列表 + 分类筛选(全部/论文/数据/笔记),头部「导入」支持选文件夹[支持导入整个文件夹]或单文件导入(可选目标目录,重名自动加时间戳),导入后点击刷新,即可查看。 ![alt text](assets/e2dc95d9accc81b4e0fc10e9c7de059e.png) ![alt text](assets/32c759f288caf9ea812734c81cb026db.png) - **屏幕中间阅读**:双击 PDF/Word 条目弹出中间阅读窗口,支持**缩放**(− / + / 重置)、**黑/白背景切换**(按钮与文字随背景联动高对比)。 - **PDF**:`pdf.js` 渲染(多页、可选中文本层) ![alt text](assets/image-1.png) - **Word**:`docx-preview` 渲染(保留标题/加粗/表格);老 `.doc` 提示另存为 `.docx` - **划词笔记**:选中 PDF/Word 里的文本 → 点「记笔记」→ 引用以 Markdown 引用格式追加到笔记 - **边读边写**:阅读窗口右侧笔记栏,随时写、随时保存;每条目对应同目录 `同名.notes.md` ![alt text](assets/image.png) - **表格工作台**:CSV/TSV/Excel(.xlsx/.xls) 可编辑单元格并保存回原文件(保存前自动备份 `.bak`), 支持排序、搜索、分页、ECharts 图表(柱状/折线/饼图)与列统计;超过 2000 行自动只读 ![alt text](assets/image-2.png) - **让 AI 讲解**:把含路径的指令送进宿主输入机,agent 用 `paperpanel_read` 读取后讲解/总结 - 客户端免打包器:`client/paperpanel-client.js`(CommonJS 单文件)→ `scripts/build-client.mjs` 生成 `client.js`; 前端第三方库(JSZip/docx-preview/SheetJS/ECharts/pdf.js)构建时内联,离线可用 - 扫描/读取内核:`lib/scan.mjs`、`lib/read.mjs`(纯 Node,零第三方依赖) ## 安装 ```sh # 方式一:npm(发布后) dsh plugin --profile web add dsh-paperpanel # 方式二:GitHub 源码 dsh plugin --profile web add github:Floatingfur/dsh-paperpanel # 方式三:本地开发(link) # 在 web profile 的 package.json dependencies 加 "dsh-paperpanel": "link:<本仓库绝对路径>" # 并在 dsh.profile.bundles 里加 "dsh-paperpanel",重启 dsh web ``` 安装后重启 `dsh web`,右侧即出现「数据库」抽屉。 ## 配置数据目录 在 `cordis.patch.yml` 的 `config.libraryRoots` 里配置扫描根目录(默认示例指向 `samples`)。 把论文/数据放进这些目录(或其子目录)即可,右侧抽屉点「刷新」后可见;或直接用「导入」按钮搬文件进来。 ## 本地命令 ```bash npm run build:client # 改过 client/ 源码后重新生成 client.js ``` 启动 dsh(自动清理占用 3080 端口的旧实例,避免 EADDRINUSE 多实例冲突): ```powershell powershell -NoProfile -ExecutionPolicy Bypass -File scripts\start-dsh.ps1 ``` ## 目录结构 ``` dsh-paperpanel/ package.json # exports / dsh.bundle / dsh.client cordis.patch.yml # bundle 插入声明(默认 libraryRoots) index.mjs # Node half:HTTP 路由 + agent 工具 paperpanel_search / paperpanel_read lib/scan.mjs # 递归扫描内核 lib/read.mjs # 文本/CSV 预览内核 client/paperpanel-client.js # 客户端源码(右侧抽屉 + 中间阅读窗口) scripts/build-client.mjs # 免打包器构建(内联 vendor) scripts/start-dsh.ps1 # 启动脚本(自动清理 3080 端口旧实例) scripts/vendor/ # 前端第三方库 UMD 单文件(构建时内联进 client.js) client.js # 构建产物(随插件分发) samples/ # 冒烟样例 ``` ## 后端 API(同源 fetch,无需 token) - `GET /paperpanel/api/roots` → `{ ok, roots }` - `GET /paperpanel/api/manifest` → `{ ok, scannedAt, roots, itemCount, items[] }` - `GET /paperpanel/api/preview?path=…` → 文本预览 - `GET /paperpanel/api/file?path=…` → 原文件(PDF/Word 渲染、表格工作台读取用) - `POST /paperpanel/api/import?name=…&dir=…` → 导入文件到数据目录(白名单校验) - `POST /paperpanel/api/save` → `{ path, content, encoding }` 写回文件(先备份原文件为 `.bak`) - `GET/POST /paperpanel/api/note?path=…` → 读取/保存该条目的 `.notes.md` 笔记 ## Agent 工具 - `paperpanel_search`:按标题/路径关键词或类型检索清单。 - `paperpanel_read`:读取某条目内容(文本正文 / CSV 表头与行 / PDF 元数据)。 ## 说明 - 右栏 `details` 是 single 席位,本插件刻意不占用;改用 `shell.overlay`(官方 additive 浮层席位)。 - 抽屉为 root 作用域,`inputActions` 由会话头按钮桥接进来——无活跃会话时「让 AI 讲解」置灰。 - 保存表格/笔记/导入均做根目录白名单校验;表格保存前自动备份原文件为 `原文件.bak`。 - `*.notes.md` 笔记文件不进入扫描列表,避免污染数据库条目。