postext 0.3.18 → 0.3.20

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 (281) hide show
  1. package/dist/__tests__/columnBalancing.test.js +183 -5
  2. package/dist/__tests__/columnBalancing.test.js.map +1 -1
  3. package/dist/__tests__/defaults/calloutStyles.test.d.ts +2 -0
  4. package/dist/__tests__/defaults/calloutStyles.test.d.ts.map +1 -0
  5. package/dist/__tests__/defaults/calloutStyles.test.js +201 -0
  6. package/dist/__tests__/defaults/calloutStyles.test.js.map +1 -0
  7. package/dist/__tests__/defaults/captionStyle.test.d.ts +2 -0
  8. package/dist/__tests__/defaults/captionStyle.test.d.ts.map +1 -0
  9. package/dist/__tests__/defaults/captionStyle.test.js +87 -0
  10. package/dist/__tests__/defaults/captionStyle.test.js.map +1 -0
  11. package/dist/__tests__/defaults/pageSizePreset.test.d.ts +2 -0
  12. package/dist/__tests__/defaults/pageSizePreset.test.d.ts.map +1 -0
  13. package/dist/__tests__/defaults/pageSizePreset.test.js +24 -0
  14. package/dist/__tests__/defaults/pageSizePreset.test.js.map +1 -0
  15. package/dist/__tests__/defaults/paragraphStyles.test.d.ts +2 -0
  16. package/dist/__tests__/defaults/paragraphStyles.test.d.ts.map +1 -0
  17. package/dist/__tests__/defaults/paragraphStyles.test.js +93 -0
  18. package/dist/__tests__/defaults/paragraphStyles.test.js.map +1 -0
  19. package/dist/__tests__/design/pageAnchors.test.d.ts +2 -0
  20. package/dist/__tests__/design/pageAnchors.test.d.ts.map +1 -0
  21. package/dist/__tests__/design/pageAnchors.test.js +140 -0
  22. package/dist/__tests__/design/pageAnchors.test.js.map +1 -0
  23. package/dist/__tests__/directives.test.js +58 -0
  24. package/dist/__tests__/directives.test.js.map +1 -1
  25. package/dist/__tests__/exports.test.js +19 -0
  26. package/dist/__tests__/exports.test.js.map +1 -1
  27. package/dist/__tests__/knuthPlass.test.js +60 -0
  28. package/dist/__tests__/knuthPlass.test.js.map +1 -1
  29. package/dist/__tests__/mirroredMargins.test.d.ts +2 -0
  30. package/dist/__tests__/mirroredMargins.test.d.ts.map +1 -0
  31. package/dist/__tests__/mirroredMargins.test.js +136 -0
  32. package/dist/__tests__/mirroredMargins.test.js.map +1 -0
  33. package/dist/__tests__/numbering.test.js +54 -0
  34. package/dist/__tests__/numbering.test.js.map +1 -1
  35. package/dist/__tests__/openerTitleSource.test.d.ts +2 -0
  36. package/dist/__tests__/openerTitleSource.test.d.ts.map +1 -0
  37. package/dist/__tests__/openerTitleSource.test.js +108 -0
  38. package/dist/__tests__/openerTitleSource.test.js.map +1 -0
  39. package/dist/__tests__/pageRoles.test.d.ts +2 -0
  40. package/dist/__tests__/pageRoles.test.d.ts.map +1 -0
  41. package/dist/__tests__/pageRoles.test.js +95 -0
  42. package/dist/__tests__/pageRoles.test.js.map +1 -0
  43. package/dist/__tests__/parse/containers.test.d.ts +2 -0
  44. package/dist/__tests__/parse/containers.test.d.ts.map +1 -0
  45. package/dist/__tests__/parse/containers.test.js +204 -0
  46. package/dist/__tests__/parse/containers.test.js.map +1 -0
  47. package/dist/__tests__/parse/headingAttrs.test.d.ts +2 -0
  48. package/dist/__tests__/parse/headingAttrs.test.d.ts.map +1 -0
  49. package/dist/__tests__/parse/headingAttrs.test.js +62 -0
  50. package/dist/__tests__/parse/headingAttrs.test.js.map +1 -0
  51. package/dist/__tests__/parse/inlineRef.test.js +26 -0
  52. package/dist/__tests__/parse/inlineRef.test.js.map +1 -1
  53. package/dist/__tests__/parts.test.d.ts +2 -0
  54. package/dist/__tests__/parts.test.d.ts.map +1 -0
  55. package/dist/__tests__/parts.test.js +405 -0
  56. package/dist/__tests__/parts.test.js.map +1 -0
  57. package/dist/__tests__/pipeline/calloutLayout.test.d.ts +2 -0
  58. package/dist/__tests__/pipeline/calloutLayout.test.d.ts.map +1 -0
  59. package/dist/__tests__/pipeline/calloutLayout.test.js +273 -0
  60. package/dist/__tests__/pipeline/calloutLayout.test.js.map +1 -0
  61. package/dist/__tests__/pipeline/calloutPlacement.test.d.ts +2 -0
  62. package/dist/__tests__/pipeline/calloutPlacement.test.d.ts.map +1 -0
  63. package/dist/__tests__/pipeline/calloutPlacement.test.js +239 -0
  64. package/dist/__tests__/pipeline/calloutPlacement.test.js.map +1 -0
  65. package/dist/__tests__/pipeline/captionLayout.test.d.ts +2 -0
  66. package/dist/__tests__/pipeline/captionLayout.test.d.ts.map +1 -0
  67. package/dist/__tests__/pipeline/captionLayout.test.js +269 -0
  68. package/dist/__tests__/pipeline/captionLayout.test.js.map +1 -0
  69. package/dist/__tests__/pipeline/inlineRefRender.test.js +53 -0
  70. package/dist/__tests__/pipeline/inlineRefRender.test.js.map +1 -1
  71. package/dist/__tests__/pipeline/orderedSeparator.test.d.ts +2 -0
  72. package/dist/__tests__/pipeline/orderedSeparator.test.d.ts.map +1 -0
  73. package/dist/__tests__/pipeline/orderedSeparator.test.js +196 -0
  74. package/dist/__tests__/pipeline/orderedSeparator.test.js.map +1 -0
  75. package/dist/__tests__/pipeline/paragraphStyles.test.d.ts +2 -0
  76. package/dist/__tests__/pipeline/paragraphStyles.test.d.ts.map +1 -0
  77. package/dist/__tests__/pipeline/paragraphStyles.test.js +172 -0
  78. package/dist/__tests__/pipeline/paragraphStyles.test.js.map +1 -0
  79. package/dist/__tests__/pipeline/spanBands.test.d.ts +2 -0
  80. package/dist/__tests__/pipeline/spanBands.test.d.ts.map +1 -0
  81. package/dist/__tests__/pipeline/spanBands.test.js +303 -0
  82. package/dist/__tests__/pipeline/spanBands.test.js.map +1 -0
  83. package/dist/__tests__/pipeline/spanBlocks.test.d.ts +2 -0
  84. package/dist/__tests__/pipeline/spanBlocks.test.d.ts.map +1 -0
  85. package/dist/__tests__/pipeline/spanBlocks.test.js +407 -0
  86. package/dist/__tests__/pipeline/spanBlocks.test.js.map +1 -0
  87. package/dist/__tests__/placeholders.test.d.ts +2 -0
  88. package/dist/__tests__/placeholders.test.d.ts.map +1 -0
  89. package/dist/__tests__/placeholders.test.js +130 -0
  90. package/dist/__tests__/placeholders.test.js.map +1 -0
  91. package/dist/__tests__/table/model.test.js +24 -0
  92. package/dist/__tests__/table/model.test.js.map +1 -1
  93. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  94. package/dist/canvas-backend/blockRender.js +13 -1
  95. package/dist/canvas-backend/blockRender.js.map +1 -1
  96. package/dist/canvas-backend/decorations.d.ts +3 -0
  97. package/dist/canvas-backend/decorations.d.ts.map +1 -1
  98. package/dist/canvas-backend/decorations.js +14 -8
  99. package/dist/canvas-backend/decorations.js.map +1 -1
  100. package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
  101. package/dist/canvas-backend/headerFooter.js +23 -0
  102. package/dist/canvas-backend/headerFooter.js.map +1 -1
  103. package/dist/canvas-backend/index.d.ts.map +1 -1
  104. package/dist/canvas-backend/index.js +4 -2
  105. package/dist/canvas-backend/index.js.map +1 -1
  106. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  107. package/dist/canvas-backend/renderResourceBlock.js +33 -5
  108. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  109. package/dist/columnRule.d.ts +19 -0
  110. package/dist/columnRule.d.ts.map +1 -0
  111. package/dist/columnRule.js +36 -0
  112. package/dist/columnRule.js.map +1 -0
  113. package/dist/defaults/calloutStyles.d.ts +61 -0
  114. package/dist/defaults/calloutStyles.d.ts.map +1 -0
  115. package/dist/defaults/calloutStyles.js +292 -0
  116. package/dist/defaults/calloutStyles.js.map +1 -0
  117. package/dist/defaults/captionStyle.d.ts +11 -1
  118. package/dist/defaults/captionStyle.d.ts.map +1 -1
  119. package/dist/defaults/captionStyle.js +127 -2
  120. package/dist/defaults/captionStyle.js.map +1 -1
  121. package/dist/defaults/headerFooter.d.ts.map +1 -1
  122. package/dist/defaults/headerFooter.js +3 -0
  123. package/dist/defaults/headerFooter.js.map +1 -1
  124. package/dist/defaults/headings.d.ts +3 -0
  125. package/dist/defaults/headings.d.ts.map +1 -1
  126. package/dist/defaults/headings.js +33 -6
  127. package/dist/defaults/headings.js.map +1 -1
  128. package/dist/defaults/index.d.ts +4 -1
  129. package/dist/defaults/index.d.ts.map +1 -1
  130. package/dist/defaults/index.js +28 -1
  131. package/dist/defaults/index.js.map +1 -1
  132. package/dist/defaults/orderedLists.d.ts +9 -8
  133. package/dist/defaults/orderedLists.d.ts.map +1 -1
  134. package/dist/defaults/orderedLists.js +66 -4
  135. package/dist/defaults/orderedLists.js.map +1 -1
  136. package/dist/defaults/page.d.ts.map +1 -1
  137. package/dist/defaults/page.js +14 -3
  138. package/dist/defaults/page.js.map +1 -1
  139. package/dist/defaults/paragraphStyles.d.ts +10 -0
  140. package/dist/defaults/paragraphStyles.d.ts.map +1 -0
  141. package/dist/defaults/paragraphStyles.js +67 -0
  142. package/dist/defaults/paragraphStyles.js.map +1 -0
  143. package/dist/defaults/parts.d.ts +22 -0
  144. package/dist/defaults/parts.d.ts.map +1 -0
  145. package/dist/defaults/parts.js +139 -0
  146. package/dist/defaults/parts.js.map +1 -0
  147. package/dist/defaults/shared.d.ts.map +1 -1
  148. package/dist/defaults/shared.js +110 -17
  149. package/dist/defaults/shared.js.map +1 -1
  150. package/dist/defaults/tableStyle.d.ts.map +1 -1
  151. package/dist/defaults/tableStyle.js +6 -0
  152. package/dist/defaults/tableStyle.js.map +1 -1
  153. package/dist/design/layout.d.ts +27 -1
  154. package/dist/design/layout.d.ts.map +1 -1
  155. package/dist/design/layout.js +39 -8
  156. package/dist/design/layout.js.map +1 -1
  157. package/dist/design/placeholders.d.ts +21 -4
  158. package/dist/design/placeholders.d.ts.map +1 -1
  159. package/dist/design/placeholders.js +38 -7
  160. package/dist/design/placeholders.js.map +1 -1
  161. package/dist/html-backend.d.ts.map +1 -1
  162. package/dist/html-backend.js +71 -16
  163. package/dist/html-backend.js.map +1 -1
  164. package/dist/index.d.ts +13 -9
  165. package/dist/index.d.ts.map +1 -1
  166. package/dist/index.js +7 -4
  167. package/dist/index.js.map +1 -1
  168. package/dist/knuthPlass/breakpoints.d.ts.map +1 -1
  169. package/dist/knuthPlass/breakpoints.js +34 -0
  170. package/dist/knuthPlass/breakpoints.js.map +1 -1
  171. package/dist/knuthPlass/types.d.ts +7 -0
  172. package/dist/knuthPlass/types.d.ts.map +1 -1
  173. package/dist/measure/cache.js +2 -2
  174. package/dist/measure/cache.js.map +1 -1
  175. package/dist/measure/plain.d.ts.map +1 -1
  176. package/dist/measure/plain.js +1 -0
  177. package/dist/measure/plain.js.map +1 -1
  178. package/dist/measure/rich.d.ts.map +1 -1
  179. package/dist/measure/rich.js +1 -0
  180. package/dist/measure/rich.js.map +1 -1
  181. package/dist/measure/types.d.ts +4 -0
  182. package/dist/measure/types.d.ts.map +1 -1
  183. package/dist/measure/types.js.map +1 -1
  184. package/dist/parse/attrs.d.ts +10 -0
  185. package/dist/parse/attrs.d.ts.map +1 -0
  186. package/dist/parse/attrs.js +20 -0
  187. package/dist/parse/attrs.js.map +1 -0
  188. package/dist/parse/blockParser.d.ts +8 -4
  189. package/dist/parse/blockParser.d.ts.map +1 -1
  190. package/dist/parse/blockParser.js +134 -20
  191. package/dist/parse/blockParser.js.map +1 -1
  192. package/dist/parse/index.d.ts +2 -2
  193. package/dist/parse/index.d.ts.map +1 -1
  194. package/dist/parse/index.js +1 -1
  195. package/dist/parse/index.js.map +1 -1
  196. package/dist/parse/inlineFormatting.d.ts +17 -1
  197. package/dist/parse/inlineFormatting.d.ts.map +1 -1
  198. package/dist/parse/inlineFormatting.js +56 -7
  199. package/dist/parse/inlineFormatting.js.map +1 -1
  200. package/dist/parse/sourceMapping.d.ts.map +1 -1
  201. package/dist/parse/sourceMapping.js +13 -1
  202. package/dist/parse/sourceMapping.js.map +1 -1
  203. package/dist/parse/types.d.ts +55 -5
  204. package/dist/parse/types.d.ts.map +1 -1
  205. package/dist/pipeline/bandCaps.d.ts +86 -0
  206. package/dist/pipeline/bandCaps.d.ts.map +1 -0
  207. package/dist/pipeline/bandCaps.js +142 -0
  208. package/dist/pipeline/bandCaps.js.map +1 -0
  209. package/dist/pipeline/build.d.ts +32 -0
  210. package/dist/pipeline/build.d.ts.map +1 -1
  211. package/dist/pipeline/build.js +621 -162
  212. package/dist/pipeline/build.js.map +1 -1
  213. package/dist/pipeline/buildBlockKind.d.ts +8 -0
  214. package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
  215. package/dist/pipeline/buildBlockKind.js +40 -11
  216. package/dist/pipeline/buildBlockKind.js.map +1 -1
  217. package/dist/pipeline/buildHelpers.d.ts +23 -1
  218. package/dist/pipeline/buildHelpers.d.ts.map +1 -1
  219. package/dist/pipeline/buildHelpers.js +50 -6
  220. package/dist/pipeline/buildHelpers.js.map +1 -1
  221. package/dist/pipeline/calloutLayout.d.ts +107 -0
  222. package/dist/pipeline/calloutLayout.d.ts.map +1 -0
  223. package/dist/pipeline/calloutLayout.js +498 -0
  224. package/dist/pipeline/calloutLayout.js.map +1 -0
  225. package/dist/pipeline/columnBalancing.d.ts +54 -10
  226. package/dist/pipeline/columnBalancing.d.ts.map +1 -1
  227. package/dist/pipeline/columnBalancing.js +136 -22
  228. package/dist/pipeline/columnBalancing.js.map +1 -1
  229. package/dist/pipeline/config.d.ts.map +1 -1
  230. package/dist/pipeline/config.js +17 -5
  231. package/dist/pipeline/config.js.map +1 -1
  232. package/dist/pipeline/headerFooter.d.ts +37 -2
  233. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  234. package/dist/pipeline/headerFooter.js +231 -15
  235. package/dist/pipeline/headerFooter.js.map +1 -1
  236. package/dist/pipeline/lists.d.ts +15 -0
  237. package/dist/pipeline/lists.d.ts.map +1 -1
  238. package/dist/pipeline/lists.js +73 -16
  239. package/dist/pipeline/lists.js.map +1 -1
  240. package/dist/pipeline/measureContentBlock.d.ts +59 -0
  241. package/dist/pipeline/measureContentBlock.d.ts.map +1 -0
  242. package/dist/pipeline/measureContentBlock.js +124 -0
  243. package/dist/pipeline/measureContentBlock.js.map +1 -0
  244. package/dist/pipeline/pageRoles.d.ts +23 -0
  245. package/dist/pipeline/pageRoles.d.ts.map +1 -0
  246. package/dist/pipeline/pageRoles.js +54 -0
  247. package/dist/pipeline/pageRoles.js.map +1 -0
  248. package/dist/pipeline/paragraphContainers.d.ts +32 -0
  249. package/dist/pipeline/paragraphContainers.d.ts.map +1 -0
  250. package/dist/pipeline/paragraphContainers.js +61 -0
  251. package/dist/pipeline/paragraphContainers.js.map +1 -0
  252. package/dist/pipeline/parts.d.ts +47 -0
  253. package/dist/pipeline/parts.d.ts.map +1 -0
  254. package/dist/pipeline/parts.js +230 -0
  255. package/dist/pipeline/parts.js.map +1 -0
  256. package/dist/pipeline/placeholders.d.ts +46 -1
  257. package/dist/pipeline/placeholders.d.ts.map +1 -1
  258. package/dist/pipeline/placeholders.js +93 -11
  259. package/dist/pipeline/placeholders.js.map +1 -1
  260. package/dist/pipeline/placement.d.ts +61 -7
  261. package/dist/pipeline/placement.d.ts.map +1 -1
  262. package/dist/pipeline/placement.js +151 -12
  263. package/dist/pipeline/placement.js.map +1 -1
  264. package/dist/pipeline/resourceLayout.d.ts +18 -5
  265. package/dist/pipeline/resourceLayout.d.ts.map +1 -1
  266. package/dist/pipeline/resourceLayout.js +145 -23
  267. package/dist/pipeline/resourceLayout.js.map +1 -1
  268. package/dist/pipeline/styles.d.ts +9 -1
  269. package/dist/pipeline/styles.d.ts.map +1 -1
  270. package/dist/pipeline/styles.js +50 -0
  271. package/dist/pipeline/styles.js.map +1 -1
  272. package/dist/table/model.d.ts.map +1 -1
  273. package/dist/table/model.js +16 -2
  274. package/dist/table/model.js.map +1 -1
  275. package/dist/types.d.ts +466 -2
  276. package/dist/types.d.ts.map +1 -1
  277. package/dist/vdt.d.ts +128 -4
  278. package/dist/vdt.d.ts.map +1 -1
  279. package/dist/vdt.js +2 -1
  280. package/dist/vdt.js.map +1 -1
  281. package/package.json +8 -8
