postext 1.8.5 → 1.9.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 (565) hide show
  1. package/dist/__bench__/cjkChapter.bench.test.d.ts +2 -0
  2. package/dist/__bench__/cjkChapter.bench.test.d.ts.map +1 -0
  3. package/dist/__bench__/cjkChapter.bench.test.js +71 -0
  4. package/dist/__bench__/cjkChapter.bench.test.js.map +1 -0
  5. package/dist/__tests__/bundle.test.js +16 -0
  6. package/dist/__tests__/bundle.test.js.map +1 -1
  7. package/dist/__tests__/canvasDirection.test.d.ts +2 -0
  8. package/dist/__tests__/canvasDirection.test.d.ts.map +1 -0
  9. package/dist/__tests__/canvasDirection.test.js +45 -0
  10. package/dist/__tests__/canvasDirection.test.js.map +1 -0
  11. package/dist/__tests__/chineseLocale.test.d.ts +2 -0
  12. package/dist/__tests__/chineseLocale.test.d.ts.map +1 -0
  13. package/dist/__tests__/chineseLocale.test.js +253 -0
  14. package/dist/__tests__/chineseLocale.test.js.map +1 -0
  15. package/dist/__tests__/chineseNumbering.test.d.ts +2 -0
  16. package/dist/__tests__/chineseNumbering.test.d.ts.map +1 -0
  17. package/dist/__tests__/chineseNumbering.test.js +376 -0
  18. package/dist/__tests__/chineseNumbering.test.js.map +1 -0
  19. package/dist/__tests__/cjk/annotations.test.d.ts +2 -0
  20. package/dist/__tests__/cjk/annotations.test.d.ts.map +1 -0
  21. package/dist/__tests__/cjk/annotations.test.js +483 -0
  22. package/dist/__tests__/cjk/annotations.test.js.map +1 -0
  23. package/dist/__tests__/cjk/annotationsRender.test.d.ts +2 -0
  24. package/dist/__tests__/cjk/annotationsRender.test.d.ts.map +1 -0
  25. package/dist/__tests__/cjk/annotationsRender.test.js +263 -0
  26. package/dist/__tests__/cjk/annotationsRender.test.js.map +1 -0
  27. package/dist/__tests__/cjk/composer.test.d.ts +2 -0
  28. package/dist/__tests__/cjk/composer.test.d.ts.map +1 -0
  29. package/dist/__tests__/cjk/composer.test.js +237 -0
  30. package/dist/__tests__/cjk/composer.test.js.map +1 -0
  31. package/dist/__tests__/cjk/composerEdges.test.d.ts +2 -0
  32. package/dist/__tests__/cjk/composerEdges.test.d.ts.map +1 -0
  33. package/dist/__tests__/cjk/composerEdges.test.js +352 -0
  34. package/dist/__tests__/cjk/composerEdges.test.js.map +1 -0
  35. package/dist/__tests__/cjk/dashRule.test.d.ts +2 -0
  36. package/dist/__tests__/cjk/dashRule.test.d.ts.map +1 -0
  37. package/dist/__tests__/cjk/dashRule.test.js +261 -0
  38. package/dist/__tests__/cjk/dashRule.test.js.map +1 -0
  39. package/dist/__tests__/cjk/fuzz.test.d.ts +2 -0
  40. package/dist/__tests__/cjk/fuzz.test.d.ts.map +1 -0
  41. package/dist/__tests__/cjk/fuzz.test.js +102 -0
  42. package/dist/__tests__/cjk/fuzz.test.js.map +1 -0
  43. package/dist/__tests__/cjk/grid.test.d.ts +2 -0
  44. package/dist/__tests__/cjk/grid.test.d.ts.map +1 -0
  45. package/dist/__tests__/cjk/grid.test.js +261 -0
  46. package/dist/__tests__/cjk/grid.test.js.map +1 -0
  47. package/dist/__tests__/cjk/justifyRender.test.d.ts +2 -0
  48. package/dist/__tests__/cjk/justifyRender.test.d.ts.map +1 -0
  49. package/dist/__tests__/cjk/justifyRender.test.js +139 -0
  50. package/dist/__tests__/cjk/justifyRender.test.js.map +1 -0
  51. package/dist/__tests__/cjk/latinFastPath.test.d.ts +2 -0
  52. package/dist/__tests__/cjk/latinFastPath.test.d.ts.map +1 -0
  53. package/dist/__tests__/cjk/latinFastPath.test.js +208 -0
  54. package/dist/__tests__/cjk/latinFastPath.test.js.map +1 -0
  55. package/dist/__tests__/cjk/markCutsLatin.test.d.ts +2 -0
  56. package/dist/__tests__/cjk/markCutsLatin.test.d.ts.map +1 -0
  57. package/dist/__tests__/cjk/markCutsLatin.test.js +69 -0
  58. package/dist/__tests__/cjk/markCutsLatin.test.js.map +1 -0
  59. package/dist/__tests__/cjk/markRuns.test.d.ts +2 -0
  60. package/dist/__tests__/cjk/markRuns.test.d.ts.map +1 -0
  61. package/dist/__tests__/cjk/markRuns.test.js +347 -0
  62. package/dist/__tests__/cjk/markRuns.test.js.map +1 -0
  63. package/dist/__tests__/cjk/punctuation.test.d.ts +2 -0
  64. package/dist/__tests__/cjk/punctuation.test.d.ts.map +1 -0
  65. package/dist/__tests__/cjk/punctuation.test.js +440 -0
  66. package/dist/__tests__/cjk/punctuation.test.js.map +1 -0
  67. package/dist/__tests__/cjk/punctuationRender.test.d.ts +2 -0
  68. package/dist/__tests__/cjk/punctuationRender.test.d.ts.map +1 -0
  69. package/dist/__tests__/cjk/punctuationRender.test.js +135 -0
  70. package/dist/__tests__/cjk/punctuationRender.test.js.map +1 -0
  71. package/dist/__tests__/cjk/rubyDescenders.test.d.ts +2 -0
  72. package/dist/__tests__/cjk/rubyDescenders.test.d.ts.map +1 -0
  73. package/dist/__tests__/cjk/rubyDescenders.test.js +77 -0
  74. package/dist/__tests__/cjk/rubyDescenders.test.js.map +1 -0
  75. package/dist/__tests__/cjk/runt.test.d.ts +2 -0
  76. package/dist/__tests__/cjk/runt.test.d.ts.map +1 -0
  77. package/dist/__tests__/cjk/runt.test.js +103 -0
  78. package/dist/__tests__/cjk/runt.test.js.map +1 -0
  79. package/dist/__tests__/cjk/sharedMarks.test.d.ts +2 -0
  80. package/dist/__tests__/cjk/sharedMarks.test.d.ts.map +1 -0
  81. package/dist/__tests__/cjk/sharedMarks.test.js +347 -0
  82. package/dist/__tests__/cjk/sharedMarks.test.js.map +1 -0
  83. package/dist/__tests__/cjk/uprightDots.test.d.ts +2 -0
  84. package/dist/__tests__/cjk/uprightDots.test.d.ts.map +1 -0
  85. package/dist/__tests__/cjk/uprightDots.test.js +47 -0
  86. package/dist/__tests__/cjk/uprightDots.test.js.map +1 -0
  87. package/dist/__tests__/cjk/wordJoiner.test.d.ts +2 -0
  88. package/dist/__tests__/cjk/wordJoiner.test.d.ts.map +1 -0
  89. package/dist/__tests__/cjk/wordJoiner.test.js +47 -0
  90. package/dist/__tests__/cjk/wordJoiner.test.js.map +1 -0
  91. package/dist/__tests__/cjk/zhuyinTones.test.d.ts +2 -0
  92. package/dist/__tests__/cjk/zhuyinTones.test.d.ts.map +1 -0
  93. package/dist/__tests__/cjk/zhuyinTones.test.js +72 -0
  94. package/dist/__tests__/cjk/zhuyinTones.test.js.map +1 -0
  95. package/dist/__tests__/contentLocale.test.d.ts +2 -0
  96. package/dist/__tests__/contentLocale.test.d.ts.map +1 -0
  97. package/dist/__tests__/contentLocale.test.js +167 -0
  98. package/dist/__tests__/contentLocale.test.js.map +1 -0
  99. package/dist/__tests__/defaults/cjk.test.d.ts +2 -0
  100. package/dist/__tests__/defaults/cjk.test.d.ts.map +1 -0
  101. package/dist/__tests__/defaults/cjk.test.js +70 -0
  102. package/dist/__tests__/defaults/cjk.test.js.map +1 -0
  103. package/dist/__tests__/design/designTextRender.test.js +31 -0
  104. package/dist/__tests__/design/designTextRender.test.js.map +1 -1
  105. package/dist/__tests__/design/imageAltText.test.d.ts +2 -0
  106. package/dist/__tests__/design/imageAltText.test.d.ts.map +1 -0
  107. package/dist/__tests__/design/imageAltText.test.js +126 -0
  108. package/dist/__tests__/design/imageAltText.test.js.map +1 -0
  109. package/dist/__tests__/exports.test.js +61 -0
  110. package/dist/__tests__/exports.test.js.map +1 -1
  111. package/dist/__tests__/headingLetterSpacing.test.js +1 -1
  112. package/dist/__tests__/headingLetterSpacing.test.js.map +1 -1
  113. package/dist/__tests__/indexChinese.test.d.ts +2 -0
  114. package/dist/__tests__/indexChinese.test.d.ts.map +1 -0
  115. package/dist/__tests__/indexChinese.test.js +190 -0
  116. package/dist/__tests__/indexChinese.test.js.map +1 -0
  117. package/dist/__tests__/parse/annotations.test.d.ts +2 -0
  118. package/dist/__tests__/parse/annotations.test.d.ts.map +1 -0
  119. package/dist/__tests__/parse/annotations.test.js +175 -0
  120. package/dist/__tests__/parse/annotations.test.js.map +1 -0
  121. package/dist/__tests__/parse/attrQuoting.test.js +10 -8
  122. package/dist/__tests__/parse/attrQuoting.test.js.map +1 -1
  123. package/dist/__tests__/parse/chineseText.test.d.ts +2 -0
  124. package/dist/__tests__/parse/chineseText.test.d.ts.map +1 -0
  125. package/dist/__tests__/parse/chineseText.test.js +352 -0
  126. package/dist/__tests__/parse/chineseText.test.js.map +1 -0
  127. package/dist/__tests__/parts.test.js +25 -0
  128. package/dist/__tests__/parts.test.js.map +1 -1
  129. package/dist/__tests__/pipeline/colonListRoom.test.js +20 -0
  130. package/dist/__tests__/pipeline/colonListRoom.test.js.map +1 -1
  131. package/dist/__tests__/presets/hongloumeng.test.d.ts +2 -0
  132. package/dist/__tests__/presets/hongloumeng.test.d.ts.map +1 -0
  133. package/dist/__tests__/presets/hongloumeng.test.js +484 -0
  134. package/dist/__tests__/presets/hongloumeng.test.js.map +1 -0
  135. package/dist/__tests__/vertical/canvasPaint.test.d.ts +2 -0
  136. package/dist/__tests__/vertical/canvasPaint.test.d.ts.map +1 -0
  137. package/dist/__tests__/vertical/canvasPaint.test.js +229 -0
  138. package/dist/__tests__/vertical/canvasPaint.test.js.map +1 -0
  139. package/dist/__tests__/vertical/compositionPaint.test.d.ts +2 -0
  140. package/dist/__tests__/vertical/compositionPaint.test.d.ts.map +1 -0
  141. package/dist/__tests__/vertical/compositionPaint.test.js +538 -0
  142. package/dist/__tests__/vertical/compositionPaint.test.js.map +1 -0
  143. package/dist/__tests__/vertical/geometry.test.d.ts +2 -0
  144. package/dist/__tests__/vertical/geometry.test.d.ts.map +1 -0
  145. package/dist/__tests__/vertical/geometry.test.js +276 -0
  146. package/dist/__tests__/vertical/geometry.test.js.map +1 -0
  147. package/dist/__tests__/vertical/htmlSmoke.test.d.ts +2 -0
  148. package/dist/__tests__/vertical/htmlSmoke.test.d.ts.map +1 -0
  149. package/dist/__tests__/vertical/htmlSmoke.test.js +25 -0
  150. package/dist/__tests__/vertical/htmlSmoke.test.js.map +1 -0
  151. package/dist/__tests__/vertical/htmlTurnedCells.test.d.ts +2 -0
  152. package/dist/__tests__/vertical/htmlTurnedCells.test.d.ts.map +1 -0
  153. package/dist/__tests__/vertical/htmlTurnedCells.test.js +99 -0
  154. package/dist/__tests__/vertical/htmlTurnedCells.test.js.map +1 -0
  155. package/dist/__tests__/vertical/htmlVertical.test.d.ts +2 -0
  156. package/dist/__tests__/vertical/htmlVertical.test.d.ts.map +1 -0
  157. package/dist/__tests__/vertical/htmlVertical.test.js +145 -0
  158. package/dist/__tests__/vertical/htmlVertical.test.js.map +1 -0
  159. package/dist/__tests__/vertical/lineAxis.test.d.ts +2 -0
  160. package/dist/__tests__/vertical/lineAxis.test.d.ts.map +1 -0
  161. package/dist/__tests__/vertical/lineAxis.test.js +128 -0
  162. package/dist/__tests__/vertical/lineAxis.test.js.map +1 -0
  163. package/dist/__tests__/vertical/measurePaint.test.d.ts +2 -0
  164. package/dist/__tests__/vertical/measurePaint.test.d.ts.map +1 -0
  165. package/dist/__tests__/vertical/measurePaint.test.js +259 -0
  166. package/dist/__tests__/vertical/measurePaint.test.js.map +1 -0
  167. package/dist/__tests__/vertical/orientation.test.d.ts +2 -0
  168. package/dist/__tests__/vertical/orientation.test.d.ts.map +1 -0
  169. package/dist/__tests__/vertical/orientation.test.js +153 -0
  170. package/dist/__tests__/vertical/orientation.test.js.map +1 -0
  171. package/dist/__tests__/vertical/stub.d.ts +8 -0
  172. package/dist/__tests__/vertical/stub.d.ts.map +1 -0
  173. package/dist/__tests__/vertical/stub.js +37 -0
  174. package/dist/__tests__/vertical/stub.js.map +1 -0
  175. package/dist/__tests__/vertical/tateChuYoko.test.d.ts +2 -0
  176. package/dist/__tests__/vertical/tateChuYoko.test.d.ts.map +1 -0
  177. package/dist/__tests__/vertical/tateChuYoko.test.js +270 -0
  178. package/dist/__tests__/vertical/tateChuYoko.test.js.map +1 -0
  179. package/dist/__tests__/vertical/uprightResources.test.d.ts +2 -0
  180. package/dist/__tests__/vertical/uprightResources.test.d.ts.map +1 -0
  181. package/dist/__tests__/vertical/uprightResources.test.js +182 -0
  182. package/dist/__tests__/vertical/uprightResources.test.js.map +1 -0
  183. package/dist/__tests__/vertical/verticalDesignText.test.d.ts +2 -0
  184. package/dist/__tests__/vertical/verticalDesignText.test.d.ts.map +1 -0
  185. package/dist/__tests__/vertical/verticalDesignText.test.js +190 -0
  186. package/dist/__tests__/vertical/verticalDesignText.test.js.map +1 -0
  187. package/dist/__tests__/vertical/verticalSpans.d.ts +25 -0
  188. package/dist/__tests__/vertical/verticalSpans.d.ts.map +1 -0
  189. package/dist/__tests__/vertical/verticalSpans.js +39 -0
  190. package/dist/__tests__/vertical/verticalSpans.js.map +1 -0
  191. package/dist/__tests__/vertical/verticalTwins.test.d.ts +2 -0
  192. package/dist/__tests__/vertical/verticalTwins.test.d.ts.map +1 -0
  193. package/dist/__tests__/vertical/verticalTwins.test.js +71 -0
  194. package/dist/__tests__/vertical/verticalTwins.test.js.map +1 -0
  195. package/dist/bundle/adapters.d.ts +14 -5
  196. package/dist/bundle/adapters.d.ts.map +1 -1
  197. package/dist/bundle/adapters.js +4 -3
  198. package/dist/bundle/adapters.js.map +1 -1
  199. package/dist/bundle/codec.d.ts.map +1 -1
  200. package/dist/bundle/codec.js +27 -4
  201. package/dist/bundle/codec.js.map +1 -1
  202. package/dist/bundle/index.d.ts +1 -1
  203. package/dist/bundle/index.d.ts.map +1 -1
  204. package/dist/bundle/manifest.d.ts +6 -4
  205. package/dist/bundle/manifest.d.ts.map +1 -1
  206. package/dist/bundle/manifest.js +31 -32
  207. package/dist/bundle/manifest.js.map +1 -1
  208. package/dist/bundle/types.d.ts +7 -2
  209. package/dist/bundle/types.d.ts.map +1 -1
  210. package/dist/canvas-backend/annotations.d.ts +31 -0
  211. package/dist/canvas-backend/annotations.d.ts.map +1 -0
  212. package/dist/canvas-backend/annotations.js +120 -0
  213. package/dist/canvas-backend/annotations.js.map +1 -0
  214. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  215. package/dist/canvas-backend/blockRender.js +195 -15
  216. package/dist/canvas-backend/blockRender.js.map +1 -1
  217. package/dist/canvas-backend/decorations.d.ts +5 -0
  218. package/dist/canvas-backend/decorations.d.ts.map +1 -1
  219. package/dist/canvas-backend/decorations.js +27 -0
  220. package/dist/canvas-backend/decorations.js.map +1 -1
  221. package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
  222. package/dist/canvas-backend/headerFooter.js +32 -16
  223. package/dist/canvas-backend/headerFooter.js.map +1 -1
  224. package/dist/canvas-backend/index.d.ts +2 -0
  225. package/dist/canvas-backend/index.d.ts.map +1 -1
  226. package/dist/canvas-backend/index.js +62 -2
  227. package/dist/canvas-backend/index.js.map +1 -1
  228. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  229. package/dist/canvas-backend/renderResourceBlock.js +42 -5
  230. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  231. package/dist/canvas-backend/segmentText.d.ts +23 -0
  232. package/dist/canvas-backend/segmentText.d.ts.map +1 -0
  233. package/dist/canvas-backend/segmentText.js +41 -0
  234. package/dist/canvas-backend/segmentText.js.map +1 -0
  235. package/dist/canvas-backend/verticalText.d.ts +113 -0
  236. package/dist/canvas-backend/verticalText.d.ts.map +1 -0
  237. package/dist/canvas-backend/verticalText.js +437 -0
  238. package/dist/canvas-backend/verticalText.js.map +1 -0
  239. package/dist/chineseNumerals.d.ts +39 -0
  240. package/dist/chineseNumerals.d.ts.map +1 -0
  241. package/dist/chineseNumerals.js +192 -0
  242. package/dist/chineseNumerals.js.map +1 -0
  243. package/dist/cjkMarks.d.ts +61 -0
  244. package/dist/cjkMarks.d.ts.map +1 -0
  245. package/dist/cjkMarks.js +441 -0
  246. package/dist/cjkMarks.js.map +1 -0
  247. package/dist/columnClip.d.ts +13 -4
  248. package/dist/columnClip.d.ts.map +1 -1
  249. package/dist/columnClip.js +33 -5
  250. package/dist/columnClip.js.map +1 -1
  251. package/dist/configWarnings.d.ts.map +1 -1
  252. package/dist/configWarnings.js +18 -3
  253. package/dist/configWarnings.js.map +1 -1
  254. package/dist/defaults/bodyText.d.ts +4 -1
  255. package/dist/defaults/bodyText.d.ts.map +1 -1
  256. package/dist/defaults/bodyText.js +27 -5
  257. package/dist/defaults/bodyText.js.map +1 -1
  258. package/dist/defaults/calloutStyles.js +1 -1
  259. package/dist/defaults/calloutStyles.js.map +1 -1
  260. package/dist/defaults/captionStyle.d.ts.map +1 -1
  261. package/dist/defaults/captionStyle.js +14 -0
  262. package/dist/defaults/captionStyle.js.map +1 -1
  263. package/dist/defaults/cjk.d.ts +33 -0
  264. package/dist/defaults/cjk.d.ts.map +1 -0
  265. package/dist/defaults/cjk.js +234 -0
  266. package/dist/defaults/cjk.js.map +1 -0
  267. package/dist/defaults/headerFooter.d.ts.map +1 -1
  268. package/dist/defaults/headerFooter.js +2 -0
  269. package/dist/defaults/headerFooter.js.map +1 -1
  270. package/dist/defaults/headingStyles.d.ts.map +1 -1
  271. package/dist/defaults/headingStyles.js +4 -0
  272. package/dist/defaults/headingStyles.js.map +1 -1
  273. package/dist/defaults/headings.d.ts.map +1 -1
  274. package/dist/defaults/headings.js +13 -6
  275. package/dist/defaults/headings.js.map +1 -1
  276. package/dist/defaults/index.d.ts +1 -0
  277. package/dist/defaults/index.d.ts.map +1 -1
  278. package/dist/defaults/index.js +10 -1
  279. package/dist/defaults/index.js.map +1 -1
  280. package/dist/defaults/indexConfig.d.ts +2 -1
  281. package/dist/defaults/indexConfig.d.ts.map +1 -1
  282. package/dist/defaults/indexConfig.js +5 -0
  283. package/dist/defaults/indexConfig.js.map +1 -1
  284. package/dist/defaults/layout.d.ts.map +1 -1
  285. package/dist/defaults/layout.js +7 -0
  286. package/dist/defaults/layout.js.map +1 -1
  287. package/dist/defaults/orderedLists.d.ts +5 -2
  288. package/dist/defaults/orderedLists.d.ts.map +1 -1
  289. package/dist/defaults/orderedLists.js +20 -5
  290. package/dist/defaults/orderedLists.js.map +1 -1
  291. package/dist/defaults/page.d.ts +8 -2
  292. package/dist/defaults/page.d.ts.map +1 -1
  293. package/dist/defaults/page.js +24 -7
  294. package/dist/defaults/page.js.map +1 -1
  295. package/dist/defaults/resourceTypes.d.ts +3 -3
  296. package/dist/defaults/resourceTypes.d.ts.map +1 -1
  297. package/dist/defaults/resourceTypes.js +23 -9
  298. package/dist/defaults/resourceTypes.js.map +1 -1
  299. package/dist/defaults/tableStyle.d.ts.map +1 -1
  300. package/dist/defaults/tableStyle.js +8 -5
  301. package/dist/defaults/tableStyle.js.map +1 -1
  302. package/dist/design/layout.d.ts +33 -0
  303. package/dist/design/layout.d.ts.map +1 -1
  304. package/dist/design/layout.js +124 -18
  305. package/dist/design/layout.js.map +1 -1
  306. package/dist/design/placeholders.d.ts.map +1 -1
  307. package/dist/design/placeholders.js +5 -1
  308. package/dist/design/placeholders.js.map +1 -1
  309. package/dist/design/richText.d.ts +24 -4
  310. package/dist/design/richText.d.ts.map +1 -1
  311. package/dist/design/richText.js +77 -16
  312. package/dist/design/richText.js.map +1 -1
  313. package/dist/html-backend.d.ts.map +1 -1
  314. package/dist/html-backend.js +635 -25
  315. package/dist/html-backend.js.map +1 -1
  316. package/dist/htmlAnnotations.d.ts +29 -0
  317. package/dist/htmlAnnotations.d.ts.map +1 -0
  318. package/dist/htmlAnnotations.js +86 -0
  319. package/dist/htmlAnnotations.js.map +1 -0
  320. package/dist/hyphenate.js +2 -1
  321. package/dist/hyphenate.js.map +1 -1
  322. package/dist/index.d.ts +28 -14
  323. package/dist/index.d.ts.map +1 -1
  324. package/dist/index.js +16 -8
  325. package/dist/index.js.map +1 -1
  326. package/dist/knuthPlass/pretextAdapter.d.ts +4 -1
  327. package/dist/knuthPlass/pretextAdapter.d.ts.map +1 -1
  328. package/dist/knuthPlass/pretextAdapter.js +9 -5
  329. package/dist/knuthPlass/pretextAdapter.js.map +1 -1
  330. package/dist/knuthPlass/richAdapter.d.ts +15 -2
  331. package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
  332. package/dist/knuthPlass/richAdapter.js +16 -6
  333. package/dist/knuthPlass/richAdapter.js.map +1 -1
  334. package/dist/knuthPlass/tracking.d.ts +1 -1
  335. package/dist/knuthPlass/tracking.d.ts.map +1 -1
  336. package/dist/knuthPlass/tracking.js +4 -3
  337. package/dist/knuthPlass/tracking.js.map +1 -1
  338. package/dist/knuthPlass/types.d.ts +3 -0
  339. package/dist/knuthPlass/types.d.ts.map +1 -1
  340. package/dist/lineInk.d.ts +13 -0
  341. package/dist/lineInk.d.ts.map +1 -1
  342. package/dist/lineInk.js +28 -1
  343. package/dist/lineInk.js.map +1 -1
  344. package/dist/locale.d.ts +91 -3
  345. package/dist/locale.d.ts.map +1 -1
  346. package/dist/locale.js +245 -1
  347. package/dist/locale.js.map +1 -1
  348. package/dist/looseLines.d.ts +11 -1
  349. package/dist/looseLines.d.ts.map +1 -1
  350. package/dist/looseLines.js +26 -1
  351. package/dist/looseLines.js.map +1 -1
  352. package/dist/measure/cache.d.ts.map +1 -1
  353. package/dist/measure/cache.js +51 -3
  354. package/dist/measure/cache.js.map +1 -1
  355. package/dist/measure/canvas.d.ts +25 -0
  356. package/dist/measure/canvas.d.ts.map +1 -1
  357. package/dist/measure/canvas.js +90 -1
  358. package/dist/measure/canvas.js.map +1 -1
  359. package/dist/measure/cjk.d.ts +8 -13
  360. package/dist/measure/cjk.d.ts.map +1 -1
  361. package/dist/measure/cjk.js +29 -53
  362. package/dist/measure/cjk.js.map +1 -1
  363. package/dist/measure/cjkAnnotate.d.ts +96 -0
  364. package/dist/measure/cjkAnnotate.d.ts.map +1 -0
  365. package/dist/measure/cjkAnnotate.js +237 -0
  366. package/dist/measure/cjkAnnotate.js.map +1 -0
  367. package/dist/measure/cjkClasses.d.ts +133 -0
  368. package/dist/measure/cjkClasses.d.ts.map +1 -0
  369. package/dist/measure/cjkClasses.js +273 -0
  370. package/dist/measure/cjkClasses.js.map +1 -0
  371. package/dist/measure/cjkCompose.d.ts +86 -0
  372. package/dist/measure/cjkCompose.d.ts.map +1 -0
  373. package/dist/measure/cjkCompose.js +2022 -0
  374. package/dist/measure/cjkCompose.js.map +1 -0
  375. package/dist/measure/cjkPunctuation.d.ts +248 -0
  376. package/dist/measure/cjkPunctuation.d.ts.map +1 -0
  377. package/dist/measure/cjkPunctuation.js +492 -0
  378. package/dist/measure/cjkPunctuation.js.map +1 -0
  379. package/dist/measure/graphemes.d.ts +13 -0
  380. package/dist/measure/graphemes.d.ts.map +1 -0
  381. package/dist/measure/graphemes.js +38 -0
  382. package/dist/measure/graphemes.js.map +1 -0
  383. package/dist/measure/index.d.ts +3 -0
  384. package/dist/measure/index.d.ts.map +1 -1
  385. package/dist/measure/index.js +2 -0
  386. package/dist/measure/index.js.map +1 -1
  387. package/dist/measure/links.d.ts +6 -2
  388. package/dist/measure/links.d.ts.map +1 -1
  389. package/dist/measure/links.js +15 -5
  390. package/dist/measure/links.js.map +1 -1
  391. package/dist/measure/markCuts.d.ts +37 -0
  392. package/dist/measure/markCuts.d.ts.map +1 -0
  393. package/dist/measure/markCuts.js +77 -0
  394. package/dist/measure/markCuts.js.map +1 -0
  395. package/dist/measure/plain.d.ts.map +1 -1
  396. package/dist/measure/plain.js +33 -11
  397. package/dist/measure/plain.js.map +1 -1
  398. package/dist/measure/rich.d.ts +88 -1
  399. package/dist/measure/rich.d.ts.map +1 -1
  400. package/dist/measure/rich.js +233 -111
  401. package/dist/measure/rich.js.map +1 -1
  402. package/dist/measure/rubyLift.d.ts +11 -0
  403. package/dist/measure/rubyLift.d.ts.map +1 -0
  404. package/dist/measure/rubyLift.js +57 -0
  405. package/dist/measure/rubyLift.js.map +1 -0
  406. package/dist/measure/spaces.d.ts +12 -2
  407. package/dist/measure/spaces.d.ts.map +1 -1
  408. package/dist/measure/spaces.js +21 -7
  409. package/dist/measure/spaces.js.map +1 -1
  410. package/dist/measure/types.d.ts +20 -1
  411. package/dist/measure/types.d.ts.map +1 -1
  412. package/dist/measure/types.js.map +1 -1
  413. package/dist/measure/vertical.d.ts +104 -0
  414. package/dist/measure/vertical.d.ts.map +1 -0
  415. package/dist/measure/vertical.js +184 -0
  416. package/dist/measure/vertical.js.map +1 -0
  417. package/dist/numberWords.d.ts +3 -10
  418. package/dist/numberWords.d.ts.map +1 -1
  419. package/dist/numberWords.js +21 -9
  420. package/dist/numberWords.js.map +1 -1
  421. package/dist/numbering.d.ts +23 -5
  422. package/dist/numbering.d.ts.map +1 -1
  423. package/dist/numbering.js +99 -14
  424. package/dist/numbering.js.map +1 -1
  425. package/dist/parse/annotations.d.ts +101 -0
  426. package/dist/parse/annotations.d.ts.map +1 -0
  427. package/dist/parse/annotations.js +556 -0
  428. package/dist/parse/annotations.js.map +1 -0
  429. package/dist/parse/attrs.d.ts +48 -1
  430. package/dist/parse/attrs.d.ts.map +1 -1
  431. package/dist/parse/attrs.js +121 -8
  432. package/dist/parse/attrs.js.map +1 -1
  433. package/dist/parse/blockParser.d.ts.map +1 -1
  434. package/dist/parse/blockParser.js +50 -24
  435. package/dist/parse/blockParser.js.map +1 -1
  436. package/dist/parse/index.d.ts +3 -1
  437. package/dist/parse/index.d.ts.map +1 -1
  438. package/dist/parse/index.js +1 -0
  439. package/dist/parse/index.js.map +1 -1
  440. package/dist/parse/injectSpans.d.ts +3 -1
  441. package/dist/parse/injectSpans.d.ts.map +1 -1
  442. package/dist/parse/injectSpans.js +29 -8
  443. package/dist/parse/injectSpans.js.map +1 -1
  444. package/dist/parse/inlineFormatting.d.ts +38 -6
  445. package/dist/parse/inlineFormatting.d.ts.map +1 -1
  446. package/dist/parse/inlineFormatting.js +139 -26
  447. package/dist/parse/inlineFormatting.js.map +1 -1
  448. package/dist/parse/inlineSnippet.d.ts +2 -1
  449. package/dist/parse/inlineSnippet.d.ts.map +1 -1
  450. package/dist/parse/inlineSnippet.js +6 -2
  451. package/dist/parse/inlineSnippet.js.map +1 -1
  452. package/dist/parse/orientationMarks.d.ts +49 -0
  453. package/dist/parse/orientationMarks.d.ts.map +1 -0
  454. package/dist/parse/orientationMarks.js +138 -0
  455. package/dist/parse/orientationMarks.js.map +1 -0
  456. package/dist/parse/softBreaks.d.ts +56 -0
  457. package/dist/parse/softBreaks.d.ts.map +1 -0
  458. package/dist/parse/softBreaks.js +271 -0
  459. package/dist/parse/softBreaks.js.map +1 -0
  460. package/dist/parse/sourceMapping.d.ts.map +1 -1
  461. package/dist/parse/sourceMapping.js +41 -0
  462. package/dist/parse/sourceMapping.js.map +1 -1
  463. package/dist/parse/types.d.ts +84 -0
  464. package/dist/parse/types.d.ts.map +1 -1
  465. package/dist/pipeline/annotations.d.ts +56 -0
  466. package/dist/pipeline/annotations.d.ts.map +1 -0
  467. package/dist/pipeline/annotations.js +181 -0
  468. package/dist/pipeline/annotations.js.map +1 -0
  469. package/dist/pipeline/build.d.ts.map +1 -1
  470. package/dist/pipeline/build.js +158 -47
  471. package/dist/pipeline/build.js.map +1 -1
  472. package/dist/pipeline/buildBlockKind.d.ts +3 -0
  473. package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
  474. package/dist/pipeline/buildBlockKind.js +5 -3
  475. package/dist/pipeline/buildBlockKind.js.map +1 -1
  476. package/dist/pipeline/buildHelpers.d.ts +36 -6
  477. package/dist/pipeline/buildHelpers.d.ts.map +1 -1
  478. package/dist/pipeline/buildHelpers.js +55 -8
  479. package/dist/pipeline/buildHelpers.js.map +1 -1
  480. package/dist/pipeline/buildMeasurement.d.ts +4 -0
  481. package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
  482. package/dist/pipeline/buildMeasurement.js +3 -1
  483. package/dist/pipeline/buildMeasurement.js.map +1 -1
  484. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  485. package/dist/pipeline/calloutLayout.js +25 -11
  486. package/dist/pipeline/calloutLayout.js.map +1 -1
  487. package/dist/pipeline/cjkGrid.d.ts +133 -0
  488. package/dist/pipeline/cjkGrid.d.ts.map +1 -0
  489. package/dist/pipeline/cjkGrid.js +191 -0
  490. package/dist/pipeline/cjkGrid.js.map +1 -0
  491. package/dist/pipeline/config.d.ts +13 -9
  492. package/dist/pipeline/config.d.ts.map +1 -1
  493. package/dist/pipeline/config.js +43 -18
  494. package/dist/pipeline/config.js.map +1 -1
  495. package/dist/pipeline/contentWarnings.d.ts +10 -0
  496. package/dist/pipeline/contentWarnings.d.ts.map +1 -1
  497. package/dist/pipeline/contentWarnings.js +174 -2
  498. package/dist/pipeline/contentWarnings.js.map +1 -1
  499. package/dist/pipeline/floatPlacement.d.ts +9 -3
  500. package/dist/pipeline/floatPlacement.d.ts.map +1 -1
  501. package/dist/pipeline/floatPlacement.js +17 -6
  502. package/dist/pipeline/floatPlacement.js.map +1 -1
  503. package/dist/pipeline/headerFooter.d.ts +5 -2
  504. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  505. package/dist/pipeline/headerFooter.js +123 -28
  506. package/dist/pipeline/headerFooter.js.map +1 -1
  507. package/dist/pipeline/headingDesignCuts.d.ts.map +1 -1
  508. package/dist/pipeline/headingDesignCuts.js +3 -1
  509. package/dist/pipeline/headingDesignCuts.js.map +1 -1
  510. package/dist/pipeline/headingStyles.d.ts +9 -3
  511. package/dist/pipeline/headingStyles.d.ts.map +1 -1
  512. package/dist/pipeline/headingStyles.js +23 -5
  513. package/dist/pipeline/headingStyles.js.map +1 -1
  514. package/dist/pipeline/indexDirective.d.ts.map +1 -1
  515. package/dist/pipeline/indexDirective.js +64 -20
  516. package/dist/pipeline/indexDirective.js.map +1 -1
  517. package/dist/pipeline/indexGroups.d.ts +55 -0
  518. package/dist/pipeline/indexGroups.d.ts.map +1 -0
  519. package/dist/pipeline/indexGroups.js +151 -0
  520. package/dist/pipeline/indexGroups.js.map +1 -0
  521. package/dist/pipeline/lists.d.ts +17 -0
  522. package/dist/pipeline/lists.d.ts.map +1 -1
  523. package/dist/pipeline/lists.js +43 -51
  524. package/dist/pipeline/lists.js.map +1 -1
  525. package/dist/pipeline/measureContentBlock.d.ts +3 -0
  526. package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
  527. package/dist/pipeline/measureContentBlock.js +31 -4
  528. package/dist/pipeline/measureContentBlock.js.map +1 -1
  529. package/dist/pipeline/outline.d.ts.map +1 -1
  530. package/dist/pipeline/outline.js +13 -8
  531. package/dist/pipeline/outline.js.map +1 -1
  532. package/dist/pipeline/parts.d.ts +6 -3
  533. package/dist/pipeline/parts.d.ts.map +1 -1
  534. package/dist/pipeline/parts.js +28 -5
  535. package/dist/pipeline/parts.js.map +1 -1
  536. package/dist/pipeline/placeholders.d.ts +11 -0
  537. package/dist/pipeline/placeholders.d.ts.map +1 -1
  538. package/dist/pipeline/placeholders.js +48 -18
  539. package/dist/pipeline/placeholders.js.map +1 -1
  540. package/dist/pipeline/placement.d.ts +10 -6
  541. package/dist/pipeline/placement.d.ts.map +1 -1
  542. package/dist/pipeline/placement.js +33 -16
  543. package/dist/pipeline/placement.js.map +1 -1
  544. package/dist/pipeline/resourceLayout.d.ts +18 -1
  545. package/dist/pipeline/resourceLayout.d.ts.map +1 -1
  546. package/dist/pipeline/resourceLayout.js +109 -21
  547. package/dist/pipeline/resourceLayout.js.map +1 -1
  548. package/dist/pipeline/toc.d.ts.map +1 -1
  549. package/dist/pipeline/toc.js +6 -5
  550. package/dist/pipeline/toc.js.map +1 -1
  551. package/dist/pipeline/verticalMetrics.d.ts +14 -0
  552. package/dist/pipeline/verticalMetrics.d.ts.map +1 -0
  553. package/dist/pipeline/verticalMetrics.js +154 -0
  554. package/dist/pipeline/verticalMetrics.js.map +1 -0
  555. package/dist/types.d.ts +344 -13
  556. package/dist/types.d.ts.map +1 -1
  557. package/dist/vdt.d.ts +396 -6
  558. package/dist/vdt.d.ts.map +1 -1
  559. package/dist/vdt.js +49 -0
  560. package/dist/vdt.js.map +1 -1
  561. package/dist/writingMode.d.ts +156 -0
  562. package/dist/writingMode.d.ts.map +1 -0
  563. package/dist/writingMode.js +291 -0
  564. package/dist/writingMode.js.map +1 -0
  565. package/package.json +1 -1
