postext 1.29.2 → 1.30.0
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/dist/__tests__/arabicLocale.test.js +5 -5
- package/dist/__tests__/arabicLocale.test.js.map +1 -1
- package/dist/__tests__/bundle/balloonPlacementPin.test.js +5 -4
- package/dist/__tests__/bundle/balloonPlacementPin.test.js.map +1 -1
- package/dist/__tests__/bundle/cjkRulesPin.test.js +8 -6
- package/dist/__tests__/bundle/cjkRulesPin.test.js.map +1 -1
- package/dist/__tests__/bundle/designOverflowPin.test.js +1 -1
- package/dist/__tests__/bundle/flowColumnsPin.test.js +4 -3
- package/dist/__tests__/bundle/flowColumnsPin.test.js.map +1 -1
- package/dist/__tests__/bundle/gridBalancingPin.test.js +5 -4
- package/dist/__tests__/bundle/gridBalancingPin.test.js.map +1 -1
- package/dist/__tests__/bundle/gridBreakRulesPin.test.js +14 -10
- package/dist/__tests__/bundle/gridBreakRulesPin.test.js.map +1 -1
- package/dist/__tests__/bundle/indexGroupSplitPin.test.js +4 -3
- package/dist/__tests__/bundle/indexGroupSplitPin.test.js.map +1 -1
- package/dist/__tests__/bundle/looseOrderPin.test.js +5 -4
- package/dist/__tests__/bundle/looseOrderPin.test.js.map +1 -1
- package/dist/__tests__/bundle/refLabelBreaksPin.test.js +5 -4
- package/dist/__tests__/bundle/refLabelBreaksPin.test.js.map +1 -1
- package/dist/__tests__/bundle/scriptContextPin.test.js +6 -5
- package/dist/__tests__/bundle/scriptContextPin.test.js.map +1 -1
- package/dist/__tests__/bundle/shapingLanguagePin.test.js +142 -46
- package/dist/__tests__/bundle/shapingLanguagePin.test.js.map +1 -1
- package/dist/__tests__/bundle/taskBoxPin.test.js +1 -1
- package/dist/__tests__/bundle/trailingStepPin.test.js +4 -3
- package/dist/__tests__/bundle/trailingStepPin.test.js.map +1 -1
- package/dist/__tests__/bundle/wideFloatStretchPin.test.js +4 -3
- package/dist/__tests__/bundle/wideFloatStretchPin.test.js.map +1 -1
- package/dist/__tests__/bundle.test.js +1 -1
- package/dist/__tests__/cellText.test.d.ts +2 -0
- package/dist/__tests__/cellText.test.d.ts.map +1 -0
- package/dist/__tests__/cellText.test.js +281 -0
- package/dist/__tests__/cellText.test.js.map +1 -0
- package/dist/__tests__/chineseLocale.test.js +13 -11
- package/dist/__tests__/chineseLocale.test.js.map +1 -1
- package/dist/__tests__/cjk/japaneseHtml.test.js +3 -3
- package/dist/__tests__/cjk/japaneseHtml.test.js.map +1 -1
- package/dist/__tests__/cjk/japaneseRuby.test.js +1 -1
- package/dist/__tests__/cjk/japaneseRuby.test.js.map +1 -1
- package/dist/__tests__/cjk/japaneseSegmentLanguage.test.js +3 -3
- package/dist/__tests__/cjk/japaneseSegmentLanguage.test.js.map +1 -1
- package/dist/__tests__/codeBlocks.test.js +1 -1
- package/dist/__tests__/contextText.test.d.ts +2 -0
- package/dist/__tests__/contextText.test.d.ts.map +1 -0
- package/dist/__tests__/contextText.test.js +371 -0
- package/dist/__tests__/contextText.test.js.map +1 -0
- package/dist/__tests__/design/designTextRender.test.js +8 -1
- package/dist/__tests__/design/designTextRender.test.js.map +1 -1
- package/dist/__tests__/exports.test.js +6 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/fontUsage.test.js +40 -0
- package/dist/__tests__/fontUsage.test.js.map +1 -1
- package/dist/__tests__/hardBreaks.test.js +1 -1
- package/dist/__tests__/headingInlineMarks.test.js +1 -1
- package/dist/__tests__/html-backend.test.js +6 -2
- package/dist/__tests__/html-backend.test.js.map +1 -1
- package/dist/__tests__/japaneseNotes.test.js +4 -2
- package/dist/__tests__/japaneseNotes.test.js.map +1 -1
- package/dist/__tests__/lineEndPieces.test.d.ts +2 -0
- package/dist/__tests__/lineEndPieces.test.d.ts.map +1 -0
- package/dist/__tests__/lineEndPieces.test.js +374 -0
- package/dist/__tests__/lineEndPieces.test.js.map +1 -0
- package/dist/__tests__/mathSizeMigration.test.js +2 -2
- package/dist/__tests__/pipeline/calloutInlineResourceGap.test.js +1 -1
- package/dist/__tests__/pipeline/calloutSplitMinLinesChild.test.js +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/headingSplitOrphans.test.js +1 -1
- package/dist/__tests__/pipeline/inlineFigureSpace.test.js +1 -1
- package/dist/__tests__/pipeline/paragraphContainerTail.test.js +1 -1
- package/dist/__tests__/pipeline/raggedOptimal.test.js +1 -1
- package/dist/__tests__/plainGeminateHead.test.d.ts +2 -0
- package/dist/__tests__/plainGeminateHead.test.d.ts.map +1 -0
- package/dist/__tests__/plainGeminateHead.test.js +92 -0
- package/dist/__tests__/plainGeminateHead.test.js.map +1 -0
- package/dist/__tests__/presets/showcaseShapingLanguage.test.d.ts +2 -0
- package/dist/__tests__/presets/showcaseShapingLanguage.test.d.ts.map +1 -0
- package/dist/__tests__/presets/showcaseShapingLanguage.test.js +52 -0
- package/dist/__tests__/presets/showcaseShapingLanguage.test.js.map +1 -0
- package/dist/__tests__/reshapedTracking.test.d.ts +2 -0
- package/dist/__tests__/reshapedTracking.test.d.ts.map +1 -0
- package/dist/__tests__/reshapedTracking.test.js +358 -0
- package/dist/__tests__/reshapedTracking.test.js.map +1 -0
- package/dist/__tests__/rtl/designRunsPainted.test.d.ts +2 -0
- package/dist/__tests__/rtl/designRunsPainted.test.d.ts.map +1 -0
- package/dist/__tests__/rtl/designRunsPainted.test.js +184 -0
- package/dist/__tests__/rtl/designRunsPainted.test.js.map +1 -0
- package/dist/__tests__/rtl/designTextPaint.test.js +5 -1
- package/dist/__tests__/rtl/designTextPaint.test.js.map +1 -1
- package/dist/__tests__/rtl/htmlRtl.test.js +3 -3
- package/dist/__tests__/rtl/htmlRtl.test.js.map +1 -1
- package/dist/__tests__/rtl/listMarkerDirection.test.js +28 -28
- package/dist/__tests__/rtl/listMarkerDirection.test.js.map +1 -1
- package/dist/__tests__/rtl/tocNumberPainted.test.d.ts +2 -0
- package/dist/__tests__/rtl/tocNumberPainted.test.d.ts.map +1 -0
- package/dist/__tests__/rtl/tocNumberPainted.test.js +113 -0
- package/dist/__tests__/rtl/tocNumberPainted.test.js.map +1 -0
- package/dist/__tests__/scriptContext.test.js +141 -1
- package/dist/__tests__/scriptContext.test.js.map +1 -1
- package/dist/__tests__/shapingLanguage.test.js +54 -41
- package/dist/__tests__/shapingLanguage.test.js.map +1 -1
- package/dist/__tests__/trackedLetters.test.d.ts +2 -0
- package/dist/__tests__/trackedLetters.test.d.ts.map +1 -0
- package/dist/__tests__/trackedLetters.test.js +380 -0
- package/dist/__tests__/trackedLetters.test.js.map +1 -0
- package/dist/__tests__/trackedLigatures.test.js +17 -5
- package/dist/__tests__/trackedLigatures.test.js.map +1 -1
- package/dist/__tests__/verseLines.test.js +1 -1
- package/dist/__tests__/wordCacheOrder.test.d.ts +2 -0
- package/dist/__tests__/wordCacheOrder.test.d.ts.map +1 -0
- package/dist/__tests__/wordCacheOrder.test.js +352 -0
- package/dist/__tests__/wordCacheOrder.test.js.map +1 -0
- package/dist/__tests__/wordPieces.test.d.ts +2 -0
- package/dist/__tests__/wordPieces.test.d.ts.map +1 -0
- package/dist/__tests__/wordPieces.test.js +762 -0
- package/dist/__tests__/wordPieces.test.js.map +1 -0
- package/dist/bidi.d.ts +12 -0
- package/dist/bidi.d.ts.map +1 -1
- package/dist/bidi.js +23 -0
- package/dist/bidi.js.map +1 -1
- package/dist/bundle/configVersion.d.ts +49 -23
- package/dist/bundle/configVersion.d.ts.map +1 -1
- package/dist/bundle/configVersion.js +54 -25
- package/dist/bundle/configVersion.js.map +1 -1
- package/dist/canvas-backend/blockRender.d.ts.map +1 -1
- package/dist/canvas-backend/blockRender.js +58 -27
- package/dist/canvas-backend/blockRender.js.map +1 -1
- package/dist/canvas-backend/cellText.d.ts +12 -0
- package/dist/canvas-backend/cellText.d.ts.map +1 -0
- package/dist/canvas-backend/cellText.js +114 -0
- package/dist/canvas-backend/cellText.js.map +1 -0
- package/dist/canvas-backend/chip.d.ts.map +1 -1
- package/dist/canvas-backend/chip.js +2 -1
- package/dist/canvas-backend/chip.js.map +1 -1
- package/dist/canvas-backend/contextState.d.ts +7 -0
- package/dist/canvas-backend/contextState.d.ts.map +1 -1
- package/dist/canvas-backend/contextState.js +7 -0
- package/dist/canvas-backend/contextState.js.map +1 -1
- package/dist/canvas-backend/contextText.d.ts +76 -0
- package/dist/canvas-backend/contextText.d.ts.map +1 -0
- package/dist/canvas-backend/contextText.js +102 -0
- package/dist/canvas-backend/contextText.js.map +1 -0
- package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
- package/dist/canvas-backend/headerFooter.js +8 -1
- package/dist/canvas-backend/headerFooter.js.map +1 -1
- package/dist/canvas-backend/index.d.ts.map +1 -1
- package/dist/canvas-backend/index.js +19 -13
- package/dist/canvas-backend/index.js.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.js +12 -6
- package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
- package/dist/canvas-backend/scriptText.d.ts.map +1 -1
- package/dist/canvas-backend/scriptText.js +3 -2
- package/dist/canvas-backend/scriptText.js.map +1 -1
- package/dist/canvas-backend/segmentText.d.ts.map +1 -1
- package/dist/canvas-backend/segmentText.js +8 -2
- package/dist/canvas-backend/segmentText.js.map +1 -1
- package/dist/canvas-backend/trackedText.d.ts +75 -1
- package/dist/canvas-backend/trackedText.d.ts.map +1 -1
- package/dist/canvas-backend/trackedText.js +185 -22
- package/dist/canvas-backend/trackedText.js.map +1 -1
- package/dist/canvas-backend/verticalText.d.ts +9 -0
- package/dist/canvas-backend/verticalText.d.ts.map +1 -1
- package/dist/canvas-backend/verticalText.js +29 -7
- package/dist/canvas-backend/verticalText.js.map +1 -1
- package/dist/canvas-backend/wordPieces.d.ts +31 -0
- package/dist/canvas-backend/wordPieces.d.ts.map +1 -0
- package/dist/canvas-backend/wordPieces.js +132 -0
- package/dist/canvas-backend/wordPieces.js.map +1 -0
- package/dist/canvas-backend/wordRuns.d.ts +3 -1
- package/dist/canvas-backend/wordRuns.d.ts.map +1 -1
- package/dist/canvas-backend/wordRuns.js +10 -6
- package/dist/canvas-backend/wordRuns.js.map +1 -1
- package/dist/comics/lettering/__tests__/fitAsPainted.test.d.ts +2 -0
- package/dist/comics/lettering/__tests__/fitAsPainted.test.d.ts.map +1 -0
- package/dist/comics/lettering/__tests__/fitAsPainted.test.js +97 -0
- package/dist/comics/lettering/__tests__/fitAsPainted.test.js.map +1 -0
- package/dist/comics/lettering/shape-text.d.ts.map +1 -1
- package/dist/comics/lettering/shape-text.js +39 -11
- package/dist/comics/lettering/shape-text.js.map +1 -1
- package/dist/defaults/bodyText.d.ts.map +1 -1
- package/dist/defaults/bodyText.js +6 -5
- package/dist/defaults/bodyText.js.map +1 -1
- package/dist/design/bidiText.d.ts +45 -6
- package/dist/design/bidiText.d.ts.map +1 -1
- package/dist/design/bidiText.js +78 -10
- package/dist/design/bidiText.js.map +1 -1
- package/dist/design/cjkText.d.ts +3 -0
- package/dist/design/cjkText.d.ts.map +1 -1
- package/dist/design/cjkText.js +1 -1
- package/dist/design/cjkText.js.map +1 -1
- package/dist/design/layout.d.ts.map +1 -1
- package/dist/design/layout.js +36 -5
- package/dist/design/layout.js.map +1 -1
- package/dist/design/richText.d.ts +9 -1
- package/dist/design/richText.d.ts.map +1 -1
- package/dist/design/richText.js +8 -2
- package/dist/design/richText.js.map +1 -1
- package/dist/fonts/usage.d.ts +2 -0
- package/dist/fonts/usage.d.ts.map +1 -1
- package/dist/fonts/usage.js +18 -0
- package/dist/fonts/usage.js.map +1 -1
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +664 -84
- package/dist/html-backend.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/knuthPlass/breakpoints.d.ts.map +1 -1
- package/dist/knuthPlass/breakpoints.js +4 -2
- package/dist/knuthPlass/breakpoints.js.map +1 -1
- package/dist/knuthPlass/pretextAdapter.d.ts +6 -3
- package/dist/knuthPlass/pretextAdapter.d.ts.map +1 -1
- package/dist/knuthPlass/pretextAdapter.js +11 -3
- package/dist/knuthPlass/pretextAdapter.js.map +1 -1
- package/dist/knuthPlass/richAdapter.d.ts +13 -1
- package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
- package/dist/knuthPlass/richAdapter.js +53 -5
- package/dist/knuthPlass/richAdapter.js.map +1 -1
- package/dist/knuthPlass/tracking.d.ts.map +1 -1
- package/dist/knuthPlass/tracking.js +3 -2
- package/dist/knuthPlass/tracking.js.map +1 -1
- package/dist/knuthPlass/types.d.ts +6 -0
- package/dist/knuthPlass/types.d.ts.map +1 -1
- package/dist/locale.d.ts +21 -17
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +23 -19
- package/dist/locale.js.map +1 -1
- package/dist/measure/canvas.d.ts +21 -0
- package/dist/measure/canvas.d.ts.map +1 -1
- package/dist/measure/canvas.js +165 -85
- package/dist/measure/canvas.js.map +1 -1
- package/dist/measure/cjkCompose.d.ts.map +1 -1
- package/dist/measure/cjkCompose.js +31 -5
- package/dist/measure/cjkCompose.js.map +1 -1
- package/dist/measure/plain.d.ts.map +1 -1
- package/dist/measure/plain.js +31 -6
- package/dist/measure/plain.js.map +1 -1
- package/dist/measure/pretextLanguage.d.ts.map +1 -1
- package/dist/measure/pretextLanguage.js +49 -7
- package/dist/measure/pretextLanguage.js.map +1 -1
- package/dist/measure/rich.d.ts +18 -1
- package/dist/measure/rich.d.ts.map +1 -1
- package/dist/measure/rich.js +200 -29
- package/dist/measure/rich.js.map +1 -1
- package/dist/measure/script.d.ts +17 -1
- package/dist/measure/script.d.ts.map +1 -1
- package/dist/measure/script.js +17 -1
- package/dist/measure/script.js.map +1 -1
- package/dist/measure/trackedLigatures.d.ts +59 -0
- package/dist/measure/trackedLigatures.d.ts.map +1 -0
- package/dist/measure/trackedLigatures.js +144 -0
- package/dist/measure/trackedLigatures.js.map +1 -0
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +4 -3
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/calloutLayout.d.ts.map +1 -1
- package/dist/pipeline/calloutLayout.js +26 -7
- package/dist/pipeline/calloutLayout.js.map +1 -1
- package/dist/pipeline/lists.d.ts +13 -4
- package/dist/pipeline/lists.d.ts.map +1 -1
- package/dist/pipeline/lists.js +49 -12
- package/dist/pipeline/lists.js.map +1 -1
- package/dist/pipeline/toc.d.ts.map +1 -1
- package/dist/pipeline/toc.js +33 -9
- package/dist/pipeline/toc.js.map +1 -1
- package/dist/types.d.ts +35 -26
- package/dist/types.d.ts.map +1 -1
- package/dist/wordPieces.d.ts +120 -0
- package/dist/wordPieces.d.ts.map +1 -0
- package/dist/wordPieces.js +319 -0
- package/dist/wordPieces.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"showcaseShapingLanguage.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/presets/showcaseShapingLanguage.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/ban-ts-comment -- node built-ins in a test */
|
|
2
|
+
// @ts-nocheck
|
|
3
|
+
/* #770: the showcase bundles (apps/web/public/presets) keep their lines
|
|
4
|
+
now that a document is shaped in its own language by default. Each was
|
|
5
|
+
laid out in the language of the page that hosted it and is stamped
|
|
6
|
+
below `configVersion` 14 (8, or nothing at all), so the engine's own
|
|
7
|
+
migration writes `bodyText.shapingLanguage: 'host'` on the body text
|
|
8
|
+
every one of its editions is laid out with. None is to be stamped again
|
|
9
|
+
without being laid out again: the stamp is what keeps it. */
|
|
10
|
+
import { describe, it, expect } from 'vitest';
|
|
11
|
+
import { readdirSync, readFileSync, existsSync } from 'node:fs';
|
|
12
|
+
import { join } from 'node:path';
|
|
13
|
+
import { CONFIG_VERSION, migrateBundleConfig } from '../../bundle/configVersion';
|
|
14
|
+
import { pickLocaleOverrides } from '../../bundle/manifest';
|
|
15
|
+
import { shapingLanguageOf } from '../../locale';
|
|
16
|
+
import { resolveAllConfig } from '../../pipeline/config';
|
|
17
|
+
const PRESETS = join(__dirname, '../../../../../apps/web/public/presets');
|
|
18
|
+
/** The editions a bundle serves: its own language, the ones it lists and
|
|
19
|
+
* the ones it rewords. */
|
|
20
|
+
function editionsOf(manifest) {
|
|
21
|
+
const listed = manifest.locales ?? [];
|
|
22
|
+
return [...new Set([...(manifest.locale ? [manifest.locale] : []), ...listed, ...Object.keys(manifest.localized ?? {})])];
|
|
23
|
+
}
|
|
24
|
+
describe('#770: the showcase bundles are shaped in the language of the host, as they were laid out', () => {
|
|
25
|
+
const ids = existsSync(PRESETS) ? readdirSync(PRESETS).filter((d) => existsSync(join(PRESETS, d, 'preset.json'))) : [];
|
|
26
|
+
const manifestOf = (id) => JSON.parse(readFileSync(join(PRESETS, id, 'preset.json'), 'utf8'));
|
|
27
|
+
it('finds the showcase bundles and their editions', () => {
|
|
28
|
+
expect(ids.length).toBeGreaterThan(5);
|
|
29
|
+
expect(ids.flatMap((id) => editionsOf(manifestOf(id))).length).toBeGreaterThanOrEqual(ids.length);
|
|
30
|
+
});
|
|
31
|
+
it.each(ids)('%s: stamped before 14, and every edition reads with the host\'s language', (id) => {
|
|
32
|
+
const manifest = manifestOf(id);
|
|
33
|
+
const stamp = manifest.configVersion;
|
|
34
|
+
expect(stamp === undefined || (typeof stamp === 'number' && stamp < 14), `${id} is stamped ${String(stamp)}`).toBe(true);
|
|
35
|
+
expect(CONFIG_VERSION).toBeGreaterThanOrEqual(14);
|
|
36
|
+
const editions = editionsOf(manifest);
|
|
37
|
+
expect(editions.length).toBeGreaterThan(0);
|
|
38
|
+
for (const locale of editions) {
|
|
39
|
+
const overrides = pickLocaleOverrides(manifest, locale);
|
|
40
|
+
const config = migrateBundleConfig({}, [manifest.config ?? {}, overrides?.config ?? {}], stamp);
|
|
41
|
+
expect(config.bodyText?.shapingLanguage, `${id} ${locale}`).toBe('host');
|
|
42
|
+
const resolved = resolveAllConfig({ ...config, locale: config.locale ?? locale });
|
|
43
|
+
expect(resolved.bodyText.shapingLanguage, `${id} ${locale}`).toBe('host');
|
|
44
|
+
expect(shapingLanguageOf(resolved), `${id} ${locale}`).toBeUndefined();
|
|
45
|
+
// The same manifest under today's stamp would be shaped in its own
|
|
46
|
+
// language: the stamp is what keeps it.
|
|
47
|
+
const restamped = migrateBundleConfig({}, [manifest.config ?? {}, overrides?.config ?? {}], CONFIG_VERSION);
|
|
48
|
+
expect(shapingLanguageOf(resolveAllConfig({ ...restamped, locale: restamped.locale ?? locale })), `${id} ${locale}`).not.toBeUndefined();
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
//# sourceMappingURL=showcaseShapingLanguage.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"showcaseShapingLanguage.test.js","sourceRoot":"","sources":["../../../src/__tests__/presets/showcaseShapingLanguage.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reshapedTracking.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/reshapedTracking.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { renderBlock } from '../canvas-backend/blockRender';
|
|
3
|
+
import { fillTrackedWord, setLetterTracking } from '../canvas-backend/trackedText';
|
|
4
|
+
import { setSegmentLanguages } from '../canvas-backend/wordRuns';
|
|
5
|
+
import { setLetterSpacing } from '../canvas-backend/contextState';
|
|
6
|
+
import { setVerticalPaint } from '../canvas-backend/verticalText';
|
|
7
|
+
import { renderToHtml } from '../html-backend';
|
|
8
|
+
import { buildDocument } from '../pipeline';
|
|
9
|
+
// #770: what a letter-spacing takes away besides ligatures. Chrome sets no
|
|
10
|
+
// contextual alternate under a letter-spacing, and the canvas cannot ask
|
|
11
|
+
// for one: a tracked word of a face with such forms was measured with them
|
|
12
|
+
// and painted without. In a document shaped in its own language a word
|
|
13
|
+
// whose pieces do not end where it was measured to end, or that the
|
|
14
|
+
// letter-spacing reshapes with no ligature to keep, is set whole at the
|
|
15
|
+
// letter-spacing that ends it there, on the canvas and in the HTML. And two
|
|
16
|
+
// more texts painted as measured: the pieces of a sideways word down a
|
|
17
|
+
// vertical line on the canvas, and the runs of a design line in the HTML.
|
|
18
|
+
// A face as a browser measures it. With no letter-spacing: ligatures (ff,
|
|
19
|
+
// fi, fl, ffi) narrower than their letters; a hyphen between two capitals
|
|
20
|
+
// 0.1 em wider (a form by its two neighbours: no pair of letters tells);
|
|
21
|
+
// an N after a U 0.05 em wider (a form by one neighbour, which reads as a
|
|
22
|
+
// ligature of the pair), and a Hebrew bet after an alef; a T after NI 0.1
|
|
23
|
+
// em wider (so `IT`, set alone
|
|
24
|
+
// after `UN`, is not as wide as its part of `UNIT`); a Han character
|
|
25
|
+
// between two others 0.2 em narrower (a face that draws its cells by their
|
|
26
|
+
// neighbours). Under a letter-spacing none of them, and the spacing after
|
|
27
|
+
// every letter. A zero width non-joiner advances nothing and takes no
|
|
28
|
+
// spacing; no ligature forms across it, and the forms by the neighbours
|
|
29
|
+
// stand across it.
|
|
30
|
+
const ZWNJ = '\u200C';
|
|
31
|
+
const ADVANCE = (ch) => {
|
|
32
|
+
if (ch === ' ')
|
|
33
|
+
return 0.25;
|
|
34
|
+
if ('ilf-'.includes(ch))
|
|
35
|
+
return 0.3;
|
|
36
|
+
if (/[A-Z]/.test(ch))
|
|
37
|
+
return 0.6;
|
|
38
|
+
if (ch.codePointAt(0) >= 0x2e80)
|
|
39
|
+
return 1;
|
|
40
|
+
return 0.5;
|
|
41
|
+
};
|
|
42
|
+
const LIGATURES = [['ffi', 0.75], ['ff', 0.5], ['fi', 0.5], ['fl', 0.5]];
|
|
43
|
+
function naturalWidth(raw, size, shaped) {
|
|
44
|
+
// The letters, and whether a non-joiner stands before each.
|
|
45
|
+
const text = raw.replaceAll(ZWNJ, '');
|
|
46
|
+
const apart = [];
|
|
47
|
+
for (let i = 0; i < raw.length; i++)
|
|
48
|
+
if (raw[i] !== ZWNJ)
|
|
49
|
+
apart.push(raw[i - 1] === ZWNJ);
|
|
50
|
+
let w = 0;
|
|
51
|
+
for (let i = 0; i < text.length;) {
|
|
52
|
+
const lig = shaped ? LIGATURES.find(([l]) => text.startsWith(l, i) && !apart.slice(i + 1, i + l.length).includes(true)) : undefined;
|
|
53
|
+
if (lig) {
|
|
54
|
+
w += lig[1] * size;
|
|
55
|
+
i += lig[0].length;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
w += ADVANCE(text[i]) * size;
|
|
59
|
+
if (shaped) {
|
|
60
|
+
if (text[i] === '-' && /[A-Z]/.test(text[i - 1] ?? '') && /[A-Z]/.test(text[i + 1] ?? ''))
|
|
61
|
+
w += 0.1 * size;
|
|
62
|
+
if (text[i] === 'N' && text[i - 1] === 'U')
|
|
63
|
+
w += 0.05 * size;
|
|
64
|
+
if (text[i] === '\u05D1' && text[i - 1] === '\u05D0')
|
|
65
|
+
w += 0.05 * size;
|
|
66
|
+
if (text[i] === 'T' && text.slice(i - 2, i) === 'NI')
|
|
67
|
+
w += 0.1 * size;
|
|
68
|
+
if (text[i] === '\u5B57' && text[i - 1] === '\u6F22' && text[i + 1] === '\u4F53')
|
|
69
|
+
w -= 0.2 * size;
|
|
70
|
+
}
|
|
71
|
+
i++;
|
|
72
|
+
}
|
|
73
|
+
return w;
|
|
74
|
+
}
|
|
75
|
+
const lettersOf = (text) => text.replaceAll(ZWNJ, '').length;
|
|
76
|
+
const sizeOf = (font) => parseFloat(/(\d*\.?\d+)px/.exec(font)?.[1] ?? '10');
|
|
77
|
+
class BrowserCtx {
|
|
78
|
+
font = '10px Body';
|
|
79
|
+
letterSpacing = '0px';
|
|
80
|
+
lang = 'inherit';
|
|
81
|
+
measureText(s) {
|
|
82
|
+
const spacing = parseFloat(this.letterSpacing) || 0;
|
|
83
|
+
return { width: naturalWidth(s, sizeOf(this.font), spacing === 0) + spacing * lettersOf(s) };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function paintingCtx() {
|
|
87
|
+
const seen = [];
|
|
88
|
+
const ctx = Object.assign(new BrowserCtx(), {
|
|
89
|
+
fillStyle: '', textBaseline: 'alphabetic', textAlign: 'left',
|
|
90
|
+
fillText(text, x, y) {
|
|
91
|
+
seen.push({ text, x, y, spacing: parseFloat(this.letterSpacing) || 0, width: this.measureText(text).width });
|
|
92
|
+
},
|
|
93
|
+
save() { }, restore() { }, beginPath() { }, rect() { }, clip() { }, fillRect() { }, moveTo() { }, lineTo() { }, stroke() { },
|
|
94
|
+
});
|
|
95
|
+
return { ctx: ctx, seen };
|
|
96
|
+
}
|
|
97
|
+
globalThis.OffscreenCanvas = class {
|
|
98
|
+
getContext() {
|
|
99
|
+
return new BrowserCtx();
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
/** `text` painted as a tracked word at 20 px, 2 px a letter, from x = 100,
|
|
103
|
+
* in a document shaped in its own language (`own`) or its host's. */
|
|
104
|
+
function tracked(text, own) {
|
|
105
|
+
const { ctx, seen } = paintingCtx();
|
|
106
|
+
ctx.font = '20px Body';
|
|
107
|
+
setLetterSpacing(ctx, 2);
|
|
108
|
+
setLetterTracking(own);
|
|
109
|
+
const advance = fillTrackedWord(ctx, text, 100, 50, 2, (piece, x, y) => ctx.fillText(piece, x, y));
|
|
110
|
+
setLetterTracking(false);
|
|
111
|
+
return { seen, advance, left: ctx.letterSpacing };
|
|
112
|
+
}
|
|
113
|
+
/** The width `text` was measured at: its natural width and 2 px a letter. */
|
|
114
|
+
const measured = (text) => naturalWidth(text, 20, true) + 2 * text.length;
|
|
115
|
+
describe('a tracked word the letter-spacing reshapes, on canvas (#770)', () => {
|
|
116
|
+
it('with no ligature to keep: whole, at the letter-spacing that ends it where it was measured', () => {
|
|
117
|
+
const own = tracked('TEA-PARTY', true);
|
|
118
|
+
expect(own.seen.map((p) => p.text)).toEqual(['TEA-PARTY']);
|
|
119
|
+
const [p] = own.seen;
|
|
120
|
+
expect(p.x).toBe(100);
|
|
121
|
+
// The hyphen is 2 px narrower under a letter-spacing: shared among nine letters.
|
|
122
|
+
expect(p.spacing).toBeCloseTo(2 + 2 / 9, 9);
|
|
123
|
+
expect(p.width).toBeCloseTo(measured('TEA-PARTY'), 9);
|
|
124
|
+
expect(own.advance).toBeCloseTo(measured('TEA-PARTY'), 9);
|
|
125
|
+
expect(own.left).toBe('2px');
|
|
126
|
+
// Keeping its host's language: at the tracking, 2 px short of its box, as it was.
|
|
127
|
+
const host = tracked('TEA-PARTY', false);
|
|
128
|
+
expect(host.seen.map((p) => [p.text, p.spacing])).toEqual([['TEA-PARTY', 2]]);
|
|
129
|
+
expect(host.seen[0].width).toBeCloseTo(measured('TEA-PARTY') - 2, 9);
|
|
130
|
+
expect(host.advance).toBeUndefined();
|
|
131
|
+
});
|
|
132
|
+
it('whose pieces do not end where it was measured to end: whole, the same way', () => {
|
|
133
|
+
const own = tracked('UNIT', true);
|
|
134
|
+
expect(own.seen.map((p) => p.text)).toEqual(['UNIT']);
|
|
135
|
+
// 1 px for the N and 2 px for the T, shared among four letters.
|
|
136
|
+
expect(own.seen[0].spacing).toBeCloseTo(2 + 3 / 4, 9);
|
|
137
|
+
expect(own.seen[0].x + own.seen[0].width).toBeCloseTo(100 + measured('UNIT'), 9);
|
|
138
|
+
// Keeping its host's language: the pieces it had, which end 2 px short.
|
|
139
|
+
const host = tracked('UNIT', false);
|
|
140
|
+
expect(host.seen.map((p) => [p.text, p.spacing])).toEqual([['UN', 0], ['IT', 2]]);
|
|
141
|
+
});
|
|
142
|
+
it('letters in a form by their neighbour are no ligature: tracked as the rest of the line', () => {
|
|
143
|
+
// `UN`: the N is 1 px wider after a U, a form the non-joiner leaves
|
|
144
|
+
// and the letter-spacing takes away. Read as a ligature, the word was
|
|
145
|
+
// painted with no tracking inside and 4 px of it after.
|
|
146
|
+
const own = tracked('UN', true);
|
|
147
|
+
expect(own.seen.map((p) => p.text)).toEqual(['UN']);
|
|
148
|
+
const [p] = own.seen;
|
|
149
|
+
expect(p.x).toBe(100);
|
|
150
|
+
// 2 px a letter, and the 1 px of the N's form shared between the two.
|
|
151
|
+
expect(p.spacing).toBeCloseTo(2 + 1 / 2, 9);
|
|
152
|
+
expect(p.x + p.width).toBeCloseTo(100 + measured('UN'), 9);
|
|
153
|
+
expect(own.advance).toBeCloseTo(measured('UN'), 9);
|
|
154
|
+
expect(own.left).toBe('2px');
|
|
155
|
+
// In a line of several words it is spaced as they are.
|
|
156
|
+
const line = tracked('UN MAD TEA-PARTY', true);
|
|
157
|
+
expect(line.seen.map((q) => q.text)).toEqual(['UN', ' ', 'MAD', ' ', 'TEA-PARTY']);
|
|
158
|
+
expect(line.seen[0].spacing).toBeCloseTo(2.5, 9);
|
|
159
|
+
expect(line.seen[2].x).toBeCloseTo(100 + measured('UN '), 9);
|
|
160
|
+
// A ligature, which the non-joiner dissolves, keeps its piece.
|
|
161
|
+
expect(tracked('fi', true).seen.map((q) => [q.text, q.spacing])).toEqual([['fi', 0]]);
|
|
162
|
+
// Keeping its host's language: the pair is painted as the ligature it
|
|
163
|
+
// was read as.
|
|
164
|
+
const host = tracked('UN', false);
|
|
165
|
+
expect(host.seen.map((q) => [q.text, q.spacing])).toEqual([['UN', 0]]);
|
|
166
|
+
});
|
|
167
|
+
it('a right-to-left word is painted as it was, forms by the neighbours and all', () => {
|
|
168
|
+
// Alef and bet, the bet in a form by its neighbour: never painted at a
|
|
169
|
+
// letter-spacing of its own, so it keeps the piece it had.
|
|
170
|
+
const WORD = '\u05D0\u05D1';
|
|
171
|
+
const painted = (own) => {
|
|
172
|
+
const { ctx, seen } = paintingCtx();
|
|
173
|
+
ctx.font = '20px Body';
|
|
174
|
+
ctx.direction = 'rtl';
|
|
175
|
+
setLetterSpacing(ctx, 2);
|
|
176
|
+
setLetterTracking(own);
|
|
177
|
+
fillTrackedWord(ctx, WORD, 100, 50, 2, (piece, x, y) => ctx.fillText(piece, x, y));
|
|
178
|
+
setLetterTracking(false);
|
|
179
|
+
return seen.map((p) => [p.text, p.spacing]);
|
|
180
|
+
};
|
|
181
|
+
expect(painted(true)).toEqual([[WORD, 0]]);
|
|
182
|
+
expect(painted(true)).toEqual(painted(false));
|
|
183
|
+
});
|
|
184
|
+
it('a word whose ligature pieces fit keeps them', () => {
|
|
185
|
+
for (const own of [true, false]) {
|
|
186
|
+
const { seen, advance } = tracked('first', own);
|
|
187
|
+
expect(seen.map((p) => [p.text, p.spacing])).toEqual([['fi', 0], ['rst', 2]]);
|
|
188
|
+
expect(advance).toBeCloseTo(measured('first'), 9);
|
|
189
|
+
}
|
|
190
|
+
// Every letter tracked: the piece after the ligature ends on the box.
|
|
191
|
+
const last = tracked('first', true).seen[1];
|
|
192
|
+
expect(last.x + last.width).toBeCloseTo(100 + measured('first'), 9);
|
|
193
|
+
});
|
|
194
|
+
it('a text of several words: word by word, each where the natural shaping puts it', () => {
|
|
195
|
+
const { seen, advance } = tracked('first A MAD TEA-PARTY', true);
|
|
196
|
+
expect(seen.map((p) => p.text)).toEqual(['fi', 'rst', ' ', 'A', ' ', 'MAD', ' ', 'TEA-PARTY']);
|
|
197
|
+
// Each word starts at the natural width of what stands before it and
|
|
198
|
+
// the tracking of every letter before it.
|
|
199
|
+
const at = (before) => 100 + measured(before);
|
|
200
|
+
expect(seen[3].x).toBeCloseTo(at('first '), 9);
|
|
201
|
+
expect(seen[5].x).toBeCloseTo(at('first A '), 9);
|
|
202
|
+
expect(seen[7].x).toBeCloseTo(at('first A MAD '), 9);
|
|
203
|
+
expect(seen.slice(1, 7).every((p) => p.spacing === 2)).toBe(true);
|
|
204
|
+
expect(seen[7].spacing).toBeCloseTo(2 + 2 / 9, 9);
|
|
205
|
+
expect(seen[7].x + seen[7].width).toBeCloseTo(at('first A MAD TEA-PARTY'), 9);
|
|
206
|
+
expect(advance).toBeCloseTo(measured('first A MAD TEA-PARTY'), 9);
|
|
207
|
+
// A text the letter-spacing leaves as it is: one text, as before.
|
|
208
|
+
expect(tracked('A MAD DAY', true).seen.map((p) => p.text)).toEqual(['A MAD DAY']);
|
|
209
|
+
});
|
|
210
|
+
it('a text with a CJK character is left at the tracking: its cells are not measured at a natural width', () => {
|
|
211
|
+
const { seen, advance } = tracked(CJK, true);
|
|
212
|
+
expect(seen.map((p) => [p.text, p.spacing])).toEqual([[CJK, 2]]);
|
|
213
|
+
expect(advance).toBeUndefined();
|
|
214
|
+
});
|
|
215
|
+
});
|
|
216
|
+
// Three Han characters the face draws 0.2 em narrower together.
|
|
217
|
+
const CJK = '\u6F22\u5B57\u4F53';
|
|
218
|
+
const pt = (value) => ({ value, unit: 'pt' });
|
|
219
|
+
// 72 dpi: 1 pt = 1 px.
|
|
220
|
+
const OWN = {
|
|
221
|
+
page: { width: pt(400), height: pt(900), dpi: 72, margins: { top: pt(40), bottom: pt(10), left: pt(10), right: pt(10) } },
|
|
222
|
+
layout: { layoutType: 'single' },
|
|
223
|
+
header: { elements: [] },
|
|
224
|
+
footer: { elements: [] },
|
|
225
|
+
bodyText: { fontSize: pt(10), lineHeight: pt(14), firstLineIndent: pt(0), hyphenation: { enabled: false }, shapingLanguage: 'document' },
|
|
226
|
+
};
|
|
227
|
+
const HOST = { ...OWN, bodyText: { ...OWN.bodyText, shapingLanguage: 'host' } };
|
|
228
|
+
const head = (config, element) => ({
|
|
229
|
+
...config,
|
|
230
|
+
header: { elements: [{ kind: 'text', id: 'rh', fontSize: pt(10), placement: { anchor: { to: 'container', edge: 'top-left' }, size: { width: 'auto' } }, ...element }] },
|
|
231
|
+
});
|
|
232
|
+
const headOf = (doc) => doc.pages[0].header.blocks.find((b) => b.kind === 'text');
|
|
233
|
+
describe('a tracked design text the letter-spacing reshapes, in HTML (#770)', () => {
|
|
234
|
+
const TEXT = 'first TEA-PARTY UNIT';
|
|
235
|
+
it('shaped in its own language: each such word in a box at its own letter-spacing', () => {
|
|
236
|
+
const doc = buildDocument({ markdown: 'Text.' }, head(OWN, { content: TEXT, letterSpacing: pt(0.2) }));
|
|
237
|
+
// Measured at its natural width and the tracking of each letter.
|
|
238
|
+
expect(headOf(doc).lines[0].width).toBeCloseTo(naturalWidth(TEXT, 10, true) + 0.2 * TEXT.length, 6);
|
|
239
|
+
const html = renderToHtml(doc);
|
|
240
|
+
// 1 px over nine letters; 0.5 px and 1 px over four.
|
|
241
|
+
expect(html).toContain('<span style="letter-spacing:0.3111px;">TEA-PARTY</span>');
|
|
242
|
+
expect(html).toContain('<span style="letter-spacing:0.5750px;">UNIT</span>');
|
|
243
|
+
// A ligature whose pieces fit stays a box of its own.
|
|
244
|
+
expect(html).toMatch(/<span style="letter-spacing:0;margin-inline-end:0\.400px;">fi<\/span>rst/);
|
|
245
|
+
});
|
|
246
|
+
it('letters in a form by their neighbour are no ligature: the word in a box at its own letter-spacing', () => {
|
|
247
|
+
const doc = buildDocument({ markdown: 'Text.' }, head(OWN, { content: 'UN first', letterSpacing: pt(0.2) }));
|
|
248
|
+
const html = renderToHtml(doc);
|
|
249
|
+
// 0.2 px a letter, and the 0.5 px of the N's form shared between the two.
|
|
250
|
+
expect(html).toContain('<span style="letter-spacing:0.4500px;">UN</span>');
|
|
251
|
+
expect(html).not.toMatch(/<span style="letter-spacing:0;[^"]*">UN<\/span>/);
|
|
252
|
+
expect(html).toMatch(/<span style="letter-spacing:0;margin-inline-end:0\.400px;">fi<\/span>rst/);
|
|
253
|
+
});
|
|
254
|
+
it('keeping its host\'s language: as it was', () => {
|
|
255
|
+
const html = renderToHtml(buildDocument({ markdown: 'Text.' }, head(HOST, { content: TEXT, letterSpacing: pt(0.2) })));
|
|
256
|
+
expect(html).not.toContain('letter-spacing:0.3111px');
|
|
257
|
+
expect(html).not.toContain('letter-spacing:0.5750px');
|
|
258
|
+
expect(html).toContain('TEA-PARTY');
|
|
259
|
+
});
|
|
260
|
+
});
|
|
261
|
+
describe('a tracked line down a vertical page, in HTML (#770)', () => {
|
|
262
|
+
it('its CJK text takes no letter-spacing of its own', () => {
|
|
263
|
+
const config = { ...OWN, layout: { writingMode: 'vertical-rl', layoutType: 'single' }, headings: { levels: [{ level: 2, letterSpacing: pt(0.5) }] } };
|
|
264
|
+
const html = renderToHtml(buildDocument({ markdown: `## ${CJK}` }, config));
|
|
265
|
+
expect(html).toContain(CJK);
|
|
266
|
+
expect(html).not.toMatch(new RegExp(`<span style="letter-spacing:[-\\d.]+px;">${CJK}</span>`));
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
describe('a design line of several runs, in HTML (#770)', () => {
|
|
270
|
+
const CONTENT = 'Ada Lovelace^1^, Alan Turing^2^, Grace Hopper';
|
|
271
|
+
it('shaped in its own language: a box per run, each where the widths before it end', () => {
|
|
272
|
+
const doc = buildDocument({ markdown: 'Text.' }, head(OWN, { content: CONTENT, inlineMarks: true }));
|
|
273
|
+
const line = headOf(doc).lines[0];
|
|
274
|
+
expect(line.runs.map((r) => r.text)).toEqual(['Ada Lovelace', '1', ', Alan Turing', '2', ', Grace Hopper']);
|
|
275
|
+
const html = renderToHtml(doc);
|
|
276
|
+
let x = 0;
|
|
277
|
+
for (const run of line.runs) {
|
|
278
|
+
expect(html).toContain(`<span dir="ltr" style="position:absolute;left:${x.toFixed(3)}px;`);
|
|
279
|
+
x += run.width;
|
|
280
|
+
}
|
|
281
|
+
// The text reads as written.
|
|
282
|
+
expect(html.replace(/<[^>]+>/g, '')).toContain('Ada Lovelace1, Alan Turing2, Grace Hopper');
|
|
283
|
+
});
|
|
284
|
+
it('keeping its host\'s language: the runs inline, as they were', () => {
|
|
285
|
+
const html = renderToHtml(buildDocument({ markdown: 'Text.' }, head(HOST, { content: CONTENT, inlineMarks: true })));
|
|
286
|
+
expect(html).not.toContain('<span dir="ltr" style="position:absolute;left:');
|
|
287
|
+
expect(html.replace(/<[^>]+>/g, '')).toContain('Ada Lovelace1, Alan Turing2, Grace Hopper');
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
describe('a sideways word down a vertical line, on canvas (#770)', () => {
|
|
291
|
+
const paragraph = (doc) => doc.blocks.find((b) => b.type === 'paragraph');
|
|
292
|
+
// Soft hyphens: the word in the pieces of its syllables. The italic word
|
|
293
|
+
// makes the line one painted segment by segment.
|
|
294
|
+
const MD = 'office *x* officer';
|
|
295
|
+
const painted = (config) => {
|
|
296
|
+
const doc = buildDocument({ markdown: MD }, { ...config, layout: { writingMode: 'vertical-rl', layoutType: 'single' }, bodyText: { ...config.bodyText, textAlign: 'left' } });
|
|
297
|
+
const block = paragraph(doc);
|
|
298
|
+
// The layout holds the word in its pieces, the ligature across a cut:
|
|
299
|
+
// the second piece is what the word grew by.
|
|
300
|
+
expect(block.lines[0].segments.map((s) => s.text).join('|')).toContain('of|fice');
|
|
301
|
+
const { ctx, seen } = paintingCtx();
|
|
302
|
+
const outer = setVerticalPaint({ region: 'mainland' });
|
|
303
|
+
setSegmentLanguages(config === OWN);
|
|
304
|
+
renderBlock(ctx, block, block.bbox.width, block.bbox.x);
|
|
305
|
+
setSegmentLanguages(false);
|
|
306
|
+
setVerticalPaint(outer);
|
|
307
|
+
return seen.map((p) => p.text);
|
|
308
|
+
};
|
|
309
|
+
it('its pieces are one text where the word was measured whole', () => {
|
|
310
|
+
for (const config of [OWN, HOST]) {
|
|
311
|
+
const texts = painted(config);
|
|
312
|
+
expect(texts).toContain('office');
|
|
313
|
+
expect(texts).toContain('officer');
|
|
314
|
+
expect(texts).not.toContain('of');
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
// The Chinese guide's contents page opens on `**《Postext指南》**是Sandbox…`:
|
|
318
|
+
// bold marks and a bold word beside plain text, down the column. Asking
|
|
319
|
+
// which pieces to join sets the context's font to each style it measures
|
|
320
|
+
// in and leaves it there; a text is painted in the font of its own
|
|
321
|
+
// segment all the same, and pieces are joined inside one style only.
|
|
322
|
+
it('every text in the font of its own segment, a bold one beside a plain one', () => {
|
|
323
|
+
// The last pieces measured are bold and the first text painted is
|
|
324
|
+
// plain; then bold marks around a plain word, and a word half bold.
|
|
325
|
+
const STYLED = 'office 是 **《**officer**》** **of**fice **officer**';
|
|
326
|
+
for (const config of [OWN, HOST]) {
|
|
327
|
+
const doc = buildDocument({ markdown: STYLED }, { ...config, layout: { writingMode: 'vertical-rl', layoutType: 'single' }, bodyText: { ...config.bodyText, textAlign: 'left' } });
|
|
328
|
+
const block = paragraph(doc);
|
|
329
|
+
const line = block.lines[0];
|
|
330
|
+
expect(line.cjkComposed).toBeFalsy();
|
|
331
|
+
expect(line.segments.filter((s) => s.kind === 'text').map((s) => (s.bold ? `[${s.text}]` : s.text)).join('|'))
|
|
332
|
+
.toBe('of|fice|是|[《]|of|ficer|[》]|[of]|fice|[of]|[ficer]');
|
|
333
|
+
const { ctx, seen } = paintingCtx();
|
|
334
|
+
const fonts = [];
|
|
335
|
+
const fill = ctx.fillText.bind(ctx);
|
|
336
|
+
Object.assign(ctx, {
|
|
337
|
+
translate() { }, rotate() { }, scale() { },
|
|
338
|
+
fillText(text, x, y) {
|
|
339
|
+
fonts.push([text, ctx.font]);
|
|
340
|
+
fill(text, x, y);
|
|
341
|
+
},
|
|
342
|
+
});
|
|
343
|
+
const outer = setVerticalPaint({ region: 'mainland' });
|
|
344
|
+
setSegmentLanguages(config === OWN);
|
|
345
|
+
renderBlock(ctx, block, block.bbox.width, block.bbox.x);
|
|
346
|
+
setSegmentLanguages(false);
|
|
347
|
+
setVerticalPaint(outer);
|
|
348
|
+
expect(seen.map((p) => p.text)).toEqual(['office', '是', '《', 'officer', '》', 'of', 'fice', 'officer']);
|
|
349
|
+
const plain = fonts[0][1];
|
|
350
|
+
const bold = fonts[2][1];
|
|
351
|
+
expect(bold).not.toBe(plain);
|
|
352
|
+
expect(bold).toMatch(/bold|[6-9]00/);
|
|
353
|
+
expect(fonts.map(([, font]) => (font === bold ? 'bold' : font === plain ? 'plain' : font)))
|
|
354
|
+
.toEqual(['plain', 'plain', 'bold', 'plain', 'bold', 'bold', 'plain', 'bold']);
|
|
355
|
+
}
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
//# sourceMappingURL=reshapedTracking.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reshapedTracking.test.js","sourceRoot":"","sources":["../../src/__tests__/reshapedTracking.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designRunsPainted.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/rtl/designRunsPainted.test.ts"],"names":[],"mappings":""}
|