postext 0.3.29 → 0.3.31
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__/exports.test.js +2 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/pipeline/calloutOverflow.test.d.ts +2 -0
- package/dist/__tests__/pipeline/calloutOverflow.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/calloutOverflow.test.js +189 -0
- package/dist/__tests__/pipeline/calloutOverflow.test.js.map +1 -0
- package/dist/__tests__/pipeline/paragraphStyles.test.js +19 -0
- package/dist/__tests__/pipeline/paragraphStyles.test.js.map +1 -1
- package/dist/__tests__/pipeline/raggedLines.test.d.ts +2 -0
- package/dist/__tests__/pipeline/raggedLines.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/raggedLines.test.js +26 -0
- package/dist/__tests__/pipeline/raggedLines.test.js.map +1 -0
- package/dist/__tests__/pipeline/spanBoxHeadAfterCut.test.d.ts +2 -0
- package/dist/__tests__/pipeline/spanBoxHeadAfterCut.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/spanBoxHeadAfterCut.test.js +96 -0
- package/dist/__tests__/pipeline/spanBoxHeadAfterCut.test.js.map +1 -0
- package/dist/__tests__/pipeline/spanFloatAtCut.test.d.ts +2 -0
- package/dist/__tests__/pipeline/spanFloatAtCut.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/spanFloatAtCut.test.js +159 -0
- package/dist/__tests__/pipeline/spanFloatAtCut.test.js.map +1 -0
- package/dist/__tests__/pipeline/tableCellImages.test.d.ts +2 -0
- package/dist/__tests__/pipeline/tableCellImages.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/tableCellImages.test.js +166 -0
- package/dist/__tests__/pipeline/tableCellImages.test.js.map +1 -0
- package/dist/__tests__/pipeline/tableCellLists.test.d.ts +2 -0
- package/dist/__tests__/pipeline/tableCellLists.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/tableCellLists.test.js +91 -0
- package/dist/__tests__/pipeline/tableCellLists.test.js.map +1 -0
- package/dist/__tests__/pipeline/tableSlice.test.d.ts +2 -0
- package/dist/__tests__/pipeline/tableSlice.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/tableSlice.test.js +226 -0
- package/dist/__tests__/pipeline/tableSlice.test.js.map +1 -0
- package/dist/__tests__/pipeline/tableSplit.test.d.ts +2 -0
- package/dist/__tests__/pipeline/tableSplit.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/tableSplit.test.js +154 -0
- package/dist/__tests__/pipeline/tableSplit.test.js.map +1 -0
- package/dist/__tests__/pipeline/trailingBand.test.js +67 -0
- package/dist/__tests__/pipeline/trailingBand.test.js.map +1 -1
- package/dist/__tests__/pipeline/trailingCalloutBalance.test.d.ts +2 -0
- package/dist/__tests__/pipeline/trailingCalloutBalance.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/trailingCalloutBalance.test.js +60 -0
- package/dist/__tests__/pipeline/trailingCalloutBalance.test.js.map +1 -0
- package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.js +13 -1
- package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
- package/dist/defaults/calloutStyles.d.ts +1 -0
- package/dist/defaults/calloutStyles.d.ts.map +1 -1
- package/dist/defaults/calloutStyles.js +6 -0
- package/dist/defaults/calloutStyles.js.map +1 -1
- package/dist/defaults/index.d.ts +1 -1
- package/dist/defaults/index.d.ts.map +1 -1
- package/dist/defaults/index.js +1 -1
- package/dist/defaults/index.js.map +1 -1
- package/dist/defaults/tableStyle.d.ts +7 -1
- package/dist/defaults/tableStyle.d.ts.map +1 -1
- package/dist/defaults/tableStyle.js +35 -1
- package/dist/defaults/tableStyle.js.map +1 -1
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +32 -19
- package/dist/html-backend.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/knuthPlass/breakpoints.d.ts.map +1 -1
- package/dist/knuthPlass/breakpoints.js +6 -2
- package/dist/knuthPlass/breakpoints.js.map +1 -1
- package/dist/knuthPlass/constants.d.ts +3 -1
- package/dist/knuthPlass/constants.d.ts.map +1 -1
- package/dist/knuthPlass/constants.js +3 -1
- package/dist/knuthPlass/constants.js.map +1 -1
- package/dist/pipeline/bandCaps.d.ts +14 -8
- package/dist/pipeline/bandCaps.d.ts.map +1 -1
- package/dist/pipeline/bandCaps.js +38 -20
- package/dist/pipeline/bandCaps.js.map +1 -1
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +582 -123
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/calloutLayout.d.ts +7 -0
- package/dist/pipeline/calloutLayout.d.ts.map +1 -1
- package/dist/pipeline/calloutLayout.js +36 -6
- package/dist/pipeline/calloutLayout.js.map +1 -1
- package/dist/pipeline/columnBalancing.d.ts +17 -1
- package/dist/pipeline/columnBalancing.d.ts.map +1 -1
- package/dist/pipeline/columnBalancing.js +76 -3
- package/dist/pipeline/columnBalancing.js.map +1 -1
- package/dist/pipeline/config.js +1 -1
- package/dist/pipeline/config.js.map +1 -1
- package/dist/pipeline/floatPlacement.d.ts +4 -0
- package/dist/pipeline/floatPlacement.d.ts.map +1 -1
- package/dist/pipeline/floatPlacement.js.map +1 -1
- package/dist/pipeline/paragraphContainers.d.ts.map +1 -1
- package/dist/pipeline/paragraphContainers.js +4 -1
- package/dist/pipeline/paragraphContainers.js.map +1 -1
- package/dist/pipeline/raggedLines.d.ts +16 -0
- package/dist/pipeline/raggedLines.d.ts.map +1 -0
- package/dist/pipeline/raggedLines.js +28 -0
- package/dist/pipeline/raggedLines.js.map +1 -0
- package/dist/pipeline/resourceLayout.d.ts +55 -1
- package/dist/pipeline/resourceLayout.d.ts.map +1 -1
- package/dist/pipeline/resourceLayout.js +394 -30
- package/dist/pipeline/resourceLayout.js.map +1 -1
- package/dist/table/model.d.ts +7 -1
- package/dist/table/model.d.ts.map +1 -1
- package/dist/table/model.js +22 -0
- package/dist/table/model.js.map +1 -1
- package/dist/types.d.ts +48 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/vdt.d.ts +59 -0
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js.map +1 -1
- package/package.json +1 -1
- package/dist/__tests__/pipeline/raggedUrl.test.d.ts +0 -2
- package/dist/__tests__/pipeline/raggedUrl.test.d.ts.map +0 -1
- package/dist/__tests__/pipeline/raggedUrl.test.js +0 -22
- package/dist/__tests__/pipeline/raggedUrl.test.js.map +0 -1
- package/dist/pipeline/raggedUrl.d.ts +0 -15
- package/dist/pipeline/raggedUrl.d.ts.map +0 -1
- package/dist/pipeline/raggedUrl.js +0 -28
- package/dist/pipeline/raggedUrl.js.map +0 -1
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { layoutResourceBlock, planTableSlice, tableHeaderRowCount, tableSliceRows } from '../../pipeline/resourceLayout';
|
|
3
|
+
import { resolveAllConfig } from '../../pipeline/config';
|
|
4
|
+
import { defaultResourceTypes } from '../../defaults/resourceTypes';
|
|
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 COLUMN_WIDTH = 600;
|
|
18
|
+
const cell = (content, extra = {}) => ({ content, ...extra });
|
|
19
|
+
/** Two header rows (with a rowspan in the first column), then `n` body rows
|
|
20
|
+
* where every fifth row is a single cell across the table (a group head). */
|
|
21
|
+
function bigModel(n) {
|
|
22
|
+
const rows = [
|
|
23
|
+
[cell('', { isHeader: true, rowSpan: 2 }), cell('Group', { isHeader: true, colSpan: 2 }), cell('', { hiddenBy: { row: 0, col: 1 } })],
|
|
24
|
+
[cell('', { hiddenBy: { row: 0, col: 0 } }), cell('A', { isHeader: true }), cell('B', { isHeader: true })],
|
|
25
|
+
];
|
|
26
|
+
for (let i = 0; i < n; i++) {
|
|
27
|
+
if (i % 5 === 0) {
|
|
28
|
+
rows.push([cell(`Section ${i}`, { colSpan: 3 }), cell('', { hiddenBy: { row: rows.length, col: 0 } }), cell('', { hiddenBy: { row: rows.length, col: 0 } })]);
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
rows.push([cell(`Row ${i}`), cell('x'), cell('y')]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return { rows, headerRowCount: 2 };
|
|
35
|
+
}
|
|
36
|
+
const tableResource = (model, extra = {}) => ({
|
|
37
|
+
id: 'tab-1',
|
|
38
|
+
typeId: 'table',
|
|
39
|
+
kind: 'table',
|
|
40
|
+
caption: 'A long table.',
|
|
41
|
+
createdAt: 0,
|
|
42
|
+
updatedAt: 0,
|
|
43
|
+
table: { model },
|
|
44
|
+
...extra,
|
|
45
|
+
});
|
|
46
|
+
function layout(resource, config, slice) {
|
|
47
|
+
const resourceTypes = config?.resourceTypes ?? defaultResourceTypes();
|
|
48
|
+
const resolved = resolveAllConfig(config);
|
|
49
|
+
return layoutResourceBlock({
|
|
50
|
+
resource,
|
|
51
|
+
resourceType: resourceTypes.find((t) => t.id === resource.typeId),
|
|
52
|
+
number: '6-4',
|
|
53
|
+
resolved,
|
|
54
|
+
columnWidth: COLUMN_WIDTH,
|
|
55
|
+
resourceNumbering: { [resource.id]: { number: '6-4', typeId: resource.typeId, heading: { h1: 0, h2: 0, h3: 0, h4: 0, h5: 0, h6: 0 } } },
|
|
56
|
+
resourceTypes,
|
|
57
|
+
resources: [resource],
|
|
58
|
+
...(slice ? { slice } : {}),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const captionText = (lines) => lines.map((l) => l.text).join(' ');
|
|
62
|
+
describe('table row metrics', () => {
|
|
63
|
+
it('a full layout reports one height per row, the header rows, rowspan edges and group heads', () => {
|
|
64
|
+
const model = bigModel(12);
|
|
65
|
+
const { tableRows, block } = layout(tableResource(model));
|
|
66
|
+
expect(tableRows).toBeDefined();
|
|
67
|
+
const m = tableRows;
|
|
68
|
+
expect(m.rowHeights).toHaveLength(model.rows.length);
|
|
69
|
+
expect(m.headerRowCount).toBe(2);
|
|
70
|
+
// The rowspan in the header ties rows 0 and 1 together.
|
|
71
|
+
expect(m.breakableAfter[0]).toBe(false);
|
|
72
|
+
expect(m.breakableAfter[1]).toBe(true);
|
|
73
|
+
// Rows 2, 7, 12 are single full-width cells (group heads).
|
|
74
|
+
expect(m.groupHeaderRow[2]).toBe(true);
|
|
75
|
+
expect(m.groupHeaderRow[3]).toBe(false);
|
|
76
|
+
expect(m.groupHeaderRow[7]).toBe(true);
|
|
77
|
+
// Heights match the laid-out row edges.
|
|
78
|
+
const edges = block.table.rowEdges;
|
|
79
|
+
for (let r = 0; r < m.rowHeights.length; r++) {
|
|
80
|
+
expect(edges[r + 1] - edges[r]).toBeCloseTo(m.rowHeights[r], 6);
|
|
81
|
+
}
|
|
82
|
+
expect(block.slice).toBeUndefined();
|
|
83
|
+
expect(block.continuesLines).toEqual([]);
|
|
84
|
+
});
|
|
85
|
+
it('header rows: declared count wins; otherwise the leading run of header cells', () => {
|
|
86
|
+
expect(tableHeaderRowCount(bigModel(3))).toBe(2);
|
|
87
|
+
const detected = {
|
|
88
|
+
rows: [
|
|
89
|
+
[cell('h', { isHeader: true }), cell('h', { isHeader: true })],
|
|
90
|
+
[cell('a'), cell('b')],
|
|
91
|
+
[cell('c'), cell('d')],
|
|
92
|
+
],
|
|
93
|
+
};
|
|
94
|
+
expect(tableHeaderRowCount(detected)).toBe(1);
|
|
95
|
+
// Never the whole table.
|
|
96
|
+
const allHeaders = { rows: [[cell('h', { isHeader: true })], [cell('h', { isHeader: true })]] };
|
|
97
|
+
expect(tableHeaderRowCount(allHeaders)).toBe(1);
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe('planTableSlice', () => {
|
|
101
|
+
const metrics = {
|
|
102
|
+
rowHeights: [10, 10, 20, 20, 20, 20, 20, 20],
|
|
103
|
+
headerRowCount: 2,
|
|
104
|
+
breakableAfter: [false, true, true, false, true, true, true, true],
|
|
105
|
+
groupHeaderRow: [false, false, false, false, false, true, false, false],
|
|
106
|
+
};
|
|
107
|
+
it('the first slice takes as many rows as fit the budget, header included', () => {
|
|
108
|
+
// 10 + 10 + 20 + 20 = 60 → rows 0..3, but the rowspan after row 3 is not breakable → end 3.
|
|
109
|
+
expect(planTableSlice(metrics, 0, 60)).toBe(3);
|
|
110
|
+
expect(planTableSlice(metrics, 0, 80)).toBe(5);
|
|
111
|
+
});
|
|
112
|
+
it('a continuation pays for the repeated header rows', () => {
|
|
113
|
+
// header 20 + rows 3,4 (40) = 60 → end 5; row 5 would need 80.
|
|
114
|
+
expect(planTableSlice(metrics, 3, 60)).toBe(5);
|
|
115
|
+
expect(planTableSlice(metrics, 3, 79)).toBe(5);
|
|
116
|
+
});
|
|
117
|
+
it('never ends on a group head when a row can be given back', () => {
|
|
118
|
+
// header 20 + rows 3..5 = 80 fits, but row 5 heads a group → end 5.
|
|
119
|
+
expect(planTableSlice(metrics, 3, 80)).toBe(5);
|
|
120
|
+
// With row 6 also fitting the group head is carried along.
|
|
121
|
+
expect(planTableSlice(metrics, 3, 100)).toBe(7);
|
|
122
|
+
});
|
|
123
|
+
it('returns the start row when nothing fits and the row count when everything does', () => {
|
|
124
|
+
expect(planTableSlice(metrics, 3, 10)).toBe(3);
|
|
125
|
+
expect(planTableSlice(metrics, 0, 1000)).toBe(8);
|
|
126
|
+
expect(planTableSlice(metrics, 3, 1000)).toBe(8);
|
|
127
|
+
});
|
|
128
|
+
it('a cut that would back off over nothing but group heads stays where the rows fit', () => {
|
|
129
|
+
// Rows 2..7 all flagged as heads (a boxed one-column table): the slice
|
|
130
|
+
// keeps every row that fits instead of collapsing to the floor.
|
|
131
|
+
const heads = {
|
|
132
|
+
...metrics,
|
|
133
|
+
groupHeaderRow: [false, false, true, true, true, true, true, true],
|
|
134
|
+
breakableAfter: metrics.breakableAfter.map(() => true),
|
|
135
|
+
};
|
|
136
|
+
expect(planTableSlice(heads, 0, 100)).toBe(6);
|
|
137
|
+
expect(planTableSlice(heads, 3, 100)).toBe(7);
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
describe('one-column tables', () => {
|
|
141
|
+
it('no row of a boxed one-column table is a group head', () => {
|
|
142
|
+
const model = { rows: Array.from({ length: 6 }, (_, i) => [cell(`row ${i}`)]) };
|
|
143
|
+
const { tableRows } = layout(tableResource(model));
|
|
144
|
+
expect(tableRows.headerRowCount).toBe(0);
|
|
145
|
+
expect(tableRows.groupHeaderRow.every((g) => !g)).toBe(true);
|
|
146
|
+
// 3 rows fit: the slice takes them all.
|
|
147
|
+
const h = tableRows.rowHeights[0];
|
|
148
|
+
expect(planTableSlice(tableRows, 0, h * 3 + 0.5)).toBe(3);
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe('table slices', () => {
|
|
152
|
+
const model = bigModel(20);
|
|
153
|
+
const resource = tableResource(model, { note: 'Source: the source.' });
|
|
154
|
+
it('tableSliceRows repeats the header rows before a continuation', () => {
|
|
155
|
+
expect(tableSliceRows(model, { startRow: 0, endRow: 4, continues: true })).toEqual([0, 1, 2, 3]);
|
|
156
|
+
expect(tableSliceRows(model, { startRow: 6, endRow: 9, continues: false })).toEqual([0, 1, 6, 7, 8]);
|
|
157
|
+
});
|
|
158
|
+
it('a first slice that continues: no suffix, a marker instead of the note, only its rows', () => {
|
|
159
|
+
const { block, totalHeight } = layout(resource, undefined, { startRow: 0, endRow: 6, continues: true });
|
|
160
|
+
expect(block.slice).toEqual({ startRow: 0, endRow: 6, continued: false, continues: true });
|
|
161
|
+
expect(block.table.rowEdges).toHaveLength(7);
|
|
162
|
+
const rows = new Set(block.table.cells.map((c) => c.row));
|
|
163
|
+
expect([...rows].sort((a, b) => a - b)).toEqual([0, 1, 2, 3, 4, 5]);
|
|
164
|
+
expect(captionText(block.captionLines)).not.toContain('(cont.)');
|
|
165
|
+
expect(block.noteLines).toEqual([]);
|
|
166
|
+
expect(block.continuesLines).toHaveLength(1);
|
|
167
|
+
expect(block.continuesLines[0].text).toBe('Continued');
|
|
168
|
+
// Flush right under the body.
|
|
169
|
+
const marker = block.continuesLines[0];
|
|
170
|
+
expect(marker.bbox.x + marker.bbox.width).toBeCloseTo(COLUMN_WIDTH, 6);
|
|
171
|
+
expect(marker.bbox.y).toBeGreaterThan(block.bodyRect.y + block.bodyRect.height);
|
|
172
|
+
expect(totalHeight).toBeCloseTo(marker.bbox.y + marker.bbox.height, 6);
|
|
173
|
+
});
|
|
174
|
+
it('a continuation repeats the header rows, keeps model row indices and suffixes the caption', () => {
|
|
175
|
+
const { block } = layout(resource, undefined, { startRow: 6, endRow: 12, continues: true });
|
|
176
|
+
expect(block.slice).toEqual({ startRow: 6, endRow: 12, continued: true, continues: true });
|
|
177
|
+
const cells = block.table.cells;
|
|
178
|
+
// Header rows 0-1 sit at the top, then rows 6..11.
|
|
179
|
+
expect(block.table.rowEdges).toHaveLength(9);
|
|
180
|
+
const header = cells.filter((c) => c.isHeader);
|
|
181
|
+
expect(header.map((c) => c.row).sort((a, b) => a - b)).toEqual([0, 0, 1, 1]);
|
|
182
|
+
expect(Math.max(...header.map((c) => c.rect.y + c.rect.height))).toBeLessThanOrEqual(block.table.rowEdges[2] + 1e-6);
|
|
183
|
+
const body = cells.filter((c) => !c.isHeader);
|
|
184
|
+
expect(Math.min(...body.map((c) => c.row))).toBe(6);
|
|
185
|
+
expect(Math.max(...body.map((c) => c.row))).toBe(11);
|
|
186
|
+
// The rowspan cell of the header still spans both repeated rows.
|
|
187
|
+
const spanned = cells.find((c) => c.row === 0 && c.col === 0);
|
|
188
|
+
expect(spanned.rowSpan).toBe(2);
|
|
189
|
+
expect(spanned.rect.height).toBeCloseTo(block.table.rowEdges[2], 6);
|
|
190
|
+
expect(captionText(block.captionLines)).toContain('(cont.)');
|
|
191
|
+
expect(block.continuesLines).toHaveLength(1);
|
|
192
|
+
expect(block.noteLines).toEqual([]);
|
|
193
|
+
});
|
|
194
|
+
it('the closing slice carries the note and no marker', () => {
|
|
195
|
+
const { block } = layout(resource, undefined, { startRow: 12, endRow: model.rows.length, continues: false });
|
|
196
|
+
expect(block.slice).toEqual({ startRow: 12, endRow: model.rows.length, continued: true, continues: false });
|
|
197
|
+
expect(block.continuesLines).toEqual([]);
|
|
198
|
+
expect(block.noteLines.length).toBeGreaterThan(0);
|
|
199
|
+
expect(captionText(block.captionLines)).toContain('(cont.)');
|
|
200
|
+
});
|
|
201
|
+
it('row heights of a slice equal the full layout\'s', () => {
|
|
202
|
+
const full = layout(resource).tableRows;
|
|
203
|
+
const { block } = layout(resource, undefined, { startRow: 6, endRow: 12, continues: true });
|
|
204
|
+
const edges = block.table.rowEdges;
|
|
205
|
+
const expected = [0, 1, 6, 7, 8, 9, 10, 11].map((r) => full.rowHeights[r]);
|
|
206
|
+
for (let i = 0; i < expected.length; i++) {
|
|
207
|
+
expect(edges[i + 1] - edges[i]).toBeCloseTo(expected[i], 6);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
it('continuation strings follow the config: locale defaults and explicit overrides', () => {
|
|
211
|
+
const es = layout(resource, { locale: 'es' }, { startRow: 6, endRow: 12, continues: true }).block;
|
|
212
|
+
expect(es.continuesLines[0].text).toBe('Continúa');
|
|
213
|
+
expect(captionText(es.captionLines)).toContain('(cont.)');
|
|
214
|
+
const custom = layout(resource, { tableStyle: { continuedSuffix: '(continuación)', continuesMarker: 'Sigue en la página siguiente' } }, { startRow: 6, endRow: 12, continues: true }).block;
|
|
215
|
+
expect(custom.continuesLines[0].text).toBe('Sigue en la página siguiente');
|
|
216
|
+
expect(captionText(custom.captionLines)).toContain('(continuación)');
|
|
217
|
+
const off = layout(resource, { tableStyle: { continuesMarkerEnabled: false } }, { startRow: 6, endRow: 12, continues: true }).block;
|
|
218
|
+
expect(off.continuesLines).toEqual([]);
|
|
219
|
+
});
|
|
220
|
+
it('a slice covering the whole table from row 0 is the plain table', () => {
|
|
221
|
+
const { block } = layout(resource, undefined, { startRow: 0, endRow: model.rows.length, continues: false });
|
|
222
|
+
expect(block.slice).toBeUndefined();
|
|
223
|
+
expect(block.noteLines.length).toBeGreaterThan(0);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
//# sourceMappingURL=tableSlice.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tableSlice.test.js","sourceRoot":"","sources":["../../../src/__tests__/pipeline/tableSlice.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,cAAc,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEzH,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAGpE,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,YAAY,GAAG,GAAG,CAAC;AAEzB,MAAM,IAAI,GAAG,CAAC,OAAe,EAAE,QAA4B,EAAE,EAAa,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAErG;8EAC8E;AAC9E,SAAS,QAAQ,CAAC,CAAS;IACzB,MAAM,IAAI,GAAkB;QAC1B,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACrI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;KAC3G,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QAChK,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,aAAa,GAAG,CAAC,KAAiB,EAAE,QAA2B,EAAE,EAAY,EAAE,CAAC,CAAC;IACrF,EAAE,EAAE,OAAO;IACX,MAAM,EAAE,OAAO;IACf,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,eAAe;IACxB,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,CAAC;IACZ,KAAK,EAAE,EAAE,KAAK,EAAE;IAChB,GAAG,KAAK;CACT,CAAC,CAAC;AAEH,SAAS,MAAM,CAAC,QAAkB,EAAE,MAAsB,EAAE,KAAsB;IAChF,MAAM,aAAa,GAAG,MAAM,EAAE,aAAa,IAAI,oBAAoB,EAAE,CAAC;IACtE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,mBAAmB,CAAC;QACzB,QAAQ;QACR,YAAY,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,MAAM,CAAC;QACjE,MAAM,EAAE,KAAK;QACb,QAAQ;QACR,WAAW,EAAE,YAAY;QACzB,iBAAiB,EAAE,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE;QACvI,aAAa;QACb,SAAS,EAAE,CAAC,QAAQ,CAAC;QACrB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC5B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,WAAW,GAAG,CAAC,KAAyB,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAEtF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAClG,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,SAAU,CAAC;QACrB,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjC,wDAAwD;QACxD,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,2DAA2D;QAC3D,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,wCAAwC;QACxC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAM,CAAC,QAAQ,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7C,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,GAAG,EAAE;QACrF,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAe;YAC3B,IAAI,EAAE;gBACJ,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9D,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;gBACtB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;aACvB;SACF,CAAC;QACF,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,yBAAyB;QACzB,MAAM,UAAU,GAAe,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5G,MAAM,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,OAAO,GAAoB;QAC/B,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QAC5C,cAAc,EAAE,CAAC;QACjB,cAAc,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;QAClE,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC;KACxE,CAAC;IAEF,EAAE,CAAC,uEAAuE,EAAE,GAAG,EAAE;QAC/E,4FAA4F;QAC5F,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,+DAA+D;QAC/D,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,oEAAoE;QACpE,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/C,2DAA2D;QAC3D,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACzF,uEAAuE;QACvE,gEAAgE;QAChE,MAAM,KAAK,GAAoB;YAC7B,GAAG,OAAO;YACV,cAAc,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;YAClE,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;SACvD,CAAC;QACF,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC5D,MAAM,KAAK,GAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,SAAU,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,CAAC,SAAU,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9D,wCAAwC;QACxC,MAAM,CAAC,GAAG,SAAU,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC;QACpC,MAAM,CAAC,cAAc,CAAC,SAAU,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3B,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAEvE,EAAE,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACtE,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjG,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;QAC9F,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3F,MAAM,CAAC,KAAK,CAAC,KAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,KAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACjE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxD,8BAA8B;QAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC,CAAE,CAAC;QACxC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC;QACvE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChF,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAClG,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5F,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3F,MAAM,KAAK,GAAG,KAAK,CAAC,KAAM,CAAC,KAAK,CAAC;QACjC,mDAAmD;QACnD,MAAM,CAAC,KAAK,CAAC,KAAM,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,KAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,GAAG,IAAI,CAAC,CAAC;QACvH,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrD,iEAAiE;QACjE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAE,CAAC;QAC/D,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,KAAM,CAAC,QAAQ,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7G,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5G,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAU,CAAC;QACzC,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5F,MAAM,KAAK,GAAG,KAAK,CAAC,KAAM,CAAC,QAAQ,CAAC;QACpC,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAE,CAAC,CAAC;QAC5E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACzC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAE,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC,CAAC;QACjE,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gFAAgF,EAAE,GAAG,EAAE;QACxF,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;QAClG,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACpD,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAG,MAAM,CACnB,QAAQ,EACR,EAAE,UAAU,EAAE,EAAE,eAAe,EAAE,gBAAgB,EAAE,eAAe,EAAE,8BAA8B,EAAE,EAAE,EACtG,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAC7C,CAAC,KAAK,CAAC;QACR,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC5E,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QACrE,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,UAAU,EAAE,EAAE,sBAAsB,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC;QACpI,MAAM,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gEAAgE,EAAE,GAAG,EAAE;QACxE,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5G,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;QACpC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tableSplit.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/pipeline/tableSplit.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { buildDocument } from '../../pipeline';
|
|
3
|
+
// Deterministic text measurement stub (no DOM in the node test env).
|
|
4
|
+
class StubCtx {
|
|
5
|
+
font = '';
|
|
6
|
+
measureText(s) {
|
|
7
|
+
return { width: s.length * 7 };
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
globalThis.OffscreenCanvas = class {
|
|
11
|
+
getContext() {
|
|
12
|
+
return new StubCtx();
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const cell = (content, extra = {}) => ({ content, ...extra });
|
|
16
|
+
/** A header row plus `n` body rows — far taller than a page for large `n`. */
|
|
17
|
+
const table = (id, n, extra = {}) => ({
|
|
18
|
+
id,
|
|
19
|
+
typeId: 'table',
|
|
20
|
+
kind: 'table',
|
|
21
|
+
caption: 'Activities by age group.',
|
|
22
|
+
note: 'Source: the reference book.',
|
|
23
|
+
createdAt: 0,
|
|
24
|
+
updatedAt: 0,
|
|
25
|
+
table: {
|
|
26
|
+
model: {
|
|
27
|
+
headerRowCount: 1,
|
|
28
|
+
rows: [
|
|
29
|
+
[cell('Task', { isHeader: true }), cell('3 to 6', { isHeader: true }), cell('7 to 10', { isHeader: true })],
|
|
30
|
+
...Array.from({ length: n }, (_, i) => [cell(`Task ${i + 1}`), cell('Yes'), cell('Yes')]),
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
placement: { span: 'page' },
|
|
35
|
+
...extra,
|
|
36
|
+
});
|
|
37
|
+
const pt = (value) => ({ value, unit: 'pt' });
|
|
38
|
+
/** Two-column page with balancing off (single pass, deterministic). */
|
|
39
|
+
const PAGE = {
|
|
40
|
+
page: { width: pt(400), height: pt(400), margins: { top: pt(20), bottom: pt(20), left: pt(20), right: pt(20) } },
|
|
41
|
+
headings: { balancing: { enabled: false }, levels: [{ level: 1, breakBefore: { enabled: false } }] },
|
|
42
|
+
};
|
|
43
|
+
const para = (i) => `Paragraph ${i} carries enough words to take a few lines of the narrow column so the flow advances steadily.`;
|
|
44
|
+
const filler = (n, from = 0) => Array.from({ length: n }, (_, i) => para(from + i)).join('\n\n');
|
|
45
|
+
const build = (markdown, resources, config = PAGE) => buildDocument({ markdown, resources }, config);
|
|
46
|
+
const floatsOf = (doc, id) => doc.pages.flatMap((p) => (p.floats ?? []).filter((b) => b.resourceBlock.resource.id === id).map((b) => ({ page: p, block: b })));
|
|
47
|
+
const rbOf = (b) => b.resourceBlock;
|
|
48
|
+
const captionText = (b) => rbOf(b).captionLines.map((l) => l.text).join(' ');
|
|
49
|
+
const withinContent = (page, b) => b.bbox.y >= page.contentArea.y - 1e-6
|
|
50
|
+
&& b.bbox.y + b.bbox.height <= page.contentArea.y + page.contentArea.height + 1e-6;
|
|
51
|
+
describe('tables taller than the page', () => {
|
|
52
|
+
const ROWS = 60;
|
|
53
|
+
const markdown = `Intro :ref{id="tab"} text.\n\n${filler(40)}`;
|
|
54
|
+
it('split (default): continues on the following pages with the header repeated', () => {
|
|
55
|
+
const doc = build(markdown, [table('tab', ROWS)]);
|
|
56
|
+
const slices = floatsOf(doc, 'tab');
|
|
57
|
+
expect(slices.length).toBeGreaterThan(1);
|
|
58
|
+
// One slice per page, on consecutive pages after the referencing page.
|
|
59
|
+
for (let i = 1; i < slices.length; i++) {
|
|
60
|
+
expect(slices[i].page.index).toBe(slices[i - 1].page.index + 1);
|
|
61
|
+
}
|
|
62
|
+
expect(slices[0].page.index).toBeGreaterThan(0);
|
|
63
|
+
// Rows are carried in order, each exactly once, header rows excluded.
|
|
64
|
+
let next = 0;
|
|
65
|
+
for (let i = 0; i < slices.length; i++) {
|
|
66
|
+
const { page, block } = slices[i];
|
|
67
|
+
const rb = rbOf(block);
|
|
68
|
+
const slice = rb.slice;
|
|
69
|
+
expect(slice).toBeDefined();
|
|
70
|
+
expect(slice.startRow).toBe(next);
|
|
71
|
+
expect(slice.endRow).toBeGreaterThan(slice.startRow);
|
|
72
|
+
next = slice.endRow;
|
|
73
|
+
expect(slice.continued).toBe(i > 0);
|
|
74
|
+
expect(slice.continues).toBe(i < slices.length - 1);
|
|
75
|
+
// Every slice sits inside its page.
|
|
76
|
+
expect(withinContent(page, block)).toBe(true);
|
|
77
|
+
// The header row is laid out on every slice, at its top.
|
|
78
|
+
const header = rb.table.cells.filter((c) => c.isHeader);
|
|
79
|
+
expect(header).toHaveLength(3);
|
|
80
|
+
expect(header.every((c) => c.row === 0)).toBe(true);
|
|
81
|
+
expect(Math.min(...header.map((c) => c.rect.y))).toBeCloseTo(block.bbox.y + rb.bodyRect.y, 6);
|
|
82
|
+
// Body rows of the slice only.
|
|
83
|
+
const body = rb.table.cells.filter((c) => !c.isHeader).map((c) => c.row);
|
|
84
|
+
expect(Math.min(...body)).toBe(Math.max(1, slice.startRow));
|
|
85
|
+
expect(Math.max(...body)).toBe(slice.endRow - 1);
|
|
86
|
+
// Caption suffix, marker and note.
|
|
87
|
+
expect(captionText(block).includes('(cont.)')).toBe(i > 0);
|
|
88
|
+
expect(rb.continuesLines.length > 0).toBe(i < slices.length - 1);
|
|
89
|
+
expect(rb.noteLines.length > 0).toBe(i === slices.length - 1);
|
|
90
|
+
expect(block.id).toBe(i === 0 ? 'float-tab' : `float-tab-cont-${slice.startRow}`);
|
|
91
|
+
}
|
|
92
|
+
expect(next).toBe(ROWS + 1);
|
|
93
|
+
// The text keeps flowing after the table.
|
|
94
|
+
const lastSlicePage = slices[slices.length - 1].page.index;
|
|
95
|
+
expect(doc.pages.length).toBeGreaterThan(lastSlicePage);
|
|
96
|
+
const textAfter = doc.pages.slice(lastSlicePage).flatMap((p) => p.columns.flatMap((c) => c.blocks));
|
|
97
|
+
expect(textAfter.length).toBeGreaterThan(0);
|
|
98
|
+
});
|
|
99
|
+
it('a slice fills its page: the columns under a page-span slice keep no text room', () => {
|
|
100
|
+
const doc = build(markdown, [table('tab', ROWS)]);
|
|
101
|
+
const first = floatsOf(doc, 'tab')[0];
|
|
102
|
+
// Most of the page: at least 80% of the content height.
|
|
103
|
+
expect(first.block.bbox.height).toBeGreaterThan(first.page.contentArea.height * 0.8);
|
|
104
|
+
});
|
|
105
|
+
it('clip: only the rows that fit the first page, note kept, no marker', () => {
|
|
106
|
+
const doc = build(markdown, [table('tab', ROWS)], { ...PAGE, tableStyle: { overflow: 'clip' } });
|
|
107
|
+
const slices = floatsOf(doc, 'tab');
|
|
108
|
+
expect(slices).toHaveLength(1);
|
|
109
|
+
const rb = rbOf(slices[0].block);
|
|
110
|
+
expect(rb.slice).toEqual(expect.objectContaining({ startRow: 0, continued: false, continues: false }));
|
|
111
|
+
expect(rb.slice.endRow).toBeLessThan(ROWS + 1);
|
|
112
|
+
expect(rb.continuesLines).toEqual([]);
|
|
113
|
+
expect(rb.noteLines.length).toBeGreaterThan(0);
|
|
114
|
+
expect(withinContent(slices[0].page, slices[0].block)).toBe(true);
|
|
115
|
+
});
|
|
116
|
+
it('hide: the table is left out', () => {
|
|
117
|
+
const doc = build(markdown, [table('tab', ROWS)], { ...PAGE, tableStyle: { overflow: 'hide' } });
|
|
118
|
+
expect(floatsOf(doc, 'tab')).toHaveLength(0);
|
|
119
|
+
// The flow is unaffected: text still lays out.
|
|
120
|
+
expect(doc.pages.length).toBeGreaterThan(1);
|
|
121
|
+
});
|
|
122
|
+
it('the closing slice never strands one or two rows under a repeated header', () => {
|
|
123
|
+
// Sweep row counts so some would leave a one- or two-row tail.
|
|
124
|
+
for (let rows = 24; rows <= 44; rows++) {
|
|
125
|
+
const doc = build(markdown, [table('tab', rows)]);
|
|
126
|
+
const slices = floatsOf(doc, 'tab');
|
|
127
|
+
const last = rbOf(slices[slices.length - 1].block).slice;
|
|
128
|
+
if (!last || !last.continued)
|
|
129
|
+
continue;
|
|
130
|
+
const bodyRows = last.endRow - last.startRow;
|
|
131
|
+
expect(bodyRows, `${rows} rows → tail of ${bodyRows}`).toBeGreaterThanOrEqual(3);
|
|
132
|
+
// Rows still add up.
|
|
133
|
+
let next = 0;
|
|
134
|
+
for (const { block } of slices) {
|
|
135
|
+
expect(rbOf(block).slice.startRow).toBe(next);
|
|
136
|
+
next = rbOf(block).slice.endRow;
|
|
137
|
+
}
|
|
138
|
+
expect(next).toBe(rows + 1);
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
it('a table that fits a page is never sliced', () => {
|
|
142
|
+
const doc = build(markdown, [table('tab', 6)]);
|
|
143
|
+
const slices = floatsOf(doc, 'tab');
|
|
144
|
+
expect(slices).toHaveLength(1);
|
|
145
|
+
expect(rbOf(slices[0].block).slice).toBeUndefined();
|
|
146
|
+
});
|
|
147
|
+
it('Spanish documents mark continuations with "Continúa"', () => {
|
|
148
|
+
const doc = build(markdown, [table('tab', ROWS)], { ...PAGE, locale: 'es' });
|
|
149
|
+
const slices = floatsOf(doc, 'tab');
|
|
150
|
+
expect(slices.length).toBeGreaterThan(1);
|
|
151
|
+
expect(rbOf(slices[0].block).continuesLines[0].text).toBe('Continúa');
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
//# sourceMappingURL=tableSplit.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tableSplit.test.js","sourceRoot":"","sources":["../../../src/__tests__/pipeline/tableSplit.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAG/C,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,IAAI,GAAG,CAAC,OAAe,EAAE,QAA4B,EAAE,EAAa,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;AAErG,8EAA8E;AAC9E,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,CAAS,EAAE,QAA2B,EAAE,EAAY,EAAE,CAAC,CAAC;IACjF,EAAE;IACF,MAAM,EAAE,OAAO;IACf,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,0BAA0B;IACnC,IAAI,EAAE,6BAA6B;IACnC,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,CAAC;IACZ,KAAK,EAAE;QACL,KAAK,EAAE;YACL,cAAc,EAAE,CAAC;YACjB,IAAI,EAAE;gBACJ,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC3G,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;aAC1F;SACF;KACF;IACD,SAAS,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE;IAC3B,GAAG,KAAK;CACT,CAAC,CAAC;AAEH,MAAM,EAAE,GAAG,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,IAAa,EAAE,CAAC,CAAC;AAE/D,uEAAuE;AACvE,MAAM,IAAI,GAAkB;IAC1B,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;IAChH,QAAQ,EAAE,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE;CACrG,CAAC;AAEF,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,aAAa,CAAC,+FAA+F,CAAC;AAC1I,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAEzG,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAE,SAAqB,EAAE,SAAwB,IAAI,EAAe,EAAE,CACnG,aAAa,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,MAAM,CAAC,CAAC;AAEjD,MAAM,QAAQ,GAAG,CAAC,GAAgB,EAAE,EAAU,EAAE,EAAE,CAChD,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAc,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACpI,MAAM,IAAI,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,CAAC,CAAC,aAAc,CAAC;AAC/C,MAAM,WAAW,GAAG,CAAC,CAAW,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvF,MAAM,aAAa,GAAG,CAAC,IAAkC,EAAE,CAAW,EAAE,EAAE,CACxE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;OAClC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,IAAI,CAAC;AAErF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,MAAM,IAAI,GAAG,EAAE,CAAC;IAChB,MAAM,QAAQ,GAAG,iCAAiC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IAE/D,EAAE,CAAC,4EAA4E,EAAE,GAAG,EAAE;QACpF,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACzC,uEAAuE;QACvE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAE,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACpE,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACjD,sEAAsE;QACtE,IAAI,IAAI,GAAG,CAAC,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;YACnC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YACvB,MAAM,KAAK,GAAG,EAAE,CAAC,KAAM,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;YAC5B,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;YACrD,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;YACpB,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YACpC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpD,oCAAoC;YACpC,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9C,yDAAyD;YACzD,MAAM,MAAM,GAAG,EAAE,CAAC,KAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACzD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC/B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACpD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9F,+BAA+B;YAC/B,MAAM,IAAI,GAAG,EAAE,CAAC,KAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;YAC1E,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjD,mCAAmC;YACnC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC3D,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACjE,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC9D,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAkB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QACpF,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAC5B,0CAA0C;QAC1C,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5D,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACpG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+EAA+E,EAAE,GAAG,EAAE;QACvF,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC;QACvC,wDAAwD;QACxD,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC;IACvF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC3E,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACjG,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC;QAClC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,gBAAgB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QACvG,MAAM,CAAC,EAAE,CAAC,KAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtC,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACjG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC7C,+CAA+C;QAC/C,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,+DAA+D;QAC/D,KAAK,IAAI,IAAI,GAAG,EAAE,EAAE,IAAI,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;YAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC;YAC1D,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS;gBAAE,SAAS;YACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC7C,MAAM,CAAC,QAAQ,EAAE,GAAG,IAAI,mBAAmB,QAAQ,EAAE,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;YACjF,qBAAqB;YACrB,IAAI,IAAI,GAAG,CAAC,CAAC;YACb,KAAK,MAAM,EAAE,KAAK,EAAE,IAAI,MAAM,EAAE,CAAC;gBAC/B,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/C,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,KAAM,CAAC,MAAM,CAAC;YACnC,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;QAC9D,MAAM,GAAG,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC,cAAc,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { describe, it, expect } from 'vitest';
|
|
|
2
2
|
import { buildDocument, buildDocumentPass } from '../../pipeline/build';
|
|
3
3
|
import { createMeasurementCache } from '../../measure';
|
|
4
4
|
import { parseMarkdown } from '../../parse';
|
|
5
|
+
import { resolveTrailingCaps } from '../../pipeline/bandCaps';
|
|
5
6
|
// Deterministic text measurement stub (no DOM in the node test env).
|
|
6
7
|
class StubCtx {
|
|
7
8
|
font = '';
|
|
@@ -41,6 +42,29 @@ describe('trailing band balance', () => {
|
|
|
41
42
|
}
|
|
42
43
|
expect(doc.iterationCount).toBeGreaterThan(1);
|
|
43
44
|
});
|
|
45
|
+
it('balancing fills the closing column of a capped band up to the cut', () => {
|
|
46
|
+
// A heading inside the last column of the closing band: the level cut
|
|
47
|
+
// leaves that column two lines short (the heading's own spacing does
|
|
48
|
+
// not reach a grid line) and the heading takes them above it — the page
|
|
49
|
+
// does not flow on, but the cap makes the column balanceable.
|
|
50
|
+
const md = [filler(12), '', '## Sección', '', filler(7, 12)].join('\n');
|
|
51
|
+
const doc = build(md);
|
|
52
|
+
const last = doc.pages[doc.pages.length - 1];
|
|
53
|
+
const cols = last.columns.filter((c) => c.kind !== 'span' && c.blocks.length > 0);
|
|
54
|
+
expect(cols.length).toBe(2);
|
|
55
|
+
expect(cols[1].trailingCap).toBe(true);
|
|
56
|
+
for (const c of cols)
|
|
57
|
+
expect(c.availableHeight).toBeLessThan(0.5);
|
|
58
|
+
const [b0, b1] = usedBottoms(last);
|
|
59
|
+
expect(Math.abs(b0 - b1)).toBeLessThan(0.5);
|
|
60
|
+
const col = cols[1];
|
|
61
|
+
const hi = col.blocks.findIndex((b) => b.type === 'heading');
|
|
62
|
+
expect(hi).toBeGreaterThan(0);
|
|
63
|
+
const heading = col.blocks[hi];
|
|
64
|
+
const prev = col.blocks[hi - 1];
|
|
65
|
+
// The heading's margin alone is under a grid line; two lines were added.
|
|
66
|
+
expect(heading.bbox.y - (prev.bbox.y + prev.bbox.height)).toBeGreaterThanOrEqual(2 * doc.baselineGrid - 0.5);
|
|
67
|
+
});
|
|
44
68
|
it('is proposed by the first pass, keyed by the end of the document', () => {
|
|
45
69
|
const content = { markdown: LAME };
|
|
46
70
|
const pass = buildDocumentPass(content, PAGE, createMeasurementCache());
|
|
@@ -89,5 +113,48 @@ describe('trailing band balance', () => {
|
|
|
89
113
|
expect(last.columns[0].forcedBreak).toBe(true);
|
|
90
114
|
expect(last.columns[0].bbox.y + last.columns[0].bbox.height).toBeCloseTo(last.contentArea.y + last.contentArea.height, 5);
|
|
91
115
|
});
|
|
116
|
+
// Driver-level (deterministic fake passes): two closing bands, the first
|
|
117
|
+
// cap overflows on its first try and its retry moves the flow under the
|
|
118
|
+
// second boundary, whose band then opens with another block. That cap is
|
|
119
|
+
// replaced by the boundary's fresh proposal instead of being dropped, so
|
|
120
|
+
// both bands end level once the first cap settles (EMP ch. 17: key points
|
|
121
|
+
// on p. 201, the bibliography + self-assessment badge on p. 203).
|
|
122
|
+
it('keeps a later boundary alive while an earlier cap is still being retried', () => {
|
|
123
|
+
const capA = { kind: 'trailing', startContentIndex: 133, startPart: 1, lines: 55, retries: 0 };
|
|
124
|
+
const capB = { kind: 'trailing', startContentIndex: 178, startPart: 0, lines: 29, retries: 0 };
|
|
125
|
+
// B as the second boundary sees it while A's band still overflows.
|
|
126
|
+
const capBShifted = { kind: 'trailing', startContentIndex: 181, startPart: 0, lines: 12, retries: 0 };
|
|
127
|
+
const report = (proposals, placed, applied) => ({
|
|
128
|
+
bandCapProposals: new Map(proposals),
|
|
129
|
+
spanPlacedInBand: new Set(placed),
|
|
130
|
+
bandCapsApplied: new Set(applied),
|
|
131
|
+
tag: `${applied.join(',')}|${placed.join(',')}`,
|
|
132
|
+
});
|
|
133
|
+
const initial = report([[154, capA], [205, capB]], [], []);
|
|
134
|
+
const seen = [];
|
|
135
|
+
const out = resolveTrailingCaps(initial, new Map(), (caps) => {
|
|
136
|
+
seen.push([...caps].map(([i, c]) => [i, c.lines]));
|
|
137
|
+
const a = caps.get(154);
|
|
138
|
+
const b = caps.get(205);
|
|
139
|
+
if (a.lines < 56) {
|
|
140
|
+
// A overflows; the flow under it moved, so B's band opened with
|
|
141
|
+
// another block — the boundary proposes afresh from there.
|
|
142
|
+
return report([[205, capBShifted]], [], [154]);
|
|
143
|
+
}
|
|
144
|
+
if (!b || b.startContentIndex !== capB.startContentIndex) {
|
|
145
|
+
return report([[205, capB]], [154], [154]);
|
|
146
|
+
}
|
|
147
|
+
return report([], [154, 205], [154, 205]);
|
|
148
|
+
});
|
|
149
|
+
expect(seen).toEqual([
|
|
150
|
+
[[154, 55], [205, 29]],
|
|
151
|
+
[[154, 56], [205, 12]],
|
|
152
|
+
[[154, 56], [205, 29]],
|
|
153
|
+
]);
|
|
154
|
+
expect(out.passCount).toBe(3);
|
|
155
|
+
expect([...out.caps.keys()]).toEqual([154, 205]);
|
|
156
|
+
expect(out.result.spanPlacedInBand.has(205)).toBe(true);
|
|
157
|
+
expect(out.result).not.toBe(initial);
|
|
158
|
+
});
|
|
92
159
|
});
|
|
93
160
|
//# sourceMappingURL=trailingBand.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trailingBand.test.js","sourceRoot":"","sources":["../../../src/__tests__/pipeline/trailingBand.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"trailingBand.test.js","sourceRoot":"","sources":["../../../src/__tests__/pipeline/trailingBand.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trailingCalloutBalance.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/pipeline/trailingCalloutBalance.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { buildDocument } from '../../pipeline/build';
|
|
3
|
+
import { createMeasurementCache } from '../../measure';
|
|
4
|
+
// Deterministic text measurement stub (no DOM in the node test env).
|
|
5
|
+
class StubCtx {
|
|
6
|
+
font = '';
|
|
7
|
+
measureText(s) {
|
|
8
|
+
return { width: s.length * 7 };
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
globalThis.OffscreenCanvas = class {
|
|
12
|
+
getContext() {
|
|
13
|
+
return new StubCtx();
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
// Default 300 dpi: body 8pt → 33.33px, grid (1.5em) → 50px.
|
|
17
|
+
const GRID = ((8 * 300) / 72) * 1.5;
|
|
18
|
+
const SENTENCE = 'La linterna del faro debe permanecer encendida toda la noche para guiar a los barcos que cruzan la bahía. ';
|
|
19
|
+
const filler = (n) => SENTENCE.repeat(n).trim();
|
|
20
|
+
const mm = (value) => ({ value, unit: 'mm' });
|
|
21
|
+
/** Two-column page, ~23.6 grid lines tall. */
|
|
22
|
+
const page = (balancing) => ({
|
|
23
|
+
headings: { balancing: { enabled: balancing } },
|
|
24
|
+
page: { width: mm(160), height: mm(120), margins: { top: mm(10), bottom: mm(10), left: mm(10), right: mm(10) } },
|
|
25
|
+
layout: { layoutType: 'double' },
|
|
26
|
+
});
|
|
27
|
+
/** A column box of a few lines. */
|
|
28
|
+
const NOTE = [':::callout{title="Nota"}', filler(2), ':::'].join('\n');
|
|
29
|
+
/** Sixteen lines of text, the box (which ends the first column short of
|
|
30
|
+
* the page bottom — the heading after it keeps with its paragraph and
|
|
31
|
+
* moves on), then enough text to fill the second column and flow onto a
|
|
32
|
+
* second page. */
|
|
33
|
+
const md = [filler(16), '', NOTE, '', '## Sección', '', filler(9), '', filler(30)].join('\n');
|
|
34
|
+
describe('a callout closing a column', () => {
|
|
35
|
+
it('takes the column gap above it so its foot meets the last grid line', () => {
|
|
36
|
+
const plain = buildDocument({ markdown: md }, page(false), createMeasurementCache());
|
|
37
|
+
const balanced = buildDocument({ markdown: md }, page(true), createMeasurementCache());
|
|
38
|
+
const frameOf = (doc) => doc.blocks.find((b) => b.type === 'callout');
|
|
39
|
+
const f0 = frameOf(plain);
|
|
40
|
+
const f1 = frameOf(balanced);
|
|
41
|
+
// Same column in both layouts, the box is its last block.
|
|
42
|
+
expect(f0.pageIndex).toBe(0);
|
|
43
|
+
expect(f1.pageIndex).toBe(0);
|
|
44
|
+
expect(f1.columnIndex).toBe(f0.columnIndex);
|
|
45
|
+
const col0 = plain.pages[0].columns[f0.columnIndex];
|
|
46
|
+
const col1 = balanced.pages[0].columns[f1.columnIndex];
|
|
47
|
+
expect(col0.blocks[col0.blocks.length - 1].containerId).toBe(f0.containerId);
|
|
48
|
+
// The plain pass leaves a gap under the box; balancing pushes the box
|
|
49
|
+
// down by it.
|
|
50
|
+
const gapPlain = col0.bbox.y + col0.bbox.height - (f0.bbox.y + f0.bbox.height);
|
|
51
|
+
expect(gapPlain).toBeGreaterThan(GRID - 0.01);
|
|
52
|
+
expect(f1.bbox.y).toBeGreaterThan(f0.bbox.y + GRID - 0.01);
|
|
53
|
+
const gapBalanced = col1.bbox.y + col1.bbox.height - (f1.bbox.y + f1.bbox.height);
|
|
54
|
+
expect(gapBalanced).toBeLessThan(GRID);
|
|
55
|
+
// The text above it did not move.
|
|
56
|
+
const firstPara = (doc) => doc.blocks.find((b) => b.type === 'paragraph');
|
|
57
|
+
expect(firstPara(balanced).bbox.y).toBeCloseTo(firstPara(plain).bbox.y, 5);
|
|
58
|
+
}, 30000);
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=trailingCalloutBalance.test.js.map
|