postext 0.3.19 → 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.
- package/dist/__tests__/defaults/calloutStyles.test.d.ts +2 -0
- package/dist/__tests__/defaults/calloutStyles.test.d.ts.map +1 -0
- package/dist/__tests__/defaults/calloutStyles.test.js +201 -0
- package/dist/__tests__/defaults/calloutStyles.test.js.map +1 -0
- package/dist/__tests__/defaults/captionStyle.test.d.ts +2 -0
- package/dist/__tests__/defaults/captionStyle.test.d.ts.map +1 -0
- package/dist/__tests__/defaults/captionStyle.test.js +87 -0
- package/dist/__tests__/defaults/captionStyle.test.js.map +1 -0
- package/dist/__tests__/defaults/pageSizePreset.test.d.ts +2 -0
- package/dist/__tests__/defaults/pageSizePreset.test.d.ts.map +1 -0
- package/dist/__tests__/defaults/pageSizePreset.test.js +24 -0
- package/dist/__tests__/defaults/pageSizePreset.test.js.map +1 -0
- package/dist/__tests__/defaults/paragraphStyles.test.d.ts +2 -0
- package/dist/__tests__/defaults/paragraphStyles.test.d.ts.map +1 -0
- package/dist/__tests__/defaults/paragraphStyles.test.js +93 -0
- package/dist/__tests__/defaults/paragraphStyles.test.js.map +1 -0
- package/dist/__tests__/design/pageAnchors.test.d.ts +2 -0
- package/dist/__tests__/design/pageAnchors.test.d.ts.map +1 -0
- package/dist/__tests__/design/pageAnchors.test.js +140 -0
- package/dist/__tests__/design/pageAnchors.test.js.map +1 -0
- package/dist/__tests__/directives.test.js +58 -0
- package/dist/__tests__/directives.test.js.map +1 -1
- package/dist/__tests__/exports.test.js +19 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/mirroredMargins.test.d.ts +2 -0
- package/dist/__tests__/mirroredMargins.test.d.ts.map +1 -0
- package/dist/__tests__/mirroredMargins.test.js +136 -0
- package/dist/__tests__/mirroredMargins.test.js.map +1 -0
- package/dist/__tests__/numbering.test.js +54 -0
- package/dist/__tests__/numbering.test.js.map +1 -1
- package/dist/__tests__/openerTitleSource.test.d.ts +2 -0
- package/dist/__tests__/openerTitleSource.test.d.ts.map +1 -0
- package/dist/__tests__/openerTitleSource.test.js +108 -0
- package/dist/__tests__/openerTitleSource.test.js.map +1 -0
- package/dist/__tests__/pageRoles.test.d.ts +2 -0
- package/dist/__tests__/pageRoles.test.d.ts.map +1 -0
- package/dist/__tests__/pageRoles.test.js +95 -0
- package/dist/__tests__/pageRoles.test.js.map +1 -0
- package/dist/__tests__/parse/containers.test.d.ts +2 -0
- package/dist/__tests__/parse/containers.test.d.ts.map +1 -0
- package/dist/__tests__/parse/containers.test.js +204 -0
- package/dist/__tests__/parse/containers.test.js.map +1 -0
- package/dist/__tests__/parse/headingAttrs.test.d.ts +2 -0
- package/dist/__tests__/parse/headingAttrs.test.d.ts.map +1 -0
- package/dist/__tests__/parse/headingAttrs.test.js +62 -0
- package/dist/__tests__/parse/headingAttrs.test.js.map +1 -0
- package/dist/__tests__/parse/inlineRef.test.js +26 -0
- package/dist/__tests__/parse/inlineRef.test.js.map +1 -1
- package/dist/__tests__/parts.test.d.ts +2 -0
- package/dist/__tests__/parts.test.d.ts.map +1 -0
- package/dist/__tests__/parts.test.js +405 -0
- package/dist/__tests__/parts.test.js.map +1 -0
- package/dist/__tests__/pipeline/calloutLayout.test.d.ts +2 -0
- package/dist/__tests__/pipeline/calloutLayout.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/calloutLayout.test.js +273 -0
- package/dist/__tests__/pipeline/calloutLayout.test.js.map +1 -0
- package/dist/__tests__/pipeline/calloutPlacement.test.d.ts +2 -0
- package/dist/__tests__/pipeline/calloutPlacement.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/calloutPlacement.test.js +239 -0
- package/dist/__tests__/pipeline/calloutPlacement.test.js.map +1 -0
- package/dist/__tests__/pipeline/captionLayout.test.d.ts +2 -0
- package/dist/__tests__/pipeline/captionLayout.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/captionLayout.test.js +269 -0
- package/dist/__tests__/pipeline/captionLayout.test.js.map +1 -0
- package/dist/__tests__/pipeline/inlineRefRender.test.js +53 -0
- package/dist/__tests__/pipeline/inlineRefRender.test.js.map +1 -1
- package/dist/__tests__/pipeline/orderedSeparator.test.d.ts +2 -0
- package/dist/__tests__/pipeline/orderedSeparator.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/orderedSeparator.test.js +196 -0
- package/dist/__tests__/pipeline/orderedSeparator.test.js.map +1 -0
- package/dist/__tests__/pipeline/paragraphStyles.test.d.ts +2 -0
- package/dist/__tests__/pipeline/paragraphStyles.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/paragraphStyles.test.js +172 -0
- package/dist/__tests__/pipeline/paragraphStyles.test.js.map +1 -0
- package/dist/__tests__/pipeline/spanBands.test.d.ts +2 -0
- package/dist/__tests__/pipeline/spanBands.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/spanBands.test.js +303 -0
- package/dist/__tests__/pipeline/spanBands.test.js.map +1 -0
- package/dist/__tests__/pipeline/spanBlocks.test.d.ts +2 -0
- package/dist/__tests__/pipeline/spanBlocks.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/spanBlocks.test.js +407 -0
- package/dist/__tests__/pipeline/spanBlocks.test.js.map +1 -0
- package/dist/__tests__/placeholders.test.d.ts +2 -0
- package/dist/__tests__/placeholders.test.d.ts.map +1 -0
- package/dist/__tests__/placeholders.test.js +130 -0
- package/dist/__tests__/placeholders.test.js.map +1 -0
- package/dist/__tests__/table/model.test.js +24 -0
- package/dist/__tests__/table/model.test.js.map +1 -1
- package/dist/canvas-backend/blockRender.d.ts.map +1 -1
- package/dist/canvas-backend/blockRender.js +13 -1
- package/dist/canvas-backend/blockRender.js.map +1 -1
- package/dist/canvas-backend/decorations.d.ts +3 -0
- package/dist/canvas-backend/decorations.d.ts.map +1 -1
- package/dist/canvas-backend/decorations.js +14 -8
- package/dist/canvas-backend/decorations.js.map +1 -1
- package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
- package/dist/canvas-backend/headerFooter.js +23 -0
- package/dist/canvas-backend/headerFooter.js.map +1 -1
- package/dist/canvas-backend/index.d.ts.map +1 -1
- package/dist/canvas-backend/index.js +4 -2
- package/dist/canvas-backend/index.js.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.js +33 -5
- package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
- package/dist/columnRule.d.ts +19 -0
- package/dist/columnRule.d.ts.map +1 -0
- package/dist/columnRule.js +36 -0
- package/dist/columnRule.js.map +1 -0
- package/dist/defaults/calloutStyles.d.ts +61 -0
- package/dist/defaults/calloutStyles.d.ts.map +1 -0
- package/dist/defaults/calloutStyles.js +292 -0
- package/dist/defaults/calloutStyles.js.map +1 -0
- package/dist/defaults/captionStyle.d.ts +11 -1
- package/dist/defaults/captionStyle.d.ts.map +1 -1
- package/dist/defaults/captionStyle.js +127 -2
- package/dist/defaults/captionStyle.js.map +1 -1
- package/dist/defaults/headerFooter.d.ts.map +1 -1
- package/dist/defaults/headerFooter.js +3 -0
- package/dist/defaults/headerFooter.js.map +1 -1
- package/dist/defaults/headings.d.ts.map +1 -1
- package/dist/defaults/headings.js +12 -6
- package/dist/defaults/headings.js.map +1 -1
- package/dist/defaults/index.d.ts +4 -1
- package/dist/defaults/index.d.ts.map +1 -1
- package/dist/defaults/index.js +28 -1
- package/dist/defaults/index.js.map +1 -1
- package/dist/defaults/orderedLists.d.ts +9 -8
- package/dist/defaults/orderedLists.d.ts.map +1 -1
- package/dist/defaults/orderedLists.js +66 -4
- package/dist/defaults/orderedLists.js.map +1 -1
- package/dist/defaults/page.d.ts.map +1 -1
- package/dist/defaults/page.js +14 -3
- package/dist/defaults/page.js.map +1 -1
- package/dist/defaults/paragraphStyles.d.ts +10 -0
- package/dist/defaults/paragraphStyles.d.ts.map +1 -0
- package/dist/defaults/paragraphStyles.js +67 -0
- package/dist/defaults/paragraphStyles.js.map +1 -0
- package/dist/defaults/parts.d.ts +22 -0
- package/dist/defaults/parts.d.ts.map +1 -0
- package/dist/defaults/parts.js +139 -0
- package/dist/defaults/parts.js.map +1 -0
- package/dist/defaults/shared.d.ts.map +1 -1
- package/dist/defaults/shared.js +110 -17
- package/dist/defaults/shared.js.map +1 -1
- package/dist/defaults/tableStyle.d.ts.map +1 -1
- package/dist/defaults/tableStyle.js +6 -0
- package/dist/defaults/tableStyle.js.map +1 -1
- package/dist/design/layout.d.ts +27 -1
- package/dist/design/layout.d.ts.map +1 -1
- package/dist/design/layout.js +39 -8
- package/dist/design/layout.js.map +1 -1
- package/dist/design/placeholders.d.ts +21 -4
- package/dist/design/placeholders.d.ts.map +1 -1
- package/dist/design/placeholders.js +38 -7
- package/dist/design/placeholders.js.map +1 -1
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +71 -16
- package/dist/html-backend.js.map +1 -1
- package/dist/index.d.ts +13 -9
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -4
- package/dist/index.js.map +1 -1
- package/dist/parse/attrs.d.ts +10 -0
- package/dist/parse/attrs.d.ts.map +1 -0
- package/dist/parse/attrs.js +20 -0
- package/dist/parse/attrs.js.map +1 -0
- package/dist/parse/blockParser.d.ts +8 -4
- package/dist/parse/blockParser.d.ts.map +1 -1
- package/dist/parse/blockParser.js +134 -20
- package/dist/parse/blockParser.js.map +1 -1
- package/dist/parse/index.d.ts +2 -2
- package/dist/parse/index.d.ts.map +1 -1
- package/dist/parse/index.js +1 -1
- package/dist/parse/index.js.map +1 -1
- package/dist/parse/inlineFormatting.d.ts +17 -1
- package/dist/parse/inlineFormatting.d.ts.map +1 -1
- package/dist/parse/inlineFormatting.js +56 -7
- package/dist/parse/inlineFormatting.js.map +1 -1
- package/dist/parse/sourceMapping.d.ts.map +1 -1
- package/dist/parse/sourceMapping.js +13 -1
- package/dist/parse/sourceMapping.js.map +1 -1
- package/dist/parse/types.d.ts +55 -5
- package/dist/parse/types.d.ts.map +1 -1
- package/dist/pipeline/bandCaps.d.ts +86 -0
- package/dist/pipeline/bandCaps.d.ts.map +1 -0
- package/dist/pipeline/bandCaps.js +142 -0
- package/dist/pipeline/bandCaps.js.map +1 -0
- package/dist/pipeline/build.d.ts +32 -0
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +589 -159
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/buildBlockKind.d.ts +8 -0
- package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
- package/dist/pipeline/buildBlockKind.js +40 -11
- package/dist/pipeline/buildBlockKind.js.map +1 -1
- package/dist/pipeline/buildHelpers.d.ts +23 -1
- package/dist/pipeline/buildHelpers.d.ts.map +1 -1
- package/dist/pipeline/buildHelpers.js +50 -6
- package/dist/pipeline/buildHelpers.js.map +1 -1
- package/dist/pipeline/calloutLayout.d.ts +107 -0
- package/dist/pipeline/calloutLayout.d.ts.map +1 -0
- package/dist/pipeline/calloutLayout.js +498 -0
- package/dist/pipeline/calloutLayout.js.map +1 -0
- package/dist/pipeline/columnBalancing.d.ts.map +1 -1
- package/dist/pipeline/columnBalancing.js +22 -2
- package/dist/pipeline/columnBalancing.js.map +1 -1
- package/dist/pipeline/config.d.ts.map +1 -1
- package/dist/pipeline/config.js +17 -5
- package/dist/pipeline/config.js.map +1 -1
- package/dist/pipeline/headerFooter.d.ts +37 -2
- package/dist/pipeline/headerFooter.d.ts.map +1 -1
- package/dist/pipeline/headerFooter.js +231 -15
- package/dist/pipeline/headerFooter.js.map +1 -1
- package/dist/pipeline/lists.d.ts +15 -0
- package/dist/pipeline/lists.d.ts.map +1 -1
- package/dist/pipeline/lists.js +73 -16
- package/dist/pipeline/lists.js.map +1 -1
- package/dist/pipeline/measureContentBlock.d.ts +59 -0
- package/dist/pipeline/measureContentBlock.d.ts.map +1 -0
- package/dist/pipeline/measureContentBlock.js +124 -0
- package/dist/pipeline/measureContentBlock.js.map +1 -0
- package/dist/pipeline/pageRoles.d.ts +23 -0
- package/dist/pipeline/pageRoles.d.ts.map +1 -0
- package/dist/pipeline/pageRoles.js +54 -0
- package/dist/pipeline/pageRoles.js.map +1 -0
- package/dist/pipeline/paragraphContainers.d.ts +32 -0
- package/dist/pipeline/paragraphContainers.d.ts.map +1 -0
- package/dist/pipeline/paragraphContainers.js +61 -0
- package/dist/pipeline/paragraphContainers.js.map +1 -0
- package/dist/pipeline/parts.d.ts +47 -0
- package/dist/pipeline/parts.d.ts.map +1 -0
- package/dist/pipeline/parts.js +230 -0
- package/dist/pipeline/parts.js.map +1 -0
- package/dist/pipeline/placeholders.d.ts +46 -1
- package/dist/pipeline/placeholders.d.ts.map +1 -1
- package/dist/pipeline/placeholders.js +93 -11
- package/dist/pipeline/placeholders.js.map +1 -1
- package/dist/pipeline/placement.d.ts +61 -7
- package/dist/pipeline/placement.d.ts.map +1 -1
- package/dist/pipeline/placement.js +151 -12
- package/dist/pipeline/placement.js.map +1 -1
- package/dist/pipeline/resourceLayout.d.ts +18 -5
- package/dist/pipeline/resourceLayout.d.ts.map +1 -1
- package/dist/pipeline/resourceLayout.js +145 -23
- package/dist/pipeline/resourceLayout.js.map +1 -1
- package/dist/pipeline/styles.d.ts +9 -1
- package/dist/pipeline/styles.d.ts.map +1 -1
- package/dist/pipeline/styles.js +50 -0
- package/dist/pipeline/styles.js.map +1 -1
- package/dist/table/model.d.ts.map +1 -1
- package/dist/table/model.js +16 -2
- package/dist/table/model.js.map +1 -1
- package/dist/types.d.ts +454 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/vdt.d.ts +128 -4
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js +2 -1
- package/dist/vdt.js.map +1 -1
- package/package.json +8 -8
|
@@ -37,6 +37,11 @@ export const MAX_BALANCING_PASSES = 7;
|
|
|
37
37
|
function pageHasBodyContent(page) {
|
|
38
38
|
return page.columns.some((c) => c.blocks.length > 0);
|
|
39
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
|
+
}
|
|
40
45
|
/**
|
|
41
46
|
* Collect the bottom gaps of every balanceable column.
|
|
42
47
|
*
|
|
@@ -79,9 +84,16 @@ export function collectColumnGaps(doc, forcedBreakPages) {
|
|
|
79
84
|
const page = doc.pages[p];
|
|
80
85
|
if (page.blankForParity || page.blankForForce)
|
|
81
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.
|
|
82
93
|
let lastNonEmpty = -1;
|
|
83
94
|
for (let c = 0; c < page.columns.length; c++) {
|
|
84
|
-
|
|
95
|
+
const col = page.columns[c];
|
|
96
|
+
if (isTextColumn(col) && col.blocks.length > 0)
|
|
85
97
|
lastNonEmpty = c;
|
|
86
98
|
}
|
|
87
99
|
if (lastNonEmpty === -1)
|
|
@@ -89,10 +101,13 @@ export function collectColumnGaps(doc, forcedBreakPages) {
|
|
|
89
101
|
const pageFlowsOn = p < lastContentPage && !forcedBreakPages.has(p);
|
|
90
102
|
for (let c = 0; c <= lastNonEmpty; c++) {
|
|
91
103
|
const col = page.columns[c];
|
|
92
|
-
if (col.blocks.length === 0)
|
|
104
|
+
if (!isTextColumn(col) || col.blocks.length === 0)
|
|
93
105
|
continue;
|
|
94
106
|
if (c === lastNonEmpty && !pageFlowsOn)
|
|
95
107
|
continue;
|
|
108
|
+
// A `:::columnbreak` ended this column on purpose — leave its gap.
|
|
109
|
+
if (col.forcedBreak)
|
|
110
|
+
continue;
|
|
96
111
|
const gapLines = Math.floor((col.availableHeight + EPS) / doc.baselineGrid);
|
|
97
112
|
if (gapLines < 1)
|
|
98
113
|
continue;
|
|
@@ -101,6 +116,10 @@ export function collectColumnGaps(doc, forcedBreakPages) {
|
|
|
101
116
|
const b = col.blocks[i];
|
|
102
117
|
if (b.hidden || b.contentIndex === undefined)
|
|
103
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;
|
|
104
123
|
if (b.type === 'heading'
|
|
105
124
|
&& b.headingLevel !== undefined
|
|
106
125
|
&& i >= 1
|
|
@@ -115,6 +134,7 @@ export function collectColumnGaps(doc, forcedBreakPages) {
|
|
|
115
134
|
}
|
|
116
135
|
else if (i >= 1
|
|
117
136
|
&& col.blocks[i - 1].type === 'listItem'
|
|
137
|
+
&& col.blocks[i - 1].containerId === undefined
|
|
118
138
|
&& b.type !== 'listItem'
|
|
119
139
|
&& b.type !== 'heading' // a heading after a list is a heading candidate
|
|
120
140
|
&& !b.id.includes('-cont-')) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"columnBalancing.js","sourceRoot":"","sources":["../../src/pipeline/columnBalancing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAIH,2EAA2E;AAC3E,MAAM,GAAG,GAAG,IAAI,CAAC;AAEjB,wEAAwE;AACxE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AA0BtC,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;;;;;;;;;;;;;;;;;;GAkBG;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,yEAAyE;IACzE,0DAA0D;IAC1D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;oBACjC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;QACH,CAAC;IACH,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,
|
|
1
|
+
{"version":3,"file":"columnBalancing.js","sourceRoot":"","sources":["../../src/pipeline/columnBalancing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAIH,2EAA2E;AAC3E,MAAM,GAAG,GAAG,IAAI,CAAC;AAEjB,wEAAwE;AACxE,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC;AA0BtC,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;2DAC2D;AAC3D,SAAS,YAAY,CAAC,GAAc;IAClC,OAAO,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC;AACtD,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;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,yEAAyE;IACzE,0DAA0D;IAC1D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAC/B,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;gBAC3B,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;oBACjC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC1E,CAAC;YACH,CAAC;QACH,CAAC;IACH,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,sEAAsE;QACtE,oEAAoE;QACpE,uEAAuE;QACvE,oEAAoE;QACpE,qEAAqE;QACrE,0BAA0B;QAC1B,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,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAE,CAAC;YAC7B,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,YAAY,GAAG,CAAC,CAAC;QACnE,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,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAC5D,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,WAAW;gBAAE,SAAS;YACjD,mEAAmE;YACnE,IAAI,GAAG,CAAC,WAAW;gBAAE,SAAS;YAE9B,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,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC3C,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;gBACzB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,YAAY,KAAK,SAAS;oBAAE,SAAS;gBACvD,oEAAoE;gBACpE,0DAA0D;gBAC1D,IAAI,CAAC,CAAC,WAAW,KAAK,SAAS;oBAAE,SAAS;gBAE1C,IACE,CAAC,CAAC,IAAI,KAAK,SAAS;uBACjB,CAAC,CAAC,YAAY,KAAK,SAAS;uBAC5B,CAAC,IAAI,CAAC;uBACN,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAC5B,CAAC;oBACD,UAAU,CAAC,IAAI,CAAC;wBACd,YAAY,EAAE,CAAC,CAAC,YAAY;wBAC5B,IAAI,EAAE,SAAS;wBACf,KAAK,EAAE,CAAC,CAAC,YAAY;wBACrB,KAAK,EAAE,CAAC;wBACR,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM;qBAC1B,CAAC,CAAC;gBACL,CAAC;qBAAM,IACL,CAAC,IAAI,CAAC;uBACH,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,IAAI,KAAK,UAAU;uBACtC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,WAAW,KAAK,SAAS;uBAC5C,CAAC,CAAC,IAAI,KAAK,UAAU;uBACrB,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,gDAAgD;uBACrE,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAC3B,CAAC;oBACD,UAAU,CAAC,IAAI,CAAC;wBACd,YAAY,EAAE,CAAC,CAAC,YAAY;wBAC5B,IAAI,EAAE,SAAS;wBACf,KAAK,EAAE,CAAC;wBACR,KAAK,EAAE,CAAC;wBACR,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM;qBAC1B,CAAC,CAAC;gBACL,CAAC;gBAED,IACE,CAAC,CAAC,IAAI,KAAK,WAAW;uBACnB,CAAC,CAAC,SAAS,KAAK,SAAS;uBACzB,CAAC,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC;uBACnB,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,EACtC,CAAC;oBACD,UAAU,CAAC,IAAI,CAAC;wBACd,YAAY,EAAE,CAAC,CAAC,YAAY;wBAC5B,IAAI,EAAE,gBAAgB;wBACtB,KAAK,EAAE,CAAC;wBACR,KAAK,EAAE,CAAC;wBACR,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM;qBAC1B,CAAC,CAAC;gBACL,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;AA8BD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAgB,EAChB,gBAAqC,EACrC,OAAqB,EACrB,OAA+B;IAE/B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,OAAO,GAAG,KAAK,CAAC;IAEpB;+EAC2E;IAC3E,MAAM,UAAU,GAAG,CAAC,KAAyB,EAAE,SAAiB,EAAE,GAAW,EAAU,EAAE;QACvF,IAAI,QAAQ,GAAG,IAAI,CAAC;QACpB,OAAO,SAAS,GAAG,CAAC,IAAI,QAAQ,EAAE,CAAC;YACjC,QAAQ,GAAG,KAAK,CAAC;YACjB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,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,GAAG;oBAAE,SAAS;gBACzB,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;QACD,OAAO,SAAS,CAAC;IACnB,CAAC,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,CAAC,EAAE,CAAC;QAC3D,IAAI,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC;QAE7B,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;aACnC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QAC1D,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,kBAAkB,CAAC,CAAC;QAExE,IAAI,SAAS,GAAG,CAAC,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU;iBAC5B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC;iBACnC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;YACrC,SAAS,GAAG,UAAU,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACzE,CAAC;QAED,IACE,SAAS,GAAG,CAAC;eACV,OAAO,CAAC,eAAe;eACvB,OAAO,CAAC,mBAAmB,EAC9B,CAAC;YACD,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC;YAC9E,4DAA4D;YAC5D,MAAM,YAAY,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;YACxE,IAAI,CAAC,YAAY,EAAE,CAAC;gBAClB,MAAM,IAAI,GAAG,WAAW;qBACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;qBACvD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;gBACrE,IAAI,IAAI,EAAE,CAAC;oBACT,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;oBAChC,OAAO,GAAG,IAAI,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -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;
|
|
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"}
|
package/dist/pipeline/config.js
CHANGED
|
@@ -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
|
|
12
|
+
page,
|
|
9
13
|
layout: resolveLayoutConfig(config?.layout),
|
|
10
14
|
bodyText,
|
|
11
|
-
headings
|
|
15
|
+
headings,
|
|
12
16
|
tableStyle: resolveTableStyleConfig(config?.tableStyle, bodyText),
|
|
13
17
|
captionStyle: resolveCaptionStyleConfig(config?.captionStyle, bodyText),
|
|
14
18
|
diagramStyle: resolveDiagramStyleConfig(config?.diagramStyle),
|
|
15
|
-
|
|
16
|
-
|
|
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":"AACA,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,uBAAuB,EACvB,yBAAyB,EACzB,yBAAyB,EACzB,2BAA2B,EAC3B,yBAAyB,EACzB,iBAAiB,EACjB,yBAAyB,EACzB,oBAAoB,EACpB,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAyC,MAAM,QAAQ,CAAC;AAElF,MAAM,UAAU,gBAAgB,CAAC,SAAyB;IACxD,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAC/C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzD,MAAM,QAAQ,
|
|
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
|
-
|
|
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":"
|
|
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"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
+
import { TITLE_BREAK_RE, applyTitleBreaks } from '../parse/inlineFormatting';
|
|
1
2
|
import { createBoundingBox, } from '../vdt';
|
|
2
|
-
import { computeChapterTitles, computeChapterNumbers } from './placeholders';
|
|
3
|
+
import { computeChapterTitles, computeChapterNumbers, computeChapterAttrs, computePartValues } from './placeholders';
|
|
4
|
+
import { parsePartNumber } from './parts';
|
|
3
5
|
import { computePageMetrics } from './buildHelpers';
|
|
4
6
|
import { buildHeadingLevelMap } from './config';
|
|
7
|
+
import { classifyPages } from './pageRoles';
|
|
8
|
+
import { dimensionToPx } from '../units';
|
|
5
9
|
import { layoutDesignSlot, } from '../design/layout';
|
|
6
10
|
/** Slots live in the page margin area between the body edge and the page
|
|
7
11
|
* edge. Header slot container: from `top-margin` edge down to body top.
|
|
@@ -15,7 +19,7 @@ import { layoutDesignSlot, } from '../design/layout';
|
|
|
15
19
|
* This matches the legacy semantics: `marginFromBody` was "distance from
|
|
16
20
|
* body edge" — the migration translates that to an offset of the same
|
|
17
21
|
* magnitude from the body-facing edge. */
|
|
18
|
-
function headerContainerBbox(contentArea
|
|
22
|
+
function headerContainerBbox(contentArea) {
|
|
19
23
|
// Header: spans from top of page to body top.
|
|
20
24
|
return { x: contentArea.x, y: 0, width: contentArea.width, height: contentArea.y };
|
|
21
25
|
}
|
|
@@ -99,11 +103,23 @@ function boxPrimitiveToBlock(prim) {
|
|
|
99
103
|
* rather than below the natural text bottom. Applies to both in-column
|
|
100
104
|
* headings (overlay in block bbox) and page-spanning openers (width is the
|
|
101
105
|
* full content area; passed in by the caller). */
|
|
102
|
-
export function measureHeadingAdvancedDesignHeight(level, heading, width, dpi, metadata, pageIndex
|
|
106
|
+
export function measureHeadingAdvancedDesignHeight(level, heading, width, dpi, metadata, pageIndex,
|
|
107
|
+
/** Page/bleed frames in absolute page px, for `anchor.to: 'page' |
|
|
108
|
+
* 'bleed'` elements. Translated into the stub coordinate system (the
|
|
109
|
+
* heading container's top-left at `origin`) so a band anchored above the
|
|
110
|
+
* heading does not grow the reserved height, while anything extending
|
|
111
|
+
* below the heading's top does. */
|
|
112
|
+
frames,
|
|
113
|
+
/** Absolute page position of the heading container's top-left. Defaults
|
|
114
|
+
* to the frames' page origin when omitted. */
|
|
115
|
+
origin) {
|
|
103
116
|
if (!level.advancedDesign.enabled)
|
|
104
117
|
return 0;
|
|
118
|
+
const minHeightPx = level.advancedDesign.minHeight
|
|
119
|
+
? dimensionToPx(level.advancedDesign.minHeight, dpi)
|
|
120
|
+
: 0;
|
|
105
121
|
if (level.advancedDesign.slot.elements.length === 0)
|
|
106
|
-
return
|
|
122
|
+
return minHeightPx;
|
|
107
123
|
const stubPage = { index: pageIndex, pageLabel: '1' };
|
|
108
124
|
const placeholders = {
|
|
109
125
|
kind: 'heading',
|
|
@@ -113,23 +129,90 @@ export function measureHeadingAdvancedDesignHeight(level, heading, width, dpi, m
|
|
|
113
129
|
chapterTitleByPageIndex: [],
|
|
114
130
|
heading,
|
|
115
131
|
};
|
|
116
|
-
|
|
132
|
+
let stubFrames;
|
|
133
|
+
if (frames) {
|
|
134
|
+
const ox = origin?.x ?? frames.page.x;
|
|
135
|
+
const oy = origin?.y ?? frames.page.y;
|
|
136
|
+
const shift = (f) => ({ x: f.x - ox, y: f.y - oy, width: f.width, height: f.height });
|
|
137
|
+
stubFrames = { page: shift(frames.page), bleed: shift(frames.bleed) };
|
|
138
|
+
}
|
|
139
|
+
const result = layoutDesignSlot(level.advancedDesign.slot, { container: { x: 0, y: 0, width, height: 1e6 }, dpi, placeholders, frames: stubFrames }, pageIndex);
|
|
117
140
|
let bottom = 0;
|
|
118
141
|
for (const prim of result.primitives) {
|
|
119
142
|
bottom = Math.max(bottom, prim.y + prim.height);
|
|
120
143
|
}
|
|
121
|
-
return bottom;
|
|
144
|
+
return Math.max(bottom, minHeightPx);
|
|
122
145
|
}
|
|
123
|
-
export function layoutSlotToVdt(slot, container, pageIndex, placeholders, dpi) {
|
|
124
|
-
const result = layoutDesignSlot(slot, { container, dpi, placeholders }, pageIndex);
|
|
146
|
+
export function layoutSlotToVdt(slot, container, pageIndex, placeholders, dpi, extras) {
|
|
147
|
+
const result = layoutDesignSlot(slot, { container, dpi, placeholders, frames: extras?.frames, pageRole: extras?.pageRole }, pageIndex);
|
|
125
148
|
if (result.primitives.length === 0)
|
|
126
149
|
return undefined;
|
|
127
|
-
const
|
|
150
|
+
const titleElementIds = extras?.titleSource
|
|
151
|
+
? new Set(slot.elements.filter((el) => el.kind === 'text' && el.content.includes('{titleText}')).map((el) => el.id))
|
|
152
|
+
: undefined;
|
|
153
|
+
const attrElementKeys = new Map();
|
|
154
|
+
if (extras?.attrSources) {
|
|
155
|
+
for (const el of slot.elements) {
|
|
156
|
+
if (el.kind !== 'text')
|
|
157
|
+
continue;
|
|
158
|
+
const m = /^\s*\{attr\.([A-Za-z_][A-Za-z0-9_-]*)\}\s*$/.exec(el.content);
|
|
159
|
+
if (m && extras.attrSources[m[1]])
|
|
160
|
+
attrElementKeys.set(el.id, m[1]);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const blocks = result.primitives.map((prim) => {
|
|
164
|
+
const block = primitiveToBlock(prim);
|
|
165
|
+
const attrKey = attrElementKeys.get(prim.id);
|
|
166
|
+
if (block.kind === 'text' && attrKey !== undefined && extras?.attrSources?.[attrKey]) {
|
|
167
|
+
const range = extras.attrSources[attrKey];
|
|
168
|
+
const value = extras.attrs?.[attrKey] ?? '';
|
|
169
|
+
block.sourceStart = range.start;
|
|
170
|
+
block.sourceEnd = range.end;
|
|
171
|
+
if (value.length === range.end - range.start) {
|
|
172
|
+
block.sourceText = value;
|
|
173
|
+
block.sourceMap = Array.from({ length: value.length }, (_, i) => range.start + i);
|
|
174
|
+
}
|
|
175
|
+
return block;
|
|
176
|
+
}
|
|
177
|
+
if (block.kind === 'text' && titleElementIds?.has(prim.id) && extras?.titleSource) {
|
|
178
|
+
block.sourceStart = extras.titleSource.start;
|
|
179
|
+
block.sourceEnd = extras.titleSource.end;
|
|
180
|
+
if (extras.titleSource.text !== undefined && extras.titleSource.sourceMap
|
|
181
|
+
&& extras.titleSource.sourceMap.length === extras.titleSource.text.length) {
|
|
182
|
+
block.sourceText = extras.titleSource.text;
|
|
183
|
+
block.sourceMap = extras.titleSource.sourceMap;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return block;
|
|
187
|
+
});
|
|
128
188
|
return {
|
|
129
189
|
bbox: createBoundingBox(container.x, container.y, container.width, container.height),
|
|
130
190
|
blocks,
|
|
131
191
|
};
|
|
132
192
|
}
|
|
193
|
+
/** Plain title text of a part (`\\` rendered as a line break) and the
|
|
194
|
+
* source offset of every character of it, for editor cursor mapping. */
|
|
195
|
+
function partTitleSourceMap(rawTitle, sourceStart) {
|
|
196
|
+
let text = '';
|
|
197
|
+
const sourceMap = [];
|
|
198
|
+
const re = /[ \t]*\\\\[ \t]*/g;
|
|
199
|
+
let last = 0;
|
|
200
|
+
let m;
|
|
201
|
+
while ((m = re.exec(rawTitle)) !== null) {
|
|
202
|
+
for (let i = last; i < m.index; i++) {
|
|
203
|
+
text += rawTitle[i];
|
|
204
|
+
sourceMap.push(sourceStart + i);
|
|
205
|
+
}
|
|
206
|
+
text += '\n';
|
|
207
|
+
sourceMap.push(sourceStart + m.index);
|
|
208
|
+
last = m.index + m[0].length;
|
|
209
|
+
}
|
|
210
|
+
for (let i = last; i < rawTitle.length; i++) {
|
|
211
|
+
text += rawTitle[i];
|
|
212
|
+
sourceMap.push(sourceStart + i);
|
|
213
|
+
}
|
|
214
|
+
return { text, sourceMap };
|
|
215
|
+
}
|
|
133
216
|
/** Container bbox for a page-spanning heading opener band: occupies the
|
|
134
217
|
* vertical band the heading block reserved in its column, extended
|
|
135
218
|
* horizontally across the full content area (both columns) — but NOT beyond
|
|
@@ -156,7 +239,7 @@ function findOpenerHeading(page, headingLevelByNumber) {
|
|
|
156
239
|
.map((ln) => (ln.segments ?? []).map((s) => s.text).join(''))
|
|
157
240
|
.join(' ');
|
|
158
241
|
const pref = block.numberPrefix ?? '';
|
|
159
|
-
const title = pref && full.startsWith(`${pref} `) ? full.slice(pref.length + 1) : full;
|
|
242
|
+
const title = applyTitleBreaks(pref && full.startsWith(`${pref} `) ? full.slice(pref.length + 1) : full, block.titleBreaks, block.titleLength ?? -1);
|
|
160
243
|
return { block, level: block.headingLevel, titleText: title, numberPrefix: pref };
|
|
161
244
|
}
|
|
162
245
|
}
|
|
@@ -173,6 +256,7 @@ function synthesiseDefaultOpenerSlot(level, hasNumberPrefix) {
|
|
|
173
256
|
kind: 'text',
|
|
174
257
|
id: 'defaultHeadingOpener',
|
|
175
258
|
parity: 'all',
|
|
259
|
+
pages: 'all',
|
|
176
260
|
placement: {
|
|
177
261
|
anchor: { to: 'container', edge: 'top-left' },
|
|
178
262
|
offset: { x: { value: 0, unit: 'pt' }, y: { value: 0, unit: 'pt' } },
|
|
@@ -192,17 +276,60 @@ function synthesiseDefaultOpenerSlot(level, hasNumberPrefix) {
|
|
|
192
276
|
};
|
|
193
277
|
return { elements: [textEl] };
|
|
194
278
|
}
|
|
279
|
+
/** Default opener design of a `:::part` page when `parts.design` is empty:
|
|
280
|
+
* `{number} {titleText}` (or just `{titleText}` without a number) in the
|
|
281
|
+
* H1 typography, anchored at the top-left of the part's body area — the
|
|
282
|
+
* container is the trim box, so the offset is the part margins. Purely
|
|
283
|
+
* decorative: raise `parts.margins.top` to keep the body clear of it. */
|
|
284
|
+
function synthesiseDefaultPartSlot(resolved, page, trimBox, hasNumber) {
|
|
285
|
+
const level = resolved.headings.levels.find((l) => l.level === 1) ?? resolved.headings.levels[0];
|
|
286
|
+
const content = hasNumber ? '{number} {titleText}' : '{titleText}';
|
|
287
|
+
const textEl = {
|
|
288
|
+
kind: 'text',
|
|
289
|
+
id: 'defaultPartOpener',
|
|
290
|
+
parity: 'all',
|
|
291
|
+
pages: 'all',
|
|
292
|
+
placement: {
|
|
293
|
+
anchor: { to: 'container', edge: 'top-left' },
|
|
294
|
+
offset: {
|
|
295
|
+
x: { value: page.contentArea.x - trimBox.x, unit: 'px' },
|
|
296
|
+
y: { value: page.contentArea.y - trimBox.y, unit: 'px' },
|
|
297
|
+
},
|
|
298
|
+
size: { width: { value: page.contentArea.width, unit: 'px' }, height: 'auto' },
|
|
299
|
+
},
|
|
300
|
+
content,
|
|
301
|
+
fontFamily: level.fontFamily,
|
|
302
|
+
fontSize: level.fontSize,
|
|
303
|
+
fontWeight: level.fontWeight,
|
|
304
|
+
italic: level.italic,
|
|
305
|
+
color: level.color,
|
|
306
|
+
align: 'left',
|
|
307
|
+
verticalAlign: 'top',
|
|
308
|
+
lineHeight: level.lineHeight.unit === 'em' ? level.lineHeight.value : 1.2,
|
|
309
|
+
overflow: 'wrap',
|
|
310
|
+
hyphenate: true,
|
|
311
|
+
};
|
|
312
|
+
return { elements: [textEl] };
|
|
313
|
+
}
|
|
195
314
|
/**
|
|
196
315
|
* After body placement finishes, attach header/footer slots to every page.
|
|
197
316
|
*/
|
|
198
317
|
export function buildHeadersAndFooters(doc) {
|
|
199
318
|
const resolved = doc.config;
|
|
200
319
|
const dpi = resolved.page.dpi;
|
|
201
|
-
const
|
|
320
|
+
const metrics = computePageMetrics(resolved);
|
|
321
|
+
const frames = { page: metrics.trimBox, bleed: metrics.bleedBox };
|
|
322
|
+
// Page roles drive the per-element `pages` filter of every slot below.
|
|
323
|
+
classifyPages(doc, resolved);
|
|
202
324
|
const chapterTitleByPageIndex = computeChapterTitles(doc.blocks, doc.pages.length, doc.pages);
|
|
203
325
|
const chapterNumberByPageIndex = computeChapterNumbers(doc.blocks, doc.pages.length, doc.pages);
|
|
326
|
+
const chapterAttrsByPageIndex = computeChapterAttrs(doc.blocks, doc.pages.length, doc.pages);
|
|
327
|
+
const { partTitleByPageIndex, partNumberByPageIndex } = computePartValues(doc.pages);
|
|
204
328
|
const headingLevelByNumber = buildHeadingLevelMap(resolved);
|
|
205
329
|
for (const page of doc.pages) {
|
|
330
|
+
// Per-page content area: mirrored margins swap inner/outer on even pages.
|
|
331
|
+
const contentArea = page.contentArea;
|
|
332
|
+
const extras = { frames, pageRole: page.role };
|
|
206
333
|
if (resolved.header.elements.length > 0) {
|
|
207
334
|
const placeholders = {
|
|
208
335
|
kind: 'header',
|
|
@@ -210,8 +337,72 @@ export function buildHeadersAndFooters(doc) {
|
|
|
210
337
|
allPages: doc.pages,
|
|
211
338
|
metadata: doc.metadata,
|
|
212
339
|
chapterTitleByPageIndex,
|
|
340
|
+
chapterNumberByPageIndex,
|
|
341
|
+
chapterAttrsByPageIndex,
|
|
342
|
+
partTitleByPageIndex,
|
|
343
|
+
partNumberByPageIndex,
|
|
213
344
|
};
|
|
214
|
-
page.header = layoutSlotToVdt(resolved.header, headerContainerBbox(contentArea
|
|
345
|
+
page.header = layoutSlotToVdt(resolved.header, headerContainerBbox(contentArea), page.index, placeholders, dpi, extras);
|
|
346
|
+
}
|
|
347
|
+
// Back of a part divider: a blank page right after a part page takes the
|
|
348
|
+
// part's verso design (the model book tints the whole leaf).
|
|
349
|
+
const prevPage = page.index > 0 ? doc.pages[page.index - 1] : undefined;
|
|
350
|
+
if (!page.partInfo
|
|
351
|
+
&& prevPage?.partInfo
|
|
352
|
+
&& resolved.parts.versoDesign.elements.length > 0
|
|
353
|
+
&& page.columns.every((c) => c.blocks.length === 0)) {
|
|
354
|
+
const { number, title } = prevPage.partInfo;
|
|
355
|
+
const placeholders = {
|
|
356
|
+
kind: 'part',
|
|
357
|
+
page,
|
|
358
|
+
allPages: doc.pages,
|
|
359
|
+
metadata: doc.metadata,
|
|
360
|
+
chapterTitleByPageIndex,
|
|
361
|
+
chapterNumberByPageIndex,
|
|
362
|
+
chapterAttrsByPageIndex,
|
|
363
|
+
partTitleByPageIndex,
|
|
364
|
+
partNumberByPageIndex,
|
|
365
|
+
heading: {
|
|
366
|
+
titleText: title.replace(TITLE_BREAK_RE, '\n'),
|
|
367
|
+
formattedNumber: number,
|
|
368
|
+
numericValue: parsePartNumber(number),
|
|
369
|
+
chapterNumber: chapterNumberByPageIndex[page.index] ?? '',
|
|
370
|
+
},
|
|
371
|
+
};
|
|
372
|
+
page.openerBand = layoutSlotToVdt(resolved.parts.versoDesign, { x: frames.page.x, y: frames.page.y, width: frames.page.width, height: frames.page.height }, page.index, placeholders, dpi, extras);
|
|
373
|
+
}
|
|
374
|
+
// Part-divider page: the opener design covers the full trim box and is
|
|
375
|
+
// purely decorative (the body column already comes from `parts.margins`).
|
|
376
|
+
if (page.partInfo) {
|
|
377
|
+
const { number, title } = page.partInfo;
|
|
378
|
+
const slot = resolved.parts.design.elements.length > 0
|
|
379
|
+
? resolved.parts.design
|
|
380
|
+
: synthesiseDefaultPartSlot(resolved, page, frames.page, number.length > 0);
|
|
381
|
+
const placeholders = {
|
|
382
|
+
kind: 'part',
|
|
383
|
+
page,
|
|
384
|
+
allPages: doc.pages,
|
|
385
|
+
metadata: doc.metadata,
|
|
386
|
+
chapterTitleByPageIndex,
|
|
387
|
+
chapterNumberByPageIndex,
|
|
388
|
+
chapterAttrsByPageIndex,
|
|
389
|
+
partTitleByPageIndex,
|
|
390
|
+
partNumberByPageIndex,
|
|
391
|
+
heading: {
|
|
392
|
+
titleText: title.replace(TITLE_BREAK_RE, '\n'),
|
|
393
|
+
formattedNumber: number,
|
|
394
|
+
numericValue: parsePartNumber(number),
|
|
395
|
+
chapterNumber: chapterNumberByPageIndex[page.index] ?? '',
|
|
396
|
+
},
|
|
397
|
+
};
|
|
398
|
+
const partTitleSource = page.partInfo.titleSourceStart !== undefined && page.partInfo.titleSourceEnd !== undefined
|
|
399
|
+
? {
|
|
400
|
+
start: page.partInfo.titleSourceStart,
|
|
401
|
+
end: page.partInfo.titleSourceEnd,
|
|
402
|
+
...partTitleSourceMap(title, page.partInfo.titleSourceStart),
|
|
403
|
+
}
|
|
404
|
+
: undefined;
|
|
405
|
+
page.openerBand = layoutSlotToVdt(slot, { x: frames.page.x, y: frames.page.y, width: frames.page.width, height: frames.page.height }, page.index, placeholders, dpi, { ...extras, titleSource: partTitleSource });
|
|
215
406
|
}
|
|
216
407
|
const opener = findOpenerHeading(page, headingLevelByNumber);
|
|
217
408
|
if (opener) {
|
|
@@ -226,13 +417,29 @@ export function buildHeadersAndFooters(doc) {
|
|
|
226
417
|
allPages: doc.pages,
|
|
227
418
|
metadata: doc.metadata,
|
|
228
419
|
chapterTitleByPageIndex,
|
|
420
|
+
chapterNumberByPageIndex,
|
|
421
|
+
chapterAttrsByPageIndex,
|
|
422
|
+
partTitleByPageIndex,
|
|
423
|
+
partNumberByPageIndex,
|
|
229
424
|
heading: {
|
|
230
425
|
titleText: opener.titleText,
|
|
231
426
|
formattedNumber: opener.numberPrefix,
|
|
232
427
|
chapterNumber: chapterNumberByPageIndex[page.index] ?? '',
|
|
428
|
+
attrs: opener.block.attrs,
|
|
233
429
|
},
|
|
234
430
|
};
|
|
235
|
-
|
|
431
|
+
const headingMap = opener.block.sourceMap;
|
|
432
|
+
const headingTitleSource = headingMap && headingMap.length > 0
|
|
433
|
+
? {
|
|
434
|
+
start: headingMap[0],
|
|
435
|
+
end: headingMap[headingMap.length - 1] + 1,
|
|
436
|
+
text: opener.titleText,
|
|
437
|
+
sourceMap: headingMap,
|
|
438
|
+
}
|
|
439
|
+
: opener.block.sourceStart !== undefined && opener.block.sourceEnd !== undefined
|
|
440
|
+
? { start: opener.block.sourceStart, end: opener.block.sourceEnd }
|
|
441
|
+
: undefined;
|
|
442
|
+
page.openerBand = layoutSlotToVdt(slot, openerContainerBbox(opener.block, contentArea), page.index, placeholders, dpi, { ...extras, titleSource: headingTitleSource, attrSources: opener.block.attrSources, attrs: opener.block.attrs });
|
|
236
443
|
if (page.openerBand) {
|
|
237
444
|
opener.block.hidden = true;
|
|
238
445
|
}
|
|
@@ -269,13 +476,18 @@ export function buildHeadersAndFooters(doc) {
|
|
|
269
476
|
allPages: doc.pages,
|
|
270
477
|
metadata: doc.metadata,
|
|
271
478
|
chapterTitleByPageIndex,
|
|
479
|
+
chapterNumberByPageIndex,
|
|
480
|
+
chapterAttrsByPageIndex,
|
|
481
|
+
partTitleByPageIndex,
|
|
482
|
+
partNumberByPageIndex,
|
|
272
483
|
heading: {
|
|
273
484
|
titleText: title,
|
|
274
485
|
formattedNumber: pref,
|
|
275
486
|
chapterNumber: chapterNumberByPageIndex[page.index] ?? '',
|
|
487
|
+
attrs: block.attrs,
|
|
276
488
|
},
|
|
277
489
|
};
|
|
278
|
-
const overlay = layoutSlotToVdt(lvl.advancedDesign.slot, { x: block.bbox.x, y: block.bbox.y, width: block.bbox.width, height: block.bbox.height }, page.index, placeholders, dpi);
|
|
490
|
+
const overlay = layoutSlotToVdt(lvl.advancedDesign.slot, { x: block.bbox.x, y: block.bbox.y, width: block.bbox.width, height: block.bbox.height }, page.index, placeholders, dpi, extras);
|
|
279
491
|
if (overlay)
|
|
280
492
|
block.designOverlay = overlay;
|
|
281
493
|
}
|
|
@@ -287,8 +499,12 @@ export function buildHeadersAndFooters(doc) {
|
|
|
287
499
|
allPages: doc.pages,
|
|
288
500
|
metadata: doc.metadata,
|
|
289
501
|
chapterTitleByPageIndex,
|
|
502
|
+
chapterNumberByPageIndex,
|
|
503
|
+
chapterAttrsByPageIndex,
|
|
504
|
+
partTitleByPageIndex,
|
|
505
|
+
partNumberByPageIndex,
|
|
290
506
|
};
|
|
291
|
-
page.footer = layoutSlotToVdt(resolved.footer, footerContainerBbox(contentArea, page.height), page.index, placeholders, dpi);
|
|
507
|
+
page.footer = layoutSlotToVdt(resolved.footer, footerContainerBbox(contentArea, page.height), page.index, placeholders, dpi, extras);
|
|
292
508
|
}
|
|
293
509
|
}
|
|
294
510
|
}
|