postext 0.3.16 → 0.3.17
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__/createLayout.test.js +12 -13
- package/dist/__tests__/createLayout.test.js.map +1 -1
- package/dist/__tests__/defaults/resourceTypes.test.d.ts +2 -0
- package/dist/__tests__/defaults/resourceTypes.test.d.ts.map +1 -0
- package/dist/__tests__/defaults/resourceTypes.test.js +69 -0
- package/dist/__tests__/defaults/resourceTypes.test.js.map +1 -0
- package/dist/__tests__/exports.test.js +54 -0
- package/dist/__tests__/exports.test.js.map +1 -1
- package/dist/__tests__/parse/inlineRef.test.d.ts +2 -0
- package/dist/__tests__/parse/inlineRef.test.d.ts.map +1 -0
- package/dist/__tests__/parse/inlineRef.test.js +83 -0
- package/dist/__tests__/parse/inlineRef.test.js.map +1 -0
- package/dist/__tests__/parse/resourceDirective.test.d.ts +2 -0
- package/dist/__tests__/parse/resourceDirective.test.d.ts.map +1 -0
- package/dist/__tests__/parse/resourceDirective.test.js +55 -0
- package/dist/__tests__/parse/resourceDirective.test.js.map +1 -0
- package/dist/__tests__/pipeline/floatPlacement.test.d.ts +2 -0
- package/dist/__tests__/pipeline/floatPlacement.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/floatPlacement.test.js +141 -0
- package/dist/__tests__/pipeline/floatPlacement.test.js.map +1 -0
- package/dist/__tests__/pipeline/inlineRefRender.test.d.ts +2 -0
- package/dist/__tests__/pipeline/inlineRefRender.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/inlineRefRender.test.js +107 -0
- package/dist/__tests__/pipeline/inlineRefRender.test.js.map +1 -0
- package/dist/__tests__/pipeline/resourceNumbering.test.d.ts +2 -0
- package/dist/__tests__/pipeline/resourceNumbering.test.d.ts.map +1 -0
- package/dist/__tests__/pipeline/resourceNumbering.test.js +186 -0
- package/dist/__tests__/pipeline/resourceNumbering.test.js.map +1 -0
- package/dist/__tests__/table/model.test.d.ts +2 -0
- package/dist/__tests__/table/model.test.d.ts.map +1 -0
- package/dist/__tests__/table/model.test.js +187 -0
- package/dist/__tests__/table/model.test.js.map +1 -0
- package/dist/canvas-backend/blockRender.d.ts.map +1 -1
- package/dist/canvas-backend/blockRender.js +25 -6
- package/dist/canvas-backend/blockRender.js.map +1 -1
- package/dist/canvas-backend/headerFooter.d.ts +3 -2
- package/dist/canvas-backend/headerFooter.d.ts.map +1 -1
- package/dist/canvas-backend/headerFooter.js +63 -2
- package/dist/canvas-backend/headerFooter.js.map +1 -1
- package/dist/canvas-backend/index.d.ts +2 -0
- package/dist/canvas-backend/index.d.ts.map +1 -1
- package/dist/canvas-backend/index.js +11 -0
- package/dist/canvas-backend/index.js.map +1 -1
- package/dist/canvas-backend/renderResourceBlock.d.ts +28 -0
- package/dist/canvas-backend/renderResourceBlock.d.ts.map +1 -0
- package/dist/canvas-backend/renderResourceBlock.js +146 -0
- package/dist/canvas-backend/renderResourceBlock.js.map +1 -0
- package/dist/defaults/bodyText.d.ts.map +1 -1
- package/dist/defaults/bodyText.js +30 -0
- package/dist/defaults/bodyText.js.map +1 -1
- package/dist/defaults/captionStyle.d.ts +9 -0
- package/dist/defaults/captionStyle.d.ts.map +1 -0
- package/dist/defaults/captionStyle.js +74 -0
- package/dist/defaults/captionStyle.js.map +1 -0
- package/dist/defaults/debug.d.ts.map +1 -1
- package/dist/defaults/debug.js +6 -0
- package/dist/defaults/debug.js.map +1 -1
- package/dist/defaults/headerFooter.d.ts +20 -18
- package/dist/defaults/headerFooter.d.ts.map +1 -1
- package/dist/defaults/headerFooter.js +269 -165
- package/dist/defaults/headerFooter.js.map +1 -1
- package/dist/defaults/headings.d.ts.map +1 -1
- package/dist/defaults/headings.js +29 -6
- package/dist/defaults/headings.js.map +1 -1
- package/dist/defaults/index.d.ts +3 -0
- package/dist/defaults/index.d.ts.map +1 -1
- package/dist/defaults/index.js +19 -0
- package/dist/defaults/index.js.map +1 -1
- package/dist/defaults/resourceTypes.d.ts +8 -0
- package/dist/defaults/resourceTypes.d.ts.map +1 -0
- package/dist/defaults/resourceTypes.js +43 -0
- package/dist/defaults/resourceTypes.js.map +1 -0
- package/dist/defaults/shared.d.ts.map +1 -1
- package/dist/defaults/shared.js +30 -0
- package/dist/defaults/shared.js.map +1 -1
- package/dist/defaults/tableStyle.d.ts +11 -0
- package/dist/defaults/tableStyle.d.ts.map +1 -0
- package/dist/defaults/tableStyle.js +114 -0
- package/dist/defaults/tableStyle.js.map +1 -0
- package/dist/design/layout.d.ts +94 -0
- package/dist/design/layout.d.ts.map +1 -0
- package/dist/design/layout.js +642 -0
- package/dist/design/layout.js.map +1 -0
- package/dist/design/placeholders.d.ts +29 -0
- package/dist/design/placeholders.d.ts.map +1 -0
- package/dist/design/placeholders.js +126 -0
- package/dist/design/placeholders.js.map +1 -0
- package/dist/html-backend.d.ts.map +1 -1
- package/dist/html-backend.js +91 -1
- package/dist/html-backend.js.map +1 -1
- package/dist/index.d.ts +12 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/knuthPlass/richAdapter.d.ts +1 -0
- package/dist/knuthPlass/richAdapter.d.ts.map +1 -1
- package/dist/knuthPlass/richAdapter.js +2 -1
- package/dist/knuthPlass/richAdapter.js.map +1 -1
- package/dist/measure/cache.js +1 -1
- package/dist/measure/cache.js.map +1 -1
- package/dist/measure/rich.d.ts +7 -0
- package/dist/measure/rich.d.ts.map +1 -1
- package/dist/measure/rich.js +30 -0
- package/dist/measure/rich.js.map +1 -1
- package/dist/numbering.d.ts +16 -0
- package/dist/numbering.d.ts.map +1 -1
- package/dist/numbering.js +28 -18
- package/dist/numbering.js.map +1 -1
- package/dist/parse/blockParser.d.ts.map +1 -1
- package/dist/parse/blockParser.js +37 -9
- package/dist/parse/blockParser.js.map +1 -1
- package/dist/parse/inlineFormatting.d.ts +38 -0
- package/dist/parse/inlineFormatting.d.ts.map +1 -1
- package/dist/parse/inlineFormatting.js +84 -0
- package/dist/parse/inlineFormatting.js.map +1 -1
- package/dist/parse/sourceMapping.d.ts.map +1 -1
- package/dist/parse/sourceMapping.js +20 -0
- package/dist/parse/sourceMapping.js.map +1 -1
- package/dist/parse/types.d.ts +20 -1
- package/dist/parse/types.d.ts.map +1 -1
- package/dist/pipeline/build.d.ts.map +1 -1
- package/dist/pipeline/build.js +389 -17
- package/dist/pipeline/build.js.map +1 -1
- package/dist/pipeline/buildBlockKind.d.ts +14 -0
- package/dist/pipeline/buildBlockKind.d.ts.map +1 -1
- package/dist/pipeline/buildBlockKind.js +16 -1
- package/dist/pipeline/buildBlockKind.js.map +1 -1
- package/dist/pipeline/buildHelpers.d.ts.map +1 -1
- package/dist/pipeline/buildHelpers.js +7 -1
- package/dist/pipeline/buildHelpers.js.map +1 -1
- package/dist/pipeline/buildMeasurement.d.ts +17 -1
- package/dist/pipeline/buildMeasurement.d.ts.map +1 -1
- package/dist/pipeline/buildMeasurement.js +32 -0
- package/dist/pipeline/buildMeasurement.js.map +1 -1
- package/dist/pipeline/config.d.ts.map +1 -1
- package/dist/pipeline/config.js +3 -1
- package/dist/pipeline/config.js.map +1 -1
- package/dist/pipeline/floatPlacement.d.ts +45 -0
- package/dist/pipeline/floatPlacement.d.ts.map +1 -0
- package/dist/pipeline/floatPlacement.js +68 -0
- package/dist/pipeline/floatPlacement.js.map +1 -0
- package/dist/pipeline/headerFooter.d.ts +23 -7
- package/dist/pipeline/headerFooter.d.ts.map +1 -1
- package/dist/pipeline/headerFooter.js +258 -100
- package/dist/pipeline/headerFooter.js.map +1 -1
- package/dist/pipeline/placeholders.d.ts +6 -0
- package/dist/pipeline/placeholders.d.ts.map +1 -1
- package/dist/pipeline/placeholders.js +46 -0
- package/dist/pipeline/placeholders.js.map +1 -1
- package/dist/pipeline/placement.d.ts +15 -2
- package/dist/pipeline/placement.d.ts.map +1 -1
- package/dist/pipeline/placement.js +38 -3
- package/dist/pipeline/placement.js.map +1 -1
- package/dist/pipeline/resourceLayout.d.ts +58 -0
- package/dist/pipeline/resourceLayout.d.ts.map +1 -0
- package/dist/pipeline/resourceLayout.js +338 -0
- package/dist/pipeline/resourceLayout.js.map +1 -0
- package/dist/pipeline/resourceNumbering.d.ts +54 -0
- package/dist/pipeline/resourceNumbering.d.ts.map +1 -0
- package/dist/pipeline/resourceNumbering.js +218 -0
- package/dist/pipeline/resourceNumbering.js.map +1 -0
- package/dist/pipeline/styles.d.ts +6 -0
- package/dist/pipeline/styles.d.ts.map +1 -1
- package/dist/pipeline/styles.js +1 -1
- package/dist/pipeline/styles.js.map +1 -1
- package/dist/table/model.d.ts +53 -0
- package/dist/table/model.d.ts.map +1 -0
- package/dist/table/model.js +253 -0
- package/dist/table/model.js.map +1 -0
- package/dist/types.d.ts +397 -41
- package/dist/types.d.ts.map +1 -1
- package/dist/vdt.d.ts +165 -18
- package/dist/vdt.d.ts.map +1 -1
- package/dist/vdt.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resource numbering pipeline (issue #49 §3).
|
|
3
|
+
*
|
|
4
|
+
* Assigns a rendered number string (e.g. `"1.7"`) to every resource referenced
|
|
5
|
+
* in the document. Numbering follows **order of first reference** in reading
|
|
6
|
+
* order — a resource is numbered the first time it is encountered, whether via
|
|
7
|
+
* a `::resource{…}` block embed or an inline `:ref{…}`. Inserting a new
|
|
8
|
+
* reference earlier in the document therefore auto-renumbers the rest.
|
|
9
|
+
*
|
|
10
|
+
* The renderer is shared with heading numbering through
|
|
11
|
+
* {@link renderCounterTemplate}; only the template syntax differs. Resource
|
|
12
|
+
* templates use `{n}` for the per-type counter and `{h1}`..`{h6}` for the
|
|
13
|
+
* heading numbers in effect at the point of first reference.
|
|
14
|
+
*/
|
|
15
|
+
import { formatNumeral, renderCounterTemplate, } from '../numbering';
|
|
16
|
+
const EMPTY_HEADING = { h1: 0, h2: 0, h3: 0, h4: 0, h5: 0, h6: 0 };
|
|
17
|
+
/** Translate a resource `counterFormat` to the shared `NumeralStyle` used by
|
|
18
|
+
* {@link formatNumeral}. The resource model uses `'roman-lower'` style names
|
|
19
|
+
* whereas the numeral formatter uses `'lower-roman'`. */
|
|
20
|
+
function counterFormatToStyle(format) {
|
|
21
|
+
switch (format) {
|
|
22
|
+
case 'decimal':
|
|
23
|
+
return 'decimal';
|
|
24
|
+
case 'roman-lower':
|
|
25
|
+
return 'lower-roman';
|
|
26
|
+
case 'roman-upper':
|
|
27
|
+
return 'upper-roman';
|
|
28
|
+
case 'alpha-lower':
|
|
29
|
+
return 'lower-alpha';
|
|
30
|
+
case 'alpha-upper':
|
|
31
|
+
return 'upper-alpha';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Walk `blocks` and produce, for each block index, the heading counters in
|
|
35
|
+
* effect at that block. A heading at index `i` is reflected in
|
|
36
|
+
* `result[i]` (i.e. the heading counts itself). Mirrors the counter logic in
|
|
37
|
+
* `computeHeadingNumbers` but exposes the raw per-level values rather than the
|
|
38
|
+
* rendered prefix. */
|
|
39
|
+
export function computeHeadingContext(blocks) {
|
|
40
|
+
const counters = [0, 0, 0, 0, 0, 0, 0]; // index 1..6 used
|
|
41
|
+
const out = new Array(blocks.length);
|
|
42
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
43
|
+
const b = blocks[i];
|
|
44
|
+
if (b.type === 'heading' && b.level && b.level >= 1 && b.level <= 6) {
|
|
45
|
+
const lvl = b.level;
|
|
46
|
+
counters[lvl] = (counters[lvl] ?? 0) + 1;
|
|
47
|
+
for (let k = lvl + 1; k <= 6; k++)
|
|
48
|
+
counters[k] = 0;
|
|
49
|
+
}
|
|
50
|
+
out[i] = {
|
|
51
|
+
h1: counters[1] ?? 0,
|
|
52
|
+
h2: counters[2] ?? 0,
|
|
53
|
+
h3: counters[3] ?? 0,
|
|
54
|
+
h4: counters[4] ?? 0,
|
|
55
|
+
h5: counters[5] ?? 0,
|
|
56
|
+
h6: counters[6] ?? 0,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return out;
|
|
60
|
+
}
|
|
61
|
+
/** Parse a resource numbering template into tokens. Recognizes `{n}` (the
|
|
62
|
+
* per-type counter) and `{h1}`..`{h6}` (heading numbers). Backslash escapes a
|
|
63
|
+
* literal `{`, `}`, or `\`. Unknown `{…}` groups are kept as literal text. */
|
|
64
|
+
function parseResourceTemplate(tpl) {
|
|
65
|
+
const tokens = [];
|
|
66
|
+
let buf = '';
|
|
67
|
+
let i = 0;
|
|
68
|
+
const flush = () => {
|
|
69
|
+
if (buf.length > 0) {
|
|
70
|
+
tokens.push({ kind: 'literal', text: buf });
|
|
71
|
+
buf = '';
|
|
72
|
+
}
|
|
73
|
+
};
|
|
74
|
+
while (i < tpl.length) {
|
|
75
|
+
const ch = tpl[i];
|
|
76
|
+
if (ch === '\\' && i + 1 < tpl.length) {
|
|
77
|
+
const next = tpl[i + 1];
|
|
78
|
+
if (next === '{' || next === '}' || next === '\\') {
|
|
79
|
+
buf += next;
|
|
80
|
+
i += 2;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (ch === '{') {
|
|
85
|
+
const end = tpl.indexOf('}', i + 1);
|
|
86
|
+
if (end !== -1) {
|
|
87
|
+
const body = tpl.slice(i + 1, end).trim();
|
|
88
|
+
if (body === 'n') {
|
|
89
|
+
flush();
|
|
90
|
+
tokens.push({ kind: 'counter' });
|
|
91
|
+
i = end + 1;
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
const hMatch = /^h([1-6])$/.exec(body);
|
|
95
|
+
if (hMatch) {
|
|
96
|
+
flush();
|
|
97
|
+
tokens.push({ kind: 'heading', level: Number(hMatch[1]) });
|
|
98
|
+
i = end + 1;
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
buf += ch;
|
|
104
|
+
i++;
|
|
105
|
+
}
|
|
106
|
+
flush();
|
|
107
|
+
return tokens;
|
|
108
|
+
}
|
|
109
|
+
/** Render a resource template against a per-type counter value and the heading
|
|
110
|
+
* context in effect. Empty heading counters collapse their adjacent separators
|
|
111
|
+
* via {@link renderCounterTemplate} (so `{h1}.{n}` with no h1 renders as the
|
|
112
|
+
* bare counter). */
|
|
113
|
+
function renderResourceNumber(tokens, counterValue, style, heading) {
|
|
114
|
+
const pieces = tokens.map((t) => {
|
|
115
|
+
if (t.kind === 'literal')
|
|
116
|
+
return { kind: 'literal', text: t.text };
|
|
117
|
+
if (t.kind === 'counter') {
|
|
118
|
+
return { kind: 'counter', text: formatNumeral(counterValue, style) };
|
|
119
|
+
}
|
|
120
|
+
const value = heading[`h${t.level}`];
|
|
121
|
+
return { kind: 'counter', text: value > 0 ? formatNumeral(value, 'decimal') : '' };
|
|
122
|
+
});
|
|
123
|
+
return renderCounterTemplate(pieces);
|
|
124
|
+
}
|
|
125
|
+
/** Returns true when the heading context crossed a `resetOn` boundary relative
|
|
126
|
+
* to the previous reference — i.e. the heading number at `resetOn`'s level (or
|
|
127
|
+
* any ancestor level) changed. */
|
|
128
|
+
function shouldResetCounter(prev, cur, resetLevel) {
|
|
129
|
+
if (!prev)
|
|
130
|
+
return false;
|
|
131
|
+
// A reset at level L fires whenever the L-level heading number changed, which
|
|
132
|
+
// also covers ancestor changes (ancestors reset descendants' counters to 0,
|
|
133
|
+
// changing them too).
|
|
134
|
+
for (let lvl = 1; lvl <= resetLevel; lvl = (lvl + 1)) {
|
|
135
|
+
const key = `h${lvl}`;
|
|
136
|
+
if (prev[key] !== cur[key])
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
return false;
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Compute the numbering map for every resource referenced in `blocks`.
|
|
143
|
+
*
|
|
144
|
+
* @param blocks parsed content blocks in reading order
|
|
145
|
+
* @param resourceTypes user-defined resource types (drives template + reset)
|
|
146
|
+
* @param resources known resources (maps `resourceId → typeId`)
|
|
147
|
+
* @param headingContext per-block heading counters (see
|
|
148
|
+
* {@link computeHeadingContext}); must align with
|
|
149
|
+
* `blocks` by index
|
|
150
|
+
*/
|
|
151
|
+
export function computeResourceNumbering(blocks, resourceTypes, resources, headingContext) {
|
|
152
|
+
const typeById = new Map();
|
|
153
|
+
for (const t of resourceTypes)
|
|
154
|
+
typeById.set(t.id, t);
|
|
155
|
+
const resourceById = new Map();
|
|
156
|
+
for (const r of resources)
|
|
157
|
+
resourceById.set(r.id, r);
|
|
158
|
+
const firstOccurrences = [];
|
|
159
|
+
const seen = new Set();
|
|
160
|
+
const record = (resourceId, blockIdx) => {
|
|
161
|
+
if (seen.has(resourceId))
|
|
162
|
+
return;
|
|
163
|
+
seen.add(resourceId);
|
|
164
|
+
firstOccurrences.push({
|
|
165
|
+
resourceId,
|
|
166
|
+
heading: headingContext[blockIdx] ?? EMPTY_HEADING,
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
for (let i = 0; i < blocks.length; i++) {
|
|
170
|
+
const b = blocks[i];
|
|
171
|
+
if (b.type === 'resourceBlock' && b.resourceId) {
|
|
172
|
+
record(b.resourceId, i);
|
|
173
|
+
}
|
|
174
|
+
for (const span of b.spans) {
|
|
175
|
+
if (span.ref?.resourceId)
|
|
176
|
+
record(span.ref.resourceId, i);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Partition by typeId (resolved via the resource), preserving first-reference
|
|
180
|
+
// order. Resources with an unknown id or unknown type are skipped.
|
|
181
|
+
const byType = new Map();
|
|
182
|
+
for (const occ of firstOccurrences) {
|
|
183
|
+
const resource = resourceById.get(occ.resourceId);
|
|
184
|
+
if (!resource)
|
|
185
|
+
continue;
|
|
186
|
+
const type = typeById.get(resource.typeId);
|
|
187
|
+
if (!type)
|
|
188
|
+
continue;
|
|
189
|
+
const list = byType.get(type.id);
|
|
190
|
+
if (list)
|
|
191
|
+
list.push(occ);
|
|
192
|
+
else
|
|
193
|
+
byType.set(type.id, [occ]);
|
|
194
|
+
}
|
|
195
|
+
const map = {};
|
|
196
|
+
for (const [typeId, occurrences] of byType) {
|
|
197
|
+
const type = typeById.get(typeId);
|
|
198
|
+
const tokens = parseResourceTemplate(type.numberingTemplate);
|
|
199
|
+
const style = counterFormatToStyle(type.counterFormat);
|
|
200
|
+
const resetLevel = type.resetOn === 'never' ? null : Number(type.resetOn.slice(1));
|
|
201
|
+
let counter = 0;
|
|
202
|
+
let prevHeading = null;
|
|
203
|
+
for (const occ of occurrences) {
|
|
204
|
+
if (resetLevel !== null && shouldResetCounter(prevHeading, occ.heading, resetLevel)) {
|
|
205
|
+
counter = 0;
|
|
206
|
+
}
|
|
207
|
+
counter += 1;
|
|
208
|
+
prevHeading = occ.heading;
|
|
209
|
+
map[occ.resourceId] = {
|
|
210
|
+
number: renderResourceNumber(tokens, counter, style, occ.heading),
|
|
211
|
+
typeId,
|
|
212
|
+
heading: occ.heading,
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return map;
|
|
217
|
+
}
|
|
218
|
+
//# sourceMappingURL=resourceNumbering.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resourceNumbering.js","sourceRoot":"","sources":["../../src/pipeline/resourceNumbering.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,12 @@ export interface BlockStyle {
|
|
|
10
10
|
color: string;
|
|
11
11
|
boldColor?: string;
|
|
12
12
|
italicColor?: string;
|
|
13
|
+
/** Colour for inline `:ref` reference labels. */
|
|
14
|
+
referenceColor?: string;
|
|
15
|
+
/** Whether reference labels render in the bold font. */
|
|
16
|
+
referenceBold?: boolean;
|
|
17
|
+
/** Whether reference labels render italic. */
|
|
18
|
+
referenceItalic?: boolean;
|
|
13
19
|
textAlign: TextAlign;
|
|
14
20
|
hyphenate: boolean;
|
|
15
21
|
marginTopPx: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/pipeline/styles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAI7C,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,UAAU,CAgBrE;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,GACvB,UAAU,CAyBZ;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,GAAG,UAAU,CAqB5E;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,UAAU,CAgB3E"}
|
|
1
|
+
{"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../src/pipeline/styles.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA8B,SAAS,EAAE,MAAM,UAAU,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAI7C,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,8CAA8C;IAC9C,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,SAAS,EAAE,SAAS,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,cAAc,GAAG,UAAU,CAgBrE;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,GACvB,UAAU,CAyBZ;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,cAAc,GAAG,UAAU,CAqB5E;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,cAAc,GAAG,UAAU,CAgB3E"}
|
package/dist/pipeline/styles.js
CHANGED
|
@@ -16,7 +16,7 @@ export function resolveBodyStyle(resolved) {
|
|
|
16
16
|
const firstLineIndentPx = dimensionToPx(resolved.bodyText.firstLineIndent, dpi, fontSizePx);
|
|
17
17
|
const hangingIndent = resolved.bodyText.hangingIndent;
|
|
18
18
|
const marginBottomPx = resolved.bodyText.paragraphSpacing ? lineHeightPx : 0;
|
|
19
|
-
return { fontString, boldFontString, italicFontString, boldItalicFontString, fontSizePx, lineHeightPx, color: resolved.bodyText.color.hex, boldColor: resolved.bodyText.boldColor?.hex, italicColor: resolved.bodyText.italicColor?.hex, textAlign, hyphenate, marginTopPx: 0, marginBottomPx, firstLineIndentPx, hangingIndent };
|
|
19
|
+
return { fontString, boldFontString, italicFontString, boldItalicFontString, fontSizePx, lineHeightPx, color: resolved.bodyText.color.hex, boldColor: resolved.bodyText.boldColor?.hex, italicColor: resolved.bodyText.italicColor?.hex, referenceColor: resolved.bodyText.referenceColor.hex, referenceBold: resolved.bodyText.referenceBold, referenceItalic: resolved.bodyText.referenceItalic, textAlign, hyphenate, marginTopPx: 0, marginBottomPx, firstLineIndentPx, hangingIndent };
|
|
20
20
|
}
|
|
21
21
|
export function resolveHeadingStyle(level, resolved) {
|
|
22
22
|
const dpi = resolved.page.dpi;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/pipeline/styles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"styles.js","sourceRoot":"","sources":["../../src/pipeline/styles.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AA0B/C,MAAM,UAAU,gBAAgB,CAAC,QAAwB;IACvD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9B,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IACvD,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;IAC/D,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IAC7F,MAAM,gBAAgB,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrG,MAAM,oBAAoB,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC7G,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,IAAI,SAAS,KAAK,SAAS,CAAC;IACnF,MAAM,iBAAiB,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IAC5F,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;IACtD,MAAM,cAAc,GAAG,QAAQ,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE,cAAc,EAAE,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,eAAe,EAAE,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,iBAAiB,EAAE,aAAa,EAAE,CAAC;AAC9d,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAa,EACb,QAAwB;IAExB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9B,MAAM,aAAa,GACjB,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC;IAE1F,MAAM,UAAU,GAAG,aAAa,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,aAAa,GAAG,aAAa,CAAC,UAAU,CAAC;IAC/C,IAAI,YAAoB,CAAC;IACzB,IAAI,aAAa,CAAC,IAAI,KAAK,IAAI,IAAI,aAAa,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAChE,YAAY,GAAG,UAAU,GAAG,aAAa,CAAC,KAAK,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,YAAY,GAAG,aAAa,CAAC,aAAa,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IAC/D,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IACnD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC9D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC9D,MAAM,UAAU,GAAG,eAAe,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IAC7F,MAAM,cAAc,GAAG,UAAU,CAAC;IAClC,MAAM,gBAAgB,GAAG,eAAe,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACnG,MAAM,oBAAoB,GAAG,gBAAgB,CAAC;IAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC9C,MAAM,WAAW,GAAG,aAAa,CAAC,aAAa,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,aAAa,CAAC,aAAa,CAAC,YAAY,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IAClF,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,aAAa,CAAC,KAAK,CAAC,GAAG,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,iBAAiB,EAAE,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,CAAC;AAChP,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAwB;IAC9D,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9B,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC;IAChG,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IACvD,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACrF,MAAM,WAAW,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IAC5E,MAAM,cAAc,GAAG,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;IACtE,OAAO;QACL,UAAU;QACV,UAAU;QACV,YAAY;QACZ,KAAK;QACL,SAAS,EAAE,QAAQ;QACnB,SAAS,EAAE,KAAK;QAChB,WAAW;QACX,cAAc;QACd,iBAAiB,EAAE,CAAC;QACpB,aAAa,EAAE,KAAK;KACrB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,QAAwB;IAC7D,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;IAC9B,MAAM,UAAU,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAClE,MAAM,YAAY,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,QAAQ,EAAE,CAAC;IACvD,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/F,MAAM,UAAU,GAAG,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;IAC/D,MAAM,cAAc,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IACvG,wEAAwE;IACxE,MAAM,gBAAgB,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACrG,MAAM,oBAAoB,GAAG,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC7G,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,OAAO,IAAI,SAAS,KAAK,SAAS,CAAC;IACnF,MAAM,iBAAiB,GAAG,aAAa,CAAC,QAAQ,CAAC,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IAC5F,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;IACtD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,iBAAiB,EAAE,aAAa,EAAE,CAAC;AACvN,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { TableCellAlign, TableCellVerticalAlign, TableCellPos, TableModel } from '../types';
|
|
2
|
+
/** Position of a cell within the grid (zero-based row/column). */
|
|
3
|
+
export type CellPos = TableCellPos;
|
|
4
|
+
/** An inclusive rectangular range of cells, defined by two corners. */
|
|
5
|
+
export interface CellRange {
|
|
6
|
+
start: CellPos;
|
|
7
|
+
end: CellPos;
|
|
8
|
+
}
|
|
9
|
+
/** Horizontal alignment of a cell's content. */
|
|
10
|
+
export type Align = TableCellAlign;
|
|
11
|
+
/** Vertical alignment of a cell's content. */
|
|
12
|
+
export type VAlign = TableCellVerticalAlign;
|
|
13
|
+
/**
|
|
14
|
+
* Insert a new (empty) row. `at` is the index the new row will occupy; it is
|
|
15
|
+
* clamped to `[0, rowCount]`, so `at >= rowCount` appends.
|
|
16
|
+
*/
|
|
17
|
+
export declare const addRow: (m: TableModel, at: number) => TableModel;
|
|
18
|
+
/**
|
|
19
|
+
* Insert a new (empty) column. `at` is the index the new column will occupy in
|
|
20
|
+
* every row; it is clamped to `[0, columnCount]`.
|
|
21
|
+
*/
|
|
22
|
+
export declare const addColumn: (m: TableModel, at: number) => TableModel;
|
|
23
|
+
/** Remove the row at `at`. Out-of-range indices leave the model unchanged. */
|
|
24
|
+
export declare const removeRow: (m: TableModel, at: number) => TableModel;
|
|
25
|
+
/** Remove the column at `at`. Out-of-range indices leave the model unchanged. */
|
|
26
|
+
export declare const removeColumn: (m: TableModel, at: number) => TableModel;
|
|
27
|
+
/** Replace the textual content of the cell at `at`. */
|
|
28
|
+
export declare const setCellContent: (m: TableModel, at: CellPos, content: string) => TableModel;
|
|
29
|
+
/**
|
|
30
|
+
* Set (or clear) horizontal / vertical alignment for the cell at `at`. Passing
|
|
31
|
+
* `undefined` for either argument removes that alignment.
|
|
32
|
+
*/
|
|
33
|
+
export declare const setAlignment: (m: TableModel, at: CellPos, align?: Align, vAlign?: VAlign) => TableModel;
|
|
34
|
+
/**
|
|
35
|
+
* Merge every cell in `range` into the top-left (primary) cell. The primary
|
|
36
|
+
* cell receives the appropriate `colSpan`/`rowSpan`; the remaining cells are
|
|
37
|
+
* marked `hiddenBy` the primary position so renderers can skip them. The
|
|
38
|
+
* primary cell's content is preserved. A 1x1 range is a no-op.
|
|
39
|
+
*/
|
|
40
|
+
export declare const mergeCells: (m: TableModel, range: CellRange) => TableModel;
|
|
41
|
+
/**
|
|
42
|
+
* Undo a merge. `at` may be the primary cell of a merge or any cell hidden by
|
|
43
|
+
* one. The primary cell's spans are cleared and all covered cells have their
|
|
44
|
+
* `hiddenBy` markers removed. A non-merged cell is left unchanged.
|
|
45
|
+
*/
|
|
46
|
+
export declare const unmergeCell: (m: TableModel, at: CellPos) => TableModel;
|
|
47
|
+
/**
|
|
48
|
+
* Build a {@link TableModel} from tab-separated text. Rows are split on
|
|
49
|
+
* newlines (CRLF / CR / LF), cells on tabs. Shorter rows are padded with empty
|
|
50
|
+
* cells so the grid is rectangular. Empty input yields an empty model.
|
|
51
|
+
*/
|
|
52
|
+
export declare const parseTSV: (input: string) => TableModel;
|
|
53
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/table/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,cAAc,EACd,sBAAsB,EACtB,YAAY,EACZ,UAAU,EACX,MAAM,UAAU,CAAC;AAElB,kEAAkE;AAClE,MAAM,MAAM,OAAO,GAAG,YAAY,CAAC;AAEnC,uEAAuE;AACvE,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,GAAG,EAAE,OAAO,CAAC;CACd;AAED,gDAAgD;AAChD,MAAM,MAAM,KAAK,GAAG,cAAc,CAAC;AAEnC,8CAA8C;AAC9C,MAAM,MAAM,MAAM,GAAG,sBAAsB,CAAC;AA+D5C;;;GAGG;AACH,eAAO,MAAM,MAAM,GAAI,GAAG,UAAU,EAAE,IAAI,MAAM,KAAG,UAgBlD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,SAAS,GAAI,GAAG,UAAU,EAAE,IAAI,MAAM,KAAG,UAWrD,CAAC;AAEF,8EAA8E;AAC9E,eAAO,MAAM,SAAS,GAAI,GAAG,UAAU,EAAE,IAAI,MAAM,KAAG,UAUrD,CAAC;AAEF,iFAAiF;AACjF,eAAO,MAAM,YAAY,GAAI,GAAG,UAAU,EAAE,IAAI,MAAM,KAAG,UAOxD,CAAC;AAMF,uDAAuD;AACvD,eAAO,MAAM,cAAc,GACzB,GAAG,UAAU,EACb,IAAI,OAAO,EACX,SAAS,MAAM,KACd,UAKF,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,YAAY,GACvB,GAAG,UAAU,EACb,IAAI,OAAO,EACX,QAAQ,KAAK,EACb,SAAS,MAAM,KACd,UAUF,CAAC;AAMF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,GAAG,UAAU,EAAE,OAAO,SAAS,KAAG,UAoC5D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GAAI,GAAG,UAAU,EAAE,IAAI,OAAO,KAAG,UAkCxD,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,KAAG,UAqBxC,CAAC"}
|
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
// ---------------------------------------------------------------------------
|
|
2
|
+
// Internal helpers (all pure)
|
|
3
|
+
// ---------------------------------------------------------------------------
|
|
4
|
+
/** Number of columns in the model (taken from the widest row). */
|
|
5
|
+
const columnCount = (m) => m.rows.reduce((max, row) => Math.max(max, row.length), 0);
|
|
6
|
+
const makeEmptyCell = (isHeader) => isHeader ? { content: '', isHeader: true } : { content: '' };
|
|
7
|
+
/** Shallow-clone a single cell, returning a brand-new object. */
|
|
8
|
+
const cloneCell = (cell) => {
|
|
9
|
+
const next = { content: cell.content };
|
|
10
|
+
if (cell.colSpan !== undefined)
|
|
11
|
+
next.colSpan = cell.colSpan;
|
|
12
|
+
if (cell.rowSpan !== undefined)
|
|
13
|
+
next.rowSpan = cell.rowSpan;
|
|
14
|
+
if (cell.isHeader !== undefined)
|
|
15
|
+
next.isHeader = cell.isHeader;
|
|
16
|
+
if (cell.align !== undefined)
|
|
17
|
+
next.align = cell.align;
|
|
18
|
+
if (cell.verticalAlign !== undefined)
|
|
19
|
+
next.verticalAlign = cell.verticalAlign;
|
|
20
|
+
if (cell.hiddenBy !== undefined) {
|
|
21
|
+
next.hiddenBy = { row: cell.hiddenBy.row, col: cell.hiddenBy.col };
|
|
22
|
+
}
|
|
23
|
+
return next;
|
|
24
|
+
};
|
|
25
|
+
/** Deep-clone the grid so callers may mutate the copy before returning it. */
|
|
26
|
+
const cloneRows = (m) => m.rows.map((row) => row.map(cloneCell));
|
|
27
|
+
/** Build a new model from a (freshly produced) grid, preserving extra fields. */
|
|
28
|
+
const withRows = (m, rows) => {
|
|
29
|
+
const next = { rows };
|
|
30
|
+
if (m.headerRowCount !== undefined)
|
|
31
|
+
next.headerRowCount = m.headerRowCount;
|
|
32
|
+
return next;
|
|
33
|
+
};
|
|
34
|
+
const inBounds = (rows, pos) => pos.row >= 0 &&
|
|
35
|
+
pos.row < rows.length &&
|
|
36
|
+
pos.col >= 0 &&
|
|
37
|
+
pos.col < (rows[pos.row]?.length ?? 0);
|
|
38
|
+
/** Normalize a range so `start` is the top-left and `end` the bottom-right. */
|
|
39
|
+
const normalizeRange = (range) => ({
|
|
40
|
+
start: {
|
|
41
|
+
row: Math.min(range.start.row, range.end.row),
|
|
42
|
+
col: Math.min(range.start.col, range.end.col),
|
|
43
|
+
},
|
|
44
|
+
end: {
|
|
45
|
+
row: Math.max(range.start.row, range.end.row),
|
|
46
|
+
col: Math.max(range.start.col, range.end.col),
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
const samePos = (a, b) => a.row === b.row && a.col === b.col;
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
// Row / column structure
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
/**
|
|
54
|
+
* Insert a new (empty) row. `at` is the index the new row will occupy; it is
|
|
55
|
+
* clamped to `[0, rowCount]`, so `at >= rowCount` appends.
|
|
56
|
+
*/
|
|
57
|
+
export const addRow = (m, at) => {
|
|
58
|
+
const rows = cloneRows(m);
|
|
59
|
+
const cols = columnCount(m);
|
|
60
|
+
const index = Math.max(0, Math.min(at, rows.length));
|
|
61
|
+
const isHeaderRow = m.headerRowCount !== undefined && index < m.headerRowCount;
|
|
62
|
+
const newRow = Array.from({ length: cols }, () => makeEmptyCell(isHeaderRow));
|
|
63
|
+
rows.splice(index, 0, newRow);
|
|
64
|
+
const next = withRows(m, rows);
|
|
65
|
+
if (m.headerRowCount !== undefined && index < m.headerRowCount) {
|
|
66
|
+
next.headerRowCount = m.headerRowCount + 1;
|
|
67
|
+
}
|
|
68
|
+
return next;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Insert a new (empty) column. `at` is the index the new column will occupy in
|
|
72
|
+
* every row; it is clamped to `[0, columnCount]`.
|
|
73
|
+
*/
|
|
74
|
+
export const addColumn = (m, at) => {
|
|
75
|
+
const cols = columnCount(m);
|
|
76
|
+
const index = Math.max(0, Math.min(at, cols));
|
|
77
|
+
const rows = cloneRows(m).map((row, rowIndex) => {
|
|
78
|
+
const isHeaderRow = m.headerRowCount !== undefined && rowIndex < m.headerRowCount;
|
|
79
|
+
const insertAt = Math.min(index, row.length);
|
|
80
|
+
row.splice(insertAt, 0, makeEmptyCell(isHeaderRow));
|
|
81
|
+
return row;
|
|
82
|
+
});
|
|
83
|
+
return withRows(m, rows);
|
|
84
|
+
};
|
|
85
|
+
/** Remove the row at `at`. Out-of-range indices leave the model unchanged. */
|
|
86
|
+
export const removeRow = (m, at) => {
|
|
87
|
+
if (at < 0 || at >= m.rows.length)
|
|
88
|
+
return withRows(m, cloneRows(m));
|
|
89
|
+
const rows = cloneRows(m);
|
|
90
|
+
rows.splice(at, 1);
|
|
91
|
+
const next = withRows(m, rows);
|
|
92
|
+
if (m.headerRowCount !== undefined && at < m.headerRowCount) {
|
|
93
|
+
next.headerRowCount = Math.max(0, m.headerRowCount - 1);
|
|
94
|
+
}
|
|
95
|
+
return next;
|
|
96
|
+
};
|
|
97
|
+
/** Remove the column at `at`. Out-of-range indices leave the model unchanged. */
|
|
98
|
+
export const removeColumn = (m, at) => {
|
|
99
|
+
if (at < 0 || at >= columnCount(m))
|
|
100
|
+
return withRows(m, cloneRows(m));
|
|
101
|
+
const rows = cloneRows(m).map((row) => {
|
|
102
|
+
if (at < row.length)
|
|
103
|
+
row.splice(at, 1);
|
|
104
|
+
return row;
|
|
105
|
+
});
|
|
106
|
+
return withRows(m, rows);
|
|
107
|
+
};
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
// Cell content / alignment
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
/** Replace the textual content of the cell at `at`. */
|
|
112
|
+
export const setCellContent = (m, at, content) => {
|
|
113
|
+
const rows = cloneRows(m);
|
|
114
|
+
if (!inBounds(rows, at))
|
|
115
|
+
return withRows(m, rows);
|
|
116
|
+
rows[at.row][at.col] = { ...rows[at.row][at.col], content };
|
|
117
|
+
return withRows(m, rows);
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Set (or clear) horizontal / vertical alignment for the cell at `at`. Passing
|
|
121
|
+
* `undefined` for either argument removes that alignment.
|
|
122
|
+
*/
|
|
123
|
+
export const setAlignment = (m, at, align, vAlign) => {
|
|
124
|
+
const rows = cloneRows(m);
|
|
125
|
+
if (!inBounds(rows, at))
|
|
126
|
+
return withRows(m, rows);
|
|
127
|
+
const cell = cloneCell(rows[at.row][at.col]);
|
|
128
|
+
if (align === undefined)
|
|
129
|
+
delete cell.align;
|
|
130
|
+
else
|
|
131
|
+
cell.align = align;
|
|
132
|
+
if (vAlign === undefined)
|
|
133
|
+
delete cell.verticalAlign;
|
|
134
|
+
else
|
|
135
|
+
cell.verticalAlign = vAlign;
|
|
136
|
+
rows[at.row][at.col] = cell;
|
|
137
|
+
return withRows(m, rows);
|
|
138
|
+
};
|
|
139
|
+
// ---------------------------------------------------------------------------
|
|
140
|
+
// Merging
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
/**
|
|
143
|
+
* Merge every cell in `range` into the top-left (primary) cell. The primary
|
|
144
|
+
* cell receives the appropriate `colSpan`/`rowSpan`; the remaining cells are
|
|
145
|
+
* marked `hiddenBy` the primary position so renderers can skip them. The
|
|
146
|
+
* primary cell's content is preserved. A 1x1 range is a no-op.
|
|
147
|
+
*/
|
|
148
|
+
export const mergeCells = (m, range) => {
|
|
149
|
+
const rows = cloneRows(m);
|
|
150
|
+
const { start, end } = normalizeRange(range);
|
|
151
|
+
if (!inBounds(rows, start) || !inBounds(rows, end)) {
|
|
152
|
+
return withRows(m, rows);
|
|
153
|
+
}
|
|
154
|
+
const rowSpan = end.row - start.row + 1;
|
|
155
|
+
const colSpan = end.col - start.col + 1;
|
|
156
|
+
if (rowSpan === 1 && colSpan === 1)
|
|
157
|
+
return withRows(m, rows);
|
|
158
|
+
const primaryPos = { row: start.row, col: start.col };
|
|
159
|
+
for (let r = start.row; r <= end.row; r++) {
|
|
160
|
+
for (let c = start.col; c <= end.col; c++) {
|
|
161
|
+
if (c >= rows[r].length)
|
|
162
|
+
continue;
|
|
163
|
+
const pos = { row: r, col: c };
|
|
164
|
+
if (samePos(pos, primaryPos)) {
|
|
165
|
+
const primary = cloneCell(rows[r][c]);
|
|
166
|
+
if (colSpan > 1)
|
|
167
|
+
primary.colSpan = colSpan;
|
|
168
|
+
else
|
|
169
|
+
delete primary.colSpan;
|
|
170
|
+
if (rowSpan > 1)
|
|
171
|
+
primary.rowSpan = rowSpan;
|
|
172
|
+
else
|
|
173
|
+
delete primary.rowSpan;
|
|
174
|
+
delete primary.hiddenBy;
|
|
175
|
+
rows[r][c] = primary;
|
|
176
|
+
}
|
|
177
|
+
else {
|
|
178
|
+
const hidden = cloneCell(rows[r][c]);
|
|
179
|
+
hidden.hiddenBy = { row: primaryPos.row, col: primaryPos.col };
|
|
180
|
+
delete hidden.colSpan;
|
|
181
|
+
delete hidden.rowSpan;
|
|
182
|
+
rows[r][c] = hidden;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
return withRows(m, rows);
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* Undo a merge. `at` may be the primary cell of a merge or any cell hidden by
|
|
190
|
+
* one. The primary cell's spans are cleared and all covered cells have their
|
|
191
|
+
* `hiddenBy` markers removed. A non-merged cell is left unchanged.
|
|
192
|
+
*/
|
|
193
|
+
export const unmergeCell = (m, at) => {
|
|
194
|
+
const rows = cloneRows(m);
|
|
195
|
+
if (!inBounds(rows, at))
|
|
196
|
+
return withRows(m, rows);
|
|
197
|
+
const cell = rows[at.row][at.col];
|
|
198
|
+
const primaryPos = cell.hiddenBy
|
|
199
|
+
? { row: cell.hiddenBy.row, col: cell.hiddenBy.col }
|
|
200
|
+
: { row: at.row, col: at.col };
|
|
201
|
+
if (!inBounds(rows, primaryPos))
|
|
202
|
+
return withRows(m, rows);
|
|
203
|
+
const primary = rows[primaryPos.row][primaryPos.col];
|
|
204
|
+
const colSpan = primary.colSpan ?? 1;
|
|
205
|
+
const rowSpan = primary.rowSpan ?? 1;
|
|
206
|
+
if (colSpan === 1 && rowSpan === 1)
|
|
207
|
+
return withRows(m, rows);
|
|
208
|
+
const cleared = cloneCell(primary);
|
|
209
|
+
delete cleared.colSpan;
|
|
210
|
+
delete cleared.rowSpan;
|
|
211
|
+
rows[primaryPos.row][primaryPos.col] = cleared;
|
|
212
|
+
for (let r = primaryPos.row; r < primaryPos.row + rowSpan; r++) {
|
|
213
|
+
for (let c = primaryPos.col; c < primaryPos.col + colSpan; c++) {
|
|
214
|
+
if (r >= rows.length || c >= rows[r].length)
|
|
215
|
+
continue;
|
|
216
|
+
if (samePos({ row: r, col: c }, primaryPos))
|
|
217
|
+
continue;
|
|
218
|
+
const covered = rows[r][c];
|
|
219
|
+
if (covered.hiddenBy && samePos(covered.hiddenBy, primaryPos)) {
|
|
220
|
+
const restored = cloneCell(covered);
|
|
221
|
+
delete restored.hiddenBy;
|
|
222
|
+
rows[r][c] = restored;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return withRows(m, rows);
|
|
227
|
+
};
|
|
228
|
+
// ---------------------------------------------------------------------------
|
|
229
|
+
// Parsing
|
|
230
|
+
// ---------------------------------------------------------------------------
|
|
231
|
+
/**
|
|
232
|
+
* Build a {@link TableModel} from tab-separated text. Rows are split on
|
|
233
|
+
* newlines (CRLF / CR / LF), cells on tabs. Shorter rows are padded with empty
|
|
234
|
+
* cells so the grid is rectangular. Empty input yields an empty model.
|
|
235
|
+
*/
|
|
236
|
+
export const parseTSV = (input) => {
|
|
237
|
+
const text = input.replace(/\r\n?/g, '\n');
|
|
238
|
+
const lines = text.split('\n');
|
|
239
|
+
// Drop a single trailing empty line (common with trailing newline) but keep
|
|
240
|
+
// intentional blank rows in the middle.
|
|
241
|
+
if (lines.length > 1 && lines[lines.length - 1] === '')
|
|
242
|
+
lines.pop();
|
|
243
|
+
if (lines.length === 0 || (lines.length === 1 && lines[0] === '')) {
|
|
244
|
+
return { rows: [] };
|
|
245
|
+
}
|
|
246
|
+
const grid = lines.map((line) => line.split('\t'));
|
|
247
|
+
const cols = grid.reduce((max, row) => Math.max(max, row.length), 0);
|
|
248
|
+
const rows = grid.map((row) => Array.from({ length: cols }, (_unused, c) => ({
|
|
249
|
+
content: row[c] ?? '',
|
|
250
|
+
})));
|
|
251
|
+
return { rows };
|
|
252
|
+
};
|
|
253
|
+
//# sourceMappingURL=model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../../src/table/model.ts"],"names":[],"mappings":"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"}
|