postext 1.28.6 → 1.29.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.
Files changed (179) hide show
  1. package/dist/__tests__/arabicLocale.test.js +10 -2
  2. package/dist/__tests__/arabicLocale.test.js.map +1 -1
  3. package/dist/__tests__/bundle/balloonPlacementPin.test.js +5 -1
  4. package/dist/__tests__/bundle/balloonPlacementPin.test.js.map +1 -1
  5. package/dist/__tests__/bundle/cjkRulesPin.test.js +15 -9
  6. package/dist/__tests__/bundle/cjkRulesPin.test.js.map +1 -1
  7. package/dist/__tests__/bundle/designOverflowPin.test.js +3 -3
  8. package/dist/__tests__/bundle/designOverflowPin.test.js.map +1 -1
  9. package/dist/__tests__/bundle/flowColumnsPin.test.js +4 -1
  10. package/dist/__tests__/bundle/flowColumnsPin.test.js.map +1 -1
  11. package/dist/__tests__/bundle/gridBalancingPin.test.js +6 -2
  12. package/dist/__tests__/bundle/gridBalancingPin.test.js.map +1 -1
  13. package/dist/__tests__/bundle/gridBreakRulesPin.test.js +23 -17
  14. package/dist/__tests__/bundle/gridBreakRulesPin.test.js.map +1 -1
  15. package/dist/__tests__/bundle/indexGroupSplitPin.test.js +5 -2
  16. package/dist/__tests__/bundle/indexGroupSplitPin.test.js.map +1 -1
  17. package/dist/__tests__/bundle/looseOrderPin.test.js +5 -1
  18. package/dist/__tests__/bundle/looseOrderPin.test.js.map +1 -1
  19. package/dist/__tests__/bundle/refLabelBreaksPin.test.js +5 -1
  20. package/dist/__tests__/bundle/refLabelBreaksPin.test.js.map +1 -1
  21. package/dist/__tests__/bundle/scriptContextPin.test.js +7 -2
  22. package/dist/__tests__/bundle/scriptContextPin.test.js.map +1 -1
  23. package/dist/__tests__/bundle/shapingLanguagePin.test.d.ts +2 -0
  24. package/dist/__tests__/bundle/shapingLanguagePin.test.d.ts.map +1 -0
  25. package/dist/__tests__/bundle/shapingLanguagePin.test.js +96 -0
  26. package/dist/__tests__/bundle/shapingLanguagePin.test.js.map +1 -0
  27. package/dist/__tests__/bundle/taskBoxPin.test.d.ts +2 -0
  28. package/dist/__tests__/bundle/taskBoxPin.test.d.ts.map +1 -0
  29. package/dist/__tests__/bundle/taskBoxPin.test.js +94 -0
  30. package/dist/__tests__/bundle/taskBoxPin.test.js.map +1 -0
  31. package/dist/__tests__/bundle/trailingStepPin.test.js +5 -2
  32. package/dist/__tests__/bundle/trailingStepPin.test.js.map +1 -1
  33. package/dist/__tests__/bundle/wideFloatStretchPin.test.js +5 -2
  34. package/dist/__tests__/bundle/wideFloatStretchPin.test.js.map +1 -1
  35. package/dist/__tests__/bundle.test.js +5 -5
  36. package/dist/__tests__/bundle.test.js.map +1 -1
  37. package/dist/__tests__/chineseLocale.test.js +7 -1
  38. package/dist/__tests__/chineseLocale.test.js.map +1 -1
  39. package/dist/__tests__/cjk/japaneseHtml.test.js +19 -3
  40. package/dist/__tests__/cjk/japaneseHtml.test.js.map +1 -1
  41. package/dist/__tests__/cjk/japaneseSegmentLanguage.test.js +24 -4
  42. package/dist/__tests__/cjk/japaneseSegmentLanguage.test.js.map +1 -1
  43. package/dist/__tests__/codeBlocks.test.js +1 -1
  44. package/dist/__tests__/exports.test.js +14 -0
  45. package/dist/__tests__/exports.test.js.map +1 -1
  46. package/dist/__tests__/hardBreaks.test.js +1 -1
  47. package/dist/__tests__/headingInlineMarks.test.js +1 -1
  48. package/dist/__tests__/mathSizeMigration.test.js +4 -4
  49. package/dist/__tests__/mathSizeMigration.test.js.map +1 -1
  50. package/dist/__tests__/pipeline/calloutInlineResourceGap.test.js +1 -1
  51. package/dist/__tests__/pipeline/calloutSplitMinLinesChild.test.js +3 -3
  52. package/dist/__tests__/pipeline/calloutSplitMinLinesChild.test.js.map +1 -1
  53. package/dist/__tests__/pipeline/colonListRoom.test.js +3 -3
  54. package/dist/__tests__/pipeline/colonListRoom.test.js.map +1 -1
  55. package/dist/__tests__/pipeline/compoundBreaks.test.js +6 -6
  56. package/dist/__tests__/pipeline/compoundBreaks.test.js.map +1 -1
  57. package/dist/__tests__/pipeline/dashBreaks.test.js +5 -5
  58. package/dist/__tests__/pipeline/dashBreaks.test.js.map +1 -1
  59. package/dist/__tests__/pipeline/headingSplitOrphans.test.js +3 -3
  60. package/dist/__tests__/pipeline/headingSplitOrphans.test.js.map +1 -1
  61. package/dist/__tests__/pipeline/inlineFigureSpace.test.js +5 -5
  62. package/dist/__tests__/pipeline/inlineFigureSpace.test.js.map +1 -1
  63. package/dist/__tests__/pipeline/paragraphContainerTail.test.js +7 -7
  64. package/dist/__tests__/pipeline/paragraphContainerTail.test.js.map +1 -1
  65. package/dist/__tests__/pipeline/raggedOptimal.test.js +6 -6
  66. package/dist/__tests__/pipeline/raggedOptimal.test.js.map +1 -1
  67. package/dist/__tests__/rtl/htmlRtl.test.js +15 -2
  68. package/dist/__tests__/rtl/htmlRtl.test.js.map +1 -1
  69. package/dist/__tests__/shapingLanguage.test.d.ts +2 -0
  70. package/dist/__tests__/shapingLanguage.test.d.ts.map +1 -0
  71. package/dist/__tests__/shapingLanguage.test.js +352 -0
  72. package/dist/__tests__/shapingLanguage.test.js.map +1 -0
  73. package/dist/__tests__/taskBox.test.d.ts +2 -0
  74. package/dist/__tests__/taskBox.test.d.ts.map +1 -0
  75. package/dist/__tests__/taskBox.test.js +291 -0
  76. package/dist/__tests__/taskBox.test.js.map +1 -0
  77. package/dist/__tests__/verseLines.test.js +7 -7
  78. package/dist/__tests__/verseLines.test.js.map +1 -1
  79. package/dist/bundle/configVersion.d.ts +53 -7
  80. package/dist/bundle/configVersion.d.ts.map +1 -1
  81. package/dist/bundle/configVersion.js +84 -6
  82. package/dist/bundle/configVersion.js.map +1 -1
  83. package/dist/bundle/index.d.ts +2 -1
  84. package/dist/bundle/index.d.ts.map +1 -1
  85. package/dist/bundle/index.js +2 -1
  86. package/dist/bundle/index.js.map +1 -1
  87. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  88. package/dist/canvas-backend/blockRender.js +41 -2
  89. package/dist/canvas-backend/blockRender.js.map +1 -1
  90. package/dist/canvas-backend/index.d.ts.map +1 -1
  91. package/dist/canvas-backend/index.js +10 -5
  92. package/dist/canvas-backend/index.js.map +1 -1
  93. package/dist/canvas-backend/trackedText.d.ts.map +1 -1
  94. package/dist/canvas-backend/trackedText.js +9 -5
  95. package/dist/canvas-backend/trackedText.js.map +1 -1
  96. package/dist/canvas-backend/wordRuns.d.ts +6 -0
  97. package/dist/canvas-backend/wordRuns.d.ts.map +1 -1
  98. package/dist/canvas-backend/wordRuns.js +31 -0
  99. package/dist/canvas-backend/wordRuns.js.map +1 -1
  100. package/dist/comics/lettering/letter.d.ts.map +1 -1
  101. package/dist/comics/lettering/letter.js +2 -1
  102. package/dist/comics/lettering/letter.js.map +1 -1
  103. package/dist/contrast.d.ts.map +1 -1
  104. package/dist/contrast.js +5 -0
  105. package/dist/contrast.js.map +1 -1
  106. package/dist/defaults/bodyText.d.ts.map +1 -1
  107. package/dist/defaults/bodyText.js +10 -0
  108. package/dist/defaults/bodyText.js.map +1 -1
  109. package/dist/defaults/unorderedLists.d.ts.map +1 -1
  110. package/dist/defaults/unorderedLists.js +7 -0
  111. package/dist/defaults/unorderedLists.js.map +1 -1
  112. package/dist/html-backend.d.ts.map +1 -1
  113. package/dist/html-backend.js +45 -5
  114. package/dist/html-backend.js.map +1 -1
  115. package/dist/index.d.ts +3 -1
  116. package/dist/index.d.ts.map +1 -1
  117. package/dist/index.js +5 -1
  118. package/dist/index.js.map +1 -1
  119. package/dist/locale.d.ts +37 -14
  120. package/dist/locale.d.ts.map +1 -1
  121. package/dist/locale.js +40 -12
  122. package/dist/locale.js.map +1 -1
  123. package/dist/measure/cache.js +2 -2
  124. package/dist/measure/cache.js.map +1 -1
  125. package/dist/measure/canvas.d.ts +20 -0
  126. package/dist/measure/canvas.d.ts.map +1 -1
  127. package/dist/measure/canvas.js +131 -50
  128. package/dist/measure/canvas.js.map +1 -1
  129. package/dist/measure/cjkAnnotate.js +2 -2
  130. package/dist/measure/cjkAnnotate.js.map +1 -1
  131. package/dist/measure/cjkCompose.d.ts.map +1 -1
  132. package/dist/measure/cjkCompose.js +225 -209
  133. package/dist/measure/cjkCompose.js.map +1 -1
  134. package/dist/measure/plain.d.ts.map +1 -1
  135. package/dist/measure/plain.js +4 -2
  136. package/dist/measure/plain.js.map +1 -1
  137. package/dist/measure/pretextLanguage.d.ts +12 -0
  138. package/dist/measure/pretextLanguage.d.ts.map +1 -0
  139. package/dist/measure/pretextLanguage.js +117 -0
  140. package/dist/measure/pretextLanguage.js.map +1 -0
  141. package/dist/measure/rich.d.ts +4 -0
  142. package/dist/measure/rich.d.ts.map +1 -1
  143. package/dist/measure/rich.js +164 -137
  144. package/dist/measure/rich.js.map +1 -1
  145. package/dist/measure/rubyLift.d.ts.map +1 -1
  146. package/dist/measure/rubyLift.js +4 -3
  147. package/dist/measure/rubyLift.js.map +1 -1
  148. package/dist/measure/spanLanguage.d.ts +11 -0
  149. package/dist/measure/spanLanguage.d.ts.map +1 -0
  150. package/dist/measure/spanLanguage.js +19 -0
  151. package/dist/measure/spanLanguage.js.map +1 -0
  152. package/dist/measure/vertical.d.ts.map +1 -1
  153. package/dist/measure/vertical.js +4 -3
  154. package/dist/measure/vertical.js.map +1 -1
  155. package/dist/pipeline/build.d.ts.map +1 -1
  156. package/dist/pipeline/build.js +15 -2
  157. package/dist/pipeline/build.js.map +1 -1
  158. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  159. package/dist/pipeline/calloutLayout.js +10 -4
  160. package/dist/pipeline/calloutLayout.js.map +1 -1
  161. package/dist/pipeline/dropCap.js +2 -2
  162. package/dist/pipeline/dropCap.js.map +1 -1
  163. package/dist/pipeline/lists.d.ts +8 -0
  164. package/dist/pipeline/lists.d.ts.map +1 -1
  165. package/dist/pipeline/lists.js +16 -1
  166. package/dist/pipeline/lists.js.map +1 -1
  167. package/dist/pipeline/toc.d.ts.map +1 -1
  168. package/dist/pipeline/toc.js +5 -3
  169. package/dist/pipeline/toc.js.map +1 -1
  170. package/dist/taskBox.d.ts +55 -0
  171. package/dist/taskBox.d.ts.map +1 -0
  172. package/dist/taskBox.js +79 -0
  173. package/dist/taskBox.js.map +1 -0
  174. package/dist/types.d.ts +54 -1
  175. package/dist/types.d.ts.map +1 -1
  176. package/dist/vdt.d.ts +14 -0
  177. package/dist/vdt.d.ts.map +1 -1
  178. package/dist/vdt.js.map +1 -1
  179. package/package.json +1 -1
