postext 1.22.3 → 1.24.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 (427) hide show
  1. package/dist/__tests__/bundle/bitmapInfo.test.d.ts +2 -0
  2. package/dist/__tests__/bundle/bitmapInfo.test.d.ts.map +1 -0
  3. package/dist/__tests__/bundle/bitmapInfo.test.js +78 -0
  4. package/dist/__tests__/bundle/bitmapInfo.test.js.map +1 -0
  5. package/dist/__tests__/bundle/designOverflowPin.test.d.ts +2 -0
  6. package/dist/__tests__/bundle/designOverflowPin.test.d.ts.map +1 -0
  7. package/dist/__tests__/bundle/designOverflowPin.test.js +87 -0
  8. package/dist/__tests__/bundle/designOverflowPin.test.js.map +1 -0
  9. package/dist/__tests__/bundle.test.js +1 -1
  10. package/dist/__tests__/bundle.test.js.map +1 -1
  11. package/dist/__tests__/codeBlocks.test.d.ts +2 -0
  12. package/dist/__tests__/codeBlocks.test.d.ts.map +1 -0
  13. package/dist/__tests__/codeBlocks.test.js +550 -0
  14. package/dist/__tests__/codeBlocks.test.js.map +1 -0
  15. package/dist/__tests__/design/designTextOverflow.test.d.ts +2 -0
  16. package/dist/__tests__/design/designTextOverflow.test.d.ts.map +1 -0
  17. package/dist/__tests__/design/designTextOverflow.test.js +102 -0
  18. package/dist/__tests__/design/designTextOverflow.test.js.map +1 -0
  19. package/dist/__tests__/exports.test.js +30 -0
  20. package/dist/__tests__/exports.test.js.map +1 -1
  21. package/dist/__tests__/frontmatterInvalid.test.d.ts +2 -0
  22. package/dist/__tests__/frontmatterInvalid.test.d.ts.map +1 -0
  23. package/dist/__tests__/frontmatterInvalid.test.js +101 -0
  24. package/dist/__tests__/frontmatterInvalid.test.js.map +1 -0
  25. package/dist/__tests__/hardBreaks.test.d.ts +2 -0
  26. package/dist/__tests__/hardBreaks.test.d.ts.map +1 -0
  27. package/dist/__tests__/hardBreaks.test.js +226 -0
  28. package/dist/__tests__/hardBreaks.test.js.map +1 -0
  29. package/dist/__tests__/headingFirstLineIndent.test.d.ts +2 -0
  30. package/dist/__tests__/headingFirstLineIndent.test.d.ts.map +1 -0
  31. package/dist/__tests__/headingFirstLineIndent.test.js +185 -0
  32. package/dist/__tests__/headingFirstLineIndent.test.js.map +1 -0
  33. package/dist/__tests__/headingInlineMarks.test.js +1 -1
  34. package/dist/__tests__/headingInlineMarks.test.js.map +1 -1
  35. package/dist/__tests__/headingLetterSpacing.test.js +1 -1
  36. package/dist/__tests__/headingLetterSpacing.test.js.map +1 -1
  37. package/dist/__tests__/lineNumbers.test.d.ts +2 -0
  38. package/dist/__tests__/lineNumbers.test.d.ts.map +1 -0
  39. package/dist/__tests__/lineNumbers.test.js +304 -0
  40. package/dist/__tests__/lineNumbers.test.js.map +1 -0
  41. package/dist/__tests__/mathSizeMigration.test.js +2 -2
  42. package/dist/__tests__/mathSizeMigration.test.js.map +1 -1
  43. package/dist/__tests__/paragraphDropCap.test.d.ts +2 -0
  44. package/dist/__tests__/paragraphDropCap.test.d.ts.map +1 -0
  45. package/dist/__tests__/paragraphDropCap.test.js +442 -0
  46. package/dist/__tests__/paragraphDropCap.test.js.map +1 -0
  47. package/dist/__tests__/paragraphStyleIndent.test.js +26 -2
  48. package/dist/__tests__/paragraphStyleIndent.test.js.map +1 -1
  49. package/dist/__tests__/pipeline/bitmapResolution.test.d.ts +2 -0
  50. package/dist/__tests__/pipeline/bitmapResolution.test.d.ts.map +1 -0
  51. package/dist/__tests__/pipeline/bitmapResolution.test.js +139 -0
  52. package/dist/__tests__/pipeline/bitmapResolution.test.js.map +1 -0
  53. package/dist/__tests__/pipeline/calloutInlineResourceGap.test.js +1 -1
  54. package/dist/__tests__/pipeline/calloutInlineResourceGap.test.js.map +1 -1
  55. package/dist/__tests__/pipeline/calloutSplitMinLinesChild.test.js +1 -1
  56. package/dist/__tests__/pipeline/calloutSplitMinLinesChild.test.js.map +1 -1
  57. package/dist/__tests__/pipeline/colonListRoom.test.js +1 -1
  58. package/dist/__tests__/pipeline/colonListRoom.test.js.map +1 -1
  59. package/dist/__tests__/pipeline/compoundBreaks.test.js +1 -1
  60. package/dist/__tests__/pipeline/compoundBreaks.test.js.map +1 -1
  61. package/dist/__tests__/pipeline/dashBreaks.test.js +1 -1
  62. package/dist/__tests__/pipeline/dashBreaks.test.js.map +1 -1
  63. package/dist/__tests__/pipeline/designTextTruncated.test.d.ts +2 -0
  64. package/dist/__tests__/pipeline/designTextTruncated.test.d.ts.map +1 -0
  65. package/dist/__tests__/pipeline/designTextTruncated.test.js +116 -0
  66. package/dist/__tests__/pipeline/designTextTruncated.test.js.map +1 -0
  67. package/dist/__tests__/pipeline/floatPlacement.test.js +3 -3
  68. package/dist/__tests__/pipeline/floatPlacement.test.js.map +1 -1
  69. package/dist/__tests__/pipeline/floatShrink.test.d.ts +2 -0
  70. package/dist/__tests__/pipeline/floatShrink.test.d.ts.map +1 -0
  71. package/dist/__tests__/pipeline/floatShrink.test.js +298 -0
  72. package/dist/__tests__/pipeline/floatShrink.test.js.map +1 -0
  73. package/dist/__tests__/pipeline/headingSplitOrphans.test.js +1 -1
  74. package/dist/__tests__/pipeline/headingSplitOrphans.test.js.map +1 -1
  75. package/dist/__tests__/pipeline/inlineFigureSpace.test.js +1 -1
  76. package/dist/__tests__/pipeline/inlineFigureSpace.test.js.map +1 -1
  77. package/dist/__tests__/pipeline/paragraphContainerTail.test.js +1 -1
  78. package/dist/__tests__/pipeline/paragraphContainerTail.test.js.map +1 -1
  79. package/dist/__tests__/pipeline/paragraphStyleFaces.test.js +7 -1
  80. package/dist/__tests__/pipeline/paragraphStyleFaces.test.js.map +1 -1
  81. package/dist/__tests__/pipeline/raggedOptimal.test.js +1 -1
  82. package/dist/__tests__/pipeline/raggedOptimal.test.js.map +1 -1
  83. package/dist/__tests__/pipeline/textWrap.test.d.ts +2 -0
  84. package/dist/__tests__/pipeline/textWrap.test.d.ts.map +1 -0
  85. package/dist/__tests__/pipeline/textWrap.test.js +453 -0
  86. package/dist/__tests__/pipeline/textWrap.test.js.map +1 -0
  87. package/dist/__tests__/preflight.test.js +30 -1
  88. package/dist/__tests__/preflight.test.js.map +1 -1
  89. package/dist/__tests__/presets/showcaseDesignOverflow.test.d.ts +2 -0
  90. package/dist/__tests__/presets/showcaseDesignOverflow.test.d.ts.map +1 -0
  91. package/dist/__tests__/presets/showcaseDesignOverflow.test.js +58 -0
  92. package/dist/__tests__/presets/showcaseDesignOverflow.test.js.map +1 -0
  93. package/dist/__tests__/tabStops.test.d.ts +2 -0
  94. package/dist/__tests__/tabStops.test.d.ts.map +1 -0
  95. package/dist/__tests__/tabStops.test.js +394 -0
  96. package/dist/__tests__/tabStops.test.js.map +1 -0
  97. package/dist/__tests__/table/booktabs.test.d.ts +2 -0
  98. package/dist/__tests__/table/booktabs.test.d.ts.map +1 -0
  99. package/dist/__tests__/table/booktabs.test.js +290 -0
  100. package/dist/__tests__/table/booktabs.test.js.map +1 -0
  101. package/dist/__tests__/textWrapMeasure.test.d.ts +2 -0
  102. package/dist/__tests__/textWrapMeasure.test.d.ts.map +1 -0
  103. package/dist/__tests__/textWrapMeasure.test.js +162 -0
  104. package/dist/__tests__/textWrapMeasure.test.js.map +1 -0
  105. package/dist/__tests__/verseLines.test.d.ts +2 -0
  106. package/dist/__tests__/verseLines.test.d.ts.map +1 -0
  107. package/dist/__tests__/verseLines.test.js +505 -0
  108. package/dist/__tests__/verseLines.test.js.map +1 -0
  109. package/dist/bitmapResolution.d.ts +42 -0
  110. package/dist/bitmapResolution.d.ts.map +1 -0
  111. package/dist/bitmapResolution.js +82 -0
  112. package/dist/bitmapResolution.js.map +1 -0
  113. package/dist/bundle/codec.d.ts +9 -2
  114. package/dist/bundle/codec.d.ts.map +1 -1
  115. package/dist/bundle/codec.js +24 -2
  116. package/dist/bundle/codec.js.map +1 -1
  117. package/dist/bundle/configVersion.d.ts +119 -8
  118. package/dist/bundle/configVersion.d.ts.map +1 -1
  119. package/dist/bundle/configVersion.js +395 -6
  120. package/dist/bundle/configVersion.js.map +1 -1
  121. package/dist/bundle/index.d.ts +3 -3
  122. package/dist/bundle/index.d.ts.map +1 -1
  123. package/dist/bundle/index.js +2 -2
  124. package/dist/bundle/index.js.map +1 -1
  125. package/dist/bundle/manifest.d.ts +12 -2
  126. package/dist/bundle/manifest.d.ts.map +1 -1
  127. package/dist/bundle/manifest.js +132 -6
  128. package/dist/bundle/manifest.js.map +1 -1
  129. package/dist/bundle/types.d.ts +28 -2
  130. package/dist/bundle/types.d.ts.map +1 -1
  131. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  132. package/dist/canvas-backend/blockRender.js +45 -9
  133. package/dist/canvas-backend/blockRender.js.map +1 -1
  134. package/dist/canvas-backend/index.d.ts.map +1 -1
  135. package/dist/canvas-backend/index.js +3 -0
  136. package/dist/canvas-backend/index.js.map +1 -1
  137. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  138. package/dist/canvas-backend/renderResourceBlock.js +15 -1
  139. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  140. package/dist/cjkMarks.js +1 -1
  141. package/dist/cjkMarks.js.map +1 -1
  142. package/dist/code/highlight.d.ts +34 -0
  143. package/dist/code/highlight.d.ts.map +1 -0
  144. package/dist/code/highlight.js +406 -0
  145. package/dist/code/highlight.js.map +1 -0
  146. package/dist/configWarnings.d.ts.map +1 -1
  147. package/dist/configWarnings.js +220 -4
  148. package/dist/configWarnings.js.map +1 -1
  149. package/dist/defaults/bodyText.d.ts.map +1 -1
  150. package/dist/defaults/bodyText.js +25 -0
  151. package/dist/defaults/bodyText.js.map +1 -1
  152. package/dist/defaults/calloutStyles.d.ts.map +1 -1
  153. package/dist/defaults/calloutStyles.js +7 -0
  154. package/dist/defaults/calloutStyles.js.map +1 -1
  155. package/dist/defaults/codeStyle.d.ts +29 -0
  156. package/dist/defaults/codeStyle.d.ts.map +1 -0
  157. package/dist/defaults/codeStyle.js +284 -0
  158. package/dist/defaults/codeStyle.js.map +1 -0
  159. package/dist/defaults/dropCap.d.ts +49 -0
  160. package/dist/defaults/dropCap.d.ts.map +1 -0
  161. package/dist/defaults/dropCap.js +66 -0
  162. package/dist/defaults/dropCap.js.map +1 -0
  163. package/dist/defaults/headerFooter.d.ts +21 -6
  164. package/dist/defaults/headerFooter.d.ts.map +1 -1
  165. package/dist/defaults/headerFooter.js +37 -14
  166. package/dist/defaults/headerFooter.js.map +1 -1
  167. package/dist/defaults/headings.d.ts +5 -4
  168. package/dist/defaults/headings.d.ts.map +1 -1
  169. package/dist/defaults/headings.js +26 -4
  170. package/dist/defaults/headings.js.map +1 -1
  171. package/dist/defaults/index.d.ts +4 -1
  172. package/dist/defaults/index.d.ts.map +1 -1
  173. package/dist/defaults/index.js +20 -1
  174. package/dist/defaults/index.js.map +1 -1
  175. package/dist/defaults/layout.d.ts +30 -1
  176. package/dist/defaults/layout.d.ts.map +1 -1
  177. package/dist/defaults/layout.js +105 -1
  178. package/dist/defaults/layout.js.map +1 -1
  179. package/dist/defaults/lineNumbers.d.ts +19 -0
  180. package/dist/defaults/lineNumbers.d.ts.map +1 -0
  181. package/dist/defaults/lineNumbers.js +101 -0
  182. package/dist/defaults/lineNumbers.js.map +1 -0
  183. package/dist/defaults/paragraphStyles.d.ts.map +1 -1
  184. package/dist/defaults/paragraphStyles.js +20 -0
  185. package/dist/defaults/paragraphStyles.js.map +1 -1
  186. package/dist/defaults/parts.js +4 -4
  187. package/dist/defaults/parts.js.map +1 -1
  188. package/dist/defaults/tabStops.d.ts +29 -0
  189. package/dist/defaults/tabStops.d.ts.map +1 -0
  190. package/dist/defaults/tabStops.js +94 -0
  191. package/dist/defaults/tabStops.js.map +1 -0
  192. package/dist/defaults/tableStyle.d.ts.map +1 -1
  193. package/dist/defaults/tableStyle.js +44 -0
  194. package/dist/defaults/tableStyle.js.map +1 -1
  195. package/dist/defaults/toc.js +2 -2
  196. package/dist/defaults/verse.d.ts +11 -0
  197. package/dist/defaults/verse.d.ts.map +1 -0
  198. package/dist/defaults/verse.js +57 -0
  199. package/dist/defaults/verse.js.map +1 -0
  200. package/dist/design/layout.d.ts +15 -1
  201. package/dist/design/layout.d.ts.map +1 -1
  202. package/dist/design/layout.js +28 -4
  203. package/dist/design/layout.js.map +1 -1
  204. package/dist/fonts/usage.d.ts +7 -0
  205. package/dist/fonts/usage.d.ts.map +1 -1
  206. package/dist/fonts/usage.js +71 -0
  207. package/dist/fonts/usage.js.map +1 -1
  208. package/dist/frontmatter.d.ts +20 -0
  209. package/dist/frontmatter.d.ts.map +1 -1
  210. package/dist/frontmatter.js +69 -3
  211. package/dist/frontmatter.js.map +1 -1
  212. package/dist/html-backend.d.ts.map +1 -1
  213. package/dist/html-backend.js +107 -15
  214. package/dist/html-backend.js.map +1 -1
  215. package/dist/index.d.ts +18 -10
  216. package/dist/index.d.ts.map +1 -1
  217. package/dist/index.js +9 -4
  218. package/dist/index.js.map +1 -1
  219. package/dist/measure/bidiLines.d.ts +4 -3
  220. package/dist/measure/bidiLines.d.ts.map +1 -1
  221. package/dist/measure/bidiLines.js +14 -9
  222. package/dist/measure/bidiLines.js.map +1 -1
  223. package/dist/measure/cache.js +2 -2
  224. package/dist/measure/cache.js.map +1 -1
  225. package/dist/measure/cjkCompose.d.ts.map +1 -1
  226. package/dist/measure/cjkCompose.js +10 -6
  227. package/dist/measure/cjkCompose.js.map +1 -1
  228. package/dist/measure/hardBreaks.d.ts +46 -0
  229. package/dist/measure/hardBreaks.d.ts.map +1 -0
  230. package/dist/measure/hardBreaks.js +228 -0
  231. package/dist/measure/hardBreaks.js.map +1 -0
  232. package/dist/measure/index.d.ts +4 -3
  233. package/dist/measure/index.d.ts.map +1 -1
  234. package/dist/measure/index.js +5 -4
  235. package/dist/measure/index.js.map +1 -1
  236. package/dist/measure/leader.d.ts +20 -0
  237. package/dist/measure/leader.d.ts.map +1 -0
  238. package/dist/measure/leader.js +46 -0
  239. package/dist/measure/leader.js.map +1 -0
  240. package/dist/measure/links.js +1 -1
  241. package/dist/measure/links.js.map +1 -1
  242. package/dist/measure/plain.d.ts.map +1 -1
  243. package/dist/measure/plain.js +23 -26
  244. package/dist/measure/plain.js.map +1 -1
  245. package/dist/measure/rich.d.ts +19 -0
  246. package/dist/measure/rich.d.ts.map +1 -1
  247. package/dist/measure/rich.js +215 -39
  248. package/dist/measure/rich.js.map +1 -1
  249. package/dist/measure/tabs.d.ts +103 -0
  250. package/dist/measure/tabs.d.ts.map +1 -0
  251. package/dist/measure/tabs.js +123 -0
  252. package/dist/measure/tabs.js.map +1 -0
  253. package/dist/measure/types.d.ts +72 -2
  254. package/dist/measure/types.d.ts.map +1 -1
  255. package/dist/measure/types.js +87 -3
  256. package/dist/measure/types.js.map +1 -1
  257. package/dist/parse/blockParser.d.ts +13 -6
  258. package/dist/parse/blockParser.d.ts.map +1 -1
  259. package/dist/parse/blockParser.js +457 -87
  260. package/dist/parse/blockParser.js.map +1 -1
  261. package/dist/parse/codeFence.d.ts +18 -0
  262. package/dist/parse/codeFence.d.ts.map +1 -0
  263. package/dist/parse/codeFence.js +52 -0
  264. package/dist/parse/codeFence.js.map +1 -0
  265. package/dist/parse/index.d.ts +1 -1
  266. package/dist/parse/index.d.ts.map +1 -1
  267. package/dist/parse/index.js.map +1 -1
  268. package/dist/parse/indexMarks.d.ts +3 -1
  269. package/dist/parse/indexMarks.d.ts.map +1 -1
  270. package/dist/parse/indexMarks.js +22 -2
  271. package/dist/parse/indexMarks.js.map +1 -1
  272. package/dist/parse/inlineFormatting.d.ts +50 -0
  273. package/dist/parse/inlineFormatting.d.ts.map +1 -1
  274. package/dist/parse/inlineFormatting.js +94 -0
  275. package/dist/parse/inlineFormatting.js.map +1 -1
  276. package/dist/parse/sourceMapping.d.ts.map +1 -1
  277. package/dist/parse/sourceMapping.js +65 -1
  278. package/dist/parse/sourceMapping.js.map +1 -1
  279. package/dist/parse/types.d.ts +144 -9
  280. package/dist/parse/types.d.ts.map +1 -1
  281. package/dist/pipeline/build.d.ts.map +1 -1
  282. package/dist/pipeline/build.js +629 -47
  283. package/dist/pipeline/build.js.map +1 -1
  284. package/dist/pipeline/buildBlockKind.d.ts +5 -0
  285. package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
  286. package/dist/pipeline/buildBlockKind.js +74 -2
  287. package/dist/pipeline/buildBlockKind.js.map +1 -1
  288. package/dist/pipeline/buildHelpers.d.ts +3 -0
  289. package/dist/pipeline/buildHelpers.d.ts.map +1 -1
  290. package/dist/pipeline/buildHelpers.js +7 -2
  291. package/dist/pipeline/buildHelpers.js.map +1 -1
  292. package/dist/pipeline/buildMeasurement.js +1 -1
  293. package/dist/pipeline/buildMeasurement.js.map +1 -1
  294. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  295. package/dist/pipeline/calloutLayout.js +33 -2
  296. package/dist/pipeline/calloutLayout.js.map +1 -1
  297. package/dist/pipeline/chips.d.ts.map +1 -1
  298. package/dist/pipeline/chips.js +4 -0
  299. package/dist/pipeline/chips.js.map +1 -1
  300. package/dist/pipeline/codeBlocks.d.ts +38 -0
  301. package/dist/pipeline/codeBlocks.d.ts.map +1 -0
  302. package/dist/pipeline/codeBlocks.js +146 -0
  303. package/dist/pipeline/codeBlocks.js.map +1 -0
  304. package/dist/pipeline/codeInline.d.ts +22 -0
  305. package/dist/pipeline/codeInline.d.ts.map +1 -0
  306. package/dist/pipeline/codeInline.js +93 -0
  307. package/dist/pipeline/codeInline.js.map +1 -0
  308. package/dist/pipeline/codeLines.d.ts +91 -0
  309. package/dist/pipeline/codeLines.d.ts.map +1 -0
  310. package/dist/pipeline/codeLines.js +399 -0
  311. package/dist/pipeline/codeLines.js.map +1 -0
  312. package/dist/pipeline/columnBalancing.d.ts.map +1 -1
  313. package/dist/pipeline/columnBalancing.js +5 -0
  314. package/dist/pipeline/columnBalancing.js.map +1 -1
  315. package/dist/pipeline/config.d.ts.map +1 -1
  316. package/dist/pipeline/config.js +8 -1
  317. package/dist/pipeline/config.js.map +1 -1
  318. package/dist/pipeline/contentWarnings.d.ts +25 -0
  319. package/dist/pipeline/contentWarnings.d.ts.map +1 -1
  320. package/dist/pipeline/contentWarnings.js +173 -19
  321. package/dist/pipeline/contentWarnings.js.map +1 -1
  322. package/dist/pipeline/continuation.d.ts.map +1 -1
  323. package/dist/pipeline/continuation.js +9 -2
  324. package/dist/pipeline/continuation.js.map +1 -1
  325. package/dist/pipeline/dropCap.d.ts +128 -0
  326. package/dist/pipeline/dropCap.d.ts.map +1 -0
  327. package/dist/pipeline/dropCap.js +412 -0
  328. package/dist/pipeline/dropCap.js.map +1 -0
  329. package/dist/pipeline/floatPlacement.d.ts +34 -4
  330. package/dist/pipeline/floatPlacement.d.ts.map +1 -1
  331. package/dist/pipeline/floatPlacement.js +35 -5
  332. package/dist/pipeline/floatPlacement.js.map +1 -1
  333. package/dist/pipeline/floatSlots.d.ts +7 -0
  334. package/dist/pipeline/floatSlots.d.ts.map +1 -1
  335. package/dist/pipeline/floatSlots.js.map +1 -1
  336. package/dist/pipeline/hardBreaks.d.ts +19 -0
  337. package/dist/pipeline/hardBreaks.d.ts.map +1 -0
  338. package/dist/pipeline/hardBreaks.js +36 -0
  339. package/dist/pipeline/hardBreaks.js.map +1 -0
  340. package/dist/pipeline/headerFooter.d.ts +4 -1
  341. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  342. package/dist/pipeline/headerFooter.js +23 -6
  343. package/dist/pipeline/headerFooter.js.map +1 -1
  344. package/dist/pipeline/lineNumbers.d.ts +37 -0
  345. package/dist/pipeline/lineNumbers.d.ts.map +1 -0
  346. package/dist/pipeline/lineNumbers.js +441 -0
  347. package/dist/pipeline/lineNumbers.js.map +1 -0
  348. package/dist/pipeline/measureContentBlock.d.ts +38 -5
  349. package/dist/pipeline/measureContentBlock.d.ts.map +1 -1
  350. package/dist/pipeline/measureContentBlock.js +284 -69
  351. package/dist/pipeline/measureContentBlock.js.map +1 -1
  352. package/dist/pipeline/partPalette.d.ts +1 -1
  353. package/dist/pipeline/partPalette.d.ts.map +1 -1
  354. package/dist/pipeline/partPalette.js +24 -2
  355. package/dist/pipeline/partPalette.js.map +1 -1
  356. package/dist/pipeline/placement.d.ts.map +1 -1
  357. package/dist/pipeline/placement.js +7 -0
  358. package/dist/pipeline/placement.js.map +1 -1
  359. package/dist/pipeline/resourceLayout.d.ts +15 -0
  360. package/dist/pipeline/resourceLayout.d.ts.map +1 -1
  361. package/dist/pipeline/resourceLayout.js +95 -15
  362. package/dist/pipeline/resourceLayout.js.map +1 -1
  363. package/dist/pipeline/styles.d.ts +18 -2
  364. package/dist/pipeline/styles.d.ts.map +1 -1
  365. package/dist/pipeline/styles.js +23 -8
  366. package/dist/pipeline/styles.js.map +1 -1
  367. package/dist/pipeline/tabs.d.ts +35 -0
  368. package/dist/pipeline/tabs.d.ts.map +1 -0
  369. package/dist/pipeline/tabs.js +99 -0
  370. package/dist/pipeline/tabs.js.map +1 -0
  371. package/dist/pipeline/textWrap.d.ts +94 -0
  372. package/dist/pipeline/textWrap.d.ts.map +1 -0
  373. package/dist/pipeline/textWrap.js +188 -0
  374. package/dist/pipeline/textWrap.js.map +1 -0
  375. package/dist/pipeline/toc.d.ts.map +1 -1
  376. package/dist/pipeline/toc.js +3 -38
  377. package/dist/pipeline/toc.js.map +1 -1
  378. package/dist/pipeline/verseLines.d.ts +98 -0
  379. package/dist/pipeline/verseLines.d.ts.map +1 -0
  380. package/dist/pipeline/verseLines.js +293 -0
  381. package/dist/pipeline/verseLines.js.map +1 -0
  382. package/dist/preflight.d.ts +46 -1
  383. package/dist/preflight.d.ts.map +1 -1
  384. package/dist/preflight.js +43 -7
  385. package/dist/preflight.js.map +1 -1
  386. package/dist/table/booktabs.d.ts +37 -0
  387. package/dist/table/booktabs.d.ts.map +1 -0
  388. package/dist/table/booktabs.js +82 -0
  389. package/dist/table/booktabs.js.map +1 -0
  390. package/dist/types.d.ts +787 -12
  391. package/dist/types.d.ts.map +1 -1
  392. package/dist/vdt.d.ts +367 -9
  393. package/dist/vdt.d.ts.map +1 -1
  394. package/dist/vdt.js +9 -2
  395. package/dist/vdt.js.map +1 -1
  396. package/dist/word/docxRead.d.ts.map +1 -1
  397. package/dist/word/docxRead.js +15 -0
  398. package/dist/word/docxRead.js.map +1 -1
  399. package/dist/word/index.d.ts +1 -1
  400. package/dist/word/index.d.ts.map +1 -1
  401. package/dist/word/index.js +1 -1
  402. package/dist/word/index.js.map +1 -1
  403. package/dist/word/inline.d.ts +6 -1
  404. package/dist/word/inline.d.ts.map +1 -1
  405. package/dist/word/inline.js +35 -1
  406. package/dist/word/inline.js.map +1 -1
  407. package/dist/word/model.d.ts +14 -0
  408. package/dist/word/model.d.ts.map +1 -1
  409. package/dist/word/model.js.map +1 -1
  410. package/dist/word/template.d.ts +12 -3
  411. package/dist/word/template.d.ts.map +1 -1
  412. package/dist/word/template.js +13 -3
  413. package/dist/word/template.js.map +1 -1
  414. package/dist/word/toDocx.d.ts.map +1 -1
  415. package/dist/word/toDocx.js +52 -8
  416. package/dist/word/toDocx.js.map +1 -1
  417. package/dist/word/toMarkdown.d.ts +15 -1
  418. package/dist/word/toMarkdown.d.ts.map +1 -1
  419. package/dist/word/toMarkdown.js +133 -7
  420. package/dist/word/toMarkdown.js.map +1 -1
  421. package/dist/word/word.test.js +124 -2
  422. package/dist/word/word.test.js.map +1 -1
  423. package/dist/worker/fonts.d.ts +2 -1
  424. package/dist/worker/fonts.d.ts.map +1 -1
  425. package/dist/worker/fonts.js +6 -2
  426. package/dist/worker/fonts.js.map +1 -1
  427. package/package.json +1 -1
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Verse line by line (#620): a `:::verse` poem whose lines carry no
3
+ * hemistich separator (or `layout="lines"` on its fence), set as it is
4
+ * written. Every source line is a line of verse, a run of blank lines a
5
+ * stanza break, leading whitespace an indent.
6
+ *
7
+ * - Each stanza is a paragraph block of its own (`VerseInfo.stanza`), so a
8
+ * column or page breaks between stanzas by the paragraph rules, and
9
+ * inside one by the orphan and widow rules, which then count the
10
+ * stanza's lines. The space between stanzas is the block's bottom
11
+ * margin (`stanzaSpace`, one line of the poem's leading by default).
12
+ * - A line's indent is its leading spaces × `indentStep` (a tab counts
13
+ * four spaces, an ideographic space two). A stepped line (`+ …`) starts
14
+ * where the line above ended, a word space on.
15
+ * - A line a little wider than the measure tightens its word spaces, down
16
+ * to `bodyText.minWordSpacing` of their natural width (the shrink limit
17
+ * of justified text), and stays on one line (`tighten`, default on); the
18
+ * segments carry the tighter spaces, so every renderer paints them.
19
+ * - A line still wider than the measure turns over: `turnover="hang"` sets the
20
+ * rest on the line after it, `hang` (the style's `hangingIndent`, else
21
+ * `bodyText.verse.hang`) in from the line's own start; `turnover="right"`
22
+ * sets it flush with the end side behind an opening bracket
23
+ * (`turnoverMark`). Turnovers break at word spaces (and hyphenate only
24
+ * when the poem's style asks for hyphenation itself).
25
+ * - `align="center"` (the default in horizontal text) centres the poem as a
26
+ * block on its longest line, every line flush with the block's start;
27
+ * `align="start"` (the default in vertical text, where the poem hangs
28
+ * from the head) sets it flush with the measure's start.
29
+ *
30
+ * The lines carry final segment widths and their own `bbox.x` (the block is
31
+ * set flush left), in the flow frame, as the bayt layout's do
32
+ * (`pipeline/verse.ts`): every renderer paints them as measured. A poem
33
+ * whose direction opposes its frame's (a Latin poem in an Arabic book) is
34
+ * measured from its own start side.
35
+ */
36
+ import type { ContentBlock, InlineSpan } from '../parse';
37
+ import type { DirectiveAttrs } from '../parse/types';
38
+ import type { ResolvedConfig, VDTLineSegment } from '../vdt';
39
+ import type { MeasuredBlock, MeasurementCache } from '../measure';
40
+ import type { BlockStyle } from './styles';
41
+ /** A poem's line-layout settings, read from its fence over
42
+ * `bodyText.verse`. */
43
+ export interface VerseLinesSettings {
44
+ /** Width of one leading space, px. */
45
+ indentStepPx: number;
46
+ turnover: 'hang' | 'right';
47
+ /** Indent of a hanging turnover from its line's start, px. */
48
+ hangPx: number;
49
+ turnoverMark: string;
50
+ /** Space between two stanzas, px. */
51
+ stanzaSpacePx: number;
52
+ /** Stanzas of this many lines or fewer stay whole; 0: off. */
53
+ keepStanzas: number;
54
+ align: 'center' | 'start';
55
+ /** Whether a line too wide for the measure tightens its word spaces
56
+ * (down to `bodyText.minWordSpacing`) before it turns over. */
57
+ tighten: boolean;
58
+ }
59
+ /** Whether a stanza block is set line by line: a stanza of the line layout,
60
+ * unless the fence named no layout and the configuration was stored
61
+ * before #620 (`bodyText.verse.layout: 'bayt'`), when it is set as single
62
+ * hemistichs, as postext 1.22 set a poem with no separator. */
63
+ export declare function versesLineByLine(raw: ContentBlock, resolved: ResolvedConfig): boolean;
64
+ /** A poem's settings (see {@link VerseLinesSettings}). */
65
+ export declare function verseLinesSettings(attrs: DirectiveAttrs, style: Pick<BlockStyle, 'fontSizePx' | 'lineHeightPx'>, resolved: ResolvedConfig, vertical: boolean): VerseLinesSettings;
66
+ /** A stanza's lines of verse: its spans cut at the line feeds. */
67
+ export declare function stanzaRows(spans: readonly InlineSpan[]): InlineSpan[][];
68
+ export interface VerseLinesInput {
69
+ /** The stanza, its spans resolved for measuring. */
70
+ contentBlock: ContentBlock;
71
+ /** Every stanza of the poem in order, spans resolved likewise; the
72
+ * stanza being set among them (at `contentBlock.verse.stanza.index`). */
73
+ poem: readonly ContentBlock[];
74
+ style: BlockStyle;
75
+ /** The measure, px. */
76
+ measureMaxWidth: number;
77
+ settings: VerseLinesSettings;
78
+ /** The poem's direction and its frame's. */
79
+ direction: 'ltr' | 'rtl';
80
+ frameDirection: 'ltr' | 'rtl';
81
+ /** `bodyText.minWordSpacing`: how far a word space may tighten, as a
82
+ * share of its natural width. */
83
+ minWordSpacing: number;
84
+ cache?: MeasurementCache;
85
+ }
86
+ /** A line's word spaces tightened, down to `minWordSpacing` of their
87
+ * natural width each and in proportion to what each can give, so the
88
+ * line comes to `excess` px narrower; undefined when they cannot give
89
+ * that much. Fixed spaces (a `keepSpaces` caesura) are text and never
90
+ * tighten, nor does a CJK autospace. The segments are copies: the
91
+ * measured line stays as the cache holds it. */
92
+ export declare function tightenedSegments(segments: readonly VDTLineSegment[], excess: number, minWordSpacing: number): {
93
+ segments: VDTLineSegment[];
94
+ ratio: number;
95
+ } | undefined;
96
+ /** Lay a stanza out (see the module comment). */
97
+ export declare function measureVerseLines(input: VerseLinesInput): MeasuredBlock;
98
+ //# sourceMappingURL=verseLines.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verseLines.d.ts","sourceRoot":"","sources":["../../src/pipeline/verseLines.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,cAAc,EAAW,cAAc,EAAE,MAAM,QAAQ,CAAC;AAEtE,OAAO,KAAK,EAAE,aAAa,EAAE,gBAAgB,EAAuB,MAAM,YAAY,CAAC;AASvF,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAM3C;wBACwB;AACxB,MAAM,WAAW,kBAAkB;IACjC,sCAAsC;IACtC,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC;IAC3B,8DAA8D;IAC9D,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,aAAa,EAAE,MAAM,CAAC;IACtB,8DAA8D;IAC9D,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC;IAC1B;oEACgE;IAChE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;gEAGgE;AAChE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAGrF;AAoCD,0DAA0D;AAC1D,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,cAAc,EACrB,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,YAAY,GAAG,cAAc,CAAC,EACtD,QAAQ,EAAE,cAAc,EACxB,QAAQ,EAAE,OAAO,GAChB,kBAAkB,CAgBpB;AAED,kEAAkE;AAClE,wBAAgB,UAAU,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,EAAE,CAYvE;AAED,MAAM,WAAW,eAAe;IAC9B,oDAAoD;IACpD,YAAY,EAAE,YAAY,CAAC;IAC3B;8EAC0E;IAC1E,IAAI,EAAE,SAAS,YAAY,EAAE,CAAC;IAC9B,KAAK,EAAE,UAAU,CAAC;IAClB,uBAAuB;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,4CAA4C;IAC5C,SAAS,EAAE,KAAK,GAAG,KAAK,CAAC;IACzB,cAAc,EAAE,KAAK,GAAG,KAAK,CAAC;IAC9B;sCACkC;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,gBAAgB,CAAC;CAC1B;AAED;;;;;iDAKiD;AACjD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,SAAS,cAAc,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG;IAAE,QAAQ,EAAE,cAAc,EAAE,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAmBxK;AAED,iDAAiD;AACjD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,eAAe,GAAG,aAAa,CA4IvE"}
@@ -0,0 +1,293 @@
1
+ /**
2
+ * Verse line by line (#620): a `:::verse` poem whose lines carry no
3
+ * hemistich separator (or `layout="lines"` on its fence), set as it is
4
+ * written. Every source line is a line of verse, a run of blank lines a
5
+ * stanza break, leading whitespace an indent.
6
+ *
7
+ * - Each stanza is a paragraph block of its own (`VerseInfo.stanza`), so a
8
+ * column or page breaks between stanzas by the paragraph rules, and
9
+ * inside one by the orphan and widow rules, which then count the
10
+ * stanza's lines. The space between stanzas is the block's bottom
11
+ * margin (`stanzaSpace`, one line of the poem's leading by default).
12
+ * - A line's indent is its leading spaces × `indentStep` (a tab counts
13
+ * four spaces, an ideographic space two). A stepped line (`+ …`) starts
14
+ * where the line above ended, a word space on.
15
+ * - A line a little wider than the measure tightens its word spaces, down
16
+ * to `bodyText.minWordSpacing` of their natural width (the shrink limit
17
+ * of justified text), and stays on one line (`tighten`, default on); the
18
+ * segments carry the tighter spaces, so every renderer paints them.
19
+ * - A line still wider than the measure turns over: `turnover="hang"` sets the
20
+ * rest on the line after it, `hang` (the style's `hangingIndent`, else
21
+ * `bodyText.verse.hang`) in from the line's own start; `turnover="right"`
22
+ * sets it flush with the end side behind an opening bracket
23
+ * (`turnoverMark`). Turnovers break at word spaces (and hyphenate only
24
+ * when the poem's style asks for hyphenation itself).
25
+ * - `align="center"` (the default in horizontal text) centres the poem as a
26
+ * block on its longest line, every line flush with the block's start;
27
+ * `align="start"` (the default in vertical text, where the poem hangs
28
+ * from the head) sets it flush with the measure's start.
29
+ *
30
+ * The lines carry final segment widths and their own `bbox.x` (the block is
31
+ * set flush left), in the flow frame, as the bayt layout's do
32
+ * (`pipeline/verse.ts`): every renderer paints them as measured. A poem
33
+ * whose direction opposes its frame's (a Latin poem in an Arabic book) is
34
+ * measured from its own start side.
35
+ */
36
+ import { createBoundingBox } from '../vdt';
37
+ import { measureRichBlock } from '../measure';
38
+ import { cachedMeasureRichBlock } from '../measure/cache';
39
+ import { pickSpanFont, textWidth } from '../measure/rich';
40
+ import { normalSpaceWidthFor } from '../measure/canvas';
41
+ import { lineBaselineOffset } from '../measure/vertical';
42
+ import { sliceSpan } from '../parse/links';
43
+ import { dimensionToPx } from '../units';
44
+ import { lengthAttr } from './verse';
45
+ /** Measure a line of verse on one line. */
46
+ const ONE_LINE = 1e7;
47
+ /** Whether a stanza block is set line by line: a stanza of the line layout,
48
+ * unless the fence named no layout and the configuration was stored
49
+ * before #620 (`bodyText.verse.layout: 'bayt'`), when it is set as single
50
+ * hemistichs, as postext 1.22 set a poem with no separator. */
51
+ export function versesLineByLine(raw, resolved) {
52
+ const stanza = raw.verse?.stanza;
53
+ return stanza !== undefined && !(stanza.auto && resolved.bodyText.verse.layout === 'bayt');
54
+ }
55
+ /** `tighten=false` / `tighten=true` on a fence; undefined when absent or
56
+ * neither. */
57
+ function switchAttr(value) {
58
+ const v = value?.trim().toLowerCase();
59
+ return v === 'true' || v === '' ? true : v === 'false' ? false : undefined;
60
+ }
61
+ /** A whole number of lines or none (`keepStanzas=5`). */
62
+ function countAttr(value) {
63
+ const m = /^\s*(\d+)\s*$/.exec(value ?? '');
64
+ return m ? Number(m[1]) : undefined;
65
+ }
66
+ /** The space between stanzas a fence asks for: a bare number counts lines
67
+ * of the poem's leading (`stanzaSpace=0.5`), a length is that length
68
+ * (`stanzaSpace=6pt`). */
69
+ function stanzaSpaceAttr(value, lineHeightPx, dpi, fontSizePx) {
70
+ const v = value?.trim();
71
+ if (!v)
72
+ return undefined;
73
+ if (/^(\d+(?:\.\d+)?|\.\d+)$/.test(v))
74
+ return Number(v) * lineHeightPx;
75
+ return lengthAttr(v, dpi, fontSizePx);
76
+ }
77
+ /** The hanging indent of the paragraph style a poem's fence names, px;
78
+ * undefined when it names none, or one that sets none. */
79
+ function styleHangPx(attrs, resolved, fontSizePx) {
80
+ const id = attrs.style?.trim();
81
+ if (!id)
82
+ return undefined;
83
+ const cfg = resolved.paragraphStyles.find((s) => s.id === id);
84
+ if (!cfg)
85
+ return undefined;
86
+ const px = dimensionToPx(cfg.hangingIndent, resolved.page.dpi, fontSizePx);
87
+ return px > 0 ? px : undefined;
88
+ }
89
+ /** A poem's settings (see {@link VerseLinesSettings}). */
90
+ export function verseLinesSettings(attrs, style, resolved, vertical) {
91
+ const cfg = resolved.bodyText.verse;
92
+ const dpi = resolved.page.dpi;
93
+ const em = style.fontSizePx;
94
+ const turnover = attrs.turnover?.trim();
95
+ const align = attrs.align?.trim();
96
+ return {
97
+ indentStepPx: Math.max(0, lengthAttr(attrs.indentStep, dpi, em) ?? dimensionToPx(cfg.indentStep, dpi, em)),
98
+ turnover: turnover === 'right' || turnover === 'hang' ? turnover : cfg.turnover,
99
+ hangPx: Math.max(0, lengthAttr(attrs.hang, dpi, em) ?? styleHangPx(attrs, resolved, em) ?? dimensionToPx(cfg.hang, dpi, em)),
100
+ turnoverMark: attrs.turnoverMark ?? cfg.turnoverMark,
101
+ stanzaSpacePx: Math.max(0, stanzaSpaceAttr(attrs.stanzaSpace, style.lineHeightPx, dpi, em) ?? cfg.stanzaSpace * style.lineHeightPx),
102
+ keepStanzas: countAttr(attrs.keepStanzas) ?? cfg.keepStanzas,
103
+ align: align === 'start' || align === 'center' ? align : vertical ? 'start' : 'center',
104
+ tighten: switchAttr(attrs.tighten) ?? cfg.tighten,
105
+ };
106
+ }
107
+ /** A stanza's lines of verse: its spans cut at the line feeds. */
108
+ export function stanzaRows(spans) {
109
+ const rows = [[]];
110
+ for (const span of spans) {
111
+ let from = 0;
112
+ for (let i = 0; i <= span.text.length; i++) {
113
+ if (i < span.text.length && span.text[i] !== '\n')
114
+ continue;
115
+ if (i > from)
116
+ rows[rows.length - 1].push(sliceSpan(span, from, i));
117
+ if (i < span.text.length)
118
+ rows.push([]);
119
+ from = i + 1;
120
+ }
121
+ }
122
+ return rows;
123
+ }
124
+ /** A line's word spaces tightened, down to `minWordSpacing` of their
125
+ * natural width each and in proportion to what each can give, so the
126
+ * line comes to `excess` px narrower; undefined when they cannot give
127
+ * that much. Fixed spaces (a `keepSpaces` caesura) are text and never
128
+ * tighten, nor does a CJK autospace. The segments are copies: the
129
+ * measured line stays as the cache holds it. */
130
+ export function tightenedSegments(segments, excess, minWordSpacing) {
131
+ const floor = Math.max(0, Math.min(1, minWordSpacing));
132
+ const give = (seg) => (seg.kind === 'space' && !seg.autospace && !seg.labelTab ? Math.max(0, seg.width * (1 - floor)) : 0);
133
+ let natural = 0;
134
+ let shrinkable = 0;
135
+ for (const seg of segments) {
136
+ const g = give(seg);
137
+ if (g > 0) {
138
+ natural += seg.width;
139
+ shrinkable += g;
140
+ }
141
+ }
142
+ if (excess <= 0 || shrinkable <= 0 || excess > shrinkable + 1e-6)
143
+ return undefined;
144
+ const share = Math.min(1, excess / shrinkable);
145
+ const out = segments.map((seg) => {
146
+ const g = give(seg);
147
+ return g > 0 ? { ...seg, width: seg.width - g * share } : seg;
148
+ });
149
+ return { segments: out, ratio: (natural - shrinkable * share) / natural };
150
+ }
151
+ /** Lay a stanza out (see the module comment). */
152
+ export function measureVerseLines(input) {
153
+ const { contentBlock, style, measureMaxWidth: measure, settings, direction } = input;
154
+ const stanza = contentBlock.verse?.stanza;
155
+ if (!stanza)
156
+ return { lines: [], totalHeight: 0 };
157
+ const fonts = {
158
+ normal: style.fontString,
159
+ bold: style.boldFontString ?? style.fontString,
160
+ italic: style.italicFontString ?? style.fontString,
161
+ boldItalic: style.boldItalicFontString ?? style.fontString,
162
+ };
163
+ const lineHeight = style.lineHeightPx;
164
+ const base = {
165
+ textAlign: 'left',
166
+ direction,
167
+ hyphenate: style.hyphenate,
168
+ ...(style.hyphenationZonePx !== undefined ? { hyphenationZonePx: style.hyphenationZonePx } : {}),
169
+ };
170
+ const measureSpans = (spans, width, options) => (input.cache
171
+ ? cachedMeasureRichBlock(spans, fonts.normal, fonts.bold, fonts.italic, fonts.boldItalic, width, lineHeight, options, input.cache)
172
+ : measureRichBlock(spans, fonts.normal, fonts.bold, fonts.italic, fonts.boldItalic, width, lineHeight, options)).lines;
173
+ const widthOf = (line) => (line?.segments ?? []).reduce((s, seg) => s + seg.width, 0);
174
+ const space = normalSpaceWidthFor(fonts.normal);
175
+ // How a line too wide for the measure is broken: at word spaces, the
176
+ // turnovers in from its start (`hang`), or set behind the mark flush
177
+ // with the end side (`right`).
178
+ const markSeg = () => {
179
+ const seg = { kind: 'text', text: settings.turnoverMark, width: 0, inserted: true };
180
+ seg.width = textWidth(seg.text, pickSpanFont(false, false, fonts.normal, fonts.bold, fonts.italic, fonts.boldItalic), false);
181
+ return seg;
182
+ };
183
+ const turnoverLines = (spans, indent) => {
184
+ const room = Math.max(1, measure - indent);
185
+ const rest = settings.turnover === 'right'
186
+ ? Math.min(markSeg().width + space, room / 2)
187
+ : Math.min(settings.hangPx, room / 2);
188
+ return measureSpans(spans, room, { ...base, lineIndentsPx: [0, rest] });
189
+ };
190
+ /** Where a too-wide line's last turnover ends, from the poem's start. */
191
+ const endOfTurnover = (spans, indent) => {
192
+ const lines = turnoverLines(spans, indent);
193
+ const last = lines[lines.length - 1];
194
+ if (!last || lines.length < 2)
195
+ return Math.min(measure, indent + widthOf(last));
196
+ return settings.turnover === 'right' ? measure : indent + last.bbox.x + widthOf(last);
197
+ };
198
+ const rows = [];
199
+ let prevEnd = 0;
200
+ for (const block of input.poem) {
201
+ const st = block.verse?.stanza;
202
+ if (!st)
203
+ continue;
204
+ stanzaRows(block.spans).forEach((spans, i) => {
205
+ const info = st.lines[i] ?? { indent: 0 };
206
+ const line = measureSpans(spans, ONE_LINE, base)[0];
207
+ let width = widthOf(line);
208
+ // An indent past half the measure would leave its turnovers no room.
209
+ let indent = Math.min(info.indent * settings.indentStepPx, measure / 2);
210
+ if (info.stepped && rows.length > 0)
211
+ indent = Math.max(0, Math.min(prevEnd + space, measure - width));
212
+ const tight = settings.tighten && line && indent + width > measure + 0.01
213
+ ? tightenedSegments(line.segments ?? [], indent + width - measure, input.minWordSpacing)
214
+ : undefined;
215
+ if (tight)
216
+ width = measure - indent;
217
+ rows.push({ spans, line, width, indent, stanza: st.index, ...(tight ? { tight } : {}) });
218
+ prevEnd = indent + width <= measure + 0.01 ? indent + width : endOfTurnover(spans, indent);
219
+ });
220
+ }
221
+ // The poem's block: as wide as its longest line (the measure when one
222
+ // turns over), centred or flush with the start.
223
+ const poemWidth = rows.reduce((w, r) => Math.max(w, Math.min(measure, r.indent + r.width)), 0);
224
+ const x0 = settings.align === 'center' ? Math.max(0, (measure - poemWidth) / 2) : 0;
225
+ const same = direction === input.frameDirection;
226
+ /** Flow x of a line `width` wide starting `start` px from the poem's
227
+ * start side. */
228
+ const place = (start, width) => (same ? start : Math.max(0, measure - start - width));
229
+ const baselineOffset = lineBaselineOffset(lineHeight, fonts.normal);
230
+ const lines = [];
231
+ const push = (line, segments, start, verseLine) => {
232
+ const y = lines.length * lineHeight;
233
+ const width = segments.reduce((s, seg) => s + seg.width, 0);
234
+ const { verse: _bayt, measure: _measure, isLastLine: _last, ...rest } = line;
235
+ void _bayt;
236
+ void _measure;
237
+ void _last;
238
+ lines.push({
239
+ ...rest,
240
+ segments,
241
+ bbox: createBoundingBox(place(start, width), y, width, lineHeight),
242
+ baseline: y + baselineOffset,
243
+ isLastLine: false,
244
+ verseLine,
245
+ });
246
+ };
247
+ rows.forEach((row, i) => {
248
+ if (row.stanza !== stanza.index)
249
+ return;
250
+ const verseLine = (turnover) => ({ stanza: stanza.index, line: i, turnover, ...(!turnover && row.indent > 0 ? { indent: row.indent } : {}) });
251
+ if (row.tight && row.line) {
252
+ push(row.line, row.tight.segments, x0 + row.indent, { ...verseLine(false), spaceRatio: row.tight.ratio });
253
+ return;
254
+ }
255
+ if (row.indent + row.width <= measure + 0.01) {
256
+ const line = row.line;
257
+ if (line)
258
+ push(line, line.segments ?? [], x0 + row.indent, verseLine(false));
259
+ return;
260
+ }
261
+ // Turned over: the block spans the measure (x0 is 0).
262
+ turnoverLines(row.spans, row.indent).forEach((line, k) => {
263
+ const segments = line.segments ?? [];
264
+ if (k === 0) {
265
+ push(line, segments, row.indent, verseLine(false));
266
+ }
267
+ else if (settings.turnover === 'right') {
268
+ // Flush with the end side, behind the mark, which stands on the
269
+ // turnover's start side (the left of a left-to-right poem).
270
+ const marked = [markSeg(), ...segments];
271
+ const width = marked.reduce((s, seg) => s + seg.width, 0);
272
+ const inner = line.order && line.order.length === segments.length ? line.order.map((o) => o + 1) : segments.map((_, j) => j + 1);
273
+ const order = direction === 'rtl' ? [...inner, 0] : [0, ...inner];
274
+ const { order: _order, ...unordered } = line;
275
+ void _order;
276
+ push(order.every((v, j) => v === j) ? unordered : { ...unordered, order }, marked, Math.max(row.indent, measure - width), verseLine(true));
277
+ }
278
+ else {
279
+ push(line, segments, row.indent + line.bbox.x, verseLine(true));
280
+ }
281
+ });
282
+ });
283
+ // The last line of a stanza another follows: copied text leaves a blank
284
+ // line under it.
285
+ if (lines.length > 0) {
286
+ const last = lines[lines.length - 1];
287
+ last.isLastLine = true;
288
+ if (!stanza.last)
289
+ last.verseLine = { ...last.verseLine, stanzaEnd: true };
290
+ }
291
+ return { lines, totalHeight: lines.length * lineHeight };
292
+ }
293
+ //# sourceMappingURL=verseLines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verseLines.js","sourceRoot":"","sources":["../../src/pipeline/verseLines.ts"],"names":[],"mappings":"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"}
@@ -7,7 +7,9 @@
7
7
  * - Pictures whose effective resolution at their printed size (pixels per
8
8
  * inch, crop included) falls under `print.preflight.minImageResolution`
9
9
  * (critical under `criticalImageResolution`): figures, table-cell
10
- * pictures, design images, comic panels.
10
+ * pictures, design images, comic panels. The pixels are the file's when
11
+ * the host knows them (`imageSize`), else the resource's declaration.
12
+ * - Bitmaps whose declared pixel size and file disagree (#631).
11
13
  * - RGB pictures in a CMYK job (converted on export, or kept RGB by a
12
14
  * PDF/X-4 that does not convert them), when the host says which
13
15
  * pictures are RGB (`imageColor`).
@@ -36,6 +38,23 @@ export type PreflightIssue = {
36
38
  resourceId?: string;
37
39
  ppi: number;
38
40
  minimum: number;
41
+ }
42
+ /** A bitmap that declares a pixel size its file does not have (more
43
+ * than a pixel off either way): its print size and resolution are
44
+ * worked out from the declaration. Reported once, where it is first
45
+ * placed; `warning` when the declaration exceeds the file. */
46
+ | {
47
+ kind: 'declaredPixelsMismatch';
48
+ fileId: string;
49
+ resourceId?: string;
50
+ declared: {
51
+ width: number;
52
+ height: number;
53
+ };
54
+ actual: {
55
+ width: number;
56
+ height: number;
57
+ };
39
58
  } | {
40
59
  kind: 'rgbImage';
41
60
  fileId: string;
@@ -79,11 +98,37 @@ export interface PreflightOptions {
79
98
  * coverage exactly. Without it a neutral counts one ink and any other
80
99
  * colour three, and coverage is not checked. */
81
100
  transform?: OutputTransform;
101
+ /** The real pixel size of a bitmap's file (the decoded image, or
102
+ * `bitmapInfo` on its bytes), when the host knows it: the resolution is
103
+ * worked out from it, and a declaration that disagrees is reported
104
+ * (`declaredPixelsMismatch`). */
105
+ imageSize?: (fileId: string) => {
106
+ width: number;
107
+ height: number;
108
+ } | undefined;
82
109
  /** Whether a picture's file is RGB, CMYK or gray (from its bytes). */
83
110
  imageColor?: (fileId: string) => 'rgb' | 'cmyk' | 'gray' | undefined;
84
111
  /** The job is CMYK (a PDF/X standard, or a CMYK PDF). Defaults to true
85
112
  * when a PDF/X standard is set. */
86
113
  cmyk?: boolean;
87
114
  }
115
+ /** One placed bitmap and its effective resolution there (#631): the
116
+ * file's pixels shown (crop and safe area counted) over its printed size
117
+ * in inches, the smaller of the two axes. */
118
+ export interface PlacedImageResolution {
119
+ fileId: string;
120
+ resourceId?: string;
121
+ /** Book-absolute page index. */
122
+ pageIndex: number;
123
+ ppi: number;
124
+ /** Printed size, layout px. */
125
+ width: number;
126
+ height: number;
127
+ }
128
+ /** Every bitmap placed in `doc` with its effective resolution: figures,
129
+ * table-cell pictures, design images and comic panels, one entry per
130
+ * placement. Uses `options.resources` and `options.imageSize` as
131
+ * {@link preflightDocument} does; runs whether or not preflight is on. */
132
+ export declare function placedImageResolutions(doc: VDTDocument, options?: Pick<PreflightOptions, 'resources' | 'imageSize'>): PlacedImageResolution[];
88
133
  export declare function preflightDocument(doc: VDTDocument, options?: PreflightOptions): PreflightIssue[];
89
134
  //# sourceMappingURL=preflight.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,KAAK,EAAe,mBAAmB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAA+B,WAAW,EAAW,MAAM,OAAO,CAAC;AAC5F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAKzD,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,SAAS,GAAG,MAAM,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,+DAA+D;IAC/D,SAAS,EAAE,MAAM,CAAC;IAClB,mCAAmC;IACnC,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,CACA;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACjG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAC7E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvE;IAAE,IAAI,EAAE,kBAAkB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACvF;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACpE;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC1E;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,CAAA;CAAE,CACjF,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;AAEnD,MAAM,WAAW,gBAAgB;IAC/B;4CACwC;IACxC,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B;8DAC0D;IAC1D,SAAS,CAAC,EAAE,SAAS,QAAQ,EAAE,CAAC;IAChC;;qDAEiD;IACjD,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,sEAAsE;IACtE,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACrE;wCACoC;IACpC,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAqCD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,OAAO,GAAE,gBAAqB,GAAG,cAAc,EAAE,CAiPpG"}
1
+ {"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"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"}
package/dist/preflight.js CHANGED
@@ -7,7 +7,9 @@
7
7
  * - Pictures whose effective resolution at their printed size (pixels per
8
8
  * inch, crop included) falls under `print.preflight.minImageResolution`
9
9
  * (critical under `criticalImageResolution`): figures, table-cell
10
- * pictures, design images, comic panels.
10
+ * pictures, design images, comic panels. The pixels are the file's when
11
+ * the host knows them (`imageSize`), else the resource's declaration.
12
+ * - Bitmaps whose declared pixel size and file disagree (#631).
11
13
  * - RGB pictures in a CMYK job (converted on export, or kept RGB by a
12
14
  * PDF/X-4 that does not convert them), when the host says which
13
15
  * pictures are RGB (`imageColor`).
@@ -59,10 +61,22 @@ function bitmapSizes(doc, resources) {
59
61
  note(f.resourceBlock?.resource);
60
62
  return out;
61
63
  }
64
+ /** Every bitmap placed in `doc` with its effective resolution: figures,
65
+ * table-cell pictures, design images and comic panels, one entry per
66
+ * placement. Uses `options.resources` and `options.imageSize` as
67
+ * {@link preflightDocument} does; runs whether or not preflight is on. */
68
+ export function placedImageResolutions(doc, options = {}) {
69
+ const placed = [];
70
+ runPreflight(doc, { ...options, print: undefined }, placed);
71
+ return placed;
72
+ }
62
73
  export function preflightDocument(doc, options = {}) {
74
+ return runPreflight(doc, options);
75
+ }
76
+ function runPreflight(doc, options, placed) {
63
77
  const print = options.print ?? doc.config.print ?? resolvePrintConfig();
64
78
  const pf = print.preflight;
65
- if (!pf.enabled)
79
+ if (!pf.enabled && !placed)
66
80
  return [];
67
81
  const dpi = doc.config.page.dpi;
68
82
  const pxToPt = (px) => (px / dpi) * 72;
@@ -112,14 +126,31 @@ export function preflightDocument(doc, options = {}) {
112
126
  out.push({ kind: 'inkLimit', severity: 'warning', pageIndex, color: hex, coverage: Math.round(coverage), limit: print.inkLimit, ...(rect ? { rect } : {}) });
113
127
  }
114
128
  };
129
+ // The file's pixels against the declaration, once per file.
130
+ const mismatchSeen = new Set();
115
131
  const checkImage = (fileId, placedW, placedH, fracW, fracH, pageIndex, rect, resourceId, src) => {
116
132
  if (!fileId)
117
133
  return;
118
- const size = sizes.get(fileId);
134
+ const declared = sizes.get(fileId);
135
+ const real = options.imageSize?.(fileId);
136
+ const actual = real && real.width > 0 && real.height > 0 ? { w: real.width, h: real.height } : undefined;
137
+ const size = actual ?? declared;
119
138
  const source = src?.start !== undefined ? { sourceStart: src.start, ...(src.end !== undefined ? { sourceEnd: src.end } : {}) } : {};
120
- const rid = resourceId ?? size?.id;
139
+ const rid = resourceId ?? declared?.id;
140
+ if (pf.enabled && declared && actual && !mismatchSeen.has(fileId) && (Math.abs(declared.w - actual.w) > 1 || Math.abs(declared.h - actual.h) > 1)) {
141
+ mismatchSeen.add(fileId);
142
+ const over = declared.w > actual.w + 1 || declared.h > actual.h + 1;
143
+ out.push({
144
+ kind: 'declaredPixelsMismatch', severity: over ? 'warning' : 'info', pageIndex, rect, fileId,
145
+ declared: { width: declared.w, height: declared.h }, actual: { width: actual.w, height: actual.h },
146
+ ...(rid ? { resourceId: rid } : {}), ...source,
147
+ });
148
+ }
121
149
  if (size && placedW > 0 && placedH > 0) {
122
150
  const ppi = Math.min((size.w * fracW) / (placedW / dpi), (size.h * fracH) / (placedH / dpi));
151
+ placed?.push({ fileId, ...(rid ? { resourceId: rid } : {}), pageIndex, ppi, width: placedW, height: placedH });
152
+ if (!pf.enabled)
153
+ return;
123
154
  if (ppi < pf.minImageResolution - EPS) {
124
155
  out.push({
125
156
  kind: 'lowImageResolution',
@@ -129,7 +160,7 @@ export function preflightDocument(doc, options = {}) {
129
160
  });
130
161
  }
131
162
  }
132
- if (cmykJob && options.imageColor?.(fileId) === 'rgb') {
163
+ if (pf.enabled && cmykJob && options.imageColor?.(fileId) === 'rgb') {
133
164
  const converted = print.standard === 'pdfx1a' || print.convertImages;
134
165
  out.push({ kind: 'rgbImage', severity: converted ? 'info' : 'warning', pageIndex, rect, fileId, converted, ...(rid ? { resourceId: rid } : {}), ...source });
135
166
  }
@@ -288,8 +319,12 @@ export function preflightDocument(doc, options = {}) {
288
319
  }
289
320
  const table = rb.table;
290
321
  if (table) {
291
- if (table.borderWidthPx > 0)
292
- checkRule(table.borderWidthPx, table.borderColor, pageIndex, body);
322
+ // Booktabs strokes (#625) have their own widths: the thinnest counts.
323
+ const rulePx = table.strokes
324
+ ? table.strokes.reduce((min, s) => Math.min(min, s.widthPx), Infinity)
325
+ : table.borderWidthPx;
326
+ if (rulePx > 0 && Number.isFinite(rulePx))
327
+ checkRule(rulePx, table.borderColor, pageIndex, body);
293
328
  for (const cell of table.cells ?? []) {
294
329
  const img = cell.image;
295
330
  if (img && img.kind === 'bitmap')
@@ -306,6 +341,7 @@ export function preflightDocument(doc, options = {}) {
306
341
  checkSlot(page.header);
307
342
  checkSlot(page.footer);
308
343
  checkSlot(page.openerBand);
344
+ checkSlot(page.lineNumbers);
309
345
  checkComic(page.comic);
310
346
  }
311
347
  // The rich-black recipe against the limit.