Skip to content

feat(reader): 支持 EPUB 嵌入字体显示(桌面端 + 移动端) - #636

Open
k6G52m4Dz75W wants to merge 1 commit into
codedogQBY:mainfrom
k6G52m4Dz75W:main
Open

feat(reader): 支持 EPUB 嵌入字体显示(桌面端 + 移动端)#636
k6G52m4Dz75W wants to merge 1 commit into
codedogQBY:mainfrom
k6G52m4Dz75W:main

Conversation

@k6G52m4Dz75W

@k6G52m4Dz75W k6G52m4Dz75W commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

背景

部分 EPUB 会内嵌字体(通过 @font-face 引用书内的 ttf/otf/woff/woff2,甚至带 IDPF 混淆),例如内嵌中文书法体、艺术字标题、或西文衬线体。此前 ReadAny 为了保证字体主题统一,在渲染时对所有元素强制注入 body * { font-family: var(--readany-font-family) !important },导致书籍嵌入字体永远无法显示——即使引擎层(foliate-js)已经把 @font-face 字体正确加载成 blob URL(含 IDPF 去混淆)。

改动

新增全局阅读设置 useBookFonts(使用书籍字体),默认开启,桌面端与移动端一致:

  • 开启(默认):移除 body * 的全元素字体覆盖,仅保留 html/body 上的主题字体作为基础。书内显式指定了 font-family 的元素(如嵌入字体段落)正常显示嵌入字体,未指定字体的正文仍使用用户选择的字体主题。
  • 关闭:维持原有行为,全元素强制主题字体。

具体变更:

文件 说明
共享 core/src/types/book.ts ViewSettings 增加可选 useBookFonts
共享 core/src/stores/settings-store.ts 默认值 + 迁移回填(老用户默认开启,手动关闭不会被覆盖)
桌面 app/.../FoliateViewer.tsx 样式生成条件化 + 切换即时生效
桌面 app/.../settings/ReadSettings.tsx 阅读设置里加开关
移动端 app-expo/.../ReaderScreen.tsxuse-reader-bridge.ts 桥接传递 useBookFonts
移动端 app-expo/assets/reader/reader.template.html + reader.html 渲染逻辑条件化(与桌面一致),已重新构建
移动端 app-expo/.../ReaderSettingsPanel.tsx 阅读设置面板加开关
i18n 7 个语言的 settings.json / reader.json 文案

影响面

  • 字号 / 行高 / 段距等覆盖逻辑完全不变;
  • PDF、CBZ 及固定布局 EPUB 不受影响(原有路径已跳过字体覆盖);
  • foliate-js 引擎零改动。

验证

  • 桌面端:真实运行 dev 版,确认开关默认开启、嵌入字体正确显示、关闭后回退主题字体。
  • 移动端:用真实构建产物 reader.html 在浏览器中加载含嵌入字体的测试 epub 实测:
状态 body * 覆盖规则 嵌入字体段落 嵌入字体已加载
使用书籍字体=开 不存在 TestEmbedded, serif(Brush Script 手写体) true
使用书籍字体=关 存在 主题字体 false

测试建议(Reviewer)

  1. 准备一本带嵌入字体的 EPUB(如内嵌艺术字/书法字体的书)。
  2. 桌面端:打开书 → 阅读设置 → 确认「使用书籍字体」默认开启且嵌入字体显示;关闭后观察回退。
  3. 移动端:真机/模拟器 dev build,阅读设置面板中同样操作。
  4. 老用户升级后首次启动,设置会被自动迁移为默认开启。

Add a global read setting 'useBookFonts' (default on) that lets the reader's own fonts - including fonts embedded in EPUBs - render where the book specifies them, instead of forcing the app font theme onto every element.

- ViewSettings: add optional useBookFonts
- Desktop (FoliateViewer): only inject the body* font-family override when useBookFonts is off; re-apply styles live on toggle
- Mobile (reader.template.html + build reader.html): same conditional override, wired through ReaderScreen/use-reader-bridge
- Settings UI + toggle in desktop ReadSettingsPanel and mobile ReaderSettingsPanel
- Store defaults + migration backfill for existing users (old persisted settings default to on)
- i18n: settings.json and reader.json across all 7 locales
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant