postext 1.29.2 → 1.30.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 (275) hide show
  1. package/dist/__tests__/arabicLocale.test.js +5 -5
  2. package/dist/__tests__/arabicLocale.test.js.map +1 -1
  3. package/dist/__tests__/bundle/balloonPlacementPin.test.js +5 -4
  4. package/dist/__tests__/bundle/balloonPlacementPin.test.js.map +1 -1
  5. package/dist/__tests__/bundle/cjkRulesPin.test.js +8 -6
  6. package/dist/__tests__/bundle/cjkRulesPin.test.js.map +1 -1
  7. package/dist/__tests__/bundle/designOverflowPin.test.js +1 -1
  8. package/dist/__tests__/bundle/flowColumnsPin.test.js +4 -3
  9. package/dist/__tests__/bundle/flowColumnsPin.test.js.map +1 -1
  10. package/dist/__tests__/bundle/gridBalancingPin.test.js +5 -4
  11. package/dist/__tests__/bundle/gridBalancingPin.test.js.map +1 -1
  12. package/dist/__tests__/bundle/gridBreakRulesPin.test.js +14 -10
  13. package/dist/__tests__/bundle/gridBreakRulesPin.test.js.map +1 -1
  14. package/dist/__tests__/bundle/indexGroupSplitPin.test.js +4 -3
  15. package/dist/__tests__/bundle/indexGroupSplitPin.test.js.map +1 -1
  16. package/dist/__tests__/bundle/looseOrderPin.test.js +5 -4
  17. package/dist/__tests__/bundle/looseOrderPin.test.js.map +1 -1
  18. package/dist/__tests__/bundle/refLabelBreaksPin.test.js +5 -4
  19. package/dist/__tests__/bundle/refLabelBreaksPin.test.js.map +1 -1
  20. package/dist/__tests__/bundle/scriptContextPin.test.js +6 -5
  21. package/dist/__tests__/bundle/scriptContextPin.test.js.map +1 -1
  22. package/dist/__tests__/bundle/shapingLanguagePin.test.js +142 -46
  23. package/dist/__tests__/bundle/shapingLanguagePin.test.js.map +1 -1
  24. package/dist/__tests__/bundle/taskBoxPin.test.js +1 -1
  25. package/dist/__tests__/bundle/trailingStepPin.test.js +4 -3
  26. package/dist/__tests__/bundle/trailingStepPin.test.js.map +1 -1
  27. package/dist/__tests__/bundle/wideFloatStretchPin.test.js +4 -3
  28. package/dist/__tests__/bundle/wideFloatStretchPin.test.js.map +1 -1
  29. package/dist/__tests__/bundle.test.js +1 -1
  30. package/dist/__tests__/cellText.test.d.ts +2 -0
  31. package/dist/__tests__/cellText.test.d.ts.map +1 -0
  32. package/dist/__tests__/cellText.test.js +281 -0
  33. package/dist/__tests__/cellText.test.js.map +1 -0
  34. package/dist/__tests__/chineseLocale.test.js +13 -11
  35. package/dist/__tests__/chineseLocale.test.js.map +1 -1
  36. package/dist/__tests__/cjk/japaneseHtml.test.js +3 -3
  37. package/dist/__tests__/cjk/japaneseHtml.test.js.map +1 -1
  38. package/dist/__tests__/cjk/japaneseRuby.test.js +1 -1
  39. package/dist/__tests__/cjk/japaneseRuby.test.js.map +1 -1
  40. package/dist/__tests__/cjk/japaneseSegmentLanguage.test.js +3 -3
  41. package/dist/__tests__/cjk/japaneseSegmentLanguage.test.js.map +1 -1
  42. package/dist/__tests__/codeBlocks.test.js +1 -1
  43. package/dist/__tests__/contextText.test.d.ts +2 -0
  44. package/dist/__tests__/contextText.test.d.ts.map +1 -0
  45. package/dist/__tests__/contextText.test.js +371 -0
  46. package/dist/__tests__/contextText.test.js.map +1 -0
  47. package/dist/__tests__/design/designTextRender.test.js +8 -1
  48. package/dist/__tests__/design/designTextRender.test.js.map +1 -1
  49. package/dist/__tests__/exports.test.js +6 -0
  50. package/dist/__tests__/exports.test.js.map +1 -1
  51. package/dist/__tests__/fontUsage.test.js +40 -0
  52. package/dist/__tests__/fontUsage.test.js.map +1 -1
  53. package/dist/__tests__/hardBreaks.test.js +1 -1
  54. package/dist/__tests__/headingInlineMarks.test.js +1 -1
  55. package/dist/__tests__/html-backend.test.js +6 -2
  56. package/dist/__tests__/html-backend.test.js.map +1 -1
  57. package/dist/__tests__/japaneseNotes.test.js +4 -2
  58. package/dist/__tests__/japaneseNotes.test.js.map +1 -1
  59. package/dist/__tests__/lineEndPieces.test.d.ts +2 -0
  60. package/dist/__tests__/lineEndPieces.test.d.ts.map +1 -0
  61. package/dist/__tests__/lineEndPieces.test.js +374 -0
  62. package/dist/__tests__/lineEndPieces.test.js.map +1 -0
  63. package/dist/__tests__/mathSizeMigration.test.js +2 -2
  64. package/dist/__tests__/pipeline/calloutInlineResourceGap.test.js +1 -1
  65. package/dist/__tests__/pipeline/calloutSplitMinLinesChild.test.js +1 -1
  66. package/dist/__tests__/pipeline/colonListRoom.test.js +1 -1
  67. package/dist/__tests__/pipeline/compoundBreaks.test.js +1 -1
  68. package/dist/__tests__/pipeline/dashBreaks.test.js +1 -1
  69. package/dist/__tests__/pipeline/headingSplitOrphans.test.js +1 -1
  70. package/dist/__tests__/pipeline/inlineFigureSpace.test.js +1 -1
  71. package/dist/__tests__/pipeline/paragraphContainerTail.test.js +1 -1
  72. package/dist/__tests__/pipeline/raggedOptimal.test.js +1 -1
  73. package/dist/__tests__/plainGeminateHead.test.d.ts +2 -0
  74. package/dist/__tests__/plainGeminateHead.test.d.ts.map +1 -0
  75. package/dist/__tests__/plainGeminateHead.test.js +92 -0
  76. package/dist/__tests__/plainGeminateHead.test.js.map +1 -0
  77. package/dist/__tests__/presets/showcaseShapingLanguage.test.d.ts +2 -0
  78. package/dist/__tests__/presets/showcaseShapingLanguage.test.d.ts.map +1 -0
  79. package/dist/__tests__/presets/showcaseShapingLanguage.test.js +52 -0
  80. package/dist/__tests__/presets/showcaseShapingLanguage.test.js.map +1 -0
  81. package/dist/__tests__/reshapedTracking.test.d.ts +2 -0
  82. package/dist/__tests__/reshapedTracking.test.d.ts.map +1 -0
  83. package/dist/__tests__/reshapedTracking.test.js +358 -0
  84. package/dist/__tests__/reshapedTracking.test.js.map +1 -0
  85. package/dist/__tests__/rtl/designRunsPainted.test.d.ts +2 -0
  86. package/dist/__tests__/rtl/designRunsPainted.test.d.ts.map +1 -0
  87. package/dist/__tests__/rtl/designRunsPainted.test.js +184 -0
  88. package/dist/__tests__/rtl/designRunsPainted.test.js.map +1 -0
  89. package/dist/__tests__/rtl/designTextPaint.test.js +5 -1
  90. package/dist/__tests__/rtl/designTextPaint.test.js.map +1 -1
  91. package/dist/__tests__/rtl/htmlRtl.test.js +3 -3
  92. package/dist/__tests__/rtl/htmlRtl.test.js.map +1 -1
  93. package/dist/__tests__/rtl/listMarkerDirection.test.js +28 -28
  94. package/dist/__tests__/rtl/listMarkerDirection.test.js.map +1 -1
  95. package/dist/__tests__/rtl/tocNumberPainted.test.d.ts +2 -0
  96. package/dist/__tests__/rtl/tocNumberPainted.test.d.ts.map +1 -0
  97. package/dist/__tests__/rtl/tocNumberPainted.test.js +113 -0
  98. package/dist/__tests__/rtl/tocNumberPainted.test.js.map +1 -0
  99. package/dist/__tests__/scriptContext.test.js +141 -1
  100. package/dist/__tests__/scriptContext.test.js.map +1 -1
  101. package/dist/__tests__/shapingLanguage.test.js +54 -41
  102. package/dist/__tests__/shapingLanguage.test.js.map +1 -1
  103. package/dist/__tests__/trackedLetters.test.d.ts +2 -0
  104. package/dist/__tests__/trackedLetters.test.d.ts.map +1 -0
  105. package/dist/__tests__/trackedLetters.test.js +380 -0
  106. package/dist/__tests__/trackedLetters.test.js.map +1 -0
  107. package/dist/__tests__/trackedLigatures.test.js +17 -5
  108. package/dist/__tests__/trackedLigatures.test.js.map +1 -1
  109. package/dist/__tests__/verseLines.test.js +1 -1
  110. package/dist/__tests__/wordCacheOrder.test.d.ts +2 -0
  111. package/dist/__tests__/wordCacheOrder.test.d.ts.map +1 -0
  112. package/dist/__tests__/wordCacheOrder.test.js +352 -0
  113. package/dist/__tests__/wordCacheOrder.test.js.map +1 -0
  114. package/dist/__tests__/wordPieces.test.d.ts +2 -0
  115. package/dist/__tests__/wordPieces.test.d.ts.map +1 -0
  116. package/dist/__tests__/wordPieces.test.js +762 -0
  117. package/dist/__tests__/wordPieces.test.js.map +1 -0
  118. package/dist/bidi.d.ts +12 -0
  119. package/dist/bidi.d.ts.map +1 -1
  120. package/dist/bidi.js +23 -0
  121. package/dist/bidi.js.map +1 -1
  122. package/dist/bundle/configVersion.d.ts +49 -23
  123. package/dist/bundle/configVersion.d.ts.map +1 -1
  124. package/dist/bundle/configVersion.js +54 -25
  125. package/dist/bundle/configVersion.js.map +1 -1
  126. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  127. package/dist/canvas-backend/blockRender.js +58 -27
  128. package/dist/canvas-backend/blockRender.js.map +1 -1
  129. package/dist/canvas-backend/cellText.d.ts +12 -0
  130. package/dist/canvas-backend/cellText.d.ts.map +1 -0
  131. package/dist/canvas-backend/cellText.js +114 -0
  132. package/dist/canvas-backend/cellText.js.map +1 -0
  133. package/dist/canvas-backend/chip.d.ts.map +1 -1
  134. package/dist/canvas-backend/chip.js +2 -1
  135. package/dist/canvas-backend/chip.js.map +1 -1
  136. package/dist/canvas-backend/contextState.d.ts +7 -0
  137. package/dist/canvas-backend/contextState.d.ts.map +1 -1
  138. package/dist/canvas-backend/contextState.js +7 -0
  139. package/dist/canvas-backend/contextState.js.map +1 -1
  140. package/dist/canvas-backend/contextText.d.ts +76 -0
  141. package/dist/canvas-backend/contextText.d.ts.map +1 -0
  142. package/dist/canvas-backend/contextText.js +102 -0
  143. package/dist/canvas-backend/contextText.js.map +1 -0
  144. package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
  145. package/dist/canvas-backend/headerFooter.js +8 -1
  146. package/dist/canvas-backend/headerFooter.js.map +1 -1
  147. package/dist/canvas-backend/index.d.ts.map +1 -1
  148. package/dist/canvas-backend/index.js +19 -13
  149. package/dist/canvas-backend/index.js.map +1 -1
  150. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  151. package/dist/canvas-backend/renderResourceBlock.js +12 -6
  152. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  153. package/dist/canvas-backend/scriptText.d.ts.map +1 -1
  154. package/dist/canvas-backend/scriptText.js +3 -2
  155. package/dist/canvas-backend/scriptText.js.map +1 -1
  156. package/dist/canvas-backend/segmentText.d.ts.map +1 -1
  157. package/dist/canvas-backend/segmentText.js +8 -2
  158. package/dist/canvas-backend/segmentText.js.map +1 -1
  159. package/dist/canvas-backend/trackedText.d.ts +75 -1
  160. package/dist/canvas-backend/trackedText.d.ts.map +1 -1
  161. package/dist/canvas-backend/trackedText.js +185 -22
  162. package/dist/canvas-backend/trackedText.js.map +1 -1
  163. package/dist/canvas-backend/verticalText.d.ts +9 -0
  164. package/dist/canvas-backend/verticalText.d.ts.map +1 -1
  165. package/dist/canvas-backend/verticalText.js +29 -7
  166. package/dist/canvas-backend/verticalText.js.map +1 -1
  167. package/dist/canvas-backend/wordPieces.d.ts +31 -0
  168. package/dist/canvas-backend/wordPieces.d.ts.map +1 -0
  169. package/dist/canvas-backend/wordPieces.js +132 -0
  170. package/dist/canvas-backend/wordPieces.js.map +1 -0
  171. package/dist/canvas-backend/wordRuns.d.ts +3 -1
  172. package/dist/canvas-backend/wordRuns.d.ts.map +1 -1
  173. package/dist/canvas-backend/wordRuns.js +10 -6
  174. package/dist/canvas-backend/wordRuns.js.map +1 -1
  175. package/dist/comics/lettering/__tests__/fitAsPainted.test.d.ts +2 -0
  176. package/dist/comics/lettering/__tests__/fitAsPainted.test.d.ts.map +1 -0
  177. package/dist/comics/lettering/__tests__/fitAsPainted.test.js +97 -0
  178. package/dist/comics/lettering/__tests__/fitAsPainted.test.js.map +1 -0
  179. package/dist/comics/lettering/shape-text.d.ts.map +1 -1
  180. package/dist/comics/lettering/shape-text.js +39 -11
  181. package/dist/comics/lettering/shape-text.js.map +1 -1
  182. package/dist/defaults/bodyText.d.ts.map +1 -1
  183. package/dist/defaults/bodyText.js +6 -5
  184. package/dist/defaults/bodyText.js.map +1 -1
  185. package/dist/design/bidiText.d.ts +45 -6
  186. package/dist/design/bidiText.d.ts.map +1 -1
  187. package/dist/design/bidiText.js +78 -10
  188. package/dist/design/bidiText.js.map +1 -1
  189. package/dist/design/cjkText.d.ts +3 -0
  190. package/dist/design/cjkText.d.ts.map +1 -1
  191. package/dist/design/cjkText.js +1 -1
  192. package/dist/design/cjkText.js.map +1 -1
  193. package/dist/design/layout.d.ts.map +1 -1
  194. package/dist/design/layout.js +36 -5
  195. package/dist/design/layout.js.map +1 -1
  196. package/dist/design/richText.d.ts +9 -1
  197. package/dist/design/richText.d.ts.map +1 -1
  198. package/dist/design/richText.js +8 -2
  199. package/dist/design/richText.js.map +1 -1
  200. package/dist/fonts/usage.d.ts +2 -0
  201. package/dist/fonts/usage.d.ts.map +1 -1
  202. package/dist/fonts/usage.js +18 -0
  203. package/dist/fonts/usage.js.map +1 -1
  204. package/dist/html-backend.d.ts.map +1 -1
  205. package/dist/html-backend.js +664 -84
  206. package/dist/html-backend.js.map +1 -1
  207. package/dist/index.d.ts +3 -1
  208. package/dist/index.d.ts.map +1 -1
  209. package/dist/index.js +4 -1
  210. package/dist/index.js.map +1 -1
  211. package/dist/knuthPlass/breakpoints.d.ts.map +1 -1
  212. package/dist/knuthPlass/breakpoints.js +4 -2
  213. package/dist/knuthPlass/breakpoints.js.map +1 -1
  214. package/dist/knuthPlass/pretextAdapter.d.ts +6 -3
  215. package/dist/knuthPlass/pretextAdapter.d.ts.map +1 -1
  216. package/dist/knuthPlass/pretextAdapter.js +11 -3
  217. package/dist/knuthPlass/pretextAdapter.js.map +1 -1
  218. package/dist/knuthPlass/richAdapter.d.ts +13 -1
  219. package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
  220. package/dist/knuthPlass/richAdapter.js +53 -5
  221. package/dist/knuthPlass/richAdapter.js.map +1 -1
  222. package/dist/knuthPlass/tracking.d.ts.map +1 -1
  223. package/dist/knuthPlass/tracking.js +3 -2
  224. package/dist/knuthPlass/tracking.js.map +1 -1
  225. package/dist/knuthPlass/types.d.ts +6 -0
  226. package/dist/knuthPlass/types.d.ts.map +1 -1
  227. package/dist/locale.d.ts +21 -17
  228. package/dist/locale.d.ts.map +1 -1
  229. package/dist/locale.js +23 -19
  230. package/dist/locale.js.map +1 -1
  231. package/dist/measure/canvas.d.ts +21 -0
  232. package/dist/measure/canvas.d.ts.map +1 -1
  233. package/dist/measure/canvas.js +165 -85
  234. package/dist/measure/canvas.js.map +1 -1
  235. package/dist/measure/cjkCompose.d.ts.map +1 -1
  236. package/dist/measure/cjkCompose.js +31 -5
  237. package/dist/measure/cjkCompose.js.map +1 -1
  238. package/dist/measure/plain.d.ts.map +1 -1
  239. package/dist/measure/plain.js +31 -6
  240. package/dist/measure/plain.js.map +1 -1
  241. package/dist/measure/pretextLanguage.d.ts.map +1 -1
  242. package/dist/measure/pretextLanguage.js +49 -7
  243. package/dist/measure/pretextLanguage.js.map +1 -1
  244. package/dist/measure/rich.d.ts +18 -1
  245. package/dist/measure/rich.d.ts.map +1 -1
  246. package/dist/measure/rich.js +200 -29
  247. package/dist/measure/rich.js.map +1 -1
  248. package/dist/measure/script.d.ts +17 -1
  249. package/dist/measure/script.d.ts.map +1 -1
  250. package/dist/measure/script.js +17 -1
  251. package/dist/measure/script.js.map +1 -1
  252. package/dist/measure/trackedLigatures.d.ts +59 -0
  253. package/dist/measure/trackedLigatures.d.ts.map +1 -0
  254. package/dist/measure/trackedLigatures.js +144 -0
  255. package/dist/measure/trackedLigatures.js.map +1 -0
  256. package/dist/pipeline/build.d.ts.map +1 -1
  257. package/dist/pipeline/build.js +4 -3
  258. package/dist/pipeline/build.js.map +1 -1
  259. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  260. package/dist/pipeline/calloutLayout.js +26 -7
  261. package/dist/pipeline/calloutLayout.js.map +1 -1
  262. package/dist/pipeline/lists.d.ts +13 -4
  263. package/dist/pipeline/lists.d.ts.map +1 -1
  264. package/dist/pipeline/lists.js +49 -12
  265. package/dist/pipeline/lists.js.map +1 -1
  266. package/dist/pipeline/toc.d.ts.map +1 -1
  267. package/dist/pipeline/toc.js +33 -9
  268. package/dist/pipeline/toc.js.map +1 -1
  269. package/dist/types.d.ts +35 -26
  270. package/dist/types.d.ts.map +1 -1
  271. package/dist/wordPieces.d.ts +120 -0
  272. package/dist/wordPieces.d.ts.map +1 -0
  273. package/dist/wordPieces.js +319 -0
  274. package/dist/wordPieces.js.map +1 -0
  275. package/package.json +1 -1