@@ -7,8 +7,12 @@ import { buildPageLabels, computeHeadingNumbering, parseNumberFormat, } from '..
7
7
  import { extractFrontmatter, normalizeMetadata } from '../frontmatter';
8
8
  import { collectConfigWarnings } from '../configWarnings';
9
9
  import { initHyphenator } from '../measure';
10
+ import { getCjkLineBreak, setCjkLineBreak } from '../measure/cjkClasses';
11
+ import { cjkCompositionOf, getCjkComposition, setCjkComposition } from '../measure/cjkPunctuation';
12
+ import { getMeasureRegion, getMeasureUprightDigits, getMeasureWritingMode, setMeasureUprightDigits, setMeasureWritingMode } from '../measure/vertical';
13
+ import { stampCentralBaselines } from './verticalMetrics';
10
14
  import { resolveAllConfig, computeBaselineGrid, resolvedLocale } from './config';
11
- import { createHeadingLevelResolver, deriveSectionGeometryConfig, deriveSectionMeasureContext, headingIsHidden, headingIsNumbered, headingMarksFor, headingStyleOf, planHeadingSections, } from './headingStyles';
15
+ import { createHeadingLevelResolver, deriveSectionGeometryConfig, sectionWritingMode, deriveSectionMeasureContext, headingIsHidden, headingIsNumbered, headingMarksFor, headingStyleOf, planHeadingSections, } from './headingStyles';
12
16
  import { computeOutline, hasIndexDirective, hasTocDirective, headingNumberingOptions, headingTemplatesOf, outlineFromDoc, sameOutline } from './outline';
