postext 0.3.16 → 0.3.17

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 (175) hide show
  1. package/dist/__tests__/createLayout.test.js +12 -13
  2. package/dist/__tests__/createLayout.test.js.map +1 -1
  3. package/dist/__tests__/defaults/resourceTypes.test.d.ts +2 -0
  4. package/dist/__tests__/defaults/resourceTypes.test.d.ts.map +1 -0
  5. package/dist/__tests__/defaults/resourceTypes.test.js +69 -0
  6. package/dist/__tests__/defaults/resourceTypes.test.js.map +1 -0
  7. package/dist/__tests__/exports.test.js +54 -0
  8. package/dist/__tests__/exports.test.js.map +1 -1
  9. package/dist/__tests__/parse/inlineRef.test.d.ts +2 -0
  10. package/dist/__tests__/parse/inlineRef.test.d.ts.map +1 -0
  11. package/dist/__tests__/parse/inlineRef.test.js +83 -0
  12. package/dist/__tests__/parse/inlineRef.test.js.map +1 -0
  13. package/dist/__tests__/parse/resourceDirective.test.d.ts +2 -0
  14. package/dist/__tests__/parse/resourceDirective.test.d.ts.map +1 -0
  15. package/dist/__tests__/parse/resourceDirective.test.js +55 -0
  16. package/dist/__tests__/parse/resourceDirective.test.js.map +1 -0
  17. package/dist/__tests__/pipeline/floatPlacement.test.d.ts +2 -0
  18. package/dist/__tests__/pipeline/floatPlacement.test.d.ts.map +1 -0
  19. package/dist/__tests__/pipeline/floatPlacement.test.js +141 -0
  20. package/dist/__tests__/pipeline/floatPlacement.test.js.map +1 -0
  21. package/dist/__tests__/pipeline/inlineRefRender.test.d.ts +2 -0
  22. package/dist/__tests__/pipeline/inlineRefRender.test.d.ts.map +1 -0
  23. package/dist/__tests__/pipeline/inlineRefRender.test.js +107 -0
  24. package/dist/__tests__/pipeline/inlineRefRender.test.js.map +1 -0
  25. package/dist/__tests__/pipeline/resourceNumbering.test.d.ts +2 -0
  26. package/dist/__tests__/pipeline/resourceNumbering.test.d.ts.map +1 -0
  27. package/dist/__tests__/pipeline/resourceNumbering.test.js +186 -0
  28. package/dist/__tests__/pipeline/resourceNumbering.test.js.map +1 -0
  29. package/dist/__tests__/table/model.test.d.ts +2 -0
  30. package/dist/__tests__/table/model.test.d.ts.map +1 -0
  31. package/dist/__tests__/table/model.test.js +187 -0
  32. package/dist/__tests__/table/model.test.js.map +1 -0
  33. package/dist/canvas-backend/blockRender.d.ts.map +1 -1
  34. package/dist/canvas-backend/blockRender.js +25 -6
  35. package/dist/canvas-backend/blockRender.js.map +1 -1
  36. package/dist/canvas-backend/headerFooter.d.ts +3 -2
  37. package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
  38. package/dist/canvas-backend/headerFooter.js +63 -2
  39. package/dist/canvas-backend/headerFooter.js.map +1 -1
  40. package/dist/canvas-backend/index.d.ts +2 -0
  41. package/dist/canvas-backend/index.d.ts.map +1 -1
  42. package/dist/canvas-backend/index.js +11 -0
  43. package/dist/canvas-backend/index.js.map +1 -1
  44. package/dist/canvas-backend/renderResourceBlock.d.ts +28 -0
  45. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -0
  46. package/dist/canvas-backend/renderResourceBlock.js +146 -0
  47. package/dist/canvas-backend/renderResourceBlock.js.map +1 -0
  48. package/dist/defaults/bodyText.d.ts.map +1 -1
  49. package/dist/defaults/bodyText.js +30 -0
  50. package/dist/defaults/bodyText.js.map +1 -1
  51. package/dist/defaults/captionStyle.d.ts +9 -0
  52. package/dist/defaults/captionStyle.d.ts.map +1 -0
  53. package/dist/defaults/captionStyle.js +74 -0
  54. package/dist/defaults/captionStyle.js.map +1 -0
  55. package/dist/defaults/debug.d.ts.map +1 -1
  56. package/dist/defaults/debug.js +6 -0
  57. package/dist/defaults/debug.js.map +1 -1
  58. package/dist/defaults/headerFooter.d.ts +20 -18
  59. package/dist/defaults/headerFooter.d.ts.map +1 -1
  60. package/dist/defaults/headerFooter.js +269 -165
  61. package/dist/defaults/headerFooter.js.map +1 -1
  62. package/dist/defaults/headings.d.ts.map +1 -1
  63. package/dist/defaults/headings.js +29 -6
  64. package/dist/defaults/headings.js.map +1 -1
  65. package/dist/defaults/index.d.ts +3 -0
  66. package/dist/defaults/index.d.ts.map +1 -1
  67. package/dist/defaults/index.js +19 -0
  68. package/dist/defaults/index.js.map +1 -1
  69. package/dist/defaults/resourceTypes.d.ts +8 -0
  70. package/dist/defaults/resourceTypes.d.ts.map +1 -0
  71. package/dist/defaults/resourceTypes.js +43 -0
  72. package/dist/defaults/resourceTypes.js.map +1 -0
  73. package/dist/defaults/shared.d.ts.map +1 -1
  74. package/dist/defaults/shared.js +30 -0
  75. package/dist/defaults/shared.js.map +1 -1
  76. package/dist/defaults/tableStyle.d.ts +11 -0
  77. package/dist/defaults/tableStyle.d.ts.map +1 -0
  78. package/dist/defaults/tableStyle.js +114 -0
  79. package/dist/defaults/tableStyle.js.map +1 -0
  80. package/dist/design/layout.d.ts +94 -0
  81. package/dist/design/layout.d.ts.map +1 -0
  82. package/dist/design/layout.js +642 -0
  83. package/dist/design/layout.js.map +1 -0
  84. package/dist/design/placeholders.d.ts +29 -0
  85. package/dist/design/placeholders.d.ts.map +1 -0
  86. package/dist/design/placeholders.js +126 -0
  87. package/dist/design/placeholders.js.map +1 -0
  88. package/dist/html-backend.d.ts.map +1 -1
  89. package/dist/html-backend.js +91 -1
  90. package/dist/html-backend.js.map +1 -1
  91. package/dist/index.d.ts +12 -5
  92. package/dist/index.d.ts.map +1 -1
  93. package/dist/index.js +6 -2
  94. package/dist/index.js.map +1 -1
  95. package/dist/knuthPlass/richAdapter.d.ts +1 -0
  96. package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
  97. package/dist/knuthPlass/richAdapter.js +2 -1
  98. package/dist/knuthPlass/richAdapter.js.map +1 -1
  99. package/dist/measure/cache.js +1 -1
  100. package/dist/measure/cache.js.map +1 -1
  101. package/dist/measure/rich.d.ts +7 -0
  102. package/dist/measure/rich.d.ts.map +1 -1
  103. package/dist/measure/rich.js +30 -0
  104. package/dist/measure/rich.js.map +1 -1
  105. package/dist/numbering.d.ts +16 -0
  106. package/dist/numbering.d.ts.map +1 -1
  107. package/dist/numbering.js +28 -18
  108. package/dist/numbering.js.map +1 -1
  109. package/dist/parse/blockParser.d.ts.map +1 -1
  110. package/dist/parse/blockParser.js +37 -9
  111. package/dist/parse/blockParser.js.map +1 -1
  112. package/dist/parse/inlineFormatting.d.ts +38 -0
  113. package/dist/parse/inlineFormatting.d.ts.map +1 -1
  114. package/dist/parse/inlineFormatting.js +84 -0
  115. package/dist/parse/inlineFormatting.js.map +1 -1
  116. package/dist/parse/sourceMapping.d.ts.map +1 -1
  117. package/dist/parse/sourceMapping.js +20 -0
  118. package/dist/parse/sourceMapping.js.map +1 -1
  119. package/dist/parse/types.d.ts +20 -1
  120. package/dist/parse/types.d.ts.map +1 -1
  121. package/dist/pipeline/build.d.ts.map +1 -1
  122. package/dist/pipeline/build.js +389 -17
  123. package/dist/pipeline/build.js.map +1 -1
  124. package/dist/pipeline/buildBlockKind.d.ts +14 -0
  125. package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
  126. package/dist/pipeline/buildBlockKind.js +16 -1
  127. package/dist/pipeline/buildBlockKind.js.map +1 -1
  128. package/dist/pipeline/buildHelpers.d.ts.map +1 -1
  129. package/dist/pipeline/buildHelpers.js +7 -1
  130. package/dist/pipeline/buildHelpers.js.map +1 -1
  131. package/dist/pipeline/buildMeasurement.d.ts +17 -1
  132. package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
  133. package/dist/pipeline/buildMeasurement.js +32 -0
  134. package/dist/pipeline/buildMeasurement.js.map +1 -1
  135. package/dist/pipeline/config.d.ts.map +1 -1
  136. package/dist/pipeline/config.js +3 -1
  137. package/dist/pipeline/config.js.map +1 -1
  138. package/dist/pipeline/floatPlacement.d.ts +45 -0
  139. package/dist/pipeline/floatPlacement.d.ts.map +1 -0
  140. package/dist/pipeline/floatPlacement.js +68 -0
  141. package/dist/pipeline/floatPlacement.js.map +1 -0
  142. package/dist/pipeline/headerFooter.d.ts +23 -7
  143. package/dist/pipeline/headerFooter.d.ts.map +1 -1
  144. package/dist/pipeline/headerFooter.js +258 -100
  145. package/dist/pipeline/headerFooter.js.map +1 -1
  146. package/dist/pipeline/placeholders.d.ts +6 -0
  147. package/dist/pipeline/placeholders.d.ts.map +1 -1
  148. package/dist/pipeline/placeholders.js +46 -0
  149. package/dist/pipeline/placeholders.js.map +1 -1
  150. package/dist/pipeline/placement.d.ts +15 -2
  151. package/dist/pipeline/placement.d.ts.map +1 -1
  152. package/dist/pipeline/placement.js +38 -3
  153. package/dist/pipeline/placement.js.map +1 -1
  154. package/dist/pipeline/resourceLayout.d.ts +58 -0
  155. package/dist/pipeline/resourceLayout.d.ts.map +1 -0
  156. package/dist/pipeline/resourceLayout.js +338 -0
  157. package/dist/pipeline/resourceLayout.js.map +1 -0
  158. package/dist/pipeline/resourceNumbering.d.ts +54 -0
  159. package/dist/pipeline/resourceNumbering.d.ts.map +1 -0
  160. package/dist/pipeline/resourceNumbering.js +218 -0
  161. package/dist/pipeline/resourceNumbering.js.map +1 -0
  162. package/dist/pipeline/styles.d.ts +6 -0
  163. package/dist/pipeline/styles.d.ts.map +1 -1
  164. package/dist/pipeline/styles.js +1 -1
  165. package/dist/pipeline/styles.js.map +1 -1
  166. package/dist/table/model.d.ts +53 -0
  167. package/dist/table/model.d.ts.map +1 -0
  168. package/dist/table/model.js +253 -0
  169. package/dist/table/model.js.map +1 -0
  170. package/dist/types.d.ts +397 -41
  171. package/dist/types.d.ts.map +1 -1
  172. package/dist/vdt.d.ts +165 -18
  173. package/dist/vdt.d.ts.map +1 -1
  174. package/dist/vdt.js.map +1 -1
  175. package/package.json +1 -1
