Floatingfur/dsh-paperpanel

dsh-paperpanel

Papers and data, unified inside DSH.

待分类dsh-plugins

English · 简体中文

dsh-paperpanel

把本机文件夹里的**论文(PDF/Word/TXT/MD)与数据(CSV/TSV/Excel)**整理成 Zotero 式数据库, 以 DSH Web 右侧悬浮抽屉形态呈现:右侧看文献、屏幕中间阅读、边读边做笔记、表格即改即存。

功能特性

  • 数据库面板(右侧悬浮抽屉,shell.overlay,不占用内置 details 席位): 列表 + 分类筛选(全部/论文/数据/笔记),头部「导入」支持选文件夹[支持导入整个文件夹]或单文件导入(可选目标目录,重名自动加时间戳),导入后点击刷新,即可查看。 alt text alt text
  • 屏幕中间阅读:双击 PDF/Word 条目弹出中间阅读窗口,支持缩放(− / + / 重置)、黑/白背景切换(按钮与文字随背景联动高对比)。
    • PDF:pdf.js 渲染(多页、可选中文本层) alt text
    • Word:docx-preview 渲染(保留标题/加粗/表格);老 .doc 提示另存为 .docx
  • 划词笔记:选中 PDF/Word 里的文本 → 点「记笔记」→ 引用以 Markdown 引用格式追加到笔记
  • 边读边写:阅读窗口右侧笔记栏,随时写、随时保存;每条目对应同目录 同名.notes.md alt text
  • 表格工作台:CSV/TSV/Excel(.xlsx/.xls) 可编辑单元格并保存回原文件(保存前自动备份 .bak), 支持排序、搜索、分页、ECharts 图表(柱状/折线/饼图)与列统计;超过 2000 行自动只读 alt text
  • 让 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,零第三方依赖)

安装

# 方式一: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)。 把论文/数据放进这些目录(或其子目录)即可,右侧抽屉点「刷新」后可见;或直接用「导入」按钮搬文件进来。

本地命令

npm run build:client          # 改过 client/ 源码后重新生成 client.js

启动 dsh(自动清理占用 3080 端口的旧实例,避免 EADDRINUSE 多实例冲突):

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 笔记文件不进入扫描列表,避免污染数据库条目。