@@ -20,24 +20,38 @@
20
20
  * level first), so the most important heading always receives the largest
21
21
  * share — e.g. 3 lines over an h2 and an h3 become +2 above the h2 and +1
22
22
  * above the h3.
23
+ *
24
+ * When the column's headings cannot absorb the whole gap, two further
25
+ * levers apply in editorial priority order:
26
+ * - extra grid lines where a list/enumeration ends (space after a list
27
+ * reads naturally), capped per list end;
28
+ * - as a last resort, ONE paragraph of the column is re-broken one line
29
+ * looser (TeX \looseness=+1) via the Knuth-Plass `looseness` option —
30
+ * always within the configured `maxWordSpacing`, so type colour never
31
+ * exceeds the user's limit.
23
32
  */
24
33
  import type { VDTDocument } from '../vdt';
25
34
  /** Maximum number of placement passes (initial + balancing retries). */
26
- export declare const MAX_BALANCING_PASSES = 5;
35
+ export declare const MAX_BALANCING_PASSES = 7;
36
+ export type BalanceCandidateKind = 'heading' | 'listEnd' | 'looseParagraph';
27
37
  interface BalanceCandidate {
28
38
  /** Stable content-block index keying the adjustment across passes. */
29
39
  contentIndex: number;
30
- /** Heading level (1–6); lower = more important = larger share. */
40
+ kind: BalanceCandidateKind;
41
+ /** Heading level (1–6) for `kind: 'heading'`; 0 otherwise. */
31
42
  level: number;
32
43
  /** Reading-order tiebreak within the column. */
33
44
  order: number;
45
+ /** Line count of the block — loose-paragraph preference (more lines =
46
+ * more glue = least visible loosening). */
47
+ lineCount: number;
34
48
  }
