postext 1.14.0 → 1.15.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 (489) hide show
  1. package/dist/__tests__/arabic/blockLanguageDigits.test.d.ts +2 -0
  2. package/dist/__tests__/arabic/blockLanguageDigits.test.d.ts.map +1 -0
  3. package/dist/__tests__/arabic/blockLanguageDigits.test.js +54 -0
  4. package/dist/__tests__/arabic/blockLanguageDigits.test.js.map +1 -0
  5. package/dist/__tests__/arabic/emphasis.test.d.ts +2 -0
  6. package/dist/__tests__/arabic/emphasis.test.d.ts.map +1 -0
  7. package/dist/__tests__/arabic/emphasis.test.js +206 -0
  8. package/dist/__tests__/arabic/emphasis.test.js.map +1 -0
  9. package/dist/__tests__/arabic/footnotes.test.d.ts +2 -0
  10. package/dist/__tests__/arabic/footnotes.test.d.ts.map +1 -0
  11. package/dist/__tests__/arabic/footnotes.test.js +118 -0
  12. package/dist/__tests__/arabic/footnotes.test.js.map +1 -0
  13. package/dist/__tests__/arabic/harakat.test.d.ts +2 -0
  14. package/dist/__tests__/arabic/harakat.test.d.ts.map +1 -0
  15. package/dist/__tests__/arabic/harakat.test.js +167 -0
  16. package/dist/__tests__/arabic/harakat.test.js.map +1 -0
  17. package/dist/__tests__/arabic/ornateBrackets.test.d.ts +2 -0
  18. package/dist/__tests__/arabic/ornateBrackets.test.d.ts.map +1 -0
  19. package/dist/__tests__/arabic/ornateBrackets.test.js +71 -0
  20. package/dist/__tests__/arabic/ornateBrackets.test.js.map +1 -0
  21. package/dist/__tests__/arabic/tashkil.test.d.ts +2 -0
  22. package/dist/__tests__/arabic/tashkil.test.d.ts.map +1 -0
  23. package/dist/__tests__/arabic/tashkil.test.js +106 -0
  24. package/dist/__tests__/arabic/tashkil.test.js.map +1 -0
  25. package/dist/__tests__/arabicLocale.test.d.ts +2 -0
  26. package/dist/__tests__/arabicLocale.test.d.ts.map +1 -0
  27. package/dist/__tests__/arabicLocale.test.js +232 -0
  28. package/dist/__tests__/arabicLocale.test.js.map +1 -0
  29. package/dist/__tests__/arabicNumberWords.test.d.ts +2 -0
  30. package/dist/__tests__/arabicNumberWords.test.d.ts.map +1 -0
  31. package/dist/__tests__/arabicNumberWords.test.js +176 -0
  32. package/dist/__tests__/arabicNumberWords.test.js.map +1 -0
  33. package/dist/__tests__/arabicNumbering.test.d.ts +2 -0
  34. package/dist/__tests__/arabicNumbering.test.d.ts.map +1 -0
  35. package/dist/__tests__/arabicNumbering.test.js +257 -0
  36. package/dist/__tests__/arabicNumbering.test.js.map +1 -0
  37. package/dist/__tests__/arabicWords.test.d.ts +2 -0
  38. package/dist/__tests__/arabicWords.test.d.ts.map +1 -0
  39. package/dist/__tests__/arabicWords.test.js +302 -0
  40. package/dist/__tests__/arabicWords.test.js.map +1 -0
  41. package/dist/__tests__/bidi.test.d.ts +2 -0
  42. package/dist/__tests__/bidi.test.d.ts.map +1 -0
  43. package/dist/__tests__/bidi.test.js +282 -0
  44. package/dist/__tests__/bidi.test.js.map +1 -0
  45. package/dist/__tests__/blockHints.test.d.ts +2 -0
  46. package/dist/__tests__/blockHints.test.d.ts.map +1 -0
  47. package/dist/__tests__/blockHints.test.js +79 -0
  48. package/dist/__tests__/blockHints.test.js.map +1 -0
  49. package/dist/__tests__/chineseLocale.test.js +2 -2
  50. package/dist/__tests__/chineseLocale.test.js.map +1 -1
  51. package/dist/__tests__/cjk/grid.test.js +2 -2
  52. package/dist/__tests__/cjk/grid.test.js.map +1 -1
  53. package/dist/__tests__/cjk/justifyRender.test.js +2 -1
  54. package/dist/__tests__/cjk/justifyRender.test.js.map +1 -1
  55. package/dist/__tests__/defaults/folio.test.js +16 -1
  56. package/dist/__tests__/defaults/folio.test.js.map +1 -1
  57. package/dist/__tests__/direction.test.d.ts +2 -0
  58. package/dist/__tests__/direction.test.d.ts.map +1 -0
  59. package/dist/__tests__/direction.test.js +117 -0
  60. package/dist/__tests__/direction.test.js.map +1 -0
  61. package/dist/__tests__/exports.test.js +29 -0
  62. package/dist/__tests__/exports.test.js.map +1 -1
  63. package/dist/__tests__/headingLetterSpacing.test.js +1 -1
  64. package/dist/__tests__/headingLetterSpacing.test.js.map +1 -1
  65. package/dist/__tests__/headingNumberPosition.test.d.ts +2 -0
  66. package/dist/__tests__/headingNumberPosition.test.d.ts.map +1 -0
  67. package/dist/__tests__/headingNumberPosition.test.js +87 -0
  68. package/dist/__tests__/headingNumberPosition.test.js.map +1 -0
  69. package/dist/__tests__/htmlCopyText.test.d.ts +2 -0
  70. package/dist/__tests__/htmlCopyText.test.d.ts.map +1 -0
  71. package/dist/__tests__/htmlCopyText.test.js +153 -0
  72. package/dist/__tests__/htmlCopyText.test.js.map +1 -0
  73. package/dist/__tests__/kashida.test.d.ts +2 -0
  74. package/dist/__tests__/kashida.test.d.ts.map +1 -0
  75. package/dist/__tests__/kashida.test.js +281 -0
  76. package/dist/__tests__/kashida.test.js.map +1 -0
  77. package/dist/__tests__/kashidaPatterns.test.d.ts +2 -0
  78. package/dist/__tests__/kashidaPatterns.test.d.ts.map +1 -0
  79. package/dist/__tests__/kashidaPatterns.test.js +143 -0
  80. package/dist/__tests__/kashidaPatterns.test.js.map +1 -0
  81. package/dist/__tests__/links.test.js +3 -1
  82. package/dist/__tests__/links.test.js.map +1 -1
  83. package/dist/__tests__/parse/containers.test.js +1 -1
  84. package/dist/__tests__/parse/containers.test.js.map +1 -1
  85. package/dist/__tests__/rtl/designText.test.d.ts +2 -0
  86. package/dist/__tests__/rtl/designText.test.d.ts.map +1 -0
  87. package/dist/__tests__/rtl/designText.test.js +301 -0
  88. package/dist/__tests__/rtl/designText.test.js.map +1 -0
  89. package/dist/__tests__/rtl/designTextPaint.test.d.ts +2 -0
  90. package/dist/__tests__/rtl/designTextPaint.test.d.ts.map +1 -0
  91. package/dist/__tests__/rtl/designTextPaint.test.js +140 -0
  92. package/dist/__tests__/rtl/designTextPaint.test.js.map +1 -0
  93. package/dist/__tests__/rtl/htmlRtl.test.d.ts +2 -0
  94. package/dist/__tests__/rtl/htmlRtl.test.d.ts.map +1 -0
  95. package/dist/__tests__/rtl/htmlRtl.test.js +175 -0
  96. package/dist/__tests__/rtl/htmlRtl.test.js.map +1 -0
  97. package/dist/__tests__/rtl/mirroredFrame.test.d.ts +2 -0
  98. package/dist/__tests__/rtl/mirroredFrame.test.d.ts.map +1 -0
  99. package/dist/__tests__/rtl/mirroredFrame.test.js +313 -0
  100. package/dist/__tests__/rtl/mirroredFrame.test.js.map +1 -0
  101. package/dist/__tests__/rtl/mirroredPaint.test.d.ts +2 -0
  102. package/dist/__tests__/rtl/mirroredPaint.test.d.ts.map +1 -0
  103. package/dist/__tests__/rtl/mirroredPaint.test.js +116 -0
  104. package/dist/__tests__/rtl/mirroredPaint.test.js.map +1 -0
  105. package/dist/__tests__/rtl/oppositeBlocks.test.d.ts +2 -0
  106. package/dist/__tests__/rtl/oppositeBlocks.test.d.ts.map +1 -0
  107. package/dist/__tests__/rtl/oppositeBlocks.test.js +273 -0
  108. package/dist/__tests__/rtl/oppositeBlocks.test.js.map +1 -0
  109. package/dist/__tests__/rtl/segmentLang.test.d.ts +2 -0
  110. package/dist/__tests__/rtl/segmentLang.test.d.ts.map +1 -0
  111. package/dist/__tests__/rtl/segmentLang.test.js +54 -0
  112. package/dist/__tests__/rtl/segmentLang.test.js.map +1 -0
  113. package/dist/__tests__/rtlLines.test.d.ts +2 -0
  114. package/dist/__tests__/rtlLines.test.d.ts.map +1 -0
  115. package/dist/__tests__/rtlLines.test.js +180 -0
  116. package/dist/__tests__/rtlLines.test.js.map +1 -0
  117. package/dist/__tests__/tocNumberColumn.test.d.ts +2 -0
  118. package/dist/__tests__/tocNumberColumn.test.d.ts.map +1 -0
  119. package/dist/__tests__/tocNumberColumn.test.js +67 -0
  120. package/dist/__tests__/tocNumberColumn.test.js.map +1 -0
  121. package/dist/__tests__/verse.test.d.ts +2 -0
  122. package/dist/__tests__/verse.test.d.ts.map +1 -0
  123. package/dist/__tests__/verse.test.js +232 -0
  124. package/dist/__tests__/verse.test.js.map +1 -0
  125. package/dist/__tests__/vertical/geometry.test.js +2 -2
  126. package/dist/__tests__/vertical/geometry.test.js.map +1 -1
  127. package/dist/__tests__/vertical/htmlTurnedCells.test.js +2 -2
  128. package/dist/__tests__/vertical/htmlTurnedCells.test.js.map +1 -1
  129. package/dist/arabicMarks.d.ts +80 -0
  130. package/dist/arabicMarks.d.ts.map +1 -0
  131. package/dist/arabicMarks.js +267 -0
  132. package/dist/arabicMarks.js.map +1 -0
  133. package/dist/arabicNumberWords.d.ts +43 -0
  134. package/dist/arabicNumberWords.d.ts.map +1 -0
  135. package/dist/arabicNumberWords.js +163 -0
  136. package/dist/arabicNumberWords.js.map +1 -0
  137. package/dist/arabicNumerals.d.ts +54 -0
  138. package/dist/arabicNumerals.d.ts.map +1 -0
  139. package/dist/arabicNumerals.js +143 -0
  140. package/dist/arabicNumerals.js.map +1 -0
  141. package/dist/bidi.d.ts +186 -0
  142. package/dist/bidi.d.ts.map +1 -0
  143. package/dist/bidi.js +851 -0
  144. package/dist/bidi.js.map +1 -0
  145. package/dist/bidiData.d.ts +13 -0
  146. package/dist/bidiData.d.ts.map +1 -0
  147. package/dist/bidiData.js +318 -0
  148. package/dist/bidiData.js.map +1 -0
  149. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  150. package/dist/canvas-backend/blockRender.js +58 -27
  151. package/dist/canvas-backend/blockRender.js.map +1 -1
  152. package/dist/canvas-backend/chip.d.ts.map +1 -1
  153. package/dist/canvas-backend/chip.js +16 -2
  154. package/dist/canvas-backend/chip.js.map +1 -1
  155. package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
  156. package/dist/canvas-backend/headerFooter.js +7 -3
  157. package/dist/canvas-backend/headerFooter.js.map +1 -1
  158. package/dist/canvas-backend/index.d.ts.map +1 -1
  159. package/dist/canvas-backend/index.js +9 -4
  160. package/dist/canvas-backend/index.js.map +1 -1
  161. package/dist/canvas-backend/mirrorFrame.d.ts +38 -0
  162. package/dist/canvas-backend/mirrorFrame.d.ts.map +1 -0
  163. package/dist/canvas-backend/mirrorFrame.js +129 -0
  164. package/dist/canvas-backend/mirrorFrame.js.map +1 -0
  165. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  166. package/dist/canvas-backend/renderResourceBlock.js +16 -5
  167. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  168. package/dist/canvas-backend/runDirection.d.ts +21 -0
  169. package/dist/canvas-backend/runDirection.d.ts.map +1 -0
  170. package/dist/canvas-backend/runDirection.js +46 -0
  171. package/dist/canvas-backend/runDirection.js.map +1 -0
  172. package/dist/canvas-backend/wordRuns.d.ts +49 -0
  173. package/dist/canvas-backend/wordRuns.d.ts.map +1 -0
  174. package/dist/canvas-backend/wordRuns.js +111 -0
  175. package/dist/canvas-backend/wordRuns.js.map +1 -0
  176. package/dist/columnClip.d.ts +4 -1
  177. package/dist/columnClip.d.ts.map +1 -1
  178. package/dist/columnClip.js +8 -3
  179. package/dist/columnClip.js.map +1 -1
  180. package/dist/configWarnings.d.ts +3 -1
  181. package/dist/configWarnings.d.ts.map +1 -1
  182. package/dist/configWarnings.js +59 -5
  183. package/dist/configWarnings.js.map +1 -1
  184. package/dist/defaults/bodyText.d.ts +28 -6
  185. package/dist/defaults/bodyText.d.ts.map +1 -1
  186. package/dist/defaults/bodyText.js +158 -30
  187. package/dist/defaults/bodyText.js.map +1 -1
  188. package/dist/defaults/calloutStyles.js +1 -1
  189. package/dist/defaults/calloutStyles.js.map +1 -1
  190. package/dist/defaults/captionStyle.js +5 -5
  191. package/dist/defaults/captionStyle.js.map +1 -1
  192. package/dist/defaults/folio.d.ts +4 -0
  193. package/dist/defaults/folio.d.ts.map +1 -1
  194. package/dist/defaults/folio.js +12 -1
  195. package/dist/defaults/folio.js.map +1 -1
  196. package/dist/defaults/footnotes.d.ts.map +1 -1
  197. package/dist/defaults/footnotes.js +12 -2
  198. package/dist/defaults/footnotes.js.map +1 -1
  199. package/dist/defaults/headerFooter.d.ts.map +1 -1
  200. package/dist/defaults/headerFooter.js +1 -0
  201. package/dist/defaults/headerFooter.js.map +1 -1
  202. package/dist/defaults/headingStyles.d.ts.map +1 -1
  203. package/dist/defaults/headingStyles.js +2 -1
  204. package/dist/defaults/headingStyles.js.map +1 -1
  205. package/dist/defaults/headings.d.ts.map +1 -1
  206. package/dist/defaults/headings.js +9 -2
  207. package/dist/defaults/headings.js.map +1 -1
  208. package/dist/defaults/index.d.ts +1 -1
  209. package/dist/defaults/index.d.ts.map +1 -1
  210. package/dist/defaults/index.js +7 -1
  211. package/dist/defaults/index.js.map +1 -1
  212. package/dist/defaults/indexConfig.d.ts +6 -2
  213. package/dist/defaults/indexConfig.d.ts.map +1 -1
  214. package/dist/defaults/indexConfig.js +25 -5
  215. package/dist/defaults/indexConfig.js.map +1 -1
  216. package/dist/defaults/page.d.ts +7 -4
  217. package/dist/defaults/page.d.ts.map +1 -1
  218. package/dist/defaults/page.js +10 -7
  219. package/dist/defaults/page.js.map +1 -1
  220. package/dist/defaults/paragraphStyles.js +2 -2
  221. package/dist/defaults/paragraphStyles.js.map +1 -1
  222. package/dist/defaults/parts.d.ts.map +1 -1
  223. package/dist/defaults/parts.js +2 -1
  224. package/dist/defaults/parts.js.map +1 -1
  225. package/dist/defaults/resourceTypes.d.ts +1 -1
  226. package/dist/defaults/resourceTypes.d.ts.map +1 -1
  227. package/dist/defaults/resourceTypes.js +10 -2
  228. package/dist/defaults/resourceTypes.js.map +1 -1
  229. package/dist/defaults/shared.d.ts +9 -0
  230. package/dist/defaults/shared.d.ts.map +1 -1
  231. package/dist/defaults/shared.js +15 -0
  232. package/dist/defaults/shared.js.map +1 -1
  233. package/dist/defaults/tableStyle.d.ts.map +1 -1
  234. package/dist/defaults/tableStyle.js +5 -1
  235. package/dist/defaults/tableStyle.js.map +1 -1
  236. package/dist/design/bidiText.d.ts +89 -0
  237. package/dist/design/bidiText.d.ts.map +1 -0
  238. package/dist/design/bidiText.js +165 -0
  239. package/dist/design/bidiText.js.map +1 -0
  240. package/dist/design/layout.d.ts +20 -0
  241. package/dist/design/layout.d.ts.map +1 -1
  242. package/dist/design/layout.js +46 -5
  243. package/dist/design/layout.js.map +1 -1
  244. package/dist/design/placeholders.d.ts +7 -1
  245. package/dist/design/placeholders.d.ts.map +1 -1
  246. package/dist/design/placeholders.js +6 -3
  247. package/dist/design/placeholders.js.map +1 -1
  248. package/dist/design/richText.d.ts +5 -2
  249. package/dist/design/richText.d.ts.map +1 -1
  250. package/dist/design/richText.js +35 -2
  251. package/dist/design/richText.js.map +1 -1
  252. package/dist/emphasisOverline.d.ts +27 -0
  253. package/dist/emphasisOverline.d.ts.map +1 -0
  254. package/dist/emphasisOverline.js +107 -0
  255. package/dist/emphasisOverline.js.map +1 -0
  256. package/dist/frontmatter.d.ts +25 -6
  257. package/dist/frontmatter.d.ts.map +1 -1
  258. package/dist/frontmatter.js +51 -10
  259. package/dist/frontmatter.js.map +1 -1
  260. package/dist/html-backend.d.ts +4 -1
  261. package/dist/html-backend.d.ts.map +1 -1
  262. package/dist/html-backend.js +363 -87
  263. package/dist/html-backend.js.map +1 -1
  264. package/dist/hyphenate.d.ts.map +1 -1
  265. package/dist/hyphenate.js +4 -1
  266. package/dist/hyphenate.js.map +1 -1
  267. package/dist/index.d.ts +11 -8
  268. package/dist/index.d.ts.map +1 -1
  269. package/dist/index.js +6 -4
  270. package/dist/index.js.map +1 -1
  271. package/dist/knuthPlass/breakpoints.d.ts.map +1 -1
  272. package/dist/knuthPlass/breakpoints.js +3 -0
  273. package/dist/knuthPlass/breakpoints.js.map +1 -1
  274. package/dist/knuthPlass/pretextAdapter.d.ts.map +1 -1
  275. package/dist/knuthPlass/pretextAdapter.js +9 -3
  276. package/dist/knuthPlass/pretextAdapter.js.map +1 -1
  277. package/dist/knuthPlass/richAdapter.d.ts +11 -0
  278. package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
  279. package/dist/knuthPlass/richAdapter.js +11 -4
  280. package/dist/knuthPlass/richAdapter.js.map +1 -1
  281. package/dist/knuthPlass/tracking.d.ts +2 -1
  282. package/dist/knuthPlass/tracking.d.ts.map +1 -1
  283. package/dist/knuthPlass/tracking.js +5 -2
  284. package/dist/knuthPlass/tracking.js.map +1 -1
  285. package/dist/knuthPlass/types.d.ts +4 -0
  286. package/dist/knuthPlass/types.d.ts.map +1 -1
  287. package/dist/locale.d.ts +63 -9
  288. package/dist/locale.d.ts.map +1 -1
  289. package/dist/locale.js +129 -12
  290. package/dist/locale.js.map +1 -1
  291. package/dist/measure/bidiLines.d.ts +91 -0
  292. package/dist/measure/bidiLines.d.ts.map +1 -0
  293. package/dist/measure/bidiLines.js +293 -0
  294. package/dist/measure/bidiLines.js.map +1 -0
  295. package/dist/measure/cache.d.ts.map +1 -1
  296. package/dist/measure/cache.js +10 -4
  297. package/dist/measure/cache.js.map +1 -1
  298. package/dist/measure/joining.d.ts +39 -0
  299. package/dist/measure/joining.d.ts.map +1 -0
  300. package/dist/measure/joining.js +91 -0
  301. package/dist/measure/joining.js.map +1 -0
  302. package/dist/measure/joiningGroups.d.ts +7 -0
  303. package/dist/measure/joiningGroups.d.ts.map +1 -0
  304. package/dist/measure/joiningGroups.js +110 -0
  305. package/dist/measure/joiningGroups.js.map +1 -0
  306. package/dist/measure/kashida.d.ts +97 -0
  307. package/dist/measure/kashida.d.ts.map +1 -0
  308. package/dist/measure/kashida.js +285 -0
  309. package/dist/measure/kashida.js.map +1 -0
  310. package/dist/measure/kashidaPatterns.d.ts +109 -0
  311. package/dist/measure/kashidaPatterns.d.ts.map +1 -0
  312. package/dist/measure/kashidaPatterns.js +519 -0
  313. package/dist/measure/kashidaPatterns.js.map +1 -0
  314. package/dist/measure/links.d.ts.map +1 -1
  315. package/dist/measure/links.js +5 -2
  316. package/dist/measure/links.js.map +1 -1
  317. package/dist/measure/plain.d.ts.map +1 -1
  318. package/dist/measure/plain.js +31 -0
  319. package/dist/measure/plain.js.map +1 -1
  320. package/dist/measure/rich.d.ts +24 -0
  321. package/dist/measure/rich.d.ts.map +1 -1
  322. package/dist/measure/rich.js +250 -22
  323. package/dist/measure/rich.js.map +1 -1
  324. package/dist/measure/types.d.ts +14 -0
  325. package/dist/measure/types.d.ts.map +1 -1
  326. package/dist/measure/types.js.map +1 -1
  327. package/dist/numberWords.d.ts +17 -4
  328. package/dist/numberWords.d.ts.map +1 -1
  329. package/dist/numberWords.js +19 -13
  330. package/dist/numberWords.js.map +1 -1
  331. package/dist/numbering.d.ts +49 -11
  332. package/dist/numbering.d.ts.map +1 -1
  333. package/dist/numbering.js +117 -21
  334. package/dist/numbering.js.map +1 -1
  335. package/dist/parse/annotations.d.ts +6 -3
  336. package/dist/parse/annotations.d.ts.map +1 -1
  337. package/dist/parse/annotations.js +31 -7
  338. package/dist/parse/annotations.js.map +1 -1
  339. package/dist/parse/attrs.d.ts +3 -3
  340. package/dist/parse/attrs.d.ts.map +1 -1
  341. package/dist/parse/attrs.js +5 -4
  342. package/dist/parse/attrs.js.map +1 -1
  343. package/dist/parse/blockParser.d.ts.map +1 -1
  344. package/dist/parse/blockParser.js +158 -14
  345. package/dist/parse/blockParser.js.map +1 -1
  346. package/dist/parse/index.d.ts +1 -1
  347. package/dist/parse/index.d.ts.map +1 -1
  348. package/dist/parse/index.js.map +1 -1
  349. package/dist/parse/inlineFormatting.d.ts.map +1 -1
  350. package/dist/parse/inlineFormatting.js +5 -4
  351. package/dist/parse/inlineFormatting.js.map +1 -1
  352. package/dist/parse/types.d.ts +63 -1
  353. package/dist/parse/types.d.ts.map +1 -1
  354. package/dist/pipeline/build.d.ts.map +1 -1
  355. package/dist/pipeline/build.js +161 -43
  356. package/dist/pipeline/build.js.map +1 -1
  357. package/dist/pipeline/buildBlockKind.d.ts +2 -0
  358. package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
  359. package/dist/pipeline/buildBlockKind.js +67 -2
  360. package/dist/pipeline/buildBlockKind.js.map +1 -1
  361. package/dist/pipeline/buildHelpers.d.ts +22 -1
  362. package/dist/pipeline/buildHelpers.d.ts.map +1 -1
  363. package/dist/pipeline/buildHelpers.js +55 -5
  364. package/dist/pipeline/buildHelpers.js.map +1 -1
  365. package/dist/pipeline/calloutLayout.d.ts +6 -1
  366. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  367. package/dist/pipeline/calloutLayout.js +63 -18
  368. package/dist/pipeline/calloutLayout.js.map +1 -1
  369. package/dist/pipeline/citations.d.ts +2 -1
  370. package/dist/pipeline/citations.d.ts.map +1 -1
  371. package/dist/pipeline/citations.js +29 -9
  372. package/dist/pipeline/citations.js.map +1 -1
  373. package/dist/pipeline/cjkGrid.d.ts +3 -2
  374. package/dist/pipeline/cjkGrid.d.ts.map +1 -1
  375. package/dist/pipeline/cjkGrid.js +3 -2
  376. package/dist/pipeline/cjkGrid.js.map +1 -1
  377. package/dist/pipeline/config.d.ts +13 -1
  378. package/dist/pipeline/config.d.ts.map +1 -1
  379. package/dist/pipeline/config.js +32 -3
  380. package/dist/pipeline/config.js.map +1 -1
  381. package/dist/pipeline/contentWarnings.d.ts +10 -0
  382. package/dist/pipeline/contentWarnings.d.ts.map +1 -1
  383. package/dist/pipeline/contentWarnings.js +88 -0
  384. package/dist/pipeline/contentWarnings.js.map +1 -1
  385. package/dist/pipeline/continuation.d.ts.map +1 -1
  386. package/dist/pipeline/continuation.js +1 -1
  387. package/dist/pipeline/continuation.js.map +1 -1
  388. package/dist/pipeline/crossRefs.d.ts.map +1 -1
  389. package/dist/pipeline/crossRefs.js +2 -0
  390. package/dist/pipeline/crossRefs.js.map +1 -1
  391. package/dist/pipeline/floatPlacement.d.ts.map +1 -1
  392. package/dist/pipeline/floatPlacement.js +2 -1
  393. package/dist/pipeline/floatPlacement.js.map +1 -1
  394. package/dist/pipeline/footnotes.d.ts +13 -5
  395. package/dist/pipeline/footnotes.d.ts.map +1 -1
  396. package/dist/pipeline/footnotes.js +19 -8
  397. package/dist/pipeline/footnotes.js.map +1 -1
  398. package/dist/pipeline/headerFooter.d.ts +4 -0
  399. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  400. package/dist/pipeline/headerFooter.js +41 -13
  401. package/dist/pipeline/headerFooter.js.map +1 -1
  402. package/dist/pipeline/headingDesignCuts.d.ts +1 -1
  403. package/dist/pipeline/headingDesignCuts.d.ts.map +1 -1
  404. package/dist/pipeline/headingDesignCuts.js +2 -1
  405. package/dist/pipeline/headingDesignCuts.js.map +1 -1
  406. package/dist/pipeline/headingStyles.d.ts +10 -0
  407. package/dist/pipeline/headingStyles.d.ts.map +1 -1
  408. package/dist/pipeline/headingStyles.js +46 -0
  409. package/dist/pipeline/headingStyles.js.map +1 -1
  410. package/dist/pipeline/indexDirective.d.ts.map +1 -1
  411. package/dist/pipeline/indexDirective.js +33 -6
  412. package/dist/pipeline/indexDirective.js.map +1 -1
  413. package/dist/pipeline/indexGroups.d.ts +23 -1
  414. package/dist/pipeline/indexGroups.d.ts.map +1 -1
  415. package/dist/pipeline/indexGroups.js +50 -1
  416. package/dist/pipeline/indexGroups.js.map +1 -1
  417. package/dist/pipeline/lists.d.ts +16 -4
  418. package/dist/pipeline/lists.d.ts.map +1 -1
  419. package/dist/pipeline/lists.js +51 -12
  420. package/dist/pipeline/lists.js.map +1 -1
  421. package/dist/pipeline/measureContentBlock.d.ts +5 -0
  422. package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
  423. package/dist/pipeline/measureContentBlock.js +63 -4
  424. package/dist/pipeline/measureContentBlock.js.map +1 -1
  425. package/dist/pipeline/mirrorFrame.d.ts +37 -0
  426. package/dist/pipeline/mirrorFrame.d.ts.map +1 -0
  427. package/dist/pipeline/mirrorFrame.js +143 -0
  428. package/dist/pipeline/mirrorFrame.js.map +1 -0
  429. package/dist/pipeline/outline.d.ts +2 -2
  430. package/dist/pipeline/outline.d.ts.map +1 -1
  431. package/dist/pipeline/outline.js +33 -6
  432. package/dist/pipeline/outline.js.map +1 -1
  433. package/dist/pipeline/paragraphContainers.d.ts +5 -0
  434. package/dist/pipeline/paragraphContainers.d.ts.map +1 -1
  435. package/dist/pipeline/paragraphContainers.js +12 -0
  436. package/dist/pipeline/paragraphContainers.js.map +1 -1
  437. package/dist/pipeline/parts.d.ts +1 -1
  438. package/dist/pipeline/parts.d.ts.map +1 -1
  439. package/dist/pipeline/parts.js +3 -2
  440. package/dist/pipeline/parts.js.map +1 -1
  441. package/dist/pipeline/placeholders.d.ts +13 -6
  442. package/dist/pipeline/placeholders.d.ts.map +1 -1
  443. package/dist/pipeline/placeholders.js +15 -11
  444. package/dist/pipeline/placeholders.js.map +1 -1
  445. package/dist/pipeline/placement.d.ts +3 -2
  446. package/dist/pipeline/placement.d.ts.map +1 -1
  447. package/dist/pipeline/placement.js +18 -6
  448. package/dist/pipeline/placement.js.map +1 -1
  449. package/dist/pipeline/resourceLayout.d.ts.map +1 -1
  450. package/dist/pipeline/resourceLayout.js +70 -7
  451. package/dist/pipeline/resourceLayout.js.map +1 -1
  452. package/dist/pipeline/resourceNumbering.d.ts +5 -3
  453. package/dist/pipeline/resourceNumbering.d.ts.map +1 -1
  454. package/dist/pipeline/resourceNumbering.js +11 -8
  455. package/dist/pipeline/resourceNumbering.js.map +1 -1
  456. package/dist/pipeline/styles.d.ts +6 -1
  457. package/dist/pipeline/styles.d.ts.map +1 -1
  458. package/dist/pipeline/styles.js +44 -14
  459. package/dist/pipeline/styles.js.map +1 -1
  460. package/dist/pipeline/tashkil.d.ts +27 -0
  461. package/dist/pipeline/tashkil.d.ts.map +1 -0
  462. package/dist/pipeline/tashkil.js +161 -0
  463. package/dist/pipeline/tashkil.js.map +1 -0
  464. package/dist/pipeline/toc.d.ts +12 -0
  465. package/dist/pipeline/toc.d.ts.map +1 -1
  466. package/dist/pipeline/toc.js +64 -4
  467. package/dist/pipeline/toc.js.map +1 -1
  468. package/dist/pipeline/verse.d.ts +65 -0
  469. package/dist/pipeline/verse.d.ts.map +1 -0
  470. package/dist/pipeline/verse.js +252 -0
  471. package/dist/pipeline/verse.js.map +1 -0
  472. package/dist/pipeline/verticalMetrics.d.ts +1 -1
  473. package/dist/pipeline/verticalMetrics.d.ts.map +1 -1
  474. package/dist/pipeline/verticalMetrics.js +7 -5
  475. package/dist/pipeline/verticalMetrics.js.map +1 -1
  476. package/dist/table/model.d.ts +4 -3
  477. package/dist/table/model.d.ts.map +1 -1
  478. package/dist/table/model.js.map +1 -1
  479. package/dist/types.d.ts +286 -36
  480. package/dist/types.d.ts.map +1 -1
  481. package/dist/uprightArabic.d.ts +39 -0
  482. package/dist/uprightArabic.d.ts.map +1 -0
  483. package/dist/uprightArabic.js +105 -0
  484. package/dist/uprightArabic.js.map +1 -0
  485. package/dist/vdt.d.ts +276 -11
  486. package/dist/vdt.d.ts.map +1 -1
  487. package/dist/vdt.js +46 -9
  488. package/dist/vdt.js.map +1 -1
  489. package/package.json +1 -1
