postext 0.3.29 → 0.3.30

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.
Files changed (97) hide show
  1. package/dist/__tests__/exports.test.js +2 -0
  2. package/dist/__tests__/exports.test.js.map +1 -1
  3. package/dist/__tests__/pipeline/calloutOverflow.test.d.ts +2 -0
  4. package/dist/__tests__/pipeline/calloutOverflow.test.d.ts.map +1 -0
  5. package/dist/__tests__/pipeline/calloutOverflow.test.js +189 -0
  6. package/dist/__tests__/pipeline/calloutOverflow.test.js.map +1 -0
  7. package/dist/__tests__/pipeline/spanBoxHeadAfterCut.test.d.ts +2 -0
  8. package/dist/__tests__/pipeline/spanBoxHeadAfterCut.test.d.ts.map +1 -0
  9. package/dist/__tests__/pipeline/spanBoxHeadAfterCut.test.js +96 -0
  10. package/dist/__tests__/pipeline/spanBoxHeadAfterCut.test.js.map +1 -0
  11. package/dist/__tests__/pipeline/spanFloatAtCut.test.d.ts +2 -0
  12. package/dist/__tests__/pipeline/spanFloatAtCut.test.d.ts.map +1 -0
  13. package/dist/__tests__/pipeline/spanFloatAtCut.test.js +155 -0
  14. package/dist/__tests__/pipeline/spanFloatAtCut.test.js.map +1 -0
  15. package/dist/__tests__/pipeline/tableCellImages.test.d.ts +2 -0
  16. package/dist/__tests__/pipeline/tableCellImages.test.d.ts.map +1 -0
  17. package/dist/__tests__/pipeline/tableCellImages.test.js +166 -0
  18. package/dist/__tests__/pipeline/tableCellImages.test.js.map +1 -0
  19. package/dist/__tests__/pipeline/tableCellLists.test.d.ts +2 -0
  20. package/dist/__tests__/pipeline/tableCellLists.test.d.ts.map +1 -0
  21. package/dist/__tests__/pipeline/tableCellLists.test.js +91 -0
  22. package/dist/__tests__/pipeline/tableCellLists.test.js.map +1 -0
  23. package/dist/__tests__/pipeline/tableSlice.test.d.ts +2 -0
  24. package/dist/__tests__/pipeline/tableSlice.test.d.ts.map +1 -0
  25. package/dist/__tests__/pipeline/tableSlice.test.js +226 -0
  26. package/dist/__tests__/pipeline/tableSlice.test.js.map +1 -0
  27. package/dist/__tests__/pipeline/tableSplit.test.d.ts +2 -0
  28. package/dist/__tests__/pipeline/tableSplit.test.d.ts.map +1 -0
  29. package/dist/__tests__/pipeline/tableSplit.test.js +154 -0
  30. package/dist/__tests__/pipeline/tableSplit.test.js.map +1 -0
  31. package/dist/__tests__/pipeline/trailingCalloutBalance.test.d.ts +2 -0
  32. package/dist/__tests__/pipeline/trailingCalloutBalance.test.d.ts.map +1 -0
  33. package/dist/__tests__/pipeline/trailingCalloutBalance.test.js +60 -0
  34. package/dist/__tests__/pipeline/trailingCalloutBalance.test.js.map +1 -0
  35. package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -1
  36. package/dist/canvas-backend/renderResourceBlock.js +13 -1
  37. package/dist/canvas-backend/renderResourceBlock.js.map +1 -1
  38. package/dist/defaults/calloutStyles.d.ts +1 -0
  39. package/dist/defaults/calloutStyles.d.ts.map +1 -1
  40. package/dist/defaults/calloutStyles.js +6 -0
  41. package/dist/defaults/calloutStyles.js.map +1 -1
  42. package/dist/defaults/index.d.ts +1 -1
  43. package/dist/defaults/index.d.ts.map +1 -1
  44. package/dist/defaults/index.js +1 -1
  45. package/dist/defaults/index.js.map +1 -1
  46. package/dist/defaults/tableStyle.d.ts +7 -1
  47. package/dist/defaults/tableStyle.d.ts.map +1 -1
  48. package/dist/defaults/tableStyle.js +35 -1
  49. package/dist/defaults/tableStyle.js.map +1 -1
  50. package/dist/html-backend.d.ts.map +1 -1
  51. package/dist/html-backend.js +32 -19
  52. package/dist/html-backend.js.map +1 -1
  53. package/dist/index.d.ts +4 -4
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +2 -2
  56. package/dist/index.js.map +1 -1
  57. package/dist/knuthPlass/breakpoints.d.ts.map +1 -1
  58. package/dist/knuthPlass/breakpoints.js +6 -2
  59. package/dist/knuthPlass/breakpoints.js.map +1 -1
  60. package/dist/knuthPlass/constants.d.ts +3 -1
  61. package/dist/knuthPlass/constants.d.ts.map +1 -1
  62. package/dist/knuthPlass/constants.js +3 -1
  63. package/dist/knuthPlass/constants.js.map +1 -1
  64. package/dist/pipeline/bandCaps.d.ts +4 -2
  65. package/dist/pipeline/bandCaps.d.ts.map +1 -1
  66. package/dist/pipeline/bandCaps.js +5 -3
  67. package/dist/pipeline/bandCaps.js.map +1 -1
  68. package/dist/pipeline/build.d.ts.map +1 -1
  69. package/dist/pipeline/build.js +547 -104
  70. package/dist/pipeline/build.js.map +1 -1
  71. package/dist/pipeline/calloutLayout.d.ts +7 -0
  72. package/dist/pipeline/calloutLayout.d.ts.map +1 -1
  73. package/dist/pipeline/calloutLayout.js +36 -6
  74. package/dist/pipeline/calloutLayout.js.map +1 -1
  75. package/dist/pipeline/columnBalancing.d.ts +17 -1
  76. package/dist/pipeline/columnBalancing.d.ts.map +1 -1
  77. package/dist/pipeline/columnBalancing.js +72 -2
  78. package/dist/pipeline/columnBalancing.js.map +1 -1
  79. package/dist/pipeline/config.js +1 -1
  80. package/dist/pipeline/config.js.map +1 -1
  81. package/dist/pipeline/floatPlacement.d.ts +4 -0
  82. package/dist/pipeline/floatPlacement.d.ts.map +1 -1
  83. package/dist/pipeline/floatPlacement.js.map +1 -1
  84. package/dist/pipeline/resourceLayout.d.ts +55 -1
  85. package/dist/pipeline/resourceLayout.d.ts.map +1 -1
  86. package/dist/pipeline/resourceLayout.js +394 -30
  87. package/dist/pipeline/resourceLayout.js.map +1 -1
  88. package/dist/table/model.d.ts +7 -1
  89. package/dist/table/model.d.ts.map +1 -1
  90. package/dist/table/model.js +22 -0
  91. package/dist/table/model.js.map +1 -1
  92. package/dist/types.d.ts +48 -5
  93. package/dist/types.d.ts.map +1 -1
  94. package/dist/vdt.d.ts +55 -0
  95. package/dist/vdt.d.ts.map +1 -1
  96. package/dist/vdt.js.map +1 -1
  97. package/package.json +1 -1
@@ -71,6 +71,7 @@ describe("package exports", () => {
71
71
  "mergeCells",
72
72
  "unmergeCell",
73
73
  "setCellContent",
74
+ "setCellImage",
74
75
  "setAlignment",
75
76
  "parseTSV",
76
77
  "extractFrontmatter",
@@ -94,6 +95,7 @@ describe("package exports", () => {
94
95
  "stripHeadingsDefaults",
95
96
  "resolveTableStyleConfig",
96
97
  "stripTableStyleDefaults",
98
+ "defaultTableContinuationStrings",
97
99
  "resolveCaptionStyleConfig",
98
100
  "stripCaptionStyleDefaults",
99
101
  "mergeCaptionStyle",
@@ -1 +1 @@
1
- {"version":3,"file":"exports.test.js","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"exports.test.js","sourceRoot":"","sources":["../../src/__tests__/exports.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=calloutOverflow.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calloutOverflow.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/pipeline/calloutOverflow.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,189 @@
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
+ const SENTENCE = 'La linterna del faro debe permanecer encendida toda la noche para guiar a los barcos que cruzan la bahía. ';
17
+ const filler = (n) => SENTENCE.repeat(n).trim();
18
+ const mm = (value) => ({ value, unit: 'mm' });
19
+ const ICON = '★';
20
+ const noteStyle = (extra = {}) => [{ id: 'note', title: '', span: 'column', icon: { kind: 'glyph', glyph: ICON }, ...extra }];
21
+ /** Small single-column page (~11 body lines). */
22
+ const SMALL_PAGE = (extra = {}) => ({
23
+ headings: { balancing: { enabled: false } },
24
+ page: { width: mm(120), height: mm(70), margins: { top: mm(10), bottom: mm(10), left: mm(10), right: mm(10) } },
25
+ layout: { layoutType: 'single' },
26
+ calloutStyles: noteStyle(extra),
27
+ });
28
+ /** Two-column page, ~23 grid lines tall, balancing off. */
29
+ const TWO_COL = (extra = {}) => ({
30
+ headings: { balancing: { enabled: false }, levels: [{ level: 1, breakBefore: { enabled: false } }] },
31
+ page: { width: mm(160), height: mm(120), margins: { top: mm(10), bottom: mm(10), left: mm(10), right: mm(10) } },
32
+ layout: { layoutType: 'double' },
33
+ calloutStyles: noteStyle(extra),
34
+ });
35
+ const note = (text) => [':::callout{type="note"}', text, ':::'].join('\n');
36
+ const figure = (id, w, h, span) => ({
37
+ id,
38
+ typeId: 'figure',
39
+ kind: 'bitmap',
40
+ caption: `Figure ${id}.`,
41
+ createdAt: 0,
42
+ updatedAt: 0,
43
+ bitmap: { fileId: `${id}.png`, format: 'png', width: w, height: h },
44
+ placement: { span },
45
+ });
46
+ const build = (md, config, resources = []) => buildDocument({ markdown: md, resources }, config, createMeasurementCache());
47
+ const frames = (doc) => doc.blocks.filter((b) => b.type === 'callout');
48
+ const childrenOf = (doc, frame) => doc.blocks.filter((b) => b.containerId === frame.containerId && b.type !== 'callout'
49
+ && b.pageIndex === frame.pageIndex && b.columnIndex === frame.columnIndex);
50
+ const linesOf = (doc, frame) => childrenOf(doc, frame).reduce((n, b) => n + b.lines.length, 0);
51
+ const iconBlocks = (frame) => (frame.designOverlay?.blocks ?? []).filter((b) => b.kind === 'text' && b.lines.some((l) => l.text.includes(ICON))).length;
52
+ const floatsOf = (doc) => doc.pages.flatMap((p) => (p.floats ?? []).map((b) => ({ page: p.index, block: b, id: b.resourceBlock.resource.id })));
53
+ describe('splittable box cut inside a paragraph', () => {
54
+ it('splits a one-paragraph note between its lines, at least two lines on each side', () => {
55
+ // 8 lines of text, then a note whose single paragraph runs 5 lines:
56
+ // three fit at the foot of the page, two go on.
57
+ const md = `${filler(8)}\n\n${note(filler(6))}`;
58
+ const doc = build(md, SMALL_PAGE({ keepTogether: false }));
59
+ const fs = frames(doc);
60
+ expect(fs.length).toBe(2);
61
+ const [head, tail] = fs;
62
+ expect(head.pageIndex).toBe(0);
63
+ expect(tail.pageIndex).toBe(1);
64
+ const headLines = linesOf(doc, head);
65
+ const tailLines = linesOf(doc, tail);
66
+ expect(headLines).toBeGreaterThanOrEqual(2);
67
+ expect(tailLines).toBeGreaterThanOrEqual(2);
68
+ // Same paragraph on both sides: one child each, the whole text once.
69
+ const whole = build(note(filler(6)), SMALL_PAGE({ keepTogether: false }));
70
+ expect(headLines + tailLines).toBe(linesOf(whole, frames(whole)[0]));
71
+ expect(childrenOf(doc, head)).toHaveLength(1);
72
+ expect(childrenOf(doc, tail)).toHaveLength(1);
73
+ // The continuation drops the icon; the head keeps it.
74
+ expect(iconBlocks(head)).toBe(1);
75
+ expect(iconBlocks(tail)).toBe(0);
76
+ // Both fragments sit inside their page.
77
+ for (const f of fs) {
78
+ const page = doc.pages[f.pageIndex];
79
+ expect(f.bbox.y + f.bbox.height).toBeLessThanOrEqual(page.contentArea.y + page.contentArea.height + 0.01);
80
+ }
81
+ }, 30000);
82
+ it('never leaves fewer than splitMinLines on a side: moves whole instead', () => {
83
+ // Same page: the 5-line note can leave 4 + 1 or 3 + 2 lines at the foot.
84
+ const md = `${filler(8)}\n\n${note(filler(6))}`;
85
+ const strict = build(md, SMALL_PAGE({ keepTogether: false, splitMinLines: 3 }));
86
+ const lax = build(md, SMALL_PAGE({ keepTogether: false, splitMinLines: 1 }));
87
+ // Minimum 1: the deepest cut, a lone line going on. Minimum 3: no cut
88
+ // leaves three lines on both sides, so the box moves whole.
89
+ const lf = frames(lax);
90
+ expect(lf).toHaveLength(2);
91
+ expect(linesOf(lax, lf[0])).toBe(4);
92
+ expect(linesOf(lax, lf[1])).toBe(1);
93
+ const sf = frames(strict);
94
+ expect(sf).toHaveLength(1);
95
+ expect(sf[0].pageIndex).toBe(1);
96
+ expect(linesOf(strict, sf[0])).toBe(5);
97
+ }, 30000);
98
+ });
99
+ describe('keep-together box in a column cut short by floats', () => {
100
+ it('moves to the next page instead of overflowing, and a box taller than a column warns', () => {
101
+ // Left column: a paragraph referencing a tall column figure and a
102
+ // page-span figure, then a short paragraph (so the floats settle before
103
+ // the box comes), then a keep-together note. The figure takes the head
104
+ // of the right column, the span figure the page foot; the note does not
105
+ // fit the sliver between them.
106
+ const resources = [figure('f1', 400, 700, 'column'), figure('f2', 400, 200, 'page')];
107
+ const md = `Intro :ref{id="f1"} and :ref{id="f2"} text. ${filler(14)}\n\nShort.\n\n${note(filler(7))}\n\n${filler(4)}`;
108
+ const doc = build(md, TWO_COL(), resources);
109
+ const fs = frames(doc);
110
+ expect(fs).toHaveLength(1);
111
+ const f = fs[0];
112
+ // The figure took the head of the right column, which is now too
113
+ // short for the box: it opens the next page instead of overflowing.
114
+ const f1 = floatsOf(doc).find((x) => x.id === 'f1');
115
+ expect(f1.page).toBe(0);
116
+ expect(f1.block.columnIndex).toBe(1);
117
+ expect(f.pageIndex).toBe(1);
118
+ const page = doc.pages[f.pageIndex];
119
+ // Placed whole inside its page, never past the column's foot.
120
+ expect(f.bbox.y + f.bbox.height).toBeLessThanOrEqual(page.contentArea.y + page.contentArea.height + 0.01);
121
+ const col = page.columns[f.columnIndex];
122
+ expect(f.bbox.y + f.bbox.height).toBeLessThanOrEqual(col.bbox.y + col.bbox.height + 0.01);
123
+ expect(doc.warnings ?? []).toHaveLength(0);
124
+ // A box taller than any column is placed anyway and reported.
125
+ const tall = build(note(filler(40)), SMALL_PAGE());
126
+ expect(frames(tall)).toHaveLength(1);
127
+ expect(tall.warnings).toBeDefined();
128
+ expect(tall.warnings[0].kind).toBe('calloutOverflow');
129
+ expect(tall.warnings[0].overflowPx).toBeGreaterThan(0);
130
+ expect(tall.warnings[0].sourceStart).toBe(0);
131
+ }, 30000);
132
+ });
133
+ describe('continuation fragment closing a column under a figure', () => {
134
+ it('is levered down so its foot meets the foot of the head in the column before', () => {
135
+ // Left column: text, then a splittable note whose head closes the
136
+ // column. Right column: a figure at the head, then the note's tail;
137
+ // a keep-together box after it does not fit and opens the next page,
138
+ // so the tail closes the column with a gap under it.
139
+ const resources = [figure('f1', 400, 500, 'column'), figure('f2', 400, 200, 'page')];
140
+ const config = {
141
+ ...TWO_COL({ keepTogether: false }),
142
+ headings: { levels: [{ level: 1, breakBefore: { enabled: false } }] },
143
+ };
144
+ config.calloutStyles = [...(config.calloutStyles ?? []), { id: 'kt', title: 'Puntos clave', span: 'column', keepTogether: true }];
145
+ const kt = [':::callout{type="kt"}', filler(12), ':::'].join('\n');
146
+ const md = `Intro :ref{id="f1"} and :ref{id="f2"} text. ${filler(18)}\n\n${note(filler(8))}\n\n${kt}\n\n${filler(4)}`;
147
+ const doc = build(md, config, resources);
148
+ const parts = frames(doc).filter((f) => f.callout?.styleId === 'note');
149
+ expect(parts).toHaveLength(2);
150
+ const [head, tail] = parts;
151
+ expect(head.pageIndex).toBe(0);
152
+ expect(head.columnIndex).toBe(0);
153
+ expect(tail.pageIndex).toBe(0);
154
+ expect(tail.columnIndex).toBe(1);
155
+ const f1 = floatsOf(doc).find((x) => x.id === 'f1');
156
+ expect(f1.page).toBe(0);
157
+ expect(f1.block.columnIndex).toBe(1);
158
+ // Under the figure, and bottom-aligned with the head's foot.
159
+ expect(tail.bbox.y).toBeGreaterThan(f1.block.bbox.y + f1.block.bbox.height);
160
+ const headFoot = head.bbox.y + head.bbox.height;
161
+ const tailFoot = tail.bbox.y + tail.bbox.height;
162
+ expect(Math.abs(tailFoot - headFoot)).toBeLessThan(0.5);
163
+ // Nothing else shares the column with the tail.
164
+ const col = doc.pages[0].columns[1];
165
+ expect(col.blocks.every((b) => b.containerId === tail.containerId)).toBe(true);
166
+ expect(doc.warnings ?? []).toHaveLength(0);
167
+ }, 60000);
168
+ });
169
+ describe('floats yield to a keep-together box', () => {
170
+ it('a column figure defers to the next page when its slot would push the box off the page', () => {
171
+ const resources = [figure('f1', 400, 700, 'column'), figure('f2', 400, 200, 'page')];
172
+ // The note comes right after the referencing paragraph, which fills the
173
+ // left column: without the yield rule f1 would take the head of the
174
+ // right column and the note could not follow it on this page.
175
+ const md = `Intro :ref{id="f1"} and :ref{id="f2"} text. ${filler(15)}\n\n${note(filler(7))}\n\n${filler(6)}`;
176
+ const doc = build(md, TWO_COL(), resources);
177
+ const f = frames(doc)[0];
178
+ const f1 = floatsOf(doc).find((x) => x.id === 'f1');
179
+ const f2 = floatsOf(doc).find((x) => x.id === 'f2');
180
+ expect(f2.page).toBe(0);
181
+ expect(f.pageIndex).toBe(0);
182
+ expect(f.columnIndex).toBe(1);
183
+ expect(f1.page).toBe(1);
184
+ // A splittable note takes no such precedence: the figure keeps its slot.
185
+ const split = build(md, TWO_COL({ keepTogether: false }), resources);
186
+ expect(floatsOf(split).find((x) => x.id === 'f1').page).toBe(0);
187
+ }, 30000);
188
+ });
189
+ //# sourceMappingURL=calloutOverflow.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"calloutOverflow.test.js","sourceRoot":"","sources":["../../../src/__tests__/pipeline/calloutOverflow.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=spanBoxHeadAfterCut.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spanBoxHeadAfterCut.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/pipeline/spanBoxHeadAfterCut.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,96 @@
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
+ const SENTENCE = 'La linterna del faro debe permanecer encendida toda la noche para guiar a los barcos que cruzan la bahía. ';
17
+ const filler = (n) => SENTENCE.repeat(n).trim();
18
+ const mm = (value) => ({ value, unit: 'mm' });
19
+ /** Two-column page, ~23.6 grid lines tall, with a splittable page-span
20
+ * barrier box style (a chapter's "key points"). */
21
+ const CFG = {
22
+ headings: { balancing: { enabled: true } },
23
+ page: { width: mm(160), height: mm(120), margins: { top: mm(10), bottom: mm(10), left: mm(10), right: mm(10) } },
24
+ layout: { layoutType: 'double' },
25
+ calloutStyles: [{ id: 'key', name: 'Key', span: 'page', floatBarrier: true, keepTogether: false }],
26
+ };
27
+ /** A column figure ~12 lines tall with its caption. */
28
+ const figure = {
29
+ id: 'f1',
30
+ typeId: 'figure',
31
+ kind: 'bitmap',
32
+ caption: 'Conceptos clave de la CIF y del marco de trabajo y su relación.',
33
+ createdAt: 0,
34
+ updatedAt: 0,
35
+ bitmap: { fileId: 'f1.png', format: 'png', width: 1400, height: 1000 },
36
+ };
37
+ /** Three one-line items: a box of a few lines. */
38
+ const SMALL_BOX = [':::callout{type="key" title="Puntos clave"}', '- Uno.', '- Dos.', '- Tres.', ':::'].join('\n');
39
+ /** Six two-line items: too tall to fit whole under the figure. */
40
+ const KEY_POINTS = [':::callout{type="key" title="Puntos clave"}', ...Array.from({ length: 6 }, () => `- ${filler(4)}`), ':::'].join('\n');
41
+ /** Page 0 fills with text; on page 1 the closing text takes nine lines of
42
+ * the first column, the figure the head of the second, then the box. */
43
+ const md = [filler(49), '', filler(5), '', 'En la :ref{id="f1"} se resumen los conceptos clave.', '', KEY_POINTS, '', '## BIBLIOGRAFÍA', '', filler(6)].join('\n');
44
+ describe('a splittable span box after text beside a column figure', () => {
45
+ it('a short closing text beside a much taller figure: the box cuts under both on the same page', () => {
46
+ // Eight lines of text in the first column, a ~15-line figure heading the
47
+ // second: no cut can level them, so a box that fits goes under both.
48
+ const short = [filler(49), '', filler(5), '', 'En la :ref{id="f1"} se resumen los conceptos clave.', '', SMALL_BOX, '', '## BIBLIOGRAFÍA', '', filler(6)].join('\n');
49
+ const tall = { ...figure, bitmap: { fileId: 'f1.png', format: 'png', width: 1400, height: 1100 } };
50
+ const doc = buildDocument({ markdown: short, resources: [tall] }, CFG, createMeasurementCache());
51
+ const page = doc.pages[1];
52
+ const fl = (page.floats ?? []).find((f) => f.resourceBlock?.resource.id === 'f1');
53
+ expect(fl).toBeDefined();
54
+ expect(fl.bbox.y).toBeCloseTo(page.contentArea.y, 5);
55
+ const head = doc.blocks.find((b) => b.type === 'callout');
56
+ expect(head.pageIndex).toBe(1);
57
+ expect(page.columns[head.columnIndex].kind).toBe('span');
58
+ expect(head.bbox.y).toBeGreaterThanOrEqual(fl.bbox.y + fl.bbox.height - 1e-6);
59
+ }, 30000);
60
+ it('a box that does not fit under text and figure moves on; the figure keeps its page beside the text', () => {
61
+ const short = [filler(49), '', filler(5), '', 'En la :ref{id="f1"} se resumen los conceptos clave.', '', KEY_POINTS, '', '## BIBLIOGRAFÍA', '', filler(6)].join('\n');
62
+ const tall = { ...figure, bitmap: { fileId: 'f1.png', format: 'png', width: 1400, height: 1500 } };
63
+ const doc = buildDocument({ markdown: short, resources: [tall] }, CFG, createMeasurementCache());
64
+ const page = doc.pages[1];
65
+ const fl = (page.floats ?? []).find((f) => f.resourceBlock?.resource.id === 'f1');
66
+ expect(fl).toBeDefined();
67
+ expect(fl.bbox.y).toBeCloseTo(page.contentArea.y, 5);
68
+ // The text stays on the page beside it.
69
+ expect(page.columns.some((c) => c.kind !== 'span' && c.blocks.length > 0)).toBe(true);
70
+ const head = doc.blocks.find((b) => b.type === 'callout');
71
+ expect(head.pageIndex).toBe(2);
72
+ }, 30000);
73
+ it('cuts the band under the text and figure and opens there, the rest on the next page', () => {
74
+ const doc = buildDocument({ markdown: md, resources: [figure] }, CFG, createMeasurementCache());
75
+ const page = doc.pages[1];
76
+ // The figure floats at the head of the second column.
77
+ const fl = (page.floats ?? []).find((f) => f.resourceBlock?.resource.id === 'f1');
78
+ expect(fl).toBeDefined();
79
+ expect(fl.bbox.y).toBeCloseTo(page.contentArea.y, 5);
80
+ // The box's head is a span column on that page, under the figure.
81
+ const frames = doc.blocks.filter((b) => b.type === 'callout');
82
+ expect(frames.length).toBe(2);
83
+ const head = frames.find((f) => f.callout?.part === 0 || f.callout?.part === undefined) ?? frames[0];
84
+ expect(head.pageIndex).toBe(1);
85
+ expect(page.columns[head.columnIndex].kind).toBe('span');
86
+ expect(head.bbox.y).toBeGreaterThanOrEqual(fl.bbox.y + fl.bbox.height - 1e-6);
87
+ // The rest continues on page 2, the bibliography after it.
88
+ const rest = frames.find((f) => f !== head);
89
+ expect(rest.pageIndex).toBe(2);
90
+ expect(rest.callout?.part).toBe(1);
91
+ const heading = doc.blocks.find((b) => b.type === 'heading');
92
+ expect(heading.pageIndex).toBe(2);
93
+ expect(heading.bbox.y).toBeGreaterThan(rest.bbox.y);
94
+ }, 30000);
95
+ });
96
+ //# sourceMappingURL=spanBoxHeadAfterCut.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spanBoxHeadAfterCut.test.js","sourceRoot":"","sources":["../../../src/__tests__/pipeline/spanBoxHeadAfterCut.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=spanFloatAtCut.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spanFloatAtCut.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/pipeline/spanFloatAtCut.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,155 @@
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, balancing on. */
22
+ const CFG = {
23
+ headings: { balancing: { enabled: true } },
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 page-span figure `height` px tall at 1400 px wide (≈ 1654 px placed). */
28
+ const figure = (height) => ({
29
+ id: 'f1',
30
+ typeId: 'figure',
31
+ kind: 'bitmap',
32
+ caption: 'Escala de valoración.',
33
+ createdAt: 0,
34
+ updatedAt: 0,
35
+ bitmap: { fileId: 'f1.png', format: 'png', width: 1400, height },
36
+ placement: { span: 'page' },
37
+ });
38
+ /** ~7 grid lines at the page width. */
39
+ const KEY_POINTS = [':::callout{type="key" span="page" title="Puntos clave"}', filler(2), '', '- Uno.', '- Dos.', ':::'].join('\n');
40
+ /** Page 0 fills with text; the closing text (5 lines), the figure reference,
41
+ * the key-points box and a bibliography land on page 1 — the way a
42
+ * chapter closes in the reference book. */
43
+ const closing = (fig) => ({
44
+ markdown: [filler(49), '', filler(2), '', 'Ver :ref{id="f1"} aquí.', '', KEY_POINTS, '', '## BIBLIOGRAFÍA', '', filler(6)].join('\n'),
45
+ resources: [fig],
46
+ });
47
+ const build = (fig) => buildDocument(closing(fig), CFG, createMeasurementCache());
48
+ const figureBlock = (doc) => doc.blocks.find((b) => b.resourceBlock?.resource.id === 'f1');
49
+ const boxFrame = (doc) => doc.blocks.find((b) => b.type === 'callout' && b.callout?.part === undefined || (b.type === 'callout' && b.callout?.part === 0));
50
+ const linesOf = (v, page) => (v - page.contentArea.y) / GRID;
51
+ describe('page-span figure before a page-span box', () => {
52
+ it('cuts the band under the balanced text, sets the figure there and the box below it', () => {
53
+ const doc = build(figure(340));
54
+ const page = doc.pages[1];
55
+ // The closing text is balanced across both columns of the first band.
56
+ const band0 = page.columns.filter((c) => c.kind !== 'span' && (c.band ?? 0) === 0);
57
+ expect(band0).toHaveLength(2);
58
+ expect(band0.every((c) => c.blocks.length > 0)).toBe(true);
59
+ const used = band0.map((c) => (c.bbox.height - c.availableHeight) / GRID);
60
+ expect(Math.abs(used[0] - used[1])).toBeLessThanOrEqual(1);
61
+ // The figure is a span block on that page, right under the text — not a float.
62
+ const fig = figureBlock(doc);
63
+ expect(fig).toBeDefined();
64
+ expect(fig.pageIndex).toBe(1);
65
+ expect(page.columns[fig.columnIndex].kind).toBe('span');
66
+ expect(page.floats ?? []).toHaveLength(0);
67
+ const textBottom = Math.max(...band0.map((c) => c.bbox.y + (c.bbox.height - c.availableHeight)));
68
+ expect(fig.bbox.y).toBeGreaterThanOrEqual(textBottom);
69
+ expect(linesOf(fig.bbox.y, page) - linesOf(textBottom, page)).toBeLessThanOrEqual(2);
70
+ // The box follows below the figure on the same page.
71
+ const box = boxFrame(doc);
72
+ expect(box.pageIndex).toBe(1);
73
+ expect(box.bbox.y).toBeGreaterThanOrEqual(fig.bbox.y + fig.bbox.height);
74
+ // Bibliography goes on after the box.
75
+ const heading = doc.blocks.find((b) => b.type === 'heading');
76
+ expect(heading.pageIndex).toBeGreaterThanOrEqual(1);
77
+ expect(heading.bbox.y > box.bbox.y || heading.pageIndex > 1).toBe(true);
78
+ }, 30000);
79
+ it('a box that no longer fits under the figure moves on; the figure stays under the text', () => {
80
+ // A taller figure (~15 lines): text 3 + figure 17 leave no room for the box.
81
+ const doc = build(figure(620));
82
+ const page = doc.pages[1];
83
+ const fig = figureBlock(doc);
84
+ expect(fig.pageIndex).toBe(1);
85
+ expect(page.columns[fig.columnIndex].kind).toBe('span');
86
+ const band0 = page.columns.filter((c) => c.kind !== 'span' && (c.band ?? 0) === 0);
87
+ const textBottom = Math.max(...band0.map((c) => c.bbox.y + (c.bbox.height - c.availableHeight)));
88
+ expect(fig.bbox.y).toBeGreaterThanOrEqual(textBottom);
89
+ const box = boxFrame(doc);
90
+ expect(box.pageIndex).toBe(2);
91
+ }, 30000);
92
+ it('a figure that cannot follow the levelled text opens the next page; the text still ends level', () => {
93
+ // Twenty-one lines of closing text (one-line paragraphs) in one column
94
+ // and a ~15-line figure: even balanced (11 + 10) the figure does not
95
+ // fit under the text.
96
+ const closingLines = Array.from({ length: 20 }, () => filler(1)).join('\n\n');
97
+ const doc = buildDocument({
98
+ markdown: [filler(49), '', closingLines, '', 'Ver :ref{id="f1"} aquí.', '', KEY_POINTS, '', '## BIBLIOGRAFÍA', '', filler(6)].join('\n'),
99
+ resources: [figure(620)],
100
+ }, { ...CFG, calloutStyles: [{ id: 'key', name: 'Key', span: 'page', floatBarrier: true, keepTogether: false }] }, createMeasurementCache());
101
+ const page1 = doc.pages[1];
102
+ const band0 = page1.columns.filter((c) => c.kind !== 'span' && (c.band ?? 0) === 0);
103
+ expect(band0).toHaveLength(2);
104
+ expect(band0.every((c) => c.blocks.length > 0)).toBe(true);
105
+ const used = band0.map((c) => (c.bbox.height - c.availableHeight) / GRID);
106
+ expect(Math.abs(used[0] - used[1])).toBeLessThanOrEqual(1);
107
+ expect(page1.floats ?? []).toHaveLength(0);
108
+ // The figure heads page 2 and the box follows it there.
109
+ const fl = (doc.pages[2].floats ?? []).find((f) => f.resourceBlock?.resource.id === 'f1');
110
+ expect(fl).toBeDefined();
111
+ expect(fl.bbox.y).toBeCloseTo(doc.pages[2].contentArea.y, 5);
112
+ const box = doc.blocks.find((b) => b.type === 'callout');
113
+ expect(box.pageIndex).toBe(2);
114
+ expect(box.bbox.y).toBeGreaterThanOrEqual(fl.bbox.y + fl.bbox.height - 1e-6);
115
+ }, 30000);
116
+ it('a column figure before a barrier box: the closing band levels with the figure counted, the figure under the text', () => {
117
+ // Twenty one-line paragraphs, a column figure (~9 lines with its
118
+ // caption) referenced by the last one, a ~10-line box: the band levels
119
+ // at ~15 lines with the figure sitting under the shorter column's text.
120
+ const closingLines = Array.from({ length: 19 }, () => filler(1)).join('\n\n');
121
+ const columnFigure = {
122
+ ...figure(700),
123
+ placement: { span: 'column' },
124
+ };
125
+ const box = [':::callout{type="key" span="page" title="Puntos clave"}', ...Array.from({ length: 5 }, () => `- ${filler(3)}`), ':::'].join('\n');
126
+ const doc = buildDocument({
127
+ markdown: [filler(49), '', closingLines, '', 'Ver :ref{id="f1"} aquí.', '', box, '', '## BIBLIOGRAFÍA', '', filler(6)].join('\n'),
128
+ resources: [columnFigure],
129
+ }, { ...CFG, calloutStyles: [{ id: 'key', name: 'Key', span: 'page', floatBarrier: true, keepTogether: false }] }, createMeasurementCache());
130
+ const page1 = doc.pages[1];
131
+ const fl = (page1.floats ?? []).find((f) => f.resourceBlock?.resource.id === 'f1');
132
+ expect(fl, 'figure on the closing page').toBeDefined();
133
+ const col = page1.columns[fl.columnIndex];
134
+ // The figure hugs the text of its column (within a gap), not the page foot.
135
+ const textBottom = col.bbox.y + (col.bbox.height - col.availableHeight);
136
+ expect(fl.bbox.y - textBottom).toBeLessThanOrEqual(2 * GRID + 0.01);
137
+ expect(fl.bbox.y + fl.bbox.height).toBeLessThan(page1.contentArea.y + page1.contentArea.height - 2 * GRID);
138
+ // Text plus figure level with the other column within a line.
139
+ const other = page1.columns.find((c) => c.kind !== 'span' && c !== col);
140
+ const figBottom = fl.bbox.y + fl.bbox.height;
141
+ const otherBottom = other.bbox.y + (other.bbox.height - other.availableHeight);
142
+ expect(Math.abs(figBottom - otherBottom)).toBeLessThanOrEqual(1.5 * GRID);
143
+ // The box follows below both (or on the next page when it does not fit).
144
+ const boxFrame = doc.blocks.find((b) => b.type === 'callout');
145
+ expect(boxFrame.pageIndex).toBeGreaterThanOrEqual(1);
146
+ if (boxFrame.pageIndex === 1)
147
+ expect(boxFrame.bbox.y).toBeGreaterThanOrEqual(figBottom - 0.01);
148
+ }, 30000);
149
+ it('without a following span box the figure keeps its float slot', () => {
150
+ const doc = buildDocument({ markdown: [filler(49), '', filler(2), '', 'Ver :ref{id="f1"} aquí.', '', filler(6)].join('\n'), resources: [figure(340)] }, CFG, createMeasurementCache());
151
+ expect(figureBlock(doc)).toBeUndefined();
152
+ expect(doc.pages.some((p) => (p.floats ?? []).length > 0)).toBe(true);
153
+ }, 30000);
154
+ });
155
+ //# sourceMappingURL=spanFloatAtCut.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spanFloatAtCut.test.js","sourceRoot":"","sources":["../../../src/__tests__/pipeline/spanFloatAtCut.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=tableCellImages.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tableCellImages.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/pipeline/tableCellImages.test.ts"],"names":[],"mappings":""}