From e9c5ebb6968791fba531258e7835624ddc29ea25 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Tue, 31 Mar 2026 01:06:22 +0800 Subject: [PATCH] fix(fonts): fix Adobe font deobfuscation and CSS var fallbacks, closes #3662 (#3696) Two issues caused embedded EPUB fonts to fail: 1. Adobe font deobfuscation (http://ns.adobe.com/pdf/enc#RC) derived the XOR key from the wrong UUID. getUUID() picked the first UUID across all dc:identifier elements (e.g. Calibre's internal UUID) instead of the book's unique-identifier. Also fixed getElementById not working on DOMParser-parsed XML (no DTD), and made UUID regex case-insensitive. 2. transformStylesheet replaced generic font families (sans-serif, serif, monospace) with CSS var() references without fallback values. In fixed-layout iframes where setStyles doesn't inject the variables, the undefined var() invalidated the entire font-family declaration per CSS spec, causing all fonts to fall back to system defaults. Co-authored-by: Claude Opus 4.6 (1M context) --- apps/readest-app/src/utils/style.ts | 6 +++--- packages/foliate-js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/readest-app/src/utils/style.ts b/apps/readest-app/src/utils/style.ts index 9c0d6686..42280ca0 100644 --- a/apps/readest-app/src/utils/style.ts +++ b/apps/readest-app/src/utils/style.ts @@ -794,9 +794,9 @@ export const transformStylesheet = (css: string, vw: number, vh: number, vertica .replace(/([\s;])-o-user-select\s*:\s*none/gi, '$1-o-user-select: unset') .replace(/([\s;])user-select\s*:\s*none/gi, '$1user-select: unset') .replace(/(font-family\s*:[^;]*?)\bsans-serif\b/gi, '$1READEST_SS_PLACEHOLDER') - .replace(/(font-family\s*:[^;]*?)\bserif\b(?!-)/gi, '$1var(--serif)') - .replace(/READEST_SS_PLACEHOLDER/g, 'var(--sans-serif)') - .replace(/(font-family\s*:[^;]*?)\bmonospace\b/gi, '$1var(--monospace)') + .replace(/(font-family\s*:[^;]*?)\bserif\b(?!-)/gi, '$1var(--serif, serif)') + .replace(/READEST_SS_PLACEHOLDER/g, 'var(--sans-serif, sans-serif)') + .replace(/(font-family\s*:[^;]*?)\bmonospace\b/gi, '$1var(--monospace, monospace)') .replace(/([\s;])font-weight\s*:\s*normal/gi, '$1font-weight: var(--font-weight)') .replace(/([\s;])color\s*:\s*black/gi, '$1color: var(--theme-fg-color)') .replace(/([\s;])color\s*:\s*#000000/gi, '$1color: var(--theme-fg-color)') diff --git a/packages/foliate-js b/packages/foliate-js index 2300db0d..837c98fa 160000 --- a/packages/foliate-js +++ b/packages/foliate-js @@ -1 +1 @@ -Subproject commit 2300db0dee97dd4879e1c50e16464a56c9161669 +Subproject commit 837c98fae0c39d1cc1cc892408910c2135f8ad0b