postext 1.25.4 → 1.26.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 (214) hide show
  1. package/dist/__tests__/cjk/headingNumberMark.test.d.ts +2 -0
  2. package/dist/__tests__/cjk/headingNumberMark.test.d.ts.map +1 -0
  3. package/dist/__tests__/cjk/headingNumberMark.test.js +108 -0
  4. package/dist/__tests__/cjk/headingNumberMark.test.js.map +1 -0
  5. package/dist/__tests__/cjk/japaneseDash.test.d.ts +2 -0
  6. package/dist/__tests__/cjk/japaneseDash.test.d.ts.map +1 -0
  7. package/dist/__tests__/cjk/japaneseDash.test.js +250 -0
  8. package/dist/__tests__/cjk/japaneseDash.test.js.map +1 -0
  9. package/dist/__tests__/cjk/japaneseSpacing.test.js +1 -1
  10. package/dist/__tests__/cjk/punctuation.test.js +5 -3
  11. package/dist/__tests__/cjk/punctuation.test.js.map +1 -1
  12. package/dist/__tests__/columnRuleBands.test.js +47 -0
  13. package/dist/__tests__/columnRuleBands.test.js.map +1 -1
  14. package/dist/__tests__/comics/canvas.test.js +38 -1
  15. package/dist/__tests__/comics/canvas.test.js.map +1 -1
  16. package/dist/__tests__/comics/html.test.js +16 -3
  17. package/dist/__tests__/comics/html.test.js.map +1 -1
  18. package/dist/__tests__/design/cjkDesignDash.test.js +7 -4
  19. package/dist/__tests__/design/cjkDesignDash.test.js.map +1 -1
  20. package/dist/__tests__/englishApostropheHyphenation.test.d.ts +2 -0
  21. package/dist/__tests__/englishApostropheHyphenation.test.d.ts.map +1 -0
  22. package/dist/__tests__/englishApostropheHyphenation.test.js +47 -0
  23. package/dist/__tests__/englishApostropheHyphenation.test.js.map +1 -0
  24. package/dist/__tests__/exports.test.js +1 -0
  25. package/dist/__tests__/exports.test.js.map +1 -1
  26. package/dist/__tests__/leaderMinRepeats.test.d.ts +2 -0
  27. package/dist/__tests__/leaderMinRepeats.test.d.ts.map +1 -0
  28. package/dist/__tests__/leaderMinRepeats.test.js +109 -0
  29. package/dist/__tests__/leaderMinRepeats.test.js.map +1 -0
  30. package/dist/__tests__/pipeline/footnoteRuntTracking.test.d.ts +2 -0
  31. package/dist/__tests__/pipeline/footnoteRuntTracking.test.d.ts.map +1 -0
  32. package/dist/__tests__/pipeline/footnoteRuntTracking.test.js +90 -0
  33. package/dist/__tests__/pipeline/footnoteRuntTracking.test.js.map +1 -0
  34. package/dist/__tests__/pipeline/orderedNumberAlign.test.d.ts +2 -0
  35. package/dist/__tests__/pipeline/orderedNumberAlign.test.d.ts.map +1 -0
  36. package/dist/__tests__/pipeline/orderedNumberAlign.test.js +108 -0
  37. package/dist/__tests__/pipeline/orderedNumberAlign.test.js.map +1 -0
  38. package/dist/__tests__/pipeline/trailingCapColumnNote.test.d.ts +2 -0
  39. package/dist/__tests__/pipeline/trailingCapColumnNote.test.d.ts.map +1 -0
  40. package/dist/__tests__/pipeline/trailingCapColumnNote.test.js +63 -0
  41. package/dist/__tests__/pipeline/trailingCapColumnNote.test.js.map +1 -0
  42. package/dist/__tests__/pipeline/trailingCapFloatHead.test.d.ts +2 -0
  43. package/dist/__tests__/pipeline/trailingCapFloatHead.test.d.ts.map +1 -0
  44. package/dist/__tests__/pipeline/trailingCapFloatHead.test.js +91 -0
  45. package/dist/__tests__/pipeline/trailingCapFloatHead.test.js.map +1 -0
  46. package/dist/__tests__/rtl/arabicLeadingNumbers.test.d.ts +2 -0
  47. package/dist/__tests__/rtl/arabicLeadingNumbers.test.d.ts.map +1 -0
  48. package/dist/__tests__/rtl/arabicLeadingNumbers.test.js +186 -0
  49. package/dist/__tests__/rtl/arabicLeadingNumbers.test.js.map +1 -0
  50. package/dist/__tests__/rtl/listMarkerDirection.test.d.ts +2 -0
  51. package/dist/__tests__/rtl/listMarkerDirection.test.d.ts.map +1 -0
  52. package/dist/__tests__/rtl/listMarkerDirection.test.js +197 -0
  53. package/dist/__tests__/rtl/listMarkerDirection.test.js.map +1 -0
  54. package/dist/__tests__/trackedLigatures.test.d.ts +2 -0
  55. package/dist/__tests__/trackedLigatures.test.d.ts.map +1 -0
  56. package/dist/__tests__/trackedLigatures.test.js +230 -0
  57. package/dist/__tests__/trackedLigatures.test.js.map +1 -0
  58. package/dist/__tests__/vectorRasterScale.test.d.ts +2 -0
  59. package/dist/__tests__/vectorRasterScale.test.d.ts.map +1 -0
  60. package/dist/__tests__/vectorRasterScale.test.js +304 -0
  61. package/dist/__tests__/vectorRasterScale.test.js.map +1 -0
  62. package/dist/bidi.d.ts +43 -3
  63. package/dist/bidi.d.ts.map +1 -1
  64. package/dist/bidi.js +29 -7
  65. package/dist/bidi.js.map +1 -1
  66. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  67. package/dist/canvas-backend/blockRender.js +43 -5
  68. package/dist/canvas-backend/blockRender.js.map +1 -1
  69. package/dist/canvas-backend/comic.d.ts +8 -4
  70. package/dist/canvas-backend/comic.d.ts.map +1 -1
  71. package/dist/canvas-backend/comic.js +13 -6
  72. package/dist/canvas-backend/comic.js.map +1 -1
  73. package/dist/canvas-backend/deviceScale.d.ts +31 -0
  74. package/dist/canvas-backend/deviceScale.d.ts.map +1 -0
  75. package/dist/canvas-backend/deviceScale.js +45 -0
  76. package/dist/canvas-backend/deviceScale.js.map +1 -0
  77. package/dist/canvas-backend/index.d.ts +5 -1
  78. package/dist/canvas-backend/index.d.ts.map +1 -1
  79. package/dist/canvas-backend/index.js.map +1 -1
  80. package/dist/canvas-backend/renderResourceBlock.d.ts +5 -3
  81. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  82. package/dist/canvas-backend/renderResourceBlock.js +39 -6
  83. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  84. package/dist/canvas-backend/trackedText.d.ts +55 -0
  85. package/dist/canvas-backend/trackedText.d.ts.map +1 -0
  86. package/dist/canvas-backend/trackedText.js +145 -0
  87. package/dist/canvas-backend/trackedText.js.map +1 -0
  88. package/dist/canvas-backend/wordRuns.d.ts +4 -0
  89. package/dist/canvas-backend/wordRuns.d.ts.map +1 -1
  90. package/dist/canvas-backend/wordRuns.js +9 -1
  91. package/dist/canvas-backend/wordRuns.js.map +1 -1
  92. package/dist/columnRule.d.ts +2 -1
  93. package/dist/columnRule.d.ts.map +1 -1
  94. package/dist/columnRule.js +11 -3
  95. package/dist/columnRule.js.map +1 -1
  96. package/dist/comics/layoutPage.d.ts.map +1 -1
  97. package/dist/comics/layoutPage.js +54 -2
  98. package/dist/comics/layoutPage.js.map +1 -1
  99. package/dist/comics/lettering/__tests__/ellipsisFace.test.d.ts +2 -0
  100. package/dist/comics/lettering/__tests__/ellipsisFace.test.d.ts.map +1 -0
  101. package/dist/comics/lettering/__tests__/ellipsisFace.test.js +54 -0
  102. package/dist/comics/lettering/__tests__/ellipsisFace.test.js.map +1 -0
  103. package/dist/comics/lettering/__tests__/polish.test.js +8 -0
  104. package/dist/comics/lettering/__tests__/polish.test.js.map +1 -1
  105. package/dist/comics/lettering/__tests__/round4.test.d.ts +2 -0
  106. package/dist/comics/lettering/__tests__/round4.test.d.ts.map +1 -0
  107. package/dist/comics/lettering/__tests__/round4.test.js +212 -0
  108. package/dist/comics/lettering/__tests__/round4.test.js.map +1 -0
  109. package/dist/comics/lettering/letter.js +2 -2
  110. package/dist/comics/lettering/letter.js.map +1 -1
  111. package/dist/comics/lettering/placement.d.ts +10 -3
  112. package/dist/comics/lettering/placement.d.ts.map +1 -1
  113. package/dist/comics/lettering/placement.js +162 -22
  114. package/dist/comics/lettering/placement.js.map +1 -1
  115. package/dist/comics/lettering/text.d.ts.map +1 -1
  116. package/dist/comics/lettering/text.js +25 -3
  117. package/dist/comics/lettering/text.js.map +1 -1
  118. package/dist/comics/lettering/types.d.ts +29 -2
  119. package/dist/comics/lettering/types.d.ts.map +1 -1
  120. package/dist/defaults/orderedLists.d.ts +1 -0
  121. package/dist/defaults/orderedLists.d.ts.map +1 -1
  122. package/dist/defaults/orderedLists.js +7 -0
  123. package/dist/defaults/orderedLists.js.map +1 -1
  124. package/dist/design/bidiText.d.ts +5 -2
  125. package/dist/design/bidiText.d.ts.map +1 -1
  126. package/dist/design/bidiText.js +7 -4
  127. package/dist/design/bidiText.js.map +1 -1
  128. package/dist/design/layout.d.ts +5 -0
  129. package/dist/design/layout.d.ts.map +1 -1
  130. package/dist/design/layout.js +1 -1
  131. package/dist/design/layout.js.map +1 -1
  132. package/dist/html-backend.d.ts.map +1 -1
  133. package/dist/html-backend.js +32 -6
  134. package/dist/html-backend.js.map +1 -1
  135. package/dist/htmlComic.d.ts +2 -1
  136. package/dist/htmlComic.d.ts.map +1 -1
  137. package/dist/htmlComic.js +14 -1
  138. package/dist/htmlComic.js.map +1 -1
  139. package/dist/hyphenate.d.ts.map +1 -1
  140. package/dist/hyphenate.js +52 -0
  141. package/dist/hyphenate.js.map +1 -1
  142. package/dist/index.d.ts +3 -3
  143. package/dist/index.d.ts.map +1 -1
  144. package/dist/index.js +1 -1
  145. package/dist/index.js.map +1 -1
  146. package/dist/math/rasterCache.d.ts +7 -1
  147. package/dist/math/rasterCache.d.ts.map +1 -1
  148. package/dist/math/rasterCache.js +23 -11
  149. package/dist/math/rasterCache.js.map +1 -1
  150. package/dist/measure/bidiLines.d.ts +8 -0
  151. package/dist/measure/bidiLines.d.ts.map +1 -1
  152. package/dist/measure/bidiLines.js +13 -0
  153. package/dist/measure/bidiLines.js.map +1 -1
  154. package/dist/measure/cache.d.ts.map +1 -1
  155. package/dist/measure/cache.js +5 -3
  156. package/dist/measure/cache.js.map +1 -1
  157. package/dist/measure/cjkCompose.d.ts +10 -0
  158. package/dist/measure/cjkCompose.d.ts.map +1 -1
  159. package/dist/measure/cjkCompose.js +95 -19
  160. package/dist/measure/cjkCompose.js.map +1 -1
  161. package/dist/measure/cjkPunctuation.d.ts +10 -0
  162. package/dist/measure/cjkPunctuation.d.ts.map +1 -1
  163. package/dist/measure/cjkPunctuation.js +18 -1
  164. package/dist/measure/cjkPunctuation.js.map +1 -1
  165. package/dist/measure/hardBreaks.d.ts.map +1 -1
  166. package/dist/measure/hardBreaks.js +4 -1
  167. package/dist/measure/hardBreaks.js.map +1 -1
  168. package/dist/measure/leader.d.ts +6 -1
  169. package/dist/measure/leader.d.ts.map +1 -1
  170. package/dist/measure/leader.js +8 -3
  171. package/dist/measure/leader.js.map +1 -1
  172. package/dist/measure/plain.d.ts.map +1 -1
  173. package/dist/measure/plain.js +4 -2
  174. package/dist/measure/plain.js.map +1 -1
  175. package/dist/measure/rich.d.ts.map +1 -1
  176. package/dist/measure/rich.js +7 -4
  177. package/dist/measure/rich.js.map +1 -1
  178. package/dist/measure/types.d.ts +7 -0
  179. package/dist/measure/types.d.ts.map +1 -1
  180. package/dist/measure/types.js.map +1 -1
  181. package/dist/pipeline/build.d.ts.map +1 -1
  182. package/dist/pipeline/build.js +38 -5
  183. package/dist/pipeline/build.js.map +1 -1
  184. package/dist/pipeline/buildBlockKind.d.ts +5 -0
  185. package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
  186. package/dist/pipeline/buildBlockKind.js +1 -0
  187. package/dist/pipeline/buildBlockKind.js.map +1 -1
  188. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  189. package/dist/pipeline/calloutLayout.js +8 -4
  190. package/dist/pipeline/calloutLayout.js.map +1 -1
  191. package/dist/pipeline/citations.d.ts.map +1 -1
  192. package/dist/pipeline/citations.js +52 -6
  193. package/dist/pipeline/citations.js.map +1 -1
  194. package/dist/pipeline/config.d.ts +6 -0
  195. package/dist/pipeline/config.d.ts.map +1 -1
  196. package/dist/pipeline/config.js +12 -1
  197. package/dist/pipeline/config.js.map +1 -1
  198. package/dist/pipeline/headerFooter.d.ts +2 -0
  199. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  200. package/dist/pipeline/headerFooter.js +3 -1
  201. package/dist/pipeline/headerFooter.js.map +1 -1
  202. package/dist/pipeline/lists.d.ts +8 -0
  203. package/dist/pipeline/lists.d.ts.map +1 -1
  204. package/dist/pipeline/lists.js +18 -1
  205. package/dist/pipeline/lists.js.map +1 -1
  206. package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
  207. package/dist/pipeline/measureContentBlock.js +3 -0
  208. package/dist/pipeline/measureContentBlock.js.map +1 -1
  209. package/dist/types.d.ts +13 -0
  210. package/dist/types.d.ts.map +1 -1
  211. package/dist/vdt.d.ts +9 -0
  212. package/dist/vdt.d.ts.map +1 -1
  213. package/dist/vdt.js.map +1 -1
  214. package/package.json +1 -1