@@ -0,0 +1,352 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { renderPageToCanvas } from '../canvas-backend';
3
+ import { renderToHtml } from '../html-backend';
4
+ import { buildDocument } from '../pipeline';
5
+ import { clearMeasurementCache } from '../measure';
6
+ import { getMeasureLanguage, measureLanguageKey, measureTextWidth, setMeasureLanguage, withMeasureLanguage } from '../measure/canvas';
7
+ import { pretextLanguageState } from '../measure/pretextLanguage';
8
+ import { renderLangOf, shapingLanguageOf, shapingTagOf } from '../locale';
9
+ import { resolveAllConfig } from '../pipeline/config';
10
+ const resolveConfig = (config) => resolveAllConfig(config);
11
+ // #764: a 2D context has a language (`ctx.lang`, Chrome 136 and later) and
12
+ // a font answers with other glyphs under one. Left alone a context made on
13
+ // a page takes the page's language and one made in a worker none, so a
14
+ // document had one layout on a page in its own language, another on a page
15
+ // in any other, and that second one in a layout worker. A document that
16
+ // asks for it (`bodyText.shapingLanguage: 'document'`) has its language
17
+ // set on every context the engine measures with, the plain-paragraph
18
+ // breaker's own included, and declared. The default is the host's, as up
19
+ // to postext 1.28: in 1.29.0, where the document's was the default, the
20
+ // canvas painted in the host's all the same.
21
+ /** The language of the page that hosts the layout: what a context left at
22
+ * `inherit` measures in. Empty: a worker, which has none. */
23
+ let host = 'en';
24
+ /** Every language a measure was taken in, and how many were taken. */
25
+ const measuredIn = new Set();
26
+ let measures = 0;
27
+ const primary = (lang) => lang.toLowerCase().split('-')[0];
28
+ /** Advances, in ems, of a face that draws by language as the measured
29
+ * ones do: `Song` (Noto Serif SC) sets its digits 0.471 em wide in
30
+ * Chinese and 0.55 em in any other language; `Fira` (Fira Sans) sets the
31
+ * Catalan `l·l` with its dot tucked in, and keeps `f` and `i` apart in
32
+ * Turkish. A face named `Plain` draws one way. */
33
+ function advance(ch, font, lang) {
34
+ const language = primary(lang);
35
+ if (ch === ' ' || ch === '\u00A0')
36
+ return 0.25;
37
+ if (font.includes('Song')) {
38
+ if (/[0-9]/.test(ch))
39
+ return language === 'zh' ? 0.471 : 0.55;
40
+ if (/\p{Script=Han}/u.test(ch) || ch === '\u3002' || ch === '\uFF0C')
41
+ return 1;
42
+ }
43
+ if (font.includes('Fira')) {
44
+ if (ch === '\u00B7')
45
+ return language === 'ca' ? 0.1 : 0.3;
46
+ if (ch === 'f')
47
+ return language === 'tr' ? 0.36 : 0.3;
48
+ }
49
+ return 0.5;
50
+ }
51
+ /** A context as a current Chrome makes it: a language of its own,
52
+ * `inherit` until someone sets one. */
53
+ class Context2D {
54
+ shorthand = '10px Body';
55
+ lang = 'inherit';
56
+ direction = 'ltr';
57
+ letterSpacing = '0px';
58
+ textAlign = 'left';
59
+ textBaseline = 'alphabetic';
60
+ fillStyle = '';
61
+ get font() {
62
+ return this.shorthand;
63
+ }
64
+ set font(value) {
65
+ this.shorthand = value;
66
+ }
67
+ measureText(s) {
68
+ const lang = this.lang === 'inherit' ? host : this.lang;
69
+ measuredIn.add(this.lang === 'inherit' ? `host:${host}` : this.lang);
70
+ measures++;
71
+ const size = parseFloat(/(\d*\.?\d+)px/.exec(this.shorthand)?.[1] ?? '10');
72
+ let width = 0;
73
+ for (const ch of s)
74
+ width += advance(ch, this.shorthand, lang) * size;
75
+ return { width };
76
+ }
77
+ }
78
+ const contexts = [];
79
+ const globals = globalThis;
80
+ globals.OffscreenCanvasRenderingContext2D = Context2D;
81
+ globals.OffscreenCanvas = class {
82
+ getContext() {
83
+ const ctx = new Context2D();
84
+ contexts.push(ctx);
85
+ return ctx;
86
+ }
87
+ };
88
+ beforeEach(() => {
89
+ host = 'en';
90
+ clearMeasurementCache();
91
+ measuredIn.clear();
92
+ measures = 0;
93
+ });
94
+ const pt = (value) => ({ value, unit: 'pt' });
95
+ const config = (family, locale, extra = {}) => ({
96
+ page: { width: pt(220), height: pt(600), dpi: 72, margins: { top: pt(10), bottom: pt(10), left: pt(10), right: pt(10) } },
97
+ layout: { layoutType: 'single' },
98
+ header: { elements: [] },
99
+ footer: { elements: [] },
100
+ ...(locale ? { locale } : {}),
101
+ ...extra,
102
+ // The documents of these tests ask for their own language, unless a
103
+ // test says otherwise.
104
+ bodyText: { fontFamily: family, fontSize: pt(10), lineHeight: pt(14), firstLineIndent: pt(0), textAlign: 'left', hyphenation: { enabled: false }, shapingLanguage: 'document', ...extra.bodyText },
105
+ });
106
+ const OWN = { shapingLanguage: 'document' };
107
+ const build = (markdown, cfg) => buildDocument({ markdown }, cfg);
108
+ const paragraphs = (doc) => doc.blocks.filter((b) => b.type === 'paragraph');
109
+ const layout = (doc) => paragraphs(doc).map((b) => b.lines.map((l) => [l.text.trim(), +l.bbox.width.toFixed(3)]));
110
+ const segmentsOf = (doc) => paragraphs(doc).flatMap((b) => b.lines.flatMap((l) => l.segments ?? []));
111
+ // A paragraph with no formatting (the plain-paragraph breaker measures it
112
+ // on a context of its own) and one with a bold word (the engine's).
113
+ const CHINESE = 'In 2016 the strip ran 2516 times and 1024 of them in 2025 again.\n\nIn **2016** the strip ran 2516 times and 1024 of them in 2025 again.\n';
114
+ const CATALAN = 'El col\u00B7legi va instal\u00B7lar la pel\u00B7l\u00EDcula de la til\u00B7la al sal\u00F3 gran.\n\nEl **col\u00B7legi** va instal\u00B7lar la pel\u00B7l\u00EDcula de la til\u00B7la al sal\u00F3 gran.\n';
115
+ describe('the language a document is shaped in (#764)', () => {
116
+ it('is the host\'s by default, as up to postext 1.28', () => {
117
+ expect(shapingLanguageOf({ locale: 'zh-hans' })).toBeUndefined();
118
+ expect(shapingLanguageOf({ locale: 'ca' })).toBeUndefined();
119
+ expect(shapingLanguageOf(resolveConfig({}))).toBeUndefined();
120
+ expect(shapingLanguageOf(resolveConfig({ locale: 'tr', bodyText: { shapingLanguage: 'host' } }))).toBeUndefined();
121
+ });
122
+ it('is its own when it asks for it: the locale, else the hyphenation language, in canonical form', () => {
123
+ expect(shapingLanguageOf({ locale: 'zh-hans', bodyText: OWN })).toBe('zh-Hans');
124
+ expect(shapingLanguageOf({ locale: 'CA', bodyText: OWN })).toBe('ca');
125
+ expect(shapingLanguageOf({ bodyText: { hyphenation: { locale: 'en-us' }, ...OWN } })).toBe('en-US');
126
+ // A document with no locale resolves to the hyphenation default.
127
+ expect(shapingLanguageOf(resolveConfig({ bodyText: OWN }))).toBe('en-US');
128
+ expect(shapingLanguageOf(resolveConfig({ locale: 'tr', bodyText: OWN }))).toBe('tr');
129
+ // A locale that is no tag: no language at all, the same on every host.
130
+ expect(shapingLanguageOf({ locale: 'not a tag!', bodyText: OWN })).toBe('');
131
+ expect(shapingTagOf('EN-us')).toBe('en-US');
132
+ expect(shapingTagOf(' klingon! ')).toBe('klingon!');
133
+ });
134
+ it('a document shaped in its own language declares it; any other only when Chinese, Japanese, Korean or right to left', () => {
135
+ expect(renderLangOf({ locale: 'ca', bodyText: OWN })).toBe('ca');
136
+ expect(renderLangOf({ locale: 'en-us', bodyText: OWN })).toBe('en-US');
137
+ expect(renderLangOf({ locale: 'zh-Hant-TW', bodyText: OWN })).toBe('zh-Hant-TW');
138
+ for (const bodyText of [undefined, { shapingLanguage: 'host' }]) {
139
+ expect(renderLangOf({ locale: 'ca', ...(bodyText ? { bodyText } : {}) })).toBeUndefined();
140
+ expect(renderLangOf({ locale: 'en-us', ...(bodyText ? { bodyText } : {}) })).toBeUndefined();
141
+ expect(renderLangOf({ locale: 'zh-Hant-TW', ...(bodyText ? { bodyText } : {}) })).toBe('zh-Hant-TW');
142
+ expect(renderLangOf({ locale: 'ar-EG', ...(bodyText ? { bodyText } : {}) })).toBe('ar-EG');
143
+ }
144
+ });
145
+ it('is resolved only when it is the document\'s', () => {
146
+ expect('shapingLanguage' in resolveConfig({}).bodyText).toBe(false);
147
+ expect('shapingLanguage' in resolveConfig({ bodyText: { shapingLanguage: 'host' } }).bodyText).toBe(false);
148
+ expect(resolveConfig({ bodyText: OWN }).bodyText.shapingLanguage).toBe('document');
149
+ });
150
+ });
151
+ describe('one layout on every host (#764)', () => {
152
+ const hosts = ['en', 'zh', 'ja', 'ca', 'tr', ''];
153
+ it('a Chinese document: the same lines on a page in any language and in a worker', () => {
154
+ const seen = hosts.map((lang) => {
155
+ host = lang;
156
+ clearMeasurementCache();
157
+ return JSON.stringify(layout(build(CHINESE, config('Song', 'zh-Hans'))));
158
+ });
159
+ expect(new Set(seen).size).toBe(1);
160
+ // Both paragraphs, the plain one and the formatted one, in the Chinese
161
+ // forms: `2016` is 18.84 px wide, not 22.
162
+ host = 'en';
163
+ clearMeasurementCache();
164
+ const doc = build(CHINESE, config('Song', 'zh-Hans'));
165
+ const year = segmentsOf(doc).filter((s) => s.text === '2016');
166
+ expect(year.length).toBe(2);
167
+ for (const seg of year)
168
+ expect(seg.width).toBeCloseTo(18.84, 6);
169
+ // And the plain paragraph breaks as the formatted one does.
170
+ const [plain, rich] = paragraphs(doc);
171
+ expect(plain.lines.map((l) => l.text.trim())).toEqual(rich.lines.map((l) => l.text.trim()));
172
+ expect(pretextLanguageState()).toBe('followed');
173
+ });
174
+ it('nothing is measured in the host\'s language', () => {
175
+ host = 'en';
176
+ build(CHINESE, config('Song', 'zh-Hans'));
177
+ expect([...measuredIn]).toEqual(['zh-Hans']);
178
+ measuredIn.clear();
179
+ clearMeasurementCache();
180
+ build(CATALAN, config('Fira', 'ca'));
181
+ expect([...measuredIn]).toEqual(['ca']);
182
+ // A document with no locale is an English one.
183
+ measuredIn.clear();
184
+ clearMeasurementCache();
185
+ build(CATALAN, config('Fira', undefined));
186
+ expect([...measuredIn]).toEqual(['en-US']);
187
+ // And one that does not ask for its language is measured in the host's.
188
+ measuredIn.clear();
189
+ clearMeasurementCache();
190
+ build(CATALAN, config('Fira', 'ca', { bodyText: { shapingLanguage: undefined } }));
191
+ expect([...measuredIn]).toEqual(['host:en']);
192
+ });
193
+ it('a Catalan and a Turkish document take the forms of their language on an English page', () => {
194
+ host = 'en';
195
+ const catalan = build(CATALAN, config('Fira', 'ca'));
196
+ // `col·legi`: seven letters at 5 px and the dot at 1.
197
+ for (const seg of segmentsOf(catalan).filter((s) => s.text === 'col\u00B7legi'))
198
+ expect(seg.width).toBeCloseTo(36, 6);
199
+ host = 'ca';
200
+ clearMeasurementCache();
201
+ expect(layout(build(CATALAN, config('Fira', 'ca')))).toEqual(layout(catalan));
202
+ host = 'en';
203
+ clearMeasurementCache();
204
+ const turkish = build('Bu ofis fikir ve fiyat listesi.\n', config('Fira', 'tr'));
205
+ expect(segmentsOf(turkish).find((s) => s.text === 'fikir').width).toBeCloseTo(23.6, 6);
206
+ });
207
+ it('with the host\'s language asked for, each host has its layout, as up to 1.28', () => {
208
+ const pinned = config('Song', 'zh-Hans', { bodyText: { shapingLanguage: 'host' } });
209
+ const on = (lang) => {
210
+ host = lang;
211
+ clearMeasurementCache();
212
+ measuredIn.clear();
213
+ const out = JSON.stringify(layout(build(CHINESE, pinned)));
214
+ expect([...measuredIn]).toEqual([`host:${lang}`]);
215
+ return out;
216
+ };
217
+ const english = on('en');
218
+ const chinese = on('zh');
219
+ const worker = on('');
220
+ expect(chinese).not.toBe(english);
221
+ expect(worker).toBe(english);
222
+ // The page in the document's language is what the rule now gives everywhere.
223
+ host = 'en';
224
+ clearMeasurementCache();
225
+ expect(JSON.stringify(layout(build(CHINESE, config('Song', 'zh-Hans'))))).toBe(chinese);
226
+ });
227
+ it('a document shaped in the host\'s language after one shaped in its own gets its contexts back', () => {
228
+ host = 'en';
229
+ build(CHINESE, config('Song', 'zh-Hans'));
230
+ clearMeasurementCache();
231
+ measuredIn.clear();
232
+ build(CHINESE, config('Song', 'zh-Hans', { bodyText: { shapingLanguage: 'host' } }));
233
+ expect([...measuredIn]).toEqual(['host:en']);
234
+ // The build leaves the language as it found it.
235
+ expect(getMeasureLanguage()).toBeUndefined();
236
+ });
237
+ it('a face that draws one way under every language is laid out as before', () => {
238
+ const lay = (cfg) => {
239
+ clearMeasurementCache();
240
+ return JSON.stringify(layout(build(CHINESE, cfg)));
241
+ };
242
+ expect(lay(config('Plain', 'zh-Hans'))).toBe(lay(config('Plain', 'zh-Hans', { bodyText: { shapingLanguage: 'host' } })));
243
+ });
244
+ });
245
+ describe('the widths of each language (#764)', () => {
246
+ it('are kept apart, and kept: going back to a language measures nothing again', () => {
247
+ const SONG = '10px Song';
248
+ expect(withMeasureLanguage('zh-Hans', () => measureTextWidth('2016', SONG))).toBeCloseTo(18.84, 6);
249
+ expect(withMeasureLanguage('en', () => measureTextWidth('2016', SONG))).toBeCloseTo(22, 6);
250
+ const before = measures;
251
+ expect(withMeasureLanguage('zh-Hans', () => measureTextWidth('2016', SONG))).toBeCloseTo(18.84, 6);
252
+ expect(withMeasureLanguage('en', () => measureTextWidth('2016', SONG))).toBeCloseTo(22, 6);
253
+ expect(measures).toBe(before);
254
+ // The host's language is another one still.
255
+ host = 'zh';
256
+ expect(measureTextWidth('2016', SONG)).toBeCloseTo(18.84, 6);
257
+ expect(measures).toBe(before + 1);
258
+ });
259
+ it('a whole document laid out again in its language measures nothing, another language in between or not', () => {
260
+ const chinese = config('Song', 'zh-Hans');
261
+ const first = JSON.stringify(layout(build(CHINESE, chinese)));
262
+ build(CATALAN, config('Fira', 'ca'));
263
+ const before = measures;
264
+ expect(JSON.stringify(layout(build(CHINESE, chinese)))).toBe(first);
265
+ expect(measures).toBe(before);
266
+ });
267
+ it('a cache key says the language, and nothing for the host\'s', () => {
268
+ expect(measureLanguageKey()).toBe('');
269
+ expect(withMeasureLanguage('ca', () => measureLanguageKey())).toContain('ca');
270
+ expect(withMeasureLanguage('', () => measureLanguageKey())).not.toBe('');
271
+ setMeasureLanguage(undefined);
272
+ });
273
+ });
274
+ describe('a run that names its language (#764)', () => {
275
+ const MIXED = 'In **2016** it ran, :ltr[dated 2016]{lang=en} and so on.\n';
276
+ it('is measured in it, in a document shaped in its own language', () => {
277
+ const doc = build(MIXED, config('Song', 'zh-Hans'));
278
+ const years = segmentsOf(doc).filter((s) => s.text === '2016');
279
+ expect(years.map((s) => [s.lang, +s.width.toFixed(2)])).toEqual([[undefined, 18.84], ['en', 22]]);
280
+ expect([...measuredIn].sort()).toEqual(['en', 'zh-Hans']);
281
+ });
282
+ it('and in the host\'s with the rest of a document shaped in the host\'s', () => {
283
+ host = 'zh';
284
+ const doc = build(MIXED, config('Song', 'zh-Hans', { bodyText: { shapingLanguage: 'host' } }));
285
+ const years = segmentsOf(doc).filter((s) => s.text === '2016');
286
+ expect(years.map((s) => +s.width.toFixed(2))).toEqual([18.84, 18.84]);
287
+ expect([...measuredIn]).toEqual(['host:zh']);
288
+ });
289
+ });
290
+ /** A canvas that records the language each text was painted in. */
291
+ function paintedLanguages(doc) {
292
+ const seen = [];
293
+ const state = { font: '10px Body', lang: 'inherit', direction: 'ltr', textAlign: 'left', textBaseline: 'alphabetic', letterSpacing: '0px', fillStyle: '' };
294
+ const measure = new Context2D();
295
+ const api = {
296
+ measureText(s) {
297
+ measure.font = state.font;
298
+ measure.lang = state.lang;
299
+ return measure.measureText(s);
300
+ },
301
+ fillText(text) {
302
+ seen.push({ text, lang: state.lang });
303
+ },
304
+ };
305
+ const ctx = new Proxy(state, {
306
+ get(target, key) {
307
+ if (typeof key === 'string' && key in api)
308
+ return api[key];
309
+ if (typeof key === 'string' && key in target)
310
+ return target[key];
311
+ return () => undefined;
312
+ },
313
+ set(target, key, value) {
314
+ target[key] = value;
315
+ return true;
316
+ },
317
+ has(target, key) { return typeof key === 'string' && (key in api || key in target); },
318
+ });
319
+ const canvas = { width: 0, height: 0, getContext: () => ctx };
320
+ renderPageToCanvas(doc.pages[0], doc, canvas);
321
+ return seen;
322
+ }
323
+ describe('the outputs paint what was measured (#764)', () => {
324
+ it('the canvas: every document in its language, a run in its own', () => {
325
+ const catalan = paintedLanguages(build(CATALAN, config('Fira', 'ca')));
326
+ expect(catalan.length).toBeGreaterThan(0);
327
+ expect(new Set(catalan.map((p) => p.lang))).toEqual(new Set(['ca']));
328
+ const mixed = paintedLanguages(build('In **2016** it ran, :ltr[dated 2016]{lang=en} and so on.\n', config('Song', 'zh-Hans')));
329
+ const years = mixed.filter((p) => p.text === '2016').map((p) => p.lang);
330
+ expect(years).toEqual(['zh-Hans', 'en']);
331
+ // The context has the document's again after the run.
332
+ expect(mixed[mixed.length - 1].lang).toBe('zh-Hans');
333
+ });
334
+ it('the canvas of a document shaped in the host\'s language: untouched unless it is Chinese, Japanese, Korean or right to left', () => {
335
+ const pinned = { bodyText: { shapingLanguage: 'host' } };
336
+ expect(new Set(paintedLanguages(build(CATALAN, config('Fira', 'ca', pinned))).map((p) => p.lang))).toEqual(new Set(['inherit']));
337
+ const chinese = paintedLanguages(build('In **2016** it ran, :ltr[dated 2016]{lang=en} and so on.\n', config('Song', 'zh-Hans', pinned)));
338
+ expect(new Set(chinese.map((p) => p.lang))).toEqual(new Set(['zh-Hans']));
339
+ });
340
+ it('the HTML: the root and every page say the language', () => {
341
+ const html = renderToHtml(build(CATALAN, config('Fira', 'ca')));
342
+ expect(html).toMatch(/^<div class="pt-doc" lang="ca"/);
343
+ expect(html).toMatch(/<div class="pt-page"[^>]* lang="ca"/);
344
+ expect(renderToHtml(build(CATALAN, config('Fira', undefined)))).toMatch(/^<div class="pt-doc" lang="en-US"/);
345
+ for (const shapingLanguage of ['host', undefined]) {
346
+ const hosted = renderToHtml(build(CATALAN, config('Fira', 'ca', { bodyText: { shapingLanguage } })));
347
+ expect(hosted).toMatch(/^<div class="pt-doc" data-mode/);
348
+ expect(hosted).not.toContain(' lang="');
349
+ }
350
+ });
351
+ });
352
+ //# sourceMappingURL=shapingLanguage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapingLanguage.test.js","sourceRoot":"","sources":["../../src/__tests__/shapingLanguage.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=taskBox.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskBox.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/taskBox.test.ts"],"names":[],"mappings":""}