35
49
  interface ColumnGap {
36
50
  pageIndex: number;
37
51
  columnIndex: number;
38
52
  /** Whole empty grid lines at the bottom of the column. */
39
53
  gapLines: number;
40
- /** Headings inside this column that can absorb extra lines. */
54
+ /** Stretch points inside this column that can absorb extra lines. */
41
55
  candidates: BalanceCandidate[];
42
56
  }
43
57
  /**
@@ -52,24 +66,54 @@ interface ColumnGap {
52
66
  * Eligible headings are heading blocks that are neither the first block of
53
67
  * their column (their top margin is suppressed there so the column keeps
54
68
  * starting at the page top) nor the last (space above a trailing heading
55
- * would strand it at the column bottom).
69
+ * would strand it at the column bottom). List-end points are the first
70
+ * non-list block after a run of list items — they may be last in column
71
+ * (pushing a trailing paragraph down by at most the gap is local: the
72
+ * element that opened the next column still does not fit). Loose-paragraph
73
+ * candidates are justified paragraphs wholly contained in the column (never
74
+ * split parts — loosening those would reshuffle lines across columns).
56
75
  */
57
76
  export declare function collectColumnGaps(doc: VDTDocument, forcedBreakPages: ReadonlySet<number>): ColumnGap[];
58
77
  /** Total empty grid lines across all balanceable columns — the quantity the
59
78
  * convergence loop minimises. */
