Skip to content

About

AI阅读器

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

xifeng 阅读

version tests PWA

本地电子书阅读器(Web 应用)。核心闭环:导入一本书 → 舒服地读完 → 下次打开接着读。

产品设计见 docs/产品设计文档.md,技术方案见 docs/技术方案.md,迭代规划见 docs/功能迭代计划.md。

功能

  • 导入 TXT / EPUB / Markdown / HTML / PDF(多选批量导入,拖拽即可)
  • TXT 自动识别 UTF-8 / GB18030(含 GBK)/ Big5 / UTF-16,可手动指定编码
  • EPUB 解析真实章节与目录、提取封面与作者(零依赖自研解析,见 V5.0 方案)
  • PDF 原版阅读:导入时连原文件一起保存,阅读页默认显示 PDF 原来的样子(版式 / 图片 / 表格都在),可一键切到文字视图做搜索、划线、朗读(见 V6.2 方案)
  • 书库:每本书的封面就是它的第一页(PDF 渲染首页 / 文本排版首段 / EPUB 自带封面),另有书名、阅读进度、最后阅读时间、搜索/排序/重命名/批量删除、阅读时长统计(今日/本周/累计)
  • 阅读页:分页 / 连续滚动两种模式;按钮 / 键盘 / 点按区域翻页;自动翻页;TTS 朗读(读完自动翻页)
  • 排版:字号、行距、段距、页边距、首行缩进、两端对齐、字体预设与自定义字体
  • 主题:日间 / 护眼 / 夜间
  • 导航:章节目录(内置 + 自定义正则)、书签、全文搜索(页面内高亮)、划线笔记(可导出 Markdown,见 V4.0 方案)
  • 划词翻译(V6.4):选中英文即出中文(单词给义项 + 所在整句对照),可一键存为想法;目标语言可设(见 V6.4 方案)
  • 译文浮卡(V6.5):鼠标移到别处停下就自动收起,不用再点 ✕;不动鼠标读译文时不会消失(见 V6.5 方案)
  • 生词本(V6.6):查词浮卡一键「★ 生词」收藏,自动附带所在整句语境与出处;阅读菜单独立「生词」页签支持回看出处、移出生词、导出 Markdown / Anki CSV(见 V6.6 方案)
  • 学习资料中心(V6.7):按书籍 / 章节整理批注、笔记和生词,支持全文搜索、筛选、Markdown / CSV 导出、回到原文及本地间隔复习
  • 科学复习(V6.8):艾宾浩斯遗忘曲线排期(1/2/4/7/15/30 天递进、毕业进 90 天维护、遗忘回退不归零)、生词卡记忆强度百分比与复习统计条(今日到期 / 学习中 / 已掌握 / 连续天数)、生词卡与翻译浮卡一键发音、TTS 朗读语言跟随书籍 + 语速档位(见 V6.8 方案)
  • 进度自动保存,重新打开精确续读;进度条拖动跳转任意位置
  • PWA 可安装,离线可读;备份导出 / 导入(全量 JSON,含 PDF 原件与生词本)

当前版本

V6.8 科学记忆与复习 ✅

  • 艾宾浩斯遗忘曲线排期:V6.7 的固定间隔升级为经典记忆周期 1 → 2 → 4 → 7 → 15 → 30 天, 六次记住后毕业进入长期记忆(90 天维护间隔); 忘了不再归零 —— 级别回退 2 级(留存是指数衰减不是清零)、明天重新见面。
  • 记忆强度展示:生词卡按 R = e^(-t/S) 显示"这个词条大概还记得几成"—— 刚复习完 100%,随时间衰减,级别越高衰减越慢。
  • 复习统计条:学习资料中心新增"今日到期 / 学习中 / 已掌握 / 连续复习天数"; 今天没复习不断签,断档一天归零重计。
  • 生词发音(🔊):生词卡与翻译浮卡均可朗读,中文词 zh-CN、英文词 en-US 自动判断。
  • TTS 语言跟随书籍:英文书用英文语音引擎(EPUB 元信息优先,其余按正文抽样判断); 设置页新增 0.75×~2× 朗读语速档位。
  • 数据模型不变(DB v7):复习字段原地升级,V6.7 老数据无需迁移。

完整设计见 docs/V6.8-科学记忆与复习方案.md。

