postext 1.29.1 → 1.29.2
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__/chineseLocale.test.js +19 -4
- package/dist/__tests__/chineseLocale.test.js.map +1 -1
- package/dist/__tests__/contextState.test.d.ts +2 -0
- package/dist/__tests__/contextState.test.d.ts.map +1 -0
- package/dist/__tests__/contextState.test.js +478 -0
- package/dist/__tests__/contextState.test.js.map +1 -0
- package/dist/__tests__/shapingLanguage.test.js +6 -2
- package/dist/__tests__/shapingLanguage.test.js.map +1 -1
- package/dist/__tests__/trackedLigatures.test.js +6 -5
- package/dist/__tests__/trackedLigatures.test.js.map +1 -1
- package/dist/canvas-backend/annotations.d.ts.map +1 -1
- package/dist/canvas-backend/annotations.js +8 -7
- package/dist/canvas-backend/annotations.js.map +1 -1
- package/dist/canvas-backend/blockRender.d.ts.map +1 -1
- package/dist/canvas-backend/blockRender.js +23 -20
- package/dist/canvas-backend/blockRender.js.map +1 -1
- package/dist/canvas-backend/chip.d.ts.map +1 -1
- package/dist/canvas-backend/chip.js +10 -8
- package/dist/canvas-backend/chip.js.map +1 -1
- package/dist/canvas-backend/comic.d.ts.map +1 -1
- package/dist/canvas-backend/comic.js +9 -8
- package/dist/canvas-backend/comic.js.map +1 -1
- package/dist/canvas-backend/contextState.d.ts +62 -0
- package/dist/canvas-backend/contextState.d.ts.map +1 -0
- package/dist/canvas-backend/contextState.js +89 -0
- package/dist/canvas-backend/contextState.js.map +1 -0
- package/dist/canvas-backend/decorations.d.ts.map +1 -1
- package/dist/canvas-backend/decorations.js +11 -10
- package/dist/canvas-backend/decorations.js.map +1 -1
- package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
- package/dist/canvas-backend/headerFooter.js +15 -14
- 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 +34 -16
- package/dist/canvas-backend/index.js.map +1 -1
- package/dist/canvas-backend/mirrorFrame.d.ts.map +1 -1
- package/dist/canvas-backend/mirrorFrame.js +5 -4
- package/dist/canvas-backend/mirrorFrame.js.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.js +24 -23
- package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
- package/dist/canvas-backend/runDirection.d.ts.map +1 -1
- package/dist/canvas-backend/runDirection.js +9 -5
- package/dist/canvas-backend/runDirection.js.map +1 -1
- package/dist/canvas-backend/scriptText.d.ts.map +1 -1
- package/dist/canvas-backend/scriptText.js +8 -7
- 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 +10 -3
- package/dist/canvas-backend/segmentText.js.map +1 -1
- package/dist/canvas-backend/swatch.d.ts.map +1 -1
- package/dist/canvas-backend/swatch.js +3 -2
- package/dist/canvas-backend/swatch.js.map +1 -1
- package/dist/canvas-backend/trackedText.d.ts.map +1 -1
- package/dist/canvas-backend/trackedText.js +9 -8
- package/dist/canvas-backend/trackedText.js.map +1 -1
- package/dist/canvas-backend/verticalText.d.ts +3 -2
- package/dist/canvas-backend/verticalText.d.ts.map +1 -1
- package/dist/canvas-backend/verticalText.js +35 -31
- package/dist/canvas-backend/verticalText.js.map +1 -1
- package/dist/canvas-backend/wordRuns.d.ts +10 -0
- package/dist/canvas-backend/wordRuns.d.ts.map +1 -1
- package/dist/canvas-backend/wordRuns.js +28 -17
- package/dist/canvas-backend/wordRuns.js.map +1 -1
- package/dist/locale.d.ts +6 -3
- package/dist/locale.d.ts.map +1 -1
- package/dist/locale.js +6 -3
- package/dist/locale.js.map +1 -1
- package/dist/looseLines.d.ts.map +1 -1
- package/dist/looseLines.js +3 -2
- package/dist/looseLines.js.map +1 -1
- package/dist/types.d.ts +18 -14
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -245,10 +245,14 @@ describe('lang in the output', () => {
|
|
|
245
245
|
// A Chinese document declared its language before, and still does.
|
|
246
246
|
expect(renderToHtml(docOf({ locale: 'zh-Hans', bodyText: { shapingLanguage: 'host' } }))).toContain('<div class="pt-doc" lang="zh-Hans"');
|
|
247
247
|
});
|
|
248
|
-
|
|
249
|
-
|
|
248
|
+
// The canvas paints in the language the layout measured in (#764): the
|
|
249
|
+
// document's when it asks for its own, and the host's otherwise, which
|
|
250
|
+
// is the context as it comes (`inherit`). Up to postext 1.29.1 a Chinese
|
|
251
|
+
// document shaped in the host's language had `zh-Hant` set on its
|
|
252
|
+
// context all the same, and lost it at the first `save()` of the page.
|
|
253
|
+
const languagesSet = (doc) => {
|
|
250
254
|
const set = [];
|
|
251
|
-
const ctx = new Proxy({ lang: '' }, {
|
|
255
|
+
const ctx = new Proxy({ lang: 'inherit' }, {
|
|
252
256
|
get: (t, k) => (k in t ? t[k] : () => ({ width: 0 })),
|
|
253
257
|
set: (t, k, v) => { if (k === 'lang')
|
|
254
258
|
set.push(v); t[k] = v; return true; },
|
|
@@ -257,8 +261,19 @@ describe('lang in the output', () => {
|
|
|
257
261
|
const canvas = { width: 0, height: 0, getContext: () => ctx };
|
|
258
262
|
return import('../canvas-backend').then(({ renderPageToCanvas }) => {
|
|
259
263
|
renderPageToCanvas(doc.pages[0], doc, canvas);
|
|
260
|
-
|
|
264
|
+
return set;
|
|
261
265
|
});
|
|
266
|
+
};
|
|
267
|
+
it('the canvas paints a document shaped in its own language in it', async () => {
|
|
268
|
+
const set = await languagesSet(docOf({ locale: 'zh-Hant', bodyText: { shapingLanguage: 'document' } }));
|
|
269
|
+
// Set for the page and again in each state saved, then the context
|
|
270
|
+
// gets back the language it came in.
|
|
271
|
+
expect(set.length).toBeGreaterThan(1);
|
|
272
|
+
expect(set[set.length - 1]).toBe('inherit');
|
|
273
|
+
expect(new Set(set.slice(0, -1))).toEqual(new Set(['zh-Hant']));
|
|
274
|
+
});
|
|
275
|
+
it('the canvas leaves a document shaped in the host\'s language in the host\'s', async () => {
|
|
276
|
+
expect(await languagesSet(docOf({ locale: 'zh-Hant' }))).toEqual([]);
|
|
262
277
|
});
|
|
263
278
|
});
|
|
264
279
|
//# sourceMappingURL=chineseLocale.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chineseLocale.test.js","sourceRoot":"","sources":["../../src/__tests__/chineseLocale.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chineseLocale.test.js","sourceRoot":"","sources":["../../src/__tests__/chineseLocale.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contextState.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/contextState.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,478 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from 'vitest';
|
|
2
|
+
// @ts-expect-error -- a Node built-in: the package compiles without @types/node.
|
|
3
|
+
import { readFileSync as readFile, readdirSync as readDir } from 'node:fs';
|
|
4
|
+
import { renderPageToCanvas } from '../canvas-backend';
|
|
5
|
+
import { renderBlock } from '../canvas-backend/blockRender';
|
|
6
|
+
import { renderComicBalloon } from '../canvas-backend/comic';
|
|
7
|
+
import { fillScriptWord } from '../canvas-backend/scriptText';
|
|
8
|
+
import { fillFlowText } from '../canvas-backend/verticalText';
|
|
9
|
+
import { languageOf, letterSpacingOf, resetContextState, restoreContext, saveContext, setLetterSpacing } from '../canvas-backend/contextState';
|
|
10
|
+
import { buildDocument } from '../pipeline';
|
|
11
|
+
import { clearMeasurementCache } from '../measure';
|
|
12
|
+
// #764, the paint side. Chrome (131 and 154, a DOM canvas and an
|
|
13
|
+
// OffscreenCanvas) makes every saved state with the language `inherit`,
|
|
14
|
+
// and answers `""` for the letter-spacing inside one until another value
|
|
15
|
+
// is set. The page painter saves before it paints any text, so a document
|
|
16
|
+
// measured in its own language was painted in the host's; and a painter
|
|
17
|
+
// that read the letter-spacing to put it back assigned `""`, which the
|
|
18
|
+
// canvas ignores. The backend saves through `saveContext`, which carries
|
|
19
|
+
// the language, and keeps the letter-spacing it sets (`contextState.ts`).
|
|
20
|
+
const readFileSync = readFile;
|
|
21
|
+
const readdirSync = readDir;
|
|
22
|
+
const SRC = new URL('../', import.meta.url);
|
|
23
|
+
const HELPER = 'canvas-backend/contextState.ts';
|
|
24
|
+
/** Every source file of the engine by its path under `src`, tests and
|
|
25
|
+
* benchmarks left out. */
|
|
26
|
+
function sources(dir = SRC, under = '') {
|
|
27
|
+
return readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {
|
|
28
|
+
const rel = under + entry.name;
|
|
29
|
+
if (entry.isDirectory())
|
|
30
|
+
return entry.name === '__tests__' || entry.name === '__bench__' ? [] : sources(new URL(`${entry.name}/`, dir), `${rel}/`);
|
|
31
|
+
return /\.tsx?$/.test(entry.name) && !/\.test\.tsx?$/.test(entry.name) ? [{ rel, url: new URL(entry.name, dir) }] : [];
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
/** The code of a file, its comments blanked (the line numbers kept). */
|
|
35
|
+
function code(file) {
|
|
36
|
+
const text = readFileSync(file, 'utf-8')
|
|
37
|
+
.replace(/\/\*[\s\S]*?\*\//g, (comment) => comment.replace(/[^\n]/g, ' '))
|
|
38
|
+
.replace(/(^|[^:'"`\\])\/\/.*$/gm, '$1');
|
|
39
|
+
return text.split('\n');
|
|
40
|
+
}
|
|
41
|
+
function offences(files, pattern) {
|
|
42
|
+
const found = [];
|
|
43
|
+
for (const file of files) {
|
|
44
|
+
if (file.rel === HELPER)
|
|
45
|
+
continue;
|
|
46
|
+
code(file.url).forEach((line, i) => {
|
|
47
|
+
if (pattern.test(line))
|
|
48
|
+
found.push(`${file.rel}:${i + 1}: ${line.trim()}`);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
return found;
|
|
52
|
+
}
|
|
53
|
+
describe('the paint code saves and spaces through contextState.ts', () => {
|
|
54
|
+
it('no source file of the engine calls save() or restore() on a context itself', () => {
|
|
55
|
+
const bare = offences(sources(), /\.\s*(save|restore)\s*\(/);
|
|
56
|
+
expect(bare, [
|
|
57
|
+
'A 2D context is saved and restored through canvas-backend/contextState.ts:',
|
|
58
|
+
' saveContext(ctx) in place of ctx.save(), restoreContext(ctx) in place of ctx.restore().',
|
|
59
|
+
'A bare save() makes a state in the host page\'s language (Chrome sets `lang` back to `inherit`),',
|
|
60
|
+
'so the text painted inside it has other glyphs than the layout measured (#764); and a bare',
|
|
61
|
+
'restore() leaves the letter-spacing the backend remembers one state behind. Found:',
|
|
62
|
+
...bare.map((o) => ` ${o}`),
|
|
63
|
+
].join('\n')).toEqual([]);
|
|
64
|
+
});
|
|
65
|
+
it('no painter reads or writes the letter-spacing of a context itself', () => {
|
|
66
|
+
const painters = sources().filter((file) => file.rel.startsWith('canvas-backend/') || file.rel === 'looseLines.ts');
|
|
67
|
+
const direct = offences(painters, /\b(ctx|context|c)\s*\.\s*(letterSpacing|wordSpacing)\b/);
|
|
68
|
+
expect(direct, [
|
|
69
|
+
'The letter-spacing of a painting context is set with setLetterSpacing(ctx, px) and asked with',
|
|
70
|
+
'letterSpacingOf(ctx), both of canvas-backend/contextState.ts. Inside a saved state Chrome answers',
|
|
71
|
+
'`""` for ctx.letterSpacing whatever is in force, and ignores `""` assigned back: a painter that',
|
|
72
|
+
'reads it leaves the rest of the state with no tracking (#764). Found:',
|
|
73
|
+
...direct.map((o) => ` ${o}`),
|
|
74
|
+
].join('\n')).toEqual([]);
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
// ─── A context as Chrome makes it ───────────────────────────────────────────
|
|
78
|
+
/** The language of the page that hosts the canvas (`inherit`). */
|
|
79
|
+
const HOST = 'en';
|
|
80
|
+
const primary = (lang) => lang.toLowerCase().split('-')[0];
|
|
81
|
+
const sizeOf = (font) => parseFloat(/(\d*\.?\d+)px/.exec(font)?.[1] ?? '10');
|
|
82
|
+
/** A face that draws by language, as the measured ones do: its digits are
|
|
83
|
+
* narrower in Chinese and Japanese, its full stop wider in Arabic. */
|
|
84
|
+
function advance(ch, lang) {
|
|
85
|
+
const language = primary(lang);
|
|
86
|
+
if (ch === ' ' || ch === '\u00A0')
|
|
87
|
+
return 0.25;
|
|
88
|
+
if (/[0-9]/.test(ch))
|
|
89
|
+
return language === 'zh' || language === 'ja' ? 0.471 : 0.55;
|
|
90
|
+
if (ch === '.')
|
|
91
|
+
return language === 'ar' ? 0.4 : 0.3;
|
|
92
|
+
if (/[\u2E80-\u9FFF\uFF00-\uFFEF]/.test(ch))
|
|
93
|
+
return 1;
|
|
94
|
+
return 0.5;
|
|
95
|
+
}
|
|
96
|
+
function widthOf(text, font, lang, spacing) {
|
|
97
|
+
let width = 0;
|
|
98
|
+
let letters = 0;
|
|
99
|
+
for (const ch of text) {
|
|
100
|
+
width += advance(ch, lang === 'inherit' ? HOST : lang) * sizeOf(font);
|
|
101
|
+
letters++;
|
|
102
|
+
}
|
|
103
|
+
return width + spacing * letters;
|
|
104
|
+
}
|
|
105
|
+
/** The measuring context of the layout: an `OffscreenCanvas` of the page. */
|
|
106
|
+
class MeasureContext {
|
|
107
|
+
shorthand = '10px Body';
|
|
108
|
+
lang = 'inherit';
|
|
109
|
+
letterSpacing = '0px';
|
|
110
|
+
// An accessor, as on a real context: the plain-paragraph breaker's own
|
|
111
|
+
// context is found through it (`measure/pretextLanguage.ts`).
|
|
112
|
+
get font() {
|
|
113
|
+
return this.shorthand;
|
|
114
|
+
}
|
|
115
|
+
set font(value) {
|
|
116
|
+
this.shorthand = value;
|
|
117
|
+
}
|
|
118
|
+
measureText(s) {
|
|
119
|
+
return { width: widthOf(s, this.shorthand, this.lang, 0) };
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
const globals = globalThis;
|
|
123
|
+
globals.OffscreenCanvasRenderingContext2D = MeasureContext;
|
|
124
|
+
globals.OffscreenCanvas = class {
|
|
125
|
+
getContext() {
|
|
126
|
+
return new MeasureContext();
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
/**
|
|
130
|
+
* A painting context that keeps its states as Chrome does: `save()` makes
|
|
131
|
+
* one with the language `inherit` and a letter-spacing that reads `""`
|
|
132
|
+
* (the spacing in force kept); the getter answers again once another
|
|
133
|
+
* value is set; a value that is no length is ignored; `restore()` brings
|
|
134
|
+
* the state saved back whole. Every text is recorded with the language and
|
|
135
|
+
* the letter-spacing in force when it was painted, and every read of the
|
|
136
|
+
* letter-spacing is counted.
|
|
137
|
+
*/
|
|
138
|
+
function chromeContext() {
|
|
139
|
+
const painted = [];
|
|
140
|
+
let reads = 0;
|
|
141
|
+
let ignored = 0;
|
|
142
|
+
const stack = [];
|
|
143
|
+
let state = { lang: 'inherit', spacing: 0, spacingText: '0px', font: '10px Body', direction: 'ltr', textAlign: 'start', textBaseline: 'alphabetic', fillStyle: '' };
|
|
144
|
+
const record = (text, x) => {
|
|
145
|
+
if (text.trim())
|
|
146
|
+
painted.push({ text, x, lang: state.lang, spacing: state.spacing, font: state.font, depth: stack.length });
|
|
147
|
+
};
|
|
148
|
+
const api = {
|
|
149
|
+
save() {
|
|
150
|
+
stack.push(state);
|
|
151
|
+
state = { ...state, lang: 'inherit', spacingText: '' };
|
|
152
|
+
},
|
|
153
|
+
restore() {
|
|
154
|
+
const saved = stack.pop();
|
|
155
|
+
if (saved)
|
|
156
|
+
state = saved;
|
|
157
|
+
},
|
|
158
|
+
measureText: (s) => ({ width: widthOf(s, state.font, state.lang, state.spacing) }),
|
|
159
|
+
fillText: record,
|
|
160
|
+
strokeText: record,
|
|
161
|
+
};
|
|
162
|
+
// What the painter puts on the context itself stays on it (the mirrored
|
|
163
|
+
// flow sets its own `fillText` there, and takes it off again).
|
|
164
|
+
const ctx = new Proxy({}, {
|
|
165
|
+
get(own, key) {
|
|
166
|
+
if (typeof key === 'string' && Object.hasOwn(own, key))
|
|
167
|
+
return own[key];
|
|
168
|
+
if (key === 'letterSpacing') {
|
|
169
|
+
reads++;
|
|
170
|
+
return state.spacingText;
|
|
171
|
+
}
|
|
172
|
+
if (key === 'wordSpacing') {
|
|
173
|
+
reads++;
|
|
174
|
+
return stack.length ? '' : '0px';
|
|
175
|
+
}
|
|
176
|
+
if (typeof key === 'string' && key in api)
|
|
177
|
+
return api[key];
|
|
178
|
+
if (typeof key === 'string' && key in state)
|
|
179
|
+
return state[key];
|
|
180
|
+
return () => undefined;
|
|
181
|
+
},
|
|
182
|
+
set(own, key, value) {
|
|
183
|
+
if (key === 'letterSpacing') {
|
|
184
|
+
const m = /^(-?\d*\.?\d+(?:e[+-]?\d+)?)px$/.exec(String(value));
|
|
185
|
+
if (!m)
|
|
186
|
+
ignored++;
|
|
187
|
+
else if (Number(m[1]) !== state.spacing) {
|
|
188
|
+
state.spacing = Number(m[1]);
|
|
189
|
+
state.spacingText = `${state.spacing}px`;
|
|
190
|
+
}
|
|
191
|
+
return true;
|
|
192
|
+
}
|
|
193
|
+
if (typeof key === 'string' && key in state)
|
|
194
|
+
state[key] = value;
|
|
195
|
+
else if (typeof key === 'string')
|
|
196
|
+
own[key] = value;
|
|
197
|
+
return true;
|
|
198
|
+
},
|
|
199
|
+
has(_, key) {
|
|
200
|
+
return typeof key === 'string' && (key in api || key in state || key === 'letterSpacing');
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
return { ctx: ctx, painted, reads: () => reads, ignored: () => ignored };
|
|
204
|
+
}
|
|
205
|
+
function paintPage(doc, page = doc.pages[0]) {
|
|
206
|
+
const chrome = chromeContext();
|
|
207
|
+
const canvas = { width: 0, height: 0, getContext: () => chrome.ctx };
|
|
208
|
+
renderPageToCanvas(page, doc, canvas);
|
|
209
|
+
return chrome;
|
|
210
|
+
}
|
|
211
|
+
beforeEach(() => clearMeasurementCache());
|
|
212
|
+
const pt = (value) => ({ value, unit: 'pt' });
|
|
213
|
+
const OWN = { shapingLanguage: 'document' };
|
|
214
|
+
function config(locale, extra = {}) {
|
|
215
|
+
return {
|
|
216
|
+
locale,
|
|
217
|
+
page: { width: pt(260), height: pt(700), dpi: 72, margins: { top: pt(40), bottom: pt(40), left: pt(20), right: pt(20) } },
|
|
218
|
+
layout: { layoutType: 'single' },
|
|
219
|
+
header: { elements: [{ kind: 'text', id: 'rh', content: 'Running head 2026.', fontSize: pt(8), overflow: 'wrap', align: 'start', placement: { anchor: { to: 'container', edge: 'top-left' }, size: { width: 'fill' } } }] },
|
|
220
|
+
footer: { elements: [{ kind: 'text', id: 'folio', content: 'Page {page}.', fontSize: pt(8), overflow: 'wrap', align: 'start', placement: { anchor: { to: 'container', edge: 'bottom-left' }, size: { width: 'fill' } } }] },
|
|
221
|
+
chipStyles: [{ id: 'chip' }],
|
|
222
|
+
...extra,
|
|
223
|
+
bodyText: { fontFamily: 'Body', fontSize: pt(10), lineHeight: pt(14), firstLineIndent: pt(0), textAlign: 'left', hyphenation: { enabled: false }, ...OWN, ...extra.bodyText },
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
const table = {
|
|
227
|
+
id: 't', typeId: 'table', kind: 'table', createdAt: 0, updatedAt: 0, placement: { position: 'here' },
|
|
228
|
+
caption: 'Prices in 2026.',
|
|
229
|
+
table: { model: { headerRowCount: 1, rows: [[{ content: 'Dish 1.' }, { content: 'Price 2.' }], [{ content: 'Soup 3.' }, { content: 'Cell 4.' }]] } },
|
|
230
|
+
};
|
|
231
|
+
const AR = '\u0633\u0644\u0627\u0645';
|
|
232
|
+
const AR2 = '\u0643\u062A\u0627\u0628';
|
|
233
|
+
/** Every kind of text a page paints: a heading, a paragraph with a chip, a
|
|
234
|
+
* list, a callout, a table with its caption. */
|
|
235
|
+
const PAGE = [
|
|
236
|
+
'# Heading 1.',
|
|
237
|
+
'',
|
|
238
|
+
'A paragraph of 2026 with a :chip[chip 7.] in it.',
|
|
239
|
+
'',
|
|
240
|
+
'- First item 3.',
|
|
241
|
+
'- Second item 4.',
|
|
242
|
+
'',
|
|
243
|
+
'1. Numbered item 5.',
|
|
244
|
+
'',
|
|
245
|
+
':::callout',
|
|
246
|
+
'Callout text 6.',
|
|
247
|
+
':::',
|
|
248
|
+
'',
|
|
249
|
+
'::resource{id="t"}',
|
|
250
|
+
'',
|
|
251
|
+
].join('\n');
|
|
252
|
+
const build = (markdown, cfg, resources = [table]) => buildDocument({ markdown, resources }, cfg);
|
|
253
|
+
const textsOf = (painted) => painted.map((p) => p.text).join(' ');
|
|
254
|
+
describe('a page is painted in the language it was measured in, through every save()', () => {
|
|
255
|
+
it('a page of a document in its own language: columns, running heads, lists, chips, callouts, table cells and captions', () => {
|
|
256
|
+
const doc = build(PAGE, config('zh-Hans'));
|
|
257
|
+
const { painted, reads, ignored } = paintPage(doc);
|
|
258
|
+
const all = textsOf(painted);
|
|
259
|
+
for (const part of ['Running', 'Page', 'Heading', 'paragraph', 'chip', 'First', 'Numbered', 'Callout', 'Dish', 'Soup', 'Cell', 'Prices'])
|
|
260
|
+
expect(all).toContain(part);
|
|
261
|
+
// A list bullet and a number are text too.
|
|
262
|
+
expect(painted.some((p) => /^[\u2022\u00B7\-\u2013]$/.test(p.text.trim()) || p.text.trim() === '1.')).toBe(true);
|
|
263
|
+
// Nearly all of it is painted inside a saved state: the column's clip,
|
|
264
|
+
// a design text's own, a caption's.
|
|
265
|
+
expect(painted.filter((p) => p.depth > 0).length).toBeGreaterThan(painted.length / 2);
|
|
266
|
+
expect(new Set(painted.map((p) => p.lang))).toEqual(new Set(['zh-Hans']));
|
|
267
|
+
// And nothing asked the context for its letter-spacing.
|
|
268
|
+
expect(reads()).toBe(0);
|
|
269
|
+
expect(ignored()).toBe(0);
|
|
270
|
+
});
|
|
271
|
+
it('a right-to-left page, painted through the mirror that turns every text back', () => {
|
|
272
|
+
const doc = build(`# ${AR} ${AR2} 2026.\n\n${AR} ${AR2} 2026 ${AR}. :chip[${AR2} 7.] ${AR}\n\n- ${AR} 3.\n\n::resource{id="t"}\n`, config('ar', { direction: 'rtl' }));
|
|
273
|
+
expect(doc.pages[0].flow?.writingMode).toBe('horizontal-tb');
|
|
274
|
+
const { painted } = paintPage(doc);
|
|
275
|
+
expect(painted.length).toBeGreaterThan(10);
|
|
276
|
+
// The mirrored flow, a column and each text turned back: three states deep.
|
|
277
|
+
expect(Math.max(...painted.map((p) => p.depth))).toBeGreaterThanOrEqual(3);
|
|
278
|
+
expect(new Set(painted.map((p) => p.lang))).toEqual(new Set(['ar']));
|
|
279
|
+
});
|
|
280
|
+
it('a vertical page: cells, sideways runs and the digits set across the column', () => {
|
|
281
|
+
const han = '\u6392\u7248\u5F15\u64CE\u7684\u8BBE\u8BA1';
|
|
282
|
+
const doc = build(`# ${han}12\n\n${han}\uFF0C2016\u5E74 first ${han}\u2014\u2014${han}\u3002\n`, config('zh-Hant', { layout: { layoutType: 'single', writingMode: 'vertical-rl' } }), []);
|
|
283
|
+
expect(doc.pages[0].flow?.writingMode).toBe('vertical-rl');
|
|
284
|
+
const { painted, reads } = paintPage(doc);
|
|
285
|
+
expect(painted.length).toBeGreaterThan(10);
|
|
286
|
+
expect(new Set(painted.map((p) => p.lang))).toEqual(new Set(['zh-Hant']));
|
|
287
|
+
expect(reads()).toBe(0);
|
|
288
|
+
});
|
|
289
|
+
it('a run that names its language is painted in it, on a line set word by word and on a line of the CJK composer', () => {
|
|
290
|
+
const bare = { header: { elements: [] }, footer: { elements: [] } };
|
|
291
|
+
// Word by word (`fillSegmentWord`).
|
|
292
|
+
const latin = paintPage(build('In **2016** it ran, :ltr[dated 2016]{lang=en} and so on.\n', config('ca', bare), [])).painted;
|
|
293
|
+
expect(latin.filter((p) => p.text.includes('2016')).map((p) => p.lang)).toEqual(['ca', 'en']);
|
|
294
|
+
expect(latin[latin.length - 1].lang).toBe('ca');
|
|
295
|
+
// The composer's line (`fillSegmentText`): up to postext 1.29.1 its
|
|
296
|
+
// runs were painted in the document's language, measured in their own.
|
|
297
|
+
const doc = build('\u6392\u7248 2016 \u5F15\u64CE :ltr[dated 2016]{lang=en} \u8BBE\u8BA1\u3002\n', config('zh-Hans', bare), []);
|
|
298
|
+
expect(doc.blocks.find((b) => b.type === 'paragraph').lines[0].cjkComposed).toBe(true);
|
|
299
|
+
const { painted } = paintPage(doc);
|
|
300
|
+
expect(painted.filter((p) => p.text.includes('2016')).map((p) => p.lang)).toEqual(['zh-Hans', 'en']);
|
|
301
|
+
expect(painted.find((p) => p.text.includes('dated')).lang).toBe('en');
|
|
302
|
+
// The document's again after the run.
|
|
303
|
+
expect(painted[painted.length - 1].lang).toBe('zh-Hans');
|
|
304
|
+
expect(new Set(painted.map((p) => p.lang))).toEqual(new Set(['zh-Hans', 'en']));
|
|
305
|
+
});
|
|
306
|
+
it('and keeps it through the saves inside its word: a mirrored page\'s turn, a clip', () => {
|
|
307
|
+
// On a right-to-left page every text is turned back inside a state of
|
|
308
|
+
// its own.
|
|
309
|
+
const doc = build(`${AR} ${AR2} :ltr[dated 2016]{lang=en} ${AR}.\n`, config('ar', { direction: 'rtl', header: { elements: [] }, footer: { elements: [] } }), []);
|
|
310
|
+
const { painted } = paintPage(doc);
|
|
311
|
+
const run = painted.filter((p) => /dated|2016/.test(p.text));
|
|
312
|
+
expect(run.length).toBeGreaterThan(0);
|
|
313
|
+
expect(run.every((p) => p.lang === 'en' && p.depth >= 3)).toBe(true);
|
|
314
|
+
expect(painted.filter((p) => !/dated|2016/.test(p.text)).every((p) => p.lang === 'ar')).toBe(true);
|
|
315
|
+
// A word with no letter is painted beside a mark of its script, the
|
|
316
|
+
// mark clipped away (`fillScriptWord`): in the language of its run.
|
|
317
|
+
const { ctx, painted: clipped } = chromeContext();
|
|
318
|
+
ctx.lang = 'en';
|
|
319
|
+
fillScriptWord(ctx, '2016', 'Hani', false, 0, 0, (text, x, y) => ctx.fillText(text, x, y));
|
|
320
|
+
expect(clipped.map((p) => [p.lang, p.depth])).toEqual([['en', 1]]);
|
|
321
|
+
expect(clipped[0].text.startsWith('2016')).toBe(true);
|
|
322
|
+
});
|
|
323
|
+
it('each text is as wide painted as the layout measured it', () => {
|
|
324
|
+
// The digits of this face are 0.471 em wide in Chinese and 0.55 em in
|
|
325
|
+
// the host's English: painted in the host's, `2026` is 0.32 em wider
|
|
326
|
+
// than the box the layout holds for it.
|
|
327
|
+
const doc = build('In 2026 and 1024.\n', config('zh-Hans', { header: { elements: [] }, footer: { elements: [] } }), []);
|
|
328
|
+
const line = doc.blocks.find((b) => b.type === 'paragraph').lines[0];
|
|
329
|
+
const { painted } = paintPage(doc);
|
|
330
|
+
const whole = painted.find((p) => p.text.includes('2026'));
|
|
331
|
+
expect(widthOf(whole.text, whole.font, whole.lang, 0)).toBeCloseTo(line.bbox.width, 6);
|
|
332
|
+
expect(widthOf(whole.text, whole.font, 'inherit', 0) - line.bbox.width).toBeCloseTo(8 * (0.55 - 0.471) * 10, 6);
|
|
333
|
+
});
|
|
334
|
+
it('a document shaped in the host\'s language is painted in the host\'s: its context is left as it comes', () => {
|
|
335
|
+
for (const locale of ['zh-Hans', 'ar', 'ca']) {
|
|
336
|
+
const doc = build(PAGE, config(locale, { bodyText: { shapingLanguage: 'host' } }));
|
|
337
|
+
const { painted } = paintPage(doc);
|
|
338
|
+
expect(painted.length).toBeGreaterThan(10);
|
|
339
|
+
expect(new Set(painted.map((p) => p.lang))).toEqual(new Set(['inherit']));
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
it('gives the context back in the language it came in', () => {
|
|
343
|
+
const doc = build('In 2026.\n', config('ca'), []);
|
|
344
|
+
const chrome = chromeContext();
|
|
345
|
+
const canvas = { width: 0, height: 0, getContext: () => chrome.ctx };
|
|
346
|
+
renderPageToCanvas(doc.pages[0], doc, canvas);
|
|
347
|
+
expect(chrome.ctx.lang).toBe('inherit');
|
|
348
|
+
expect(chrome.painted.every((p) => p.lang === 'ca')).toBe(true);
|
|
349
|
+
});
|
|
350
|
+
it('a comic balloon lettered on a context in the document\'s language keeps it', () => {
|
|
351
|
+
const block = {
|
|
352
|
+
kind: 'text', bbox: { x: 10, y: 10, width: 120, height: 30 }, fontString: '10px Body', color: '#000000',
|
|
353
|
+
lines: [{ text: 'BOOM 2026.', xOffset: 0, baselineY: 24 }],
|
|
354
|
+
};
|
|
355
|
+
const balloon = {
|
|
356
|
+
id: 'b', panelIndex: 0, order: 0, kind: 'sfx', style: 'sfx', sourceStart: 0, sourceEnd: 0, group: 0,
|
|
357
|
+
text: [block], bbox: block.bbox, halo: { width: 1, color: '#ffffff' },
|
|
358
|
+
};
|
|
359
|
+
const { ctx, painted } = chromeContext();
|
|
360
|
+
ctx.lang = 'ja';
|
|
361
|
+
renderComicBalloon(ctx, balloon);
|
|
362
|
+
expect(painted.length).toBeGreaterThan(1);
|
|
363
|
+
expect(painted.every((p) => p.depth >= 2)).toBe(true);
|
|
364
|
+
expect(new Set(painted.map((p) => p.lang))).toEqual(new Set(['ja']));
|
|
365
|
+
});
|
|
366
|
+
});
|
|
367
|
+
describe('the helper', () => {
|
|
368
|
+
it('saveContext carries the language, restoreContext brings the outer one back', () => {
|
|
369
|
+
const { ctx } = chromeContext();
|
|
370
|
+
const c = ctx;
|
|
371
|
+
c.lang = 'ar';
|
|
372
|
+
saveContext(ctx);
|
|
373
|
+
expect(c.lang).toBe('ar');
|
|
374
|
+
c.lang = 'tr';
|
|
375
|
+
saveContext(ctx);
|
|
376
|
+
expect(c.lang).toBe('tr');
|
|
377
|
+
restoreContext(ctx);
|
|
378
|
+
restoreContext(ctx);
|
|
379
|
+
expect(c.lang).toBe('ar');
|
|
380
|
+
expect(languageOf(ctx)).toBe('ar');
|
|
381
|
+
});
|
|
382
|
+
it('a context in the host\'s language, or with none, is saved as it is', () => {
|
|
383
|
+
const { ctx } = chromeContext();
|
|
384
|
+
const set = [];
|
|
385
|
+
const watched = new Proxy(ctx, { set: (t, k, v) => { if (k === 'lang')
|
|
386
|
+
set.push(v); return Reflect.set(t, k, v); } });
|
|
387
|
+
saveContext(watched);
|
|
388
|
+
restoreContext(watched);
|
|
389
|
+
expect(set).toEqual([]);
|
|
390
|
+
expect(languageOf(ctx)).toBeUndefined();
|
|
391
|
+
// No `lang` at all (a browser before Chrome 136): nothing is set.
|
|
392
|
+
const old = { saved: 0, save() { this.saved++; }, restore() { this.saved--; } };
|
|
393
|
+
saveContext(old);
|
|
394
|
+
expect('lang' in old).toBe(false);
|
|
395
|
+
restoreContext(old);
|
|
396
|
+
expect(old.saved).toBe(0);
|
|
397
|
+
expect(languageOf(old)).toBeUndefined();
|
|
398
|
+
});
|
|
399
|
+
it('the letter-spacing set is the one answered, state by state, where the context answers ""', () => {
|
|
400
|
+
const { ctx, reads } = chromeContext();
|
|
401
|
+
expect(letterSpacingOf(ctx)).toBe(0);
|
|
402
|
+
setLetterSpacing(ctx, 1.5);
|
|
403
|
+
saveContext(ctx);
|
|
404
|
+
// Chrome's own answer here is `""`.
|
|
405
|
+
expect(ctx.letterSpacing).toBe('');
|
|
406
|
+
expect(letterSpacingOf(ctx)).toBe(1.5);
|
|
407
|
+
setLetterSpacing(ctx, 0);
|
|
408
|
+
saveContext(ctx);
|
|
409
|
+
expect(letterSpacingOf(ctx)).toBe(0);
|
|
410
|
+
restoreContext(ctx);
|
|
411
|
+
restoreContext(ctx);
|
|
412
|
+
expect(letterSpacingOf(ctx)).toBe(1.5);
|
|
413
|
+
expect(ctx.letterSpacing).toBe('1.5px');
|
|
414
|
+
expect(reads()).toBe(3 - 1);
|
|
415
|
+
resetContextState(ctx);
|
|
416
|
+
expect(letterSpacingOf(ctx)).toBe(0);
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
describe('tracked text keeps its letter-spacing inside a saved state', () => {
|
|
420
|
+
const tracked = (markdown, locale = 'en') => {
|
|
421
|
+
const doc = build(markdown, config(locale, { header: { elements: [] }, footer: { elements: [] } }), []);
|
|
422
|
+
const block = doc.blocks.find((b) => b.type === 'paragraph');
|
|
423
|
+
return { doc, block };
|
|
424
|
+
};
|
|
425
|
+
it('a chip of a tracked line: the run after its Arabic run is painted with the tracking', () => {
|
|
426
|
+
// The chip saves the context, lifts the tracking for its Arabic run
|
|
427
|
+
// (a joining script is never tracked) and puts it back for the next.
|
|
428
|
+
// Up to postext 1.29.1 it read the tracking after its save (`""` on
|
|
429
|
+
// Chrome) and assigned that back: `first` was painted with none.
|
|
430
|
+
const { block } = tracked(`A :chip[office *${AR}* first] here.\n`);
|
|
431
|
+
block.letterSpacing = 0.6;
|
|
432
|
+
const { ctx, painted, reads, ignored } = chromeContext();
|
|
433
|
+
renderBlock(ctx, block, block.bbox.width, block.bbox.x);
|
|
434
|
+
const chip = painted.filter((p) => p.depth > 0);
|
|
435
|
+
expect(chip.map((p) => [p.text.trim(), p.spacing])).toEqual([['office', 0.6], [AR, 0], ['first', 0.6]]);
|
|
436
|
+
expect(painted.filter((p) => p.depth === 0).every((p) => p.spacing === 0.6)).toBe(true);
|
|
437
|
+
expect(reads()).toBe(0);
|
|
438
|
+
expect(ignored()).toBe(0);
|
|
439
|
+
// The context is left with no tracking, as the block found it.
|
|
440
|
+
expect(letterSpacingOf(ctx)).toBe(0);
|
|
441
|
+
});
|
|
442
|
+
it('a tracked header cell with such a chip, as the layout measured it', () => {
|
|
443
|
+
const cell = {
|
|
444
|
+
...table, caption: undefined,
|
|
445
|
+
table: { model: { headerRowCount: 1, rows: [[{ content: `:chip[office *${AR}* first]` }, { content: 'Price' }], [{ content: 'Soup' }, { content: '4' }]] } },
|
|
446
|
+
};
|
|
447
|
+
const doc = build('::resource{id="t"}\n', config('en', { header: { elements: [] }, footer: { elements: [] }, tableStyle: { headerLetterSpacing: pt(2) } }), [cell]);
|
|
448
|
+
const { painted, reads } = paintPage(doc);
|
|
449
|
+
const first = painted.find((p) => p.text.trim() === 'first');
|
|
450
|
+
expect(first.spacing).toBe(2);
|
|
451
|
+
expect(painted.find((p) => p.text.trim() === AR).spacing).toBe(0);
|
|
452
|
+
// The width the layout holds for the run is the one painted.
|
|
453
|
+
const chip = JSON.stringify(doc.pages[0]).match(/"text":" first","fontString":"[^"]*","width":([\d.]+)/);
|
|
454
|
+
expect(chip).not.toBeNull();
|
|
455
|
+
expect(widthOf(first.text, first.font, first.lang, first.spacing)).toBeCloseTo(Number(chip[1]), 2);
|
|
456
|
+
expect(painted.find((p) => p.text === 'Soup').spacing).toBe(0);
|
|
457
|
+
expect(reads()).toBe(0);
|
|
458
|
+
});
|
|
459
|
+
it('text cut at its CJK marks inside a saved state is set by the tracking in force', () => {
|
|
460
|
+
// Two marks that meet are painted apart, each piece after the one
|
|
461
|
+
// before by its measure and the tracking of its characters.
|
|
462
|
+
const { ctx, painted } = chromeContext();
|
|
463
|
+
ctx.font = '10px Body';
|
|
464
|
+
setLetterSpacing(ctx, 1);
|
|
465
|
+
saveContext(ctx);
|
|
466
|
+
fillFlowText(ctx, '\u6392\uFF09\u300A\u7248', 0, 0, 'fill', undefined, 'composed');
|
|
467
|
+
restoreContext(ctx);
|
|
468
|
+
expect(painted.length).toBeGreaterThan(1);
|
|
469
|
+
expect(painted.every((p) => p.spacing === 1)).toBe(true);
|
|
470
|
+
// Each piece starts where the one before ends, its tracking counted.
|
|
471
|
+
let x = 0;
|
|
472
|
+
for (const p of painted) {
|
|
473
|
+
expect(p.x).toBeCloseTo(x, 6);
|
|
474
|
+
x += widthOf(p.text, p.font, 'inherit', 1);
|
|
475
|
+
}
|
|
476
|
+
});
|
|
477
|
+
});
|
|
478
|
+
//# sourceMappingURL=contextState.test.js.map
|