@@ -0,0 +1,110 @@
1
+ // Generated by scripts/gen-joining-groups.mjs from the Unicode Character
2
+ // Database (ArabicShaping-18.0.0). Do not edit by hand: re-run the script
3
+ // on a newer UCD instead.
4
+ /** Joining_Group long names, indexed by the values of
5
+ * {@link JOINING_GROUP_RANGES}. */
6
+ export const JOINING_GROUP_NAMES = [
7
+ 'Kashmiri_Yeh',
8
+ 'Alef',
9
+ 'Waw',
10
+ 'Yeh',
11
+ 'Beh',
12
+ 'Teh_Marbuta',
13
+ 'Hah',
14
+ 'Dal',
15
+ 'Reh',
16
+ 'Seen',
17
+ 'Sad',
18
+ 'Tah',
19
+ 'Ain',
20
+ 'Gaf',
21
+ 'Farsi_Yeh',
22
+ 'Feh',
23
+ 'Qaf',
24
+ 'Kaf',
25
+ 'Lam',
26
+ 'Meem',
27
+ 'Noon',
28
+ 'Heh',
29
+ 'Swash_Kaf',
30
+ 'Nya',
31
+ 'Knotted_Heh',
32
+ 'Heh_Goal',
33
+ 'Teh_Marbuta_Goal',
34
+ 'Yeh_With_Tail',
35
+ 'Yeh_Barree',
36
+ 'Alaph',
37
+ 'Beth',
38
+ 'Gamal',
39
+ 'Dalath_Rish',
40
+ 'He',
41
+ 'Syriac_Waw',
42
+ 'Zain',
43
+ 'Heth',
44
+ 'Teth',
45
+ 'Yudh',
46
+ 'Yudh_He',
47
+ 'Kaph',
48
+ 'Lamadh',
49
+ 'Mim',
50
+ 'Nun',
51
+ 'Semkath',
52
+ 'Final_Semkath',
53
+ 'E',
54
+ 'Pe',
55
+ 'Reversed_Pe',
56
+ 'Sadhe',
57
+ 'Qaph',
58
+ 'Shin',
59
+ 'Taw',
60
+ 'Zhain',
61
+ 'Khaph',
62
+ 'Fe',
63
+ 'Burushaski_Yeh_Barree',
64
+ 'Malayalam_Nga',
65
+ 'Malayalam_Ja',
66
+ 'Malayalam_Nya',
67
+ 'Malayalam_Tta',
68
+ 'Malayalam_Nna',
69
+ 'Malayalam_Nnna',
70
+ 'Malayalam_Bha',
71
+ 'Malayalam_Ra',
72
+ 'Malayalam_Lla',
73
+ 'Malayalam_Llla',
74
+ 'Malayalam_Ssa',
75
+ 'Thin_Yeh',
76
+ 'Vertical_Tail',
77
+ 'Rohingya_Yeh',
78
+ 'Straight_Waw',
79
+ 'African_Feh',
80
+ 'African_Qaf',
81
+ 'African_Noon',
82
+ ];
83
+ /** Joining_Group of the Arabic blocks (U+0600–08FF): [first, last, group]
84
+ * for every range with a group, merged, in code point order. */
85
+ export const JOINING_GROUP_RANGES = [
86
+ 0x620, 0x620, 0, 0x622, 0x623, 1, 0x624, 0x624, 2, 0x625, 0x625, 1, 0x626, 0x626, 3, 0x627, 0x627, 1, 0x628, 0x628, 4, 0x629, 0x629, 5,
87
+ 0x62A, 0x62B, 4, 0x62C, 0x62E, 6, 0x62F, 0x630, 7, 0x631, 0x632, 8, 0x633, 0x634, 9, 0x635, 0x636, 10, 0x637, 0x638, 11, 0x639, 0x63A, 12,
88
+ 0x63B, 0x63C, 13, 0x63D, 0x63F, 14, 0x641, 0x641, 15, 0x642, 0x642, 16, 0x643, 0x643, 17, 0x644, 0x644, 18, 0x645, 0x645, 19, 0x646, 0x646, 20,
89
+ 0x647, 0x647, 21, 0x648, 0x648, 2, 0x649, 0x64A, 3, 0x66E, 0x66E, 4, 0x66F, 0x66F, 16, 0x671, 0x673, 1, 0x675, 0x675, 1, 0x676, 0x677, 2,
90
+ 0x678, 0x678, 3, 0x679, 0x680, 4, 0x681, 0x687, 6, 0x688, 0x690, 7, 0x691, 0x699, 8, 0x69A, 0x69C, 9, 0x69D, 0x69E, 10, 0x69F, 0x69F, 11,
91
+ 0x6A0, 0x6A0, 12, 0x6A1, 0x6A6, 15, 0x6A7, 0x6A8, 16, 0x6A9, 0x6A9, 13, 0x6AA, 0x6AA, 22, 0x6AB, 0x6AB, 13, 0x6AC, 0x6AE, 17, 0x6AF, 0x6B4, 13,
92
+ 0x6B5, 0x6B8, 18, 0x6B9, 0x6BC, 20, 0x6BD, 0x6BD, 23, 0x6BE, 0x6BE, 24, 0x6BF, 0x6BF, 6, 0x6C0, 0x6C0, 5, 0x6C1, 0x6C2, 25, 0x6C3, 0x6C3, 26,
93
+ 0x6C4, 0x6CB, 2, 0x6CC, 0x6CC, 14, 0x6CD, 0x6CD, 27, 0x6CE, 0x6CE, 14, 0x6CF, 0x6CF, 2, 0x6D0, 0x6D1, 3, 0x6D2, 0x6D3, 28, 0x6D5, 0x6D5, 5,
94
+ 0x6EE, 0x6EE, 7, 0x6EF, 0x6EF, 8, 0x6FA, 0x6FA, 9, 0x6FB, 0x6FB, 10, 0x6FC, 0x6FC, 12, 0x6FF, 0x6FF, 24, 0x710, 0x710, 29, 0x712, 0x712, 30,
95
+ 0x713, 0x714, 31, 0x715, 0x716, 32, 0x717, 0x717, 33, 0x718, 0x718, 34, 0x719, 0x719, 35, 0x71A, 0x71A, 36, 0x71B, 0x71C, 37, 0x71D, 0x71D, 38,
96
+ 0x71E, 0x71E, 39, 0x71F, 0x71F, 40, 0x720, 0x720, 41, 0x721, 0x721, 42, 0x722, 0x722, 43, 0x723, 0x723, 44, 0x724, 0x724, 45, 0x725, 0x725, 46,
97
+ 0x726, 0x726, 47, 0x727, 0x727, 48, 0x728, 0x728, 49, 0x729, 0x729, 50, 0x72A, 0x72A, 32, 0x72B, 0x72B, 51, 0x72C, 0x72C, 52, 0x72D, 0x72D, 30,
98
+ 0x72E, 0x72E, 31, 0x72F, 0x72F, 32, 0x74D, 0x74D, 53, 0x74E, 0x74E, 54, 0x74F, 0x74F, 55, 0x750, 0x756, 4, 0x757, 0x758, 6, 0x759, 0x75A, 7,
99
+ 0x75B, 0x75B, 8, 0x75C, 0x75C, 9, 0x75D, 0x75F, 12, 0x760, 0x761, 15, 0x762, 0x764, 13, 0x765, 0x766, 19, 0x767, 0x769, 20, 0x76A, 0x76A, 18,
100
+ 0x76B, 0x76C, 8, 0x76D, 0x76D, 9, 0x76E, 0x76F, 6, 0x770, 0x770, 9, 0x771, 0x771, 8, 0x772, 0x772, 6, 0x773, 0x774, 1, 0x775, 0x776, 14,
101
+ 0x777, 0x777, 3, 0x778, 0x779, 2, 0x77A, 0x77B, 56, 0x77C, 0x77C, 6, 0x77D, 0x77E, 9, 0x77F, 0x77F, 17, 0x860, 0x860, 57, 0x861, 0x861, 58,
102
+ 0x862, 0x862, 59, 0x863, 0x863, 60, 0x864, 0x864, 61, 0x865, 0x865, 62, 0x866, 0x866, 63, 0x867, 0x867, 64, 0x868, 0x868, 65, 0x869, 0x869, 66,
103
+ 0x86A, 0x86A, 67, 0x870, 0x882, 1, 0x886, 0x886, 68, 0x889, 0x889, 20, 0x88A, 0x88A, 6, 0x88B, 0x88C, 11, 0x88D, 0x88D, 13, 0x88E, 0x88E, 69,
104
+ 0x88F, 0x88F, 20, 0x8A0, 0x8A1, 4, 0x8A2, 0x8A2, 6, 0x8A3, 0x8A3, 11, 0x8A4, 0x8A4, 15, 0x8A5, 0x8A5, 16, 0x8A6, 0x8A6, 18, 0x8A7, 0x8A7, 19,
105
+ 0x8A8, 0x8A9, 3, 0x8AA, 0x8AA, 8, 0x8AB, 0x8AB, 2, 0x8AC, 0x8AC, 70, 0x8AE, 0x8AE, 7, 0x8AF, 0x8AF, 10, 0x8B0, 0x8B0, 13, 0x8B1, 0x8B1, 71,
106
+ 0x8B2, 0x8B2, 8, 0x8B3, 0x8B3, 12, 0x8B4, 0x8B4, 17, 0x8B5, 0x8B5, 16, 0x8B6, 0x8B8, 4, 0x8B9, 0x8B9, 8, 0x8BA, 0x8BA, 3, 0x8BB, 0x8BB, 72,
107
+ 0x8BC, 0x8BC, 73, 0x8BD, 0x8BD, 74, 0x8BE, 0x8C0, 4, 0x8C1, 0x8C1, 6, 0x8C2, 0x8C2, 13, 0x8C3, 0x8C3, 12, 0x8C4, 0x8C4, 73, 0x8C5, 0x8C6, 6,
108
+ 0x8C7, 0x8C7, 18, 0x8C8, 0x8C8, 13,
109
+ ];
110
+ //# sourceMappingURL=joiningGroups.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"joiningGroups.js","sourceRoot":"","sources":["../../src/measure/joiningGroups.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,0EAA0E;AAC1E,0BAA0B;AAE1B;oCACoC;AACpC,MAAM,CAAC,MAAM,mBAAmB,GAAsB;IACpD,cAAc;IACd,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,aAAa;IACb,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,WAAW;IACX,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,WAAW;IACX,KAAK;IACL,aAAa;IACb,UAAU;IACV,kBAAkB;IAClB,eAAe;IACf,YAAY;IACZ,OAAO;IACP,MAAM;IACN,OAAO;IACP,aAAa;IACb,IAAI;IACJ,YAAY;IACZ,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,QAAQ;IACR,KAAK;IACL,KAAK;IACL,SAAS;IACT,eAAe;IACf,GAAG;IACH,IAAI;IACJ,aAAa;IACb,OAAO;IACP,MAAM;IACN,MAAM;IACN,KAAK;IACL,OAAO;IACP,OAAO;IACP,IAAI;IACJ,uBAAuB;IACvB,eAAe;IACf,cAAc;IACd,eAAe;IACf,eAAe;IACf,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,cAAc;IACd,eAAe;IACf,gBAAgB;IAChB,eAAe;IACf,UAAU;IACV,eAAe;IACf,cAAc;IACd,cAAc;IACd,aAAa;IACb,aAAa;IACb,cAAc;CACf,CAAC;AAEF;iEACiE;AACjE,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC;IACtH,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IACzH,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC9H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC;IACxH,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IACxH,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC9H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC5H,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC;IAC1H,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC3H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC9H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC9H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC9H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC;IAC3H,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC5H,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IACvH,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC1H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC9H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC5H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC5H,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC1H,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;IAC1H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,CAAC;IAC3H,KAAK,EAAC,KAAK,EAAC,EAAE,EAAE,KAAK,EAAC,KAAK,EAAC,EAAE;CAC/B,CAAC"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Kashida justification (#375, arabic-typography §3). A justified line of
3
+ * Arabic text is not letter-spaced (its letters join); it is stretched in
4
+ * its word spaces and by elongating joins inside words, with tatweels
5
+ * (U+0640, ـ) inserted between two connected letters. Fonts draw a run of
6
+ * them as one stroke (Amiri's `rlig` turns one to seven into a curved
7
+ * kashida of that length), so a kashida comes in whole tatweels.
8
+ *
9
+ * Two stages:
10
+ * - Breaking: each Arabic word box carries its kashida capacity as stretch
11
+ * (`kashidaCapacity`: points × the longest elongation a point may take),
12
+ * so Knuth–Plass knows a line of Arabic words can widen there and picks
13
+ * its breaks accordingly.
14
+ * - Setting (`justifyLinesWithKashida`): once the breaks are made, every
15
+ * justified line but the last fills its slack with tatweels first — one
16
+ * whole tatweel at a time, best points first, round after round, each
17
+ * word measured again whole with its tatweels — and leaves the remainder,
18
+ * less than one tatweel, to its word spaces, which renderers widen as on
19
+ * any justified line. So the word spaces keep close to their natural
20
+ * width, the Naskh norm.
21
+ *
22
+ * Where the points are and how good they are: `kashidaPatterns.ts` (the
23
+ * raqim-kashida rules). One point per word by default (`perWord`), the
24
+ * best-ranked one, the later of two that rank alike ("towards the end of
25
+ * the word", the Microsoft rule). A word holding a tatweel the author typed
26
+ * is elongated there and nowhere else.
27
+ *
28
+ * The inserted tatweels are in the segment's text, so every renderer paints
29
+ * them as text, shaped with the word; `VDTLineSegment.kashida` lists where
30
+ * they are, so plain text, source maps, links and extraction leave them out
31
+ * (`writtenText`), and `VDTLine.kashida` counts them.
32
+ */
33
+ import type { VDTLine, VDTLineSegment } from '../vdt';
34
+ import { type KashidaPatternSetName } from './kashidaPatterns';
35
+ import type { ResolvedBodyTextConfig } from '../types';
36
+ export declare const TATWEEL = "\u0640";
37
+ /** Kashida justification as the measurer applies it
38
+ * (`MeasureBlockOptions.kashida`). */
39
+ export interface KashidaOptions {
40
+ patterns: KashidaPatternSetName;
41
+ /** Most points elongated in one word. */
42
+ perWord: number;
43
+ /** Longest elongation at one point, px (whole tatweels within it). */
44
+ maxLengthPx: number;
45
+ }
46
+ /** The pattern set a body font takes when `kashidaPatterns` is `'auto'`:
47
+ * none for a Ruqʿa or Dīwānī face, whose letters do not elongate (Aref
48
+ * Ruqaa); the Nastaʿlīq rules for a Nastaʿlīq face; Naskh otherwise. */
49
+ export declare function patternsForFont(fontFamily: string): KashidaPatternSetName | undefined;
50
+ /** The measurer's kashida options for text set in `fontString` at
51
+ * `fontSizePx` under `bodyText`, or `undefined` when it takes none
52
+ * (kashida off, or a face whose letters do not elongate). */
53
+ export declare function kashidaMeasureOptions(bodyText: Pick<ResolvedBodyTextConfig, 'kashida' | 'kashidaPatterns' | 'kashidaPerWord' | 'kashidaMaxLength'>, fontString: string, fontSizePx: number): KashidaOptions | undefined;
54
+ /** A point chosen in a word: where the tatweels go (UTF-16 offset in the
55
+ * word as written) and its rank. */
56
+ interface ChosenPoint {
57
+ offset: number;
58
+ priority: number;
59
+ }
60
+ /** The points of `word` that take its kashidas, best first: at most
61
+ * `perWord`, ranked by priority and, between equals, the later one. A word
62
+ * with a tatweel the author typed takes it alone (after the run it
63
+ * starts). */
64
+ export declare function chosenKashidaPoints(word: string, patterns: KashidaPatternSetName, perWord: number): readonly ChosenPoint[];
65
+ /** How far kashidas can widen a word (px): its points times the whole
66
+ * tatweels one point may take, `tatweelPx` each. 0 for a word with no
67
+ * point (Latin, digits, a lone letter). The breaker's stretch of the
68
+ * word's box. */
69
+ export declare function kashidaCapacity(word: string, options: KashidaOptions, tatweelPx: number): number;
70
+ /** A segment's text as written: its text without the tatweels kashida
71
+ * justification inserted (see `VDTLineSegment.kashida`). */
72
+ export declare function writtenText(seg: Pick<VDTLineSegment, 'text' | 'kashida'>): string;
73
+ /**
74
+ * Fill `width` px of slack on a line's segments with kashidas: whole
75
+ * tatweels, one at a time, the best points first and round after round (a
76
+ * second tatweel on a point only once every point that could take one has
77
+ * one), each word measured again whole (`widthOf`) after each, and none
78
+ * that would overfill the slack. Returns the segments (copies where
79
+ * elongated) and how many tatweels went in, or null when none did.
80
+ */
81
+ export declare function distributeKashida(segments: readonly VDTLineSegment[], width: number, options: KashidaOptions, widthOf: (seg: VDTLineSegment, text: string) => number): {
82
+ segments: VDTLineSegment[];
83
+ added: number;
84
+ count: number;
85
+ } | null;
86
+ /**
87
+ * Kashida justification of a paragraph's lines (see the module comment):
88
+ * every justified line but the last one, with its slack against
89
+ * `lineWidth(i)` (the measure less its indent), takes its kashidas, then
90
+ * its word spaces are measured again (`justifiedSpaceRatio`). A line whose
91
+ * spaces would still stretch past the point where the pipeline sets it
92
+ * ragged (`raggedLooseLines`) is left as it is, ragged lines take none.
93
+ * Lines are replaced, never mutated.
94
+ */
95
+ export declare function justifyLinesWithKashida(lines: VDTLine[], lineWidth: (index: number) => number, normalSpaceWidth: number, options: KashidaOptions, widthOf: (seg: VDTLineSegment, text: string) => number): void;
96
+ export {};
97
+ //# sourceMappingURL=kashida.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kashida.d.ts","sourceRoot":"","sources":["../../src/measure/kashida.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAwC,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAIrG,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC;AAGvD,eAAO,MAAM,OAAO,WAAM,CAAC;AAE3B;uCACuC;AACvC,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,qBAAqB,CAAC;IAChC,yCAAyC;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;yEAEyE;AACzE,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,qBAAqB,GAAG,SAAS,CAIrF;AAED;;8DAE8D;AAC9D,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,IAAI,CAAC,sBAAsB,EAAE,SAAS,GAAG,iBAAiB,GAAG,gBAAgB,GAAG,kBAAkB,CAAC,EAC7G,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,cAAc,GAAG,SAAS,CAM5B;AAED;qCACqC;AACrC,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAaD;;;eAGe;AACf,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,qBAAqB,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,WAAW,EAAE,CA6B1H;AAUD;;;kBAGkB;AAClB,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKhG;AAED;6DAC6D;AAC7D,wBAAgB,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,MAAM,CAajF;AAkCD;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,SAAS,cAAc,EAAE,EACnC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GACrD;IAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAgDrE;AASD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,OAAO,EAAE,EAChB,SAAS,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,EACpC,gBAAgB,EAAE,MAAM,EACxB,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,CAAC,GAAG,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,KAAK,MAAM,GACrD,IAAI,CA8BN"}
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Kashida justification (#375, arabic-typography §3). A justified line of
3
+ * Arabic text is not letter-spaced (its letters join); it is stretched in
4
+ * its word spaces and by elongating joins inside words, with tatweels
5
+ * (U+0640, ـ) inserted between two connected letters. Fonts draw a run of
6
+ * them as one stroke (Amiri's `rlig` turns one to seven into a curved
7
+ * kashida of that length), so a kashida comes in whole tatweels.
8
+ *
9
+ * Two stages:
10
+ * - Breaking: each Arabic word box carries its kashida capacity as stretch
11
+ * (`kashidaCapacity`: points × the longest elongation a point may take),
12
+ * so Knuth–Plass knows a line of Arabic words can widen there and picks
13
+ * its breaks accordingly.
14
+ * - Setting (`justifyLinesWithKashida`): once the breaks are made, every
15
+ * justified line but the last fills its slack with tatweels first — one
16
+ * whole tatweel at a time, best points first, round after round, each
17
+ * word measured again whole with its tatweels — and leaves the remainder,
18
+ * less than one tatweel, to its word spaces, which renderers widen as on
19
+ * any justified line. So the word spaces keep close to their natural
20
+ * width, the Naskh norm.
21
+ *
22
+ * Where the points are and how good they are: `kashidaPatterns.ts` (the
23
+ * raqim-kashida rules). One point per word by default (`perWord`), the
24
+ * best-ranked one, the later of two that rank alike ("towards the end of
25
+ * the word", the Microsoft rule). A word holding a tatweel the author typed
26
+ * is elongated there and nowhere else.
27
+ *
28
+ * The inserted tatweels are in the segment's text, so every renderer paints
29
+ * them as text, shaped with the word; `VDTLineSegment.kashida` lists where
30
+ * they are, so plain text, source maps, links and extraction leave them out
31
+ * (`writtenText`), and `VDTLine.kashida` counts them.
32
+ */
33
+ import { findKashidaPoints, kashidaPatternSet } from './kashidaPatterns';
34
+ import { joiningScriptIn } from './joining';
35
+ import { joiningTypeOf } from '../bidi';
36
+ import { RAGGED_SPACE_RATIO } from '../knuthPlass/constants';
37
+ import { resolvedKashida } from '../defaults/bodyText';
38
+ export const TATWEEL = 'ـ';
39
+ /** The pattern set a body font takes when `kashidaPatterns` is `'auto'`:
40
+ * none for a Ruqʿa or Dīwānī face, whose letters do not elongate (Aref
41
+ * Ruqaa); the Nastaʿlīq rules for a Nastaʿlīq face; Naskh otherwise. */
42
+ export function patternsForFont(fontFamily) {
43
+ if (/ruq[ʿ']?a|diwani|dīwānī/i.test(fontFamily))
44
+ return undefined;
45
+ if (/nasta[ʿ']?l[iī]q/i.test(fontFamily))
46
+ return 'nastaliq';
47
+ return 'naskh';
48
+ }
49
+ /** The measurer's kashida options for text set in `fontString` at
50
+ * `fontSizePx` under `bodyText`, or `undefined` when it takes none
51
+ * (kashida off, or a face whose letters do not elongate). */
52
+ export function kashidaMeasureOptions(bodyText, fontString, fontSizePx) {
53
+ const k = resolvedKashida(bodyText);
54
+ if (!k)
55
+ return undefined;
56
+ const patterns = k.patterns === 'auto' ? patternsForFont(fontString) : k.patterns;
57
+ if (!patterns || k.maxLength <= 0)
58
+ return undefined;
59
+ return { patterns, perWord: k.perWord, maxLengthPx: k.maxLength * fontSizePx };
60
+ }
61
+ const chosenCache = new Map();
62
+ const CHOSEN_CACHE_LIMIT = 20000;
63
+ /** Whether `text[i]` is a tatweel the author typed as an elongation: one
64
+ * that carries no mark (a tatweel under a mark seats it). */
65
+ function bareTatweelAt(text, i) {
66
+ if (text[i] !== TATWEEL)
67
+ return false;
68
+ const next = text.codePointAt(i + 1);
69
+ return next === undefined || joiningTypeOf(next) !== 'T';
70
+ }
71
+ /** The points of `word` that take its kashidas, best first: at most
72
+ * `perWord`, ranked by priority and, between equals, the later one. A word
73
+ * with a tatweel the author typed takes it alone (after the run it
74
+ * starts). */
75
+ export function chosenKashidaPoints(word, patterns, perWord) {
76
+ const key = `${patterns}${perWord}\x00${word}`;
77
+ const hit = chosenCache.get(key);
78
+ if (hit)
79
+ return hit;
80
+ let out;
81
+ const typed = word.indexOf(TATWEEL);
82
+ let bare = -1;
83
+ for (let i = typed; i >= 0 && i < word.length; i = word.indexOf(TATWEEL, i + 1)) {
84
+ if (bareTatweelAt(word, i)) {
85
+ bare = i;
86
+ break;
87
+ }
88
+ }
89
+ if (bare >= 0) {
90
+ let end = bare;
91
+ while (word[end] === TATWEEL)
92
+ end++;
93
+ out = [{ offset: end, priority: 9 }];
94
+ }
95
+ else {
96
+ const all = findKashidaPoints(word, kashidaPatternSet(patterns));
97
+ all.sort((a, b) => b.priority - a.priority || b.offset - a.offset);
98
+ out = [];
99
+ for (const p of all) {
100
+ if (out.length >= perWord)
101
+ break;
102
+ if (!out.some((q) => q.offset === p.offset))
103
+ out.push({ offset: p.offset, priority: p.priority });
104
+ }
105
+ }
106
+ if (chosenCache.size >= CHOSEN_CACHE_LIMIT)
107
+ chosenCache.clear();
108
+ chosenCache.set(key, out);
109
+ return out;
110
+ }
111
+ /** Whether a segment is a word kashida may elongate: Arabic-script text,
112
+ * not a reference label, a footnote marker, a chip, a formula or
113
+ * characters the layout added. */
114
+ function elongatable(seg) {
115
+ return seg.kind === 'text' && !seg.inserted && seg.refResourceId === undefined && seg.footnoteId === undefined
116
+ && !seg.chip && !seg.mathRender && joiningScriptIn(seg.text);
117
+ }
118
+ /** How far kashidas can widen a word (px): its points times the whole
119
+ * tatweels one point may take, `tatweelPx` each. 0 for a word with no
120
+ * point (Latin, digits, a lone letter). The breaker's stretch of the
121
+ * word's box. */
122
+ export function kashidaCapacity(word, options, tatweelPx) {
123
+ if (tatweelPx <= 0 || !joiningScriptIn(word))
124
+ return 0;
125
+ const units = Math.floor(options.maxLengthPx / tatweelPx + 1e-6);
126
+ if (units <= 0)
127
+ return 0;
128
+ return chosenKashidaPoints(word, options.patterns, options.perWord).length * units * tatweelPx;
129
+ }
130
+ /** A segment's text as written: its text without the tatweels kashida
131
+ * justification inserted (see `VDTLineSegment.kashida`). */
132
+ export function writtenText(seg) {
133
+ const at = seg.kashida;
134
+ if (!at || at.length === 0)
135
+ return seg.text;
136
+ let out = '';
137
+ let k = 0;
138
+ for (let i = 0; i < seg.text.length; i++) {
139
+ if (k < at.length && at[k] === i) {
140
+ k++;
141
+ continue;
142
+ }
143
+ out += seg.text[i];
144
+ }
145
+ return out;
146
+ }
147
+ /** Insert one tatweel at `offset` (in the text as it now stands) into a
148
+ * segment: its text, its styled runs and its inserted offsets. */
149
+ function withTatweel(seg, offset) {
150
+ const text = seg.text.slice(0, offset) + TATWEEL + seg.text.slice(offset);
151
+ const kashida = [...(seg.kashida ?? []).map((o) => (o >= offset ? o + 1 : o)), offset].sort((a, b) => a - b);
152
+ let runs = seg.runs;
153
+ if (runs) {
154
+ // The tatweel joins the run of the letter before it.
155
+ let pos = 0;
156
+ let placed = false;
157
+ runs = runs.map((r) => {
158
+ const start = pos;
159
+ pos += r.text.length;
160
+ if (placed || offset <= start || offset > pos)
161
+ return r;
162
+ placed = true;
163
+ return { ...r, text: r.text.slice(0, offset - start) + TATWEEL + r.text.slice(offset - start) };
164
+ });
165
+ }
166
+ return { ...seg, text, kashida, ...(runs ? { runs } : {}) };
167
+ }
168
+ /**
169
+ * Fill `width` px of slack on a line's segments with kashidas: whole
170
+ * tatweels, one at a time, the best points first and round after round (a
171
+ * second tatweel on a point only once every point that could take one has
172
+ * one), each word measured again whole (`widthOf`) after each, and none
173
+ * that would overfill the slack. Returns the segments (copies where
174
+ * elongated) and how many tatweels went in, or null when none did.
175
+ */
176
+ export function distributeKashida(segments, width, options, widthOf) {
177
+ if (width <= 0)
178
+ return null;
179
+ const cands = [];
180
+ const tatweel = new Map();
181
+ for (let i = 0; i < segments.length; i++) {
182
+ const seg = segments[i];
183
+ if (!elongatable(seg))
184
+ continue;
185
+ const pts = chosenKashidaPoints(writtenText(seg), options.patterns, options.perWord);
186
+ if (pts.length === 0)
187
+ continue;
188
+ const unit = widthOf(seg, TATWEEL);
189
+ const max = unit > 0 ? Math.floor(options.maxLengthPx / unit + 1e-6) : 0;
190
+ if (max <= 0)
191
+ continue;
192
+ tatweel.set(i, unit);
193
+ for (const p of pts)
194
+ cands.push({ seg: i, offset: p.offset, priority: p.priority, count: 0, max, done: false });
195
+ }
196
+ if (cands.length === 0)
197
+ return null;
198
+ // Best first; between equals, the one nearer the line's end.
199
+ cands.sort((a, b) => b.priority - a.priority || b.seg - a.seg || b.offset - a.offset);
200
+ const out = segments.slice();
201
+ let remaining = width;
202
+ let count = 0;
203
+ const EPS = 1e-6;
204
+ for (let progressed = true; progressed;) {
205
+ progressed = false;
206
+ for (const c of cands) {
207
+ if (c.done || c.count >= c.max)
208
+ continue;
209
+ if (tatweel.get(c.seg) > remaining + EPS)
210
+ continue;
211
+ const seg = out[c.seg];
212
+ // Where the point stands in the text now: past the tatweels already
213
+ // inserted before it, and after this point's own.
214
+ let at = c.offset;
215
+ for (const o of seg.kashida ?? [])
216
+ if (o < at)
217
+ at++;
218
+ const next = withTatweel(seg, at);
219
+ const w = widthOf(next, next.text);
220
+ const delta = w - seg.width;
221
+ if (delta <= 0 || delta > remaining + EPS) {
222
+ c.done = true;
223
+ continue;
224
+ }
225
+ out[c.seg] = { ...next, width: w };
226
+ remaining -= delta;
227
+ c.count++;
228
+ count++;
229
+ progressed = true;
230
+ }
231
+ }
232
+ return count > 0 ? { segments: out, added: width - remaining, count } : null;
233
+ }
234
+ /** How far a line's word spaces widen before its kashidas take the rest
235
+ * of its slack: a quarter of their width, alreq's and Nemeth's advice to
236
+ * combine both levers (spaces alone open rivers, kashidas alone crowd the
237
+ * line with elongations). Whatever the kashidas leave, under one tatweel,
238
+ * goes to the spaces too. */
239
+ const SPACE_SHARE = 1.25;
240
+ /**
241
+ * Kashida justification of a paragraph's lines (see the module comment):
242
+ * every justified line but the last one, with its slack against
243
+ * `lineWidth(i)` (the measure less its indent), takes its kashidas, then
244
+ * its word spaces are measured again (`justifiedSpaceRatio`). A line whose
245
+ * spaces would still stretch past the point where the pipeline sets it
246
+ * ragged (`raggedLooseLines`) is left as it is, ragged lines take none.
247
+ * Lines are replaced, never mutated.
248
+ */
249
+ export function justifyLinesWithKashida(lines, lineWidth, normalSpaceWidth, options, widthOf) {
250
+ for (let i = 0; i < lines.length; i++) {
251
+ const line = lines[i];
252
+ if (line.isLastLine || line.ragged || !line.segments || line.wordOverflow)
253
+ continue;
254
+ const target = lineWidth(i);
255
+ const natural = line.segments.reduce((s, seg) => s + seg.width, 0);
256
+ // The word spaces open up a little first (to `SPACE_SHARE` of their
257
+ // width); the kashidas take what is beyond.
258
+ const spaceCount = line.segments.reduce((n, seg) => n + (seg.kind === 'space' ? 1 : 0), 0);
259
+ const spaceShare = spaceCount * normalSpaceWidth * (SPACE_SHARE - 1);
260
+ const done = distributeKashida(line.segments, target - natural - spaceShare, options, widthOf);
261
+ if (!done)
262
+ continue;
263
+ let words = 0;
264
+ let spaces = 0;
265
+ for (const seg of done.segments) {
266
+ if (seg.kind === 'space')
267
+ spaces++;
268
+ else
269
+ words += seg.width;
270
+ }
271
+ const ratio = spaces > 0 && normalSpaceWidth > 0 ? (target - words) / spaces / normalSpaceWidth : undefined;
272
+ // Without the kashidas the pipeline would set this line ragged; it
273
+ // still would with them: leave it to that.
274
+ if (ratio !== undefined && ratio > RAGGED_SPACE_RATIO)
275
+ continue;
276
+ lines[i] = {
277
+ ...line,
278
+ segments: done.segments,
279
+ bbox: { ...line.bbox, width: natural + done.added },
280
+ ...(ratio !== undefined ? { justifiedSpaceRatio: ratio } : {}),
281
+ kashida: done.count,
282
+ };
283
+ }
284
+ }
285
+ //# sourceMappingURL=kashida.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kashida.js","sourceRoot":"","sources":["../../src/measure/kashida.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Where a kashida may go in an Arabic word, and how good a place it is: a
3
+ * port of raqim-kashida (Khaled Hosny, aliftype, MIT licence,
4
+ * https://github.com/aliftype/raqim-kashida, at e217f98c), its pattern
5
+ * language and its built-in sets.
6
+ *
7
+ * A pattern set scores the connections of a word's joined runs (letters
8
+ * that connect to each other: `المبتعث` is the run ا and the run لمبتعث). A
9
+ * pattern is a row of tokens (a letter, a joining group `@Beh` that folds
10
+ * the letters sharing its skeleton in a given position, a set `{…}`, `*`
11
+ * any joining letter, `.` the run's edge) with a priority digit 0–9, or
12
+ * `!` (forbidden), in the gaps between them; `9\6` drops by one per letter
13
+ * the run is longer than the guard's floor (`[4:]`) or, with `[:4:]`, away
14
+ * from it either way. The last rule that speaks at a connection wins. A
15
+ * point is only ever a real connection: never after a right-joining letter
16
+ * (ا د ذ ر ز و ة), never at a run's edge, never across a ZWNJ.
17
+ *
18
+ * The sets:
19
+ * - `naskh` — Benatia, Elyaakoubi & Lazrek's matrix (TUGboat 27(2), 2006)
20
+ * overridden by Fawzi Salim Afifi's calligraphy manual: nothing after kāf
21
+ * or lām (so never inside lām-alif), nothing before ṣād, ʿayn, wāw, ḥāʾ
22
+ * or a final fāʾ/qāf/yāʾ, 4-letter runs best, a final pronoun hāʾ best
23
+ * stretched just before it. For Amiri, Noto Naskh, Scheherazade…
24
+ * - `simple` — the Microsoft priorities (IE 5.5's `text-kashida`): after
25
+ * an initial or medial sīn/ṣād, before a final hāʾ/dāl, alif/ṭāʾ/lām/
26
+ * kāf, wāw/ʿayn/qāf/fāʾ, before any other final letter; never inside
27
+ * lām-alif.
28
+ * - `nastaliq` — naskh tailored after Afifi's Persian volume.
29
+ *
30
+ * Indices: the points are given as UTF-16 offsets in the word where a
31
+ * tatweel (U+0640) goes: after the whole cluster of the letter before the
32
+ * connection (its harakat included) and after a tatweel that seats a mark.
33
+ * A tatweel the author typed is a letter of its run like any other.
34
+ */
35
+ /** A place a kashida may go. */
36
+ export interface KashidaPoint {
37
+ /** UTF-16 offset in the word where the tatweel is inserted. */
38
+ offset: number;
39
+ /** Index of the grapheme cluster the tatweel goes after (raqim's index). */
40
+ index: number;
41
+ /** 0–9, higher is better. */
42
+ priority: number;
43
+ }
44
+ /** The built-in pattern sets. */
45
+ export type KashidaPatternSetName = 'naskh' | 'simple' | 'nastaliq';
46
+ type Token = {
47
+ kind: 'group';
48
+ group: string;
49
+ } | {
50
+ kind: 'exact';
51
+ group: string;
52
+ } | {
53
+ kind: 'set';
54
+ members: Token[];
55
+ } | {
56
+ kind: 'notSet';
57
+ members: Token[];
58
+ } | {
59
+ kind: 'literal';
60
+ cp: number;
61
+ } | {
62
+ kind: 'any';
63
+ };
64
+ type Weight = {
65
+ base: number;
66
+ min: number;
67
+ } | 'suppress';
68
+ type Guard = {
69
+ kind: 'exact';
70
+ n: number;
71
+ } | {
72
+ kind: 'min';
73
+ n: number;
74
+ } | {
75
+ kind: 'range';
76
+ lo: number;
77
+ hi: number;
78
+ } | {
79
+ kind: 'open';
80
+ n: number;
81
+ };
82
+ interface Pattern {
83
+ guard?: Guard;
84
+ tokens: Token[];
85
+ /** `weights[k]`: the gap before token k; the last, the gap after the
86
+ * last token. */
87
+ weights: (Weight | undefined)[];
88
+ leading: boolean;
89
+ trailing: boolean;
90
+ }
91
+ /** A compiled pattern set. */
92
+ export interface KashidaPatternSet {
93
+ readonly patterns: readonly Pattern[];
94
+ }
95
+ /** A pattern line that does not compile: `line` is 1-based. */
96
+ export declare class KashidaPatternError extends Error {
97
+ readonly line: number;
98
+ constructor(message: string, line: number);
99
+ }
100
+ /** Compile pattern text (raqim's language; `use <set>` splices a built-in
101
+ * set in, `naskh` / `simple` / `nastaliq` or raqim's `arabic-…` names). */
102
+ export declare function compileKashidaPatterns(text: string): KashidaPatternSet;
103
+ /** The kashida points of `word` under `set`, in logical order. Text that
104
+ * is not Arabic-like (no joining letter) has none. */
105
+ export declare function findKashidaPoints(word: string, set: KashidaPatternSet): KashidaPoint[];
106
+ /** A built-in pattern set, compiled on first use. */
107
+ export declare function kashidaPatternSet(name: KashidaPatternSetName): KashidaPatternSet;
108
+ export {};
109
+ //# sourceMappingURL=kashidaPatterns.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kashidaPatterns.d.ts","sourceRoot":"","sources":["../../src/measure/kashidaPatterns.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAKH,gCAAgC;AAChC,MAAM,WAAW,YAAY;IAC3B,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,iCAAiC;AACjC,MAAM,MAAM,qBAAqB,GAAG,OAAO,GAAG,QAAQ,GAAG,UAAU,CAAC;AAsJpE,KAAK,KAAK,GACN;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAChC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,KAAK,EAAE,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,KAAK,EAAE,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,CAAC;AAEpB,KAAK,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,UAAU,CAAC;AAEzD,KAAK,KAAK,GACN;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAC1B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhC,UAAU,OAAO;IACf,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,MAAM,EAAE,KAAK,EAAE,CAAC;IAChB;sBACkB;IAClB,OAAO,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,8BAA8B;AAC9B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,SAAS,OAAO,EAAE,CAAC;CACvC;AAED,+DAA+D;AAC/D,qBAAa,mBAAoB,SAAQ,KAAK;IACf,QAAQ,CAAC,IAAI,EAAE,MAAM;gBAAtC,OAAO,EAAE,MAAM,EAAW,IAAI,EAAE,MAAM;CAInD;AAuID;4EAC4E;AAC5E,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAsBtE;AAmED;uDACuD;AACvD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,YAAY,EAAE,CAKtF;AAkED,qDAAqD;AACrD,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,qBAAqB,GAAG,iBAAiB,CAOhF"}