V6.7 学习资料中心与间隔复习 ✅

  • 统一整理:书库新增学习资料中心,汇集所有书籍的划线批注、笔记与生词,按书籍、章节和资料类型筛选。
  • 搜索与导出:可搜索原文、笔记、生词、释义和语境;当前筛选结果支持导出 Markdown 或 CSV。
  • 回到原文:每条资料保留书籍字符偏移,可从资料中心直接跳回阅读位置。
  • 本地间隔复习:生词卡间隔复习;遗忘时安排次日重试,复习状态保存在 IndexedDB。
  • 跨书出处:同一生词仍为一张卡,保留各书中的出现位置与语境。

V6.6 生词本(收集·回看·导出) ✅

  • 查完词不再"阅后即丢":翻译浮卡提供「★ 生词」按钮,点击立即收录,并在浮卡展示 ★ 生词 徽标。
  • 语境与出处同存:不仅存词和释义,还自动带上**所在整句(语境)**与字符偏移;重复查词自动累加查词次数(lookups),并刷新为最新阅读语境。
  • 阅读菜单「生词」页签:按最新收藏时间倒序浏览当前书的生词;点击条目或「回看」即可平滑跳转回阅读现场;支持随时单条移出生词。
  • 导出双通道:支持一键导出 Markdown 笔记(人读)与带有 UTF-8 BOM 的 Anki 兼容 CSV(机器复习)。
  • IndexedDB 升级至 V7:新增 vocab store;删书时级联清理对应生词,全量备份与恢复无缝支持。

完整设计与对标见 docs/V6.6-生词本方案.md。

V6.5 译文浮卡自动收起 ✅

  • 查完一个词继续读时,把鼠标移到别的段落停下,译文卡自动消失 —— 不必抬手点 ✕。
  • 判定由三条件共同决定(core/dismiss.ts,纯函数可测):浮卡出现满 600ms、 指针真的移动过(≥12px)、停在卡外达 500ms;指针停在卡内或指针没动过都不会收起。
  • 点击正文 / 滚动 / 翻页 / 拖进度条 / 开菜单 / 切换原版·文字视图 → 同样立即收起。

完整设计见 docs/V6.5-翻译浮卡自动消失方案.md。

V6.4 划词翻译 ✅

  • 选中文字 → 浮动工具栏多一个「🌐 译」→ 浮卡出译文;英文书直接译成中文, 中文内容也能译成英文(目标语言可固定,默认自动判断)。
  • 单词不糊弄:动名词/分词(beginning/running)机器翻译只给词源义, 本地表补上常见义;多义词(bank)保留接口结果并附「也作:岸」; 再补一次所在整句的翻译做语境对照 —— 英文书里 beginning 在上下文里是什么意思,一眼就懂。
  • 长段落自动按句切分(免费接口单次 500 字符上限);同一段重复选中走缓存不重复请求; 接口挂了只影响这张浮卡,阅读 / 批注 / 续读一切照旧。
  • 「存为想法」把译文写进批注 note,随 Markdown 一起导出。
  • 实测样本:Gutenberg 公版《Alice's Adventures in Wonderland》(英文,14.8 万字符,随仓入库)。

完整设计、接口选型实测与取舍见 docs/V6.4-划词翻译方案.md。

V6.3 书架封面(每本书的第一页) ✅

  • 封面 = 打开这本书看到的第一眼:PDF 用原件渲染第 1 页,EPUB 用书内自带封面, TXT / MD / HTML 把正文首段排版成书页(与阅读页同一套字体)。
  • 导入时顺手生成;老书进书库后自动补齐(一本本串行,生成一张显示一张)。
  • 任何失败都不影响导入:退回渐变色块封面,绝不挡住书。
  • 封面 400×560(5:7,与卡片一致)、单张 7–60 KB。

完整设计见 docs/V6.3-书架封面方案.md。

V6.2 PDF 原版阅读 ✅

  • 导入 PDF 时把原文件整份存进 pdfFiles(DB v6),不再只留抽出的文字; 一本 3 页的 PDF 导入仍在秒级完成(导入期不再需要 canvas)。
  • 阅读页默认显示原版页面:pdf.js 按当前显示尺寸实时渲染当前页, 版式 / 图片 / 表格 / 公式原样呈现;×4 放大也是原生清晰度(不是拉伸位图)。
  • 底栏「原版 / 文字」一键切换:搜索、划线、批注、朗读在文字视图照常可用, 切换时按字符偏移带过位置,进度条 / 书签 / 目录跳转两视图通用。
  • 纯扫描版 PDF 只有原版视图(没有文字层),并明确提示文字功能不可用; V6.1 存下的按页位图仍兼容可读。
  • IndexedDB 升到 V6(新增 pdfFiles);备份导出连原件一起带走。

完整设计见 docs/V6.2-PDF原版阅读方案.md。

