opentui-markdown-render 0.2.5 → 0.2.6
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/core.js +508 -0
- package/dist/index.js +13828 -0
- package/package.json +15 -5
package/dist/core.js
ADDED
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
// @bun
|
|
2
|
+
// src/core/image.ts
|
|
3
|
+
function standaloneImage(source) {
|
|
4
|
+
const match = /^!\[([^\]]*)\]\((?:<([^>]+)>|([^\s)]+))\)\s*$/.exec(source.trim());
|
|
5
|
+
if (!match)
|
|
6
|
+
return;
|
|
7
|
+
return { alt: match[1] ?? "", href: match[2] ?? match[3] ?? "" };
|
|
8
|
+
}
|
|
9
|
+
// src/core/frame.ts
|
|
10
|
+
import stringWidth from "string-width";
|
|
11
|
+
var frameAligns = ["left", "center", "right"];
|
|
12
|
+
function isFrameAlign(value) {
|
|
13
|
+
return typeof value === "string" && frameAligns.includes(value);
|
|
14
|
+
}
|
|
15
|
+
var frameStyles = ["box", "ascii", "rounded", "heavy", "double"];
|
|
16
|
+
function isFrameStyle(value) {
|
|
17
|
+
return typeof value === "string" && frameStyles.includes(value);
|
|
18
|
+
}
|
|
19
|
+
var borderWidth = 1;
|
|
20
|
+
var noInsets = { left: 0, right: 0, top: 0, bottom: 0 };
|
|
21
|
+
function whole(value, fallback) {
|
|
22
|
+
if (value === undefined)
|
|
23
|
+
return fallback;
|
|
24
|
+
if (!Number.isFinite(value))
|
|
25
|
+
return fallback;
|
|
26
|
+
return Math.max(0, Math.floor(value));
|
|
27
|
+
}
|
|
28
|
+
function alignOffset(align, available, width) {
|
|
29
|
+
if (align === "right")
|
|
30
|
+
return Math.max(0, available - width);
|
|
31
|
+
if (align === "center")
|
|
32
|
+
return Math.max(0, Math.floor((available - width) / 2));
|
|
33
|
+
return 0;
|
|
34
|
+
}
|
|
35
|
+
function fitTitle(title, columns) {
|
|
36
|
+
if (!title || columns <= 0)
|
|
37
|
+
return;
|
|
38
|
+
let result = "";
|
|
39
|
+
for (const character of title) {
|
|
40
|
+
if (stringWidth(result + character) > columns)
|
|
41
|
+
break;
|
|
42
|
+
result += character;
|
|
43
|
+
}
|
|
44
|
+
return result || undefined;
|
|
45
|
+
}
|
|
46
|
+
function resolveFrame(viewport, config) {
|
|
47
|
+
const available = Math.max(1, Math.floor(viewport) || 1);
|
|
48
|
+
const align = config?.align ?? "left";
|
|
49
|
+
const style = config?.style ?? "box";
|
|
50
|
+
const titleAlign = config?.titleAlign ?? "left";
|
|
51
|
+
const enabled = config?.enabled ?? false;
|
|
52
|
+
if (!enabled) {
|
|
53
|
+
return {
|
|
54
|
+
enabled: false,
|
|
55
|
+
contentWidth: available,
|
|
56
|
+
width: available,
|
|
57
|
+
offsetX: 0,
|
|
58
|
+
insets: noInsets,
|
|
59
|
+
align,
|
|
60
|
+
style,
|
|
61
|
+
paddingX: 0,
|
|
62
|
+
paddingY: 0,
|
|
63
|
+
title: undefined,
|
|
64
|
+
titleAlign
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const paddingX = whole(config?.paddingX, 1);
|
|
68
|
+
const paddingY = whole(config?.paddingY, 0);
|
|
69
|
+
const insets = {
|
|
70
|
+
left: borderWidth + paddingX,
|
|
71
|
+
right: borderWidth + paddingX,
|
|
72
|
+
top: borderWidth + paddingY,
|
|
73
|
+
bottom: borderWidth + paddingY
|
|
74
|
+
};
|
|
75
|
+
const minWidth = insets.left + insets.right + 1;
|
|
76
|
+
const width = config?.width === undefined ? available : Math.max(minWidth, Math.min(available, Math.floor(config.width)));
|
|
77
|
+
const contentWidth = Math.max(1, width - insets.left - insets.right);
|
|
78
|
+
return {
|
|
79
|
+
enabled: true,
|
|
80
|
+
contentWidth,
|
|
81
|
+
width,
|
|
82
|
+
offsetX: alignOffset(align, available, width),
|
|
83
|
+
insets,
|
|
84
|
+
align,
|
|
85
|
+
style,
|
|
86
|
+
paddingX,
|
|
87
|
+
paddingY,
|
|
88
|
+
title: fitTitle(config?.title, Math.max(0, width - borderWidth * 2 - 2)),
|
|
89
|
+
titleAlign
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
// src/core/tables.ts
|
|
93
|
+
var tableWidthModes = ["content", "full"];
|
|
94
|
+
function isTableWidthMode(value) {
|
|
95
|
+
return typeof value === "string" && tableWidthModes.includes(value);
|
|
96
|
+
}
|
|
97
|
+
var tableOverflows = ["scroll", "wrap"];
|
|
98
|
+
function isTableOverflow(value) {
|
|
99
|
+
return typeof value === "string" && tableOverflows.includes(value);
|
|
100
|
+
}
|
|
101
|
+
var tableColumnFitters = ["proportional", "balanced"];
|
|
102
|
+
function isTableColumnFitter(value) {
|
|
103
|
+
return typeof value === "string" && tableColumnFitters.includes(value);
|
|
104
|
+
}
|
|
105
|
+
function resolveTableOptions(config) {
|
|
106
|
+
const widthMode = config?.widthMode ?? "content";
|
|
107
|
+
const overflow = config?.overflow ?? "scroll";
|
|
108
|
+
return {
|
|
109
|
+
widthMode,
|
|
110
|
+
overflow,
|
|
111
|
+
columnFitter: config?.columnFitter ?? "balanced",
|
|
112
|
+
cellPaddingX: config?.cellPaddingX ?? 1,
|
|
113
|
+
wrapMode: overflow === "scroll" && widthMode === "content" ? "none" : "word"
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
// src/core/layout.ts
|
|
118
|
+
function createDocumentLayout(input) {
|
|
119
|
+
const frame = resolveFrame(input.viewport, input.frame);
|
|
120
|
+
return {
|
|
121
|
+
frame,
|
|
122
|
+
contentWidth: frame.contentWidth,
|
|
123
|
+
tables: resolveTableOptions(input.tables)
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
// src/core/document.ts
|
|
127
|
+
function assertNever(value) {
|
|
128
|
+
throw new Error(`Unexpected document node: ${String(value)}`);
|
|
129
|
+
}
|
|
130
|
+
// src/core/parse.ts
|
|
131
|
+
import { Marked } from "marked";
|
|
132
|
+
|
|
133
|
+
// src/core/math.ts
|
|
134
|
+
function isEscaped(src, index) {
|
|
135
|
+
let backslashes = 0;
|
|
136
|
+
let i = index - 1;
|
|
137
|
+
while (i >= 0 && src[i] === "\\") {
|
|
138
|
+
backslashes++;
|
|
139
|
+
i--;
|
|
140
|
+
}
|
|
141
|
+
return backslashes % 2 === 1;
|
|
142
|
+
}
|
|
143
|
+
function closing(src, delimiter, start, singleLine) {
|
|
144
|
+
for (let index = start;index < src.length; index++) {
|
|
145
|
+
if (singleLine && src[index] === `
|
|
146
|
+
`)
|
|
147
|
+
break;
|
|
148
|
+
if (src.startsWith(delimiter, index) && !isEscaped(src, index))
|
|
149
|
+
return index;
|
|
150
|
+
}
|
|
151
|
+
return -1;
|
|
152
|
+
}
|
|
153
|
+
function createMathInlineExtension() {
|
|
154
|
+
return {
|
|
155
|
+
name: "mathInline",
|
|
156
|
+
level: "inline",
|
|
157
|
+
start(src) {
|
|
158
|
+
let i = 0;
|
|
159
|
+
while (i < src.length) {
|
|
160
|
+
const ch = src[i];
|
|
161
|
+
if (ch === "\\") {
|
|
162
|
+
if (src[i + 1] === "(") {
|
|
163
|
+
if (!isEscaped(src, i))
|
|
164
|
+
return i;
|
|
165
|
+
}
|
|
166
|
+
i += 2;
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (ch === "$") {
|
|
170
|
+
if (src[i + 1] === "$") {
|
|
171
|
+
i += 2;
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (!isEscaped(src, i))
|
|
175
|
+
return i;
|
|
176
|
+
}
|
|
177
|
+
i++;
|
|
178
|
+
}
|
|
179
|
+
return;
|
|
180
|
+
},
|
|
181
|
+
tokenizer(src) {
|
|
182
|
+
if (src.startsWith("\\(")) {
|
|
183
|
+
const end = closing(src, "\\)", 2, true);
|
|
184
|
+
if (end > 2 && src.slice(2, end).indexOf(`
|
|
185
|
+
`) === -1) {
|
|
186
|
+
const content = src.slice(2, end);
|
|
187
|
+
const raw = src.slice(0, end + 2);
|
|
188
|
+
return {
|
|
189
|
+
type: "mathInline",
|
|
190
|
+
raw,
|
|
191
|
+
text: content,
|
|
192
|
+
content,
|
|
193
|
+
open: "\\(",
|
|
194
|
+
close: "\\)"
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
if (src[0] === "$" && src[1] !== "$") {
|
|
199
|
+
let j = 1;
|
|
200
|
+
while (j < src.length) {
|
|
201
|
+
if (src[j] === `
|
|
202
|
+
`)
|
|
203
|
+
break;
|
|
204
|
+
if (src[j] === "$" && !isEscaped(src, j)) {
|
|
205
|
+
if (j === 1)
|
|
206
|
+
break;
|
|
207
|
+
const content = src.slice(1, j);
|
|
208
|
+
const raw = src.slice(0, j + 1);
|
|
209
|
+
return {
|
|
210
|
+
type: "mathInline",
|
|
211
|
+
raw,
|
|
212
|
+
text: content,
|
|
213
|
+
content,
|
|
214
|
+
open: "$",
|
|
215
|
+
close: "$"
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
j++;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
function createMathDisplayExtension() {
|
|
226
|
+
return {
|
|
227
|
+
name: "mathDisplay",
|
|
228
|
+
level: "inline",
|
|
229
|
+
start(src) {
|
|
230
|
+
let i = 0;
|
|
231
|
+
while (i < src.length) {
|
|
232
|
+
const ch = src[i];
|
|
233
|
+
if (ch === "\\") {
|
|
234
|
+
if (src[i + 1] === "[") {
|
|
235
|
+
if (!isEscaped(src, i))
|
|
236
|
+
return i;
|
|
237
|
+
}
|
|
238
|
+
i += 2;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
if (ch === "$") {
|
|
242
|
+
if (src[i + 1] === "$" && !isEscaped(src, i))
|
|
243
|
+
return i;
|
|
244
|
+
}
|
|
245
|
+
i++;
|
|
246
|
+
}
|
|
247
|
+
return;
|
|
248
|
+
},
|
|
249
|
+
tokenizer(src) {
|
|
250
|
+
if (src.startsWith("$$")) {
|
|
251
|
+
const end = closing(src, "$$", 2, false);
|
|
252
|
+
if (end > 2) {
|
|
253
|
+
const content = src.slice(2, end);
|
|
254
|
+
const raw = src.slice(0, end + 2);
|
|
255
|
+
return {
|
|
256
|
+
type: "mathDisplay",
|
|
257
|
+
raw,
|
|
258
|
+
text: content,
|
|
259
|
+
content,
|
|
260
|
+
open: "$$",
|
|
261
|
+
close: "$$"
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (src.startsWith("\\[")) {
|
|
266
|
+
const end = closing(src, "\\]", 2, false);
|
|
267
|
+
if (end > 2) {
|
|
268
|
+
const content = src.slice(2, end);
|
|
269
|
+
const raw = src.slice(0, end + 2);
|
|
270
|
+
return {
|
|
271
|
+
type: "mathDisplay",
|
|
272
|
+
raw,
|
|
273
|
+
text: content,
|
|
274
|
+
content,
|
|
275
|
+
open: "\\[",
|
|
276
|
+
close: "\\]"
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// src/core/parse.ts
|
|
286
|
+
var parser = new Marked({
|
|
287
|
+
gfm: true,
|
|
288
|
+
breaks: false,
|
|
289
|
+
async: false,
|
|
290
|
+
extensions: [createMathDisplayExtension(), createMathInlineExtension()]
|
|
291
|
+
});
|
|
292
|
+
function isDisplay(token) {
|
|
293
|
+
return token.type === "mathDisplay";
|
|
294
|
+
}
|
|
295
|
+
function isInlineMath(token) {
|
|
296
|
+
return token.type === "mathInline";
|
|
297
|
+
}
|
|
298
|
+
function childrenOf(token) {
|
|
299
|
+
return "tokens" in token && Array.isArray(token.tokens) ? token.tokens : [];
|
|
300
|
+
}
|
|
301
|
+
function inlineToken(token) {
|
|
302
|
+
if (isInlineMath(token)) {
|
|
303
|
+
return [{ type: "math", content: token.content, raw: token.raw, open: token.open, close: token.close }];
|
|
304
|
+
}
|
|
305
|
+
if (isDisplay(token))
|
|
306
|
+
return [{ type: "text", text: token.raw }];
|
|
307
|
+
switch (token.type) {
|
|
308
|
+
case "text":
|
|
309
|
+
return childrenOf(token).length ? convertInline(childrenOf(token)) : [{ type: "text", text: token.text }];
|
|
310
|
+
case "escape":
|
|
311
|
+
return [{ type: "text", text: token.text }];
|
|
312
|
+
case "codespan":
|
|
313
|
+
return [{ type: "code", text: token.text }];
|
|
314
|
+
case "strong":
|
|
315
|
+
case "em":
|
|
316
|
+
case "del":
|
|
317
|
+
return [{ type: token.type, children: convertInline(token.tokens ?? []) }];
|
|
318
|
+
case "link":
|
|
319
|
+
return [{ type: "link", href: token.href, title: token.title ?? null, children: convertInline(token.tokens ?? []) }];
|
|
320
|
+
case "image":
|
|
321
|
+
return [{ type: "inline-image", href: token.href, title: token.title ?? null, alt: token.text }];
|
|
322
|
+
case "br":
|
|
323
|
+
return [{ type: "break", hard: true }];
|
|
324
|
+
case "checkbox":
|
|
325
|
+
return [];
|
|
326
|
+
default:
|
|
327
|
+
return token.raw ? [{ type: "text", text: token.raw }] : [];
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
function convertInline(tokens) {
|
|
331
|
+
return tokens.flatMap(inlineToken);
|
|
332
|
+
}
|
|
333
|
+
function directInline(tokens) {
|
|
334
|
+
return tokens.flatMap((token) => token.type === "text" && childrenOf(token).length ? childrenOf(token) : [token]);
|
|
335
|
+
}
|
|
336
|
+
function convertParagraph(token, source) {
|
|
337
|
+
const tokens = directInline(childrenOf(token));
|
|
338
|
+
const visible = convertInline(tokens).filter((node) => node.type !== "text" || node.text.trim().length > 0);
|
|
339
|
+
if (visible.length === 1 && visible[0].type === "inline-image") {
|
|
340
|
+
const image = visible[0];
|
|
341
|
+
return [{ type: "image", href: image.href, alt: image.alt, title: image.title, raw: token.raw, source }];
|
|
342
|
+
}
|
|
343
|
+
if (!tokens.some(isDisplay))
|
|
344
|
+
return [{ type: "paragraph", children: convertInline(tokens), raw: token.raw, source }];
|
|
345
|
+
const blocks = [];
|
|
346
|
+
let pending = [];
|
|
347
|
+
let offset = source?.start ?? 0;
|
|
348
|
+
let aligned = source !== null;
|
|
349
|
+
let pendingStart = offset;
|
|
350
|
+
const flush = () => {
|
|
351
|
+
if (!pending.length)
|
|
352
|
+
return;
|
|
353
|
+
const raw = pending.map((child) => child.raw).join("");
|
|
354
|
+
const children = convertInline(pending);
|
|
355
|
+
if (children.length)
|
|
356
|
+
blocks.push({ type: "paragraph", raw, source: aligned ? { start: pendingStart, end: offset } : null, children });
|
|
357
|
+
pending = [];
|
|
358
|
+
pendingStart = offset;
|
|
359
|
+
};
|
|
360
|
+
for (const child of tokens) {
|
|
361
|
+
if (aligned && token.raw.slice(offset - source.start, offset - source.start + child.raw.length) !== child.raw)
|
|
362
|
+
aligned = false;
|
|
363
|
+
if (isDisplay(child)) {
|
|
364
|
+
flush();
|
|
365
|
+
offset += child.raw.length;
|
|
366
|
+
blocks.push({
|
|
367
|
+
type: "display-math",
|
|
368
|
+
content: child.content,
|
|
369
|
+
open: child.open,
|
|
370
|
+
close: child.close,
|
|
371
|
+
raw: child.raw,
|
|
372
|
+
source: aligned ? { start: offset - child.raw.length, end: offset } : null
|
|
373
|
+
});
|
|
374
|
+
pendingStart = offset;
|
|
375
|
+
} else {
|
|
376
|
+
pending.push(child);
|
|
377
|
+
offset += child.raw.length;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
flush();
|
|
381
|
+
return blocks;
|
|
382
|
+
}
|
|
383
|
+
function convertBlocks(tokens, source, start = 0) {
|
|
384
|
+
const blocks = [];
|
|
385
|
+
let cursor = start;
|
|
386
|
+
for (const token of tokens) {
|
|
387
|
+
const range = source !== null && source.slice(cursor, cursor + token.raw.length) === token.raw ? { start: cursor, end: cursor + token.raw.length } : null;
|
|
388
|
+
cursor += token.raw.length;
|
|
389
|
+
if (token.type === "space" || token.type === "def" || token.type === "checkbox")
|
|
390
|
+
continue;
|
|
391
|
+
if (isDisplay(token)) {
|
|
392
|
+
blocks.push({ type: "display-math", content: token.content, open: token.open, close: token.close, raw: token.raw, source: range });
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
switch (token.type) {
|
|
396
|
+
case "paragraph":
|
|
397
|
+
case "text":
|
|
398
|
+
blocks.push(...convertParagraph(token, range));
|
|
399
|
+
break;
|
|
400
|
+
case "heading":
|
|
401
|
+
blocks.push({ type: "heading", level: token.depth, children: convertInline(childrenOf(token)), raw: token.raw, source: range });
|
|
402
|
+
break;
|
|
403
|
+
case "blockquote":
|
|
404
|
+
blocks.push({ type: "quote", blocks: convertBlocks(childrenOf(token), null), raw: token.raw, source: range });
|
|
405
|
+
break;
|
|
406
|
+
case "list": {
|
|
407
|
+
const list = token;
|
|
408
|
+
let cursor = 0;
|
|
409
|
+
const items = list.items.map((item) => {
|
|
410
|
+
let itemSource = null;
|
|
411
|
+
if (range !== null && list.raw.slice(cursor, cursor + item.raw.length) === item.raw) {
|
|
412
|
+
itemSource = { start: range.start + cursor, end: range.start + cursor + item.raw.length };
|
|
413
|
+
}
|
|
414
|
+
cursor += item.raw.length;
|
|
415
|
+
return {
|
|
416
|
+
task: item.task,
|
|
417
|
+
checked: item.task ? item.checked ?? false : null,
|
|
418
|
+
loose: item.loose,
|
|
419
|
+
blocks: convertBlocks(item.tokens, null),
|
|
420
|
+
source: itemSource
|
|
421
|
+
};
|
|
422
|
+
});
|
|
423
|
+
blocks.push({
|
|
424
|
+
type: "list",
|
|
425
|
+
raw: list.raw,
|
|
426
|
+
source: range,
|
|
427
|
+
ordered: list.ordered,
|
|
428
|
+
start: list.start === "" ? 1 : list.start,
|
|
429
|
+
loose: list.loose,
|
|
430
|
+
items
|
|
431
|
+
});
|
|
432
|
+
break;
|
|
433
|
+
}
|
|
434
|
+
case "table": {
|
|
435
|
+
const table = token;
|
|
436
|
+
const convertCell = (cell, header, align) => ({
|
|
437
|
+
children: cell ? convertInline(cell.tokens) : [],
|
|
438
|
+
header,
|
|
439
|
+
align
|
|
440
|
+
});
|
|
441
|
+
const align = table.align;
|
|
442
|
+
const header = table.header.map((cell, i) => convertCell(cell, true, align[i] ?? null));
|
|
443
|
+
const rows = table.rows.map((row) => header.map((_, i) => convertCell(row[i], false, align[i] ?? null)));
|
|
444
|
+
blocks.push({ type: "table", align, header, rows, raw: table.raw, source: range });
|
|
445
|
+
break;
|
|
446
|
+
}
|
|
447
|
+
case "code": {
|
|
448
|
+
const language = token.lang ?? null;
|
|
449
|
+
if (language?.trim().split(/\s+/)[0]?.toLowerCase() === "mermaid") {
|
|
450
|
+
blocks.push({ type: "mermaid", content: token.text, language: "mermaid", raw: token.raw, source: range });
|
|
451
|
+
} else {
|
|
452
|
+
blocks.push({ type: "code", content: token.text, language, fenced: /^ {0,3}(?:`{3,}|~{3,})/.test(token.raw), raw: token.raw, source: range });
|
|
453
|
+
}
|
|
454
|
+
break;
|
|
455
|
+
}
|
|
456
|
+
case "hr":
|
|
457
|
+
blocks.push({ type: "rule", raw: token.raw, source: range });
|
|
458
|
+
break;
|
|
459
|
+
default:
|
|
460
|
+
if (token.raw)
|
|
461
|
+
blocks.push({ type: "literal", text: token.raw, raw: token.raw, source: range });
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
return blocks;
|
|
465
|
+
}
|
|
466
|
+
function parseDocument(source) {
|
|
467
|
+
const normalized = source.replace(/\r\n?/g, `
|
|
468
|
+
`);
|
|
469
|
+
const blocks = convertBlocks(parser.lexer(normalized), normalized);
|
|
470
|
+
if (normalized === source)
|
|
471
|
+
return { source, blocks };
|
|
472
|
+
const offsets = [0];
|
|
473
|
+
for (let index = 0;index < source.length; index++) {
|
|
474
|
+
if (source[index] === "\r" && source[index + 1] === `
|
|
475
|
+
`)
|
|
476
|
+
index++;
|
|
477
|
+
offsets.push(index + 1);
|
|
478
|
+
}
|
|
479
|
+
const originalRange = (range) => range === null ? null : { start: offsets[range.start], end: offsets[range.end] };
|
|
480
|
+
const originalBlock = (block) => {
|
|
481
|
+
if (block.type === "list")
|
|
482
|
+
return {
|
|
483
|
+
...block,
|
|
484
|
+
source: originalRange(block.source),
|
|
485
|
+
items: block.items.map((item) => ({ ...item, source: originalRange(item.source) }))
|
|
486
|
+
};
|
|
487
|
+
return { ...block, source: originalRange(block.source) };
|
|
488
|
+
};
|
|
489
|
+
return { source, blocks: blocks.map(originalBlock) };
|
|
490
|
+
}
|
|
491
|
+
export {
|
|
492
|
+
assertNever,
|
|
493
|
+
createDocumentLayout,
|
|
494
|
+
frameAligns,
|
|
495
|
+
frameStyles,
|
|
496
|
+
isFrameAlign,
|
|
497
|
+
isFrameStyle,
|
|
498
|
+
isTableColumnFitter,
|
|
499
|
+
isTableOverflow,
|
|
500
|
+
isTableWidthMode,
|
|
501
|
+
parseDocument,
|
|
502
|
+
resolveFrame,
|
|
503
|
+
resolveTableOptions,
|
|
504
|
+
standaloneImage,
|
|
505
|
+
tableColumnFitters,
|
|
506
|
+
tableOverflows,
|
|
507
|
+
tableWidthModes
|
|
508
|
+
};
|