@@ -9,6 +9,7 @@ import { lineInkExtent, lineTrailingTracking } from './lineInk';
9
9
  import { CHARACTER_GRID_COLOR, cjkGridCells } from './pipeline/cjkGrid';
10
10
  import { isJapaneseLanguage, renderLangOf } from './locale';
11
11
  import { hasCJK } from './measure/cjk';
12
+ import { markerRuns } from './bidi';
12
13
  import { joiningScriptIn } from './measure/joining';
13
14
  import { DEFAULT_CENTRAL_BASELINE, verticalFlowOf } from './vdt';
14
15
  import { holdsTurnedMark, segmentOrientation, verticalRuns } from './writingMode';
@@ -42,6 +43,15 @@ const CJK_FEATURES_DECL = "font-feature-settings:'chws' 0,'halt' 0,'vchw' 0;";
42
43
  * Serif SC's full-width dash), which the scale was not computed for. */
43
44
  const DASH_FEATURES_DECL = "font-feature-settings:'chws' 0,'halt' 0,'vchw' 0,'locl' 0;";
44
45
  const inkScaleDecl = (scale) => `transform:scaleX(${scale.toFixed(4)});transform-origin:0 0;${DASH_FEATURES_DECL}`;
46
+ /** The ligatures of a tracked line (#663). A tracked word was measured at
47
+ * its natural width, ligatures counted, plus its tracking; under a
48
+ * `letter-spacing` other than zero browsers turn the common ligatures off
49
+ * and the word comes out wider than its place (fi in Newsreader: 4.5 px at
50
+ * 40 px). Asked for as features they stay (`font-variant-ligatures` does
51
+ * not bring them back). After the `font` shorthand, which resets them: on
52
+ * the line's box and on each run in another face. A box that takes
53
+ * {@link CJK_TEXT_DECL} after it keeps that one. */
54
+ const TRACKED_LIGATURES_DECL = "font-feature-settings:'liga' 1,'clig' 1;";
45
55
  /** Whether a line box carries {@link CJK_TEXT_DECL}: a line of the CJK
46
56
  * composer, which it measured character by character, or a line with no
47
57
  * segments (one span) holding CJK text. A word-by-word line holding CJK
@@ -705,7 +715,7 @@ end = '') {
705
715
  const paintText = (seg, at, inLink = false) => {
706
716
  const font = quoteFontString(pickSegmentFont(seg, block));
707
717
  const color = pickSegmentColor(seg, block);
708
- const fontDecl = font !== quoteFontString(block.fontString) ? `font:${font};` : '';
718
+ const fontDecl = font !== quoteFontString(block.fontString) ? `font:${font};${tracking !== 0 ? TRACKED_LIGATURES_DECL : ''}` : '';
709
719
  const colorDecl = color !== block.color ? `color:${color};` : '';
710
720
  const top = seg.baselineShift ? `${seg.baselineShift.toFixed(3)}px` : '0';
711
721
  return renderWordTextSegment(inLink ? { ...seg, refResourceId: undefined } : seg, at, top, fontDecl, colorDecl, color, cjk && hasCJK(seg.text), segmentBox(seg, rootDir, rootLang, tracking, font, color, (probe) => ({ font: quoteFontString(pickSegmentFont(probe, block)), color: pickSegmentColor(probe, block) })));
@@ -996,6 +1006,15 @@ rootDir = 'ltr') {
996
1006
  }
997
1007
  return parts.join('');
998
1008
  }
1009
+ /** Whether a marker's order differs when its leading European digits read
1010
+ * as Arabic numbers (`BidiOptions.arabicNumbers`, #665). */
1011
+ function arabicMarkNeeded(text) {
1012
+ if (!/[0-9]/.test(text))
1013
+ return false;
1014
+ const plain = markerRuns(text, 'rtl');
1015
+ const arabic = markerRuns(text, 'rtl-arabic');
1016
+ return plain.length !== arabic.length || plain.some((r, i) => r.text !== arabic[i].text);
1017
+ }
999
1018
  function renderBullet(block, rootDir = 'ltr') {
1000
1019
  if (block.type !== 'listItem' ||
1001
1020
  !block.bulletText ||
@@ -1023,6 +1042,13 @@ function renderBullet(block, rootDir = 'ltr') {
1023
1042
  // A marker reads in its item's direction: `١.` with its full stop on the
1024
1043
  // left in an Arabic list (#379).
1025
1044
  const markerDir = dirAttr(block.direction ?? rootDir, rootDir);
1045
+ // In an Arabic-script document European digits that open the marker read
1046
+ // as Arabic numbers (`bulletDirection: 'rtl-arabic'`, #665): `3-1`, a
1047
+ // contents number, with the 3 on the right. The browser resolves the
1048
+ // marker's order itself, so where that reading changes it the text takes
1049
+ // an Arabic letter mark (U+061C) before it, which rule W2 reads as the
1050
+ // letter the number follows.
1051
+ const markerText = (text) => (block.bulletDirection === 'rtl-arabic' && arabicMarkNeeded(text) ? '؜' : '') + esc(text);
1026
1052
  const markerDiv = (cls, x, font, color, text) => `<div class="${cls}" aria-hidden="true"${markerDir} style="` +
1027
1053
  `position:absolute;` +
1028
1054
  `left:${x}px;` +
@@ -1033,8 +1059,8 @@ function renderBullet(block, rootDir = 'ltr') {
1033
1059
  `white-space:pre;` +
1034
1060
  (hasCJK(text) ? CJK_TEXT_DECL : '') +
1035
1061
  (onBaseline
1036
- ? `"><span style="font:${font};${hasCJK(text) ? CJK_FEATURES_DECL : ''}line-height:0;">${esc(text)}</span></div>`
1037
- : `">${esc(text)}</div>`);
1062
+ ? `"><span style="font:${font};${hasCJK(text) ? CJK_FEATURES_DECL : ''}line-height:0;">${markerText(text)}</span></div>`
1063
+ : `">${markerText(text)}</div>`);
1038
1064
  let html = markerDiv('pt-bullet', block.bulletOffsetX, bulletFont, bulletColor, block.bulletText);
1039
1065
  // Ordered-list separator styled apart from the number (own font/colour).
1040
1066
  if (block.separatorText && block.separatorX !== undefined) {
@@ -1061,7 +1087,7 @@ lead = '') {
1061
1087
  // line's own (justification): measured into the segment widths, so the
1062
1088
  // glyphs must spread the same way.
1063
1089
  const tracking = (block.letterSpacing ?? 0) + (line.letterSpacing ?? 0);
1064
- const trackingDecl = tracking !== 0 ? `letter-spacing:${tracking}px;` : '';
1090
+ const trackingDecl = tracking !== 0 ? `letter-spacing:${tracking}px;${TRACKED_LIGATURES_DECL}` : '';
1065
1091
  return (`<div class="pt-line" data-block="${esc(block.id)}" style="` +
1066
1092
  `position:absolute;` +
1067
1093
  `left:${line.bbox.x}px;` +
@@ -1450,7 +1476,7 @@ end = '') {
1450
1476
  const paintText = (seg, at, inLink = false) => {
1451
1477
  const font = quoteFontString(pickResourceFont(seg, fonts));
1452
1478
  const segColor = segColorOf(seg);
1453
- const fontDecl = font !== baseFont ? `font:${font};` : '';
1479
+ const fontDecl = font !== baseFont ? `font:${font};${tracking !== 0 ? TRACKED_LIGATURES_DECL : ''}` : '';
1454
1480
  const colorDecl = segColor !== color ? `color:${segColor};` : '';
1455
1481
  const top = seg.baselineShift ? `${seg.baselineShift.toFixed(3)}px` : '0';
1456
1482
  // Its direction, untracked joining letters and styled runs (#379).
@@ -1535,7 +1561,7 @@ end = '') {
1535
1561
  `color:${color};` +
1536
1562
  // A tracked line (a table header set with `headerLetterSpacing`) was
1537
1563
  // measured with the tracking in its widths.
1538
- (line.letterSpacing ? `letter-spacing:${line.letterSpacing}px;` : '') +
1564
+ (line.letterSpacing ? `letter-spacing:${line.letterSpacing}px;${TRACKED_LIGATURES_DECL}` : '') +
1539
1565
  (lineDecl ? CJK_TEXT_DECL : '') +
1540
1566
  `">${parts.join('')}</div>`);
1541
1567
  }