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
package/dist/bidi.js ADDED
@@ -0,0 +1,851 @@
1
+ /**
2
+ * The Unicode Bidirectional Algorithm (UAX #9), shared by the measurer and
3
+ * every renderer the way `writingMode.ts` shares vertical orientation.
4
+ *
5
+ * Arabic and Hebrew run right to left, digits and Latin words inside them
6
+ * left to right, and the order in which a line's pieces are painted follows
7
+ * from the characters themselves: their `Bidi_Class`, the paragraph's base
8
+ * direction and any explicit isolates (`:rtl[…]`, `:ltr[…]`, or the Unicode
9
+ * controls U+2066–U+2069). {@link resolveParagraph} resolves a paragraph's
10
+ * embedding levels (rules P2–P3, X1–X10, W1–W7, N0–N2, I1–I2); the line
11
+ * functions apply L1 (trailing white space back to the paragraph level) and
12
+ * L2 (reversal) to one line of it once the line breaker has cut it, so the
13
+ * breaker works on the logical text and never needs to know about
14
+ * direction. L3 (combining marks) is the shaper's business and L4
15
+ * (mirroring) is {@link mirroredChar}.
16
+ *
17
+ * Text is UTF-16: levels are kept per code unit, a surrogate pair's two
18
+ * units always share one level, and the order functions return the index
19
+ * of each code point's first unit. Characters rule X9 removes (embedding
20
+ * and override controls, `BN`) get the level of the character before them,
21
+ * so they never split a run; they paint nothing.
22
+ *
23
+ * Conformance: the full `BidiCharacterTest.txt` and `BidiTest.txt` of
24
+ * Unicode 18 pass (see `__tests__/bidi.test.ts`). The data tables are in
25
+ * `bidiData.ts`, generated by `scripts/gen-bidi-data.mjs`.
26
+ */
27
+ import { BIDI_CLASS_RANGES, BRACKET_PAIRS, JOINING_TYPE_RANGES, MIRROR_PAIRS } from './bidiData';
28
+ /** Every `Bidi_Class`, by its code in the data tables. */
29
+ export const BIDI_CLASS_NAMES = Object.freeze([
30
+ 'L', 'R', 'AL', 'EN', 'ES', 'ET', 'AN', 'CS', 'NSM', 'BN', 'B', 'S', 'WS', 'ON',
31
+ 'LRE', 'LRO', 'RLE', 'RLO', 'PDF', 'LRI', 'RLI', 'FSI', 'PDI',
32
+ ]);
33
+ // The class codes (indices into BIDI_CLASS_NAMES).
34
+ const L = 0, R = 1, AL = 2, EN = 3, ES = 4, ET = 5, AN = 6, CS = 7, NSM = 8, BN = 9, B = 10, S = 11, WS = 12, ON = 13;
35
+ const LRE = 14, LRO = 15, RLE = 16, RLO = 17, PDF = 18, LRI = 19, RLI = 20, FSI = 21, PDI = 22;
36
+ /** Internal: the second unit of a surrogate pair. Removed like `BN`, and
37
+ * always given its first unit's level. */
38
+ const TAIL = 23;
39
+ /** The deepest embedding level (UAX #9 BD2). */
40
+ const MAX_DEPTH = 125;
41
+ // ---------------------------------------------------------------------------
42
+ // Character data
43
+ /** Bidi classes of the BMP, one byte per code point, built on first use. */
44
+ let bmpClasses = null;
45
+ function buildBmpClasses() {
46
+ const table = new Uint8Array(0x10000);
47
+ for (let i = 0; i < BIDI_CLASS_RANGES.length; i += 3) {
48
+ const first = BIDI_CLASS_RANGES[i];
49
+ if (first > 0xFFFF)
50
+ break;
51
+ table.fill(BIDI_CLASS_RANGES[i + 2], first, Math.min(BIDI_CLASS_RANGES[i + 1], 0xFFFF) + 1);
52
+ }
53
+ bmpClasses = table;
54
+ return table;
55
+ }
56
+ /** The value of `[first, last, value]` triples holding `cp`, else `def`. */
57
+ function rangeLookup(ranges, cp, def) {
58
+ let lo = 0;
59
+ let hi = ranges.length / 3 - 1;
60
+ while (lo <= hi) {
61
+ const mid = (lo + hi) >> 1;
62
+ if (cp < ranges[mid * 3])
63
+ hi = mid - 1;
64
+ else if (cp > ranges[mid * 3 + 1])
65
+ lo = mid + 1;
66
+ else
67
+ return ranges[mid * 3 + 2];
68
+ }
69
+ return def;
70
+ }
71
+ /** A code point's `Bidi_Class` as its numeric code (an index into
72
+ * {@link BIDI_CLASS_NAMES}). */
73
+ function classCode(cp) {
74
+ if (cp < 0x10000)
75
+ return (bmpClasses ?? buildBmpClasses())[cp];
76
+ return rangeLookup(BIDI_CLASS_RANGES, cp, L);
77
+ }
78
+ /** A code point's Unicode `Bidi_Class`. */
79
+ export function bidiClassOf(cp) {
80
+ return BIDI_CLASS_NAMES[classCode(cp)];
81
+ }
82
+ /** Whether a code point is a right-to-left letter (`Bidi_Class` `R` or
83
+ * `AL`): Hebrew, Arabic, Syriac, Thaana, N'Ko, Adlam and the other
84
+ * scripts written from right to left. Digits, punctuation and marks are
85
+ * not, whatever text they sit in. */
86
+ export function isRtlScriptChar(cp) {
87
+ const c = classCode(cp);
88
+ return c === R || c === AL;
89
+ }
90
+ /**
91
+ * Whether a paragraph needs the bidi algorithm at all: it holds a
92
+ * right-to-left letter or a control that opens a right-to-left embedding,
93
+ * override or isolate. Text without one, in a left-to-right paragraph,
94
+ * resolves to even levels throughout and paints in logical order, so the
95
+ * layout can skip the algorithm (and stays exactly as it was). Arabic-Indic
96
+ * digits alone do not count: they run left to right.
97
+ */
98
+ export function needsBidi(text) {
99
+ for (let i = 0; i < text.length; i++) {
100
+ const u = text.charCodeAt(i);
101
+ // Nothing below the Hebrew block is right to left.
102
+ if (u < 0x0590)
103
+ continue;
104
+ let cp = u;
105
+ if (u >= 0xD800 && u <= 0xDBFF && i + 1 < text.length) {
106
+ const lo = text.charCodeAt(i + 1);
107
+ if (lo >= 0xDC00 && lo <= 0xDFFF) {
108
+ cp = ((u - 0xD800) << 10) + (lo - 0xDC00) + 0x10000;
109
+ i++;
110
+ }
111
+ }
112
+ const c = classCode(cp);
113
+ if (c === R || c === AL || c === RLE || c === RLO || c === RLI)
114
+ return true;
115
+ }
116
+ return false;
117
+ }
118
+ let mirrors = null;
119
+ /**
120
+ * The mirrored form of a character (`Bidi_Mirroring_Glyph`, rule L4): `)`
121
+ * for `(`, `»` for `«`, `≥` for `≤`. A renderer paints it in place of the
122
+ * character when the character's resolved level is odd and the font does
123
+ * not mirror it itself (OpenType `rtlm`). A character without a mirror is
124
+ * returned unchanged, as is anything longer than one code point.
125
+ *
126
+ * The ornate parentheses of Quranic text, U+FD3E ﴾ and U+FD3F ﴿, have no
127
+ * mirror and are not paired brackets: Unicode 14 gave them their present
128
+ * general categories (FD3F opens, FD3E closes, as they are written in
129
+ * Arabic) and keeps them out of `BidiMirroring.txt` and `BidiBrackets.txt`
130
+ * on purpose, so they always paint as they are encoded.
131
+ */
132
+ export function mirroredChar(ch) {
133
+ const cp = ch.codePointAt(0);
134
+ if (cp === undefined || ch.length > (cp > 0xFFFF ? 2 : 1))
135
+ return ch;
136
+ const m = mirroredCodePoint(cp);
137
+ return m === cp ? ch : String.fromCodePoint(m);
138
+ }
139
+ /** The mirrored form of a code point (see {@link mirroredChar}), or the
140
+ * code point itself when it has none. */
141
+ export function mirroredCodePoint(cp) {
142
+ if (!mirrors) {
143
+ mirrors = new Map();
144
+ for (let i = 0; i < MIRROR_PAIRS.length; i += 2)
145
+ mirrors.set(MIRROR_PAIRS[i], MIRROR_PAIRS[i + 1]);
146
+ }
147
+ return mirrors.get(cp) ?? cp;
148
+ }
149
+ /** Paired brackets (`Bidi_Paired_Bracket`): opening bracket → its closing
150
+ * bracket, and the reverse; built on first use. */
151
+ let bracketOpen = null;
152
+ let bracketClose = null;
153
+ function bracketTables() {
154
+ bracketOpen = new Map();
155
+ bracketClose = new Map();
156
+ for (let i = 0; i < BRACKET_PAIRS.length; i += 2) {
157
+ bracketOpen.set(BRACKET_PAIRS[i], BRACKET_PAIRS[i + 1]);
158
+ bracketClose.set(BRACKET_PAIRS[i + 1], BRACKET_PAIRS[i]);
159
+ }
160
+ }
161
+ /** A bracket as rule BD16 compares it: the angle brackets U+2329/U+232A are
162
+ * canonically equivalent to U+3008/U+3009, so either closes the other. */
163
+ function canonicalBracket(cp) {
164
+ return cp === 0x2329 ? 0x3008 : cp === 0x232A ? 0x3009 : cp;
165
+ }
166
+ const JOINING_TYPE_NAMES = ['U', 'C', 'D', 'R', 'L', 'T'];
167
+ // The joining codes.
168
+ const JT_U = 0, JT_C = 1, JT_D = 2, JT_R = 3, JT_L = 4, JT_T = 5;
169
+ function joiningCode(cp) {
170
+ // Below U+00AD every character is non-joining.
171
+ if (cp < 0xAD)
172
+ return JT_U;
173
+ return rangeLookup(JOINING_TYPE_RANGES, cp, JT_U);
174
+ }
175
+ /** A code point's Unicode `Joining_Type`. */
176
+ export function joiningTypeOf(cp) {
177
+ return JOINING_TYPE_NAMES[joiningCode(cp)];
178
+ }
179
+ /** Whether a text holds a letter of a joining script: a character that is
180
+ * dual-, right- or left-joining (Arabic, Syriac, N'Ko, Mongolian, Adlam…).
181
+ * Join-causing characters alone do not count: a ZWJ also sits inside emoji
182
+ * sequences. */
183
+ export function hasJoiningScript(text) {
184
+ for (let i = 0; i < text.length; i++) {
185
+ const cp = text.codePointAt(i);
186
+ if (cp > 0xFFFF)
187
+ i++;
188
+ const j = joiningCode(cp);
189
+ if (j === JT_D || j === JT_R || j === JT_L)
190
+ return true;
191
+ }
192
+ return false;
193
+ }
194
+ /**
195
+ * Whether the character starting at `index` is joined to the next
196
+ * non-transparent character of `text` (cursive Arabic: the two letters
197
+ * connect, so a cut, a style change or a kashida between them must keep
198
+ * the connection). It joins when it joins forward (`D`, `L`, `C`) and the
199
+ * next one joins backward (`D`, `R`, `C`); transparent marks between them
200
+ * (harakat) are skipped. `false` at the end of the text, and when `index`
201
+ * itself is a transparent mark.
202
+ */
203
+ export function joinsWithNext(text, index) {
204
+ const cp = text.codePointAt(index);
205
+ if (cp === undefined)
206
+ return false;
207
+ const a = joiningCode(cp);
208
+ if (a !== JT_D && a !== JT_L && a !== JT_C)
209
+ return false;
210
+ for (let i = index + (cp > 0xFFFF ? 2 : 1); i < text.length;) {
211
+ const next = text.codePointAt(i);
212
+ const b = joiningCode(next);
213
+ if (b === JT_T) {
214
+ i += next > 0xFFFF ? 2 : 1;
215
+ continue;
216
+ }
217
+ return (b === JT_D || b === JT_R || b === JT_C) && !(a === JT_C && b === JT_C);
218
+ }
219
+ return false;
220
+ }
221
+ /** Whether any two characters of a text join (see {@link joinsWithNext}):
222
+ * a word that must be measured, cut and painted as one shaped run. */
223
+ export function joinsLetters(text) {
224
+ for (let i = 0; i < text.length; i++) {
225
+ if (joinsWithNext(text, i))
226
+ return true;
227
+ if (text.charCodeAt(i) >= 0xD800 && text.charCodeAt(i) <= 0xDBFF)
228
+ i++;
229
+ }
230
+ return false;
231
+ }
232
+ /** The class codes of a text, one per UTF-16 unit (a pair's second unit is
233
+ * {@link TAIL}). */
234
+ function classesOf(text) {
235
+ const n = text.length;
236
+ const out = new Uint8Array(n);
237
+ for (let i = 0; i < n; i++) {
238
+ const u = text.charCodeAt(i);
239
+ if (u >= 0xD800 && u <= 0xDBFF && i + 1 < n) {
240
+ const lo = text.charCodeAt(i + 1);
241
+ if (lo >= 0xDC00 && lo <= 0xDFFF) {
242
+ out[i] = classCode(((u - 0xD800) << 10) + (lo - 0xDC00) + 0x10000);
243
+ out[++i] = TAIL;
244
+ continue;
245
+ }
246
+ }
247
+ out[i] = classCode(u);
248
+ }
249
+ return out;
250
+ }
251
+ const isIsolateInitiator = (c) => c === LRI || c === RLI || c === FSI;
252
+ /** Removed by rule X9 (kept in the text, given a neighbour's level). */
253
+ const isRemoved = (c) => c === BN || c === TAIL || (c >= LRE && c <= PDF);
254
+ /**
255
+ * Resolve the embedding levels of one paragraph (UAX #9 up to I2). `base`
256
+ * is the paragraph direction: `ltr`, `rtl`, or `auto` for the direction of
257
+ * its first strong letter (left to right when it has none). `isolates`
258
+ * sets stretches of the text as directional isolates, as if their bounds
259
+ * held RLI/LRI and PDI controls (the inline `:rtl[…]` and `:ltr[…]`); the
260
+ * text itself may also hold the Unicode controls. A paragraph separator
261
+ * (`B`) ends the embeddings opened before it, as at the end of a paragraph;
262
+ * callers split the text at paragraph breaks first (rule P1).
263
+ */
264
+ export function resolveParagraph(text, base = 'auto', isolates) {
265
+ const classes = classesOf(text);
266
+ const baseLevel = base === 'rtl' ? 1 : base === 'ltr' ? 0 : -1;
267
+ if (!isolates || isolates.length === 0) {
268
+ const { levels, paragraphLevel } = resolveClasses(classes, baseLevel, text, null);
269
+ return { text, paragraphLevel, levels, classes };
270
+ }
271
+ // Insert the isolate controls as virtual characters, resolve, and read
272
+ // the levels of the text's own characters back.
273
+ const opens = [...isolates].filter((s) => s.end >= s.start)
274
+ .sort((a, b) => a.start - b.start || b.end - a.end);
275
+ const closes = [...opens].sort((a, b) => a.end - b.end || b.start - a.start);
276
+ const total = text.length + opens.length * 2;
277
+ const ext = new Uint8Array(total);
278
+ const map = new Int32Array(total);
279
+ let o = 0;
280
+ let c = 0;
281
+ let k = 0;
282
+ for (let i = 0; i <= text.length; i++) {
283
+ while (c < closes.length && closes[c].end === i) {
284
+ ext[k] = PDI;
285
+ map[k++] = -1;
286
+ c++;
287
+ }
288
+ while (o < opens.length && opens[o].start === i) {
289
+ ext[k] = opens[o].direction === 'rtl' ? RLI : LRI;
290
+ map[k++] = -1;
291
+ o++;
292
+ }
293
+ if (i < text.length) {
294
+ ext[k] = classes[i];
295
+ map[k++] = i;
296
+ }
297
+ }
298
+ const resolved = resolveClasses(ext, baseLevel, text, map);
299
+ const levels = new Uint8Array(text.length);
300
+ for (let j = 0; j < total; j++)
301
+ if (map[j] >= 0)
302
+ levels[map[j]] = resolved.levels[j];
303
+ return { text, paragraphLevel: resolved.paragraphLevel, levels, classes };
304
+ }
305
+ /** The chain of isolates a span sits in, outermost first. */
306
+ function isolateChain(d) {
307
+ const chain = [];
308
+ for (let at = d; at; at = at.outer)
309
+ chain.unshift(at);
310
+ return chain;
311
+ }
312
+ /**
313
+ * The isolates of a paragraph's spans (`InlineSpan.direction`, set by
314
+ * `:rtl[…]` and `:ltr[…]`) as ranges of their joined text. Spans of one
315
+ * isolate share its `id`; an isolate nested in another names it as `outer`.
316
+ */
317
+ export function spanIsolates(spans) {
318
+ const out = [];
319
+ const open = [];
320
+ let at = 0;
321
+ const closeTo = (depth) => {
322
+ while (open.length > depth) {
323
+ const top = open.pop();
324
+ out.push({ start: top.start, end: at, direction: top.d.dir });
325
+ }
326
+ };
327
+ for (const span of spans) {
328
+ const chain = isolateChain(span.direction);
329
+ let same = 0;
330
+ while (same < open.length && same < chain.length && open[same].d.id === chain[same].id && open[same].d.dir === chain[same].dir)
331
+ same++;
332
+ closeTo(same);
333
+ for (let i = same; i < chain.length; i++)
334
+ open.push({ d: chain[i], start: at });
335
+ at += span.text.length;
336
+ }
337
+ closeTo(0);
338
+ return out.sort((a, b) => a.start - b.start || b.end - a.end);
339
+ }
340
+ /** {@link resolveParagraph} for a paragraph given as its spans: the text is
341
+ * their texts joined, and their `direction` isolates apply. */
342
+ export function resolveSpans(spans, base = 'auto') {
343
+ let text = '';
344
+ for (const s of spans)
345
+ text += s.text;
346
+ return resolveParagraph(text, base, spanIsolates(spans));
347
+ }
348
+ /**
349
+ * The algorithm proper, on class codes. `text` (with `map` from class
350
+ * positions to text positions, `-1` for a virtual control) gives the code
351
+ * units the paired-bracket rule reads; without it no bracket pairs.
352
+ * @internal Exported for the conformance tests (`BidiTest.txt` lists
353
+ * classes, not characters).
354
+ */
355
+ export function resolveClasses(cls, baseLevel, text, map) {
356
+ const n = cls.length;
357
+ const types = new Uint8Array(cls);
358
+ const levels = new Uint8Array(n);
359
+ // BD9: the PDI matching each isolate initiator, and the reverse.
360
+ const matchPdi = new Int32Array(n).fill(-1);
361
+ const matchInit = new Int32Array(n).fill(-1);
362
+ {
363
+ const stack = new Int32Array(n);
364
+ let sp = 0;
365
+ for (let i = 0; i < n; i++) {
366
+ const c = cls[i];
367
+ if (isIsolateInitiator(c))
368
+ stack[sp++] = i;
369
+ else if (c === PDI && sp > 0) {
370
+ const j = stack[--sp];
371
+ matchPdi[j] = i;
372
+ matchInit[i] = j;
373
+ }
374
+ else if (c === B)
375
+ sp = 0;
376
+ }
377
+ }
378
+ // P2–P3: the first strong letter outside isolates, from `from` to `to`.
379
+ const firstStrong = (from, to) => {
380
+ for (let i = from; i < to; i++) {
381
+ const c = cls[i];
382
+ if (c === L)
383
+ return 0;
384
+ if (c === R || c === AL)
385
+ return 1;
386
+ if (isIsolateInitiator(c)) {
387
+ if (matchPdi[i] < 0)
388
+ return -1;
389
+ i = matchPdi[i];
390
+ }
391
+ else if (c === B)
392
+ return -1;
393
+ }
394
+ return -1;
395
+ };
396
+ const paragraphLevel = baseLevel >= 0 ? baseLevel : firstStrong(0, n) === 1 ? 1 : 0;
397
+ // X1–X8: explicit levels and directions.
398
+ const stLevel = new Uint8Array(MAX_DEPTH + 2);
399
+ const stOverride = new Uint8Array(MAX_DEPTH + 2); // 0 none, else L + 1 or R + 1
400
+ const stIsolate = new Uint8Array(MAX_DEPTH + 2);
401
+ let sp = 1;
402
+ stLevel[0] = paragraphLevel;
403
+ let overflowIsolates = 0;
404
+ let overflowEmbeddings = 0;
405
+ let validIsolates = 0;
406
+ for (let i = 0; i < n; i++) {
407
+ const c = cls[i];
408
+ switch (c) {
409
+ case RLE:
410
+ case LRE:
411
+ case RLO:
412
+ case LRO: {
413
+ const cur = stLevel[sp - 1];
414
+ const next = c === RLE || c === RLO ? (cur + 1) | 1 : (cur + 2) & ~1;
415
+ if (next <= MAX_DEPTH && overflowIsolates === 0 && overflowEmbeddings === 0) {
416
+ stLevel[sp] = next;
417
+ stOverride[sp] = c === LRO ? L + 1 : c === RLO ? R + 1 : 0;
418
+ stIsolate[sp++] = 0;
419
+ }
420
+ else if (overflowIsolates === 0)
421
+ overflowEmbeddings++;
422
+ levels[i] = stLevel[sp - 1];
423
+ break;
424
+ }
425
+ case RLI:
426
+ case LRI:
427
+ case FSI: {
428
+ levels[i] = stLevel[sp - 1];
429
+ if (stOverride[sp - 1])
430
+ types[i] = stOverride[sp - 1] - 1;
431
+ const rtl = c === RLI || (c === FSI && firstStrong(i + 1, matchPdi[i] >= 0 ? matchPdi[i] : n) === 1);
432
+ const cur = stLevel[sp - 1];
433
+ const next = rtl ? (cur + 1) | 1 : (cur + 2) & ~1;
434
+ if (next <= MAX_DEPTH && overflowIsolates === 0 && overflowEmbeddings === 0) {
435
+ validIsolates++;
436
+ stLevel[sp] = next;
437
+ stOverride[sp] = 0;
438
+ stIsolate[sp++] = 1;
439
+ }
440
+ else
441
+ overflowIsolates++;
442
+ break;
443
+ }
444
+ case PDI:
445
+ if (overflowIsolates > 0)
446
+ overflowIsolates--;
447
+ else if (validIsolates > 0) {
448
+ overflowEmbeddings = 0;
449
+ while (!stIsolate[sp - 1])
450
+ sp--;
451
+ sp--;
452
+ validIsolates--;
453
+ }
454
+ levels[i] = stLevel[sp - 1];
455
+ if (stOverride[sp - 1])
456
+ types[i] = stOverride[sp - 1] - 1;
457
+ break;
458
+ case PDF:
459
+ if (overflowIsolates === 0) {
460
+ if (overflowEmbeddings > 0)
461
+ overflowEmbeddings--;
462
+ else if (!stIsolate[sp - 1] && sp >= 2)
463
+ sp--;
464
+ }
465
+ levels[i] = stLevel[sp - 1];
466
+ break;
467
+ case B:
468
+ // X8: a paragraph separator ends every embedding.
469
+ levels[i] = paragraphLevel;
470
+ sp = 1;
471
+ overflowIsolates = overflowEmbeddings = validIsolates = 0;
472
+ break;
473
+ case BN:
474
+ case TAIL:
475
+ levels[i] = stLevel[sp - 1];
476
+ break;
477
+ default:
478
+ levels[i] = stLevel[sp - 1];
479
+ if (stOverride[sp - 1])
480
+ types[i] = stOverride[sp - 1] - 1;
481
+ }
482
+ }
483
+ // The explicit levels, kept: the sequences below read their neighbours'
484
+ // levels before the implicit rules change them.
485
+ const explicit = levels.slice();
486
+ // X9: the characters the rest of the algorithm sees.
487
+ const kept = new Int32Array(n);
488
+ let m = 0;
489
+ for (let i = 0; i < n; i++)
490
+ if (!isRemoved(cls[i]))
491
+ kept[m++] = i;
492
+ // X10: level runs, chained into isolating run sequences across isolates.
493
+ const runStart = [];
494
+ for (let k = 0; k < m; k++)
495
+ if (k === 0 || explicit[kept[k]] !== explicit[kept[k - 1]])
496
+ runStart.push(k);
497
+ const runCount = runStart.length;
498
+ const runOfFirst = new Int32Array(n).fill(-1);
499
+ for (let r = 0; r < runCount; r++)
500
+ runOfFirst[kept[runStart[r]]] = r;
501
+ const runEnd = (r) => (r + 1 < runCount ? runStart[r + 1] : m);
502
+ const seq = new Int32Array(m);
503
+ let brackets = null;
504
+ // Runs already chained into an earlier sequence (opened by a matched PDI).
505
+ const chained = new Uint8Array(runCount);
506
+ for (let r = 0; r < runCount; r++) {
507
+ if (chained[r])
508
+ continue;
509
+ let len = 0;
510
+ let run = r;
511
+ for (;;) {
512
+ const end = runEnd(run);
513
+ for (let k = runStart[run]; k < end; k++)
514
+ seq[len++] = kept[k];
515
+ const last = kept[end - 1];
516
+ if (!isIsolateInitiator(cls[last]) || matchPdi[last] < 0)
517
+ break;
518
+ const next = runOfFirst[matchPdi[last]];
519
+ if (next < 0)
520
+ break;
521
+ chained[next] = 1;
522
+ run = next;
523
+ }
524
+ const level = explicit[seq[0]];
525
+ const firstK = keptIndexOf(kept, m, seq[0]);
526
+ const before = firstK > 0 ? explicit[kept[firstK - 1]] : paragraphLevel;
527
+ const last = seq[len - 1];
528
+ let after = paragraphLevel;
529
+ if (!isIsolateInitiator(cls[last])) {
530
+ const lastK = keptIndexOf(kept, m, last);
531
+ if (lastK + 1 < m)
532
+ after = explicit[kept[lastK + 1]];
533
+ }
534
+ const sos = Math.max(before, level) & 1 ? R : L;
535
+ const eos = Math.max(after, level) & 1 ? R : L;
536
+ if (text !== null && !brackets)
537
+ brackets = { open: new Int32Array(63), want: new Int32Array(63), pairs: [] };
538
+ resolveSequence(seq, len, level, sos, eos, cls, types, levels, text, map, brackets);
539
+ }
540
+ // Removed characters take the level of the character before them.
541
+ for (let i = 0; i < n; i++)
542
+ if (isRemoved(cls[i]))
543
+ levels[i] = i > 0 ? levels[i - 1] : paragraphLevel;
544
+ return { levels, paragraphLevel };
545
+ }
546
+ /** The position of character `i` among the kept ones (binary search). */
547
+ function keptIndexOf(kept, m, i) {
548
+ let lo = 0;
549
+ let hi = m - 1;
550
+ while (lo <= hi) {
551
+ const mid = (lo + hi) >> 1;
552
+ const v = kept[mid];
553
+ if (v < i)
554
+ lo = mid + 1;
555
+ else if (v > i)
556
+ hi = mid - 1;
557
+ else
558
+ return mid;
559
+ }
560
+ return -1;
561
+ }
562
+ /** The direction a resolved type counts as in N0–N1: `EN` and `AN` as `R`;
563
+ * -1 for a neutral. */
564
+ function strongOf(t) {
565
+ if (t === L)
566
+ return L;
567
+ if (t === R || t === EN || t === AN)
568
+ return R;
569
+ return -1;
570
+ }
571
+ const isNeutralOrIsolate = (t) => t === B || t === S || t === WS || t === ON || t === LRI || t === RLI || t === FSI || t === PDI;
572
+ /** Rules W1–I2 on one isolating run sequence (`seq[0..len)`, text
573
+ * positions in order). */
574
+ function resolveSequence(seq, len, level, sos, eos, cls, types, levels, text, map, brackets) {
575
+ // W1: marks take the type of what they follow.
576
+ for (let k = 0; k < len; k++) {
577
+ const i = seq[k];
578
+ if (types[i] !== NSM)
579
+ continue;
580
+ if (k === 0)
581
+ types[i] = sos;
582
+ else {
583
+ const prev = types[seq[k - 1]];
584
+ types[i] = prev === LRI || prev === RLI || prev === FSI || prev === PDI ? ON : prev;
585
+ }
586
+ }
587
+ // W2–W3: European digits after Arabic letters are Arabic; AL is R.
588
+ let strong = sos;
589
+ for (let k = 0; k < len; k++) {
590
+ const i = seq[k];
591
+ const t = types[i];
592
+ if (t === L || t === R || t === AL)
593
+ strong = t;
594
+ else if (t === EN && strong === AL)
595
+ types[i] = AN;
596
+ }
597
+ for (let k = 0; k < len; k++)
598
+ if (types[seq[k]] === AL)
599
+ types[seq[k]] = R;
600
+ // W4: one separator between two numbers of a kind joins them.
601
+ for (let k = 1; k + 1 < len; k++) {
602
+ const i = seq[k];
603
+ const t = types[i];
604
+ if (t !== ES && t !== CS)
605
+ continue;
606
+ const prev = types[seq[k - 1]];
607
+ const next = types[seq[k + 1]];
608
+ if (prev === EN && next === EN)
609
+ types[i] = EN;
610
+ else if (t === CS && prev === AN && next === AN)
611
+ types[i] = AN;
612
+ }
613
+ // W5: terminators next to European digits are digits.
614
+ for (let k = 0; k < len; k++) {
615
+ if (types[seq[k]] !== ET)
616
+ continue;
617
+ let e = k;
618
+ while (e < len && types[seq[e]] === ET)
619
+ e++;
620
+ if ((k > 0 && types[seq[k - 1]] === EN) || (e < len && types[seq[e]] === EN)) {
621
+ for (let j = k; j < e; j++)
622
+ types[seq[j]] = EN;
623
+ }
624
+ k = e - 1;
625
+ }
626
+ // W6: other separators and terminators are neutral.
627
+ for (let k = 0; k < len; k++) {
628
+ const t = types[seq[k]];
629
+ if (t === ES || t === ET || t === CS)
630
+ types[seq[k]] = ON;
631
+ }
632
+ // W7: European digits in left-to-right context are L.
633
+ strong = sos;
634
+ for (let k = 0; k < len; k++) {
635
+ const i = seq[k];
636
+ const t = types[i];
637
+ if (t === L || t === R)
638
+ strong = t;
639
+ else if (t === EN && strong === L)
640
+ types[i] = L;
641
+ }
642
+ const embedding = level & 1 ? R : L;
643
+ // N0: paired brackets take the direction of what they enclose.
644
+ if (text !== null && brackets) {
645
+ if (!bracketOpen)
646
+ bracketTables();
647
+ const { open, want, pairs } = brackets;
648
+ pairs.length = 0;
649
+ let sp = 0;
650
+ for (let k = 0; k < len; k++) {
651
+ const i = seq[k];
652
+ if (types[i] !== ON)
653
+ continue;
654
+ const at = map ? map[i] : i;
655
+ if (at < 0)
656
+ continue;
657
+ const cp = text.charCodeAt(at);
658
+ const closing = bracketOpen.get(cp);
659
+ if (closing !== undefined) {
660
+ if (sp === 63)
661
+ break; // BD16: stack full, no more pairs.
662
+ open[sp] = k;
663
+ want[sp++] = canonicalBracket(closing);
664
+ continue;
665
+ }
666
+ if (!bracketClose.has(cp))
667
+ continue;
668
+ const c = canonicalBracket(cp);
669
+ for (let j = sp - 1; j >= 0; j--) {
670
+ if (want[j] !== c)
671
+ continue;
672
+ pairs.push(open[j], k);
673
+ sp = j;
674
+ break;
675
+ }
676
+ }
677
+ if (pairs.length > 0) {
678
+ // In order of their opening brackets.
679
+ const order = [];
680
+ for (let p = 0; p < pairs.length; p += 2)
681
+ order.push(p);
682
+ order.sort((a, b) => pairs[a] - pairs[b]);
683
+ for (const p of order) {
684
+ const o = pairs[p];
685
+ const c = pairs[p + 1];
686
+ let found = -1;
687
+ for (let k = o + 1; k < c; k++) {
688
+ const s = strongOf(types[seq[k]]);
689
+ if (s < 0)
690
+ continue;
691
+ if (s === embedding) {
692
+ found = embedding;
693
+ break;
694
+ }
695
+ found = s;
696
+ }
697
+ if (found < 0)
698
+ continue;
699
+ let dir = embedding;
700
+ if (found !== embedding) {
701
+ let context = sos;
702
+ for (let k = o - 1; k >= 0; k--) {
703
+ const s = strongOf(types[seq[k]]);
704
+ if (s >= 0) {
705
+ context = s;
706
+ break;
707
+ }
708
+ }
709
+ dir = context === found ? found : embedding;
710
+ }
711
+ types[seq[o]] = dir;
712
+ types[seq[c]] = dir;
713
+ // Marks on a bracket follow it.
714
+ for (let k = o + 1; k < len && cls[seq[k]] === NSM; k++)
715
+ types[seq[k]] = dir;
716
+ for (let k = c + 1; k < len && cls[seq[k]] === NSM; k++)
717
+ types[seq[k]] = dir;
718
+ }
719
+ }
720
+ }
721
+ // N1–N2: neutrals between two of a direction take it, else the
722
+ // embedding direction.
723
+ for (let k = 0; k < len; k++) {
724
+ if (!isNeutralOrIsolate(types[seq[k]]))
725
+ continue;
726
+ let e = k;
727
+ while (e < len && isNeutralOrIsolate(types[seq[e]]))
728
+ e++;
729
+ const lead = k === 0 ? sos : strongOf(types[seq[k - 1]]);
730
+ const trail = e === len ? eos : strongOf(types[seq[e]]);
731
+ const dir = lead === trail ? lead : embedding;
732
+ for (let j = k; j < e; j++)
733
+ types[seq[j]] = dir;
734
+ k = e - 1;
735
+ }
736
+ // I1–I2: implicit levels.
737
+ for (let k = 0; k < len; k++) {
738
+ const i = seq[k];
739
+ const t = types[i];
740
+ if (level & 1) {
741
+ if (t === L || t === EN || t === AN)
742
+ levels[i] = level + 1;
743
+ }
744
+ else if (t === R)
745
+ levels[i] = level + 1;
746
+ else if (t === AN || t === EN)
747
+ levels[i] = level + 2;
748
+ }
749
+ }
750
+ // ---------------------------------------------------------------------------
751
+ // Lines
752
+ /**
753
+ * The levels of one line of a paragraph, `[start, end)` in UTF-16 units,
754
+ * after rule L1: segment and paragraph separators, and the white space and
755
+ * isolate controls before them or at the end of the line, go back to the
756
+ * paragraph level (a space that ends an Arabic line inside an English
757
+ * paragraph sits at the line's right end, not inside the Arabic run).
758
+ * Index 0 of the result is the line's first unit.
759
+ */
760
+ export function lineLevels(par, start = 0, end = par.levels.length) {
761
+ const out = par.levels.slice(start, end);
762
+ const cls = par.classes;
763
+ let trailing = true;
764
+ for (let i = end - 1; i >= start; i--) {
765
+ const c = cls[i];
766
+ if (c === TAIL)
767
+ continue;
768
+ if (c === S || c === B) {
769
+ out[i - start] = par.paragraphLevel;
770
+ trailing = true;
771
+ }
772
+ else if (trailing && (c === WS || c === LRI || c === RLI || c === FSI || c === PDI || isRemoved(c))) {
773
+ out[i - start] = par.paragraphLevel;
774
+ }
775
+ else
776
+ trailing = false;
777
+ }
778
+ // A pair's second unit keeps its first unit's level.
779
+ for (let i = start + 1; i < end; i++)
780
+ if (cls[i] === TAIL)
781
+ out[i - start] = out[i - start - 1];
782
+ return out;
783
+ }
784
+ /**
785
+ * Rule L2 on any sequence of items with levels (characters, or a line's
786
+ * segments with the level of each): the indices of `levels[start..end)`
787
+ * from left to right. Every run at or above each odd level is reversed,
788
+ * from the highest level down.
789
+ */
790
+ export function visualOrder(levels, start = 0, end = levels.length) {
791
+ const order = [];
792
+ let max = 0;
793
+ let minOdd = 255;
794
+ for (let i = start; i < end; i++) {
795
+ order.push(i);
796
+ const lv = levels[i];
797
+ if (lv > max)
798
+ max = lv;
799
+ if (lv & 1 && lv < minOdd)
800
+ minOdd = lv;
801
+ }
802
+ for (let lv = max; lv >= minOdd && lv > 0; lv--) {
803
+ for (let k = 0; k < order.length; k++) {
804
+ if (levels[order[k]] < lv)
805
+ continue;
806
+ let e = k;
807
+ while (e < order.length && levels[order[e]] >= lv)
808
+ e++;
809
+ for (let a = k, b = e - 1; a < b; a++, b--) {
810
+ const t = order[a];
811
+ order[a] = order[b];
812
+ order[b] = t;
813
+ }
814
+ k = e;
815
+ }
816
+ }
817
+ return order;
818
+ }
819
+ /**
820
+ * The characters of one line of a paragraph in visual order, left to right
821
+ * (rules L1 and L2): the index, in the paragraph's text, of each code
822
+ * point's first unit.
823
+ */
824
+ export function lineVisualOrder(par, start = 0, end = par.levels.length) {
825
+ const lv = lineLevels(par, start, end);
826
+ const order = visualOrder(lv);
827
+ const out = [];
828
+ for (const k of order)
829
+ if (par.classes[start + k] !== TAIL)
830
+ out.push(start + k);
831
+ return out;
832
+ }
833
+ /**
834
+ * One line of a paragraph as runs of one level each, in visual order (left
835
+ * to right): what a renderer paints, each run shaped in its own direction
836
+ * (an odd level is right to left). Rules L1 and L2.
837
+ */
838
+ export function lineRuns(par, start = 0, end = par.levels.length) {
839
+ const lv = lineLevels(par, start, end);
840
+ const runs = [];
841
+ for (let i = 0; i < lv.length;) {
842
+ let e = i + 1;
843
+ while (e < lv.length && lv[e] === lv[i])
844
+ e++;
845
+ runs.push({ start: start + i, end: start + e, level: lv[i] });
846
+ i = e;
847
+ }
848
+ const runLevels = runs.map((r) => r.level);
849
+ return visualOrder(runLevels).map((k) => runs[k]);
850
+ }
851
+ //# sourceMappingURL=bidi.js.map