From 7c67390707f797b880012bacffa0b4d12476b335 Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Tue, 1 Sep 2026 11:58:00 +0300 Subject: [PATCH] fix(cli): prepare fonts across complete documents --- packages/core/src/canvas/renderer/fonts.ts | 2 +- packages/core/src/rpc/read-commands.ts | 4 ++-- packages/core/src/text/font/status.ts | 15 +++++++++------ packages/core/src/text/prepare.ts | 3 +-- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/packages/core/src/canvas/renderer/fonts.ts b/packages/core/src/canvas/renderer/fonts.ts index b98f103ae..6a555383f 100644 --- a/packages/core/src/canvas/renderer/fonts.ts +++ b/packages/core/src/canvas/renderer/fonts.ts @@ -10,7 +10,7 @@ import { SIZE_FONT_SIZE } from '#core/constants' import { fontManager } from '#core/text/fonts' -import { collectGraphFontRequirements } from '#core/text/requirements' +import { collectGraphFontRequirements, collectNodeFontFaces } from '#core/text/requirements' import { missingGraphFontScripts } from '#core/text/resolved-requirements' import type { FontResolutionSnapshot } from '#core/text/resolver' diff --git a/packages/core/src/rpc/read-commands.ts b/packages/core/src/rpc/read-commands.ts index 23478e195..4e6bd4624 100644 --- a/packages/core/src/rpc/read-commands.ts +++ b/packages/core/src/rpc/read-commands.ts @@ -80,8 +80,8 @@ export const infoCommand: RPCCommand = { export const fontStatusCommand: RPCCommand = { name: 'font-status', execute: async (graph) => { - const pageId = graph.getPages()[0]?.id ?? graph.rootId - return prepareGraphFonts(graph, pageId, [pageId]) + const pageIds = graph.getPages().map((page) => page.id) + return prepareGraphFonts(graph, pageIds[0] ?? graph.rootId, pageIds) } } diff --git a/packages/core/src/text/font/status.ts b/packages/core/src/text/font/status.ts index 60fae7a4e..e9438b0d0 100644 --- a/packages/core/src/text/font/status.ts +++ b/packages/core/src/text/font/status.ts @@ -34,13 +34,15 @@ function faceKey(family: string, style: string): string { return `${family}\0${style}` } -function pageTextNodes(graph: SceneGraph, pageId: string): SceneNode[] { - return graph.flattenTree(pageId).flatMap(({ node }) => (node.type === 'TEXT' ? [node] : [])) +function pageTextNodes(graph: SceneGraph, pageIds: readonly string[]): SceneNode[] { + return pageIds.flatMap((pageId) => + graph.flattenTree(pageId).flatMap(({ node }) => (node.type === 'TEXT' ? [node] : [])) + ) } -function collectFaceUses(graph: SceneGraph, pageId: string): MutableFontFaceUse[] { +function collectFaceUses(graph: SceneGraph, pageIds: readonly string[]): MutableFontFaceUse[] { const uses = new Map() - for (const node of pageTextNodes(graph, pageId)) { + for (const node of pageTextNodes(graph, pageIds)) { for (const { family, style } of collectNodeFontFaces(node)) { const key = faceKey(family, style) const use = uses.get(key) ?? { @@ -97,10 +99,11 @@ function faceStatus(use: MutableFontFaceUse, manager: FontManager): DocumentFont export function documentFontStatus( graph: SceneGraph, - pageId: string, + pageId: string | readonly string[], manager: FontManager = fontManager ): DocumentFontStatus { - const faces = collectFaceUses(graph, pageId) + const pageIds = typeof pageId === 'string' ? [pageId] : pageId + const faces = collectFaceUses(graph, pageIds) .map((use) => faceStatus(use, manager)) .sort((a, b) => a.family.localeCompare(b.family) || a.style.localeCompare(b.style)) const issues = faces.filter((face) => face.status !== 'available') diff --git a/packages/core/src/text/prepare.ts b/packages/core/src/text/prepare.ts index 50784174b..738513447 100644 --- a/packages/core/src/text/prepare.ts +++ b/packages/core/src/text/prepare.ts @@ -20,6 +20,5 @@ export async function prepareGraphFonts( missingGraphFontScripts(requirements), requirements.characters ) - const status = documentFontStatus(graph, pageId) - return status + return documentFontStatus(graph, pageId) }