13
17
  import { expandTocDirectives } from './toc';
14
18
  import { expandIndexDirectives, locateIndexMarks } from './indexDirective';
@@ -16,7 +20,7 @@ import { resolveBodyStyle, resolveBlockquoteStyle, resolveParagraphStyle } from
16
20
  import { computeLevelIndentsPx, computeOrderedLevelIndentsPx, computeOrderedListRunMetrics, listBulletPosition, listItemGapPx, listItemSpacingPx, } from './lists';
17
21
  import { resetLinePositions, createPageWithColumns, currentColumn, advanceToNextColumn, advanceToNextPageBoundary, enforcePageParity, placeBlockInColumn, placeAtomicBlock, createPartPage, pageHasContent, sideColumnOf, sideColumns, sideUsedBottom, pageIsOccupied, bandColumns, currentBand, isBandLevel, bandUsedBottom, closeBandAndInsertSpan, pageLayoutOf, } from './placement';
18
22
  import { chooseParagraphSplit } from './orphanWidow';
19
- import { applyStyleAttrs, computePageMetrics, isMarkerBlock, nextNonMarkerBlock, spaceLinesAfter, prevNonMarkerBlock, rollbackTrailingBlocks, } from './buildHelpers';
23
+ import { applyStyleAttrs, computePageMetrics, pageMirrored, sheetRectToFlow, isMarkerBlock, nextNonMarkerBlock, spaceLinesAfter, prevNonMarkerBlock, rollbackTrailingBlocks, } from './buildHelpers';
20
24
  import { measureContentBlock } from './measureContentBlock';
