postext 0.3.19 → 0.3.21
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__/columnBalancing.test.js +36 -2
- package/dist/__tests__/columnBalancing.test.js.map +1 -1
- 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__/overStretch.test.d.ts +2 -0
- package/dist/__tests__/overStretch.test.d.ts.map +1 -0
- package/dist/__tests__/overStretch.test.js +35 -0
- package/dist/__tests__/overStretch.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/__tests__/tracking.test.d.ts +2 -0
- package/dist/__tests__/tracking.test.d.ts.map +1 -0
- package/dist/__tests__/tracking.test.js +37 -0
- package/dist/__tests__/tracking.test.js.map +1 -0
- package/dist/__tests__/urlBreaks.test.d.ts +2 -0
- package/dist/__tests__/urlBreaks.test.d.ts.map +1 -0
- package/dist/__tests__/urlBreaks.test.js +57 -0
- package/dist/__tests__/urlBreaks.test.js.map +1 -0
- package/dist/canvas-backend/blockRender.d.ts.map +1 -1
- package/dist/canvas-backend/blockRender.js +20 -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/bodyText.js +1 -1
- package/dist/defaults/bodyText.js.map +1 -1
- 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 +3 -0
- package/dist/defaults/headings.d.ts.map +1 -1
- package/dist/defaults/headings.js +33 -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 +75 -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/knuthPlass/breakpoints.d.ts.map +1 -1
- package/dist/knuthPlass/breakpoints.js +4 -2
- package/dist/knuthPlass/breakpoints.js.map +1 -1
- package/dist/knuthPlass/constants.d.ts +7 -0
- package/dist/knuthPlass/constants.d.ts.map +1 -1
- package/dist/knuthPlass/constants.js +7 -0
- package/dist/knuthPlass/constants.js.map +1 -1
- package/dist/knuthPlass/richAdapter.d.ts +2 -0
- package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
- package/dist/knuthPlass/richAdapter.js +6 -6
- package/dist/knuthPlass/richAdapter.js.map +1 -1
- package/dist/measure/cache.js +2 -2
- package/dist/measure/cache.js.map +1 -1
- package/dist/measure/rich.d.ts +8 -0
- package/dist/measure/rich.d.ts.map +1 -1
- package/dist/measure/rich.js +54 -10
- package/dist/measure/rich.js.map +1 -1
- package/dist/measure/types.d.ts +4 -0
- package/dist/measure/types.d.ts.map +1 -1
- package/dist/measure/types.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 +41 -0
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +675 -168
- 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 +26 -8
- package/dist/pipeline/columnBalancing.d.ts.map +1 -1
- package/dist/pipeline/columnBalancing.js +50 -18
- 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 +65 -0
- package/dist/pipeline/measureContentBlock.d.ts.map +1 -0
- package/dist/pipeline/measureContentBlock.js +134 -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 +468 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/vdt.d.ts +132 -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,93 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { DEFAULT_PARAGRAPH_STYLES, resolveParagraphStylesConfig, stripParagraphStylesDefaults, } from '../../defaults/paragraphStyles';
|
|
3
|
+
import { resolveBodyTextConfig } from '../../defaults/bodyText';
|
|
4
|
+
import { stripConfigDefaults, applyPaletteToConfig } from '../../defaults';
|
|
5
|
+
import { resolveAllConfig } from '../../pipeline/config';
|
|
6
|
+
const body = resolveBodyTextConfig({
|
|
7
|
+
fontFamily: 'Literata',
|
|
8
|
+
fontSize: { value: 9, unit: 'pt' },
|
|
9
|
+
lineHeight: { value: 1.4, unit: 'em' },
|
|
10
|
+
textAlign: 'left',
|
|
11
|
+
hyphenation: { enabled: false },
|
|
12
|
+
firstLineIndent: { value: 1, unit: 'em' },
|
|
13
|
+
});
|
|
14
|
+
describe('paragraph style defaults', () => {
|
|
15
|
+
it('ships no styles by default', () => {
|
|
16
|
+
expect(DEFAULT_PARAGRAPH_STYLES).toEqual([]);
|
|
17
|
+
expect(resolveParagraphStylesConfig(undefined, body)).toEqual([]);
|
|
18
|
+
expect(resolveAllConfig().paragraphStyles).toEqual([]);
|
|
19
|
+
});
|
|
20
|
+
it('resolve inherits every unset field from the body text', () => {
|
|
21
|
+
const [r] = resolveParagraphStylesConfig([{ id: 'bib' }], body);
|
|
22
|
+
expect(r).toEqual({
|
|
23
|
+
id: 'bib',
|
|
24
|
+
name: 'bib',
|
|
25
|
+
fontFamily: 'Literata',
|
|
26
|
+
fontSize: { value: 9, unit: 'pt' },
|
|
27
|
+
lineHeight: { value: 1.4, unit: 'em' },
|
|
28
|
+
color: body.color,
|
|
29
|
+
textAlign: 'left',
|
|
30
|
+
hyphenation: false,
|
|
31
|
+
firstLineIndent: { value: 1, unit: 'em' },
|
|
32
|
+
hangingIndent: { value: 0, unit: 'em' },
|
|
33
|
+
spaceBetween: { value: 0, unit: 'em' },
|
|
34
|
+
marginTop: { value: 0, unit: 'em' },
|
|
35
|
+
marginBottom: { value: 0, unit: 'em' },
|
|
36
|
+
});
|
|
37
|
+
});
|
|
38
|
+
it('explicit fields win over the inherited ones', () => {
|
|
39
|
+
const style = {
|
|
40
|
+
id: 'note',
|
|
41
|
+
name: 'Notes',
|
|
42
|
+
fontFamily: 'Inter',
|
|
43
|
+
fontSize: { value: 7, unit: 'pt' },
|
|
44
|
+
lineHeight: { value: 10, unit: 'pt' },
|
|
45
|
+
color: { hex: '#333333', model: 'hex' },
|
|
46
|
+
textAlign: 'justify',
|
|
47
|
+
hyphenation: true,
|
|
48
|
+
hangingIndent: { value: 2, unit: 'em' },
|
|
49
|
+
spaceBetween: { value: 0.5, unit: 'em' },
|
|
50
|
+
marginTop: { value: 1, unit: 'em' },
|
|
51
|
+
marginBottom: { value: 1, unit: 'em' },
|
|
52
|
+
};
|
|
53
|
+
const [r] = resolveParagraphStylesConfig([style], body);
|
|
54
|
+
expect(r).toMatchObject(style);
|
|
55
|
+
expect(r.firstLineIndent).toEqual(body.firstLineIndent);
|
|
56
|
+
});
|
|
57
|
+
it('strip drops static defaults and keeps explicit fields', () => {
|
|
58
|
+
const stripped = stripParagraphStylesDefaults([{
|
|
59
|
+
id: 'bib',
|
|
60
|
+
name: 'bib',
|
|
61
|
+
fontSize: { value: 7, unit: 'pt' },
|
|
62
|
+
hangingIndent: { value: 0, unit: 'em' },
|
|
63
|
+
spaceBetween: { value: 0, unit: 'pt' },
|
|
64
|
+
marginTop: { value: 1, unit: 'em' },
|
|
65
|
+
}]);
|
|
66
|
+
expect(stripped).toEqual([{ id: 'bib', fontSize: { value: 7, unit: 'pt' }, marginTop: { value: 1, unit: 'em' } }]);
|
|
67
|
+
expect(stripParagraphStylesDefaults(undefined)).toBeUndefined();
|
|
68
|
+
expect(stripParagraphStylesDefaults([])).toBeUndefined();
|
|
69
|
+
});
|
|
70
|
+
it('strip round-trips through resolve', () => {
|
|
71
|
+
const styles = [
|
|
72
|
+
{ id: 'a', name: 'a', hangingIndent: { value: 0, unit: 'em' } },
|
|
73
|
+
{ id: 'b', name: 'B', fontSize: { value: 7, unit: 'pt' }, spaceBetween: { value: 0.5, unit: 'em' } },
|
|
74
|
+
];
|
|
75
|
+
const stripped = stripParagraphStylesDefaults(styles);
|
|
76
|
+
expect(resolveParagraphStylesConfig(stripped, body)).toEqual(resolveParagraphStylesConfig(styles, body));
|
|
77
|
+
});
|
|
78
|
+
it('stripConfigDefaults removes an empty paragraphStyles list', () => {
|
|
79
|
+
const config = { paragraphStyles: [] };
|
|
80
|
+
expect(stripConfigDefaults(config).paragraphStyles).toBeUndefined();
|
|
81
|
+
const kept = { paragraphStyles: [{ id: 'x', fontSize: { value: 7, unit: 'pt' } }] };
|
|
82
|
+
expect(stripConfigDefaults(kept).paragraphStyles).toEqual(kept.paragraphStyles);
|
|
83
|
+
});
|
|
84
|
+
it('palette-linked colours resolve through the palette', () => {
|
|
85
|
+
const config = {
|
|
86
|
+
colorPalette: [{ id: 'accent', name: 'Accent', value: { hex: '#AA0000', model: 'hex' } }],
|
|
87
|
+
paragraphStyles: [{ id: 'x', color: { hex: '#000000', model: 'hex', paletteId: 'accent' } }],
|
|
88
|
+
};
|
|
89
|
+
expect(applyPaletteToConfig(config).paragraphStyles[0].color).toEqual({ hex: '#AA0000', model: 'hex' });
|
|
90
|
+
expect(resolveAllConfig(config).paragraphStyles[0].color.hex).toBe('#AA0000');
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
//# sourceMappingURL=paragraphStyles.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paragraphStyles.test.js","sourceRoot":"","sources":["../../../src/__tests__/defaults/paragraphStyles.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,MAAM,IAAI,GAAG,qBAAqB,CAAC;IACjC,UAAU,EAAE,UAAU;IACtB,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;IAClC,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;IACtC,SAAS,EAAE,MAAM;IACjB,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;IAC/B,eAAe,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;CAC1C,CAAC,CAAC;AAEH,QAAQ,CAAC,0BAA0B,EAAE,GAAG,EAAE;IACxC,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,wBAAwB,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,CAAC,4BAA4B,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAClE,MAAM,CAAC,gBAAgB,EAAE,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,CAAC,CAAC,CAAC,GAAG,4BAA4B,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;QAChE,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAChB,EAAE,EAAE,KAAK;YACT,IAAI,EAAE,KAAK;YACX,UAAU,EAAE,UAAU;YACtB,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;YAClC,UAAU,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;YACtC,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS,EAAE,MAAM;YACjB,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;YACzC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;YACvC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;YACtC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;YACnC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;SACvC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,KAAK,GAAyB;YAClC,EAAE,EAAE,MAAM;YACV,IAAI,EAAE,OAAO;YACb,UAAU,EAAE,OAAO;YACnB,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;YAClC,UAAU,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE;YACrC,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE;YACvC,SAAS,EAAE,SAAS;YACpB,WAAW,EAAE,IAAI;YACjB,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;YACvC,YAAY,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE;YACxC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;YACnC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;SACvC,CAAC;QACF,MAAM,CAAC,CAAC,CAAC,GAAG,4BAA4B,CAAC,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC/B,MAAM,CAAC,CAAE,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC/D,MAAM,QAAQ,GAAG,4BAA4B,CAAC,CAAC;gBAC7C,EAAE,EAAE,KAAK;gBACT,IAAI,EAAE,KAAK;gBACX,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;gBAClC,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;gBACvC,YAAY,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;gBACtC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;aACpC,CAAC,CAAC,CAAC;QACJ,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QACnH,MAAM,CAAC,4BAA4B,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAChE,MAAM,CAAC,4BAA4B,CAAC,EAAE,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAA2B;YACrC,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;YAC/D,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;SACrG,CAAC;QACF,MAAM,QAAQ,GAAG,4BAA4B,CAAC,MAAM,CAAE,CAAC;QACvD,MAAM,CAAC,4BAA4B,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAkB,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC;QACtD,MAAM,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,aAAa,EAAE,CAAC;QACpE,MAAM,IAAI,GAAkB,EAAE,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC;QACnG,MAAM,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,MAAM,GAAkB;YAC5B,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC;YACzF,eAAe,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE,CAAC;SAC7F,CAAC;QACF,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAE,CAAC,eAAgB,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAC3G,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACjF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageAnchors.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/design/pageAnchors.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { layoutDesignSlot, pageMatchesRole } from '../../design/layout';
|
|
3
|
+
import { measureHeadingAdvancedDesignHeight } from '../../pipeline/headerFooter';
|
|
4
|
+
import { resolveDesignSlot } from '../../defaults/headerFooter';
|
|
5
|
+
import { resolveHeadingsConfig } from '../../defaults/headings';
|
|
6
|
+
// Deterministic text measurement stub (no DOM in the node test env).
|
|
7
|
+
class StubCtx {
|
|
8
|
+
font = '';
|
|
9
|
+
measureText(s) {
|
|
10
|
+
return { width: s.length * 7 };
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
globalThis.OffscreenCanvas = class {
|
|
14
|
+
getContext() {
|
|
15
|
+
return new StubCtx();
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
const DPI = 72; // 1pt = 1px keeps the arithmetic readable.
|
|
19
|
+
const pt = (value) => ({ value, unit: 'pt' });
|
|
20
|
+
const frames = {
|
|
21
|
+
page: { x: 20, y: 20, width: 400, height: 600 },
|
|
22
|
+
bleed: { x: 10, y: 10, width: 420, height: 620 },
|
|
23
|
+
};
|
|
24
|
+
/** Header container: inside the page, inset by the margins. */
|
|
25
|
+
const container = { x: 60, y: 0, width: 320, height: 80 };
|
|
26
|
+
const stubPage = { index: 0, pageLabel: '1' };
|
|
27
|
+
const placeholders = {
|
|
28
|
+
kind: 'header',
|
|
29
|
+
page: stubPage,
|
|
30
|
+
allPages: [stubPage],
|
|
31
|
+
metadata: {},
|
|
32
|
+
chapterTitleByPageIndex: [],
|
|
33
|
+
};
|
|
34
|
+
const box = (id, anchor, size) => ({
|
|
35
|
+
kind: 'box',
|
|
36
|
+
id,
|
|
37
|
+
placement: { anchor, size },
|
|
38
|
+
style: { backgroundColor: { hex: '#ff0000', model: 'hex' } },
|
|
39
|
+
});
|
|
40
|
+
const layout = (elements, withFrames = true) => layoutDesignSlot(resolveDesignSlot({ elements }), { container, dpi: DPI, placeholders, frames: withFrames ? frames : undefined }, 0);
|
|
41
|
+
describe('page / bleed anchors', () => {
|
|
42
|
+
it("anchor.to: 'page' uses the trim box as reference and fill bounds", () => {
|
|
43
|
+
const { primitives, issues } = layout([box('band', { to: 'page', edge: 'top-left' }, { width: 'fill', height: pt(30) })]);
|
|
44
|
+
expect(issues).toEqual([]);
|
|
45
|
+
const band = primitives[0];
|
|
46
|
+
expect(band.x).toBe(frames.page.x);
|
|
47
|
+
expect(band.y).toBe(frames.page.y);
|
|
48
|
+
expect(band.width).toBe(frames.page.width);
|
|
49
|
+
expect(band.height).toBe(30);
|
|
50
|
+
});
|
|
51
|
+
it("anchor.to: 'bleed' runs edge to edge over the bleed box", () => {
|
|
52
|
+
const { primitives } = layout([box('band', { to: 'bleed', edge: 'bottom-left' }, { width: 'fill', height: pt(40) })]);
|
|
53
|
+
const band = primitives[0];
|
|
54
|
+
expect(band.x).toBe(frames.bleed.x);
|
|
55
|
+
expect(band.width).toBe(frames.bleed.width);
|
|
56
|
+
expect(band.y + band.height).toBe(frames.bleed.y + frames.bleed.height);
|
|
57
|
+
});
|
|
58
|
+
it('page-anchored text clamps its auto width to the page frame, not the container', () => {
|
|
59
|
+
const el = {
|
|
60
|
+
kind: 'text',
|
|
61
|
+
id: 't',
|
|
62
|
+
content: 'x'.repeat(55), // 385px at 7px/char — wider than the container (320) but not the page (400)
|
|
63
|
+
fontSize: pt(10),
|
|
64
|
+
overflow: 'clip',
|
|
65
|
+
placement: { anchor: { to: 'page', edge: 'top-left' } },
|
|
66
|
+
};
|
|
67
|
+
const { primitives } = layout([el]);
|
|
68
|
+
const text = primitives[0];
|
|
69
|
+
expect(text.x).toBe(frames.page.x);
|
|
70
|
+
expect(text.width).toBe(385);
|
|
71
|
+
});
|
|
72
|
+
it('falls back to the container when no frames are supplied', () => {
|
|
73
|
+
const { primitives, issues } = layout([box('band', { to: 'page', edge: 'top-left' }, { width: 'fill', height: pt(30) })], false);
|
|
74
|
+
expect(issues).toEqual([]);
|
|
75
|
+
expect(primitives[0].x).toBe(container.x);
|
|
76
|
+
expect(primitives[0].width).toBe(container.width);
|
|
77
|
+
});
|
|
78
|
+
it('does not flag page/bleed anchors as dangling and still resolves #id chains off them', () => {
|
|
79
|
+
const { primitives, issues } = layout([
|
|
80
|
+
box('band', { to: 'bleed', edge: 'top-left' }, { width: 'fill', height: pt(30) }),
|
|
81
|
+
box('under', { to: '#band', edge: 'below' }, { width: pt(50), height: pt(10) }),
|
|
82
|
+
]);
|
|
83
|
+
expect(issues).toEqual([]);
|
|
84
|
+
const band = primitives[0];
|
|
85
|
+
const under = primitives[1];
|
|
86
|
+
expect(under.y).toBe(band.y + band.height);
|
|
87
|
+
expect(under.x).toBe(band.x);
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe('page role filter', () => {
|
|
91
|
+
it('pageMatchesRole admits everything for all/unknown and matches exact roles otherwise', () => {
|
|
92
|
+
expect(pageMatchesRole('all', 'body')).toBe(true);
|
|
93
|
+
expect(pageMatchesRole(undefined, 'opener')).toBe(true);
|
|
94
|
+
expect(pageMatchesRole('body', undefined)).toBe(true);
|
|
95
|
+
expect(pageMatchesRole('body', 'body')).toBe(true);
|
|
96
|
+
expect(pageMatchesRole('body', 'opener')).toBe(false);
|
|
97
|
+
expect(pageMatchesRole('opener', 'opener')).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
it('layoutDesignSlot drops elements whose pages filter does not match the context role', () => {
|
|
100
|
+
const elements = [
|
|
101
|
+
{ ...box('bodyOnly', { to: 'container', edge: 'top-left' }, { width: pt(10), height: pt(10) }), pages: 'body' },
|
|
102
|
+
{ ...box('openerOnly', { to: 'container', edge: 'top-left' }, { width: pt(10), height: pt(10) }), pages: 'opener' },
|
|
103
|
+
box('always', { to: 'container', edge: 'top-left' }, { width: pt(10), height: pt(10) }),
|
|
104
|
+
];
|
|
105
|
+
const onOpener = layoutDesignSlot(resolveDesignSlot({ elements }), { container, dpi: DPI, placeholders, pageRole: 'opener' }, 0);
|
|
106
|
+
expect(onOpener.primitives.map((p) => p.id)).toEqual(['openerOnly', 'always']);
|
|
107
|
+
const onBody = layoutDesignSlot(resolveDesignSlot({ elements }), { container, dpi: DPI, placeholders, pageRole: 'body' }, 0);
|
|
108
|
+
expect(onBody.primitives.map((p) => p.id)).toEqual(['bodyOnly', 'always']);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
describe('measureHeadingAdvancedDesignHeight with frames', () => {
|
|
112
|
+
const level = (elements, minHeight) => resolveHeadingsConfig({
|
|
113
|
+
levels: [{ level: 1, advancedDesign: { enabled: true, slot: { elements }, ...(minHeight ? { minHeight } : {}) } }],
|
|
114
|
+
}).levels.find((l) => l.level === 1);
|
|
115
|
+
const heading = { titleText: 'T', formattedNumber: '', chapterNumber: '' };
|
|
116
|
+
// Heading container sits at the content-area top: 60px below the page top.
|
|
117
|
+
const origin = { x: 60, y: frames.page.y + 60 };
|
|
118
|
+
it('a page-anchored band entirely above the heading does not grow the reserved height', () => {
|
|
119
|
+
const lvl = level([box('band', { to: 'page', edge: 'top-left' }, { width: 'fill', height: pt(40) })]);
|
|
120
|
+
const h = measureHeadingAdvancedDesignHeight(lvl, heading, 320, DPI, {}, 0, frames, origin);
|
|
121
|
+
// Band spans page y 20..60, heading top is at 80 → nothing below the heading top.
|
|
122
|
+
expect(h).toBe(0);
|
|
123
|
+
});
|
|
124
|
+
it('a page-anchored band extending below the heading top grows the reserved height', () => {
|
|
125
|
+
const lvl = level([box('band', { to: 'page', edge: 'top-left' }, { width: 'fill', height: pt(100) })]);
|
|
126
|
+
const h = measureHeadingAdvancedDesignHeight(lvl, heading, 320, DPI, {}, 0, frames, origin);
|
|
127
|
+
// Band spans page y 20..120; heading top at 80 → 40px below it.
|
|
128
|
+
expect(h).toBe(40);
|
|
129
|
+
});
|
|
130
|
+
it('minHeight raises the reserved height and applies even to an empty slot', () => {
|
|
131
|
+
const lvl = level([box('band', { to: 'container', edge: 'top-left' }, { width: 'fill', height: pt(30) })], pt(120));
|
|
132
|
+
expect(measureHeadingAdvancedDesignHeight(lvl, heading, 320, DPI, {}, 0)).toBe(120);
|
|
133
|
+
const empty = level([], pt(90));
|
|
134
|
+
expect(measureHeadingAdvancedDesignHeight(empty, heading, 320, DPI, {}, 0)).toBe(90);
|
|
135
|
+
// Larger design content wins over a smaller minHeight.
|
|
136
|
+
const tall = level([box('band', { to: 'container', edge: 'top-left' }, { width: 'fill', height: pt(200) })], pt(120));
|
|
137
|
+
expect(measureHeadingAdvancedDesignHeight(tall, heading, 320, DPI, {}, 0)).toBe(200);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
//# sourceMappingURL=pageAnchors.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pageAnchors.test.js","sourceRoot":"","sources":["../../../src/__tests__/design/pageAnchors.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAqB,MAAM,qBAAqB,CAAC;AAC3F,OAAO,EAAE,kCAAkC,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAKhE,qEAAqE;AACrE,MAAM,OAAO;IACX,IAAI,GAAG,EAAE,CAAC;IACV,WAAW,CAAC,CAAS;QACnB,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IACjC,CAAC;CACF;AACA,UAAsD,CAAC,eAAe,GAAG;IACxE,UAAU;QACR,OAAO,IAAI,OAAO,EAAE,CAAC;IACvB,CAAC;CACF,CAAC;AAEF,MAAM,GAAG,GAAG,EAAE,CAAC,CAAC,2CAA2C;AAC3D,MAAM,EAAE,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAa,EAAE,CAAC,CAAC;AAE/D,MAAM,MAAM,GAAiB;IAC3B,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;IAC/C,KAAK,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE;CACjD,CAAC;AACF,+DAA+D;AAC/D,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AAE1D,MAAM,QAAQ,GAAG,EAAE,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,GAAG,EAAwB,CAAC;AACpE,MAAM,YAAY,GAA6B;IAC7C,IAAI,EAAE,QAAQ;IACd,IAAI,EAAE,QAAQ;IACd,QAAQ,EAAE,CAAC,QAAQ,CAAC;IACpB,QAAQ,EAAE,EAAE;IACZ,uBAAuB,EAAE,EAAE;CAC5B,CAAC;AAEF,MAAM,GAAG,GAAG,CAAC,EAAU,EAAE,MAAqB,EAAE,IAA4H,EAAiB,EAAE,CAAC,CAAC;IAC/L,IAAI,EAAE,KAAK;IACX,EAAE;IACF,SAAS,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;IAC3B,KAAK,EAAE,EAAE,eAAe,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;CAC7D,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,CAAC,QAAyB,EAAE,UAAU,GAAG,IAAI,EAAE,EAAE,CAC9D,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAAC;AAEvI,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QAC1E,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC1H,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtH,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACpC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,EAAE,GAAkB;YACxB,IAAI,EAAE,MAAM;YACZ,EAAE,EAAE,GAAG;YACP,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,4EAA4E;YACrG,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC;YAChB,QAAQ,EAAE,MAAM;YAChB,SAAS,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE;SACxD,CAAC;QACF,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;QACjI,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,CAAC;YACpC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;YACjF,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SAChF,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC7F,MAAM,CAAC,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC5F,MAAM,QAAQ,GAAoB;YAChC,EAAE,GAAG,GAAG,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE;YAC/G,EAAE,GAAG,GAAG,CAAC,YAAY,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE;YACnH,GAAG,CAAC,QAAQ,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;SACxF,CAAC;QACF,MAAM,QAAQ,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QACjI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7H,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gDAAgD,EAAE,GAAG,EAAE;IAC9D,MAAM,KAAK,GAAG,CAAC,QAAyB,EAAE,SAAyC,EAAE,EAAE,CACrF,qBAAqB,CAAC;QACpB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;KACnH,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAE,CAAC;IACxC,MAAM,OAAO,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,eAAe,EAAE,EAAE,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC;IAC3E,2EAA2E;IAC3E,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;IAEhD,EAAE,CAAC,mFAAmF,EAAE,GAAG,EAAE;QAC3F,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACtG,MAAM,CAAC,GAAG,kCAAkC,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5F,kFAAkF;QAClF,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvG,MAAM,CAAC,GAAG,kCAAkC,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAC5F,gEAAgE;QAChE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACpH,MAAM,CAAC,kCAAkC,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACpF,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,kCAAkC,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrF,uDAAuD;QACvD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACtH,MAAM,CAAC,kCAAkC,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,5 +1,19 @@
|
|
|
1
1
|
import { describe, it, expect } from 'vitest';
|
|
2
2
|
import { parseMarkdown, parseDirectiveAttrs } from '../parse/blockParser';
|
|
3
|
+
import { buildDocument } from '../pipeline';
|
|
4
|
+
import { collectColumnGaps } from '../pipeline/columnBalancing';
|
|
5
|
+
// Deterministic text measurement stub (no DOM in the node test env).
|
|
6
|
+
class StubCtx {
|
|
7
|
+
font = '';
|
|
8
|
+
measureText(s) {
|
|
9
|
+
return { width: s.length * 7 };
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
globalThis.OffscreenCanvas = class {
|
|
13
|
+
getContext() {
|
|
14
|
+
return new StubCtx();
|
|
15
|
+
}
|
|
16
|
+
};
|
|
3
17
|
describe('parseDirectiveAttrs', () => {
|
|
4
18
|
it('parses double-quoted values', () => {
|
|
5
19
|
expect(parseDirectiveAttrs('format="decimal"')).toEqual({ format: 'decimal' });
|
|
@@ -39,6 +53,13 @@ describe('parseMarkdown directives', () => {
|
|
|
39
53
|
expect(blocks[0].directiveName).toBe('numbering');
|
|
40
54
|
expect(blocks[0].directiveAttrs).toEqual({ format: 'decimal', startAt: '1' });
|
|
41
55
|
});
|
|
56
|
+
it('recognizes :::columnbreak', () => {
|
|
57
|
+
const blocks = parseMarkdown(':::columnbreak\n');
|
|
58
|
+
expect(blocks).toHaveLength(1);
|
|
59
|
+
expect(blocks[0].type).toBe('directive');
|
|
60
|
+
expect(blocks[0].directiveName).toBe('columnbreak');
|
|
61
|
+
expect(blocks[0].directiveAttrs).toEqual({});
|
|
62
|
+
});
|
|
42
63
|
it('unknown directive name falls through to paragraph', () => {
|
|
43
64
|
const blocks = parseMarkdown(':::nosuch\n');
|
|
44
65
|
expect(blocks).toHaveLength(1);
|
|
@@ -50,4 +71,41 @@ describe('parseMarkdown directives', () => {
|
|
|
50
71
|
expect(blocks.map((b) => b.type)).toEqual(['paragraph', 'directive', 'paragraph']);
|
|
51
72
|
});
|
|
52
73
|
});
|
|
74
|
+
describe(':::columnbreak placement', () => {
|
|
75
|
+
const pt = (value) => ({ value, unit: 'pt' });
|
|
76
|
+
const doubleCol = {
|
|
77
|
+
page: { width: pt(360), height: pt(240), margins: { top: pt(18), bottom: pt(18), left: pt(18), right: pt(18) } },
|
|
78
|
+
layout: { layoutType: 'double' },
|
|
79
|
+
};
|
|
80
|
+
const filler = (n) => Array.from({ length: n }, (_, i) => `Paragraph ${i} with enough words to consume vertical space and force the column to overflow.`).join('\n\n');
|
|
81
|
+
it('advances to the next column', () => {
|
|
82
|
+
const doc = buildDocument({ markdown: 'First.\n\n:::columnbreak\n\nSecond.' }, doubleCol);
|
|
83
|
+
const page = doc.pages[0];
|
|
84
|
+
expect(page.columns[0].blocks.map((b) => b.lines[0].text)).toEqual(['First.']);
|
|
85
|
+
expect(page.columns[1].blocks.map((b) => b.lines[0].text)).toEqual(['Second.']);
|
|
86
|
+
expect(page.columns[0].forcedBreak).toBe(true);
|
|
87
|
+
expect(page.columns[1].forcedBreak).toBeUndefined();
|
|
88
|
+
});
|
|
89
|
+
it('is a no-op in an empty column', () => {
|
|
90
|
+
const doc = buildDocument({ markdown: ':::columnbreak\n\nOnly.' }, doubleCol);
|
|
91
|
+
expect(doc.pages).toHaveLength(1);
|
|
92
|
+
const page = doc.pages[0];
|
|
93
|
+
expect(page.columns[0].blocks).toHaveLength(1);
|
|
94
|
+
expect(page.columns[1].blocks).toHaveLength(0);
|
|
95
|
+
expect(page.columns[0].forcedBreak).toBeUndefined();
|
|
96
|
+
});
|
|
97
|
+
it('rolls onto a new page from the last column', () => {
|
|
98
|
+
const doc = buildDocument({ markdown: 'A.\n\n:::columnbreak\n\nB.\n\n:::columnbreak\n\nC.' }, doubleCol);
|
|
99
|
+
expect(doc.pages).toHaveLength(2);
|
|
100
|
+
expect(doc.pages[1].columns[0].blocks[0].lines[0].text).toBe('C.');
|
|
101
|
+
});
|
|
102
|
+
it('a column ended by the directive is not balanced', () => {
|
|
103
|
+
const doc = buildDocument({ markdown: `Short.\n\n:::columnbreak\n\n${filler(20)}` }, doubleCol);
|
|
104
|
+
const page = doc.pages[0];
|
|
105
|
+
expect(page.columns[0].forcedBreak).toBe(true);
|
|
106
|
+
// The short column keeps its gap and is never proposed for stretching.
|
|
107
|
+
const gaps = collectColumnGaps(doc, new Set());
|
|
108
|
+
expect(gaps.some((g) => g.pageIndex === 0 && g.columnIndex === 0)).toBe(false);
|
|
109
|
+
});
|
|
110
|
+
});
|
|
53
111
|
//# sourceMappingURL=directives.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"directives.test.js","sourceRoot":"","sources":["../../src/__tests__/directives.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"directives.test.js","sourceRoot":"","sources":["../../src/__tests__/directives.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,6 +50,7 @@ describe("package exports", () => {
|
|
|
50
50
|
"renderToHtmlIndexed",
|
|
51
51
|
"dimensionToPx",
|
|
52
52
|
"computePageTextExtent",
|
|
53
|
+
"columnRuleSegments",
|
|
53
54
|
"buildFontString",
|
|
54
55
|
"measureBlock",
|
|
55
56
|
"measureRichBlock",
|
|
@@ -94,9 +95,17 @@ describe("package exports", () => {
|
|
|
94
95
|
"stripTableStyleDefaults",
|
|
95
96
|
"resolveCaptionStyleConfig",
|
|
96
97
|
"stripCaptionStyleDefaults",
|
|
98
|
+
"mergeCaptionStyle",
|
|
97
99
|
"DEFAULT_DIAGRAM_STYLE_CONFIG",
|
|
98
100
|
"resolveDiagramStyleConfig",
|
|
99
101
|
"stripDiagramStyleDefaults",
|
|
102
|
+
"DEFAULT_PARAGRAPH_STYLES",
|
|
103
|
+
"resolveParagraphStylesConfig",
|
|
104
|
+
"stripParagraphStylesDefaults",
|
|
105
|
+
"DEFAULT_CALLOUT_STYLES",
|
|
106
|
+
"DEFAULT_CALLOUT_STYLE_STATIC",
|
|
107
|
+
"resolveCalloutStylesConfig",
|
|
108
|
+
"stripCalloutStylesDefaults",
|
|
100
109
|
"DEFAULT_UNORDERED_LISTS_STATIC",
|
|
101
110
|
"resolveUnorderedListsConfig",
|
|
102
111
|
"stripUnorderedListsDefaults",
|
|
@@ -137,21 +146,31 @@ describe("package exports", () => {
|
|
|
137
146
|
"resolveHeaderFooterConfig",
|
|
138
147
|
"stripHeaderFooterDefaults",
|
|
139
148
|
"defaultResourceTypes",
|
|
149
|
+
"DEFAULT_PARTS_CONFIG",
|
|
150
|
+
"resolvePartsConfig",
|
|
151
|
+
"stripPartsDefaults",
|
|
140
152
|
"resolvePlaceholders",
|
|
141
153
|
"computeChapterTitles",
|
|
142
154
|
"collectPlaceholderNames",
|
|
143
155
|
"isKnownPlaceholder",
|
|
144
156
|
"isMetadataPlaceholder",
|
|
157
|
+
"computeChapterAttrs",
|
|
158
|
+
"computePartValues",
|
|
145
159
|
"resolveDesignPlaceholders",
|
|
146
160
|
"allowedPlaceholdersFor",
|
|
161
|
+
"isAllowedPlaceholder",
|
|
147
162
|
"layoutDesignSlot",
|
|
163
|
+
"classifyPages",
|
|
148
164
|
"migrateLegacyHeaderFooterConfig",
|
|
149
165
|
"isLegacyHeaderFooterSlot",
|
|
150
166
|
"resolveDesignSlot",
|
|
151
167
|
"stripDesignSlotDefaults",
|
|
152
168
|
"DEFAULT_BOX_ELEMENT",
|
|
169
|
+
"computeColumnEdges",
|
|
153
170
|
"parseMarkdownWithIssues",
|
|
154
171
|
"MATH_PLACEHOLDER",
|
|
172
|
+
"KNOWN_DIRECTIVES",
|
|
173
|
+
"KNOWN_CONTAINERS",
|
|
155
174
|
"buildPageLabels",
|
|
156
175
|
"collectPageLabelRuns",
|
|
157
176
|
"formatNumeral",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exports.test.js","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"exports.test.js","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirroredMargins.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/mirroredMargins.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { buildDocument } from '../pipeline';
|
|
3
|
+
import { computePageMetrics, contentAreaForPage, mirrorContentArea } from '../pipeline/buildHelpers';
|
|
4
|
+
import { resolveAllConfig } from '../pipeline/config';
|
|
5
|
+
// Deterministic text measurement stub (no DOM in the node test env).
|
|
6
|
+
class StubCtx {
|
|
7
|
+
font = '';
|
|
8
|
+
measureText(s) {
|
|
9
|
+
return { width: s.length * 7 };
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
globalThis.OffscreenCanvas = class {
|
|
13
|
+
getContext() {
|
|
14
|
+
return new StubCtx();
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
const pt = (value) => ({ value, unit: 'pt' });
|
|
18
|
+
/** Small page with asymmetric inner/outer margins so mirroring is visible. */
|
|
19
|
+
const mirrored = {
|
|
20
|
+
page: {
|
|
21
|
+
width: pt(360),
|
|
22
|
+
height: pt(240),
|
|
23
|
+
margins: { top: pt(18), bottom: pt(18), left: pt(40), right: pt(10), mirror: true },
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
const filler = (n) => Array.from({ length: n }, (_, i) => `Paragraph ${i} with enough words to consume vertical space and force the column and page to overflow onto following pages.`).join('\n\n');
|
|
27
|
+
const figure = (id, placement) => ({
|
|
28
|
+
id,
|
|
29
|
+
typeId: 'figure',
|
|
30
|
+
kind: 'bitmap',
|
|
31
|
+
caption: `Figure ${id}.`,
|
|
32
|
+
createdAt: 0,
|
|
33
|
+
updatedAt: 0,
|
|
34
|
+
bitmap: { fileId: `${id}.png`, format: 'png', width: 400, height: 300 },
|
|
35
|
+
...(placement ? { placement } : {}),
|
|
36
|
+
});
|
|
37
|
+
describe('mirrored margins — geometry helpers', () => {
|
|
38
|
+
it('mirrorContentArea flips the area about the page centre line', () => {
|
|
39
|
+
const area = { x: 40, y: 18, width: 310, height: 204 };
|
|
40
|
+
const m = mirrorContentArea(area, 360);
|
|
41
|
+
expect(m).toEqual({ x: 10, y: 18, width: 310, height: 204 });
|
|
42
|
+
// Involution: mirroring twice restores the original.
|
|
43
|
+
expect(mirrorContentArea(m, 360)).toEqual(area);
|
|
44
|
+
});
|
|
45
|
+
it('contentAreaForPage mirrors even pages only when mirror is on', () => {
|
|
46
|
+
const resolved = resolveAllConfig(mirrored);
|
|
47
|
+
const metrics = computePageMetrics(resolved);
|
|
48
|
+
const odd = contentAreaForPage(metrics, resolved, 0);
|
|
49
|
+
const even = contentAreaForPage(metrics, resolved, 1);
|
|
50
|
+
expect(odd).toEqual(metrics.contentArea);
|
|
51
|
+
expect(even.x).not.toBe(odd.x);
|
|
52
|
+
expect(even.width).toBe(odd.width);
|
|
53
|
+
expect(even.y).toBe(odd.y);
|
|
54
|
+
const plain = resolveAllConfig({ ...mirrored, page: { ...mirrored.page, margins: { ...mirrored.page.margins, mirror: false } } });
|
|
55
|
+
const plainMetrics = computePageMetrics(plain);
|
|
56
|
+
expect(contentAreaForPage(plainMetrics, plain, 1)).toEqual(plainMetrics.contentArea);
|
|
57
|
+
});
|
|
58
|
+
it('exposes trim and bleed boxes; bleed equals trim without cut lines', () => {
|
|
59
|
+
const resolved = resolveAllConfig(mirrored);
|
|
60
|
+
const metrics = computePageMetrics(resolved);
|
|
61
|
+
expect(metrics.trimBox).toEqual({ x: 0, y: 0, width: metrics.trimWidthPx, height: metrics.trimHeightPx });
|
|
62
|
+
expect(metrics.bleedBox).toEqual(metrics.trimBox);
|
|
63
|
+
const withBleed = resolveAllConfig({
|
|
64
|
+
...mirrored,
|
|
65
|
+
page: { ...mirrored.page, cutLines: { enabled: true, bleed: pt(9), markOffset: pt(3), markLength: pt(6) } },
|
|
66
|
+
});
|
|
67
|
+
const bm = computePageMetrics(withBleed);
|
|
68
|
+
const dpi = withBleed.page.dpi;
|
|
69
|
+
const bleedPx = 9 * dpi / 72;
|
|
70
|
+
expect(bm.trimBox.x).toBeCloseTo(bm.trimOffset, 6);
|
|
71
|
+
expect(bm.bleedBox.x).toBeCloseTo(bm.trimOffset - bleedPx, 6);
|
|
72
|
+
expect(bm.bleedBox.width).toBeCloseTo(bm.trimWidthPx + 2 * bleedPx, 6);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
describe('mirrored margins — built documents', () => {
|
|
76
|
+
it('even pages mirror the content area and their columns', () => {
|
|
77
|
+
const doc = buildDocument({ markdown: filler(30) }, { ...mirrored, layout: { layoutType: 'double' } });
|
|
78
|
+
expect(doc.pages.length).toBeGreaterThanOrEqual(2);
|
|
79
|
+
const p0 = doc.pages[0];
|
|
80
|
+
const p1 = doc.pages[1];
|
|
81
|
+
const resolved = resolveAllConfig(mirrored);
|
|
82
|
+
const metrics = computePageMetrics(resolved);
|
|
83
|
+
expect(p0.contentArea).toEqual(metrics.contentArea);
|
|
84
|
+
expect(p1.contentArea).toEqual(mirrorContentArea(metrics.contentArea, metrics.pageWidthPx));
|
|
85
|
+
// Columns derive from the page's own area.
|
|
86
|
+
expect(p0.columns[0].bbox.x).toBeCloseTo(p0.contentArea.x, 6);
|
|
87
|
+
expect(p1.columns[0].bbox.x).toBeCloseTo(p1.contentArea.x, 6);
|
|
88
|
+
const p1Right = p1.columns[1].bbox.x + p1.columns[1].bbox.width;
|
|
89
|
+
expect(p1Right).toBeCloseTo(p1.contentArea.x + p1.contentArea.width, 6);
|
|
90
|
+
// Inner margin (40pt) is on the left of odd pages and on the right of even pages.
|
|
91
|
+
expect(p1.contentArea.x).toBeLessThan(p0.contentArea.x);
|
|
92
|
+
});
|
|
93
|
+
it('page-span floats on even pages use the mirrored x', () => {
|
|
94
|
+
const doc = buildDocument({
|
|
95
|
+
markdown: `${filler(6)}\n\nSee :ref{id="f1"}.\n\n${filler(30)}`,
|
|
96
|
+
resources: [figure('f1', { position: 'top', span: 'page' })],
|
|
97
|
+
}, { ...mirrored, layout: { layoutType: 'double' } });
|
|
98
|
+
const placed = doc.pages.flatMap((p) => (p.floats ?? []).map((b) => ({ page: p, block: b })));
|
|
99
|
+
expect(placed).toHaveLength(1);
|
|
100
|
+
const { page, block } = placed[0];
|
|
101
|
+
expect(block.bbox.x).toBeCloseTo(page.contentArea.x, 6);
|
|
102
|
+
expect(block.bbox.width).toBeCloseTo(page.contentArea.width, 6);
|
|
103
|
+
// The float lands on an even page (index 1), i.e. a mirrored one.
|
|
104
|
+
expect(page.index % 2).toBe(1);
|
|
105
|
+
expect(page.contentArea.x).not.toBe(doc.pages[0].contentArea.x);
|
|
106
|
+
});
|
|
107
|
+
it('header container follows page.contentArea on mirrored pages', () => {
|
|
108
|
+
const doc = buildDocument({ markdown: filler(30), metadata: { title: 'Book' } }, {
|
|
109
|
+
...mirrored,
|
|
110
|
+
header: {
|
|
111
|
+
elements: [{
|
|
112
|
+
kind: 'text', id: 'title', content: '{title}', fontSize: pt(8), overflow: 'ellipsis-end',
|
|
113
|
+
placement: { anchor: { to: 'container', edge: 'bottom-left' }, size: { width: 'auto', height: 'auto' } },
|
|
114
|
+
}],
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
const p0 = doc.pages[0];
|
|
118
|
+
const p1 = doc.pages[1];
|
|
119
|
+
expect(p0.header?.bbox.x).toBeCloseTo(p0.contentArea.x, 6);
|
|
120
|
+
expect(p1.header?.bbox.x).toBeCloseTo(p1.contentArea.x, 6);
|
|
121
|
+
expect(p1.header.bbox.x).not.toBe(p0.header.bbox.x);
|
|
122
|
+
// The bottom-left anchored text moves with the container.
|
|
123
|
+
expect(p1.header.blocks[0].bbox.x).toBeCloseTo(p1.contentArea.x, 6);
|
|
124
|
+
});
|
|
125
|
+
it('mirror:false leaves every page with the same content area', () => {
|
|
126
|
+
const cfg = {
|
|
127
|
+
...mirrored,
|
|
128
|
+
page: { ...mirrored.page, margins: { ...mirrored.page.margins, mirror: false } },
|
|
129
|
+
};
|
|
130
|
+
const doc = buildDocument({ markdown: filler(30) }, cfg);
|
|
131
|
+
expect(doc.pages.length).toBeGreaterThanOrEqual(2);
|
|
132
|
+
for (const p of doc.pages)
|
|
133
|
+
expect(p.contentArea).toEqual(doc.pages[0].contentArea);
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
//# sourceMappingURL=mirroredMargins.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mirroredMargins.test.js","sourceRoot":"","sources":["../../src/__tests__/mirroredMargins.test.ts"],"names":[],"mappings":"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"}
|