60
79
  export declare function totalGapLines(doc: VDTDocument, forcedBreakPages: ReadonlySet<number>): number;
80
+ /** Adjustments already applied in the layout being inspected. */
81
+ export interface BalanceState {
82
+ /** Extra spacing grid lines per content index (headings + list ends). */
83
+ lines: ReadonlyMap<number, number>;
84
+ /** Loose paragraphs: contentIndex → extra lines (always 1). */
85
+ loose: ReadonlyMap<number, number>;
86
+ }
87
+ export interface BalanceProposalOptions {
88
+ maxLinesPerHeading: number;
89
+ stretchAfterLists: boolean;
90
+ maxLinesAfterList: number;
91
+ looseParagraphs: boolean;
92
+ /** `bodyText.optimalLineBreaking` — the loose lever needs the K-P path. */
93
+ optimalLineBreaking: boolean;
94
+ /** Loose candidates that failed to gain a line in a previous attempt. */
95
+ failedLoose: ReadonlySet<number>;
96
+ }
61
97
  export interface BalanceProposal {
62
- /** Extra grid lines per content-block index (cumulative across passes). */
98
+ /** Extra spacing grid lines per content index (cumulative across passes). */
63
99
  lines: Map<number, number>;
100
+ /** Loose paragraphs per content index (cumulative across passes). */
101
+ loose: Map<number, number>;
64
102
  /** Whether the proposal adds anything over `current`. */
65
103
  changed: boolean;
66
104
  }
67
105
  /**
68
- * Propose the next round of per-heading extra lines: for each balanceable
69
- * column gap, distribute its lines among the column's headings round-robin
70
- * in importance order, on top of the already-applied `current` adjustments
71
- * and capped at `maxLinesPerHeading` per heading.
106
+ * Propose the next round of adjustments. Per column gap, levers apply in
107
+ * strict editorial priority order, on top of the already-applied `current`
108
+ * state:
109
+ * 1. headings round-robin in importance order (level asc, then reading
110
+ * order), capped at `maxLinesPerHeading`;
111
+ * 2. list ends — round-robin in reading order, capped at
112
+ * `maxLinesAfterList`;
113
+ * 3. one loose paragraph per column (cumulative across passes) — the one
114
+ * with the most lines (most glue = least visible loosening), skipping
115
+ * candidates that already failed to gain a line.
72
116
  */
73
- export declare function proposeBalanceLines(doc: VDTDocument, forcedBreakPages: ReadonlySet<number>, current: ReadonlyMap<number, number>, maxLinesPerHeading: number): BalanceProposal;
117
+ export declare function proposeBalanceLines(doc: VDTDocument, forcedBreakPages: ReadonlySet<number>, current: BalanceState, options: BalanceProposalOptions): BalanceProposal;
74
118
  export {};