历史版本:

版本 主题 标记
v6.8.0 科学记忆与复习(艾宾浩斯周期 + 发音 + 统计 + TTS 语言跟随) ✅ 当前
v6.7.0 学习资料中心(跨书整理 + 搜索导出 + 间隔复习) ✅
v6.6.0 生词本(查词收集 + 整句语境 + 回看与导出) ✅
v6.5.0 译文浮卡自动收起(移开即消失) ✅
v6.4.0 划词翻译(英文→中文,含单词语境) ✅
v6.3.0 书架封面(每本书的第一页) ✅
v6.2.0 PDF 原版阅读(原文件入库 + 按需渲染 + 双视图) ✅
v6.1.0 扫描版 PDF 按页位图阅读 ✅
v6.0.0 PDF 支持(pdf.js 按需加载) ✅
v5.0.0 多格式导入(EPUB / MD / HTML + 批量) ✅
v4.0.0 批注与笔记体系(6 色 × 4 样式 + 容错锚定) ✅
v3.0.0 划线笔记 MVP + TTS 朗读 ✅
v2.1.0 PWA 可安装 + 滚动阅读 ✅
v2.0.0 书库管理 + 阅读统计 + 备份导出 ✅
v1.1–v1.3 主题 / 章节切分 / 排版净化 ✅
v1.0 MVP(导入 → 阅读 → 续读) ✅

运行

需要 Node ≥ 20。

npm install
npm run dev        # 开发(http://localhost:5173)
npm run test       # Vitest 单元测试(299 例)
npm run build      # 产出纯静态文件到 dist/
npm run preview    # 本地预览构建产物

首次跑 dev / build / test 前,会自动执行 npm run sync:pdfjs 把 node_modules/pdfjs-dist/{cmaps,standard_fonts} 铺到 public/pdfjs/, 保证中文 PDF(Type0 + 预定义 CMap)能在浏览器里被解出文字。

注意:IndexedDB 在 file:// 协议下不可用,请通过 http(s) / localhost 访问,不要直接双击打开 HTML。

结构

src/
├─ main.tsx / App.tsx        # 入口;书库 / 学习资料 / 阅读视图切换;PWA 注册
├─ pages/
│  ├─ LibraryPage.tsx        # 书库:导入、列表、管理、备份、统计
│  ├─ StudyMaterialsPage.tsx  # 学习资料:跨书筛选、搜索、导出与间隔复习
│  ├─ ReaderPage.tsx         # 阅读页:分页/滚动渲染、翻页、划线、TTS
│  └─ ReaderMenu.tsx         # 阅读菜单:目录/书签/笔记/搜索/设置
├─ core/                     # 纯逻辑层,框架无关、可单测
│  ├─ importers/             # V5.0 多格式导入(zip/epub/markdown/html)+ V6.0 PDF(pdf.js 按需加载)
│  ├─ highlight.ts           # V4.0 批注模型与三层锚定
│  ├─ encoding.ts            # 编码探测与解码(支持强制指定)
│  ├─ pagination.ts          # Measurer 接口 + PageMap 分页引擎
│  ├─ toc.ts                 # 章节切分(内置 + 自定义正则)
│  ├─ search.ts              # 全文搜索
│  ├─ purify.ts              # 导入净化(推广行清理)
│  ├─ bookRepository.ts      # IndexedDB 读写(含批注、生词及复习状态)
│  ├─ studyMaterials.ts      # 学习资料聚合、筛选与 Markdown / CSV 导出
│  ├─ cover.ts               # 书架封面:正文摘录/折行 + canvas 绘制
  ├─ bookCovers.ts          # 封面生成编排(PDF 首页 / EPUB 封面 / 文本首段)
  ├─ pdfNav.ts              # PDF 页码 ↔ 字符偏移换算
│  ├─ pdfOriginal.ts         # PDF 原版页面按需渲染(清晰度/内存上限/取消)
│  ├─ scanView.ts            # 位图等比显示几何(缩放不变形)
  ├─ translate.ts           # 划词翻译:方向判断/切分/缓存/单词兜底义
  ├─ dismiss.ts             # 浮层"移开即收起"判定(三条件,纯函数)
│  └─ settings.ts            # 阅读设置(localStorage + CSS 变量)
└─ styles/theme.css          # CSS 变量主题(日间/护眼/夜间)

demo/ 是早期原生 JS 原型归档,仅供对照,不参与构建。 test-fixtures/ 存放 PDF/EPUB 等二进制样本,供 *.test.ts 端到端断言用。

文档地图

About

AI阅读器

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages