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