postext 0.3.15 → 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.
- package/dist/__tests__/createLayout.test.js +12 -13
- package/dist/__tests__/createLayout.test.js.map +1 -1
- package/dist/__tests__/defaults/resourceTypes.test.d.ts +2 -0
- package/dist/__tests__/defaults/resourceTypes.test.d.ts.map +1 -0
- package/dist/__tests__/defaults/resourceTypes.test.js +69 -0
- package/dist/__tests__/defaults/resourceTypes.test.js.map +1 -0
- package/dist/__tests__/exports.test.js +54 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/parse/inlineRef.test.d.ts +2 -0
- package/dist/__tests__/parse/inlineRef.test.d.ts.map +1 -0
- package/dist/__tests__/parse/inlineRef.test.js +83 -0
- package/dist/__tests__/parse/inlineRef.test.js.map +1 -0
- package/dist/__tests__/parse/resourceDirective.test.d.ts +2 -0
- package/dist/__tests__/parse/resourceDirective.test.d.ts.map +1 -0
- package/dist/__tests__/parse/resourceDirective.test.js +55 -0
- package/dist/__tests__/parse/resourceDirective.test.js.map +1 -0
- package/dist/__tests__/pipeline/floatPlacement.test.d.ts +2 -0
- package/dist/__tests__/pipeline/floatPlacement.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/floatPlacement.test.js +141 -0
- package/dist/__tests__/pipeline/floatPlacement.test.js.map +1 -0
- package/dist/__tests__/pipeline/inlineRefRender.test.d.ts +2 -0
- package/dist/__tests__/pipeline/inlineRefRender.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/inlineRefRender.test.js +107 -0
- package/dist/__tests__/pipeline/inlineRefRender.test.js.map +1 -0
- package/dist/__tests__/pipeline/resourceNumbering.test.d.ts +2 -0
- package/dist/__tests__/pipeline/resourceNumbering.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/resourceNumbering.test.js +186 -0
- package/dist/__tests__/pipeline/resourceNumbering.test.js.map +1 -0
- package/dist/__tests__/table/model.test.d.ts +2 -0
- package/dist/__tests__/table/model.test.d.ts.map +1 -0
- package/dist/__tests__/table/model.test.js +187 -0
- package/dist/__tests__/table/model.test.js.map +1 -0
- package/dist/canvas-backend/blockRender.d.ts.map +1 -1
- package/dist/canvas-backend/blockRender.js +25 -6
- package/dist/canvas-backend/blockRender.js.map +1 -1
- package/dist/canvas-backend/headerFooter.d.ts +3 -2
- package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
- package/dist/canvas-backend/headerFooter.js +63 -2
- package/dist/canvas-backend/headerFooter.js.map +1 -1
- package/dist/canvas-backend/index.d.ts +2 -0
- package/dist/canvas-backend/index.d.ts.map +1 -1
- package/dist/canvas-backend/index.js +11 -0
- package/dist/canvas-backend/index.js.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.d.ts +28 -0
- package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -0
- package/dist/canvas-backend/renderResourceBlock.js +146 -0
- package/dist/canvas-backend/renderResourceBlock.js.map +1 -0
- package/dist/defaults/bodyText.d.ts.map +1 -1
- package/dist/defaults/bodyText.js +30 -0
- package/dist/defaults/bodyText.js.map +1 -1
- package/dist/defaults/captionStyle.d.ts +9 -0
- package/dist/defaults/captionStyle.d.ts.map +1 -0
- package/dist/defaults/captionStyle.js +74 -0
- package/dist/defaults/captionStyle.js.map +1 -0
- package/dist/defaults/debug.d.ts.map +1 -1
- package/dist/defaults/debug.js +6 -0
- package/dist/defaults/debug.js.map +1 -1
- package/dist/defaults/headerFooter.d.ts +20 -18
- package/dist/defaults/headerFooter.d.ts.map +1 -1
- package/dist/defaults/headerFooter.js +269 -165
- package/dist/defaults/headerFooter.js.map +1 -1
- package/dist/defaults/headings.d.ts.map +1 -1
- package/dist/defaults/headings.js +29 -6
- package/dist/defaults/headings.js.map +1 -1
- package/dist/defaults/index.d.ts +3 -0
- package/dist/defaults/index.d.ts.map +1 -1
- package/dist/defaults/index.js +19 -0
- package/dist/defaults/index.js.map +1 -1
- package/dist/defaults/resourceTypes.d.ts +8 -0
- package/dist/defaults/resourceTypes.d.ts.map +1 -0
- package/dist/defaults/resourceTypes.js +43 -0
- package/dist/defaults/resourceTypes.js.map +1 -0
- package/dist/defaults/shared.d.ts.map +1 -1
- package/dist/defaults/shared.js +30 -0
- package/dist/defaults/shared.js.map +1 -1
- package/dist/defaults/tableStyle.d.ts +11 -0
- package/dist/defaults/tableStyle.d.ts.map +1 -0
- package/dist/defaults/tableStyle.js +114 -0
- package/dist/defaults/tableStyle.js.map +1 -0
- package/dist/design/layout.d.ts +94 -0
- package/dist/design/layout.d.ts.map +1 -0
- package/dist/design/layout.js +642 -0
- package/dist/design/layout.js.map +1 -0
- package/dist/design/placeholders.d.ts +29 -0
- package/dist/design/placeholders.d.ts.map +1 -0
- package/dist/design/placeholders.js +126 -0
- package/dist/design/placeholders.js.map +1 -0
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +91 -1
- package/dist/html-backend.js.map +1 -1
- package/dist/index.d.ts +12 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/knuthPlass/richAdapter.d.ts +1 -0
- package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
- package/dist/knuthPlass/richAdapter.js +2 -1
- package/dist/knuthPlass/richAdapter.js.map +1 -1
- package/dist/measure/cache.js +1 -1
- package/dist/measure/cache.js.map +1 -1
- package/dist/measure/rich.d.ts +7 -0
- package/dist/measure/rich.d.ts.map +1 -1
- package/dist/measure/rich.js +30 -0
- package/dist/measure/rich.js.map +1 -1
- package/dist/numbering.d.ts +16 -0
- package/dist/numbering.d.ts.map +1 -1
- package/dist/numbering.js +28 -18
- package/dist/numbering.js.map +1 -1
- package/dist/parse/blockParser.d.ts.map +1 -1
- package/dist/parse/blockParser.js +37 -9
- package/dist/parse/blockParser.js.map +1 -1
- package/dist/parse/inlineFormatting.d.ts +38 -0
- package/dist/parse/inlineFormatting.d.ts.map +1 -1
- package/dist/parse/inlineFormatting.js +84 -0
- package/dist/parse/inlineFormatting.js.map +1 -1
- package/dist/parse/sourceMapping.d.ts.map +1 -1
- package/dist/parse/sourceMapping.js +20 -0
- package/dist/parse/sourceMapping.js.map +1 -1
- package/dist/parse/types.d.ts +20 -1
- package/dist/parse/types.d.ts.map +1 -1
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +389 -17
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/buildBlockKind.d.ts +14 -0
- package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
- package/dist/pipeline/buildBlockKind.js +16 -1
- package/dist/pipeline/buildBlockKind.js.map +1 -1
- package/dist/pipeline/buildHelpers.d.ts.map +1 -1
- package/dist/pipeline/buildHelpers.js +7 -1
- package/dist/pipeline/buildHelpers.js.map +1 -1
- package/dist/pipeline/buildMeasurement.d.ts +17 -1
- package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
- package/dist/pipeline/buildMeasurement.js +32 -0
- package/dist/pipeline/buildMeasurement.js.map +1 -1
- package/dist/pipeline/config.d.ts.map +1 -1
- package/dist/pipeline/config.js +3 -1
- package/dist/pipeline/config.js.map +1 -1
- package/dist/pipeline/floatPlacement.d.ts +45 -0
- package/dist/pipeline/floatPlacement.d.ts.map +1 -0
- package/dist/pipeline/floatPlacement.js +68 -0
- package/dist/pipeline/floatPlacement.js.map +1 -0
- package/dist/pipeline/headerFooter.d.ts +23 -7
- package/dist/pipeline/headerFooter.d.ts.map +1 -1
- package/dist/pipeline/headerFooter.js +258 -100
- package/dist/pipeline/headerFooter.js.map +1 -1
- package/dist/pipeline/placeholders.d.ts +6 -0
- package/dist/pipeline/placeholders.d.ts.map +1 -1
- package/dist/pipeline/placeholders.js +46 -0
- package/dist/pipeline/placeholders.js.map +1 -1
- package/dist/pipeline/placement.d.ts +15 -2
- package/dist/pipeline/placement.d.ts.map +1 -1
- package/dist/pipeline/placement.js +38 -3
- package/dist/pipeline/placement.js.map +1 -1
- package/dist/pipeline/resourceLayout.d.ts +58 -0
- package/dist/pipeline/resourceLayout.d.ts.map +1 -0
- package/dist/pipeline/resourceLayout.js +338 -0
- package/dist/pipeline/resourceLayout.js.map +1 -0
- package/dist/pipeline/resourceNumbering.d.ts +54 -0
- package/dist/pipeline/resourceNumbering.d.ts.map +1 -0
- package/dist/pipeline/resourceNumbering.js +218 -0
- package/dist/pipeline/resourceNumbering.js.map +1 -0
- package/dist/pipeline/styles.d.ts +6 -0
- package/dist/pipeline/styles.d.ts.map +1 -1
- package/dist/pipeline/styles.js +1 -1
- package/dist/pipeline/styles.js.map +1 -1
- package/dist/table/model.d.ts +53 -0
- package/dist/table/model.d.ts.map +1 -0
- package/dist/table/model.js +253 -0
- package/dist/table/model.js.map +1 -0
- package/dist/types.d.ts +397 -41
- package/dist/types.d.ts.map +1 -1
- package/dist/vdt.d.ts +165 -18
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js.map +1 -1
- 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":"AAAA,OAAO,EACL,iBAAiB,EACjB,aAAa,EACb,eAAe,GAQhB,MAAM,QAAQ,CAAC;AAEhB,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAO/C,MAAM,UAAU,kBAAkB,CAChC,KAAgB,EAChB,YAAoB;IAEpB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7B,GAAG,IAAI;QACP,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,GAAG,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC;QACrF,QAAQ,EAAE,CAAC,GAAG,YAAY,GAAG,YAAY,GAAG,GAAG;KAChD,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,SAAiB,EACjB,QAAwB,EACxB,WAAwB,EACxB,WAAmB,EACnB,YAAoB;IAEpB,MAAM,IAAI,GAAG,aAAa,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,mBAAmB,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAC7D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAgB,EAAE,MAAuB;IACrE,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,CAAE,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAE,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,GAAgB,EAChB,MAAuB,EACvB,QAAwB,EACxB,WAAwB,EACxB,WAAmB,EACnB,YAAoB;
|
|
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"}
|