mirror of
https://github.com/fancive/obsidian-parallel-reader.git
synced 2026-07-22 06:53:43 +00:00
Drop the self-contained/no-Python historical note and the contributor- focused tests/catalog.json paragraph; keep the gate command + TEST_LIVE=1 hint. Public README does not need internal test classification details. Change-Id: Ic7a2ed45af0ebeb3be227aed03079ce258ed30c2
6.9 KiB
6.9 KiB
Obsidian Parallel Reader
Obsidian 对照阅读插件 — 左边原文、右边 AI 摘要卡片,滚动联动、点击跳转。
English · 中文
灵感来自 这个 B 站视频 的阅读工作流演示。
功能
- 自适应切段 — LLM 自行判断主题边界,不依赖 markdown 标题。短段合并、长段拆分。
- 滚动联动 — 滚动编辑器时,右侧对应卡片自动高亮。
- 流式输出 — 支持 OpenAI Chat 和 Anthropic API 的 SSE 流式响应,生成时实时显示进度。
- 20+ Provider — Anthropic、OpenAI、Gemini、OpenRouter、Groq、DeepSeek、Moonshot、Ollama、LM Studio 等,还支持 Claude Code CLI 和 Codex CLI。
- 持久化缓存 — 按源文件 SHA-1 + 配置指纹缓存,重新打开秒出。内容或配置变更后显示"已过期"提示。
- Markdown 渲染 — 通过 Obsidian 的
MarkdownRenderer渲染,表格、加粗、代码、wikilink 均正常显示。 - 卡片编辑 — 右键任意卡片:复制、编辑、删除、跳转原文。
- 导出 — 保存为 Vault 中的 Markdown 文件,或复制到剪贴板。
- 中英双语 UI — 命令、设置、面板文案全部支持中文和英文。
快速开始
第一步:安装插件
- 打开 Release 页面,下载最新版的三个文件:main.js、manifest.json、styles.css
- 打开你的 Vault 文件夹,进入
.obsidian/plugins/(没有就新建),再创建一个叫parallel-reader的文件夹 - 把下载的三个文件放进去
- 打开 Obsidian → 设置 → 第三方插件 → 找到 Parallel Reader → 打开开关
找不到
.obsidian文件夹? macOS 在 Finder 里按Cmd+Shift+.显示隐藏文件;Windows 在文件资源管理器里勾选「显示隐藏的项目」。
第二步:配置 AI 服务
- 在 Obsidian 中打开 设置 → Parallel Reader
- 选择一个 Provider(比如 Anthropic、OpenAI、DeepSeek 等)
- 粘贴你的 API Key
- (可选)修改 模型
- 点击 Test 验证连接
搞定!打开任意笔记,按 Cmd/Ctrl+P 调出命令面板,运行 「Parallel Reader: 为当前笔记生成对照笔记」 即可。
支持的 Provider 一览
| Provider | 说明 |
|---|---|
| Anthropic | 默认推荐 |
| OpenAI | GPT 系列 |
| Google Gemini | Gemini 系列 |
| OpenRouter / Groq / DeepSeek / Moonshot 等 | OpenAI 兼容格式 |
| Ollama / LM Studio | 本地模型,无需 API Key |
| 自定义端点 | 任何 OpenAI 或 Anthropic 兼容的 API |
CLI 模式(进阶)
如果你本地装了 Claude Code 或 Codex,在设置里切换后端即可,插件会自动找到安装位置。万一自动探测失败,可以手动填写路径。
使用
| 操作 | 效果 |
|---|---|
| 点击卡片 | 跳转到原文对应位置 |
| 右键卡片 | 上下文菜单:复制、编辑、删除、跳转 |
| 滚动编辑器 | 右侧卡片自动高亮 |
Alt+↑ / Alt+↓ |
在卡片间导航 |
Enter(摘要面板内) |
跳转到当前卡片原文 |
| Ribbon 图标 | 打开对照面板 |
| 文件右键菜单 | 生成 / 重新生成 / 清除缓存 |
原理
LLM 返回结构化 JSON:
{
"cards": [
{
"title": "短标题",
"anchor": "从原文逐字复制的引用,用于定位",
"gist": "一句话领读",
"bullets": ["支撑要点 1", "支撑要点 2"]
}
]
}
anchor 是滚动联动的核心 — 通过 indexOf 加多级容错定位行号,不依赖标题。
gist + bullets 兼顾概览和细节 — 纯散文太密,纯列表太碎。
开发
npm install
npm run dev # watch 模式
npm run build # 生产构建
npm run typecheck # TypeScript strict 模式
npm run lint # Biome
npm test # 构建 + 类型检查 + 测试
npm run test:unit
npm run test:component
npm run test:contract
npm run test:e2e # 打包插件 + 临时 Vault smoke
CI / 发布前跑一次 contract gate 留证据:
bash .e2e/gate.sh --json # 写出 .e2e/artifact.json(已 gitignore)
TEST_LIVE=1 可开启真实本地 Vault / provider 检查。