@@ -0,0 +1,352 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { buildDocument } from '../pipeline';
3
+ import { clearMeasurementCache } from '../measure';
4
+ import { canvasText, measureMarkedWidth, measureRunWidth, measureTextWidth, measureUncachedWidth, scriptSensitive, setMeasureLanguage } from '../measure/canvas';
5
+ import { measureBlock } from '../measure/plain';
6
+ import { pretextLanguageState } from '../measure/pretextLanguage';
7
+ // #770: Chrome's canvas keeps the words it shaped, by context, font and
8
+ // language, under the word's text alone, and a word with no letter has two
9
+ // shapes: Latin forms when its string reached the shaper one byte a
10
+ // character, the font's default forms when the string held a character
11
+ // past U+00FF. The first shape kept answers for both, so on one context a
12
+ // width depended on what was measured before: `2026` after `2026 — 2027`,
13
+ // the stop of an Arabic word after `.` was measured alone. A document
14
+ // shaped in its own language is measured on two contexts, one for each
15
+ // kind of string; one shaped in its host's on one, as it always was.
16
+ const NBSP = '\u00A0';
17
+ const EM_DASH = '\u2014';
18
+ const HAN = '\u5E74';
19
+ const KITAB = '\u0643\u062A\u0627\u0628';
20
+ const BEH = '\u0628';
21
+ const VERSE_SIGN = '\u060E';
22
+ const WIDE_RE = /[^\u0000-\u00FF]/;
23
+ const isHan = (ch) => /\p{Script=Han}/u.test(ch);
24
+ const isRtlLetter = (ch) => /[\u0590-\u08FF]/.test(ch) && /\p{L}/u.test(ch);
25
+ const isLtrLetter = (ch) => /\p{L}/u.test(ch) && !isRtlLetter(ch);
26
+ const isDigit = (ch) => /[0-9]/.test(ch);
27
+ const hasScript = (ch) => /[^\p{Script=Common}\p{Script=Inherited}]/u.test(ch);
28
+ /** Advances, in ems, of a face that draws its marks and digits by script
29
+ * as Amiri and Noto Serif SC do (`Reads`), and of one that draws them one
30
+ * way (`Plain`). */
31
+ function advance(ch, shape, font) {
32
+ if (ch === ' ' || ch === NBSP)
33
+ return 0.25;
34
+ if (isHan(ch))
35
+ return 1;
36
+ const latin = shape === 'latin' || font.includes('Plain');
37
+ if (ch === '.')
38
+ return latin ? 0.2 : 0.3;
39
+ if (ch === '(' || ch === ')')
40
+ return latin ? 0.25 : 0.45;
41
+ if (ch === '"')
42
+ return latin ? 0.39 : 0.37;
43
+ if (isDigit(ch))
44
+ return latin ? 0.55 : 0.47;
45
+ return 0.5;
46
+ }
47
+ /** The words Chrome 154 shapes and keeps of a canvas text: what stands
48
+ * between two spaces, cut where the direction changes and before a Han
49
+ * character. */
50
+ function wordsOf(text, direction) {
51
+ const out = [];
52
+ for (const word of text.split(' ')) {
53
+ if (word === '')
54
+ continue;
55
+ const rtl = direction === 'rtl';
56
+ const side = (ch) => (rtl ? (isLtrLetter(ch) || isDigit(ch) ? 'l' : 'r') : isRtlLetter(ch) ? 'r' : 'l');
57
+ let piece = '';
58
+ for (const ch of word) {
59
+ if (piece !== '' && (isHan(ch) || side(ch) !== side(piece[piece.length - 1]))) {
60
+ out.push(piece);
61
+ piece = '';
62
+ }
63
+ piece += ch;
64
+ }
65
+ if (piece !== '')
66
+ out.push(piece);
67
+ }
68
+ return out;
69
+ }
70
+ /** How a word is shaped the first time: by its first letter's script when
71
+ * it has one, else by the kind of string it came in. */
72
+ function shapeOf(word, wide) {
73
+ const letter = [...word].find(hasScript);
74
+ if (letter !== undefined)
75
+ return /\p{Script=Latin}/u.test(letter) ? 'latin' : 'default';
76
+ return wide ? 'default' : 'latin';
77
+ }
78
+ /** The width of `text` on a context that kept the shapes of `kept`. */
79
+ function shapedWidth(text, font, lang, direction, kept) {
80
+ const size = parseFloat(/(\d*\.?\d+)px/.exec(font)?.[1] ?? '10');
81
+ const wide = WIDE_RE.test(text);
82
+ let width = (text.split(' ').length - 1) * advance(' ', 'latin', font) * size;
83
+ for (const word of wordsOf(text, direction)) {
84
+ const key = `${font}|${lang}|${word}`;
85
+ let shape = kept.get(key);
86
+ if (shape === undefined) {
87
+ shape = shapeOf(word, wide);
88
+ kept.set(key, shape);
89
+ }
90
+ for (const ch of word)
91
+ width += advance(ch, shape, font) * size;
92
+ }
93
+ return width;
94
+ }
95
+ /** What a context that never measured anything gives `text`. */
96
+ const fresh = (text, font, lang = 'ar', direction = 'ltr') => shapedWidth(text, font, lang, direction, new Map());
97
+ class Context2D {
98
+ shorthand = '10px Body';
99
+ lang = 'inherit';
100
+ direction = 'ltr';
101
+ letterSpacing = '0px';
102
+ /** The words this context shaped, and how. */
103
+ kept = new Map();
104
+ /** The kinds of string it was handed, by language. */
105
+ kinds = new Map();
106
+ measures = 0;
107
+ get font() {
108
+ return this.shorthand;
109
+ }
110
+ set font(value) {
111
+ this.shorthand = value;
112
+ }
113
+ measureText(s) {
114
+ this.measures++;
115
+ let kinds = this.kinds.get(this.lang);
116
+ if (!kinds)
117
+ this.kinds.set(this.lang, kinds = new Set());
118
+ kinds.add(WIDE_RE.test(s) ? 'wide' : 'narrow');
119
+ return { width: shapedWidth(s, this.shorthand, this.lang, this.direction, this.kept) };
120
+ }
121
+ }
122
+ const contexts = [];
123
+ const globals = globalThis;
124
+ globals.OffscreenCanvasRenderingContext2D = Context2D;
125
+ globals.OffscreenCanvas = class {
126
+ getContext() {
127
+ const ctx = new Context2D();
128
+ contexts.push(ctx);
129
+ return ctx;
130
+ }
131
+ };
132
+ const newContext = () => new globals.OffscreenCanvas().getContext();
133
+ /** The contexts that took both kinds of string in one language other than
134
+ * the host's: none may, or a word of theirs has two shapes. */
135
+ const mixed = () => contexts.filter((ctx) => [...ctx.kinds].some(([lang, kinds]) => lang !== 'inherit' && kinds.size > 1));
136
+ const READS = '10px Reads';
137
+ const PLAIN = '10px Plain';
138
+ beforeEach(() => {
139
+ setMeasureLanguage(undefined);
140
+ clearMeasurementCache();
141
+ });
142
+ describe('the model of the canvas (#770)', () => {
143
+ it('a word with no letter is shaped by the kind of string it comes in, and the first shape is kept', () => {
144
+ const a = newContext();
145
+ a.font = READS;
146
+ expect(a.measureText('2026').width).toBeCloseTo(22, 6);
147
+ // `2026` is kept in its Latin forms; `2027` enters in the default ones.
148
+ expect(a.measureText(`2026 ${EM_DASH} 2027`).width).toBeCloseTo(22 + 2.5 + 5 + 2.5 + 18.8, 6);
149
+ const b = newContext();
150
+ b.font = READS;
151
+ b.measureText(`2026 ${EM_DASH} 2027`);
152
+ expect(b.measureText('2026').width).toBeCloseTo(18.8, 6);
153
+ // The stop of an Arabic word is a run of its own left to right.
154
+ const c = newContext();
155
+ c.font = READS;
156
+ expect(c.measureText(`${KITAB}.`).width).toBeCloseTo(23, 6);
157
+ expect(c.measureText('.').width).toBeCloseTo(3, 6);
158
+ expect(fresh('.', READS)).toBeCloseTo(2, 6);
159
+ });
160
+ });
161
+ /** Strings as the engine measures them: words alone, words that hold a
162
+ * wider character, runs of several words. */
163
+ const CORPUS = [
164
+ '2026', '.', '(1)', '46.', '"', 'end.', `2026 ${EM_DASH} 2027`, `2026${HAN}`, `"${HAN}"`, `${KITAB}.`, `(${KITAB})`, `${KITAB} .`,
165
+ 'in 2026', '2026 2027', `${KITAB}2026`, `(1) ${EM_DASH}`, `. ${EM_DASH}`, `${EM_DASH}`, `${BEH}${NBSP}.`,
166
+ ];
167
+ const ORDERS = [
168
+ CORPUS.map((_, i) => i),
169
+ CORPUS.map((_, i) => CORPUS.length - 1 - i),
170
+ // The strings with a wider character first, then the Latin-1 ones.
171
+ [...CORPUS.keys()].sort((a, b) => Number(WIDE_RE.test(CORPUS[b])) - Number(WIDE_RE.test(CORPUS[a]))),
172
+ [...CORPUS.keys()].sort((a, b) => Number(WIDE_RE.test(CORPUS[a])) - Number(WIDE_RE.test(CORPUS[b]))),
173
+ ];
174
+ describe('a width does not depend on what was measured before (#770)', () => {
175
+ it('in the host\'s language a document is measured on one context, as it always was', () => {
176
+ const before = contexts.length;
177
+ // The stop of the Arabic word is kept in the font's default forms…
178
+ expect(measureTextWidth(`${KITAB}.`, READS)).toBeCloseTo(23, 6);
179
+ // …and answers for the stop measured alone, 2 px on a context that
180
+ // measured nothing.
181
+ expect(measureTextWidth('.', READS)).toBeCloseTo(3, 6);
182
+ expect(contexts.slice(before).filter((ctx) => ctx.measures > 0).length).toBeLessThanOrEqual(1);
183
+ expect(contexts.every((ctx) => [...ctx.kinds.keys()].every((lang) => lang === 'inherit') || mixed().length === 0)).toBe(true);
184
+ });
185
+ it('in its own language every string has the width a context that measured nothing gives it, in any order', () => {
186
+ setMeasureLanguage('ar');
187
+ for (const order of ORDERS) {
188
+ // The engine drops its own widths; the browser keeps its shaped words.
189
+ clearMeasurementCache();
190
+ for (const i of order) {
191
+ const text = CORPUS[i];
192
+ expect(measureTextWidth(text, READS), text).toBeCloseTo(fresh(text, READS), 6);
193
+ expect(measureRunWidth(text, READS), text).toBeCloseTo(fresh(text, READS), 6);
194
+ expect(measureUncachedWidth(text, READS), text).toBeCloseTo(fresh(text, READS), 6);
195
+ }
196
+ }
197
+ expect(mixed()).toEqual([]);
198
+ });
199
+ it('a word beside its mark, and one measured right to left, likewise', () => {
200
+ setMeasureLanguage('ar');
201
+ const marked = () => [
202
+ measureMarkedWidth('46.', READS, '', `${NBSP}n`, false),
203
+ measureMarkedWidth('46.', READS, '', `${NBSP}${VERSE_SIGN}`, false),
204
+ measureMarkedWidth('.', READS, `${BEH}${NBSP}`, '', true),
205
+ measureMarkedWidth(`${KITAB}.`, READS, '', '', true),
206
+ measureMarkedWidth('.', READS, '', '', true),
207
+ ];
208
+ const first = marked();
209
+ // Latin forms beside a Latin letter, the default ones beside an Arabic
210
+ // sign; the stop of the Arabic word is in its run right to left.
211
+ expect(first[0]).toBeCloseTo(13, 6);
212
+ expect(first[1]).toBeCloseTo(12.4, 6);
213
+ expect(first[3]).toBeCloseTo(23, 6);
214
+ expect(first[4]).toBeCloseTo(2, 6);
215
+ clearMeasurementCache();
216
+ for (const text of [`${KITAB}.`, '.', `. ${EM_DASH}`, '46.', `46. ${EM_DASH}`])
217
+ measureTextWidth(text, READS);
218
+ expect(marked()).toEqual(first);
219
+ expect(mixed()).toEqual([]);
220
+ });
221
+ it('the probe of a face answers the same after any text', () => {
222
+ setMeasureLanguage('ar');
223
+ const marks = [`${NBSP}n`, `${NBSP}${VERSE_SIGN}`];
224
+ expect(scriptSensitive(READS, marks)).toBe(true);
225
+ expect(scriptSensitive(PLAIN, marks)).toBe(false);
226
+ clearMeasurementCache();
227
+ for (const text of CORPUS)
228
+ measureTextWidth(text, READS);
229
+ expect(scriptSensitive(READS, marks)).toBe(true);
230
+ expect(mixed()).toEqual([]);
231
+ });
232
+ it('each language keeps its own two contexts\' worth of shapes, and going back to the host\'s changes nothing there', () => {
233
+ setMeasureLanguage('ar');
234
+ expect(measureTextWidth(`${KITAB}.`, READS)).toBeCloseTo(23, 6);
235
+ expect(measureTextWidth('.', READS)).toBeCloseTo(2, 6);
236
+ setMeasureLanguage('fa');
237
+ expect(measureTextWidth('.', READS)).toBeCloseTo(2, 6);
238
+ expect(measureTextWidth(`${KITAB}.`, READS)).toBeCloseTo(23, 6);
239
+ setMeasureLanguage(undefined);
240
+ expect(measureTextWidth(`${KITAB}.`, READS)).toBeCloseTo(23, 6);
241
+ expect(measureTextWidth('.', READS)).toBeCloseTo(3, 6);
242
+ expect(mixed()).toEqual([]);
243
+ });
244
+ it('the text handed to the canvas is the text measured', () => {
245
+ expect(canvasText('2026')).toBe('2026');
246
+ setMeasureLanguage('en');
247
+ for (const text of ['2026', '978-3-16-148410-0', 'caf\u00E9', `2026 ${EM_DASH} 2027`, KITAB])
248
+ expect(canvasText(text)).toBe(text);
249
+ });
250
+ });
251
+ const pt = (value) => ({ value, unit: 'pt' });
252
+ const config = (family, shaping, bodyText = {}) => ({
253
+ page: { width: pt(220), height: pt(600), dpi: 72, margins: { top: pt(10), bottom: pt(10), left: pt(10), right: pt(10) } },
254
+ layout: { layoutType: 'single' },
255
+ header: { elements: [] },
256
+ footer: { elements: [] },
257
+ locale: 'ar',
258
+ bodyText: { fontFamily: family, fontSize: pt(10), lineHeight: pt(14), firstLineIndent: pt(0), textAlign: 'left', hyphenation: { enabled: false }, shapingLanguage: shaping, ...bodyText },
259
+ });
260
+ const paragraphs = (doc) => doc.blocks.filter((b) => b.type === 'paragraph');
261
+ const widths = (doc) => JSON.stringify(paragraphs(doc).map((b) => b.lines.map((l) => (l.segments ?? []).map((s) => [s.text, +s.width.toFixed(3)]))));
262
+ // Two documents in one face: words that carry their marks, and the same
263
+ // marks standing alone. A word with no letter is shaped alone here
264
+ // (`scriptContext: false`, as up to postext 1.27), which is where the two
265
+ // shapes of one word meet on the engine's context.
266
+ const CARRIED = `${KITAB}. (${KITAB}) ${KITAB}.\n\n**${KITAB}.** (${KITAB}) ${KITAB}.\n`;
267
+ const ALONE = `${KITAB} . ( 1 ) ${KITAB} .\n\n**${KITAB}** . ( 1 ) ${KITAB} .\n`;
268
+ describe('two documents laid out in either order (#770)', () => {
269
+ const alone = (markdown, cfg) => {
270
+ // A page that laid out nothing: the engine's widths dropped and its
271
+ // contexts' shaped words too.
272
+ clearMeasurementCache();
273
+ for (const ctx of contexts)
274
+ ctx.kept.clear();
275
+ return widths(buildDocument({ markdown }, cfg));
276
+ };
277
+ it('shaped in their own language: each is laid out as it is alone', () => {
278
+ const cfg = config('Reads', 'document', { scriptContext: false });
279
+ const carried = alone(CARRIED, cfg);
280
+ const apart = alone(ALONE, cfg);
281
+ for (const ctx of contexts)
282
+ ctx.kept.clear();
283
+ clearMeasurementCache();
284
+ expect(widths(buildDocument({ markdown: CARRIED }, cfg))).toBe(carried);
285
+ expect(widths(buildDocument({ markdown: ALONE }, cfg))).toBe(apart);
286
+ // The other way round, the engine's widths dropped in between as a
287
+ // host may do, the browser's shaped words kept.
288
+ for (const ctx of contexts)
289
+ ctx.kept.clear();
290
+ clearMeasurementCache();
291
+ expect(widths(buildDocument({ markdown: ALONE }, cfg))).toBe(apart);
292
+ clearMeasurementCache();
293
+ expect(widths(buildDocument({ markdown: CARRIED }, cfg))).toBe(carried);
294
+ clearMeasurementCache();
295
+ expect(widths(buildDocument({ markdown: ALONE }, cfg))).toBe(apart);
296
+ expect(mixed()).toEqual([]);
297
+ });
298
+ it('shaped in their host\'s language: the second depends on the first, as it did', () => {
299
+ const cfg = config('Reads', 'host', { scriptContext: false });
300
+ const apart = alone(ALONE, cfg);
301
+ for (const ctx of contexts)
302
+ ctx.kept.clear();
303
+ clearMeasurementCache();
304
+ buildDocument({ markdown: CARRIED }, cfg);
305
+ clearMeasurementCache();
306
+ expect(widths(buildDocument({ markdown: ALONE }, cfg))).not.toBe(apart);
307
+ });
308
+ it('with the script of a word with no letter decided by the layout (the default), no context takes a word in two shapes', () => {
309
+ const cfg = config('Reads', 'document');
310
+ const carried = alone(CARRIED, cfg);
311
+ const apart = alone(ALONE, cfg);
312
+ clearMeasurementCache();
313
+ expect(widths(buildDocument({ markdown: CARRIED }, cfg))).toBe(carried);
314
+ clearMeasurementCache();
315
+ expect(widths(buildDocument({ markdown: ALONE }, cfg))).toBe(apart);
316
+ expect(mixed()).toEqual([]);
317
+ });
318
+ });
319
+ describe('the plain-paragraph library\'s segments (#770)', () => {
320
+ // A paragraph with no formatting, every word with a letter: the text
321
+ // library breaks it and measures its segments itself.
322
+ const PLAIN_TEXT = `He wrote "${HAN}" twice, then "no" and "yes" (as said) at the end.`;
323
+ it('are measured by the engine\'s contexts in a document shaped in its own language', () => {
324
+ setMeasureLanguage('en');
325
+ const block = measureBlock(PLAIN_TEXT, PLAIN, 400, 14, { textAlign: 'left' });
326
+ expect(block.lines.length).toBeGreaterThan(0);
327
+ expect(pretextLanguageState()).toBe('followed');
328
+ // Whatever the library measured went to a context that takes one kind
329
+ // of string: none took both.
330
+ expect(mixed()).toEqual([]);
331
+ const measured = contexts.filter((ctx) => (ctx.kinds.get('en')?.size ?? 0) > 0);
332
+ expect(measured.length).toBeGreaterThan(0);
333
+ expect(measured.length).toBeLessThanOrEqual(2);
334
+ });
335
+ it('and by the library\'s own context in the host\'s language, as before', () => {
336
+ setMeasureLanguage('en');
337
+ measureBlock(PLAIN_TEXT, PLAIN, 400, 14, { textAlign: 'left' });
338
+ const count = () => contexts.reduce((sum, ctx) => sum + ctx.measures, 0);
339
+ const own = contexts.map((ctx) => ctx.measures);
340
+ setMeasureLanguage(undefined);
341
+ clearMeasurementCache();
342
+ const before = count();
343
+ measureBlock(`${PLAIN_TEXT} Again and again.`, PLAIN, 400, 14, { textAlign: 'left' });
344
+ expect(count()).toBeGreaterThan(before);
345
+ // The contexts of the language measured in took none of it.
346
+ contexts.forEach((ctx, i) => {
347
+ if ((ctx.kinds.get('en')?.size ?? 0) > 0 && !ctx.kinds.has('inherit'))
348
+ expect(ctx.measures).toBe(own[i]);
349
+ });
350
+ });
351
+ });
352
+ //# sourceMappingURL=wordCacheOrder.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wordCacheOrder.test.js","sourceRoot":"","sources":["../../src/__tests__/wordCacheOrder.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=wordPieces.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wordPieces.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/wordPieces.test.ts"],"names":[],"mappings":""}