21
25
  import { planParagraphContainers } from './paragraphContainers';
22
26
  import { appendChapterEndNotes, footnoteIdsOfLines, footnoteParagraphStyle, noteContentBlock, numberFootnotes, splitFootnoteDefinitions, withFootnoteStyle, } from './footnotes';
@@ -34,7 +38,9 @@ import { chapterNumberCounter, leadingBoldText } from './placeholders';
34
38
  import { proposeBalanceLines, collectColumnGaps, firstDivergentColumn, gapLinesIn, boxRoomIn, boxLeverKeys, pageSegments, MAX_BALANCING_PASSES, MAX_BALANCING_PASSES_PER_DOCUMENT, balanceKey } from './columnBalancing';
35
39
  import { applyBandCap, uncapBand, columnBottom, bandCapLines, bandTop, bareBandTop, resolveBandCapsGen, drainPasses, resolveTrailingCapsGen, bandCapLinesAroundZone, } from './bandCaps';
36
40
  import { raggedLooseLines } from './raggedLines';
37
- import { collectContentWarnings, locateContentWarnings } from './contentWarnings';
41
+ import { cjkLooseLineWarnings, collectContentWarnings, locateContentWarnings } from './contentWarnings';
42
+ import { annotateDocument } from '../cjkMarks';
43
+ import { withBookTitleBrackets } from './annotations';
38
44
  /** Tolerance for "does this block fit" checks against a column's free
39
45
  * height, absorbing floating-point drift between grid multiples. */
