postext 1.34.0 → 1.35.0
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__/bundle.test.js +33 -1
- package/dist/__tests__/bundle.test.js.map +1 -1
- package/dist/__tests__/codeBlocks.test.js +88 -0
- package/dist/__tests__/codeBlocks.test.js.map +1 -1
- package/dist/__tests__/composed/fixtures/page8.d.ts +20 -0
- package/dist/__tests__/composed/fixtures/page8.d.ts.map +1 -0
- package/dist/__tests__/composed/fixtures/page8.js +162 -0
- package/dist/__tests__/composed/fixtures/page8.js.map +1 -0
- package/dist/__tests__/composed/fixtures/timeline.d.ts +26 -0
- package/dist/__tests__/composed/fixtures/timeline.d.ts.map +1 -0
- package/dist/__tests__/composed/fixtures/timeline.js +153 -0
- package/dist/__tests__/composed/fixtures/timeline.js.map +1 -0
- package/dist/__tests__/composed/groups.test.d.ts +2 -0
- package/dist/__tests__/composed/groups.test.d.ts.map +1 -0
- package/dist/__tests__/composed/groups.test.js +361 -0
- package/dist/__tests__/composed/groups.test.js.map +1 -0
- package/dist/__tests__/composed/layout.test.d.ts +2 -0
- package/dist/__tests__/composed/layout.test.d.ts.map +1 -0
- package/dist/__tests__/composed/layout.test.js +387 -0
- package/dist/__tests__/composed/layout.test.js.map +1 -0
- package/dist/__tests__/composed/outsidePrint.test.d.ts +2 -0
- package/dist/__tests__/composed/outsidePrint.test.d.ts.map +1 -0
- package/dist/__tests__/composed/outsidePrint.test.js +116 -0
- package/dist/__tests__/composed/outsidePrint.test.js.map +1 -0
- package/dist/__tests__/composed/slotChecks.test.js +6 -3
- package/dist/__tests__/composed/slotChecks.test.js.map +1 -1
- package/dist/__tests__/composed/spread.test.d.ts +2 -0
- package/dist/__tests__/composed/spread.test.d.ts.map +1 -0
- package/dist/__tests__/composed/spread.test.js +475 -0
- package/dist/__tests__/composed/spread.test.js.map +1 -0
- package/dist/__tests__/composedPaint.test.d.ts +2 -0
- package/dist/__tests__/composedPaint.test.d.ts.map +1 -0
- package/dist/__tests__/composedPaint.test.js +199 -0
- package/dist/__tests__/composedPaint.test.js.map +1 -0
- package/dist/__tests__/defaults/stripRoundTrip.test.js +3 -2
- package/dist/__tests__/defaults/stripRoundTrip.test.js.map +1 -1
- package/dist/__tests__/exports.test.js +25 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/highlightMarks.test.d.ts +2 -0
- package/dist/__tests__/highlightMarks.test.d.ts.map +1 -0
- package/dist/__tests__/highlightMarks.test.js +169 -0
- package/dist/__tests__/highlightMarks.test.js.map +1 -0
- package/dist/__tests__/tocPartLeader.test.d.ts +2 -0
- package/dist/__tests__/tocPartLeader.test.d.ts.map +1 -0
- package/dist/__tests__/tocPartLeader.test.js +133 -0
- package/dist/__tests__/tocPartLeader.test.js.map +1 -0
- package/dist/bundle/api.d.ts +8 -0
- package/dist/bundle/api.d.ts.map +1 -1
- package/dist/bundle/api.js +6 -3
- package/dist/bundle/api.js.map +1 -1
- package/dist/bundle/codec.d.ts +5 -0
- package/dist/bundle/codec.d.ts.map +1 -1
- package/dist/bundle/codec.js +4 -0
- package/dist/bundle/codec.js.map +1 -1
- package/dist/bundle/index.d.ts +2 -2
- package/dist/bundle/index.d.ts.map +1 -1
- package/dist/bundle/index.js +1 -1
- package/dist/bundle/index.js.map +1 -1
- package/dist/bundle/manifest.d.ts +14 -0
- package/dist/bundle/manifest.d.ts.map +1 -1
- package/dist/bundle/manifest.js +13 -0
- package/dist/bundle/manifest.js.map +1 -1
- package/dist/bundle/types.d.ts +7 -0
- package/dist/bundle/types.d.ts.map +1 -1
- package/dist/canvas-backend/annotations.d.ts +6 -0
- package/dist/canvas-backend/annotations.d.ts.map +1 -1
- package/dist/canvas-backend/annotations.js +39 -0
- package/dist/canvas-backend/annotations.js.map +1 -1
- package/dist/canvas-backend/blockRender.d.ts.map +1 -1
- package/dist/canvas-backend/blockRender.js +6 -1
- package/dist/canvas-backend/blockRender.js.map +1 -1
- package/dist/canvas-backend/composed.d.ts +19 -0
- package/dist/canvas-backend/composed.d.ts.map +1 -0
- package/dist/canvas-backend/composed.js +68 -0
- package/dist/canvas-backend/composed.js.map +1 -0
- package/dist/canvas-backend/index.d.ts.map +1 -1
- package/dist/canvas-backend/index.js +15 -1
- 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 +4 -1
- package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
- package/dist/composed/geometry.d.ts +108 -0
- package/dist/composed/geometry.d.ts.map +1 -0
- package/dist/composed/geometry.js +241 -0
- package/dist/composed/geometry.js.map +1 -0
- package/dist/composed/groups.d.ts +95 -0
- package/dist/composed/groups.d.ts.map +1 -0
- package/dist/composed/groups.js +359 -0
- package/dist/composed/groups.js.map +1 -0
- package/dist/composed/labelText.d.ts +15 -0
- package/dist/composed/labelText.d.ts.map +1 -0
- package/dist/composed/labelText.js +16 -0
- package/dist/composed/labelText.js.map +1 -0
- package/dist/composed/paint.d.ts +64 -0
- package/dist/composed/paint.d.ts.map +1 -0
- package/dist/composed/paint.js +128 -0
- package/dist/composed/paint.js.map +1 -0
- package/dist/composed/reflowLog.d.ts +39 -0
- package/dist/composed/reflowLog.d.ts.map +1 -0
- package/dist/composed/reflowLog.js +123 -0
- package/dist/composed/reflowLog.js.map +1 -0
- package/dist/composed/slotChecks.d.ts +7 -2
- package/dist/composed/slotChecks.d.ts.map +1 -1
- package/dist/composed/slotChecks.js +21 -0
- package/dist/composed/slotChecks.js.map +1 -1
- package/dist/composed/spread.d.ts +106 -0
- package/dist/composed/spread.d.ts.map +1 -0
- package/dist/composed/spread.js +178 -0
- package/dist/composed/spread.js.map +1 -0
- package/dist/composed/types.d.ts +1 -44
- package/dist/composed/types.d.ts.map +1 -1
- package/dist/composed/wrap.d.ts +52 -0
- package/dist/composed/wrap.d.ts.map +1 -0
- package/dist/composed/wrap.js +234 -0
- package/dist/composed/wrap.js.map +1 -0
- package/dist/configWarnings.js +1 -1
- package/dist/configWarnings.js.map +1 -1
- package/dist/defaults/codeStyle.d.ts.map +1 -1
- package/dist/defaults/codeStyle.js +1 -0
- package/dist/defaults/codeStyle.js.map +1 -1
- package/dist/defaults/headerFooter.d.ts.map +1 -1
- package/dist/defaults/headerFooter.js +4 -0
- package/dist/defaults/headerFooter.js.map +1 -1
- package/dist/defaults/index.d.ts +1 -0
- package/dist/defaults/index.d.ts.map +1 -1
- package/dist/defaults/index.js +9 -0
- package/dist/defaults/index.js.map +1 -1
- package/dist/defaults/markStyles.d.ts +23 -0
- package/dist/defaults/markStyles.d.ts.map +1 -0
- package/dist/defaults/markStyles.js +80 -0
- package/dist/defaults/markStyles.js.map +1 -0
- package/dist/defaults/shared.d.ts.map +1 -1
- package/dist/defaults/shared.js +12 -0
- package/dist/defaults/shared.js.map +1 -1
- package/dist/design/bidiText.d.ts +4 -1
- package/dist/design/bidiText.d.ts.map +1 -1
- package/dist/design/bidiText.js +5 -2
- package/dist/design/bidiText.js.map +1 -1
- package/dist/design/layout.d.ts +19 -0
- package/dist/design/layout.d.ts.map +1 -1
- package/dist/design/layout.js +110 -8
- package/dist/design/layout.js.map +1 -1
- package/dist/design/placeholders.d.ts +28 -2
- package/dist/design/placeholders.d.ts.map +1 -1
- package/dist/design/placeholders.js +24 -1
- package/dist/design/placeholders.js.map +1 -1
- package/dist/design/richText.d.ts +2 -0
- package/dist/design/richText.d.ts.map +1 -1
- package/dist/design/richText.js.map +1 -1
- package/dist/highlightMarks.d.ts +33 -0
- package/dist/highlightMarks.d.ts.map +1 -0
- package/dist/highlightMarks.js +209 -0
- package/dist/highlightMarks.js.map +1 -0
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +96 -9
- package/dist/html-backend.js.map +1 -1
- package/dist/htmlAnnotations.d.ts +5 -0
- package/dist/htmlAnnotations.d.ts.map +1 -1
- package/dist/htmlAnnotations.js +16 -0
- package/dist/htmlAnnotations.js.map +1 -1
- package/dist/index.d.ts +13 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -2
- package/dist/index.js.map +1 -1
- package/dist/knuthPlass/richAdapter.d.ts +3 -0
- package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
- package/dist/knuthPlass/richAdapter.js +3 -2
- package/dist/knuthPlass/richAdapter.js.map +1 -1
- package/dist/measure/cache.js +3 -3
- package/dist/measure/cache.js.map +1 -1
- package/dist/measure/chipEdges.d.ts +13 -1
- package/dist/measure/chipEdges.d.ts.map +1 -1
- package/dist/measure/chipEdges.js +59 -1
- package/dist/measure/chipEdges.js.map +1 -1
- package/dist/measure/links.d.ts.map +1 -1
- package/dist/measure/links.js +78 -5
- package/dist/measure/links.js.map +1 -1
- package/dist/measure/rich.d.ts +3 -0
- package/dist/measure/rich.d.ts.map +1 -1
- package/dist/measure/rich.js +19 -4
- package/dist/measure/rich.js.map +1 -1
- package/dist/parse/inlineFormatting.d.ts +14 -0
- package/dist/parse/inlineFormatting.d.ts.map +1 -1
- package/dist/parse/inlineFormatting.js +104 -5
- package/dist/parse/inlineFormatting.js.map +1 -1
- package/dist/parse/links.js +1 -1
- package/dist/parse/links.js.map +1 -1
- package/dist/parse/softBreaks.js +1 -1
- package/dist/parse/softBreaks.js.map +1 -1
- package/dist/parse/sourceMapping.d.ts.map +1 -1
- package/dist/parse/sourceMapping.js +19 -3
- package/dist/parse/sourceMapping.js.map +1 -1
- package/dist/parse/types.d.ts +24 -0
- package/dist/parse/types.d.ts.map +1 -1
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +213 -301
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/buildMeasurement.d.ts +4 -1
- package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
- package/dist/pipeline/buildMeasurement.js +19 -1
- package/dist/pipeline/buildMeasurement.js.map +1 -1
- package/dist/pipeline/calloutLayout.d.ts +36 -1
- package/dist/pipeline/calloutLayout.d.ts.map +1 -1
- package/dist/pipeline/calloutLayout.js +93 -3
- package/dist/pipeline/calloutLayout.js.map +1 -1
- package/dist/pipeline/codeInline.d.ts +10 -1
- package/dist/pipeline/codeInline.d.ts.map +1 -1
- package/dist/pipeline/codeInline.js +96 -15
- package/dist/pipeline/codeInline.js.map +1 -1
- package/dist/pipeline/composedLayout.d.ts +93 -0
- package/dist/pipeline/composedLayout.d.ts.map +1 -0
- package/dist/pipeline/composedLayout.js +520 -0
- package/dist/pipeline/composedLayout.js.map +1 -0
- package/dist/pipeline/config.d.ts.map +1 -1
- package/dist/pipeline/config.js +2 -1
- package/dist/pipeline/config.js.map +1 -1
- package/dist/pipeline/contentWarnings.d.ts.map +1 -1
- package/dist/pipeline/contentWarnings.js +39 -2
- package/dist/pipeline/contentWarnings.js.map +1 -1
- package/dist/pipeline/floatSlots.js +1 -1
- package/dist/pipeline/floatSlots.js.map +1 -1
- package/dist/pipeline/frameLayout.d.ts +120 -0
- package/dist/pipeline/frameLayout.d.ts.map +1 -0
- package/dist/pipeline/frameLayout.js +279 -0
- package/dist/pipeline/frameLayout.js.map +1 -0
- package/dist/pipeline/headerFooter.d.ts.map +1 -1
- package/dist/pipeline/headerFooter.js +96 -3
- package/dist/pipeline/headerFooter.js.map +1 -1
- package/dist/pipeline/pageRoles.d.ts +1 -0
- package/dist/pipeline/pageRoles.d.ts.map +1 -1
- package/dist/pipeline/pageRoles.js +3 -0
- package/dist/pipeline/pageRoles.js.map +1 -1
- package/dist/pipeline/placement.js +1 -1
- package/dist/pipeline/placement.js.map +1 -1
- package/dist/pipeline/resourceLayout.d.ts.map +1 -1
- package/dist/pipeline/resourceLayout.js +5 -3
- package/dist/pipeline/resourceLayout.js.map +1 -1
- package/dist/pipeline/tabs.js +1 -1
- package/dist/pipeline/tabs.js.map +1 -1
- package/dist/types.d.ts +89 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/vdt.d.ts +247 -1
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,387 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { buildDocument } from '../../pipeline/build';
|
|
3
|
+
import { createMeasurementCache } from '../../measure';
|
|
4
|
+
import { formatWarning } from '../../pipeline/contentWarnings';
|
|
5
|
+
import { anchorOn, frameOrder, gridCellRect, placeBox, framePlaceable } from '../../composed/geometry';
|
|
6
|
+
import { normalizeFrame, resolvePageTemplate } from '../../composed/templates';
|
|
7
|
+
import { composedPaintOrder, frameBounds } from '../../composed/paint';
|
|
8
|
+
import { wrapComposedPages, FRAME_ATTR } from '../../composed/wrap';
|
|
9
|
+
import { parseMarkdownWithIssues } from '../../parse';
|
|
10
|
+
import { page8Fixture } from './fixtures/page8';
|
|
11
|
+
// Deterministic text measurement stub (no DOM in the node test env): seven
|
|
12
|
+
// px per character, whatever the face.
|
|
13
|
+
class StubCtx {
|
|
14
|
+
font = '';
|
|
15
|
+
measureText(s) {
|
|
16
|
+
return { width: s.length * 7 };
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
globalThis.OffscreenCanvas = class {
|
|
20
|
+
getContext() {
|
|
21
|
+
return new StubCtx();
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
const mm = (value) => ({ value, unit: 'mm' });
|
|
25
|
+
const DPI = 300;
|
|
26
|
+
const px = (v) => (v / 25.4) * DPI;
|
|
27
|
+
const PAGE = {
|
|
28
|
+
page: { width: mm(200), height: mm(260), margins: { top: mm(20), bottom: mm(20), left: mm(20), right: mm(20) } },
|
|
29
|
+
headings: { balancing: { enabled: false }, levels: [{ level: 1, breakBefore: { enabled: false } }] },
|
|
30
|
+
};
|
|
31
|
+
const build = (md, templates, extra = {}) => buildDocument({ markdown: md }, { ...PAGE, ...extra, pageTemplates: templates }, createMeasurementCache());
|
|
32
|
+
const composedPage = (doc) => doc.pages.find((p) => p.composed);
|
|
33
|
+
const frame = (doc, name) => composedPage(doc).composed.frames.find((f) => f.name === name);
|
|
34
|
+
const blocksOf = (doc, f) => f.blockIds.map((id) => composedPage(doc).floats.find((b) => b.id === id));
|
|
35
|
+
const textOf = (blocks) => blocks.flatMap((b) => b.lines.map((l) => l.text)).join(' ');
|
|
36
|
+
const words = (n, w = 'word') => Array.from({ length: n }, (_, i) => `${w}${i}`).join(' ');
|
|
37
|
+
const AREA = { x: 100, y: 200, width: 1000, height: 1500 };
|
|
38
|
+
const GEO = { areas: { area: AREA, page: { x: 0, y: 0, width: 1200, height: 1800 }, bleed: { x: -30, y: -30, width: 1260, height: 1860 } }, dpi: DPI, emPx: 40 };
|
|
39
|
+
const resolved = (f, template = {}) => resolvePageTemplate({ pageTemplates: [{ id: 't', ...template, frames: [f, ...(template.frames ?? [])] }] }, 't').frames.find((x) => x.name === f.name);
|
|
40
|
+
describe('frame geometry (#855)', () => {
|
|
41
|
+
it('a frame with no placement takes the area’s top-left and width; its height follows its content', () => {
|
|
42
|
+
const f = framePlaceable(normalizeFrame({ name: 'a' }));
|
|
43
|
+
expect(placeBox(f, {}, GEO, () => undefined, () => 123)).toEqual({ x: 100, y: 200, width: 1000, height: 123 });
|
|
44
|
+
// Never past the area's foot.
|
|
45
|
+
expect(placeBox(f, {}, GEO, () => undefined, () => 9999).height).toBe(1500);
|
|
46
|
+
const filled = framePlaceable(normalizeFrame({ name: 'a', height: 'fill' }));
|
|
47
|
+
expect(placeBox(filled, {}, GEO, () => undefined, () => 1).height).toBe(1500);
|
|
48
|
+
});
|
|
49
|
+
it('anchors on the nine-point grid of the area, the trim and the bleed, with offsets', () => {
|
|
50
|
+
const f = framePlaceable(normalizeFrame({ name: 'a', width: mm(50), height: mm(20), placement: { anchor: { to: 'container', edge: 'bottom-right' }, offset: { x: mm(-5), y: mm(-5) } } }));
|
|
51
|
+
const r = placeBox(f, {}, GEO, () => undefined, () => 0);
|
|
52
|
+
expect(r.x + r.width).toBeCloseTo(1100 - px(5), 6);
|
|
53
|
+
expect(r.y + r.height).toBeCloseTo(1700 - px(5), 6);
|
|
54
|
+
const onTrim = framePlaceable(normalizeFrame({ name: 'b', width: 'fill', height: mm(10), placement: { anchor: { to: 'page', edge: 'top' } } }));
|
|
55
|
+
expect(placeBox(onTrim, {}, GEO, () => undefined, () => 0)).toMatchObject({ x: 0, y: 0, width: 1200 });
|
|
56
|
+
const onBleed = framePlaceable(normalizeFrame({ name: 'c', width: 'fill', height: 'fill', placement: { anchor: { to: 'bleed', edge: 'top-left' } } }));
|
|
57
|
+
expect(placeBox(onBleed, {}, GEO, () => undefined, () => 0)).toEqual({ x: -30, y: -30, width: 1260, height: 1860 });
|
|
58
|
+
});
|
|
59
|
+
it('sizes in percent of the area, and min/max (min wins)', () => {
|
|
60
|
+
const f = framePlaceable(normalizeFrame({ name: 'a', width: { percent: 50 }, height: { percent: 10 }, maxWidth: mm(10), minWidth: mm(20), placement: { anchor: { to: 'container', edge: 'top-left' } } }));
|
|
61
|
+
const r = placeBox(f, {}, GEO, () => undefined, () => 0);
|
|
62
|
+
expect(r.width).toBeCloseTo(px(20), 6);
|
|
63
|
+
expect(r.height).toBe(150);
|
|
64
|
+
});
|
|
65
|
+
it('hangs a frame off another with element edges, and a nine-point edge on a frame reads that point of its box', () => {
|
|
66
|
+
const ref = { x: 300, y: 400, width: 200, height: 100 };
|
|
67
|
+
expect(anchorOn('below', ref, true)).toEqual({ x: 300, y: 500, pinX: 'start', pinY: 'start' });
|
|
68
|
+
expect(anchorOn('right-of', ref, true)).toEqual({ x: 500, y: 400, pinX: 'start', pinY: 'start' });
|
|
69
|
+
expect(anchorOn('top-right', ref, true)).toEqual({ x: 500, y: 400, pinX: 'end', pinY: 'start' });
|
|
70
|
+
const f = framePlaceable(normalizeFrame({ name: 'b', width: mm(10), height: mm(10), placement: { anchor: { to: '#a', edge: 'below' }, offset: { y: mm(2) } } }));
|
|
71
|
+
const r = placeBox(f, {}, GEO, (n) => (n === 'a' ? ref : undefined), () => 0);
|
|
72
|
+
expect(r.x).toBe(300);
|
|
73
|
+
expect(r.y).toBeCloseTo(500 + px(2), 6);
|
|
74
|
+
});
|
|
75
|
+
it('places a frame in a grid cell, its own height or the cell’s', () => {
|
|
76
|
+
const template = resolvePageTemplate({ pageTemplates: [{ id: 't', grid: { columns: 2, rows: 3, columnGap: mm(0), rowGap: mm(0) }, frames: [{ name: 'a', grid: { col: 2, row: 2 } }, { name: 'b', grid: { col: 1, row: 1, cols: 2 }, height: 'auto' }] }] }, 't');
|
|
77
|
+
const cell = gridCellRect(template, template.frames[0].grid, AREA, GEO);
|
|
78
|
+
expect(cell).toEqual({ x: 600, y: 700, width: 500, height: 500 });
|
|
79
|
+
expect(placeBox(framePlaceable(template.frames[0]), template, GEO, () => undefined, () => 7)).toEqual(cell);
|
|
80
|
+
expect(placeBox(framePlaceable(template.frames[1]), template, GEO, () => undefined, () => 7)).toEqual({ x: 100, y: 200, width: 1000, height: 7 });
|
|
81
|
+
});
|
|
82
|
+
it('orders frames after what they anchor to, the frame their chain comes from, pushing frames first', () => {
|
|
83
|
+
const template = resolvePageTemplate({ pageTemplates: [{ id: 't', frames: [
|
|
84
|
+
{ name: 'caption', placement: { anchor: { to: '#photo', edge: 'below' } } },
|
|
85
|
+
{ name: 'text', next: 'more' },
|
|
86
|
+
{ name: 'more', placement: { anchor: { to: 'container', edge: 'bottom-left' } } },
|
|
87
|
+
{ name: 'photo', exclude: 'push', placement: { anchor: { to: '#text', edge: 'right-of' } } },
|
|
88
|
+
] }] }, 't');
|
|
89
|
+
const order = frameOrder(template).map((f) => f.name);
|
|
90
|
+
expect(order.indexOf('text')).toBeLessThan(order.indexOf('photo'));
|
|
91
|
+
expect(order.indexOf('photo')).toBeLessThan(order.indexOf('caption'));
|
|
92
|
+
expect(order.indexOf('text')).toBeLessThan(order.indexOf('more'));
|
|
93
|
+
// The pushing frame goes as early as its anchors allow.
|
|
94
|
+
expect(order.indexOf('photo')).toBeLessThan(order.indexOf('more'));
|
|
95
|
+
});
|
|
96
|
+
it('reads `heightSet` from what the template wrote', () => {
|
|
97
|
+
expect(framePlaceable(resolved({ name: 'a', height: 'auto' })).heightSet).toBe(true);
|
|
98
|
+
expect(framePlaceable(resolved({ name: 'a' })).heightSet).toBe(false);
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe('regrouping a composed page into stories (#855)', () => {
|
|
102
|
+
const templates = [{ id: 't', frames: [{ name: 'title', takes: 'h1' }, { name: 'text', flow: true }, { name: 'box', next: 'box2' }, { name: 'box2' }] }];
|
|
103
|
+
const md = '::::page{template="t"}\n# Title\n\nIntro.\n\n:::frame{slot="box2" label="Two"}\nSecond.\n:::\n\n:::frame{slot="box" label="One"}\nFirst.\n:::\n\nOutro.\n::::';
|
|
104
|
+
it('one story per chain, its frames’ pieces in chain order; stories in the order they first appear', () => {
|
|
105
|
+
const { blocks, wrapped } = wrapComposedPages(parseMarkdownWithIssues(md).blocks, { pageTemplates: templates });
|
|
106
|
+
expect(wrapped).toBe(true);
|
|
107
|
+
const heads = blocks.filter((b) => b.type === 'containerStart' && b.containerAttrs?.[FRAME_ATTR]).map((b) => b.containerAttrs[FRAME_ATTR]);
|
|
108
|
+
expect(heads).toEqual(['title', 'text', 'box']);
|
|
109
|
+
const box = blocks.findIndex((b) => b.containerAttrs?.[FRAME_ATTR] === 'box');
|
|
110
|
+
expect(blocks[box].containerAttrs.label).toBe('One');
|
|
111
|
+
const inBox = blocks.slice(box + 1, blocks.findIndex((b, i) => i > box && b.type === 'containerEnd' && b.containerId === blocks[box].containerId)).map((b) => b.text);
|
|
112
|
+
expect(inBox).toEqual(['First.', 'Second.']);
|
|
113
|
+
});
|
|
114
|
+
it('leaves a page of unknown template as it is', () => {
|
|
115
|
+
const parsed = parseMarkdownWithIssues('::::page{template="nope"}\nText.\n::::').blocks;
|
|
116
|
+
expect(wrapComposedPages(parsed, { pageTemplates: templates }).wrapped).toBe(false);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe('composed pages laid out (#855)', () => {
|
|
120
|
+
const TWO = {
|
|
121
|
+
id: 'two',
|
|
122
|
+
frames: [
|
|
123
|
+
{ name: 'title', takes: 'h1', placement: { anchor: { to: 'container', edge: 'top-left' } } },
|
|
124
|
+
{ name: 'text', flow: true, placement: { anchor: { to: '#title', edge: 'below' }, offset: { y: mm(3) } } },
|
|
125
|
+
],
|
|
126
|
+
};
|
|
127
|
+
it('owns a page of role composed; what follows starts on the next page; nothing flows on it', () => {
|
|
128
|
+
const doc = build('Before.\n\n::::page{template="two"}\n# Title\n\nBody text.\n::::\n\nAfter.', [TWO]);
|
|
129
|
+
expect(doc.pages).toHaveLength(3);
|
|
130
|
+
const page = doc.pages[1];
|
|
131
|
+
expect(page.role).toBe('composed');
|
|
132
|
+
expect(page.columns).toHaveLength(1);
|
|
133
|
+
expect(page.columns[0].blocks).toHaveLength(0);
|
|
134
|
+
expect(textOf(doc.pages[2].columns.flatMap((c) => c.blocks))).toBe('After.');
|
|
135
|
+
});
|
|
136
|
+
it('records the frames with stable ids, config paths and the blocks they hold', () => {
|
|
137
|
+
const doc = build('::::page{template="two"}\n# Title\n\nBody text.\n::::', [TWO]);
|
|
138
|
+
const composed = composedPage(doc).composed;
|
|
139
|
+
expect(composed.template).toBe('two');
|
|
140
|
+
expect(composed.configPath).toBe('/pageTemplates/0');
|
|
141
|
+
expect(composed.frames.map((f) => [f.id, f.configPath])).toEqual([['cp0:title', '/pageTemplates/0/frames/0'], ['cp0:text', '/pageTemplates/0/frames/1']]);
|
|
142
|
+
const title = frame(doc, 'title');
|
|
143
|
+
const blocks = blocksOf(doc, title);
|
|
144
|
+
expect(blocks[0].type).toBe('callout');
|
|
145
|
+
expect(blocks[0].id).toBe('cp0:title');
|
|
146
|
+
expect(textOf(blocks)).toBe('Title');
|
|
147
|
+
// Frame blocks are in `doc.blocks` with their sources (caret mapping).
|
|
148
|
+
for (const b of blocks)
|
|
149
|
+
expect(doc.blocks).toContain(b);
|
|
150
|
+
const heading = blocks.find((b) => b.type === 'heading');
|
|
151
|
+
expect(heading.sourceStart).toBeGreaterThan(0);
|
|
152
|
+
expect(title.sourceStart).toBeDefined();
|
|
153
|
+
expect(heading.containerId).toBe(blocks[0].containerId);
|
|
154
|
+
});
|
|
155
|
+
it('an auto height is the content’s height; the text frame hangs below the title', () => {
|
|
156
|
+
const doc = build('::::page{template="two"}\n# Title\n\nBody text.\n::::', [TWO]);
|
|
157
|
+
const title = frame(doc, 'title');
|
|
158
|
+
const text = frame(doc, 'text');
|
|
159
|
+
const [box, heading] = blocksOf(doc, title);
|
|
160
|
+
expect(title.rect.height).toBeCloseTo(box.bbox.height, 6);
|
|
161
|
+
expect(heading.bbox.y + heading.bbox.height).toBeLessThanOrEqual(title.rect.y + title.rect.height + 0.01);
|
|
162
|
+
expect(text.rect.y).toBeCloseTo(title.rect.y + title.rect.height + px(3), 6);
|
|
163
|
+
});
|
|
164
|
+
it('places content of a taller fixed frame as verticalAlign says', () => {
|
|
165
|
+
const at = (verticalAlign) => {
|
|
166
|
+
const doc = build('::::page{template="v"}\nOne line.\n::::', [{ id: 'v', frames: [{ name: 'f', flow: true, height: mm(50), verticalAlign, placement: { anchor: { to: 'container', edge: 'top-left' } } }] }]);
|
|
167
|
+
const f = frame(doc, 'f');
|
|
168
|
+
const para = blocksOf(doc, f).find((b) => b.type === 'paragraph');
|
|
169
|
+
return { top: para.bbox.y - f.rect.y, bottom: f.rect.y + f.rect.height - (para.bbox.y + para.bbox.height), box: blocksOf(doc, f)[0] };
|
|
170
|
+
};
|
|
171
|
+
const top = at('top');
|
|
172
|
+
const middle = at('middle');
|
|
173
|
+
const bottom = at('bottom');
|
|
174
|
+
expect(top.top).toBeCloseTo(0, 3);
|
|
175
|
+
expect(middle.top).toBeCloseTo(middle.bottom, 3);
|
|
176
|
+
expect(bottom.bottom).toBeCloseTo(0, 3);
|
|
177
|
+
// The box is drawn as tall as the frame.
|
|
178
|
+
expect(top.box.bbox.height).toBeCloseTo(px(50), 3);
|
|
179
|
+
});
|
|
180
|
+
it('chains a story from one frame to the next (`next`): nothing lost, nothing doubled', () => {
|
|
181
|
+
const story = words(120);
|
|
182
|
+
const tpl = { id: 'chain', frames: [
|
|
183
|
+
{ name: 'a', flow: true, next: 'b', width: mm(70), height: mm(30), placement: { anchor: { to: 'container', edge: 'top-left' } } },
|
|
184
|
+
{ name: 'b', width: mm(50), height: mm(150), placement: { anchor: { to: 'container', edge: 'top-right' } } },
|
|
185
|
+
] };
|
|
186
|
+
const doc = build(`::::page{template="chain"}\n${story}\n::::`, [tpl]);
|
|
187
|
+
const a = frame(doc, 'a');
|
|
188
|
+
const b = frame(doc, 'b');
|
|
189
|
+
expect(a.continuesTo).toBe(b.id);
|
|
190
|
+
expect(b.continuedFrom).toBe(a.id);
|
|
191
|
+
expect(a.overflowPx).toBe(0);
|
|
192
|
+
const aText = textOf(blocksOf(doc, a));
|
|
193
|
+
const bText = textOf(blocksOf(doc, b));
|
|
194
|
+
expect(aText.length).toBeGreaterThan(0);
|
|
195
|
+
expect(bText.length).toBeGreaterThan(0);
|
|
196
|
+
expect(`${aText} ${bText}`.replace(/-\s/g, '').split(/\s+/).join(' ')).toBe(story);
|
|
197
|
+
// Each piece is set at its own frame's measure.
|
|
198
|
+
const aLines = blocksOf(doc, a).find((x) => x.type === 'paragraph').lines;
|
|
199
|
+
const bLines = blocksOf(doc, b).find((x) => x.type === 'paragraph').lines;
|
|
200
|
+
expect(Math.max(...aLines.map((l) => l.bbox.width))).toBeGreaterThan(Math.max(...bLines.map((l) => l.bbox.width)));
|
|
201
|
+
// The second piece's box joins the first (tagging) and carries no tab.
|
|
202
|
+
expect(blocksOf(doc, b)[0].id).toBe('cp0:a-cont-1');
|
|
203
|
+
});
|
|
204
|
+
it('reads overflow.continueIn: "#frame" as next', () => {
|
|
205
|
+
const tpl = { id: 'ci', frames: [
|
|
206
|
+
{ name: 'a', flow: true, overflow: { continueIn: '#b' }, width: mm(70), height: mm(20), placement: { anchor: { to: 'container', edge: 'top-left' } } },
|
|
207
|
+
{ name: 'b', width: mm(70), height: mm(150), placement: { anchor: { to: 'container', edge: 'top-right' } } },
|
|
208
|
+
] };
|
|
209
|
+
const doc = build(`::::page{template="ci"}\n${words(100)}\n::::`, [tpl]);
|
|
210
|
+
expect(frame(doc, 'a').continuesTo).toBe('cp0:b');
|
|
211
|
+
expect(frame(doc, 'a').overflowPx).toBe(0);
|
|
212
|
+
expect(textOf(blocksOf(doc, frame(doc, 'b'))).length).toBeGreaterThan(0);
|
|
213
|
+
});
|
|
214
|
+
it('clips what no frame can hold and says so (frameOverflow), keeping it in the document', () => {
|
|
215
|
+
const story = words(200);
|
|
216
|
+
const tpl = { id: 'small', frames: [{ name: 'a', flow: true, width: mm(60), height: mm(20), placement: { anchor: { to: 'container', edge: 'top-left' } } }] };
|
|
217
|
+
const doc = build(`::::page{template="small"}\n${story}\n::::`, [tpl]);
|
|
218
|
+
const a = frame(doc, 'a');
|
|
219
|
+
expect(a.overflowPx).toBeGreaterThan(0);
|
|
220
|
+
expect(textOf(blocksOf(doc, a)).replace(/-\s/g, '').split(/\s+/).join(' ')).toBe(story);
|
|
221
|
+
const w = doc.contentWarnings.find((x) => x.kind === 'frameOverflow');
|
|
222
|
+
expect(w).toMatchObject({ kind: 'frameOverflow', template: 'small', frame: 'a', fenceIndex: 0, configPath: '/pageTemplates/0/frames/0', pageIndex: 0 });
|
|
223
|
+
expect(w.kind === 'frameOverflow' && w.overflowMm).toBeCloseTo((a.overflowPx / DPI) * 25.4, 0);
|
|
224
|
+
expect(composedPage(doc).composed.log).toEqual([{ frame: 'a', kind: 'overflow', toMm: w.overflowMm }]);
|
|
225
|
+
expect(formatWarning(w)).toContain('Frame "a" of template "small"');
|
|
226
|
+
});
|
|
227
|
+
it('wraps a frame’s text round a frame that pushes it (exclude: push)', () => {
|
|
228
|
+
const story = words(150);
|
|
229
|
+
const tpl = (exclude) => ({ id: 'push', frames: [
|
|
230
|
+
{ name: 'text', flow: true, width: mm(120), placement: { anchor: { to: 'container', edge: 'top-left' } } },
|
|
231
|
+
{ name: 'photo', exclude, layer: 2, width: mm(40), height: mm(30), placement: { anchor: { to: '#text', edge: 'top-right' } } },
|
|
232
|
+
] });
|
|
233
|
+
const lines = (doc) => blocksOf(doc, frame(doc, 'text')).filter((b) => b.type === 'paragraph').flatMap((b) => b.lines);
|
|
234
|
+
const pushed = build(`::::page{template="push"}\n${story}\n::::`, [tpl('push')]);
|
|
235
|
+
const plain = build(`::::page{template="push"}\n${story}\n::::`, [tpl('none')]);
|
|
236
|
+
const photo = frame(pushed, 'photo');
|
|
237
|
+
const beside = lines(pushed).filter((l) => l.bbox.y < photo.rect.y + photo.rect.height);
|
|
238
|
+
expect(beside.length).toBeGreaterThan(0);
|
|
239
|
+
for (const l of beside)
|
|
240
|
+
expect(l.bbox.x + l.bbox.width).toBeLessThanOrEqual(photo.rect.x + 0.5);
|
|
241
|
+
expect(lines(pushed).length).toBeGreaterThan(lines(plain).length);
|
|
242
|
+
expect(photo.push).toBe(true);
|
|
243
|
+
});
|
|
244
|
+
it('a styled frame draws its callout style, with the tab from the frame fence', () => {
|
|
245
|
+
const tpl = { id: 's', frames: [{ name: 'box', style: 'caja', placement: { anchor: { to: 'container', edge: 'top-left' } }, width: mm(100) }] };
|
|
246
|
+
const doc = build('::::page{template="s"}\n:::frame{slot="box" label="Money"}\nInside the box.\n:::\n::::', [tpl], {
|
|
247
|
+
calloutStyles: [{ id: 'caja', backgroundEnabled: true, background: { hex: '#d8ecf9' }, label: { position: 'top-left', offset: mm(5), height: mm(5) } }],
|
|
248
|
+
});
|
|
249
|
+
const box = blocksOf(doc, frame(doc, 'box'))[0];
|
|
250
|
+
expect(box.callout.styleId).toBe('caja');
|
|
251
|
+
const labelText = box.designOverlay.blocks.flatMap((b) => (b.kind === 'text' ? b.lines.map((l) => l.text) : []));
|
|
252
|
+
expect(labelText).toContain('Money');
|
|
253
|
+
expect(box.bbox.width).toBeCloseTo(px(100), 3);
|
|
254
|
+
expect(frame(doc, 'box').styleId).toBe('caja');
|
|
255
|
+
});
|
|
256
|
+
it('padding of the frame overrides its style’s, side by side', () => {
|
|
257
|
+
const tpl = (padding) => ({ id: 'p', frames: [{ name: 'box', style: 'caja', ...(padding ? { padding } : {}), width: mm(150), placement: { anchor: { to: 'container', edge: 'top-left' } } }] });
|
|
258
|
+
const md = '::::page{template="p"}\n:::frame{slot="box"}\nText.\n:::\n::::';
|
|
259
|
+
const cfg = { calloutStyles: [{ id: 'caja', padding: { top: mm(2), right: mm(2), bottom: mm(2), left: mm(2) } }] };
|
|
260
|
+
const plain = build(md, [tpl()], cfg);
|
|
261
|
+
const padded = build(md, [tpl({ left: mm(60) })], cfg);
|
|
262
|
+
const xOf = (doc) => blocksOf(doc, frame(doc, 'box')).find((b) => b.type === 'paragraph').bbox.x;
|
|
263
|
+
expect(xOf(padded) - xOf(plain)).toBeCloseTo(px(58), 3);
|
|
264
|
+
});
|
|
265
|
+
it('sets a frame in columns with the :::columns machinery', () => {
|
|
266
|
+
const doc = build(`::::page{template="c"}\n${words(40, 'a')}\n\n${words(40, 'b')}\n::::`, [{ id: 'c', frames: [{ name: 'f', flow: true, columns: 2, columnGap: mm(5), width: mm(150), placement: { anchor: { to: 'container', edge: 'top-left' } } }] }]);
|
|
267
|
+
const xs = new Set(blocksOf(doc, frame(doc, 'f')).filter((b) => b.type === 'paragraph').map((b) => Math.round(b.bbox.x)));
|
|
268
|
+
expect(xs.size).toBe(2);
|
|
269
|
+
});
|
|
270
|
+
it('records layer and turn; paints frames in layer order around the decoration', () => {
|
|
271
|
+
const tpl = { id: 'l', decoration: { elements: [{ kind: 'box', id: 'bg', placement: { anchor: { to: 'container', edge: 'top-left' }, size: { width: mm(10), height: mm(10) } }, style: { backgroundColor: { hex: '#ff0000' } } }] }, frames: [
|
|
272
|
+
{ name: 'over', layer: 3, rotate: 12, placement: { anchor: { to: 'container', edge: 'top-left' } } },
|
|
273
|
+
{ name: 'under', layer: -1, placement: { anchor: { to: 'container', edge: 'bottom-left' } } },
|
|
274
|
+
{ name: 'mid', flow: true, placement: { anchor: { to: 'container', edge: 'center' } }, width: mm(50) },
|
|
275
|
+
] };
|
|
276
|
+
const doc = build('::::page{template="l"}\n:::frame{slot="over"}\nOver.\n:::\n:::frame{slot="under"}\nUnder.\n:::\nMid.\n::::', [tpl]);
|
|
277
|
+
const page = composedPage(doc);
|
|
278
|
+
expect(frame(doc, 'over')).toMatchObject({ layer: 3, rotate: 12 });
|
|
279
|
+
const order = composedPaintOrder(page).map((i) => (i.kind === 'frame' ? i.frame.name : 'decoration'));
|
|
280
|
+
expect(order).toEqual(['under', 'decoration', 'mid', 'over']);
|
|
281
|
+
expect(page.composed.decoration).toBeDefined();
|
|
282
|
+
const b = frameBounds(frame(doc, 'over'));
|
|
283
|
+
expect(b.height).toBeGreaterThan(frame(doc, 'over').rect.height);
|
|
284
|
+
});
|
|
285
|
+
it('lays the decoration with the frames’ boxes and the page fence’s attributes', () => {
|
|
286
|
+
const tpl = { id: 'd', decoration: { elements: [
|
|
287
|
+
{ kind: 'text', id: 'tema', content: '{attr.tema}', placement: { anchor: { to: '#box', edge: 'below' } } },
|
|
288
|
+
{ kind: 'image', id: 'bg', resourceId: '{attr.fondo}', decorative: true, placement: { anchor: { to: 'bleed', edge: 'top-left' }, size: { width: 'fill', height: 'fill' } } },
|
|
289
|
+
] }, frames: [{ name: 'box', flow: true, width: mm(80), placement: { anchor: { to: 'container', edge: 'top-left' }, offset: { y: mm(10) } } }] };
|
|
290
|
+
const md = '---\ntitle: T\n---\n::::page{template="d" tema="Savings" fondo="green"}\nText.\n::::';
|
|
291
|
+
const doc = buildDocument({ markdown: md, resources: [{ id: 'green', typeId: 'figure', kind: 'bitmap', caption: '', createdAt: 0, updatedAt: 0, bitmap: { fileId: 'g', format: 'png', width: 10, height: 10 } }] }, { ...PAGE, pageTemplates: [tpl] }, createMeasurementCache());
|
|
292
|
+
const page = composedPage(doc);
|
|
293
|
+
const deco = page.composed.decoration.blocks;
|
|
294
|
+
const text = deco.find((b) => b.kind === 'text');
|
|
295
|
+
const box = frame(doc, 'box');
|
|
296
|
+
expect(text.kind === 'text' && text.lines[0].text).toBe('Savings');
|
|
297
|
+
expect(text.bbox.y).toBeCloseTo(box.rect.y + box.rect.height, 3);
|
|
298
|
+
expect(text.bbox.x).toBeCloseTo(box.rect.x, 3);
|
|
299
|
+
// The text maps back to the attribute's value in the chapter file.
|
|
300
|
+
expect(md.slice(text.kind === 'text' ? text.sourceStart : 0, text.kind === 'text' ? text.sourceEnd : 0)).toBe('Savings');
|
|
301
|
+
expect(page.composed.attrSources.tema && md.slice(page.composed.attrSources.tema.sourceStart, page.composed.attrSources.tema.sourceEnd)).toBe('Savings');
|
|
302
|
+
expect(deco.some((b) => b.kind === 'image' && b.fileId === 'g')).toBe(true);
|
|
303
|
+
});
|
|
304
|
+
it('hides, replaces or inherits the running heads per template', () => {
|
|
305
|
+
const slot = (content) => ({ elements: [{ kind: 'text', id: 'x', content, placement: { anchor: { to: 'container', edge: 'top-left' } } }] });
|
|
306
|
+
const texts = (s) => s?.blocks.flatMap((b) => (b.kind === 'text' ? b.lines.map((l) => l.text) : [])) ?? [];
|
|
307
|
+
const run = (header, footer) => {
|
|
308
|
+
const doc = build('Before.\n\n::::page{template="h"}\nText.\n::::', [{ id: 'h', ...(header !== undefined ? { header } : {}), ...(footer !== undefined ? { footer } : {}), frames: [{ name: 'f', flow: true }] }], { header: slot('HEAD {attr.tema}'), footer: slot('FOOT {pageNumber}') });
|
|
309
|
+
return composedPage(doc);
|
|
310
|
+
};
|
|
311
|
+
expect(run(false).header).toBeUndefined();
|
|
312
|
+
expect(texts(run(false).footer)).toEqual(['FOOT 2']);
|
|
313
|
+
expect(texts(run(slot('OWN'), false).header)).toEqual(['OWN']);
|
|
314
|
+
expect(run(slot('OWN'), false).footer).toBeUndefined();
|
|
315
|
+
expect(texts(run(undefined).header)).toEqual(['HEAD ']);
|
|
316
|
+
});
|
|
317
|
+
it('reads `{attr.x}` of the page fence in the running heads of its page', () => {
|
|
318
|
+
const doc = build('::::page{template="h" tema="Savings"}\nText.\n::::', [{ id: 'h', frames: [{ name: 'f', flow: true }] }], { header: { elements: [{ kind: 'text', id: 'x', content: '{attr.tema}', placement: { anchor: { to: 'container', edge: 'top-left' } } }] } });
|
|
319
|
+
const header = composedPage(doc).header;
|
|
320
|
+
expect(header.blocks.flatMap((b) => (b.kind === 'text' ? b.lines.map((l) => l.text) : []))).toEqual(['Savings']);
|
|
321
|
+
});
|
|
322
|
+
it('sets content no frame takes in the flow after the page, never losing it', () => {
|
|
323
|
+
const tpl = { id: 'n', frames: [{ name: 'box' }] };
|
|
324
|
+
const doc = build('::::page{template="n"}\n:::frame{slot="box"}\nIn the box.\n:::\n\nLoose text.\n::::\n\nAfter.', [tpl]);
|
|
325
|
+
expect(textOf(blocksOf(doc, frame(doc, 'box')))).toBe('In the box.');
|
|
326
|
+
const later = doc.pages.slice(1).flatMap((p) => p.columns.flatMap((c) => c.blocks));
|
|
327
|
+
expect(textOf(later)).toBe('Loose text. After.');
|
|
328
|
+
expect(later[0].pageIndex).toBe(1);
|
|
329
|
+
});
|
|
330
|
+
it('a picture sent to a frame is set in it, not floated', () => {
|
|
331
|
+
const resources = [{ id: 'pic', typeId: 'figure', kind: 'bitmap', caption: 'A picture', createdAt: 0, updatedAt: 0, bitmap: { fileId: 'p', format: 'png', width: 400, height: 300 } }];
|
|
332
|
+
const doc = buildDocument({ markdown: '::::page{template="r"}\nText.\n\n::resource{id="pic" slot="photo"}\n::::', resources }, { ...PAGE, pageTemplates: [{ id: 'r', frames: [{ name: 'text', flow: true, width: mm(80) }, { name: 'photo', width: mm(50), placement: { anchor: { to: 'container', edge: 'top-right' } } }] }] }, createMeasurementCache());
|
|
333
|
+
const photo = frame(doc, 'photo');
|
|
334
|
+
const pic = blocksOf(doc, photo).find((b) => b.type === 'resource');
|
|
335
|
+
expect(pic.resourceBlock).toBeDefined();
|
|
336
|
+
expect(pic.bbox.x).toBeGreaterThanOrEqual(photo.rect.x - 0.01);
|
|
337
|
+
expect(doc.pages.every((p) => p === composedPage(doc) || (p.floats ?? []).length === 0)).toBe(true);
|
|
338
|
+
});
|
|
339
|
+
it('a page of unknown template is set in the flow on pages of its own', () => {
|
|
340
|
+
const doc = build('A.\n\n::::page{template="nope"}\nInside.\n::::\n\nB.', [TWO]);
|
|
341
|
+
expect(doc.pages.some((p) => p.composed)).toBe(false);
|
|
342
|
+
expect(doc.pages.map((p) => textOf(p.columns.flatMap((c) => c.blocks)))).toEqual(['A.', 'Inside.', 'B.']);
|
|
343
|
+
});
|
|
344
|
+
it('the parity of the page picks the template’s variant', () => {
|
|
345
|
+
const tpl = { id: 'var', frames: [{ name: 'f', flow: true, width: mm(100) }], variants: { verso: { frames: [{ name: 'f', width: mm(60) }] } } };
|
|
346
|
+
const doc = build('::::page{template="var"}\nOne.\n::::\n\n::::page{template="var"}\nTwo.\n::::', [tpl]);
|
|
347
|
+
const pages = doc.pages.filter((p) => p.composed);
|
|
348
|
+
expect(pages.map((p) => p.composed.variant)).toEqual([undefined, 'verso']);
|
|
349
|
+
expect(pages[0].composed.frames[0].rect.width).toBeCloseTo(px(100), 3);
|
|
350
|
+
expect(pages[1].composed.frames[0].rect.width).toBeCloseTo(px(60), 3);
|
|
351
|
+
expect(pages[1].composed.frames[0].id).toBe('cp1:f');
|
|
352
|
+
});
|
|
353
|
+
});
|
|
354
|
+
describe('the page-8 stand-in (#855)', () => {
|
|
355
|
+
for (const locale of ['es', 'en']) {
|
|
356
|
+
it(`sets every word of the ${locale} page in its frames, on one page, none in the config`, () => {
|
|
357
|
+
const { markdown, config, resources } = page8Fixture(locale);
|
|
358
|
+
const doc = buildDocument({ markdown, resources }, config, createMeasurementCache());
|
|
359
|
+
expect(doc.pages).toHaveLength(1);
|
|
360
|
+
const page = doc.pages[0];
|
|
361
|
+
expect(page.role).toBe('composed');
|
|
362
|
+
const names = page.composed.frames.map((f) => f.name);
|
|
363
|
+
expect(names).toEqual(['titulo', 'texto', 'dinero', 'dinero-fotos', 'gasto', 'gasto-fotos', 'ahorro', 'ahorro-fotos']);
|
|
364
|
+
for (const name of ['dinero', 'gasto', 'ahorro']) {
|
|
365
|
+
const f = page.composed.frames.find((x) => x.name === name);
|
|
366
|
+
expect(f.overflowPx).toBe(0);
|
|
367
|
+
expect(blocksOf(doc, f)[0].designOverlay.blocks.some((b) => b.kind === 'text')).toBe(true);
|
|
368
|
+
}
|
|
369
|
+
for (const name of ['dinero-fotos', 'gasto-fotos', 'ahorro-fotos']) {
|
|
370
|
+
const f = page.composed.frames.find((x) => x.name === name);
|
|
371
|
+
expect(blocksOf(doc, f).some((b) => b.type === 'resource')).toBe(true);
|
|
372
|
+
}
|
|
373
|
+
// The boxes stack down the page, each below the one before.
|
|
374
|
+
const ys = ['titulo', 'texto', 'dinero', 'gasto', 'ahorro'].map((n) => page.composed.frames.find((f) => f.name === n).rect.y);
|
|
375
|
+
expect([...ys].sort((a, b) => a - b)).toEqual(ys);
|
|
376
|
+
// The configuration holds no sentence of the page.
|
|
377
|
+
const text = JSON.stringify(config);
|
|
378
|
+
for (const b of page.floats)
|
|
379
|
+
for (const l of b.lines)
|
|
380
|
+
if (l.text.length > 20)
|
|
381
|
+
expect(text).not.toContain(l.text);
|
|
382
|
+
expect((doc.contentWarnings ?? []).filter((w) => w.kind === 'frameOverflow')).toEqual([]);
|
|
383
|
+
expect(page.composed.decoration.blocks.some((b) => b.kind === 'image')).toBe(true);
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
//# sourceMappingURL=layout.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.test.js","sourceRoot":"","sources":["../../../src/__tests__/composed/layout.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"outsidePrint.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/composed/outsidePrint.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { buildDocument } from '../../pipeline/build';
|
|
3
|
+
import { createMeasurementCache } from '../../measure';
|
|
4
|
+
import { composedPaintOrder, composedReadingOrder } from '../../composed/paint';
|
|
5
|
+
import { altWithLabels } from '../../composed/labelText';
|
|
6
|
+
import { renderToHtmlIndexed } from '../../html-backend';
|
|
7
|
+
// #862: what the outputs that do not draw a composed page as print read
|
|
8
|
+
// from the VDT — a `:::figure`'s labels on its resource block, wherever the
|
|
9
|
+
// figure is set, and the frames in reading order.
|
|
10
|
+
class StubCtx {
|
|
11
|
+
font = '';
|
|
12
|
+
measureText(s) {
|
|
13
|
+
return { width: s.length * 7 };
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
globalThis.OffscreenCanvas = class {
|
|
17
|
+
getContext() {
|
|
18
|
+
return new StubCtx();
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
const mm = (value) => ({ value, unit: 'mm' });
|
|
22
|
+
const PAGE = {
|
|
23
|
+
page: { width: mm(200), height: mm(260), margins: { top: mm(20), bottom: mm(20), left: mm(20), right: mm(20) } },
|
|
24
|
+
};
|
|
25
|
+
const MAP = {
|
|
26
|
+
id: 'mapa', typeId: 'figure', kind: 'bitmap', caption: 'Europe.', altText: 'A map of Europe', createdAt: 0, updatedAt: 0,
|
|
27
|
+
bitmap: { fileId: 'mapa.png', format: 'png', width: 400, height: 300 },
|
|
28
|
+
};
|
|
29
|
+
const FIGURE = [':::figure{resource="mapa"}', '::label[OCÉANO **ATLÁNTICO**]{at="atlantico" style="mar"}', '::label[Madrid]{at="40% 60%"}', ':::'].join('\n');
|
|
30
|
+
const build = (markdown, config = {}, resources = [MAP]) => buildDocument({ markdown, resources }, { ...PAGE, ...config }, createMeasurementCache());
|
|
31
|
+
const allBlocks = (doc) => [...doc.blocks, ...doc.pages.flatMap((p) => p.floats ?? [])];
|
|
32
|
+
const figureBlock = (doc) => allBlocks(doc).find((b) => b.resourceBlock?.resource.id === 'mapa');
|
|
33
|
+
describe('figure labels in the VDT (#862)', () => {
|
|
34
|
+
it('carries a figure’s labels on its resource block, in the order written, with their source', () => {
|
|
35
|
+
const md = `Some text.\n\n${FIGURE}\n`;
|
|
36
|
+
const labels = figureBlock(build(md)).resourceBlock.labels;
|
|
37
|
+
expect(labels.map((l) => l.text)).toEqual(['OCÉANO ATLÁNTICO', 'Madrid']);
|
|
38
|
+
expect(labels[0].at).toEqual({ anchor: 'atlantico' });
|
|
39
|
+
expect(labels[0].style).toBe('mar');
|
|
40
|
+
expect(labels[1].at).toEqual({ x: 0.4, y: 0.6 });
|
|
41
|
+
expect(md.slice(labels[1].sourceStart, labels[1].sourceEnd)).toBe('Madrid');
|
|
42
|
+
});
|
|
43
|
+
it('carries them on a figure that floats, and on one set in a frame', () => {
|
|
44
|
+
const floated = build(`Some text.\n\n${FIGURE}\n`, {}, [{ ...MAP, placement: { position: 'top' } }]);
|
|
45
|
+
const fb = figureBlock(floated);
|
|
46
|
+
expect(fb.id.startsWith('float-')).toBe(true);
|
|
47
|
+
expect(fb.resourceBlock.labels.map((l) => l.text)).toEqual(['OCÉANO ATLÁNTICO', 'Madrid']);
|
|
48
|
+
const framed = build(`::::page{template="t"}\n${FIGURE.replace('resource="mapa"', 'resource="mapa" slot="map"')}\n::::\n`, { pageTemplates: [{ id: 't', frames: [{ name: 'map' }] }] });
|
|
49
|
+
expect(framed.pages[0].composed).toBeDefined();
|
|
50
|
+
expect(figureBlock(framed).resourceBlock.labels.map((l) => l.text)).toEqual(['OCÉANO ATLÁNTICO', 'Madrid']);
|
|
51
|
+
});
|
|
52
|
+
it('leaves a resource set with ::resource without labels, after a labelled layout of it in the same cache', () => {
|
|
53
|
+
const cache = createMeasurementCache();
|
|
54
|
+
const labelled = buildDocument({ markdown: `${FIGURE}\n`, resources: [MAP] }, PAGE, cache);
|
|
55
|
+
expect(figureBlock(labelled).resourceBlock.labels).toHaveLength(2);
|
|
56
|
+
const plain = buildDocument({ markdown: '::resource{id="mapa"}\n', resources: [MAP] }, PAGE, cache);
|
|
57
|
+
expect(figureBlock(plain).resourceBlock.labels).toBeUndefined();
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe('the reading order of a composed page (#862)', () => {
|
|
61
|
+
it('puts the decoration first, then the frames by the Markdown order of their content, whatever their layers', () => {
|
|
62
|
+
const config = {
|
|
63
|
+
pageTemplates: [{
|
|
64
|
+
id: 't',
|
|
65
|
+
frames: [
|
|
66
|
+
{ name: 'late', layer: 3 },
|
|
67
|
+
{ name: 'early', layer: -1, placement: { anchor: { to: 'container', edge: 'bottom-left' } } },
|
|
68
|
+
{ name: 'middle', layer: 1, placement: { anchor: { to: 'container', edge: 'left' } } },
|
|
69
|
+
],
|
|
70
|
+
}],
|
|
71
|
+
};
|
|
72
|
+
const md = ['::::page{template="t"}', ':::frame{slot="early"}', 'Early.', ':::', '', ':::frame{slot="middle"}', 'Middle.', ':::', '', ':::frame{slot="late"}', 'Late.', ':::', '::::'].join('\n');
|
|
73
|
+
const page = build(md, config).pages[0];
|
|
74
|
+
const paint = composedPaintOrder(page);
|
|
75
|
+
const name = (i) => (i.kind === 'frame' ? i.frame.name : 'decoration');
|
|
76
|
+
expect(paint.map(name)).toEqual(['early', 'decoration', 'middle', 'late']);
|
|
77
|
+
expect(composedReadingOrder(paint).map(name)).toEqual(['decoration', 'early', 'middle', 'late']);
|
|
78
|
+
});
|
|
79
|
+
it('reads a chained frame after the frame its story starts in', () => {
|
|
80
|
+
const config = {
|
|
81
|
+
pageTemplates: [{
|
|
82
|
+
id: 't',
|
|
83
|
+
frames: [
|
|
84
|
+
{ name: 'b', layer: -2, height: mm(30), placement: { anchor: { to: 'container', edge: 'bottom-left' } } },
|
|
85
|
+
{ name: 'a', next: 'b', height: mm(12) },
|
|
86
|
+
],
|
|
87
|
+
}],
|
|
88
|
+
};
|
|
89
|
+
const md = ['::::page{template="t"}', ':::frame{slot="a"}', Array.from({ length: 90 }, (_, i) => `w${i}`).join(' '), ':::', '::::'].join('\n');
|
|
90
|
+
const page = build(md, config).pages[0];
|
|
91
|
+
const paint = composedPaintOrder(page);
|
|
92
|
+
const frames = paint.filter((i) => i.kind === 'frame');
|
|
93
|
+
expect(frames.find((i) => i.frame.name === 'b').frame.continuedFrom).toBeDefined();
|
|
94
|
+
const name = (i) => (i.kind === 'frame' ? i.frame.name : 'decoration');
|
|
95
|
+
expect(paint.map(name).filter((n) => n !== 'decoration')).toEqual(['b', 'a']);
|
|
96
|
+
expect(composedReadingOrder(paint).map(name).filter((n) => n !== 'decoration')).toEqual(['a', 'b']);
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
describe('labels as a figure\'s text (#862)', () => {
|
|
100
|
+
const labels = (...texts) => texts.map((text) => ({ text }));
|
|
101
|
+
it('follows the alternative text, in the order written', () => {
|
|
102
|
+
expect(altWithLabels('A map', labels('Madrid', ' Mar Negro '))).toBe('A map (Madrid, Mar Negro)');
|
|
103
|
+
expect(altWithLabels('', labels('Madrid'))).toBe('Madrid');
|
|
104
|
+
expect(altWithLabels('A map', undefined)).toBe('A map');
|
|
105
|
+
});
|
|
106
|
+
it('takes the brackets and the comma of Chinese, Japanese and Arabic labels', () => {
|
|
107
|
+
expect(altWithLabels('地图', labels('北京', '上海'))).toBe('地图(北京、上海)');
|
|
108
|
+
expect(altWithLabels('地図', labels('東京'))).toBe('地図(東京)');
|
|
109
|
+
expect(altWithLabels('خريطة', labels('القاهرة', 'دمشق'))).toBe('خريطة (القاهرة، دمشق)');
|
|
110
|
+
});
|
|
111
|
+
it('is the alternative text of the picture in the HTML viewer', () => {
|
|
112
|
+
const html = renderToHtmlIndexed(build(`${FIGURE}\n`), { resourceImageUrl: (id) => `https://example.org/${id}` }).pages[0].innerHtml;
|
|
113
|
+
expect(html).toContain('alt="A map of Europe (OCÉANO ATLÁNTICO, Madrid)"');
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
//# sourceMappingURL=outsidePrint.test.js.map
|