@@ -18,7 +18,7 @@ export function createPageWithColumns(pageIndex, resolved, contentArea, pageWidt
18
18
  export function currentColumn(doc, cursor) {
19
19
  return doc.pages[cursor.pageIndex].columns[cursor.columnIndex];
20
20
  }
21
- export function advanceToNextColumn(doc, cursor, resolved, contentArea, pageWidthPx, pageHeightPx) {
21
+ export function advanceToNextColumn(doc, cursor, resolved, contentArea, pageWidthPx, pageHeightPx, onNewPage) {
22
22
  const page = doc.pages[cursor.pageIndex];
23
23
  if (cursor.columnIndex < page.columns.length - 1) {
24
24
  cursor.columnIndex++;
@@ -29,20 +29,25 @@ export function advanceToNextColumn(doc, cursor, resolved, contentArea, pageWidt
29
29
  doc.pages.push(newPage);
30
30
  cursor.pageIndex = newPage.index;
31
31
  cursor.columnIndex = 0;
32
+ // Let the caller reserve float bands at the top/bottom of the freshly
33
+ // opened page before any content flows into it. Only the content-flow
34
+ // advances pass this hook — parity / force-blank pages never receive
35
+ // floats because `enforcePageParity` calls this without `onNewPage`.
36
+ onNewPage?.(newPage);
32
37
  }
33
38
  }
34
39
  /** Advance `cursor` forward until it points to the first column of a new
35
40
  * page. No-op when the current page is empty (nothing placed yet) — avoids
36
41
  * emitting a blank leading page when a `:::pagebreak` directive lands
37
42
  * before any content. */
38
- export function advanceToNextPageBoundary(doc, cursor, resolved, contentArea, pageWidthPx, pageHeightPx) {
43
+ export function advanceToNextPageBoundary(doc, cursor, resolved, contentArea, pageWidthPx, pageHeightPx, onNewPage) {
39
44
  const curPage = doc.pages[cursor.pageIndex];
40
45
  const curPageEmpty = curPage.columns.every((c) => c.blocks.length === 0);
41
46
  if (curPageEmpty)
42
47
  return;
43
48
  const startPageIndex = cursor.pageIndex;
44
49
  do {
45
- advanceToNextColumn(doc, cursor, resolved, contentArea, pageWidthPx, pageHeightPx);
50
+ advanceToNextColumn(doc, cursor, resolved, contentArea, pageWidthPx, pageHeightPx, onNewPage);
46
51
  } while (cursor.pageIndex === startPageIndex);
47
52
  }
48
53
  /** After a forced page break, make sure the page we're sitting on has the
@@ -95,6 +100,36 @@ export function enforcePageParity(doc, cursor, resolved, contentArea, pageWidthP
95
100
  } while (cursor.pageIndex === startPageIndex);
96
101
  }
97
102
  }
103
+ /**
104
+ * Place a resource block (image / svg / table + caption) keeping it together as
105
+ * one atomic unit (issue #49 §7 — Placement). Resources never split mid-content
106
+ * for v1: if the group's combined height fits the remaining column space it is
107
+ * placed there; otherwise the cursor advances to the next column/page (without
108
+ * emitting a leading blank page when the current column is empty), and the
109
+ * resource is force-placed there even when it exceeds a single column's height.
110
+ *
111
+ * `spacingBefore` is consumed from the target column's available height before
112
+ * placement (collapsed against the previous block's bottom margin by the
113
+ * caller). Returns the height actually reserved for the block.
114
+ */
115
+ export function placeResourceBlock(block, groupHeight, spacingBefore, cursor, doc, resolved, contentArea, pageWidthPx, pageHeightPx) {
116
+ let col = currentColumn(doc, cursor);
117
+ const isFirstInColumn = col.blocks.length === 0;
118
+ const effectiveSpacing = isFirstInColumn ? 0 : spacingBefore;
119
+ const available = col.availableHeight - effectiveSpacing;
120
+ // Advance to the next column/page when the group does not fit and the current
121
+ // column already holds content. A group taller than a full column is placed
122
+ // anyway (no mid-split for v1) once it lands in an empty column.
123
+ if (groupHeight > available && col.blocks.length > 0) {
124
+ advanceToNextColumn(doc, cursor, resolved, contentArea, pageWidthPx, pageHeightPx);
125
+ col = currentColumn(doc, cursor);
126
+ }
127
+ const consumeSpacing = col.blocks.length === 0 ? 0 : spacingBefore;
128
+ if (consumeSpacing > 0)
129
+ col.availableHeight -= consumeSpacing;
130
+ placeBlockInColumn(block, groupHeight, col, cursor);
131
+ return groupHeight;
132
+ }
98
133
  export function placeBlockInColumn(block, blockHeight, col, cursor) {
99
134
  const y = col.bbox.y + (col.bbox.height - col.availableHeight);
100
135
  block.bbox = createBoundingBox(col.bbox.x, y, col.bbox.width, blockHeight);
@@ -1 +1 @@
1
- {"version":3,"file":"placement.js","sourceRoot":"","sources":["../../src/pipeline/placement.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"placement.js","sourceRoot":"","sources":["../../src/pipeline/placement.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Resource block layout (issue #49 §7 — Measurement).
3
+ *
4
+ * Turns a `Resource` + its computed number into a measured, placement-ready
5
+ * {@link ResolvedResourceBlock}. The result is fully self-contained so the
6
+ * canvas / PDF renderers can draw it synchronously without touching the parser
7
+ * or numbering pipeline again.
8
+ *
9
+ * Layout rules for v1 (kept intentionally simple — see the issue plan):
10
+ * - bitmap / svg: scale to the column width, preserving aspect ratio. The
11
+ * height follows from the intrinsic dimensions; svgs without intrinsic
12
+ * dimensions fall back to a 4:3 box at column width.
13
+ * - table: equal column split; each cell measured via the shared rich-text
14
+ * measurer; row height = max cell height (rowspans distribute across rows).
15
+ * - caption: measured via the rich-text measurer with the caption font, with
16
+ * the type's caption prefix + number prepended. Inline `:ref` spans resolve
17
+ * to their computed label and are tagged so renderers can colour / link them.
18
+ *
19
+ * Resource + caption are measured as one group; `totalHeight` is what goes to
20
+ * placement (resources paginate atomically — no mid-split for v1).
21
+ */
22
+ import type { InlineSpan } from '../parse';
23
+ import type { Resource, ResourceType } from '../types';
24
+ import type { ResolvedConfig, ResolvedResourceBlock } from '../vdt';
25
+ import type { ResourceNumberingMap } from './resourceNumbering';
26
+ export interface ResourceLayoutInput {
27
+ resource: Resource;
28
+ resourceType: ResourceType | undefined;
29
+ number: string;
30
+ resolved: ResolvedConfig;
31
+ /** Available column width in px. */
32
+ columnWidth: number;
33
+ /** Full numbering map — lets inline `:ref`s inside the caption resolve. */
34
+ resourceNumbering: ResourceNumberingMap;
35
+ resourceTypes: ResourceType[];
36
+ resources: Resource[];
37
+ }
38
+ /** Build a label for an inline `:ref` to a resource, honouring its `style` and
39
+ * optional override `text`. Mirrors the caption-prefix conventions. */
40
+ export declare function resolveRefLabel(ref: NonNullable<InlineSpan['ref']>, resourceNumbering: ResourceNumberingMap, resourceTypes: ResourceType[], resources: Resource[]): string;
41
+ /** Resolve inline `:ref` spans to their computed label, keeping the `ref`
42
+ * metadata so the rich-text measurer treats each label as one atomic,
43
+ * non-breaking token and tags the produced segment with `refResourceId`. */
44
+ export declare function resolveRefSpans(spans: InlineSpan[], resourceNumbering: ResourceNumberingMap, resourceTypes: ResourceType[], resources: Resource[], refStyle?: {
45
+ bold: boolean;
46
+ italic: boolean;
47
+ }): InlineSpan[];
48
+ /**
49
+ * Measure a resource block (image / svg / table) plus its caption into a
50
+ * placement-ready {@link ResolvedResourceBlock}. Returns the block and its
51
+ * combined height (figure body + gap + caption) — the value placement uses to
52
+ * decide whether the group fits the remaining column space.
53
+ */
54
+ export declare function layoutResourceBlock(input: ResourceLayoutInput): {
55
+ block: ResolvedResourceBlock;
56
+ totalHeight: number;
57
+ };
58
+ //# sourceMappingURL=resourceLayout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceLayout.d.ts","sourceRoot":"","sources":["../../src/pipeline/resourceLayout.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EACV,QAAQ,EACR,YAAY,EAIb,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EAItB,MAAM,QAAQ,CAAC;AAMhB,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAMhE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,YAAY,GAAG,SAAS,CAAC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,oCAAoC;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,iBAAiB,EAAE,oBAAoB,CAAC;IACxC,aAAa,EAAE,YAAY,EAAE,CAAC;IAC9B,SAAS,EAAE,QAAQ,EAAE,CAAC;CACvB;AAED;wEACwE;AACxE,wBAAgB,eAAe,CAC7B,GAAG,EAAE,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EACnC,iBAAiB,EAAE,oBAAoB,EACvC,aAAa,EAAE,YAAY,EAAE,EAC7B,SAAS,EAAE,QAAQ,EAAE,GACpB,MAAM,CAcR;AAWD;;6EAE6E;AAC7E,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EAAE,EACnB,iBAAiB,EAAE,oBAAoB,EACvC,aAAa,EAAE,YAAY,EAAE,EAC7B,SAAS,EAAE,QAAQ,EAAE,EACrB,QAAQ,CAAC,EAAE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,GAC5C,UAAU,EAAE,CAcd;AA+LD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,mBAAmB,GAAG;IAC/D,KAAK,EAAE,qBAAqB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB,CA2KA"}
@@ -0,0 +1,338 @@
1
+ /**
2
+ * Resource block layout (issue #49 §7 — Measurement).
3
+ *
4
+ * Turns a `Resource` + its computed number into a measured, placement-ready
5
+ * {@link ResolvedResourceBlock}. The result is fully self-contained so the
6
+ * canvas / PDF renderers can draw it synchronously without touching the parser
7
+ * or numbering pipeline again.
8
+ *
9
+ * Layout rules for v1 (kept intentionally simple — see the issue plan):
10
+ * - bitmap / svg: scale to the column width, preserving aspect ratio. The
11
+ * height follows from the intrinsic dimensions; svgs without intrinsic
12
+ * dimensions fall back to a 4:3 box at column width.
13
+ * - table: equal column split; each cell measured via the shared rich-text
14
+ * measurer; row height = max cell height (rowspans distribute across rows).
15
+ * - caption: measured via the rich-text measurer with the caption font, with
16
+ * the type's caption prefix + number prepended. Inline `:ref` spans resolve
17
+ * to their computed label and are tagged so renderers can colour / link them.
18
+ *
19
+ * Resource + caption are measured as one group; `totalHeight` is what goes to
20
+ * placement (resources paginate atomically — no mid-split for v1).
21
+ */
22
+ import { createBoundingBox } from '../vdt';
23
+ import { measureRichBlock, buildFontString } from '../measure';
24
+ import { dimensionToPx } from '../units';
25
+ import { extractInlineRefs, injectRefSpans, parseInlineFormatting } from '../parse/inlineFormatting';
26
+ import { resolveBodyStyle } from './styles';
27
+ /** Non-breaking space used to glue a resolved `:ref` label into a single
28
+ * atomic text token, so a post-measurement pass can tag it reliably. */
29
+ const NBSP = ' ';
30
+ /** Build a label for an inline `:ref` to a resource, honouring its `style` and
31
+ * optional override `text`. Mirrors the caption-prefix conventions. */
32
+ export function resolveRefLabel(ref, resourceNumbering, resourceTypes, resources) {
33
+ if (ref.text !== undefined && ref.text.length > 0)
34
+ return ref.text;
35
+ const entry = resourceNumbering[ref.resourceId];
36
+ const number = entry?.number ?? '?';
37
+ if (ref.style === 'number')
38
+ return number;
39
+ const resource = resources.find((r) => r.id === ref.resourceId);
40
+ const type = resource ? resourceTypes.find((t) => t.id === resource.typeId) : undefined;
41
+ if (ref.style === 'full') {
42
+ const name = type?.name ?? type?.shortLabel ?? '';
43
+ return name ? `${name}${NBSP}${number}` : number;
44
+ }
45
+ // default: short label + number (e.g. "Fig. 1.7")
46
+ const short = type?.shortLabel ?? type?.name ?? '';
47
+ return short ? `${short}${NBSP}${number}` : number;
48
+ }
49
+ /** Parse caption / table-cell content into inline spans, recognising the same
50
+ * inline `:ref{…}` microformat as body text so references inside captions and
51
+ * cells resolve to their computed labels (the cell/caption is self-contained,
52
+ * so source offsets are irrelevant here). */
53
+ function parseRefAwareSpans(content) {
54
+ const { cleaned, refs } = extractInlineRefs(content, 0);
55
+ return injectRefSpans(parseInlineFormatting(cleaned), refs);
56
+ }
57
+ /** Resolve inline `:ref` spans to their computed label, keeping the `ref`
58
+ * metadata so the rich-text measurer treats each label as one atomic,
59
+ * non-breaking token and tags the produced segment with `refResourceId`. */
60
+ export function resolveRefSpans(spans, resourceNumbering, resourceTypes, resources, refStyle) {
61
+ if (!spans.some((s) => s.ref))
62
+ return spans;
63
+ return spans.map((span) => {
64
+ if (!span.ref)
65
+ return span;
66
+ return {
67
+ ...span,
68
+ text: resolveRefLabel(span.ref, resourceNumbering, resourceTypes, resources),
69
+ // Reference labels carry their own emphasis (bold/italic) so the measurer
70
+ // selects the matching font; colour is applied by renderers via
71
+ // `refResourceId`.
72
+ bold: refStyle?.bold ?? span.bold,
73
+ italic: refStyle?.italic ?? span.italic,
74
+ };
75
+ });
76
+ }
77
+ /** Offset every line's bbox / baseline by `dy` (block-relative → block-relative
78
+ * shifted). Returns new line objects (FP-first). */
79
+ function shiftLines(lines, dx, dy) {
80
+ return lines.map((line) => ({
81
+ ...line,
82
+ bbox: createBoundingBox(line.bbox.x + dx, line.bbox.y + dy, line.bbox.width, line.bbox.height),
83
+ baseline: line.baseline + dy,
84
+ }));
85
+ }
86
+ /** Compute the displayed (column-fitted, aspect-preserved) size of a bitmap. */
87
+ function fitWidth(intrinsicW, intrinsicH, columnWidth) {
88
+ if (intrinsicW <= 0 || intrinsicH <= 0) {
89
+ // No intrinsic dims — default to a 4:3 box at column width.
90
+ return { width: columnWidth, height: columnWidth * 0.75 };
91
+ }
92
+ const width = Math.min(intrinsicW, columnWidth);
93
+ const height = (intrinsicH / intrinsicW) * width;
94
+ return { width, height };
95
+ }
96
+ /** Lay out an HTML-table resource: equal column split, per-cell rich-text
97
+ * measurement, row height = max measured cell height. Rowspans reserve their
98
+ * primary cell's full vertical extent. */
99
+ function layoutTable(model, columnWidth, style, resourceNumbering, resourceTypes, resources, refStyle) {
100
+ const { body, header, borderColor, borderWidthPx, cellPaddingPx } = style;
101
+ const rowCount = model.rows.length;
102
+ const colCount = rowCount > 0 ? Math.max(...model.rows.map((r) => r.length)) : 0;
103
+ const colWidth = colCount > 0 ? columnWidth / colCount : columnWidth;
104
+ const columnEdges = [];
105
+ for (let c = 0; c <= colCount; c++)
106
+ columnEdges.push(c * colWidth);
107
+ const measured = [];
108
+ const rowMinHeight = new Array(rowCount).fill(body.lineHeightPx);
109
+ for (let r = 0; r < rowCount; r++) {
110
+ const row = model.rows[r];
111
+ for (let c = 0; c < row.length; c++) {
112
+ const cell = row[c];
113
+ if (cell.hiddenBy)
114
+ continue;
115
+ const colSpan = Math.max(1, cell.colSpan ?? 1);
116
+ const rowSpan = Math.max(1, cell.rowSpan ?? 1);
117
+ const isHeader = cell.isHeader ?? r < (model.headerRowCount ?? 0);
118
+ const set = isHeader ? header : body;
119
+ const cellWidth = colSpan * colWidth - cellPaddingPx * 2;
120
+ const spans = resolveRefSpans(parseRefAwareSpans(cell.content), resourceNumbering, resourceTypes, resources, refStyle);
121
+ const m = measureRichBlock(spans, set.fontString, set.boldFontString, set.italicFontString, set.boldItalicFontString, Math.max(1, cellWidth), set.lineHeightPx, { textAlign: cell.align === 'center' ? 'center' : cell.align === 'right' ? 'left' : 'left' });
122
+ const contentHeight = Math.max(set.lineHeightPx, m.totalHeight) + cellPaddingPx * 2;
123
+ measured.push({
124
+ row: r,
125
+ col: c,
126
+ colSpan,
127
+ rowSpan,
128
+ isHeader,
129
+ align: cell.align ?? 'left',
130
+ verticalAlign: cell.verticalAlign ?? 'top',
131
+ lines: m.lines,
132
+ contentHeight,
133
+ });
134
+ // Single-row cells drive their row's minimum height directly.
135
+ if (rowSpan === 1) {
136
+ rowMinHeight[r] = Math.max(rowMinHeight[r], contentHeight);
137
+ }
138
+ }
139
+ }
140
+ // Distribute rowspan cells: ensure the spanned rows together fit the content.
141
+ for (const m of measured) {
142
+ if (m.rowSpan <= 1)
143
+ continue;
144
+ let spannedHeight = 0;
145
+ for (let r = m.row; r < m.row + m.rowSpan && r < rowCount; r++) {
146
+ spannedHeight += rowMinHeight[r];
147
+ }
148
+ if (m.contentHeight > spannedHeight) {
149
+ const lastRow = Math.min(m.row + m.rowSpan - 1, rowCount - 1);
150
+ rowMinHeight[lastRow] = rowMinHeight[lastRow] + (m.contentHeight - spannedHeight);
151
+ }
152
+ }
153
+ const rowEdges = [0];
154
+ for (let r = 0; r < rowCount; r++)
155
+ rowEdges.push(rowEdges[r] + rowMinHeight[r]);
156
+ const tableHeight = rowEdges[rowCount] ?? 0;
157
+ const cells = measured.map((m) => {
158
+ const x0 = columnEdges[m.col] ?? 0;
159
+ const x1 = columnEdges[Math.min(m.col + m.colSpan, colCount)] ?? columnWidth;
160
+ const y0 = rowEdges[m.row] ?? 0;
161
+ const y1 = rowEdges[Math.min(m.row + m.rowSpan, rowCount)] ?? tableHeight;
162
+ const rect = createBoundingBox(x0, y0, x1 - x0, y1 - y0);
163
+ // Place lines inside the cell with padding; horizontal alignment is applied
164
+ // by the renderer via the cell rect + align flag.
165
+ const placed = shiftLines(m.lines, x0 + cellPaddingPx, y0 + cellPaddingPx);
166
+ return {
167
+ row: m.row,
168
+ col: m.col,
169
+ colSpan: m.colSpan,
170
+ rowSpan: m.rowSpan,
171
+ isHeader: m.isHeader,
172
+ align: m.align,
173
+ verticalAlign: m.verticalAlign,
174
+ rect,
175
+ lines: placed,
176
+ };
177
+ });
178
+ const layout = {
179
+ fontString: body.fontString,
180
+ boldFontString: body.boldFontString,
181
+ italicFontString: body.italicFontString,
182
+ boldItalicFontString: body.boldItalicFontString,
183
+ color: body.color,
184
+ headerFontString: header.fontString,
185
+ headerBoldFontString: header.boldFontString,
186
+ headerItalicFontString: header.italicFontString,
187
+ headerBoldItalicFontString: header.boldItalicFontString,
188
+ headerColor: header.color,
189
+ borderColor,
190
+ borderWidthPx,
191
+ headerBackground: style.headerBackground,
192
+ bodyBackground: style.bodyBackground,
193
+ cells,
194
+ columnEdges,
195
+ rowEdges,
196
+ };
197
+ return { layout, height: tableHeight };
198
+ }
199
+ /**
200
+ * Measure a resource block (image / svg / table) plus its caption into a
201
+ * placement-ready {@link ResolvedResourceBlock}. Returns the block and its
202
+ * combined height (figure body + gap + caption) — the value placement uses to
203
+ * decide whether the group fits the remaining column space.
204
+ */
205
+ export function layoutResourceBlock(input) {
206
+ const { resource, resourceType, number, resolved, columnWidth, resourceNumbering, resourceTypes, resources, } = input;
207
+ const bodyStyle = resolveBodyStyle(resolved);
208
+ const dpi = resolved.page.dpi;
209
+ // Normal / bold weights reused for table + caption font sets.
210
+ const normalWeight = resolved.bodyText.fontWeight.toString();
211
+ const boldWeight = resolved.bodyText.boldFontWeight.toString();
212
+ // Line-height ratio of the body text — applied to any custom table/caption
213
+ // font size so a resized run keeps a proportional leading (and reproduces the
214
+ // previous heights exactly when the size is left at the body default).
215
+ const lineHeightRatio = bodyStyle.lineHeightPx / bodyStyle.fontSizePx;
216
+ // Inline `:ref` emphasis (bold/italic), applied to refs in captions + cells.
217
+ const refStyle = { bold: resolved.bodyText.referenceBold, italic: resolved.bodyText.referenceItalic };
218
+ // --- Figure body -------------------------------------------------------
219
+ let bodyWidth = columnWidth;
220
+ let bodyHeight = 0;
221
+ let table;
222
+ let fileId;
223
+ let format;
224
+ if (resource.kind === 'bitmap' && resource.bitmap) {
225
+ fileId = resource.bitmap.fileId;
226
+ format = resource.bitmap.format;
227
+ const fit = fitWidth(resource.bitmap.width, resource.bitmap.height, columnWidth);
228
+ bodyWidth = fit.width;
229
+ bodyHeight = fit.height;
230
+ }
231
+ else if (resource.kind === 'svg' && resource.svg) {
232
+ fileId = resource.svg.fileId;
233
+ // SVGs are vector: fill the column width and derive height from the
234
+ // intrinsic aspect ratio (viewBox / width:height). Fall back to a 4:3 box
235
+ // only when no intrinsic size was captured.
236
+ const iw = resource.svg.width ?? 0;
237
+ const ih = resource.svg.height ?? 0;
238
+ bodyWidth = columnWidth;
239
+ bodyHeight = iw > 0 && ih > 0 ? columnWidth * (ih / iw) : columnWidth * 0.75;
240
+ }
241
+ else if (resource.kind === 'table' && resource.table) {
242
+ const ts = resolved.tableStyle;
243
+ const bodyFontPx = dimensionToPx(ts.bodyFontSize, dpi);
244
+ const headerFontPx = dimensionToPx(ts.headerFontSize, dpi);
245
+ // Header weight/slant: the header's base run is bold (and/or italic) by
246
+ // default; inline markup still toggles relative to that base, mirroring the
247
+ // blockquote/heading italic-flip convention.
248
+ const hWeight = ts.headerBold ? boldWeight : normalWeight;
249
+ const hBase = ts.headerItalic ? 'italic' : 'normal';
250
+ const hFlip = ts.headerItalic ? 'normal' : 'italic';
251
+ const style = {
252
+ body: {
253
+ fontString: buildFontString(ts.bodyFontFamily, bodyFontPx, normalWeight),
254
+ boldFontString: buildFontString(ts.bodyFontFamily, bodyFontPx, boldWeight),
255
+ italicFontString: buildFontString(ts.bodyFontFamily, bodyFontPx, normalWeight, 'italic'),
256
+ boldItalicFontString: buildFontString(ts.bodyFontFamily, bodyFontPx, boldWeight, 'italic'),
257
+ color: ts.bodyColor.hex,
258
+ lineHeightPx: bodyFontPx * lineHeightRatio,
259
+ },
260
+ header: {
261
+ fontString: buildFontString(ts.headerFontFamily, headerFontPx, hWeight, hBase),
262
+ boldFontString: buildFontString(ts.headerFontFamily, headerFontPx, boldWeight, hBase),
263
+ italicFontString: buildFontString(ts.headerFontFamily, headerFontPx, hWeight, hFlip),
264
+ boldItalicFontString: buildFontString(ts.headerFontFamily, headerFontPx, boldWeight, hFlip),
265
+ color: ts.headerColor.hex,
266
+ lineHeightPx: headerFontPx * lineHeightRatio,
267
+ },
268
+ borderColor: ts.borderColor.hex,
269
+ borderWidthPx: ts.borders ? Math.max(1, Math.round(dimensionToPx(ts.borderWidth, dpi))) : 0,
270
+ cellPaddingPx: dimensionToPx(ts.cellPadding, dpi, bodyFontPx),
271
+ headerBackground: ts.headerBackgroundEnabled ? ts.headerBackground.hex : undefined,
272
+ bodyBackground: ts.bodyBackgroundEnabled ? ts.bodyBackground.hex : undefined,
273
+ };
274
+ const { layout, height } = layoutTable(resource.table.model, columnWidth, style, resourceNumbering, resourceTypes, resources, refStyle);
275
+ table = layout;
276
+ bodyWidth = columnWidth;
277
+ bodyHeight = height;
278
+ }
279
+ const bodyRect = createBoundingBox(0, 0, bodyWidth, bodyHeight);
280
+ // --- Caption -----------------------------------------------------------
281
+ const cs = resolved.captionStyle;
282
+ const captionFontPx = dimensionToPx(cs.fontSize, dpi);
283
+ const captionLineHeightPx = captionFontPx * lineHeightRatio;
284
+ const captionGapPx = dimensionToPx(cs.gap, dpi, captionFontPx);
285
+ // Caption font set (label + description share one typeface/size; weight and
286
+ // slant vary per span).
287
+ const captionFontString = buildFontString(cs.fontFamily, captionFontPx, normalWeight);
288
+ const captionBoldFontString = buildFontString(cs.fontFamily, captionFontPx, boldWeight);
289
+ const captionItalicFontString = buildFontString(cs.fontFamily, captionFontPx, normalWeight, 'italic');
290
+ const captionBoldItalicFontString = buildFontString(cs.fontFamily, captionFontPx, boldWeight, 'italic');
291
+ const captionPrefix = resourceType?.captionPrefix ?? '';
292
+ // Inline `:ref` labels render in the configured reference colour (defaults to
293
+ // the emphasis/bold colour).
294
+ const linkColor = resolved.bodyText.referenceColor.hex;
295
+ let captionLines = [];
296
+ const captionText = resource.caption ?? '';
297
+ const hasCaption = captionText.trim().length > 0 || captionPrefix.length > 0;
298
+ if (hasCaption) {
299
+ // Prefix span: "<captionPrefix> <number>. " (non-breaking inside the label).
300
+ const prefixText = captionPrefix.length > 0
301
+ ? `${captionPrefix}${NBSP}${number}.${number ? ' ' : ''}`
302
+ : '';
303
+ const resolvedSpans = resolveRefSpans(parseRefAwareSpans(captionText), resourceNumbering, resourceTypes, resources, refStyle);
304
+ // Description spans pick up the configured slant on top of their own markup.
305
+ const descSpans = cs.descriptionItalic
306
+ ? resolvedSpans.map((s) => ({ ...s, italic: s.italic || true }))
307
+ : resolvedSpans;
308
+ const allSpans = prefixText.length > 0
309
+ ? [{ text: prefixText, bold: cs.labelBold, italic: cs.labelItalic, captionLabel: true }, ...descSpans]
310
+ : descSpans;
311
+ const measured = measureRichBlock(allSpans, captionFontString, captionBoldFontString, captionItalicFontString, captionBoldItalicFontString, Math.max(1, columnWidth), captionLineHeightPx, { textAlign: cs.align });
312
+ captionLines = shiftLines(measured.lines, 0, bodyHeight + captionGapPx);
313
+ }
314
+ const captionHeight = captionLines.length > 0
315
+ ? captionLines.length * captionLineHeightPx + captionGapPx
316
+ : 0;
317
+ const totalHeight = bodyHeight + captionHeight;
318
+ const block = {
319
+ resource,
320
+ kind: resource.kind,
321
+ number,
322
+ captionPrefix,
323
+ bodyRect,
324
+ fileId,
325
+ format,
326
+ captionLines,
327
+ captionFontString,
328
+ captionBoldFontString,
329
+ captionItalicFontString,
330
+ captionBoldItalicFontString,
331
+ captionColor: cs.color.hex,
332
+ captionLabelColor: cs.labelColor.hex,
333
+ linkColor,
334
+ table,
335
+ };
336
+ return { block, totalHeight };
337
+ }
338
+ //# sourceMappingURL=resourceLayout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceLayout.js","sourceRoot":"","sources":["../../src/pipeline/resourceLayout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Resource numbering pipeline (issue #49 §3).
3
+ *
4
+ * Assigns a rendered number string (e.g. `"1.7"`) to every resource referenced
5
+ * in the document. Numbering follows **order of first reference** in reading
6
+ * order — a resource is numbered the first time it is encountered, whether via
7
+ * a `::resource{…}` block embed or an inline `:ref{…}`. Inserting a new
8
+ * reference earlier in the document therefore auto-renumbers the rest.
9
+ *
10
+ * The renderer is shared with heading numbering through
11
+ * {@link renderCounterTemplate}; only the template syntax differs. Resource
12
+ * templates use `{n}` for the per-type counter and `{h1}`..`{h6}` for the
13
+ * heading numbers in effect at the point of first reference.
14
+ */
15
+ import type { ContentBlock } from '../parse';
16
+ import type { Resource, ResourceType } from '../types';
17
+ /** Heading counters (1-indexed by level) in effect at a given point in the
18
+ * document. `h1`..`h6` carry the running heading number for each level. */
19
+ export interface HeadingContext {
20
+ h1: number;
21
+ h2: number;
22
+ h3: number;
23
+ h4: number;
24
+ h5: number;
25
+ h6: number;
26
+ }
27
+ export interface ResourceNumberEntry {
28
+ /** The rendered number string (e.g. `"1.7"`). */
29
+ number: string;
30
+ /** The `ResourceType.id` this number was computed for. */
31
+ typeId: string;
32
+ /** The heading counters in effect at the point of first reference. */
33
+ heading: HeadingContext;
34
+ }
35
+ /** Maps each referenced `Resource.id` to its computed numbering entry. */
36
+ export type ResourceNumberingMap = Record<string, ResourceNumberEntry>;
37
+ /** Walk `blocks` and produce, for each block index, the heading counters in
38
+ * effect at that block. A heading at index `i` is reflected in
39
+ * `result[i]` (i.e. the heading counts itself). Mirrors the counter logic in
40
+ * `computeHeadingNumbers` but exposes the raw per-level values rather than the
41
+ * rendered prefix. */
42
+ export declare function computeHeadingContext(blocks: ContentBlock[]): HeadingContext[];
43
+ /**
44
+ * Compute the numbering map for every resource referenced in `blocks`.
45
+ *
46
+ * @param blocks parsed content blocks in reading order
47
+ * @param resourceTypes user-defined resource types (drives template + reset)
48
+ * @param resources known resources (maps `resourceId → typeId`)
49
+ * @param headingContext per-block heading counters (see
50
+ * {@link computeHeadingContext}); must align with
51
+ * `blocks` by index
52
+ */
53
+ export declare function computeResourceNumbering(blocks: ContentBlock[], resourceTypes: ResourceType[], resources: Resource[], headingContext: HeadingContext[]): ResourceNumberingMap;
54
+ //# sourceMappingURL=resourceNumbering.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resourceNumbering.d.ts","sourceRoot":"","sources":["../../src/pipeline/resourceNumbering.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAyB,MAAM,UAAU,CAAC;AAQ9E;4EAC4E;AAC5E,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;CACZ;AAED,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,OAAO,EAAE,cAAc,CAAC;CACzB;AAED,0EAA0E;AAC1E,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;AAsBvE;;;;uBAIuB;AACvB,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,EAAE,GAAG,cAAc,EAAE,CAoB9E;AAoGD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,EAAE,EACtB,aAAa,EAAE,YAAY,EAAE,EAC7B,SAAS,EAAE,QAAQ,EAAE,EACrB,cAAc,EAAE,cAAc,EAAE,GAC/B,oBAAoB,CAwEtB"}