40
46
  const FIT_EPS = 0.01;
@@ -109,7 +115,9 @@ function measureLooseParagraph(rawBlock, blockIdx, columnWidth, ctx, styleOverri
109
115
  const optimum = measureContentBlock(rawBlock, blockIdx, columnWidth, ctx, { styleOverride, looseness: 0 });
110
116
  const looseness = optimum ? target - optimum.measured.lines.length : extraLines;
111
117
  const maxWordSpacing = ctx.resolved.bodyText.maxWordSpacing + 1e-9;
112
- const withinLimit = (lines) => lines.every((l) => l.isLastLine || l.justifiedSpaceRatio === undefined || l.justifiedSpaceRatio <= maxWordSpacing);
118
+ // A CJK line spread past its tracking cap (`cjkLoose`) is past the
119
+ // limit too.
120
+ const withinLimit = (lines) => lines.every((l) => l.isLastLine || ((l.justifiedSpaceRatio === undefined || l.justifiedSpaceRatio <= maxWordSpacing) && !l.cjkLoose));
113
121
  for (const tracking of trackingLadder) {
114
122
  const loose = measureContentBlock(rawBlock, blockIdx, columnWidth, ctx, {
115
123
  styleOverride,
@@ -138,6 +146,26 @@ function measureLooseParagraph(rawBlock, blockIdx, columnWidth, ctx, styleOverri
138
146
  * @internal Exposed for tests only; use `buildDocument`.
139
147
  */
140
148
  export function buildDocumentPass(content, config, cache, options, hints = {}) {
149
+ // A pass sets the CJK line-break level, the CJK composition and the
150
+ // writing mode text is measured in for its own measuring; what the caller had in force is put
151
+ // back when it ends, also when it throws (a cancelled build), so text
152
+ // measured outside a build reads as it did before it.
153
+ const lineBreak = getCjkLineBreak();
154
+ const composition = getCjkComposition();
155
+ const writingMode = getMeasureWritingMode();
156
+ const region = getMeasureRegion();
157
+ const uprightDigits = getMeasureUprightDigits();
158
+ try {
159
+ return placeDocumentPass(content, config, cache, options, hints);
160
+ }
161
+ finally {
162
+ setCjkLineBreak(lineBreak);
163
+ setCjkComposition(composition);
164
+ setMeasureWritingMode(writingMode, region);
165
+ setMeasureUprightDigits(uprightDigits);
166
+ }
167
+ }
168
+ function placeDocumentPass(content, config, cache, options, hints) {
141
169
  const { balanceExtraPx, balanceLooseness, balanceLooseBudget, bandCaps, captionUnder } = hints;
142
170
  const captionUnderProposals = new Set();
143
171
  /** Side columns whose foot a figure's side caption has cut, by the figure. */
@@ -170,6 +198,18 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
170
198
  // syllable even in ragged text. Left unset, a build would hyphenate with
171
199
  // whichever dictionary the previous one (or the default, en-us) chose.
172
200
  initHyphenator(resolved.bodyText.hyphenation.locale);
201
+ // CJK text breaks at the document's level wherever it is measured (body,
202
+ // captions, cells, notes, boxes), as it hyphenates in its language.
203
+ setCjkLineBreak(resolved.cjk.lineBreak);
204
+ // And is composed with the document's punctuation widths, hanging and
205
+ // Han–Latin space (along the line in either writing mode), in its
206
+ // language.
207
+ setCjkComposition(cjkCompositionOf(resolved.cjk, resolved.page.dpi, resolvedLocale(resolved)));
208
+ // Characters of a vertical flow that stand in a cell advance by it (half
209
+ // an em for the mainland interpunct).
210
+ setMeasureWritingMode(resolved.layout.writingMode, resolved.cjk.region);
211
+ // Short numbers set in one upright cell (`cjk.uprightDigits`).
212
+ setMeasureUprightDigits(resolved.cjk.uprightDigits);
173
213
  // Compute baseline grid
174
214
  const baselineGrid = computeBaselineGrid(resolved);
175
215
  // Create document
@@ -201,9 +241,21 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
201
241
  // styled section with its own margins / layout — the section's.
202
242
  let contentArea = pageMetrics.contentArea;
203
243
  let geomResolved = resolved;
204
- // Page/bleed frames for design elements anchored to `'page'` / `'bleed'`.
205
- const designFrames = { page: pageMetrics.trimBox, bleed: pageMetrics.bleedBox };
244
+ // Page/bleed frames for design elements anchored to `'page'` / `'bleed'`,
245
+ // in the frame of the page's flow: the sheet's, or on a vertical page
246
+ // (`page.flow`) the flow frame, where "the top of the page" is the
247
+ // sheet's right edge.
248
+ const physicalFrames = { page: pageMetrics.physical.trimBox, bleed: pageMetrics.physical.bleedBox };
249
+ const verticalFrames = {
250
+ page: sheetRectToFlow(pageMetrics.physical.trimBox, pageWidthPx),
251
+ bleed: sheetRectToFlow(pageMetrics.physical.bleedBox, pageWidthPx),
252
+ upright: true,
253
+ };
254
+ const designFramesOn = (page) => (page?.flow ? verticalFrames : physicalFrames);
206
255
  doc.trimOffset = trimOffset;
256
+ // A right-bound book (`page.binding`): hosts show its spreads mirrored.
257
+ if (resolved.page.binding === 'right')
258
+ doc.binding = 'right';
207
259
  // Create first page
208
260
  const firstPage = createPageWithColumns(0, resolved, contentArea, pageWidthPx, pageHeightPx, pageIndexOffset);
209
261
  doc.pages.push(firstPage);
@@ -289,7 +341,11 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
289
341
  // chapter already numbered (`continuation.resourceNumbers`) was placed
290
342
  // there: here it is only referred to, never floated again.
291
343
  const incorporated = new Set(Object.keys(continuation?.resourceNumbers ?? {}));
292
- const floatPlan = computeFloatPlan(contentBlocks, resources, resourceTypes, incorporated);
344
+ // A resource first referred to in a vertical flow stands upright: a turn
345
+ // it asks for is not applied there. Decided per block, by the writing
346
+ // mode of the styled section the reference sits in (a horizontal
347
+ // appendix of a vertical book turns its figures as asked).
348
+ const floatPlan = computeFloatPlan(contentBlocks, resources, resourceTypes, incorporated, (blockIdx) => sectionWritingMode(sectionPlan, resolved, blockIdx) === 'vertical-rl');
293
349
  const floatedIds = floatedResourceIds(floatPlan, incorporated, resources, resourceTypes);
294
350
  const floatsByFirstBlock = new Map();
295
351
  for (const f of floatPlan) {
@@ -554,7 +610,7 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
554
610
  }
555
611
  }
556
612
  };
557
- const rotationKey = (rotated) => rotated ? `:${rotated.direction}${rotated.length.toFixed(2)}` : '';
613
+ const rotationKey = (rotated) => rotated ? `:${rotated.direction}${rotated.length.toFixed(2)}${rotated.upright ? 'u' : ''}` : '';
558
614
  const asideKey = (a) => (a ? `:aside${a.dx.toFixed(1)}x${a.width.toFixed(1)}${a.alignBottom ? 'b' : 't'}${(a.offsetY ?? 0).toFixed(1)}` : '');
559
615
  const layoutFloat = (resourceId, width, slice, rotated, aside) => {
560
616
  const resource = resourceById.get(resourceId);
@@ -570,16 +626,26 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
570
626
  resourceTypes,
571
627
  resources,
572
628
  ...(slice ? { slice } : {}),
573
- ...(rotated ? { rotate: rotated.direction, rotatedLength: rotated.length } : {}),
629
+ ...(rotated ? (rotated.upright ? { upright: { maxLength: rotated.length } } : { rotate: rotated.direction, rotatedLength: rotated.length }) : {}),
574
630
  ...(aside ? { captionAside: aside } : {}),
575
631
  });
576
632
  };
577
633
  /** The rotation of a pending float on a band whose columns keep `avail`
578
634
  * px: the upright frame is as long as the grid multiple within that
579
635
  * room, less the float gap, so the band it takes is `avail` at most. */
580
- const rotationFor = (f, avail) => f.rotate
581
- ? { direction: f.rotate, length: Math.max(1, Math.floor((avail + 0.01) / baselineGrid) * baselineGrid - floatGapPx) }
582
- : undefined;
636
+ const rotationFor = (f, avail, page) => page?.flow
637
+ ? uprightOn(page)
638
+ : f.rotate
639
+ ? { direction: f.rotate, length: Math.max(1, Math.floor((avail + 0.01) / baselineGrid) * baselineGrid - floatGapPx) }
640
+ : undefined;
641
+ /** A resource on a vertical page stands upright: its frame at most as
642
+ * wide as the page's flow is tall (the content area's width on the
643
+ * sheet), the float gap kept. */
644
+ const uprightOn = (page) => ({
645
+ direction: 'ccw',
646
+ length: Math.max(1, Math.floor((page.contentArea.height + 0.01) / baselineGrid) * baselineGrid - floatGapPx),
647
+ upright: true,
648
+ });
583
649
  /** Row count of a table resource (0 for anything else). */
584
650
  const tableRowCount = (resourceId) => resourceById.get(resourceId)?.table?.model.rows.length ?? 0;
585
651
  /** What a table resource does when taller than the page — its own
@@ -660,7 +726,9 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
660
726
  * when the resource id is unknown. Caller offsets it to its final `y`. */
661
727
  const buildFloatBlock = (resourceId, x, width, slice, rotated,
662
728
  /** A rotated block sits flush to the band's right edge (the spine of a
663
- * verso page) instead of its left. */
729
+ * verso page) instead of its left; a number is the share of the room
730
+ * left over set before it (an upright block of a vertical page, set
731
+ * per `placement.align` along its tier). */
664
732
  flushEnd = false, aside,
665
733
  /** The page is a verso of mirrored margins (a floated box's `'outer'`
666
734
  * corner icon hangs on the left there). */
@@ -688,7 +756,8 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
688
756
  // top-left lands at the bottom-left of the block, for a clockwise one
689
757
  // at its top-right (see `resourceBlockToPage`).
690
758
  const used = Math.min(rb.rotation.height, width);
691
- const left = x + (flushEnd ? Math.max(0, width - used) : 0);
759
+ const share = typeof flushEnd === 'number' ? flushEnd : flushEnd ? 1 : 0;
760
+ const left = x + (share > 0 ? Math.max(0, width - used) * share : 0);
692
761
  rb.rotation.originX = rb.rotation.direction === 'ccw' ? left : left + used;
693
762
  rb.rotation.originY = rb.rotation.direction === 'ccw' ? totalHeight : 0;
694
763
  }
@@ -698,8 +767,9 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
698
767
  return { block: blk, height: totalHeight };
699
768
  };
