postext 1.24.0 → 1.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -5
- package/dist/__tests__/bundle/cjkRulesPin.test.d.ts +2 -0
- package/dist/__tests__/bundle/cjkRulesPin.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/cjkRulesPin.test.js +78 -0
- package/dist/__tests__/bundle/cjkRulesPin.test.js.map +1 -0
- package/dist/__tests__/bundle/contextDefaultsBundle.test.d.ts +2 -0
- package/dist/__tests__/bundle/contextDefaultsBundle.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/contextDefaultsBundle.test.js +104 -0
- package/dist/__tests__/bundle/contextDefaultsBundle.test.js.map +1 -0
- package/dist/__tests__/bundle/designOverflowPin.test.js +4 -2
- package/dist/__tests__/bundle/designOverflowPin.test.js.map +1 -1
- package/dist/__tests__/bundle/flowColumnsPin.test.d.ts +2 -0
- package/dist/__tests__/bundle/flowColumnsPin.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/flowColumnsPin.test.js +40 -0
- package/dist/__tests__/bundle/flowColumnsPin.test.js.map +1 -0
- package/dist/__tests__/bundle/gridBalancingPin.test.d.ts +2 -0
- package/dist/__tests__/bundle/gridBalancingPin.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/gridBalancingPin.test.js +72 -0
- package/dist/__tests__/bundle/gridBalancingPin.test.js.map +1 -0
- package/dist/__tests__/bundle/inlineTableSplitPin.test.d.ts +2 -0
- package/dist/__tests__/bundle/inlineTableSplitPin.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/inlineTableSplitPin.test.js +43 -0
- package/dist/__tests__/bundle/inlineTableSplitPin.test.js.map +1 -0
- package/dist/__tests__/bundle/openerHeadFloatsPin.test.d.ts +2 -0
- package/dist/__tests__/bundle/openerHeadFloatsPin.test.d.ts.map +1 -0
- package/dist/__tests__/bundle/openerHeadFloatsPin.test.js +50 -0
- package/dist/__tests__/bundle/openerHeadFloatsPin.test.js.map +1 -0
- package/dist/__tests__/bundle.test.js +11 -1
- package/dist/__tests__/bundle.test.js.map +1 -1
- package/dist/__tests__/cjk/annotationsRender.test.js +5 -2
- package/dist/__tests__/cjk/annotationsRender.test.js.map +1 -1
- package/dist/__tests__/cjk/circledNumbers.test.d.ts +2 -0
- package/dist/__tests__/cjk/circledNumbers.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/circledNumbers.test.js +83 -0
- package/dist/__tests__/cjk/circledNumbers.test.js.map +1 -0
- package/dist/__tests__/cjk/gridBalancing.test.d.ts +2 -0
- package/dist/__tests__/cjk/gridBalancing.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/gridBalancing.test.js +227 -0
- package/dist/__tests__/cjk/gridBalancing.test.js.map +1 -0
- package/dist/__tests__/cjk/justifyRender.test.js +2 -1
- package/dist/__tests__/cjk/justifyRender.test.js.map +1 -1
- package/dist/__tests__/cjk/titleBreaks.test.d.ts +2 -0
- package/dist/__tests__/cjk/titleBreaks.test.d.ts.map +1 -0
- package/dist/__tests__/cjk/titleBreaks.test.js +76 -0
- package/dist/__tests__/cjk/titleBreaks.test.js.map +1 -0
- package/dist/__tests__/cjk/wordJoiner.test.js +13 -4
- package/dist/__tests__/cjk/wordJoiner.test.js.map +1 -1
- package/dist/__tests__/codeBlocks.test.js +1 -1
- package/dist/__tests__/defaults/stripContextDefaults.test.d.ts +2 -0
- package/dist/__tests__/defaults/stripContextDefaults.test.d.ts.map +1 -0
- package/dist/__tests__/defaults/stripContextDefaults.test.js +265 -0
- package/dist/__tests__/defaults/stripContextDefaults.test.js.map +1 -0
- package/dist/__tests__/design/cjkDesignDash.test.d.ts +2 -0
- package/dist/__tests__/design/cjkDesignDash.test.d.ts.map +1 -0
- package/dist/__tests__/design/cjkDesignDash.test.js +395 -0
- package/dist/__tests__/design/cjkDesignDash.test.js.map +1 -0
- package/dist/__tests__/design/cjkDesignText.test.d.ts +2 -0
- package/dist/__tests__/design/cjkDesignText.test.d.ts.map +1 -0
- package/dist/__tests__/design/cjkDesignText.test.js +130 -0
- package/dist/__tests__/design/cjkDesignText.test.js.map +1 -0
- package/dist/__tests__/design/cjkDesignTextRender.test.d.ts +2 -0
- package/dist/__tests__/design/cjkDesignTextRender.test.d.ts.map +1 -0
- package/dist/__tests__/design/cjkDesignTextRender.test.js +100 -0
- package/dist/__tests__/design/cjkDesignTextRender.test.js.map +1 -0
- package/dist/__tests__/exports.test.js +49 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/hardBreaks.test.js +1 -1
- package/dist/__tests__/headingInlineMarks.test.js +1 -1
- package/dist/__tests__/headingNumberSpans.test.d.ts +2 -0
- package/dist/__tests__/headingNumberSpans.test.d.ts.map +1 -0
- package/dist/__tests__/headingNumberSpans.test.js +96 -0
- package/dist/__tests__/headingNumberSpans.test.js.map +1 -0
- package/dist/__tests__/mathSizeMigration.test.js +2 -2
- package/dist/__tests__/multipleColumns.test.js +207 -0
- package/dist/__tests__/multipleColumns.test.js.map +1 -1
- package/dist/__tests__/parse/citations.test.js +29 -0
- package/dist/__tests__/parse/citations.test.js.map +1 -1
- package/dist/__tests__/pipeline/calloutInlineResourceGap.test.js +10 -6
- package/dist/__tests__/pipeline/calloutInlineResourceGap.test.js.map +1 -1
- package/dist/__tests__/pipeline/calloutOverflow.test.js +4 -2
- package/dist/__tests__/pipeline/calloutOverflow.test.js.map +1 -1
- package/dist/__tests__/pipeline/calloutSplitMinLinesChild.test.js +1 -1
- package/dist/__tests__/pipeline/calloutTallKeepTogether.test.js +6 -5
- package/dist/__tests__/pipeline/calloutTallKeepTogether.test.js.map +1 -1
- package/dist/__tests__/pipeline/colonListRoom.test.js +1 -1
- package/dist/__tests__/pipeline/compoundBreaks.test.js +1 -1
- package/dist/__tests__/pipeline/dashBreaks.test.js +1 -1
- package/dist/__tests__/pipeline/floatCitingPage.test.d.ts +2 -0
- package/dist/__tests__/pipeline/floatCitingPage.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/floatCitingPage.test.js +241 -0
- package/dist/__tests__/pipeline/floatCitingPage.test.js.map +1 -0
- package/dist/__tests__/pipeline/floatOverInlineResource.test.js +18 -6
- package/dist/__tests__/pipeline/floatOverInlineResource.test.js.map +1 -1
- package/dist/__tests__/pipeline/floatPlacement.test.js +3 -3
- package/dist/__tests__/pipeline/floatPlacement.test.js.map +1 -1
- package/dist/__tests__/pipeline/flowColumns.test.d.ts +2 -0
- package/dist/__tests__/pipeline/flowColumns.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/flowColumns.test.js +261 -0
- package/dist/__tests__/pipeline/flowColumns.test.js.map +1 -0
- package/dist/__tests__/pipeline/headingKeepFitEps.test.d.ts +2 -0
- package/dist/__tests__/pipeline/headingKeepFitEps.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/headingKeepFitEps.test.js +83 -0
- package/dist/__tests__/pipeline/headingKeepFitEps.test.js.map +1 -0
- package/dist/__tests__/pipeline/headingSplitOrphans.test.js +1 -1
- package/dist/__tests__/pipeline/inlineFigureSpace.test.js +1 -1
- package/dist/__tests__/pipeline/inlineTableSplit.test.d.ts +2 -0
- package/dist/__tests__/pipeline/inlineTableSplit.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/inlineTableSplit.test.js +238 -0
- package/dist/__tests__/pipeline/inlineTableSplit.test.js.map +1 -0
- package/dist/__tests__/pipeline/paragraphContainerTail.test.js +1 -1
- package/dist/__tests__/pipeline/raggedOptimal.test.js +1 -1
- package/dist/__tests__/pipeline/resolvedPaletteCopy.test.js +3 -2
- package/dist/__tests__/pipeline/resolvedPaletteCopy.test.js.map +1 -1
- package/dist/__tests__/pipeline/sideBoxAfterText.test.d.ts +2 -0
- package/dist/__tests__/pipeline/sideBoxAfterText.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/sideBoxAfterText.test.js +163 -0
- package/dist/__tests__/pipeline/sideBoxAfterText.test.js.map +1 -0
- package/dist/__tests__/prepareFonts.test.d.ts +2 -0
- package/dist/__tests__/prepareFonts.test.d.ts.map +1 -0
- package/dist/__tests__/prepareFonts.test.js +548 -0
- package/dist/__tests__/prepareFonts.test.js.map +1 -0
- package/dist/__tests__/svgFonts.test.d.ts +2 -0
- package/dist/__tests__/svgFonts.test.d.ts.map +1 -0
- package/dist/__tests__/svgFonts.test.js +286 -0
- package/dist/__tests__/svgFonts.test.js.map +1 -0
- package/dist/__tests__/verseLines.test.js +1 -1
- package/dist/__tests__/vertical/measurePaint.test.js +16 -0
- package/dist/__tests__/vertical/measurePaint.test.js.map +1 -1
- package/dist/bundle/adapters.d.ts +31 -7
- package/dist/bundle/adapters.d.ts.map +1 -1
- package/dist/bundle/adapters.js +113 -34
- package/dist/bundle/adapters.js.map +1 -1
- package/dist/bundle/codec.d.ts.map +1 -1
- package/dist/bundle/codec.js +37 -4
- package/dist/bundle/codec.js.map +1 -1
- package/dist/bundle/configVersion.d.ts +127 -10
- package/dist/bundle/configVersion.d.ts.map +1 -1
- package/dist/bundle/configVersion.js +260 -9
- package/dist/bundle/configVersion.js.map +1 -1
- package/dist/bundle/index.d.ts +3 -3
- package/dist/bundle/index.d.ts.map +1 -1
- package/dist/bundle/index.js +2 -2
- package/dist/bundle/index.js.map +1 -1
- package/dist/bundle/manifest.d.ts.map +1 -1
- package/dist/bundle/manifest.js +3 -2
- package/dist/bundle/manifest.js.map +1 -1
- package/dist/bundle/types.d.ts +4 -0
- package/dist/bundle/types.d.ts.map +1 -1
- package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
- package/dist/canvas-backend/headerFooter.js +18 -3
- package/dist/canvas-backend/headerFooter.js.map +1 -1
- package/dist/columnRule.d.ts.map +1 -1
- package/dist/columnRule.js +5 -2
- package/dist/columnRule.js.map +1 -1
- package/dist/configWarnings.js +1 -1
- package/dist/configWarnings.js.map +1 -1
- package/dist/defaults/bodyText.d.ts +2 -1
- package/dist/defaults/bodyText.d.ts.map +1 -1
- package/dist/defaults/bodyText.js +13 -2
- package/dist/defaults/bodyText.js.map +1 -1
- package/dist/defaults/cjk.d.ts +2 -1
- package/dist/defaults/cjk.d.ts.map +1 -1
- package/dist/defaults/cjk.js +17 -1
- package/dist/defaults/cjk.js.map +1 -1
- package/dist/defaults/diagramStyle.d.ts.map +1 -1
- package/dist/defaults/diagramStyle.js +6 -0
- package/dist/defaults/diagramStyle.js.map +1 -1
- package/dist/defaults/headings.d.ts +22 -2
- package/dist/defaults/headings.d.ts.map +1 -1
- package/dist/defaults/headings.js +34 -2
- package/dist/defaults/headings.js.map +1 -1
- package/dist/defaults/index.d.ts +11 -2
- package/dist/defaults/index.d.ts.map +1 -1
- package/dist/defaults/index.js +34 -9
- package/dist/defaults/index.js.map +1 -1
- package/dist/defaults/indexConfig.d.ts +6 -2
- package/dist/defaults/indexConfig.d.ts.map +1 -1
- package/dist/defaults/indexConfig.js +10 -5
- package/dist/defaults/indexConfig.js.map +1 -1
- package/dist/defaults/layout.d.ts +5 -0
- package/dist/defaults/layout.d.ts.map +1 -1
- package/dist/defaults/layout.js +32 -0
- package/dist/defaults/layout.js.map +1 -1
- package/dist/defaults/page.d.ts.map +1 -1
- package/dist/defaults/page.js +8 -2
- package/dist/defaults/page.js.map +1 -1
- package/dist/defaults/tableStyle.d.ts.map +1 -1
- package/dist/defaults/tableStyle.js +6 -0
- package/dist/defaults/tableStyle.js.map +1 -1
- package/dist/design/cjkText.d.ts +34 -0
- package/dist/design/cjkText.d.ts.map +1 -0
- package/dist/design/cjkText.js +88 -0
- package/dist/design/cjkText.js.map +1 -0
- package/dist/design/layout.d.ts.map +1 -1
- package/dist/design/layout.js +103 -5
- package/dist/design/layout.js.map +1 -1
- package/dist/design/richText.d.ts +28 -0
- package/dist/design/richText.d.ts.map +1 -1
- package/dist/design/richText.js +37 -1
- package/dist/design/richText.js.map +1 -1
- package/dist/fonts/buildWithFonts.d.ts +19 -0
- package/dist/fonts/buildWithFonts.d.ts.map +1 -0
- package/dist/fonts/buildWithFonts.js +16 -0
- package/dist/fonts/buildWithFonts.js.map +1 -0
- package/dist/fonts/faces.d.ts +101 -0
- package/dist/fonts/faces.d.ts.map +1 -0
- package/dist/fonts/faces.js +282 -0
- package/dist/fonts/faces.js.map +1 -0
- package/dist/fonts/fontSet.d.ts +37 -0
- package/dist/fonts/fontSet.d.ts.map +1 -0
- package/dist/fonts/fontSet.js +181 -0
- package/dist/fonts/fontSet.js.map +1 -0
- package/dist/fonts/prepare.d.ts +125 -0
- package/dist/fonts/prepare.d.ts.map +1 -0
- package/dist/fonts/prepare.js +380 -0
- package/dist/fonts/prepare.js.map +1 -0
- package/dist/html-backend.d.ts +17 -0
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +98 -4
- package/dist/html-backend.js.map +1 -1
- package/dist/index.d.ts +25 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -2
- package/dist/index.js.map +1 -1
- package/dist/measure/cache.d.ts.map +1 -1
- package/dist/measure/cache.js +32 -2
- package/dist/measure/cache.js.map +1 -1
- package/dist/measure/canvas.d.ts +15 -0
- package/dist/measure/canvas.d.ts.map +1 -1
- package/dist/measure/canvas.js +68 -4
- package/dist/measure/canvas.js.map +1 -1
- package/dist/measure/cjk.d.ts.map +1 -1
- package/dist/measure/cjk.js +4 -1
- package/dist/measure/cjk.js.map +1 -1
- package/dist/measure/cjkClasses.d.ts +17 -0
- package/dist/measure/cjkClasses.d.ts.map +1 -1
- package/dist/measure/cjkClasses.js +41 -1
- package/dist/measure/cjkClasses.js.map +1 -1
- package/dist/measure/cjkCompose.d.ts.map +1 -1
- package/dist/measure/cjkCompose.js +119 -7
- package/dist/measure/cjkCompose.js.map +1 -1
- package/dist/measure/cjkPunctuation.d.ts +18 -1
- package/dist/measure/cjkPunctuation.d.ts.map +1 -1
- package/dist/measure/cjkPunctuation.js +13 -1
- package/dist/measure/cjkPunctuation.js.map +1 -1
- package/dist/measure/font.d.ts +8 -0
- package/dist/measure/font.d.ts.map +1 -1
- package/dist/measure/font.js +13 -2
- package/dist/measure/font.js.map +1 -1
- package/dist/measure/fontString.d.ts +14 -0
- package/dist/measure/fontString.d.ts.map +1 -0
- package/dist/measure/fontString.js +55 -0
- package/dist/measure/fontString.js.map +1 -0
- package/dist/measure/index.d.ts +4 -1
- package/dist/measure/index.d.ts.map +1 -1
- package/dist/measure/index.js +3 -1
- package/dist/measure/index.js.map +1 -1
- package/dist/measure/types.d.ts +4 -0
- package/dist/measure/types.d.ts.map +1 -1
- package/dist/measure/types.js.map +1 -1
- package/dist/parse/citations.d.ts.map +1 -1
- package/dist/parse/citations.js +7 -3
- package/dist/parse/citations.js.map +1 -1
- package/dist/pipeline/build.d.ts +36 -0
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +1065 -193
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
- package/dist/pipeline/buildBlockKind.js +20 -6
- package/dist/pipeline/buildBlockKind.js.map +1 -1
- package/dist/pipeline/buildMeasurement.d.ts +6 -0
- package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
- package/dist/pipeline/buildMeasurement.js +3 -2
- package/dist/pipeline/buildMeasurement.js.map +1 -1
- package/dist/pipeline/calloutLayout.d.ts +59 -0
- package/dist/pipeline/calloutLayout.d.ts.map +1 -1
- package/dist/pipeline/calloutLayout.js +287 -65
- package/dist/pipeline/calloutLayout.js.map +1 -1
- package/dist/pipeline/columnBalancing.d.ts +20 -0
- package/dist/pipeline/columnBalancing.d.ts.map +1 -1
- package/dist/pipeline/columnBalancing.js +22 -4
- package/dist/pipeline/columnBalancing.js.map +1 -1
- package/dist/pipeline/columnsGroup.d.ts +61 -0
- package/dist/pipeline/columnsGroup.d.ts.map +1 -0
- package/dist/pipeline/columnsGroup.js +88 -0
- package/dist/pipeline/columnsGroup.js.map +1 -0
- package/dist/pipeline/config.d.ts +16 -0
- package/dist/pipeline/config.d.ts.map +1 -1
- package/dist/pipeline/config.js +51 -9
- package/dist/pipeline/config.js.map +1 -1
- package/dist/pipeline/contentWarnings.d.ts.map +1 -1
- package/dist/pipeline/contentWarnings.js +28 -0
- package/dist/pipeline/contentWarnings.js.map +1 -1
- package/dist/pipeline/floatPlacement.d.ts +16 -2
- package/dist/pipeline/floatPlacement.d.ts.map +1 -1
- package/dist/pipeline/floatPlacement.js +12 -4
- package/dist/pipeline/floatPlacement.js.map +1 -1
- package/dist/pipeline/floatSlots.d.ts +9 -3
- package/dist/pipeline/floatSlots.d.ts.map +1 -1
- package/dist/pipeline/floatSlots.js +15 -6
- package/dist/pipeline/floatSlots.js.map +1 -1
- package/dist/pipeline/flowColumns.d.ts +41 -0
- package/dist/pipeline/flowColumns.d.ts.map +1 -0
- package/dist/pipeline/flowColumns.js +116 -0
- package/dist/pipeline/flowColumns.js.map +1 -0
- package/dist/pipeline/measureContentBlock.d.ts +13 -1
- package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
- package/dist/pipeline/measureContentBlock.js +20 -5
- package/dist/pipeline/measureContentBlock.js.map +1 -1
- package/dist/pipeline/partPalette.d.ts +3 -0
- package/dist/pipeline/partPalette.d.ts.map +1 -1
- package/dist/pipeline/partPalette.js +5 -0
- package/dist/pipeline/partPalette.js.map +1 -1
- package/dist/pipeline/placement.d.ts +19 -0
- package/dist/pipeline/placement.d.ts.map +1 -1
- package/dist/pipeline/placement.js +5 -2
- package/dist/pipeline/placement.js.map +1 -1
- package/dist/pipeline/resourceLayout.d.ts +26 -0
- package/dist/pipeline/resourceLayout.d.ts.map +1 -1
- package/dist/pipeline/resourceLayout.js +53 -3
- package/dist/pipeline/resourceLayout.js.map +1 -1
- package/dist/pipeline/toc.d.ts.map +1 -1
- package/dist/pipeline/toc.js +6 -1
- package/dist/pipeline/toc.js.map +1 -1
- package/dist/svg/fontRegistry.d.ts +66 -0
- package/dist/svg/fontRegistry.d.ts.map +1 -0
- package/dist/svg/fontRegistry.js +294 -0
- package/dist/svg/fontRegistry.js.map +1 -0
- package/dist/svg/fonts.d.ts +140 -0
- package/dist/svg/fonts.d.ts.map +1 -0
- package/dist/svg/fonts.js +642 -0
- package/dist/svg/fonts.js.map +1 -0
- package/dist/svg/image.d.ts +44 -0
- package/dist/svg/image.d.ts.map +1 -0
- package/dist/svg/image.js +67 -0
- package/dist/svg/image.js.map +1 -0
- package/dist/types.d.ts +145 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/util/stableHash.d.ts +20 -0
- package/dist/util/stableHash.d.ts.map +1 -0
- package/dist/util/stableHash.js +59 -0
- package/dist/util/stableHash.js.map +1 -0
- package/dist/vdt.d.ts +127 -3
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js.map +1 -1
- package/dist/worker/client.d.ts +8 -0
- package/dist/worker/client.d.ts.map +1 -1
- package/dist/worker/client.js +22 -0
- package/dist/worker/client.js.map +1 -1
- package/dist/worker/fonts.d.ts +1 -13
- package/dist/worker/fonts.d.ts.map +1 -1
- package/dist/worker/fonts.js +3 -61
- package/dist/worker/fonts.js.map +1 -1
- package/dist/worker/layout.worker.js +23 -16
- package/dist/worker/layout.worker.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { VDTDocument } from '../vdt';
|
|
2
|
+
import { type FontFaceRequest } from '../measure/fontString';
|
|
3
|
+
export type { FontFaceRequest } from '../measure/fontString';
|
|
4
|
+
/** The part of a `FontFace` the engine reads. */
|
|
5
|
+
export interface FontFaceLike {
|
|
6
|
+
family: string;
|
|
7
|
+
/** `'400'`, `'bold'`, or a variable range `'100 900'`. */
|
|
8
|
+
weight: string;
|
|
9
|
+
/** `'normal'`, `'italic'` or `'oblique …'`. */
|
|
10
|
+
style: string;
|
|
11
|
+
status: 'unloaded' | 'loading' | 'loaded' | 'error' | string;
|
|
12
|
+
unicodeRange?: string;
|
|
13
|
+
load?(): Promise<FontFaceLike>;
|
|
14
|
+
}
|
|
15
|
+
/** The part of a `FontFaceSet` (`document.fonts`, a worker's `self.fonts`)
|
|
16
|
+
* the engine uses. Tests pass a fake. */
|
|
17
|
+
export interface FontFaceSetLike extends Iterable<FontFaceLike> {
|
|
18
|
+
readonly size?: number;
|
|
19
|
+
/** `'loading'` while faces of the set load, up to its `loadingdone`. */
|
|
20
|
+
readonly status?: string;
|
|
21
|
+
load(font: string, text?: string): Promise<FontFaceLike[]>;
|
|
22
|
+
add(face: FontFaceLike): unknown;
|
|
23
|
+
addEventListener?(type: 'loadingdone', listener: (event: {
|
|
24
|
+
fontfaces?: readonly FontFaceLike[];
|
|
25
|
+
}) => void): void;
|
|
26
|
+
removeEventListener?(type: 'loadingdone', listener: (event: {
|
|
27
|
+
fontfaces?: readonly FontFaceLike[];
|
|
28
|
+
}) => void): void;
|
|
29
|
+
}
|
|
30
|
+
/** The page's font set (`document.fonts`), a worker's (`self.fonts`), or
|
|
31
|
+
* undefined where there is none (Node). */
|
|
32
|
+
export declare function defaultFontSet(): FontFaceSetLike | undefined;
|
|
33
|
+
export declare function isGenericFamily(family: string): boolean;
|
|
34
|
+
/** A face of the font set, read once. */
|
|
35
|
+
export interface IndexedFace {
|
|
36
|
+
weight: [number, number];
|
|
37
|
+
style: 'normal' | 'italic';
|
|
38
|
+
status: string;
|
|
39
|
+
}
|
|
40
|
+
/** The faces of `fontSet`, by family (lower case); only the families in
|
|
41
|
+
* `families` when given. */
|
|
42
|
+
export declare function indexFontSet(fontSet: Iterable<FontFaceLike>, families?: ReadonlySet<string>): Map<string, IndexedFace[]>;
|
|
43
|
+
/** How `faces` answer for a weight and slant: the face CSS matching
|
|
44
|
+
* picks, whether it is a face of that weight and slant (`exact`: its
|
|
45
|
+
* weight, or its variable range, holds the one asked, in the slant
|
|
46
|
+
* asked), and whether the browser draws it bolder or slanted
|
|
47
|
+
* (`synthesized`: a bold of 600 or more set from a face of 500 or less;
|
|
48
|
+
* an italic set from an upright face). A face neither exact nor
|
|
49
|
+
* synthesized is drawn as it is: the 700 for a 600, the italic for an
|
|
50
|
+
* upright. Undefined when `faces` is empty. */
|
|
51
|
+
export declare function matchFace(faces: readonly IndexedFace[], weight: number, style: 'normal' | 'italic'): {
|
|
52
|
+
face: IndexedFace;
|
|
53
|
+
exact: boolean;
|
|
54
|
+
synthesized: boolean;
|
|
55
|
+
} | undefined;
|
|
56
|
+
/** A key per face request. */
|
|
57
|
+
export declare function faceRequestKey(f: FontFaceRequest): string;
|
|
58
|
+
/** The faces (family, weight, slant) the text of a laid-out document is
|
|
59
|
+
* set in: its blocks' lines and segments, list markers, drop caps,
|
|
60
|
+
* captions, notes and table cells, running heads, folios and design
|
|
61
|
+
* texts, line numbers and the lettering of comic pages. */
|
|
62
|
+
export declare function documentFontFaces(doc: VDTDocument): FontFaceRequest[];
|
|
63
|
+
/** The font families the text of a laid-out document is set in. */
|
|
64
|
+
export declare function documentFontFamilies(doc: VDTDocument): string[];
|
|
65
|
+
/**
|
|
66
|
+
* The families no font answers for — neither registered nor installed — so
|
|
67
|
+
* their text was measured with a generic fallback. A family is there when
|
|
68
|
+
* naming it in front of a generic family changes the width of a probe
|
|
69
|
+
* string for at least one of three generics.
|
|
70
|
+
*/
|
|
71
|
+
export declare function unavailableFontFamilies(families: string[], measureWidth: (font: string, text: string) => number): string[];
|
|
72
|
+
/** Why a face fell back: no loaded face answered, so the text was set in
|
|
73
|
+
* the fallback font (`missing`), or the family has no face of that
|
|
74
|
+
* weight or slant and the browser drew it from another one, as it is or
|
|
75
|
+
* made bolder or slanted (`synthesized`). */
|
|
76
|
+
export type FontFallbackReason = 'missing' | 'synthesized';
|
|
77
|
+
export interface FontFallback extends FontFaceRequest {
|
|
78
|
+
reason: FontFallbackReason;
|
|
79
|
+
}
|
|
80
|
+
export interface FontFallbackOptions {
|
|
81
|
+
/** Width of `text` in `font`, for the probe that tells an installed
|
|
82
|
+
* family from a missing one. Default: the engine's measuring canvas,
|
|
83
|
+
* when there is one. Null: no probe (a family with no face in the set
|
|
84
|
+
* is missing). */
|
|
85
|
+
measureWidth?: ((font: string, text: string) => number) | null;
|
|
86
|
+
}
|
|
87
|
+
/** Forget the probe's answers (the faces changed). */
|
|
88
|
+
export declare function forgetInstalledFamilies(): void;
|
|
89
|
+
/**
|
|
90
|
+
* The faces of `faces` that `fontSet` could not give. The weight and slant
|
|
91
|
+
* are matched among the faces the family declares, as CSS does (#650).
|
|
92
|
+
* `missing`: the family has no face (and is not installed, by the width
|
|
93
|
+
* probe), or the one matching settles on has not loaded, so the browser
|
|
94
|
+
* set the text in the fallback font. `synthesized`: that face is loaded
|
|
95
|
+
* but is not one of the weight and slant asked — the 700 answering for a
|
|
96
|
+
* 600, a regular made bold, an upright slanted — so the text was measured
|
|
97
|
+
* with another cut than the file a PDF embeds for the face. Generic
|
|
98
|
+
* families are never reported.
|
|
99
|
+
*/
|
|
100
|
+
export declare function fontFallbacks(faces: readonly FontFaceRequest[], fontSet: Iterable<FontFaceLike>, options?: FontFallbackOptions): FontFallback[];
|
|
101
|
+
//# sourceMappingURL=faces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"faces.d.ts","sourceRoot":"","sources":["../../src/fonts/faces.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,QAAQ,CAAC;AAGnD,OAAO,EAAmB,KAAK,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE9E,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,iDAAiD;AACjD,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,UAAU,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAC7D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,IAAI,OAAO,CAAC,YAAY,CAAC,CAAC;CAChC;AAED;0CAC0C;AAC1C,MAAM,WAAW,eAAgB,SAAQ,QAAQ,CAAC,YAAY,CAAC;IAC7D,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,wEAAwE;IACxE,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC3D,GAAG,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC;IACjC,gBAAgB,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;IACjH,mBAAmB,CAAC,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,SAAS,CAAC,EAAE,SAAS,YAAY,EAAE,CAAA;KAAE,KAAK,IAAI,GAAG,IAAI,CAAC;CACrH;AAED;4CAC4C;AAC5C,wBAAgB,cAAc,IAAI,eAAe,GAAG,SAAS,CAG5D;AAQD,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED,yCAAyC;AACzC,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACzB,KAAK,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAcD;6BAC6B;AAC7B,wBAAgB,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,QAAQ,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,CAAC,CAUxH;AAsBD;;;;;;;gDAOgD;AAChD,wBAAgB,SAAS,CAAC,KAAK,EAAE,SAAS,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAQ5K;AAED,8BAA8B;AAC9B,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,GAAG,MAAM,CAEzD;AAiDD;;;4DAG4D;AAC5D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,GAAG,eAAe,EAAE,CAgDrE;AAED,mEAAmE;AACnE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,EAAE,CAE/D;AAKD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,EAAE,EAClB,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GACnD,MAAM,EAAE,CAGV;AAED;;;8CAG8C;AAC9C,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,aAAa,CAAC;AAE3D,MAAM,WAAW,YAAa,SAAQ,eAAe;IACnD,MAAM,EAAE,kBAAkB,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IAClC;;;uBAGmB;IACnB,YAAY,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC;CAChE;AAWD,sDAAsD;AACtD,wBAAgB,uBAAuB,IAAI,IAAI,CAE9C;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,EAAE,CAiC/I"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
// The faces a laid-out document set its text in, and which of them the
|
|
2
|
+
// font set could not give (#629): a family no face answers for, or a weight
|
|
3
|
+
// or slant the family has no face for, which the browser takes from
|
|
4
|
+
// another one (the nearest weight as it is, bold drawn heavier, italic
|
|
5
|
+
// slanted; #650). Shared by the main thread and the layout worker.
|
|
6
|
+
import { quoteFamily } from '../measure/font';
|
|
7
|
+
import { measureTextWidth } from '../measure/canvas';
|
|
8
|
+
import { parseFontString } from '../measure/fontString';
|
|
9
|
+
/** The page's font set (`document.fonts`), a worker's (`self.fonts`), or
|
|
10
|
+
* undefined where there is none (Node). */
|
|
11
|
+
export function defaultFontSet() {
|
|
12
|
+
const g = globalThis;
|
|
13
|
+
return g.document?.fonts ?? g.fonts;
|
|
14
|
+
}
|
|
15
|
+
/** CSS generic families: always there, never reported. */
|
|
16
|
+
const GENERIC_FAMILIES = new Set([
|
|
17
|
+
'serif', 'sans-serif', 'monospace', 'cursive', 'fantasy', 'system-ui', 'ui-serif', 'ui-sans-serif',
|
|
18
|
+
'ui-monospace', 'ui-rounded', 'emoji', 'math', 'fangsong', '-apple-system',
|
|
19
|
+
]);
|
|
20
|
+
export function isGenericFamily(family) {
|
|
21
|
+
return GENERIC_FAMILIES.has(family.trim().toLowerCase());
|
|
22
|
+
}
|
|
23
|
+
function unquote(family) {
|
|
24
|
+
const f = family.trim();
|
|
25
|
+
return /^(["']).*\1$/.test(f) ? f.slice(1, -1) : f;
|
|
26
|
+
}
|
|
27
|
+
function weightRange(weight) {
|
|
28
|
+
const parts = (weight ?? '400').trim().split(/\s+/).map((w) => (w === 'bold' ? 700 : w === 'normal' ? 400 : Number(w)));
|
|
29
|
+
const lo = Number.isFinite(parts[0]) ? parts[0] : 400;
|
|
30
|
+
const hi = Number.isFinite(parts[1]) ? parts[1] : lo;
|
|
31
|
+
return [Math.min(lo, hi), Math.max(lo, hi)];
|
|
32
|
+
}
|
|
33
|
+
/** The faces of `fontSet`, by family (lower case); only the families in
|
|
34
|
+
* `families` when given. */
|
|
35
|
+
export function indexFontSet(fontSet, families) {
|
|
36
|
+
const out = new Map();
|
|
37
|
+
for (const face of fontSet) {
|
|
38
|
+
const family = unquote(face.family).toLowerCase();
|
|
39
|
+
if (families && !families.has(family))
|
|
40
|
+
continue;
|
|
41
|
+
let list = out.get(family);
|
|
42
|
+
if (!list)
|
|
43
|
+
out.set(family, (list = []));
|
|
44
|
+
list.push({ weight: weightRange(face.weight), style: /italic|oblique/i.test(face.style ?? '') ? 'italic' : 'normal', status: face.status });
|
|
45
|
+
}
|
|
46
|
+
return out;
|
|
47
|
+
}
|
|
48
|
+
function distance(range, target) {
|
|
49
|
+
return target < range[0] ? range[0] - target : target > range[1] ? target - range[1] : 0;
|
|
50
|
+
}
|
|
51
|
+
/** The weight CSS font matching settles on among `faces` for `target`
|
|
52
|
+
* (CSS Fonts 4, §5.2): between 400 and 500 the weights up to 500 first,
|
|
53
|
+
* then lighter, then heavier; below 400 lighter first; above 500 heavier
|
|
54
|
+
* first. */
|
|
55
|
+
function matchWeight(faces, target) {
|
|
56
|
+
const exact = faces.find((f) => distance(f.weight, target) === 0);
|
|
57
|
+
if (exact)
|
|
58
|
+
return exact;
|
|
59
|
+
const lighter = faces.filter((f) => f.weight[1] < target).sort((a, b) => b.weight[1] - a.weight[1]);
|
|
60
|
+
const heavier = faces.filter((f) => f.weight[0] > target).sort((a, b) => a.weight[0] - b.weight[0]);
|
|
61
|
+
if (target >= 400 && target <= 500) {
|
|
62
|
+
const upTo500 = heavier.filter((f) => f.weight[0] <= 500);
|
|
63
|
+
return upTo500[0] ?? lighter[0] ?? heavier[0];
|
|
64
|
+
}
|
|
65
|
+
return target < 400 ? lighter[0] ?? heavier[0] : heavier[0] ?? lighter[0];
|
|
66
|
+
}
|
|
67
|
+
/** How `faces` answer for a weight and slant: the face CSS matching
|
|
68
|
+
* picks, whether it is a face of that weight and slant (`exact`: its
|
|
69
|
+
* weight, or its variable range, holds the one asked, in the slant
|
|
70
|
+
* asked), and whether the browser draws it bolder or slanted
|
|
71
|
+
* (`synthesized`: a bold of 600 or more set from a face of 500 or less;
|
|
72
|
+
* an italic set from an upright face). A face neither exact nor
|
|
73
|
+
* synthesized is drawn as it is: the 700 for a 600, the italic for an
|
|
74
|
+
* upright. Undefined when `faces` is empty. */
|
|
75
|
+
export function matchFace(faces, weight, style) {
|
|
76
|
+
if (faces.length === 0)
|
|
77
|
+
return undefined;
|
|
78
|
+
const sameStyle = faces.filter((f) => f.style === style);
|
|
79
|
+
const pool = sameStyle.length > 0 ? sameStyle : faces;
|
|
80
|
+
const face = matchWeight(pool, weight);
|
|
81
|
+
const syntheticBold = weight >= 600 && face.weight[1] <= 500;
|
|
82
|
+
const syntheticItalic = style === 'italic' && face.style !== 'italic';
|
|
83
|
+
return { face, exact: face.style === style && distance(face.weight, weight) === 0, synthesized: syntheticBold || syntheticItalic };
|
|
84
|
+
}
|
|
85
|
+
/** A key per face request. */
|
|
86
|
+
export function faceRequestKey(f) {
|
|
87
|
+
return `${f.family.toLowerCase()}|${f.weight}|${f.style}`;
|
|
88
|
+
}
|
|
89
|
+
/** The faces of a group of lines, as the renderers pick them: a segment's
|
|
90
|
+
* own font, else the variant of its bold and italic flags. */
|
|
91
|
+
function addLines(lines, normal, bold, italic, boldItalic, add) {
|
|
92
|
+
if (!lines || lines.length === 0)
|
|
93
|
+
return;
|
|
94
|
+
for (const line of lines) {
|
|
95
|
+
const segments = line.segments;
|
|
96
|
+
if (!segments || segments.length === 0) {
|
|
97
|
+
add(normal);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
for (const seg of segments) {
|
|
101
|
+
add(seg.fontString ?? (seg.bold ? (seg.italic ? boldItalic ?? bold ?? italic ?? normal : bold ?? normal) : seg.italic ? italic ?? normal : normal));
|
|
102
|
+
// Annotations set in faces of their own (ruby, warichu, kunten, chips).
|
|
103
|
+
if (seg.ruby !== undefined)
|
|
104
|
+
walkFonts(seg.ruby, add);
|
|
105
|
+
if (seg.warichu !== undefined)
|
|
106
|
+
walkFonts(seg.warichu, add);
|
|
107
|
+
if (seg.kunten !== undefined)
|
|
108
|
+
walkFonts(seg.kunten, add);
|
|
109
|
+
if (seg.chip !== undefined)
|
|
110
|
+
walkFonts(seg.chip, add);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/** Keys whose object holds no font of its own (geometry, raw data,
|
|
115
|
+
* pictures), skipped by the walk. */
|
|
116
|
+
const SKIP_KEYS = new Set(['sourceMap', 'attrSources', 'bbox', 'rect', 'resource', 'config', 'svg', 'mathRender', 'math', 'path', 'paths', 'columns', 'floats', 'palette']);
|
|
117
|
+
/** Every `fontString`, `bulletFontString`, `separatorFontString`… under
|
|
118
|
+
* `node` (the variant sets `boldFontString`, `italicFontString`… are
|
|
119
|
+
* what a renderer may pick, not what was set: lines say which). */
|
|
120
|
+
function walkFonts(node, add, depth = 0) {
|
|
121
|
+
if (!node || typeof node !== 'object' || depth > 12)
|
|
122
|
+
return;
|
|
123
|
+
if (Array.isArray(node)) {
|
|
124
|
+
// Arrays of numbers (source maps, break lists) hold no font.
|
|
125
|
+
if (node.length > 0 && (node[0] === null || typeof node[0] !== 'object'))
|
|
126
|
+
return;
|
|
127
|
+
for (const item of node)
|
|
128
|
+
walkFonts(item, add, depth + 1);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const rec = node;
|
|
132
|
+
for (const key in rec) {
|
|
133
|
+
const value = rec[key];
|
|
134
|
+
if (typeof value === 'string') {
|
|
135
|
+
if (key === 'fontString' || ((key.endsWith('FontString')) && !/(?:bold|italic|Bold|Italic)FontString$/.test(key)))
|
|
136
|
+
add(value);
|
|
137
|
+
}
|
|
138
|
+
else if (value && typeof value === 'object' && !SKIP_KEYS.has(key)) {
|
|
139
|
+
walkFonts(value, add, depth + 1);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/** The faces (family, weight, slant) the text of a laid-out document is
|
|
144
|
+
* set in: its blocks' lines and segments, list markers, drop caps,
|
|
145
|
+
* captions, notes and table cells, running heads, folios and design
|
|
146
|
+
* texts, line numbers and the lettering of comic pages. */
|
|
147
|
+
export function documentFontFaces(doc) {
|
|
148
|
+
const fonts = new Set();
|
|
149
|
+
let last;
|
|
150
|
+
const add = (font) => {
|
|
151
|
+
if (font === last || !font)
|
|
152
|
+
return;
|
|
153
|
+
last = font;
|
|
154
|
+
fonts.add(font);
|
|
155
|
+
};
|
|
156
|
+
// The blocks of the flow, and floats a page holds outside it.
|
|
157
|
+
const blocks = new Set(doc.blocks);
|
|
158
|
+
for (const page of doc.pages)
|
|
159
|
+
for (const b of page.floats ?? [])
|
|
160
|
+
blocks.add(b);
|
|
161
|
+
for (const block of blocks) {
|
|
162
|
+
addLines(block.lines, block.fontString, block.boldFontString, block.italicFontString, block.boldItalicFontString, add);
|
|
163
|
+
const rb = block.resourceBlock;
|
|
164
|
+
if (rb) {
|
|
165
|
+
addLines(rb.captionLines, rb.captionFontString, rb.captionBoldFontString, rb.captionItalicFontString, rb.captionBoldItalicFontString, add);
|
|
166
|
+
addLines(rb.noteLines, rb.noteFontString, rb.noteBoldFontString, rb.noteItalicFontString, rb.noteBoldItalicFontString, add);
|
|
167
|
+
const t = rb.table;
|
|
168
|
+
if (t) {
|
|
169
|
+
for (const cell of t.cells) {
|
|
170
|
+
if (cell.isHeader)
|
|
171
|
+
addLines(cell.lines, t.headerFontString, t.headerBoldFontString, t.headerItalicFontString, t.headerBoldItalicFontString, add);
|
|
172
|
+
else
|
|
173
|
+
addLines(cell.lines, t.fontString, t.boldFontString, t.italicFontString, t.boldItalicFontString, add);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
walkFonts(rb, add);
|
|
177
|
+
}
|
|
178
|
+
// Markers, drop caps, heading designs and whatever else the block
|
|
179
|
+
// sets beside its lines (its own `fontString` only when it has lines).
|
|
180
|
+
for (const key in block) {
|
|
181
|
+
if (key === 'fontString' || key === 'lines' || key === 'resourceBlock' || SKIP_KEYS.has(key))
|
|
182
|
+
continue;
|
|
183
|
+
const value = block[key];
|
|
184
|
+
if (typeof value === 'string') {
|
|
185
|
+
if (key.endsWith('FontString') && !/(?:bold|italic|Bold|Italic)FontString$/.test(key) && block.lines.length > 0)
|
|
186
|
+
add(value);
|
|
187
|
+
}
|
|
188
|
+
else if (value && typeof value === 'object') {
|
|
189
|
+
walkFonts(value, add);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
// Running heads, folios, opener bands, line numbers, comic lettering.
|
|
194
|
+
for (const page of doc.pages)
|
|
195
|
+
walkFonts(page, add);
|
|
196
|
+
const out = new Map();
|
|
197
|
+
for (const font of fonts) {
|
|
198
|
+
const face = parseFontString(font);
|
|
199
|
+
if (!face || isGenericFamily(face.family))
|
|
200
|
+
continue;
|
|
201
|
+
const key = faceRequestKey(face);
|
|
202
|
+
if (!out.has(key))
|
|
203
|
+
out.set(key, face);
|
|
204
|
+
}
|
|
205
|
+
return [...out.values()];
|
|
206
|
+
}
|
|
207
|
+
/** The font families the text of a laid-out document is set in. */
|
|
208
|
+
export function documentFontFamilies(doc) {
|
|
209
|
+
return [...new Set(documentFontFaces(doc).map((f) => f.family))];
|
|
210
|
+
}
|
|
211
|
+
const PROBE = 'mmmmmmmmmmlliWWQq@#0123';
|
|
212
|
+
const GENERICS = ['monospace', 'serif', 'sans-serif'];
|
|
213
|
+
/**
|
|
214
|
+
* The families no font answers for — neither registered nor installed — so
|
|
215
|
+
* their text was measured with a generic fallback. A family is there when
|
|
216
|
+
* naming it in front of a generic family changes the width of a probe
|
|
217
|
+
* string for at least one of three generics.
|
|
218
|
+
*/
|
|
219
|
+
export function unavailableFontFamilies(families, measureWidth) {
|
|
220
|
+
return families.filter((family) => GENERICS.every((generic) => measureWidth(`72px ${quoteFamily(family)}, ${generic}`, PROBE) === measureWidth(`72px ${generic}`, PROBE)));
|
|
221
|
+
}
|
|
222
|
+
function canMeasure() {
|
|
223
|
+
const g = globalThis;
|
|
224
|
+
return typeof g.OffscreenCanvas !== 'undefined' || typeof g.document?.createElement === 'function';
|
|
225
|
+
}
|
|
226
|
+
/** Whether an installed family answered the probe, per family (lower
|
|
227
|
+
* case); reset when the font set changes (`fontSetChanged`). */
|
|
228
|
+
const installed = new Map();
|
|
229
|
+
/** Forget the probe's answers (the faces changed). */
|
|
230
|
+
export function forgetInstalledFamilies() {
|
|
231
|
+
installed.clear();
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* The faces of `faces` that `fontSet` could not give. The weight and slant
|
|
235
|
+
* are matched among the faces the family declares, as CSS does (#650).
|
|
236
|
+
* `missing`: the family has no face (and is not installed, by the width
|
|
237
|
+
* probe), or the one matching settles on has not loaded, so the browser
|
|
238
|
+
* set the text in the fallback font. `synthesized`: that face is loaded
|
|
239
|
+
* but is not one of the weight and slant asked — the 700 answering for a
|
|
240
|
+
* 600, a regular made bold, an upright slanted — so the text was measured
|
|
241
|
+
* with another cut than the file a PDF embeds for the face. Generic
|
|
242
|
+
* families are never reported.
|
|
243
|
+
*/
|
|
244
|
+
export function fontFallbacks(faces, fontSet, options) {
|
|
245
|
+
const wanted = faces.filter((f) => !isGenericFamily(f.family));
|
|
246
|
+
if (wanted.length === 0)
|
|
247
|
+
return [];
|
|
248
|
+
const index = indexFontSet(fontSet, new Set(wanted.map((f) => f.family.toLowerCase())));
|
|
249
|
+
const measure = options?.measureWidth === undefined ? (canMeasure() ? (font, text) => measureTextWidth(text, font) : null) : options.measureWidth;
|
|
250
|
+
const out = [];
|
|
251
|
+
for (const f of wanted) {
|
|
252
|
+
const lower = f.family.toLowerCase();
|
|
253
|
+
const declared = index.get(lower) ?? [];
|
|
254
|
+
const loaded = declared.filter((d) => d.status === 'loaded');
|
|
255
|
+
if (loaded.length === 0) {
|
|
256
|
+
// A family nobody declared may be installed on the system.
|
|
257
|
+
if (declared.length === 0 && measure) {
|
|
258
|
+
let there = installed.get(lower);
|
|
259
|
+
if (there === undefined) {
|
|
260
|
+
there = unavailableFontFamilies([f.family], measure).length === 0;
|
|
261
|
+
installed.set(lower, there);
|
|
262
|
+
}
|
|
263
|
+
if (there)
|
|
264
|
+
continue;
|
|
265
|
+
}
|
|
266
|
+
out.push({ ...f, reason: 'missing' });
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
// The cut matching settles on, among loaded faces and others alike:
|
|
270
|
+
// until one of its files (a cut may come as `unicode-range` slices)
|
|
271
|
+
// has loaded, the browser sets the text in the fallback font, not in
|
|
272
|
+
// a neighbour that is there.
|
|
273
|
+
const cut = matchFace(declared, f.weight, f.style);
|
|
274
|
+
const there = loaded.some((d) => d.style === cut.face.style && d.weight[0] === cut.face.weight[0] && d.weight[1] === cut.face.weight[1]);
|
|
275
|
+
if (!there)
|
|
276
|
+
out.push({ ...f, reason: 'missing' });
|
|
277
|
+
else if (!cut.exact)
|
|
278
|
+
out.push({ ...f, reason: 'synthesized' });
|
|
279
|
+
}
|
|
280
|
+
return out;
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=faces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"faces.js","sourceRoot":"","sources":["../../src/fonts/faces.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type FontFaceSetLike } from './faces';
|
|
2
|
+
/** Whether the engine has looked at `fontSet` before. */
|
|
3
|
+
export declare function isFontSetTracked(fontSet: FontFaceSetLike): boolean;
|
|
4
|
+
/**
|
|
5
|
+
* Look at `fontSet` again: the families whose loaded faces changed since
|
|
6
|
+
* the last look get their measurements dropped (`evictFontFamilies`) and
|
|
7
|
+
* are returned. The first look only records the set. Cheap when nothing
|
|
8
|
+
* happened: the set is walked only when its size changed, while it is
|
|
9
|
+
* loading, or once a face finished loading. `evict: false` records the
|
|
10
|
+
* set without dropping anything (the caller drops what it knows changed).
|
|
11
|
+
* `force: true` walks it whatever it reports: for a caller that has just
|
|
12
|
+
* awaited `fontSet.load`, whose `loadingdone` is still to come.
|
|
13
|
+
*/
|
|
14
|
+
export declare function syncFontSet(fontSet?: FontFaceSetLike | null | undefined, options?: {
|
|
15
|
+
evict?: boolean;
|
|
16
|
+
force?: boolean;
|
|
17
|
+
}): string[];
|
|
18
|
+
/** Told which families' faces changed (lower case). */
|
|
19
|
+
export type FontsChangedListener = (families: readonly string[]) => void;
|
|
20
|
+
/**
|
|
21
|
+
* Call `listener` whenever faces of a watched font set arrive or leave
|
|
22
|
+
* (see {@link watchFonts}), after the engine has dropped what it measured
|
|
23
|
+
* in their families: the host lays out again. Returns the unsubscribe.
|
|
24
|
+
*/
|
|
25
|
+
export declare function onFontsChanged(listener: FontsChangedListener): () => void;
|
|
26
|
+
/**
|
|
27
|
+
* Watch `fontSet` (by default `document.fonts`, or `self.fonts` in a
|
|
28
|
+
* worker): when faces finish loading, the measurements of their families
|
|
29
|
+
* are dropped — at most once per animation frame, however many slices a
|
|
30
|
+
* burst brings — and the {@link onFontsChanged} listeners are told.
|
|
31
|
+
* Calls nest; the returned function stops this watch. `prepareFonts`
|
|
32
|
+
* starts one on the set it loads into.
|
|
33
|
+
*/
|
|
34
|
+
export declare function watchFonts(fontSet?: FontFaceSetLike | null | undefined): () => void;
|
|
35
|
+
/** Whether `fontSet` is watched. */
|
|
36
|
+
export declare function isWatchingFonts(fontSet?: FontFaceSetLike | null | undefined): boolean;
|
|
37
|
+
//# sourceMappingURL=fontSet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fontSet.d.ts","sourceRoot":"","sources":["../../src/fonts/fontSet.ts"],"names":[],"mappings":"AAgBA,OAAO,EAA8D,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAmD3G,yDAAyD;AACzD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAElE;AAED;;;;;;;;;GASG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,eAAe,GAAG,IAAI,GAAG,SAA4B,EAAE,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,EAAE,CAqBpJ;AAED,uDAAuD;AACvD,MAAM,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAC;AAIzE;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,oBAAoB,GAAG,MAAM,IAAI,CAKzE;AAkBD;;;;;;;GAOG;AACH,wBAAgB,UAAU,CAAC,OAAO,GAAE,eAAe,GAAG,IAAI,GAAG,SAA4B,GAAG,MAAM,IAAI,CA0CrG;AAED,oCAAoC;AACpC,wBAAgB,eAAe,CAAC,OAAO,GAAE,eAAe,GAAG,IAAI,GAAG,SAA4B,GAAG,OAAO,CAEvG"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
// Faces that arrive after text was measured (#629). The engine keeps, per
|
|
2
|
+
// font set, which faces of each family were loaded when it last looked;
|
|
3
|
+
// a build looks again at its start (cheaply: only when the set grew or
|
|
4
|
+
// shrank, is loading, or a face finished loading), and drops the widths of
|
|
5
|
+
// the families whose faces changed, so nothing measured with a fallback
|
|
6
|
+
// face outlives the face's arrival. `watchFonts` does the same as faces
|
|
7
|
+
// load, once per animation frame, and tells hosts (`onFontsChanged`) to
|
|
8
|
+
// lay out again.
|
|
9
|
+
//
|
|
10
|
+
// A set fires `loadingdone` a task after the `load()` promises of its
|
|
11
|
+
// faces resolve (#649): until then a declared face that finished loading
|
|
12
|
+
// shows neither in the set's size nor in the event. Chrome keeps the set
|
|
13
|
+
// at `status: 'loading'` meanwhile, which a look reads; whoever loaded the
|
|
14
|
+
// faces itself (`prepareFonts`) asks for the walk (`force`).
|
|
15
|
+
import { evictFontFamilies } from '../measure/font';
|
|
16
|
+
import { defaultFontSet, forgetInstalledFamilies } from './faces';
|
|
17
|
+
const tracked = new WeakMap();
|
|
18
|
+
function unquote(family) {
|
|
19
|
+
const f = family.trim();
|
|
20
|
+
return /^(["']).*\1$/.test(f) ? f.slice(1, -1) : f;
|
|
21
|
+
}
|
|
22
|
+
/** The loaded faces of every family of `fontSet`. */
|
|
23
|
+
function signatureOf(fontSet) {
|
|
24
|
+
const parts = new Map();
|
|
25
|
+
for (const face of fontSet) {
|
|
26
|
+
if (face.status !== 'loaded')
|
|
27
|
+
continue;
|
|
28
|
+
const family = unquote(face.family).toLowerCase();
|
|
29
|
+
let list = parts.get(family);
|
|
30
|
+
if (!list)
|
|
31
|
+
parts.set(family, (list = []));
|
|
32
|
+
list.push(`${face.weight}/${face.style}/${face.unicodeRange ?? ''}`);
|
|
33
|
+
}
|
|
34
|
+
const out = new Map();
|
|
35
|
+
for (const [family, list] of parts)
|
|
36
|
+
out.set(family, list.sort().join(';'));
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
39
|
+
function track(fontSet) {
|
|
40
|
+
let t = tracked.get(fontSet);
|
|
41
|
+
if (t)
|
|
42
|
+
return t;
|
|
43
|
+
const entry = {
|
|
44
|
+
size: fontSet.size ?? -1,
|
|
45
|
+
signature: signatureOf(fontSet),
|
|
46
|
+
dirty: false,
|
|
47
|
+
onLoadingDone: () => {
|
|
48
|
+
entry.dirty = true;
|
|
49
|
+
},
|
|
50
|
+
};
|
|
51
|
+
fontSet.addEventListener?.('loadingdone', entry.onLoadingDone);
|
|
52
|
+
tracked.set(fontSet, entry);
|
|
53
|
+
t = entry;
|
|
54
|
+
return t;
|
|
55
|
+
}
|
|
56
|
+
/** Whether the engine has looked at `fontSet` before. */
|
|
57
|
+
export function isFontSetTracked(fontSet) {
|
|
58
|
+
return tracked.has(fontSet);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Look at `fontSet` again: the families whose loaded faces changed since
|
|
62
|
+
* the last look get their measurements dropped (`evictFontFamilies`) and
|
|
63
|
+
* are returned. The first look only records the set. Cheap when nothing
|
|
64
|
+
* happened: the set is walked only when its size changed, while it is
|
|
65
|
+
* loading, or once a face finished loading. `evict: false` records the
|
|
66
|
+
* set without dropping anything (the caller drops what it knows changed).
|
|
67
|
+
* `force: true` walks it whatever it reports: for a caller that has just
|
|
68
|
+
* awaited `fontSet.load`, whose `loadingdone` is still to come.
|
|
69
|
+
*/
|
|
70
|
+
export function syncFontSet(fontSet = defaultFontSet(), options) {
|
|
71
|
+
if (!fontSet)
|
|
72
|
+
return [];
|
|
73
|
+
if (!tracked.has(fontSet)) {
|
|
74
|
+
track(fontSet);
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
const t = track(fontSet);
|
|
78
|
+
const size = fontSet.size ?? -1;
|
|
79
|
+
if (!options?.force && !t.dirty && size === t.size && size !== -1 && fontSet.status !== 'loading')
|
|
80
|
+
return [];
|
|
81
|
+
const signature = signatureOf(fontSet);
|
|
82
|
+
const changed = [];
|
|
83
|
+
for (const [family, sig] of signature)
|
|
84
|
+
if (t.signature.get(family) !== sig)
|
|
85
|
+
changed.push(family);
|
|
86
|
+
for (const family of t.signature.keys())
|
|
87
|
+
if (!signature.has(family))
|
|
88
|
+
changed.push(family);
|
|
89
|
+
t.signature = signature;
|
|
90
|
+
t.size = size;
|
|
91
|
+
t.dirty = false;
|
|
92
|
+
if (changed.length > 0) {
|
|
93
|
+
forgetInstalledFamilies();
|
|
94
|
+
if (options?.evict !== false)
|
|
95
|
+
evictFontFamilies(changed);
|
|
96
|
+
}
|
|
97
|
+
return changed;
|
|
98
|
+
}
|
|
99
|
+
const listeners = new Set();
|
|
100
|
+
/**
|
|
101
|
+
* Call `listener` whenever faces of a watched font set arrive or leave
|
|
102
|
+
* (see {@link watchFonts}), after the engine has dropped what it measured
|
|
103
|
+
* in their families: the host lays out again. Returns the unsubscribe.
|
|
104
|
+
*/
|
|
105
|
+
export function onFontsChanged(listener) {
|
|
106
|
+
listeners.add(listener);
|
|
107
|
+
return () => {
|
|
108
|
+
listeners.delete(listener);
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
const watches = new WeakMap();
|
|
112
|
+
function nextFrame(run) {
|
|
113
|
+
const g = globalThis;
|
|
114
|
+
// A hidden page runs no animation frames: a timer stands in.
|
|
115
|
+
if (typeof g.requestAnimationFrame === 'function' && !g.document?.hidden)
|
|
116
|
+
g.requestAnimationFrame(run);
|
|
117
|
+
else
|
|
118
|
+
setTimeout(run, 16);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Watch `fontSet` (by default `document.fonts`, or `self.fonts` in a
|
|
122
|
+
* worker): when faces finish loading, the measurements of their families
|
|
123
|
+
* are dropped — at most once per animation frame, however many slices a
|
|
124
|
+
* burst brings — and the {@link onFontsChanged} listeners are told.
|
|
125
|
+
* Calls nest; the returned function stops this watch. `prepareFonts`
|
|
126
|
+
* starts one on the set it loads into.
|
|
127
|
+
*/
|
|
128
|
+
export function watchFonts(fontSet = defaultFontSet()) {
|
|
129
|
+
if (!fontSet || !fontSet.addEventListener)
|
|
130
|
+
return () => { };
|
|
131
|
+
const set = fontSet;
|
|
132
|
+
track(set);
|
|
133
|
+
let w = watches.get(set);
|
|
134
|
+
if (!w) {
|
|
135
|
+
const watch = {
|
|
136
|
+
count: 0,
|
|
137
|
+
pending: new Set(),
|
|
138
|
+
scheduled: false,
|
|
139
|
+
listener: (event) => {
|
|
140
|
+
for (const face of event.fontfaces ?? [])
|
|
141
|
+
watch.pending.add(unquote(face.family).toLowerCase());
|
|
142
|
+
if (watch.scheduled)
|
|
143
|
+
return;
|
|
144
|
+
watch.scheduled = true;
|
|
145
|
+
nextFrame(() => {
|
|
146
|
+
watch.scheduled = false;
|
|
147
|
+
const changed = syncFontSet(set);
|
|
148
|
+
// A build between the event and this frame may have dropped
|
|
149
|
+
// them already: the faces still arrived.
|
|
150
|
+
const families = [...new Set([...changed, ...watch.pending])];
|
|
151
|
+
watch.pending.clear();
|
|
152
|
+
if (families.length === 0)
|
|
153
|
+
return;
|
|
154
|
+
for (const l of [...listeners])
|
|
155
|
+
l(families);
|
|
156
|
+
});
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
set.addEventListener('loadingdone', watch.listener);
|
|
160
|
+
watches.set(set, watch);
|
|
161
|
+
w = watch;
|
|
162
|
+
}
|
|
163
|
+
w.count++;
|
|
164
|
+
let stopped = false;
|
|
165
|
+
const current = w;
|
|
166
|
+
return () => {
|
|
167
|
+
if (stopped)
|
|
168
|
+
return;
|
|
169
|
+
stopped = true;
|
|
170
|
+
current.count--;
|
|
171
|
+
if (current.count === 0) {
|
|
172
|
+
set.removeEventListener?.('loadingdone', current.listener);
|
|
173
|
+
watches.delete(set);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
/** Whether `fontSet` is watched. */
|
|
178
|
+
export function isWatchingFonts(fontSet = defaultFontSet()) {
|
|
179
|
+
return !!fontSet && watches.has(fontSet);
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=fontSet.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fontSet.js","sourceRoot":"","sources":["../../src/fonts/fontSet.ts"],"names":[],"mappings":"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"}
|