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
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-pass for `:::paragraphs{style="…"}` containers. The placement loop
|
|
3
|
+
* rewinds `blockIdx` on keep-with-next rollbacks and replays the blocks in
|
|
4
|
+
* between (marker blocks included), so container state is resolved up front
|
|
5
|
+
* per content-block index instead of being pushed/popped inside the loop.
|
|
6
|
+
*/
|
|
7
|
+
import type { ContentBlock } from '../parse';
|
|
8
|
+
import type { ResolvedConfig } from '../vdt';
|
|
9
|
+
import { type BlockStyle } from './styles';
|
|
10
|
+
export interface ParagraphContainer {
|
|
11
|
+
/** `containerId` of the start/end marker pair. */
|
|
12
|
+
id: number;
|
|
13
|
+
/** Style for every paragraph in the container. */
|
|
14
|
+
style: BlockStyle;
|
|
15
|
+
/** Style for the container's last paragraph: the container's
|
|
16
|
+
* `marginBottom` is baked into its `marginBottomPx` so the grid snap that
|
|
17
|
+
* closes the container guarantees the margin (grid wins, margin is a
|
|
18
|
+
* minimum — the same convention snapped headings follow). */
|
|
19
|
+
tailStyle: BlockStyle;
|
|
20
|
+
/** Applied on entry through pending spacing. */
|
|
21
|
+
marginTopPx: number;
|
|
22
|
+
/** Fallback for containers whose last block is not a paragraph. */
|
|
23
|
+
marginBottomPx: number;
|
|
24
|
+
}
|
|
25
|
+
export interface ParagraphContainerPlan {
|
|
26
|
+
/** Container id → entry, for `paragraphs` containers with a known style. */
|
|
27
|
+
byId: Map<number, ParagraphContainer>;
|
|
28
|
+
/** Content-block index → innermost enclosing paragraph container. */
|
|
29
|
+
byBlock: Array<ParagraphContainer | undefined>;
|
|
30
|
+
}
|
|
31
|
+
export declare function planParagraphContainers(contentBlocks: readonly ContentBlock[], resolved: ResolvedConfig): ParagraphContainerPlan;
|
|
32
|
+
//# sourceMappingURL=paragraphContainers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paragraphContainers.d.ts","sourceRoot":"","sources":["../../src/pipeline/paragraphContainers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAyB,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAElE,MAAM,WAAW,kBAAkB;IACjC,kDAAkD;IAClD,EAAE,EAAE,MAAM,CAAC;IACX,kDAAkD;IAClD,KAAK,EAAE,UAAU,CAAC;IAClB;;;kEAG8D;IAC9D,SAAS,EAAE,UAAU,CAAC;IACtB,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,sBAAsB;IACrC,4EAA4E;IAC5E,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IACtC,qEAAqE;IACrE,OAAO,EAAE,KAAK,CAAC,kBAAkB,GAAG,SAAS,CAAC,CAAC;CAChD;AAED,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,SAAS,YAAY,EAAE,EACtC,QAAQ,EAAE,cAAc,GACvB,sBAAsB,CAiDxB"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-pass for `:::paragraphs{style="…"}` containers. The placement loop
|
|
3
|
+
* rewinds `blockIdx` on keep-with-next rollbacks and replays the blocks in
|
|
4
|
+
* between (marker blocks included), so container state is resolved up front
|
|
5
|
+
* per content-block index instead of being pushed/popped inside the loop.
|
|
6
|
+
*/
|
|
7
|
+
import { dimensionToPx } from '../units';
|
|
8
|
+
import { resolveParagraphStyle } from './styles';
|
|
9
|
+
export function planParagraphContainers(contentBlocks, resolved) {
|
|
10
|
+
const byId = new Map();
|
|
11
|
+
const byBlock = new Array(contentBlocks.length);
|
|
12
|
+
const dpi = resolved.page.dpi;
|
|
13
|
+
// Every open container occupies one slot, undefined for non-`paragraphs`
|
|
14
|
+
// containers and for unknown style ids (those render as plain body text —
|
|
15
|
+
// the build has no warnings channel; the editor's warnings phase can flag
|
|
16
|
+
// them).
|
|
17
|
+
const open = [];
|
|
18
|
+
const cache = new Map();
|
|
19
|
+
for (let i = 0; i < contentBlocks.length; i++) {
|
|
20
|
+
const b = contentBlocks[i];
|
|
21
|
+
if (b.type === 'containerStart') {
|
|
22
|
+
let entry;
|
|
23
|
+
const styleId = b.containerAttrs?.style;
|
|
24
|
+
if (b.containerName === 'paragraphs' && styleId !== undefined && b.containerId !== undefined) {
|
|
25
|
+
let base = cache.get(styleId);
|
|
26
|
+
if (!base) {
|
|
27
|
+
const cfg = resolved.paragraphStyles.find((s) => s.id === styleId);
|
|
28
|
+
if (cfg) {
|
|
29
|
+
const style = resolveParagraphStyle(cfg, resolved);
|
|
30
|
+
const marginBottomPx = dimensionToPx(cfg.marginBottom, dpi, style.fontSizePx);
|
|
31
|
+
base = {
|
|
32
|
+
style,
|
|
33
|
+
tailStyle: { ...style, marginBottomPx: Math.max(style.marginBottomPx, marginBottomPx) },
|
|
34
|
+
marginTopPx: dimensionToPx(cfg.marginTop, dpi, style.fontSizePx),
|
|
35
|
+
marginBottomPx,
|
|
36
|
+
};
|
|
37
|
+
cache.set(styleId, base);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (base) {
|
|
41
|
+
entry = { id: b.containerId, ...base };
|
|
42
|
+
byId.set(b.containerId, entry);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
open.push(entry);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
if (b.type === 'containerEnd') {
|
|
49
|
+
open.pop();
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
for (let j = open.length - 1; j >= 0; j--) {
|
|
53
|
+
if (open[j]) {
|
|
54
|
+
byBlock[i] = open[j];
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return { byId, byBlock };
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=paragraphContainers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paragraphContainers.js","sourceRoot":"","sources":["../../src/pipeline/paragraphContainers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-pass and derived typography for `:::part{number="…" title="…"}`
|
|
3
|
+
* containers. Like the other container plans, part ranges are resolved up
|
|
4
|
+
* front per content-block index (the placement loop rewinds `blockIdx` on
|
|
5
|
+
* keep-with-next rollbacks and replays the markers in between).
|
|
6
|
+
*/
|
|
7
|
+
import type { ContentBlock } from '../parse';
|
|
8
|
+
import type { ResolvedConfig } from '../vdt';
|
|
9
|
+
import type { BlockMeasureContext } from './measureContentBlock';
|
|
10
|
+
export interface PlannedPart {
|
|
11
|
+
/** Content-block index of the `containerStart` marker. */
|
|
12
|
+
startIdx: number;
|
|
13
|
+
/** Content-block index of the matching `containerEnd` marker. */
|
|
14
|
+
endIdx: number;
|
|
15
|
+
containerId: number;
|
|
16
|
+
/** `number` attribute as written (`'I'`, `'2'`, …); `''` when absent. */
|
|
17
|
+
number: string;
|
|
18
|
+
/** `title` attribute; `''` when absent. */
|
|
19
|
+
title: string;
|
|
20
|
+
}
|
|
21
|
+
export interface PartPlan {
|
|
22
|
+
/** Start-marker index → part. */
|
|
23
|
+
byStart: Map<number, PlannedPart>;
|
|
24
|
+
/** End-marker index → part. */
|
|
25
|
+
byEnd: Map<number, PlannedPart>;
|
|
26
|
+
/** Content-block index → enclosing part (markers excluded). A part nested
|
|
27
|
+
* inside another part is flattened into the outer one. */
|
|
28
|
+
byBlock: Array<PlannedPart | undefined>;
|
|
29
|
+
}
|
|
30
|
+
export declare function planParts(contentBlocks: readonly ContentBlock[]): PartPlan;
|
|
31
|
+
/** Numeric value of a part number written as a decimal (`'3'`) or a roman
|
|
32
|
+
* numeral (`'III'`, `'iv'`), so `{numberDecimal}` / `{numberRoman}` work
|
|
33
|
+
* whichever way the author wrote it. `undefined` for anything else. */
|
|
34
|
+
export declare function parsePartNumber(raw: string): number | undefined;
|
|
35
|
+
/** Shallow copy of `resolved` whose `bodyText` and list configs carry the
|
|
36
|
+
* `parts.bodyStyle` overrides, so the body/list resolvers yield the part
|
|
37
|
+
* typography without any part-specific branches (the callout approach).
|
|
38
|
+
* Ordered-list numbers are set bold in `numberColor`; bullets take
|
|
39
|
+
* `bulletColor`. Level-specific values only follow an override when they
|
|
40
|
+
* still equal the general value they were resolved from. The
|
|
41
|
+
* `bodyStyle.unorderedLists` / `orderedLists` partials apply last. */
|
|
42
|
+
export declare function derivePartResolvedConfig(resolved: ResolvedConfig): ResolvedConfig;
|
|
43
|
+
/** Measurement context for the blocks inside a part: the derived config
|
|
44
|
+
* plus the body / blockquote styles, list indents and ordered-list number
|
|
45
|
+
* widths recomputed from it. */
|
|
46
|
+
export declare function derivePartMeasureContext(ctx: BlockMeasureContext): BlockMeasureContext;
|
|
47
|
+
//# sourceMappingURL=parts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts.d.ts","sourceRoot":"","sources":["../../src/pipeline/parts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAQ7C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,MAAM,WAAW,WAAW;IAC1B,0DAA0D;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,yEAAyE;IACzE,MAAM,EAAE,MAAM,CAAC;IACf,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,QAAQ;IACvB,iCAAiC;IACjC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClC,+BAA+B;IAC/B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAChC;+DAC2D;IAC3D,OAAO,EAAE,KAAK,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC;CACzC;AAED,wBAAgB,SAAS,CAAC,aAAa,EAAE,SAAS,YAAY,EAAE,GAAG,QAAQ,CAgC1E;AAOD;;wEAEwE;AACxE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAgB/D;AAmID;;;;;;uEAMuE;AACvE,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,cAAc,GAAG,cAAc,CA0BjF;AAED;;iCAEiC;AACjC,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,mBAAmB,GAAG,mBAAmB,CAqBtF"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-pass and derived typography for `:::part{number="…" title="…"}`
|
|
3
|
+
* containers. Like the other container plans, part ranges are resolved up
|
|
4
|
+
* front per content-block index (the placement loop rewinds `blockIdx` on
|
|
5
|
+
* keep-with-next rollbacks and replays the markers in between).
|
|
6
|
+
*/
|
|
7
|
+
import { dimensionsEqual } from '../defaults/shared';
|
|
8
|
+
import { resolveBodyStyle, resolveBlockquoteStyle } from './styles';
|
|
9
|
+
import { computeLevelIndentsPx, computeOrderedLevelIndentsPx, computeOrderedListRunMetrics, } from './lists';
|
|
10
|
+
export function planParts(contentBlocks) {
|
|
11
|
+
const byStart = new Map();
|
|
12
|
+
const byEnd = new Map();
|
|
13
|
+
const byBlock = new Array(contentBlocks.length);
|
|
14
|
+
let open;
|
|
15
|
+
for (let i = 0; i < contentBlocks.length; i++) {
|
|
16
|
+
const b = contentBlocks[i];
|
|
17
|
+
if (b.type === 'containerStart' && b.containerName === 'part' && b.containerId !== undefined) {
|
|
18
|
+
if (open) {
|
|
19
|
+
open.depth++;
|
|
20
|
+
continue;
|
|
21
|
+
}
|
|
22
|
+
const attrs = b.containerAttrs ?? {};
|
|
23
|
+
const part = {
|
|
24
|
+
startIdx: i,
|
|
25
|
+
endIdx: -1,
|
|
26
|
+
containerId: b.containerId,
|
|
27
|
+
number: (attrs.number ?? '').trim(),
|
|
28
|
+
title: (attrs.title ?? '').trim(),
|
|
29
|
+
};
|
|
30
|
+
open = { part, depth: 0 };
|
|
31
|
+
continue;
|
|
32
|
+
}
|
|
33
|
+
if (b.type === 'containerEnd' && b.containerName === 'part') {
|
|
34
|
+
if (!open)
|
|
35
|
+
continue;
|
|
36
|
+
if (open.depth > 0) {
|
|
37
|
+
open.depth--;
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
open.part.endIdx = i;
|
|
41
|
+
byStart.set(open.part.startIdx, open.part);
|
|
42
|
+
byEnd.set(i, open.part);
|
|
43
|
+
open = undefined;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
if (open)
|
|
47
|
+
byBlock[i] = open.part;
|
|
48
|
+
}
|
|
49
|
+
return { byStart, byEnd, byBlock };
|
|
50
|
+
}
|
|
51
|
+
const ROMAN_RE = /^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/i;
|
|
52
|
+
const ROMAN_VALUES = {
|
|
53
|
+
M: 1000, D: 500, C: 100, L: 50, X: 10, V: 5, I: 1,
|
|
54
|
+
};
|
|
55
|
+
/** Numeric value of a part number written as a decimal (`'3'`) or a roman
|
|
56
|
+
* numeral (`'III'`, `'iv'`), so `{numberDecimal}` / `{numberRoman}` work
|
|
57
|
+
* whichever way the author wrote it. `undefined` for anything else. */
|
|
58
|
+
export function parsePartNumber(raw) {
|
|
59
|
+
const s = raw.trim();
|
|
60
|
+
if (s.length === 0)
|
|
61
|
+
return undefined;
|
|
62
|
+
if (/^\d+$/.test(s)) {
|
|
63
|
+
const n = Number(s);
|
|
64
|
+
return Number.isSafeInteger(n) ? n : undefined;
|
|
65
|
+
}
|
|
66
|
+
if (!ROMAN_RE.test(s))
|
|
67
|
+
return undefined;
|
|
68
|
+
const u = s.toUpperCase();
|
|
69
|
+
let total = 0;
|
|
70
|
+
for (let i = 0; i < u.length; i++) {
|
|
71
|
+
const v = ROMAN_VALUES[u[i]];
|
|
72
|
+
const next = i + 1 < u.length ? ROMAN_VALUES[u[i + 1]] : 0;
|
|
73
|
+
total += v < next ? -v : v;
|
|
74
|
+
}
|
|
75
|
+
return total;
|
|
76
|
+
}
|
|
77
|
+
const eqStrict = (a, b) => a === b;
|
|
78
|
+
const eqDim = (a, b) => a !== undefined && b !== undefined && dimensionsEqual(a, b);
|
|
79
|
+
const eqColor = (a, b) => a !== undefined && b !== undefined && a.hex === b.hex;
|
|
80
|
+
const UNORDERED_FIELDS = [
|
|
81
|
+
{ key: 'fontFamily', levelKey: 'fontFamily', eq: eqStrict },
|
|
82
|
+
{ key: 'color', levelKey: 'color', eq: eqColor },
|
|
83
|
+
{ key: 'fontWeight', levelKey: 'fontWeight', eq: eqStrict },
|
|
84
|
+
{ key: 'italic', levelKey: 'italic', eq: eqStrict },
|
|
85
|
+
{ key: 'bulletChar', levelKey: 'bulletChar', eq: eqStrict },
|
|
86
|
+
{ key: 'bulletFontSize', levelKey: 'fontSize', eq: eqDim },
|
|
87
|
+
{ key: 'gap', eq: eqDim },
|
|
88
|
+
{ key: 'indent', levelKey: 'indent', eq: eqDim },
|
|
89
|
+
{ key: 'bulletVerticalOffset', levelKey: 'verticalOffset', eq: eqDim },
|
|
90
|
+
{ key: 'marginTop', eq: eqDim },
|
|
91
|
+
{ key: 'marginBottom', eq: eqDim },
|
|
92
|
+
{ key: 'itemSpacing', eq: eqDim },
|
|
93
|
+
{ key: 'hangingIndent', eq: eqStrict },
|
|
94
|
+
{ key: 'taskCheckboxChar', eq: eqStrict },
|
|
95
|
+
{ key: 'taskCheckedChar', eq: eqStrict },
|
|
96
|
+
{ key: 'taskCompletedStrikethrough', eq: eqStrict },
|
|
97
|
+
{ key: 'taskCompletedColor', eq: eqColor },
|
|
98
|
+
];
|
|
99
|
+
const ORDERED_FIELDS = [
|
|
100
|
+
{
|
|
101
|
+
key: 'fontFamily', levelKey: 'fontFamily', eq: eqStrict,
|
|
102
|
+
dependents: [{ key: 'separatorFontFamily', levelKey: 'separatorFontFamily' }],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
key: 'color', levelKey: 'color', eq: eqColor,
|
|
106
|
+
dependents: [{ key: 'separatorColor', levelKey: 'separatorColor' }],
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
key: 'fontWeight', levelKey: 'fontWeight', eq: eqStrict,
|
|
110
|
+
dependents: [{ key: 'separatorFontWeight', levelKey: 'separatorFontWeight' }],
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
key: 'italic', levelKey: 'italic', eq: eqStrict,
|
|
114
|
+
dependents: [{ key: 'separatorItalic', levelKey: 'separatorItalic' }],
|
|
115
|
+
},
|
|
116
|
+
{ key: 'numberFormat', levelKey: 'numberFormat', eq: eqStrict },
|
|
117
|
+
{ key: 'separator', levelKey: 'separator', eq: eqStrict },
|
|
118
|
+
{ key: 'numberFontSize', levelKey: 'fontSize', eq: eqDim },
|
|
119
|
+
{ key: 'gap', eq: eqDim },
|
|
120
|
+
{ key: 'indent', levelKey: 'indent', eq: eqDim },
|
|
121
|
+
{ key: 'numberVerticalOffset', levelKey: 'verticalOffset', eq: eqDim },
|
|
122
|
+
{ key: 'marginTop', eq: eqDim },
|
|
123
|
+
{ key: 'marginBottom', eq: eqDim },
|
|
124
|
+
{ key: 'itemSpacing', eq: eqDim },
|
|
125
|
+
{ key: 'hangingIndent', eq: eqStrict },
|
|
126
|
+
{ key: 'separatorFontFamily', levelKey: 'separatorFontFamily', eq: eqStrict, inheritsFrom: 'fontFamily' },
|
|
127
|
+
{ key: 'separatorFontWeight', levelKey: 'separatorFontWeight', eq: eqStrict, inheritsFrom: 'fontWeight' },
|
|
128
|
+
{ key: 'separatorItalic', levelKey: 'separatorItalic', eq: eqStrict, inheritsFrom: 'italic' },
|
|
129
|
+
{ key: 'separatorColor', levelKey: 'separatorColor', eq: eqColor, inheritsFrom: 'color' },
|
|
130
|
+
{ key: 'separatorGap', levelKey: 'separatorGap', eq: eqDim },
|
|
131
|
+
];
|
|
132
|
+
/**
|
|
133
|
+
* Apply a partial list config on top of a resolved one. A list-wide value
|
|
134
|
+
* propagates to every level (and dependent field) whose current value still
|
|
135
|
+
* equals the value it was resolved from — a level with its own value keeps
|
|
136
|
+
* it (the same heuristic the callout overrides use). Entries in `levels`
|
|
137
|
+
* then apply directly to their level.
|
|
138
|
+
*/
|
|
139
|
+
function applyListOverrides(base, override, specs) {
|
|
140
|
+
if (!override)
|
|
141
|
+
return base;
|
|
142
|
+
const ov = override;
|
|
143
|
+
const out = { ...base };
|
|
144
|
+
const levels = base.levels.map((l) => ({ ...l }));
|
|
145
|
+
const setField = (target, spec, onLevel, value) => {
|
|
146
|
+
const key = onLevel ? spec.levelKey : spec.key;
|
|
147
|
+
const prev = target[key];
|
|
148
|
+
target[key] = value;
|
|
149
|
+
for (const dep of spec.dependents ?? []) {
|
|
150
|
+
const depKey = onLevel ? dep.levelKey : dep.key;
|
|
151
|
+
if (spec.eq(target[depKey], prev))
|
|
152
|
+
target[depKey] = value;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
for (const spec of specs) {
|
|
156
|
+
const value = ov[spec.key];
|
|
157
|
+
if (value === undefined)
|
|
158
|
+
continue;
|
|
159
|
+
const prevGeneral = out[spec.key];
|
|
160
|
+
setField(out, spec, false, value);
|
|
161
|
+
if (!spec.levelKey)
|
|
162
|
+
continue;
|
|
163
|
+
for (const l of levels) {
|
|
164
|
+
const current = l[spec.levelKey];
|
|
165
|
+
const inherited = spec.eq(current, prevGeneral) ||
|
|
166
|
+
(spec.inheritsFrom !== undefined && spec.eq(current, l[spec.inheritsFrom]));
|
|
167
|
+
if (inherited)
|
|
168
|
+
setField(l, spec, true, value);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const levelOverrides = ov.levels ?? [];
|
|
172
|
+
for (const lo of levelOverrides) {
|
|
173
|
+
const target = levels.find((l) => l.level === lo.level);
|
|
174
|
+
if (!target)
|
|
175
|
+
continue;
|
|
176
|
+
for (const spec of specs) {
|
|
177
|
+
if (!spec.levelKey)
|
|
178
|
+
continue;
|
|
179
|
+
const value = lo[spec.levelKey];
|
|
180
|
+
if (value !== undefined)
|
|
181
|
+
setField(target, spec, true, value);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
out.levels = levels;
|
|
185
|
+
return out;
|
|
186
|
+
}
|
|
187
|
+
/** Shallow copy of `resolved` whose `bodyText` and list configs carry the
|
|
188
|
+
* `parts.bodyStyle` overrides, so the body/list resolvers yield the part
|
|
189
|
+
* typography without any part-specific branches (the callout approach).
|
|
190
|
+
* Ordered-list numbers are set bold in `numberColor`; bullets take
|
|
191
|
+
* `bulletColor`. Level-specific values only follow an override when they
|
|
192
|
+
* still equal the general value they were resolved from. The
|
|
193
|
+
* `bodyStyle.unorderedLists` / `orderedLists` partials apply last. */
|
|
194
|
+
export function derivePartResolvedConfig(resolved) {
|
|
195
|
+
const { bodyStyle } = resolved.parts;
|
|
196
|
+
const bold = resolved.bodyText.boldFontWeight;
|
|
197
|
+
const unorderedLists = applyListOverrides(applyListOverrides(resolved.unorderedLists, { color: bodyStyle.bulletColor }, UNORDERED_FIELDS), bodyStyle.unorderedLists, UNORDERED_FIELDS);
|
|
198
|
+
const orderedLists = applyListOverrides(applyListOverrides(resolved.orderedLists, { color: bodyStyle.numberColor, fontWeight: bold }, ORDERED_FIELDS), bodyStyle.orderedLists, ORDERED_FIELDS);
|
|
199
|
+
return {
|
|
200
|
+
...resolved,
|
|
201
|
+
bodyText: {
|
|
202
|
+
...resolved.bodyText,
|
|
203
|
+
fontFamily: bodyStyle.fontFamily,
|
|
204
|
+
fontSize: bodyStyle.fontSize,
|
|
205
|
+
lineHeight: bodyStyle.lineHeight,
|
|
206
|
+
color: bodyStyle.color,
|
|
207
|
+
textAlign: bodyStyle.textAlign,
|
|
208
|
+
},
|
|
209
|
+
unorderedLists,
|
|
210
|
+
orderedLists,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
/** Measurement context for the blocks inside a part: the derived config
|
|
214
|
+
* plus the body / blockquote styles, list indents and ordered-list number
|
|
215
|
+
* widths recomputed from it. */
|
|
216
|
+
export function derivePartMeasureContext(ctx) {
|
|
217
|
+
const resolved = derivePartResolvedConfig(ctx.resolved);
|
|
218
|
+
const bodyStyle = resolveBodyStyle(resolved);
|
|
219
|
+
const orderedMetrics = computeOrderedListRunMetrics([...ctx.contentBlocks], resolved, bodyStyle.fontSizePx);
|
|
220
|
+
return {
|
|
221
|
+
...ctx,
|
|
222
|
+
resolved,
|
|
223
|
+
bodyStyle,
|
|
224
|
+
blockquoteStyle: resolveBlockquoteStyle(resolved),
|
|
225
|
+
listLevelIndentsPx: computeLevelIndentsPx(resolved, bodyStyle.fontSizePx),
|
|
226
|
+
orderedMetrics,
|
|
227
|
+
orderedLevelIndentsPx: computeOrderedLevelIndentsPx(resolved, bodyStyle.fontSizePx, orderedMetrics.maxWidthByDepth),
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=parts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parts.js","sourceRoot":"","sources":["../../src/pipeline/parts.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,12 +18,30 @@ export interface PlaceholderContext {
|
|
|
18
18
|
metadata: DocumentMetadata;
|
|
19
19
|
/** Chapter title per page index (most recent H1 at or before each page). */
|
|
20
20
|
chapterTitleByPageIndex: string[];
|
|
21
|
+
/** Heading attributes of the current chapter's H1 per page index (see
|
|
22
|
+
* `computeChapterAttrs`). Backs `{attr.<key>}` in header/footer slots. A
|
|
23
|
+
* missing entry or key resolves to `''`. */
|
|
24
|
+
chapterAttrsByPageIndex?: Record<string, string>[];
|
|
25
|
+
/** Current part title / number per page index (see `computePartValues`).
|
|
26
|
+
* Back `{partTitle}` / `{partNumber}`; a missing entry resolves to `''`. */
|
|
27
|
+
partTitleByPageIndex?: string[];
|
|
28
|
+
partNumberByPageIndex?: string[];
|
|
29
|
+
/** Current chapter number per page index (see `computeChapterNumbers`).
|
|
30
|
+
* Backs `{chapterNumber}` in header/footer slots. */
|
|
31
|
+
chapterNumberByPageIndex?: string[];
|
|
21
32
|
}
|
|
22
33
|
export interface PlaceholderResult {
|
|
23
34
|
text: string;
|
|
24
35
|
unknownPlaceholders: string[];
|
|
25
36
|
missingMetadata: string[];
|
|
26
37
|
}
|
|
38
|
+
/** Placeholder grammar: `name` or `name.key` — the dotted form is reserved
|
|
39
|
+
* for namespaced lookups such as `{attr.author}` (heading attributes). */
|
|
40
|
+
export declare const PLACEHOLDER_NAME_RE: RegExp;
|
|
41
|
+
/** Namespace of the heading-attribute placeholders (`{attr.<key>}`). */
|
|
42
|
+
export declare const ATTR_PLACEHOLDER_PREFIX = "attr.";
|
|
43
|
+
/** When `name` is an `attr.<key>` placeholder, returns `<key>`. */
|
|
44
|
+
export declare function attrPlaceholderKey(name: string): string | undefined;
|
|
27
45
|
/**
|
|
28
46
|
* Precompute chapter titles (most recent H1 text) for each page index by
|
|
29
47
|
* walking blocks once. Returns an array where `result[pageIndex]` is the plain
|
|
@@ -43,9 +61,36 @@ export declare function computeChapterTitles(blocks: VDTBlock[], totalPages: num
|
|
|
43
61
|
* `{chapterNumber}` in heading-context slots resolves to the current chapter.
|
|
44
62
|
*/
|
|
45
63
|
export declare function computeChapterNumbers(blocks: VDTBlock[], totalPages: number, pages?: ChapterTitlePageInfo[]): string[];
|
|
64
|
+
/**
|
|
65
|
+
* Precompute the heading attributes (`# Title {key="value"}`) of the most
|
|
66
|
+
* recent H1 per page. Backs `{attr.<key>}` in header/footer slots; pages
|
|
67
|
+
* before the first H1 get an empty record.
|
|
68
|
+
*/
|
|
69
|
+
export declare function computeChapterAttrs(blocks: VDTBlock[], totalPages: number, pages?: ChapterTitlePageInfo[]): Record<string, string>[];
|
|
70
|
+
/** The page fields `computePartValues` reads. */
|
|
71
|
+
export interface PartPageInfo extends ChapterTitlePageInfo {
|
|
72
|
+
partInfo?: {
|
|
73
|
+
number: string;
|
|
74
|
+
title: string;
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Precompute the current part title and number per page index. A page with
|
|
79
|
+
* `partInfo` (a `:::part` divider page) starts a new part that runs until
|
|
80
|
+
* the next one; pages before the first part get `''`. Blank parity pages
|
|
81
|
+
* immediately preceding a part page belong to the upcoming part (they exist
|
|
82
|
+
* only to push it onto the right parity); a `blankForForce` page stops the
|
|
83
|
+
* walk — it belongs to the previous part, the same rule as chapters.
|
|
84
|
+
*/
|
|
85
|
+
export declare function computePartValues(pages: readonly PartPageInfo[]): {
|
|
86
|
+
partTitleByPageIndex: string[];
|
|
87
|
+
partNumberByPageIndex: string[];
|
|
88
|
+
};
|
|
46
89
|
/**
|
|
47
90
|
* Resolve placeholder templates. Grammar:
|
|
48
|
-
* - `{name}` with name matching `[a-zA-Z][a-zA-Z0-9]*` is a placeholder
|
|
91
|
+
* - `{name}` with name matching `[a-zA-Z][a-zA-Z0-9]*` is a placeholder;
|
|
92
|
+
* - `{name.key}` is a namespaced placeholder — `{attr.<key>}` reads the
|
|
93
|
+
* current chapter's heading attributes (missing → `''`, no warning);
|
|
49
94
|
* - `{{` and `}}` are literal braces.
|
|
50
95
|
*/
|
|
51
96
|
export declare function resolvePlaceholders(template: string, ctx: PlaceholderContext): PlaceholderResult;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"placeholders.d.ts","sourceRoot":"","sources":["../../src/pipeline/placeholders.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"placeholders.d.ts","sourceRoot":"","sources":["../../src/pipeline/placeholders.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEhD;;;;;;;oEAOoE;AACpE,MAAM,WAAW,oBAAoB;IACnC,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,4EAA4E;IAC5E,uBAAuB,EAAE,MAAM,EAAE,CAAC;IAClC;;iDAE6C;IAC7C,uBAAuB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IACnD;iFAC6E;IAC7E,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IACjC;0DACsD;IACtD,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAiBD;2EAC2E;AAC3E,eAAO,MAAM,mBAAmB,QAAyD,CAAC;AAE1F,wEAAwE;AACxE,eAAO,MAAM,uBAAuB,UAAU,CAAC;AAE/C,mEAAmE;AACnE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAInE;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,QAAQ,EAAE,EAClB,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,oBAAoB,EAAE,GAC7B,MAAM,EAAE,CAEV;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,QAAQ,EAAE,EAClB,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,oBAAoB,EAAE,GAC7B,MAAM,EAAE,CAmBV;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,QAAQ,EAAE,EAClB,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,oBAAoB,EAAE,GAC7B,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAE1B;AA6DD,iDAAiD;AACjD,MAAM,WAAW,YAAa,SAAQ,oBAAoB;IACxD,QAAQ,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9C;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,SAAS,YAAY,EAAE,GAC7B;IAAE,oBAAoB,EAAE,MAAM,EAAE,CAAC;IAAC,qBAAqB,EAAE,MAAM,EAAE,CAAA;CAAE,CAqBrE;AAWD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,kBAAkB,GACtB,iBAAiB,CAsDnB;AA6BD;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBlE;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE3D"}
|