700
769
  /** Whether a rotated float on `page` sits flush to the band's right edge:
701
- * with mirrored margins the spine of a verso (even-numbered) page. */
702
- const rotatedFlushEnd = (page) => !!resolved.page.margins.mirror && (page.index + pageIndexOffset) % 2 === 1;
770
+ * with mirrored margins the spine of a page whose spine is on its right
771
+ * (a verso of a left-bound book, a recto of a right-bound one). */
772
+ const rotatedFlushEnd = (page) => pageMirrored(resolved, page.index, pageIndexOffset);
703
773
  /** Float bands reserved per column in this pass (the fresh-page flush
704
774
  * sends single-column floats to the least reserved column). */
705
775
  const floatReserved = new Map();
@@ -846,8 +916,9 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
846
916
  const alignK = f.align === 'center' ? 0.5 : f.align === 'right' ? 1 : 0;
847
917
  const xLeft = slotX + (slotWidth - width) * alignK;
848
918
  const slice = sliceOf(f);
849
- // A side float never turns: it stacks upright in the side column.
850
- const rotated = side ? undefined : rotationFor(f, Math.min(...targetCols.map((c) => c.availableHeight)));
919
+ // A side float never turns: it stacks upright in the side column (on a
920
+ // vertical page it is counter-rotated to stand upright there too).
921
+ const rotated = side && !page.flow ? undefined : rotationFor(f, Math.min(...targetCols.map((c) => c.availableHeight)), page);
851
922
  // The caption beside the figure, in the band's side column.
852
923
  let aside;
853
924
  let sideCol;
@@ -983,7 +1054,7 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
983
1054
  if (cutBy !== undefined)
984
1055
  captionUnderProposals.add(cutBy);
985
1056
  }
986
- const built = buildFloatBlock(f.resourceId, xLeft, width, slice);
1057
+ const built = buildFloatBlock(f.resourceId, xLeft, width, slice, rotated);
987
1058
  if (!built)