75
119
  //# sourceMappingURL=columnBalancing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"columnBalancing.d.ts","sourceRoot":"","sources":["../../src/pipeline/columnBalancing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAW,MAAM,QAAQ,CAAC;AAKnD,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,UAAU,gBAAgB;IACxB,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,UAAU,SAAS;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,UAAU,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,WAAW,EAChB,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,GACpC,SAAS,EAAE,CA2Cb;AAED;kCACkC;AAClC,wBAAgB,aAAa,CAC3B,GAAG,EAAE,WAAW,EAChB,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,GACpC,MAAM,CAER;AAED,MAAM,WAAW,eAAe;IAC9B,2EAA2E;IAC3E,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,yDAAyD;IACzD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,WAAW,EAChB,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,EACrC,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACpC,kBAAkB,EAAE,MAAM,GACzB,eAAe,CAyBjB"}
1
+ {"version":3,"file":"columnBalancing.d.ts","sourceRoot":"","sources":["../../src/pipeline/columnBalancing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAa,WAAW,EAAW,MAAM,QAAQ,CAAC;AAK9D,wEAAwE;AACxE,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,MAAM,MAAM,oBAAoB,GAAG,SAAS,GAAG,SAAS,GAAG,gBAAgB,CAAC;AAE5E,UAAU,gBAAgB;IACxB,sEAAsE;IACtE,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,oBAAoB,CAAC;IAC3B,8DAA8D;IAC9D,KAAK,EAAE,MAAM,CAAC;IACd,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd;gDAC4C;IAC5C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,SAAS;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,qEAAqE;IACrE,UAAU,EAAE,gBAAgB,EAAE,CAAC;CAChC;AAYD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,WAAW,EAChB,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,GACpC,SAAS,EAAE,CA0Gb;AAED;kCACkC;AAClC,wBAAgB,aAAa,CAC3B,GAAG,EAAE,WAAW,EAChB,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,GACpC,MAAM,CAER;AAED,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,+DAA+D;IAC/D,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,sBAAsB;IACrC,kBAAkB,EAAE,MAAM,CAAC;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,OAAO,CAAC;IACzB,2EAA2E;IAC3E,mBAAmB,EAAE,OAAO,CAAC;IAC7B,yEAAyE;IACzE,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,eAAe;IAC9B,6EAA6E;IAC7E,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,qEAAqE;IACrE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3B,yDAAyD;IACzD,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,WAAW,EAChB,gBAAgB,EAAE,WAAW,CAAC,MAAM,CAAC,EACrC,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,sBAAsB,GAC9B,eAAe,CA2DjB"}
@@ -20,14 +20,28 @@
20
20
  * level first), so the most important heading always receives the largest
21
21
  * share — e.g. 3 lines over an h2 and an h3 become +2 above the h2 and +1
22
22
  * above the h3.
23
+ *
24
+ * When the column's headings cannot absorb the whole gap, two further
25
+ * levers apply in editorial priority order:
26
+ * - extra grid lines where a list/enumeration ends (space after a list
27
+ * reads naturally), capped per list end;
28
+ * - as a last resort, ONE paragraph of the column is re-broken one line
29
+ * looser (TeX \looseness=+1) via the Knuth-Plass `looseness` option —
30
+ * always within the configured `maxWordSpacing`, so type colour never
31
+ * exceeds the user's limit.
23
32
  */
24
33
  /** Tolerance against FP drift when converting free space to grid lines. */
25
34
  const EPS = 0.01;
26
35
  /** Maximum number of placement passes (initial + balancing retries). */
27
- export const MAX_BALANCING_PASSES = 5;
36
+ export const MAX_BALANCING_PASSES = 7;
28
37
  function pageHasBodyContent(page) {
29
38
  return page.columns.some((c) => c.blocks.length > 0);
30
39
  }
40
+ /** Regular flow column with a usable height — never a page-span block's
41
+ * full-width column, nor a band closed at its own top. */
42
+ function isTextColumn(col) {
43
+ return col.kind !== 'span' && col.bbox.height > 0.5;
44
+ }
31
45
  /**
32
46
  * Collect the bottom gaps of every balanceable column.
33
47
  *
@@ -40,7 +54,12 @@ function pageHasBodyContent(page) {
40
54
  * Eligible headings are heading blocks that are neither the first block of
41
55
  * their column (their top margin is suppressed there so the column keeps
42
56
  * starting at the page top) nor the last (space above a trailing heading
43
- * would strand it at the column bottom).
57
+ * would strand it at the column bottom). List-end points are the first
58
+ * non-list block after a run of list items — they may be last in column
59
+ * (pushing a trailing paragraph down by at most the gap is local: the
60
+ * element that opened the next column still does not fit). Loose-paragraph
61
+ * candidates are justified paragraphs wholly contained in the column (never
62
+ * split parts — loosening those would reshuffle lines across columns).
44
63
  */
