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,267 @@
1
+ /**
2
+ * Arabic vowel marks (ḥarakāt, tashkīl) in a laid-out document (#376).
3
+ *
4
+ * The marks a vocalised text carries (fatḥa, ḍamma, kasra, tanwīn, sukūn,
5
+ * shadda, the dagger alef, the Qurʾānic annotation signs) stack over and
6
+ * under the letters, so the ink of a vocalised line reaches far past the
7
+ * letters' own ascenders and descenders: a shadda with a fatḥa over a lām
8
+ * stands about 1.3 em above the baseline in Amiri, a kasra under a final yāʾ
9
+ * hangs about 0.7 em under it. The line pitch never changes for them, as
10
+ * for the Chinese marks (`cjkMarks.ts`): they live in the leading. Two
11
+ * things follow from that.
12
+ *
13
+ * - The renderers clip each column to its box (`columnClipRect`). The
14
+ * first line of a column may hold marks that rise above the column's top
15
+ * and the last one marks that hang under its foot; the clip takes them
16
+ * in. A line holding marks carries how far its ink reaches
17
+ * (`VDTLine.markInk`), measured once here, so every renderer reads the
18
+ * same extent without measuring (the PDF backend has no canvas).
19
+ * - Where the marks of one line meet the ink of the line above or below,
20
+ * the paragraph is reported (`arabicMarksExceedLeading`). Two lines are
21
+ * compared word by word: a mark over a word of the lower line only
22
+ * collides with what hangs under the words of the upper line standing
23
+ * above it, which keeps tall marks on an alif from being reported against
24
+ * a descender at the other end of the line. Ink boxes are what the
25
+ * measurer gives (`TextMetrics.actualBoundingBox*`); without them (no
26
+ * canvas metrics) a word's box is estimated from its size and from the
27
+ * marks it holds.
28
+ *
29
+ * A document without vowel marks is looked at once per line (one regular
30
+ * expression test) and left as it was.
31
+ */
32
+ import { measureInkBox } from './measure/canvas';
33
+ import { fontEm } from './measure/vertical';
34
+ import { segmentFont, segmentPositions } from './cjkMarks';
35
+ /** The combining marks of Arabic vocalisation and Qurʾānic annotation:
36
+ * the honorific and Qurʾānic signs U+0610–U+061A, the ḥarakāt and their
37
+ * extensions U+064B–U+065F, the superscript (dagger) alef U+0670, the
38
+ * small high and low Qurʾānic marks U+06D6–U+06ED (the symbols and
39
+ * letters among them left out: U+06DD end of āya, U+06DE rubʿ el-ḥizb,
40
+ * U+06E5–U+06E6 small wāw and yāʾ, U+06E9 place of sajda), and the
41
+ * extended Arabic marks U+08CA–U+08FF (U+08E2, a format character, left
42
+ * out). */
43
+ export const ARABIC_MARK_RE = /[ؐ-ًؚ-ٰٟۖ-ۜ۟-۪ۤۧۨ-ۭ࣊-ࣣ࣡-ࣿ]/;
44
+ /** The marks among {@link ARABIC_MARK_RE} set under the letter: kasra,
45
+ * kasratan, hamza below, subscript alef, the dots and small letters below
46
+ * of other orthographies, the low Qurʾānic signs. */
47
+ const ARABIC_MARK_BELOW_RE = /[ٍِٕٖٜٟۣ۪ۭ࣏࣍-࣒ࣣࣦࣩ࣭-࣯ࣶࣹࣺ]/;
48
+ /** Arabic-script letters (and marks): what is estimated as Arabic. */
49
+ const ARABIC_SCRIPT_RE = /[؀-ۿݐ-ݿࡰ-ࣿﭐ-﷿ﹰ-]/;
50
+ /** Whether `text` holds an Arabic vowel or Qurʾānic mark. */
51
+ export function hasArabicMarks(text) {
52
+ return ARABIC_MARK_RE.test(text);
53
+ }
54
+ /**
55
+ * Estimated ink of a word when the measurer gives no ink metrics, in em
56
+ * of its font, above and below the baseline. Arabic letters: the Naskh
57
+ * ascender of alif and lām and the descenders of rāʾ, nūn and yāʾ (about
58
+ * the typographic ascender and descender of Noto Naskh Arabic, 1.07 and
59
+ * 0.63 em, less the room those keep for marks); a mark over a letter adds
60
+ * about a third of an em above it, one under it a fifth below. With the
61
+ * marks of both sides the box is 1.75 em tall, Amiri's line spacing:
62
+ * fully vocalised text set solid at that leading touches. Any other text:
63
+ * a Latin face's ascender and descender.
64
+ */
65
+ const ESTIMATE = {
66
+ arabicAscent: 0.8,
67
+ arabicDescent: 0.45,
68
+ markAbove: 0.3,
69
+ markBelow: 0.2,
70
+ latinAscent: 0.75,
71
+ latinDescent: 0.25,
72
+ };
73
+ /** Ink boxes measured, per font and text (cleared with each document's
74
+ * annotation pass: fonts may have changed between builds). */
75
+ let inkCache = new Map();
76
+ const MAX_INK_ENTRIES = 50_000;
77
+ /** The ink box of `text` set in `font`, px above and below the baseline:
78
+ * measured, else estimated (see `ESTIMATE`). */
79
+ export function inkBoxOf(text, font) {
80
+ const key = `${font}\u0000${text}`;
81
+ const cached = inkCache.get(key);
82
+ if (cached)
83
+ return cached;
84
+ if (inkCache.size >= MAX_INK_ENTRIES)
85
+ inkCache = new Map();
86
+ let ink = measureInkBox(text, font);
87
+ if (!ink) {
88
+ const em = fontEm(font);
89
+ const marks = hasArabicMarks(text);
90
+ if (ARABIC_SCRIPT_RE.test(text)) {
91
+ ink = {
92
+ ascent: em * (ESTIMATE.arabicAscent + (marks && aboveMark(text) ? ESTIMATE.markAbove : 0)),
93
+ descent: em * (ESTIMATE.arabicDescent + (marks && ARABIC_MARK_BELOW_RE.test(text) ? ESTIMATE.markBelow : 0)),
94
+ };
95
+ }
96
+ else {
97
+ ink = { ascent: em * ESTIMATE.latinAscent, descent: em * ESTIMATE.latinDescent };
98
+ }
99
+ }
100
+ inkCache.set(key, ink);
101
+ return ink;
102
+ }
103
+ /** Whether `text` holds a mark set over its letter. */
104
+ function aboveMark(text) {
105
+ for (const ch of text)
106
+ if (ARABIC_MARK_RE.test(ch) && !ARABIC_MARK_BELOW_RE.test(ch))
107
+ return true;
108
+ return false;
109
+ }
110
+ /** The words of a line with their ink, at the x the renderers paint them
111
+ * (the flow order `VDTLine.order` followed when the line has one). Spaces,
112
+ * formulas, chips and swatches hold no Arabic and are left out. */
113
+ export function lineWordInks(line, block) {
114
+ const segments = line.segments;
115
+ if (!segments || segments.length === 0) {
116
+ if (!line.text.trim())
117
+ return [];
118
+ const ink = inkBoxOf(line.text, block.fontString);
119
+ return [{ x0: line.bbox.x, x1: line.bbox.x + line.bbox.width, ...ink, marked: hasArabicMarks(line.text) }];
120
+ }
121
+ const { xs, widths } = segmentPositions(line, block);
122
+ const at = xs.slice();
123
+ if (line.order && line.order.length === segments.length) {
124
+ let x = xs[0] ?? line.bbox.x;
125
+ for (const i of line.order) {
126
+ at[i] = x;
127
+ x += widths[i];
128
+ }
129
+ }
130
+ const out = [];
131
+ segments.forEach((seg, i) => {
132
+ if (seg.kind !== 'text' || !seg.text.trim())
133
+ return;
134
+ const ink = inkBoxOf(seg.text, segmentFont(seg, block));
135
+ const shift = seg.baselineShift ?? 0;
136
+ out.push({
137
+ x0: at[i],
138
+ x1: at[i] + widths[i],
139
+ ascent: ink.ascent - shift,
140
+ descent: ink.descent + shift,
141
+ marked: hasArabicMarks(seg.text),
142
+ });
143
+ });
144
+ return out;
145
+ }
146
+ const round = (v) => Math.round(v * 1000) / 1000;
147
+ /** Two lines' ink may touch by this much (px) before they are reported:
148
+ * antialiasing, not a collision. */
149
+ const TOUCH_PX = 0.5;
150
+ /**
151
+ * Set `VDTLine.markInk` on every line of the document that holds an
152
+ * Arabic vowel mark, and report the paragraphs where those marks meet the
153
+ * ink of a neighbouring line of their column (`arabicMarksExceedLeading`,
154
+ * once per paragraph, on the lower line's paragraph). See the module
155
+ * comment.
156
+ */
157
+ export function annotateArabicMarks(doc) {
158
+ // The document's vowel marks: none, and nothing is done.
159
+ let any = false;
160
+ for (const block of doc.blocks) {
161
+ if (block.type === 'resource' || !block.lines)
162
+ continue;
163
+ if (block.lines.some((l) => hasArabicMarks(l.text))) {
164
+ any = true;
165
+ break;
166
+ }
167
+ }
168
+ if (!any)
169
+ return [];
170
+ inkCache = new Map();
171
+ /** Lines of the columns that hold a marked line, with their words. */
172
+ const columns = new Map();
173
+ const marked = new Set();
174
+ for (const block of doc.blocks) {
175
+ if (block.type === 'resource' || block.designOverlay || block.hidden || !block.lines)
176
+ continue;
177
+ for (const line of block.lines) {
178
+ if (!hasArabicMarks(line.text))
179
+ continue;
180
+ const words = lineWordInks(line, block);
181
+ let above = 0;
182
+ let below = 0;
183
+ for (const w of words) {
184
+ if (!w.marked)
185
+ continue;
186
+ above = Math.max(above, w.ascent);
187
+ below = Math.max(below, w.descent);
188
+ }
189
+ if (above > 0 || below > 0)
190
+ line.markInk = { above: round(above), below: round(below) };
191
+ if (block.pageIndex >= 0)
192
+ marked.add(`${block.pageIndex}:${block.columnIndex}`);
193
+ }
194
+ }
195
+ for (const block of doc.blocks) {
196
+ if (block.type === 'resource' || block.designOverlay || block.hidden || !block.lines || block.pageIndex < 0)
197
+ continue;
198
+ const key = `${block.pageIndex}:${block.columnIndex}`;
199
+ if (!marked.has(key))
200
+ continue;
201
+ let column = columns.get(key);
202
+ if (!column)
203
+ columns.set(key, (column = []));
204
+ const em = fontEm(block.fontString);
205
+ for (const line of block.lines)
206
+ column.push({ line, block, words: lineWordInks(line, block), em });
207
+ }
208
+ const warnings = [];
209
+ const reported = new Set();
210
+ for (const column of columns.values()) {
211
+ column.sort((a, b) => a.line.baseline - b.line.baseline);
212
+ for (let i = 1; i < column.length; i++) {
213
+ const a = column[i - 1];
214
+ const b = column[i];
215
+ if (reported.has(b.block))
216
+ continue;
217
+ const pitch = b.line.baseline - a.line.baseline;
218
+ if (pitch <= 0)
219
+ continue;
220
+ let need = 0;
221
+ for (const lower of b.words) {
222
+ for (const upper of a.words) {
223
+ if (!lower.marked && !upper.marked)
224
+ continue;
225
+ if (Math.min(lower.x1, upper.x1) - Math.max(lower.x0, upper.x0) <= 0)
226
+ continue;
227
+ need = Math.max(need, lower.ascent + upper.descent);
228
+ }
229
+ }
230
+ if (need <= pitch + TOUCH_PX)
231
+ continue;
232
+ reported.add(b.block);
233
+ const block = b.block;
234
+ const sourceStart = block.sourceStart ?? block.lines[0]?.sourceStart;
235
+ warnings.push({
236
+ kind: 'arabicMarksExceedLeading',
237
+ text: b.line.text,
238
+ lineHeightEm: round(pitch / b.em),
239
+ neededEm: round(need / b.em),
240
+ ...(sourceStart !== undefined ? { sourceStart } : {}),
241
+ ...(block.sourceEnd !== undefined ? { sourceEnd: block.sourceEnd } : {}),
242
+ pageIndex: block.pageIndex,
243
+ });
244
+ }
245
+ }
246
+ return warnings;
247
+ }
248
+ /** How far the vowel marks of a column's lines reach above `y0` (its top)
249
+ * and below `y1` (its foot), px (`VDTLine.markInk`; 0 when they stay
250
+ * inside). */
251
+ export function markInkOverhang(blocks, y0, y1) {
252
+ let above = 0;
253
+ let below = 0;
254
+ for (const block of blocks) {
255
+ if (block.hidden || !block.lines)
256
+ continue;
257
+ for (const line of block.lines) {
258
+ const ink = line.markInk;
259
+ if (!ink)
260
+ continue;
261
+ above = Math.max(above, y0 - (line.baseline - ink.above));
262
+ below = Math.max(below, line.baseline + ink.below - y1);
263
+ }
264
+ }
265
+ return [above, below];
266
+ }
267
+ //# sourceMappingURL=arabicMarks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arabicMarks.js","sourceRoot":"","sources":["../src/arabicMarks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Arabic numbers in words, for heading templates (`{1:ordinal}`,
3
+ * `{1:ordinal-feminine}`, `{1:words}`): the ordinal a chapter or a night is
4
+ * titled with — الفصل الأول, الباب الحادي عشر, الليلة الأولى, الليلة الحادية
5
+ * بعد الألف — and the cardinal (واحد وعشرون, إحدى عشرة). Both agree in gender
6
+ * with the noun they count: masculine for فصل, باب, جزء, كتاب; feminine for
7
+ * ليلة, مقالة, حكاية.
8
+ *
9
+ * The forms are those of Modern Standard Arabic as headings print them:
10
+ * nominative, and for ordinals definite (with ال). Numbers above a hundred
11
+ * that are not round take the "after" formula of the classical editions
12
+ * and their modern reprints: 145 الخامس والأربعون بعد المئة, 1001 الحادية
13
+ * بعد الألف. Hundreds are spelled مئة, as the language academies write
14
+ * them today, or مائة (`spelling: 'classical'`), as Bulaq and most
15
+ * Egyptian prints do (ثلاثمائة in one word either way).
16
+ */
17
+ export type ArabicGender = 'masculine' | 'feminine';
18
+ export type ArabicSpelling = 'modern' | 'classical';
19
+ export interface ArabicWordsOptions {
20
+ /** The gender of the counted noun. Default `'masculine'`. */
21
+ gender?: ArabicGender;
22
+ /** `'classical'` spells the hundreds مائة. Default `'modern'` (مئة). */
23
+ spelling?: ArabicSpelling;
24
+ }
25
+ /**
26
+ * `n` as an Arabic cardinal, nominative, counting a noun of `gender`:
27
+ * واحد / واحدة, اثنان / اثنتان, ثلاثة / ثلاث, أحد عشر / إحدى عشرة, واحد
28
+ * وعشرون / واحدة وعشرون, مئة وخمسة, ألفان وثلاثمئة. Zero is صفر; past
29
+ * 99 999, and below zero, the number prints in digits.
30
+ */
31
+ export declare function arabicCardinal(n: number, options?: ArabicWordsOptions): string;
32
+ /**
33
+ * `n` as a definite Arabic ordinal, nominative, agreeing with a noun of
34
+ * `gender`, as a heading names a chapter or a night: الأول / الأولى, الحادي
35
+ * عشر / الحادية عشرة, الحادي والعشرون / الحادية والعشرون, المئة, الخامس
36
+ * والأربعون بعد المئة, الحادية بعد المئتين, الخامسة والأربعون بعد الثلاثمئة,
37
+ * الألف, الحادية بعد الألف. A round hundred or thousand is the definite
38
+ * number itself (المئتان, الألف والمئة); any other number above 100 is
39
+ * the ordinal of its last two digits "after" the round part. Past 9 999,
40
+ * and below 1, the number prints in digits.
41
+ */
42
+ export declare function arabicOrdinal(n: number, options?: ArabicWordsOptions): string;
43
+ //# sourceMappingURL=arabicNumberWords.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arabicNumberWords.d.ts","sourceRoot":"","sources":["../src/arabicNumberWords.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,MAAM,MAAM,YAAY,GAAG,WAAW,GAAG,UAAU,CAAC;AACpD,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,WAAW,CAAC;AAEpD,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAkED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,MAAM,CAQlF;AA0CD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAuB,GAAG,MAAM,CAajF"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Arabic numbers in words, for heading templates (`{1:ordinal}`,
3
+ * `{1:ordinal-feminine}`, `{1:words}`): the ordinal a chapter or a night is
4
+ * titled with — الفصل الأول, الباب الحادي عشر, الليلة الأولى, الليلة الحادية
5
+ * بعد الألف — and the cardinal (واحد وعشرون, إحدى عشرة). Both agree in gender
6
+ * with the noun they count: masculine for فصل, باب, جزء, كتاب; feminine for
7
+ * ليلة, مقالة, حكاية.
8
+ *
9
+ * The forms are those of Modern Standard Arabic as headings print them:
10
+ * nominative, and for ordinals definite (with ال). Numbers above a hundred
11
+ * that are not round take the "after" formula of the classical editions
12
+ * and their modern reprints: 145 الخامس والأربعون بعد المئة, 1001 الحادية
13
+ * بعد الألف. Hundreds are spelled مئة, as the language academies write
14
+ * them today, or مائة (`spelling: 'classical'`), as Bulaq and most
15
+ * Egyptian prints do (ثلاثمائة in one word either way).
16
+ */
17
+ /** Largest cardinal spelled out; past it the number prints in digits. */
18
+ const MAX_CARDINAL_AR = 99_999;
19
+ /** Largest ordinal spelled out. */
20
+ const MAX_ORDINAL_AR = 9_999;
21
+ // --- Cardinals --------------------------------------------------------------
22
+ /** 1–10 counting a masculine noun (3–10 take the feminine ending, by the
23
+ * rule of polarity) and a feminine one. */
24
+ const CARDINAL_UNITS = {
25
+ masculine: ['', 'واحد', 'اثنان', 'ثلاثة', 'أربعة', 'خمسة', 'ستة', 'سبعة', 'ثمانية', 'تسعة', 'عشرة'],
26
+ feminine: ['', 'واحدة', 'اثنتان', 'ثلاث', 'أربع', 'خمس', 'ست', 'سبع', 'ثماني', 'تسع', 'عشر'],
27
+ };
28
+ /** 11 and 12: their own forms; 13–19 take the unit of 3–9 above. */
29
+ const CARDINAL_TEENS = {
30
+ masculine: { eleven: 'أحد عشر', twelve: 'اثنا عشر', ten: 'عشر' },
31
+ feminine: { eleven: 'إحدى عشرة', twelve: 'اثنتا عشرة', ten: 'عشرة' },
32
+ };
33
+ /** The tens, alike for both genders, nominative (genitive and accusative
34
+ * end in ين). */
35
+ const TENS = ['', '', 'عشرون', 'ثلاثون', 'أربعون', 'خمسون', 'ستون', 'سبعون', 'ثمانون', 'تسعون'];
36
+ /** 100–900, nominative: مئتان is the dual (genitive مئتين); 300–900 are
37
+ * written as one word. */
38
+ const HUNDREDS = ['', 'مئة', 'مئتان', 'ثلاثمئة', 'أربعمئة', 'خمسمئة', 'ستمئة', 'سبعمئة', 'ثمانمئة', 'تسعمئة'];
39
+ /** The classical spelling of the hundreds: مئة → مائة, مئتان → مائتان,
40
+ * ثلاثمئة → ثلاثمائة. */
41
+ function spelled(words, spelling) {
42
+ return spelling === 'classical' ? words.replace(/مئ/g, 'مائ') : words;
43
+ }
44
+ /** "a and b", the conjunction written onto the next word: ألف ومئة. */
45
+ function joinAnd(parts) {
46
+ return parts.filter((p) => p.length > 0).join(' و');
47
+ }
48
+ function cardinalBelow100(n, gender) {
49
+ if (n <= 10)
50
+ return CARDINAL_UNITS[gender][n];
51
+ const teens = CARDINAL_TEENS[gender];
52
+ if (n === 11)
53
+ return teens.eleven;
54
+ if (n === 12)
55
+ return teens.twelve;
56
+ if (n < 20)
57
+ return `${CARDINAL_UNITS[gender][n - 10]} ${teens.ten}`;
58
+ const unit = n % 10;
59
+ // Units before tens: واحد وعشرون (21).
60
+ return joinAnd([unit ? CARDINAL_UNITS[gender][unit] : '', TENS[Math.floor(n / 10)]]);
61
+ }
62
+ function cardinalBelow1000(n, gender) {
63
+ return joinAnd([HUNDREDS[Math.floor(n / 100)], n % 100 ? cardinalBelow100(n % 100, gender) : '']);
64
+ }
65
+ /** The thousands of a cardinal: ألف, ألفان, ثلاثة آلاف … عشرة آلاف (the
66
+ * plural, counted as a masculine noun), أحد عشر ألفًا … تسعة وتسعون ألفًا
67
+ * (the singular in the accusative). */
68
+ function thousandsWords(k) {
69
+ if (k === 1)
70
+ return 'ألف';
71
+ if (k === 2)
72
+ return 'ألفان';
73
+ if (k <= 10)
74
+ return `${CARDINAL_UNITS.masculine[k]} آلاف`;
75
+ return `${cardinalBelow100(k, 'masculine')} ألفًا`;
76
+ }
77
+ /**
78
+ * `n` as an Arabic cardinal, nominative, counting a noun of `gender`:
79
+ * واحد / واحدة, اثنان / اثنتان, ثلاثة / ثلاث, أحد عشر / إحدى عشرة, واحد
80
+ * وعشرون / واحدة وعشرون, مئة وخمسة, ألفان وثلاثمئة. Zero is صفر; past
81
+ * 99 999, and below zero, the number prints in digits.
82
+ */
83
+ export function arabicCardinal(n, options = {}) {
84
+ if (!Number.isSafeInteger(n) || n < 0 || n > MAX_CARDINAL_AR)
85
+ return String(n);
86
+ if (n === 0)
87
+ return 'صفر';
88
+ const gender = options.gender ?? 'masculine';
89
+ const k = Math.floor(n / 1000);
90
+ const rest = n % 1000;
91
+ const words = joinAnd([k ? thousandsWords(k) : '', rest ? cardinalBelow1000(rest, gender) : '']);
92
+ return spelled(words, options.spelling);
93
+ }
94
+ // --- Ordinals ---------------------------------------------------------------
95
+ const ORDINAL_UNITS = {
96
+ masculine: ['', 'الأول', 'الثاني', 'الثالث', 'الرابع', 'الخامس', 'السادس', 'السابع', 'الثامن', 'التاسع', 'العاشر'],
97
+ feminine: ['', 'الأولى', 'الثانية', 'الثالثة', 'الرابعة', 'الخامسة', 'السادسة', 'السابعة', 'الثامنة', 'التاسعة', 'العاشرة'],
98
+ };
99
+ /** The first unit inside a compound ordinal: الحادي عشر, الحادي والعشرون
100
+ * (not الأول). */
101
+ function compoundUnit(unit, gender) {
102
+ if (unit === 1)
103
+ return gender === 'feminine' ? 'الحادية' : 'الحادي';
104
+ return ORDINAL_UNITS[gender][unit];
105
+ }
106
+ /** The ordinal 1–99: الأول … العاشر, الحادي عشر … التاسع عشر (feminine:
107
+ * الحادية عشرة), العشرون, الحادي والعشرون. 11–19 are indeclinable; the
108
+ * tens are nominative. */
109
+ function ordinalBelow100(n, gender) {
110
+ if (n <= 10)
111
+ return ORDINAL_UNITS[gender][n];
112
+ if (n < 20)
113
+ return `${compoundUnit(n - 10, gender)} ${gender === 'feminine' ? 'عشرة' : 'عشر'}`;
114
+ const tens = `ال${TENS[Math.floor(n / 10)]}`;
115
+ const unit = n % 10;
116
+ return unit === 0 ? tens : joinAnd([compoundUnit(unit, gender), tens]);
117
+ }
118
+ /** A round number (a multiple of 100 below 10 000) made definite, every
119
+ * term with ال: المئة, الثلاثمئة, الألف, الألف والمئتان. The duals مئتان
120
+ * and ألفان take the genitive (مئتين, ألفين) after بعد. */
121
+ function definiteRound(n, genitive) {
122
+ const k = Math.floor(n / 1000);
123
+ const h = Math.floor((n % 1000) / 100);
124
+ const dual = (word) => (genitive ? word.replace(/ان$/, 'ين') : word);
125
+ let thousands = '';
126
+ if (k === 1)
127
+ thousands = 'الألف';
128
+ else if (k === 2)
129
+ thousands = dual('الألفان');
130
+ else if (k > 2)
131
+ thousands = `ال${CARDINAL_UNITS.masculine[k]} آلاف`;
132
+ const hundreds = h === 0 ? '' : h === 2 ? dual('المئتان') : `ال${HUNDREDS[h]}`;
133
+ return joinAnd([thousands, hundreds]);
134
+ }
135
+ /**
136
+ * `n` as a definite Arabic ordinal, nominative, agreeing with a noun of
137
+ * `gender`, as a heading names a chapter or a night: الأول / الأولى, الحادي
138
+ * عشر / الحادية عشرة, الحادي والعشرون / الحادية والعشرون, المئة, الخامس
139
+ * والأربعون بعد المئة, الحادية بعد المئتين, الخامسة والأربعون بعد الثلاثمئة,
140
+ * الألف, الحادية بعد الألف. A round hundred or thousand is the definite
141
+ * number itself (المئتان, الألف والمئة); any other number above 100 is
142
+ * the ordinal of its last two digits "after" the round part. Past 9 999,
143
+ * and below 1, the number prints in digits.
144
+ */
145
+ export function arabicOrdinal(n, options = {}) {
146
+ if (!Number.isSafeInteger(n) || n < 1 || n > MAX_ORDINAL_AR)
147
+ return String(n);
148
+ const gender = options.gender ?? 'masculine';
149
+ const rest = n % 100;
150
+ const round = n - rest;
151
+ let words;
152
+ if (round === 0)
153
+ words = ordinalBelow100(rest, gender);
154
+ else if (rest === 0)
155
+ words = definiteRound(round, false);
156
+ // One after a round number is the compound form, as in 21: الحادي بعد
157
+ // المئة, الحادية بعد الألف (the alternatives الأولى / الواحدة بعد الألف
158
+ // are not generated).
159
+ else
160
+ words = `${rest === 1 ? compoundUnit(1, gender) : ordinalBelow100(rest, gender)} بعد ${definiteRound(round, true)}`;
161
+ return spelled(words, options.spelling);
162
+ }
163
+ //# sourceMappingURL=arabicNumberWords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arabicNumberWords.js","sourceRoot":"","sources":["../src/arabicNumberWords.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Arabic-script numerals, written and read: the Arabic-Indic digits of the
3
+ * Mashriq (٠١٢٣٤٥٦٧٨٩, U+0660–0669) and the Extended Arabic-Indic digits
4
+ * of Persian and Urdu (۰۱۲۳۴۵۶۷۸۹, U+06F0–06F9); the additive abjad
5
+ * numerals of Classical Arabic and manuscript foliation (يا = 11,
6
+ * غتمو = 1446) in the Mashriqi and the Maghrebi values; and the letter
7
+ * series that number list items and front matter, in abjad order
8
+ * (أ ب ج د هـ) and in the alphabetical, hijāʾī order (أ ب ت ث). Also
9
+ * the reverse for digits: an Arabic author types ٣ where a Latin one
10
+ * types 3.
11
+ */
12
+ import type { DigitSystem } from './types';
13
+ /** `n` in Arabic-Indic digits: 2026 → ٢٠٢٦. */
14
+ export declare function arabicIndicDecimal(n: number): string;
15
+ /** `n` in Extended Arabic-Indic (Persian) digits: 2026 → ۲۰۲۶. Urdu writes
16
+ * the same code points; its glyph forms come from the font (`locl`). */
17
+ export declare function persianDecimal(n: number): string;
18
+ /**
19
+ * The ASCII digits of an engine-generated string in the document's digit
20
+ * system: `'arab'` writes ٠–٩, `'arabext'` ۰–۹, `'latn'` (or none) leaves
21
+ * the string as it is. Only strings the engine composed go through it — a
22
+ * page count, a chapter ordinal, the fallback of a list number — never
23
+ * the author's text.
24
+ */
25
+ export declare function withDigits(text: string, digits: DigitSystem | undefined): string;
26
+ /** Arabic-Indic (٠–٩) and Extended Arabic-Indic (۰–۹) digits turned into
27
+ * ASCII ones, everything else kept: what a number an author typed on an
28
+ * Arabic or Persian keyboard (`startAt=٣`, `:::part{number="١٢"}`) is
29
+ * read through before `Number()`. */
30
+ export declare function asciiDigits(text: string): string;
31
+ /**
32
+ * `n` in additive abjad numerals, highest value first in logical order
33
+ * (the reader sees it right to left): 11 يا, 15 يه, 1446 غتمو, 1835 غضله.
34
+ * The thousands count is written before the thousand letter (2000 بغ, as
35
+ * against 1002 غب). `'maghrebi'` takes the Maghrebi values. A final heh
36
+ * that would stand alone takes a tatweel (5 هـ). Zero has no abjad numeral
37
+ * and prints nothing; past 999 999 the number prints in digits.
38
+ */
39
+ export declare function abjadNumeral(n: number, variant?: 'mashriqi' | 'maghrebi'): string;
40
+ /** The 28 letters in abjad order, as list items are lettered in Arabic
41
+ * textbooks and outlines (أ، ب، ج، د، هـ…). The first is written with its
42
+ * hamza, as a list marker always is: a bare alif reads as the digit ١. */
43
+ export declare const ABJAD_LETTERS: readonly string[];
44
+ /** The 28 letters in alphabetical (hijāʾī) order, the dictionary order of
45
+ * today (أ، ب، ت، ث، ج…); the first with its hamza, as above. */
46
+ export declare const HIJAI_LETTERS: readonly string[];
47
+ /**
48
+ * The `n`th marker of a letter series, by the bijective rule of
49
+ * `lower-alpha` (z, aa, ab…): past the last letter the series goes on in
50
+ * two letters (أأ, أب…), then three. A final heh that would stand alone
51
+ * takes a tatweel (هـ). Zero and below print nothing.
52
+ */
53
+ export declare function arabicLettering(n: number, letters: readonly string[]): string;
54
+ //# sourceMappingURL=arabicNumerals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"arabicNumerals.d.ts","sourceRoot":"","sources":["../src/arabicNumerals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAK3C,+CAA+C;AAC/C,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;yEACyE;AACzE,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,MAAM,CAIhF;AAED;;;sCAGsC;AACtC,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAKhD;AAsDD;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE,UAAU,GAAG,UAAuB,GAAG,MAAM,CAQ7F;AAMD;;2EAE2E;AAC3E,eAAO,MAAM,aAAa,EAAE,SAAS,MAAM,EAGzC,CAAC;AAEH;kEACkE;AAClE,eAAO,MAAM,aAAa,EAAE,SAAS,MAAM,EAGzC,CAAC;AAEH;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAQ7E"}