988
1059
  return 'skip';
989
1060
  first.availableHeight = Math.max(0, first.availableHeight - need);
@@ -1057,13 +1128,13 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
1057
1128
  return 'defer';
1058
1129
  if (tableOverflow(f.resourceId) !== 'split')
1059
1130
  return 'defer';
1060
- const split = splitTableFloat(f, width, position, targetCols, page.contentArea, c.availableHeight - (hasBand ? minTextPx : 0), 'strict');
1131
+ const split = splitTableFloat(f, width, position, targetCols, page.contentArea, c.availableHeight - (hasBand ? minTextPx : 0), 'strict', rotated);
1061
1132
  if (!split || split === 'none' || split === 'skip')
1062
1133
  return 'defer';
1063
1134
  slice = split.slice;
1064
1135
  rest = split.rest;
1065
1136
  cut = true;
1066
- const m = measureFloat(f.resourceId, width, slice);
1137
+ const m = measureFloat(f.resourceId, width, slice, rotated);
1067
1138
  if (!m)
1068
1139
  return 'skip';
1069
1140
  measure = m;
@@ -1093,7 +1164,10 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
1093
1164
  if (rest) {
1094
1165
  rest = { ...rest, notBefore: { pageIndex: page.index, columnIndex: targetCols[targetCols.length - 1].index } };
1095
1166
  }
1096
- const built = buildFloatBlock(f.resourceId, xLeft, width, slice, rotated, rotated ? rotatedFlushEnd(page) : false, aside, mirroredOf(page));
1167
+ // An upright figure of a vertical page stands at the head of its tier
1168
+ // (`placement.align`: `left` the top, `center`, `right` the foot).
1169
+ const flush = rotated?.upright ? (f.align === 'center' ? 0.5 : f.align === 'right' ? 1 : 0) : rotated ? rotatedFlushEnd(page) : false;
1170
+ const built = buildFloatBlock(f.resourceId, xLeft, width, slice, rotated, flush, aside, mirroredOf(page));
1097
1171
  if (!built)
1098
1172
  return 'skip';
1099
1173
  // The caption beside the figure takes its band of the side column: a
@@ -1797,6 +1871,7 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
1797
1871
  currentSection = style;
1798
1872
  geomResolved = style ? deriveSectionGeometryConfig(resolved, style) : resolved;
1799
1873
  contentArea = geomResolved === resolved ? pageMetrics.contentArea : computePageMetrics(geomResolved).contentArea;
1874
+ setMeasureWritingMode(geomResolved.layout.writingMode);
1800
1875
  // A page still empty takes the geometry right away — the document (or
1801
1876
  // a chapter laid out on its own) opening with a styled heading.
1802
1877
  const page = doc.pages[cursor.pageIndex];
@@ -1827,7 +1902,7 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
1827
1902
  // a resource keeps the printed text, whose `:ref` label the source
1828
1903
  // does not hold.
1829
1904
  if (headingLevels.forBlock(raw)?.textTransform === 'uppercase' && !raw.spans.some((s) => s.ref)) {
1830
- blk.sourceTitle = flattenTitleBreaks(raw.text);
1905
+ blk.sourceTitle = flattenTitleBreaks(withBookTitleBrackets(raw.text, raw.spans, resolved.cjk).text);
1831
1906
  }
1832
1907
  }
1833
1908
  if (raw.footnoteNote !== undefined)
@@ -2015,7 +2090,7 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
2015
2090
  const side = sideColumnOf(page, currentBand(page, cursor));
2016
2091
  if (!side || side.bbox.height <= 0.5)
2017
2092
  return;
2018
- const boxes = headingDesignBoxes(design.lvl, design.info, blk.bbox, resolved.page.dpi, doc.metadata, cursor.pageIndex, designFrames, resourceById);
2093
+ const boxes = headingDesignBoxes(design.lvl, design.info, blk.bbox, resolved.page.dpi, doc.metadata, cursor.pageIndex, designFramesOn(page), resourceById);
2019
2094
  const top = side.bbox.y;
2020
2095
  const foot = side.bbox.y + side.bbox.height;
2021
2096
  const left = side.bbox.x;
@@ -2428,9 +2503,11 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
2428
2503
  };
2429
2504
  return { children, childBase: startIdx + 1, realAt, end: { child: children.length, line: 0 }, layoutRange, groups };
2430
2505
  };
2431
- /** Whether a page is a verso of mirrored margins (an `'outer'` corner
2432
- * icon hangs on the left there). */
2433
- const mirroredOf = (page) => resolved.page.margins.mirror === true && (page.index + pageIndexOffset + 1) % 2 === 0;
2506
+ /** Whether a page swaps its mirrored margins (a verso of a left-bound
2507
+ * book, a recto of a right-bound one: an `'outer'` corner icon hangs on
2508
+ * the left there). A vertical page has no outer side: a box's outer
2509
+ * corner stays where the style puts it. */
2510
+ const mirroredOf = (page) => !page.flow && pageMirrored(resolved, page.index, pageIndexOffset);
2434
2511
  /** Where a block's paint ends: its last line's foot (a list tail's box
2435
2512
  * bakes its bottom margin in and may reach past a cut with every line
2436
2513
  * inside it), else its box's. */
@@ -2694,7 +2771,9 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
2694
2771
  }
2695
2772
  const width = page.contentArea.width;
2696
2773
  const slice = sliceOf(f);
2697
- const measure = measureFloat(f.resourceId, width, slice);
2774
+ // On a vertical page the figure stands upright.
2775
+ const upright = page.flow ? uprightOn(page) : undefined;
2776
+ const measure = measureFloat(f.resourceId, width, slice, upright);
2698
2777
  if (!measure) {
2699
2778
  i++;
2700
2779
  continue;
@@ -2707,7 +2786,7 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
2707
2786
  i++;
2708
2787
  continue;
2709
2788
  }
2710
- const built = buildFloatBlock(f.resourceId, page.contentArea.x, width, slice);
2789
+ const built = buildFloatBlock(f.resourceId, page.contentArea.x, width, slice, upright);
2711
2790
  if (!built) {
2712
2791
  i++;
2713
2792
  continue;
@@ -3052,8 +3131,8 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
3052
3131
  const snapUp = (page, v) => page.contentArea.y + Math.ceil((v - page.contentArea.y - 0.01) / baselineGrid) * baselineGrid;
3053
3132
  /** The box laid out for `page` and the zone it takes there. */
3054
3133
  const zoneOn = (page) => {
3055
- const ref = anchor.to === 'page' ? designFrames.page
3056
- : anchor.to === 'bleed' ? designFrames.bleed
3134
+ const ref = anchor.to === 'page' ? designFramesOn(page).page
3135
+ : anchor.to === 'bleed' ? designFramesOn(page).bleed
3057
3136
  : page.contentArea;
3058
3137
  const band = cursor.pageIndex === page.index ? currentBand(page, cursor) : 0;
3059
3138
  const cols = bandColumns(page, band).filter((c) => c.bbox.height > 0.5);
@@ -3667,9 +3746,9 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
3667
3746
  }
3668
3747
  else if (name === 'numbering') {
3669
3748
  const change = {};
3670
- // Any spelling of a format (`roman-lower`, `arabic`, `i`…); an
3671
- // unknown one keeps the current format.
3672
- const fmt = parseNumberFormat(attrs.format);
3749
+ // Any spelling of a format (`roman-lower`, `arabic`, `i`…, `一` in
3750
+ // the document's script); an unknown one keeps the current format.
3751
+ const fmt = parseNumberFormat(attrs.format, resolvedLocale(resolved));
3673
3752
  if (fmt)
3674
3753
  change.format = fmt;
3675
3754
  if (attrs.startAt !== undefined) {
@@ -3901,9 +3980,15 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
3901
3980
  const measureWidth = rawBlock.type === 'heading' && opensDefaultOpener(rawBlock)
3902
3981
  ? doc.pages[cursor.pageIndex].contentArea.width
3903
3982
  : col.bbox.width;
3983
+ // A resource on a vertical page stands upright, its frame at most as
3984
+ // wide as the flow is tall (less the float gap it keeps).
3985
+ const blockPage = doc.pages[cursor.pageIndex];
3986
+ const upright = blockPage.flow && rawBlock.type === 'resourceBlock'
3987
+ ? { uprightMaxLength: uprightOn(blockPage).length }
3988
+ : {};
3904
3989
  let measuredBlock = tryLoose
3905
3990
  ? measureLooseParagraph(rawBlock, blockIdx, col.bbox.width, blockMeasureCtx, styleOverride, looseLines, trackingLadder, looseOutcome)
3906
- : measureContentBlock(rawBlock, blockIdx, measureWidth, blockMeasureCtx, { styleOverride });
3991
+ : measureContentBlock(rawBlock, blockIdx, measureWidth, blockMeasureCtx, { styleOverride, ...upright });
3907
3992
  // Screen pages (`layout.fitFiguresToPage`): an inline figure a little
3908
3993
  // too tall for the room left in its column — under an opener band, say
3909
3994
  // — is set smaller to stay with its text rather than leave the rest of
@@ -3945,7 +4030,7 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
3945
4030
  /** Tracking the block's lines are set with; a paragraph moved whole into
3946
4031
  * a column of another width is measured again, and may change it. */
3947
4032
  let { letterSpacingPx } = measuredBlock;
3948
- const { vdtType, headingLevel, numberPrefix, headingNumber, listBullet, listDepth, listKind, bulletXOffsetInColumn, strikethroughText } = kind;
4033
+ const { vdtType, headingLevel, numberPrefix, numberSeparator, headingNumber, listBullet, listDepth, listKind, bulletXOffsetInColumn, strikethroughText } = kind;
3949
4034
  // A structural heading (`hidden`) is placed like any heading — its
3950
4035
  // break, keep-with-next and grid snap apply — but with no line height
3951
4036
  // and no margins: it takes no room, and renderers skip it.
@@ -4032,6 +4117,10 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
4032
4117
  blk.separatorFontString = listBullet.separatorFontString;
4033
4118
  blk.separatorColor = listBullet.separatorColor;
4034
4119
  blk.separatorX = blk.bulletOffsetX + (listBullet.separatorOffsetPx ?? 0);
4120
+ if (listBullet.prefixText !== undefined) {
4121
+ blk.prefixText = listBullet.prefixText;
4122
+ blk.prefixX = blk.bulletOffsetX + (listBullet.prefixOffsetPx ?? 0);
4123
+ }
4035
4124
  }
4036
4125
  if (strikethroughText)
4037
4126
  blk.strikethroughText = true;
@@ -4118,14 +4207,15 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
4118
4207
  ...extra,
4119
4208
  });