45
64
  export function collectColumnGaps(doc, forcedBreakPages) {
46
65
  let lastContentPage = -1;
@@ -48,14 +67,33 @@ export function collectColumnGaps(doc, forcedBreakPages) {
48
67
  if (pageHasBodyContent(doc.pages[i]))
49
68
  lastContentPage = i;
50
69
  }
70
+ // Multiplicity of each content index across the whole document — a count
71
+ // above 1 means the block was split across columns/pages.
72
+ const partCount = new Map();
73
+ for (const page of doc.pages) {
74
+ for (const col of page.columns) {
75
+ for (const b of col.blocks) {
76
+ if (b.contentIndex !== undefined) {
77
+ partCount.set(b.contentIndex, (partCount.get(b.contentIndex) ?? 0) + 1);
78
+ }
79
+ }
80
+ }
81
+ }
51
82
  const gaps = [];
52
83
  for (let p = 0; p <= lastContentPage; p++) {
53
84
  const page = doc.pages[p];
54
85
  if (page.blankForParity || page.blankForForce)
55
86
  continue;
87
+ // Only text columns balance. A page-span block's full-width column is
88
+ // exactly as tall as its content, and a band closed before any text
89
+ // landed in it is zero-height — neither has a gap to absorb. The "last
90
+ // column of the page" is likewise the last non-empty TEXT column: a
91
+ // trailing span column must not turn a chapter's real closing column
92
+ // into a balanceable one.
56
93
  let lastNonEmpty = -1;
57
94
  for (let c = 0; c < page.columns.length; c++) {
58
- if (page.columns[c].blocks.length > 0)
95
+ const col = page.columns[c];
96
+ if (isTextColumn(col) && col.blocks.length > 0)
59
97
  lastNonEmpty = c;
60
98
  }
61
99
  if (lastNonEmpty === -1)
@@ -63,21 +101,62 @@ export function collectColumnGaps(doc, forcedBreakPages) {
63
101
  const pageFlowsOn = p < lastContentPage && !forcedBreakPages.has(p);
64
102
  for (let c = 0; c <= lastNonEmpty; c++) {
65
103
  const col = page.columns[c];
66
- if (col.blocks.length === 0)
104
+ if (!isTextColumn(col) || col.blocks.length === 0)
67
105
  continue;
68
106
  if (c === lastNonEmpty && !pageFlowsOn)
69
107
  continue;
108
+ // A `:::columnbreak` ended this column on purpose — leave its gap.
109
+ if (col.forcedBreak)
110
+ continue;
70
111
  const gapLines = Math.floor((col.availableHeight + EPS) / doc.baselineGrid);
71
112
  if (gapLines < 1)
72
113
  continue;
73
114
  const candidates = [];
74
- for (let i = 1; i < col.blocks.length - 1; i++) {
115
+ for (let i = 0; i < col.blocks.length; i++) {
75
116
  const b = col.blocks[i];
117
+ if (b.hidden || b.contentIndex === undefined)
118
+ continue;
119
+ // Callout frames and their children form one unbreakable unit whose
120
+ // interior is off-grid by design — never a stretch point.
121
+ if (b.containerId !== undefined)
122
+ continue;
76
123
  if (b.type === 'heading'
77
124
  && b.headingLevel !== undefined
78
- && !b.hidden
79
- && b.contentIndex !== undefined) {
80
- candidates.push({ contentIndex: b.contentIndex, level: b.headingLevel, order: i });
125
+ && i >= 1
126
+ && i < col.blocks.length - 1) {
127
+ candidates.push({
128
+ contentIndex: b.contentIndex,
129
+ kind: 'heading',
130
+ level: b.headingLevel,
131
+ order: i,
132
+ lineCount: b.lines.length,
133
+ });
134
+ }
135
+ else if (i >= 1
136
+ && col.blocks[i - 1].type === 'listItem'
137
+ && col.blocks[i - 1].containerId === undefined
138
+ && b.type !== 'listItem'
139
+ && b.type !== 'heading' // a heading after a list is a heading candidate
140
+ && !b.id.includes('-cont-')) {
141
+ candidates.push({
142
+ contentIndex: b.contentIndex,
143
+ kind: 'listEnd',
144
+ level: 0,
145
+ order: i,
146
+ lineCount: b.lines.length,
147
+ });
148
+ }
149
+ if (b.type === 'paragraph'
150
+ && b.textAlign === 'justify'
151
+ && b.lines.length >= 2
152
+ && partCount.get(b.contentIndex) === 1) {
153
+ candidates.push({
154
+ contentIndex: b.contentIndex,
155
+ kind: 'looseParagraph',
156
+ level: 0,
157
+ order: i,
158
+ lineCount: b.lines.length,
159
+ });
81
160
  }
82
161
  }
83
162
  gaps.push({ pageIndex: p, columnIndex: c, gapLines, candidates });
@@ -91,27 +170,32 @@ export function totalGapLines(doc, forcedBreakPages) {
91
170
  return collectColumnGaps(doc, forcedBreakPages).reduce((sum, g) => sum + g.gapLines, 0);
92
171
  }
93
172
  /**
94
- * Propose the next round of per-heading extra lines: for each balanceable
95
- * column gap, distribute its lines among the column's headings round-robin
96
- * in importance order, on top of the already-applied `current` adjustments
97
- * and capped at `maxLinesPerHeading` per heading.
173
+ * Propose the next round of adjustments. Per column gap, levers apply in
174
+ * strict editorial priority order, on top of the already-applied `current`
175
+ * state:
176
+ * 1. headings round-robin in importance order (level asc, then reading
177
+ * order), capped at `maxLinesPerHeading`;
178
+ * 2. list ends — round-robin in reading order, capped at
179
+ * `maxLinesAfterList`;
180
+ * 3. one loose paragraph per column (cumulative across passes) — the one
181
+ * with the most lines (most glue = least visible loosening), skipping
182
+ * candidates that already failed to gain a line.
98
183
  */
99
- export function proposeBalanceLines(doc, forcedBreakPages, current, maxLinesPerHeading) {
100
- const lines = new Map(current);
184
+ export function proposeBalanceLines(doc, forcedBreakPages, current, options) {
185
+ const lines = new Map(current.lines);
186
+ const loose = new Map(current.loose);
101
187
  let changed = false;
102
- for (const gap of collectColumnGaps(doc, forcedBreakPages)) {
103
- if (gap.candidates.length === 0)
104
- continue;
105
- const ordered = [...gap.candidates].sort((a, b) => a.level - b.level || a.order - b.order);
106
- let remaining = gap.gapLines;
188
+ /** Round-robin one extra line at a time over `cands` until the gap is
189
+ * absorbed or every candidate hits `cap`. Returns the unabsorbed rest. */
190
+ const distribute = (cands, remaining, cap) => {
107
191
  let progress = true;
108
192
  while (remaining > 0 && progress) {
109
193
  progress = false;
110
- for (const cand of ordered) {
194
+ for (const cand of cands) {
111
195
  if (remaining <= 0)
112
196
  break;
113
197
  const cur = lines.get(cand.contentIndex) ?? 0;
114
- if (cur >= maxLinesPerHeading)
198
+ if (cur >= cap)
115
199
  continue;
116
200
  lines.set(cand.contentIndex, cur + 1);
117
201
  remaining--;
@@ -119,7 +203,37 @@ export function proposeBalanceLines(doc, forcedBreakPages, current, maxLinesPerH
119
203
  progress = true;
120
204
  }
121
205
  }
206
+ return remaining;
207
+ };
208
+ for (const gap of collectColumnGaps(doc, forcedBreakPages)) {
209
+ let remaining = gap.gapLines;
210
+ const headings = gap.candidates
211
+ .filter((c) => c.kind === 'heading')
212
+ .sort((a, b) => a.level - b.level || a.order - b.order);
213
+ remaining = distribute(headings, remaining, options.maxLinesPerHeading);
214
+ if (remaining > 0 && options.stretchAfterLists) {
215
+ const listEnds = gap.candidates
216
+ .filter((c) => c.kind === 'listEnd')
217
+ .sort((a, b) => a.order - b.order);
218
+ remaining = distribute(listEnds, remaining, options.maxLinesAfterList);
219
+ }
220
+ if (remaining > 0
221
+ && options.looseParagraphs
222
+ && options.optimalLineBreaking) {
223
+ const columnLoose = gap.candidates.filter((c) => c.kind === 'looseParagraph');
224
+ // One loose paragraph per column, cumulative across passes.
225
+ const alreadyLoose = columnLoose.some((c) => loose.has(c.contentIndex));
226
+ if (!alreadyLoose) {
227
+ const pick = columnLoose
228
+ .filter((c) => !options.failedLoose.has(c.contentIndex))
229
+ .sort((a, b) => b.lineCount - a.lineCount || a.order - b.order)[0];
230
+ if (pick) {
231
+ loose.set(pick.contentIndex, 1);
232
+ changed = true;
233
+ }
234
+ }
235
+ }
122
236
  }
123
- return { lines, changed };
237
+ return { lines, loose, changed };
124
238
  }
125
239
  //# sourceMappingURL=columnBalancing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"columnBalancing.js","sourceRoot":"","sources":["../../src/pipeline/columnBalancing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH,2EAA2E;AAC3E,MAAM,GAAG,GAAG,IAAI,CAAC;AAEjB,wEAAwE;AACxE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAoBtC,SAAS,kBAAkB,CAAC,IAAa;IACvC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACvD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAgB,EAChB,gBAAqC;IAErC,IAAI,eAAe,GAAG,CAAC,CAAC,CAAC;IACzB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;YAAE,eAAe,GAAG,CAAC,CAAC;IAC7D,CAAC;IAED,MAAM,IAAI,GAAgB,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,aAAa;YAAE,SAAS;QAExD,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC;QACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,YAAY,GAAG,CAAC,CAAC;QAC3D,CAAC;QACD,IAAI,YAAY,KAAK,CAAC,CAAC;YAAE,SAAS;QAElC,MAAM,WAAW,GAAG,CAAC,GAAG,eAAe,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAEpE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;YAC7B,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YACtC,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,WAAW;gBAAE,SAAS;YAEjD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,eAAe,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC;YAC5E,IAAI,QAAQ,GAAG,CAAC;gBAAE,SAAS;YAE3B,MAAM,UAAU,GAAuB,EAAE,CAAC;YAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;gBACzB,IACE,CAAC,CAAC,IAAI,KAAK,SAAS;uBACjB,CAAC,CAAC,YAAY,KAAK,SAAS;uBAC5B,CAAC,CAAC,CAAC,MAAM;uBACT,CAAC,CAAC,YAAY,KAAK,SAAS,EAC/B,CAAC;oBACD,UAAU,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;gBACrF,CAAC;YACH,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,CAAC;QACpE,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;kCACkC;AAClC,MAAM,UAAU,aAAa,CAC3B,GAAgB,EAChB,gBAAqC;IAErC,OAAO,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;AAC1F,CAAC;AASD;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAgB,EAChB,gBAAqC,EACrC,OAAoC,EACpC,kBAA0B;IAE1B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IAC/B,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB,KAAK,MAAM,GAAG,IAAI,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,CAAC;QAC3D,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAC1C,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CACtC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CACjD,CAAC;QACF,IAAI,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC;QAC7B,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,OAAO,SAAS,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;YACjC,QAAQ,GAAG,KAAK,CAAC;YACjB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,IAAI,SAAS,IAAI,CAAC;oBAAE,MAAM;gBAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAC9C,IAAI,GAAG,IAAI,kBAAkB;oBAAE,SAAS;gBACxC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;gBACtC,SAAS,EAAE,CAAC;gBACZ,OAAO,GAAG,IAAI,CAAC;gBACf,QAAQ,GAAG,IAAI,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC"}
1
+ {"version":3,"file":"columnBalancing.js","sourceRoot":"","sources":["../../src/pipeline/columnBalancing.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/pipeline/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAiB1E,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,QAAQ,CAAC;AAElF,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,cAAc,CAkB1E;AAED;6DAC6D;AAC7D,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,cAAc,GACvB,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAIzC;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAUpE;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,cAAc,GACvB,WAAW,EAAE,CAyBf"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/pipeline/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAoB1E,OAAO,EAAqB,KAAK,WAAW,EAAE,KAAK,cAAc,EAAE,MAAM,QAAQ,CAAC;AAElF,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE,aAAa,GAAG,cAAc,CA8B1E;AAED;6DAC6D;AAC7D,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,cAAc,GACvB,GAAG,CAAC,MAAM,EAAE,0BAA0B,CAAC,CAIzC;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,cAAc,GAAG,MAAM,CAUpE;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,cAAc,GACvB,WAAW,EAAE,CAyBf"}
@@ -1,22 +1,34 @@
1
- import { resolvePageConfig, resolveLayoutConfig, resolveBodyTextConfig, resolveHeadingsConfig, resolveTableStyleConfig, resolveCaptionStyleConfig, resolveDiagramStyleConfig, resolveUnorderedListsConfig, resolveOrderedListsConfig, resolveMathConfig, resolveHeaderFooterConfig, applyPaletteToConfig, applyPaletteToResolvedConfig, } from '../defaults';
1
+ import { resolvePageConfig, resolveLayoutConfig, resolveBodyTextConfig, resolveHeadingsConfig, resolveTableStyleConfig, resolveCaptionStyleConfig, resolveDiagramStyleConfig, resolveParagraphStylesConfig, resolveCalloutStylesConfig, resolveUnorderedListsConfig, resolveOrderedListsConfig, resolveMathConfig, resolveHeaderFooterConfig, resolvePartsConfig, applyPaletteToConfig, applyPaletteToResolvedConfig, } from '../defaults';
2
2
  import { dimensionToPx } from '../units';
3
3
  import { createBoundingBox } from '../vdt';
4
4
  export function resolveAllConfig(rawConfig) {
5
5
  const config = applyPaletteToConfig(rawConfig);
6
6
  const bodyText = resolveBodyTextConfig(config?.bodyText);
7
+ const headings = resolveHeadingsConfig(config?.headings);
8
+ const unorderedLists = resolveUnorderedListsConfig(config?.unorderedLists, bodyText);
9
+ const orderedLists = resolveOrderedListsConfig(config?.orderedLists, bodyText);
10
+ const page = resolvePageConfig(config?.page);
7
11
  const resolved = {
8
- page: resolvePageConfig(config?.page),
12
+ page,
9
13
  layout: resolveLayoutConfig(config?.layout),
10
14
  bodyText,
11
- headings: resolveHeadingsConfig(config?.headings),
15
+ headings,
12
16
  tableStyle: resolveTableStyleConfig(config?.tableStyle, bodyText),
13
17
  captionStyle: resolveCaptionStyleConfig(config?.captionStyle, bodyText),
14
18
  diagramStyle: resolveDiagramStyleConfig(config?.diagramStyle),
15
- unorderedLists: resolveUnorderedListsConfig(config?.unorderedLists, bodyText),
16
- orderedLists: resolveOrderedListsConfig(config?.orderedLists, bodyText),
19
+ paragraphStyles: resolveParagraphStylesConfig(config?.paragraphStyles, bodyText),
20
+ calloutStyles: resolveCalloutStylesConfig(config?.calloutStyles, bodyText, headings, unorderedLists),
21
+ unorderedLists,
22
+ orderedLists,
17
23
  math: resolveMathConfig(config?.math),
18
24
  header: resolveHeaderFooterConfig(config?.header, 'header'),
19
25
  footer: resolveHeaderFooterConfig(config?.footer, 'footer'),
26
+ parts: resolvePartsConfig(config?.parts, page, bodyText, unorderedLists, orderedLists),
27
+ // Kept for per-resource-type caption overrides, which resolve their
28
+ // palette colours at layout time (see `mergeCaptionStyle`).
29
+ ...(rawConfig?.colorPalette && rawConfig.colorPalette.length > 0
30
+ ? { colorPalette: rawConfig.colorPalette }
31
+ : {}),
20
32
  };
21
33
  return applyPaletteToResolvedConfig(resolved, rawConfig?.colorPalette);
22
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/pipeline/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/pipeline/config.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,7 @@
1
1
  import type { DocumentMetadata, ResolvedDesignSlot, ResolvedHeadingLevelConfig } from '../types';
2
2
  import { type VDTDocument, type VDTDesignSlot } from '../vdt';
3
+ import type { PageRole } from '../types';
4
+ import { type DesignFrames } from '../design/layout';
3
5
  import type { DesignPlaceholderContext } from '../design/placeholders';
4
6
  /** Measure the natural bottom of a heading's advanced-design slot when laid
5
7
  * out against a container of the given `width` with unbounded height.
@@ -13,13 +15,46 @@ export declare function measureHeadingAdvancedDesignHeight(level: ResolvedHeadin
13
15
  titleText: string;
14
16
  formattedNumber: string;
15
17
  chapterNumber: string;
16
- }, width: number, dpi: number, metadata: DocumentMetadata, pageIndex: number): number;
18
+ attrs?: Record<string, string>;
19
+ }, width: number, dpi: number, metadata: DocumentMetadata, pageIndex: number,
20
+ /** Page/bleed frames in absolute page px, for `anchor.to: 'page' |
21
+ * 'bleed'` elements. Translated into the stub coordinate system (the
22
+ * heading container's top-left at `origin`) so a band anchored above the
23
+ * heading does not grow the reserved height, while anything extending
24
+ * below the heading's top does. */
25
+ frames?: DesignFrames,
26
+ /** Absolute page position of the heading container's top-left. Defaults
27
+ * to the frames' page origin when omitted. */
28
+ origin?: {
29
+ x: number;
30
+ y: number;
31
+ }): number;
32
+ /** Optional page-level inputs for `layoutSlotToVdt`. */
33
+ export interface SlotLayoutExtras {
34
+ frames?: DesignFrames;
35
+ pageRole?: PageRole;
36
+ /** Source range of the text `{titleText}` renders; stamped on the text
37
+ * blocks whose element content mentions the placeholder. */
38
+ titleSource?: {
39
+ start: number;
40
+ end: number;
41
+ text?: string;
42
+ sourceMap?: number[];
43
+ };
44
+ /** Source ranges of heading attribute values; a text element whose
45
+ * content is exactly `{attr.<key>}` maps back to that value. */
46
+ attrSources?: Record<string, {
47
+ start: number;
48
+ end: number;
49
+ }>;
50
+ attrs?: Record<string, string>;
51
+ }
17
52
  export declare function layoutSlotToVdt(slot: ResolvedDesignSlot, container: {
18
53
  x: number;
19
54
  y: number;
20
55
  width: number;
21
56
  height: number;
22
- }, pageIndex: number, placeholders: DesignPlaceholderContext, dpi: number): VDTDesignSlot | undefined;
57
+ }, pageIndex: number, placeholders: DesignPlaceholderContext, dpi: number, extras?: SlotLayoutExtras): VDTDesignSlot | undefined;
23
58
  /**
24
59
  * After body placement finishes, attach header/footer slots to every page.
25
60
  */
@@ -1 +1 @@
1
- {"version":3,"file":"headerFooter.d.ts","sourceRoot":"","sources":["../../src/pipeline/headerFooter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAA6B,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAC5H,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,aAAa,EAMnB,MAAM,QAAQ,CAAC;AAWhB,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AA0GvE;;;;;;;mDAOmD;AACnD,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,0BAA0B,EACjC,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,EAC9E,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,MAAM,GAChB,MAAM,CAsBR;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,kBAAkB,EACxB,SAAS,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAClE,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,wBAAwB,EACtC,GAAG,EAAE,MAAM,GACV,aAAa,GAAG,SAAS,CAQ3B;AAsED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAmH7D"}
1
+ {"version":3,"file":"headerFooter.d.ts","sourceRoot":"","sources":["../../src/pipeline/headerFooter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,kBAAkB,EAA6B,0BAA0B,EAAE,MAAM,UAAU,CAAC;AAC5H,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,aAAa,EAMnB,MAAM,QAAQ,CAAC;AAQhB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAEL,KAAK,YAAY,EAKlB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AA0GvE;;;;;;;mDAOmD;AACnD,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,0BAA0B,EACjC,OAAO,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAC9G,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,gBAAgB,EAC1B,SAAS,EAAE,MAAM;AACjB;;;;oCAIoC;AACpC,MAAM,CAAC,EAAE,YAAY;AACrB;+CAC+C;AAC/C,MAAM,CAAC,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC,MAAM,CAgCR;AAED,wDAAwD;AACxD,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB;iEAC6D;IAC7D,WAAW,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAClF;qEACiE;IACjE,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC7D,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAChC;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,kBAAkB,EACxB,SAAS,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAClE,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,wBAAwB,EACtC,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,gBAAgB,GACxB,aAAa,GAAG,SAAS,CA+C3B;AAsID;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,WAAW,GAAG,IAAI,CAyO7D"}