From 83a407bc10319aff01105e9c7d4c98bf6c9757dd Mon Sep 17 00:00:00 2001 From: Amruth Pillai Date: Sun, 10 May 2026 23:54:37 +0200 Subject: [PATCH] fix: add special hyphenation callback for Chinese script in PDF font registration --- apps/web/vite.config.ts | 1 + packages/pdf/src/hooks/use-register-fonts.test.ts | 2 ++ packages/pdf/src/hooks/use-register-fonts.ts | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/apps/web/vite.config.ts b/apps/web/vite.config.ts index ca49634c4..914d6b1f3 100644 --- a/apps/web/vite.config.ts +++ b/apps/web/vite.config.ts @@ -58,6 +58,7 @@ export default defineConfig({ server: { host: true, + strictPort: true, port: Number.parseInt(process.env.PORT ?? "3000", 10), }, diff --git a/packages/pdf/src/hooks/use-register-fonts.test.ts b/packages/pdf/src/hooks/use-register-fonts.test.ts index b6df0d740..7d66dbf40 100644 --- a/packages/pdf/src/hooks/use-register-fonts.test.ts +++ b/packages/pdf/src/hooks/use-register-fonts.test.ts @@ -44,6 +44,7 @@ describe("registerFonts", () => { it("registers CJK PDF fallbacks for normal and italic text styles", async () => { const registerSpy = vi.spyOn(Font, "register").mockImplementation(() => {}); + vi.spyOn(Font, "registerHyphenationCallback").mockImplementation(() => {}); const cjkFallbackSource = getWebFontSource("Noto Serif SC", "400", false); const { registerFonts } = await import("./use-register-fonts"); @@ -71,6 +72,7 @@ describe("registerFonts", () => { it("uses the full CJK font source for synthetic italic variants when the CJK font is primary", async () => { const registerSpy = vi.spyOn(Font, "register").mockImplementation(() => {}); + vi.spyOn(Font, "registerHyphenationCallback").mockImplementation(() => {}); const cjkFallbackSource = getWebFontSource("Noto Serif SC", "400", false); const { registerFonts } = await import("./use-register-fonts"); diff --git a/packages/pdf/src/hooks/use-register-fonts.ts b/packages/pdf/src/hooks/use-register-fonts.ts index 68f294253..50f324c62 100644 --- a/packages/pdf/src/hooks/use-register-fonts.ts +++ b/packages/pdf/src/hooks/use-register-fonts.ts @@ -65,6 +65,11 @@ const resolvePdfTypography = (typography: Typography): Typography => { }; export const registerFonts = (typography: Typography): PdfTypography => { + Font.registerHyphenationCallback((word) => { + if (word.match(/\p{Script=Han}/u)) return word.split("").flatMap((l) => [l, ""]); + return [word]; + }); + const pdfTypography = resolvePdfTypography(typography); const bodyFontFamily = pdfTypography.body.fontFamily; const headingFontFamily = pdfTypography.heading.fontFamily;