4120
4209
  // "Keep with next" for colon-introduced lists: a paragraph ending in `:`
4121
- // followed directly by a list acts as a lead-in title — the colon-bearing
4210
+ // (or the full-width `:` of Chinese text and its presentation forms `︰`
4211
+ // `﹕`, #211) followed directly by a list acts as a lead-in title — the colon-bearing
4122
4212
  // line must share a column with the first list item. Only checked for the
4123
4213
  // original, unsplit paragraph (partIndex === 0) on the iteration that is
4124
4214
  // about to place it.
4125
4215
  const endsWithColon = vdtType === 'paragraph'
4126
4216
  && resolved.bodyText.keepColonWithList
4127
4217
  && nextIsListItem
4128
- && /:\s*$/.test(contentBlock.text);
4218
+ && /[::︰﹕]\s*$/.test(contentBlock.text);
4129
4219
  while (remainingLines.length > 0) {
4130
4220
  enterBand(blockIdx, partIndex);
4131
4221
  const curCol = currentColumn(doc, cursor);
@@ -4311,13 +4401,13 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
4311
4401
  const pref = numberPrefix ?? '';
4312
4402
  // The lines joined back into the title (EF-162), as the design is
4313
4403
  // painted (`buildHeadersAndFooters`).
4314
- const title = headingTitleText(remainingLines, pref, rawBlock.titleBreaks, rawBlock.text.length);
4404
+ const title = headingTitleText(remainingLines, pref, rawBlock.titleBreaks, rawBlock.text.length, lvl.numberSeparator);
4315
4405
  // Span-page openers lay out across the full content area (both
4316
4406
  // columns); in-column headings use just the column width.
4317
4407
  const pageArea = doc.pages[cursor.pageIndex].contentArea;
4318
4408
  const measureWidth = lvl.span === 'page' ? pageArea.width : curCol.bbox.width;
4319
4409
  const info = { titleText: title, formattedNumber: pref, numericValue: headingNumber, locale: resolvedLocale(resolved), chapterNumber: chapterNumberByBlock[blockIdx] ?? '', attrs: rawBlock.attrs };
4320
- const design = measureHeadingDesign(lvl, info, measureWidth, resolved.page.dpi, doc.metadata, cursor.pageIndex, designFrames, {
4410
+ const design = measureHeadingDesign(lvl, info, measureWidth, resolved.page.dpi, doc.metadata, cursor.pageIndex, designFramesOn(doc.pages[cursor.pageIndex]), {
4321
4411
  x: lvl.span === 'page' ? pageArea.x : curCol.bbox.x,
4322
4412
  y: curCol.bbox.y + (curCol.bbox.height - curCol.availableHeight) + spacingBefore,
4323
4413
  }, resourceById);
@@ -4335,7 +4425,7 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
4335
4425
  // line whose spaces shrink, a forced break, a run it prints plain):
4336
4426
  // the band holds every line it paints (EF-100).
4337
4427
  if (opensDefaultOpener(rawBlock)) {
4338
- const painted = measureDefaultOpenerHeight(lvl, resolved.headings.textAlign, defaultOpenerTitle(remainingLines, pref, rawBlock.titleBreaks, rawBlock.text.length), pref, pageArea.width, resolved.page.dpi, doc.metadata, cursor.pageIndex);
4428
+ const painted = measureDefaultOpenerHeight(lvl, resolved.headings.textAlign, defaultOpenerTitle(remainingLines, pref, rawBlock.titleBreaks, rawBlock.text.length, lvl.numberSeparator), pref, pageArea.width, resolved.page.dpi, doc.metadata, cursor.pageIndex);
4339
4429
  if (painted > effectiveRemainHeight)
4340
4430
  effectiveRemainHeight = painted;
4341
4431
  }
@@ -4391,8 +4481,11 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
4391
4481
  blk.contentIndex = blockIdx;
4392
4482
  stampBlockExtras(blk, rawBlock);
4393
4483
  blk.headingLevel = headingLevel;
4394
- if (numberPrefix)
4484
+ if (numberPrefix) {
4395
4485
  blk.numberPrefix = numberPrefix;
4486
+ if (numberSeparator !== undefined)
4487
+ blk.numberSeparator = numberSeparator;
4488
+ }
4396
4489
  blk.lines = resetLinePositions(splitLines, style.lineHeightPx);
4397
4490
  blk.dirty = false;
4398
4491
  blk.snappedToGrid = false;
@@ -4590,8 +4683,11 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
4590
4683
  stampBlockExtras(blk, rawBlock);
4591
4684
  if (partIndex === 0) {
4592
4685
  blk.headingLevel = headingLevel;
4593
- if (numberPrefix)
4686
+ if (numberPrefix) {
4594
4687
  blk.numberPrefix = numberPrefix;
4688
+ if (numberSeparator !== undefined)
4689
+ blk.numberSeparator = numberSeparator;
4690
+ }
4595
4691
  if (headingNumber !== undefined)
4596
4692
  blk.headingNumber = headingNumber;
4597
4693
  }
@@ -4854,8 +4950,11 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
4854
4950
  stampBlockExtras(blk, rawBlock);
4855
4951
  if (partIndex === 0) {
4856
4952
  blk.headingLevel = headingLevel;
4857
- if (numberPrefix)
4953
+ if (numberPrefix) {
4858
4954
  blk.numberPrefix = numberPrefix;
4955
+ if (numberSeparator !== undefined)
4956
+ blk.numberSeparator = numberSeparator;
4957
+ }
4859
4958
  if (headingNumber !== undefined)
4860
4959
  blk.headingNumber = headingNumber;
4861
4960
  }
@@ -4957,8 +5056,11 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
4957
5056
  // `{chapterNumber}` from `numberPrefix`, as the measure did (EF-59).
4958
5057
  if (partIndex === 0) {
4959
5058
  blk.headingLevel = headingLevel;
4960
- if (numberPrefix)
5059
+ if (numberPrefix) {
4961
5060
  blk.numberPrefix = numberPrefix;
5061
+ if (numberSeparator !== undefined)
5062
+ blk.numberSeparator = numberSeparator;
5063
+ }
4962
5064
  if (headingNumber !== undefined)
4963
5065
  blk.headingNumber = headingNumber;
4964
5066
  }
@@ -5108,6 +5210,9 @@ export function buildDocumentPass(content, config, cache, options, hints = {}) {
5108
5210
  return text.length > 0 ? { styleId, text } : undefined;
5109
5211
  },
5110
5212
  });
5213
+ // Vertical pages: the axis each font's upright characters turn about.
5214
+ if (doc.pages.some((p) => p.flow))
5215
+ stampCentralBaselines(doc);
5111
5216
  doc.converged = true;
5112
5217
  doc.iterationCount = 1;
5113
5218
  return { doc, forcedBreakPages, bandCapProposals, spanPlacedInBand, bandCapsApplied, looseOutcome, captionUnderProposals };
@@ -5163,8 +5268,14 @@ export function* buildDocumentGen(content, config, cache, options) {
5163
5268
  // once, located on the pages of the finished layout. Kept apart from
5164
5269
  // `doc.warnings`, whose entries keep their postext 1.4 shape.
5165
5270
  const found = [...collectContentWarnings(content.markdown, config, content.resources ?? []), ...(indexWarnings.get(doc) ?? [])];
5166
- if (found.length > 0)
5167
- doc.contentWarnings = locateContentWarnings(doc, found);
5271
+ const located = found.length > 0 ? locateContentWarnings(doc, found) : [];
5272
+ // Justified CJK lines the composer could not fill within its tracking cap.
5273
+ const loose = cjkLooseLineWarnings(doc);
5274
+ // Chinese marks placed where the lines are painted (#193), and the
5275
+ // paragraphs whose leading is too tight for their marks or readings.
5276
+ const annotations = annotateDocument(doc, doc.config?.cjk);
5277
+ if (located.length > 0 || loose.length > 0 || annotations.length > 0)
5278
+ doc.contentWarnings = [...located, ...loose, ...annotations];
5168
5279
  // Config values the build replaced (an unknown number format, a font
5169
5280
  // stack, a side column no column width can take): walked once per build,
5170
5281
  // not per pass — they belong to no page.