@w100n/documents 0.15.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@ import {
5
5
  pending,
6
6
  save,
7
7
  seed
8
- } from "./chunk-Z7UNJ4ND.js";
8
+ } from "./chunk-2L3TK7UF.js";
9
9
 
10
10
  // src/editor/live.ts
11
11
  import { HocuspocusProvider } from "@hocuspocus/provider";
@@ -193,4 +193,4 @@ ${id}`, id, kind, doc, host2, { id: me.id, name: me.name, language }, edit) : ne
193
193
  export {
194
194
  useLive
195
195
  };
196
- //# sourceMappingURL=chunk-OXC4PUOC.js.map
196
+ //# sourceMappingURL=chunk-3OLRFIHQ.js.map
@@ -0,0 +1,458 @@
1
+ 'use client';
2
+
3
+ // src/editor/markdown.ts
4
+ import { Marked } from "marked";
5
+ import { MarkdownSerializer } from "prosemirror-markdown";
6
+ var def = /^\[\^([^\]\s]+)\]:[ \t]*([^\n]*(?:\n {4}[^\n]*)*)(?:\n|$)/;
7
+ var defs = new RegExp(def.source.slice(1), "gm");
8
+ var noteOf = (text) => text.replace(/\n {4}/g, "\n").trim();
9
+ var at = (src, find) => {
10
+ const i = src.search(find);
11
+ return i < 0 ? void 0 : i;
12
+ };
13
+ var marked = new Marked({ extensions: [
14
+ { name: "footnoteDef", level: "block", start: (src) => at(src, /^\[\^/m), tokenizer(src) {
15
+ const m = def.exec(src);
16
+ return m ? { type: "footnoteDef", raw: m[0], id: m[1], text: noteOf(m[2]) } : void 0;
17
+ } },
18
+ { name: "footnoteRef", level: "inline", start: (src) => at(src, /\[\^/), tokenizer(src) {
19
+ const m = /^\[\^([^\]\s]+)\]/.exec(src);
20
+ return m ? { type: "footnoteRef", raw: m[0], id: m[1] } : void 0;
21
+ } },
22
+ { name: "math", level: "inline", start: (src) => at(src, /\$/), tokenizer(src) {
23
+ const m = /^\$\$([^$]+?)\$\$|^\$(?![\s$])((?:\\.|[^$\\\n])*?[^\s\\])\$(?!\d)/.exec(src);
24
+ return m ? { type: "math", raw: m[0], text: (m[1] ?? m[2]).trim() } : void 0;
25
+ } }
26
+ ] });
27
+ var notes = /* @__PURE__ */ new Map();
28
+ var tags = { u: "underline", ins: "underline", mark: "highlight", s: "strike", del: "strike", b: "bold", strong: "bold", i: "italic", em: "italic" };
29
+ var decode = (text) => text.includes("&") ? new DOMParser().parseFromString(`<p>${text.replace(/</g, "&lt;")}</p>`, "text/html").body.textContent ?? text : text;
30
+ var unique = (marks) => [...new Map(marks.map((m) => [m.type, m])).values()];
31
+ function inline(tokens = [], outer = []) {
32
+ const out = [];
33
+ let open = [];
34
+ const marks = () => unique([...outer, ...open]);
35
+ const text = (value, extra = []) => {
36
+ const set = unique([...marks(), ...extra]);
37
+ const clean = out[out.length - 1]?.type === "hardBreak" ? value.replace(/^\n/, "") : value;
38
+ if (clean) out.push({ type: "text", text: clean, ...set.length ? { marks: set } : {} });
39
+ };
40
+ const wrap = (children, mark) => out.push(...inline(children, [...marks(), mark]));
41
+ for (const token of tokens) {
42
+ if (token.type === "text") {
43
+ if (token.tokens) out.push(...inline(token.tokens, marks()));
44
+ else text(decode(token.text));
45
+ } else if (token.type === "escape") text(decode(token.text));
46
+ else if (token.type === "strong") wrap(token.tokens, { type: "bold" });
47
+ else if (token.type === "em") wrap(token.tokens, { type: "italic" });
48
+ else if (token.type === "del") wrap(token.tokens, { type: "strike" });
49
+ else if (token.type === "codespan") text(token.text, [{ type: "code" }]);
50
+ else if (token.type === "br") out.push({ type: "hardBreak" });
51
+ else if (token.type === "math") out.push({ type: "math", attrs: { latex: token.text } });
52
+ else if (token.type === "footnoteRef") out.push({ type: "footnote", attrs: { id: token.id, text: notes.get(token.id) ?? "" } });
53
+ else if (token.type === "link") wrap(token.tokens, { type: "link", attrs: { href: token.href } });
54
+ else if (token.type === "image") out.push({ type: "image", attrs: { src: token.href, alt: token.text || null, title: token.title || null }, ...marks().length ? { marks: marks() } : {} });
55
+ else if (token.type === "html") {
56
+ const tag = /^<(\/?)([a-z]+)\s*\/?>$/i.exec(token.raw.trim());
57
+ const name = tag?.[2].toLowerCase() ?? "";
58
+ if (name === "br") out.push({ type: "hardBreak" });
59
+ else if (!tags[name]) text(token.raw);
60
+ else open = tag[1] ? open.filter((m) => m.type !== tags[name]) : [...open, { type: tags[name] }];
61
+ } else if (token.type !== "checkbox") text(token.raw);
62
+ }
63
+ return out;
64
+ }
65
+ var fill = (content) => content.length ? content : [{ type: "paragraph" }];
66
+ function block(token, hints) {
67
+ const ref = (hint) => {
68
+ const id = `md${Object.keys(hints).length + 1}`;
69
+ hints[id] = hint;
70
+ return id;
71
+ };
72
+ switch (token.type) {
73
+ case "space":
74
+ case "def":
75
+ case "checkbox":
76
+ case "footnoteDef":
77
+ return [];
78
+ case "html": {
79
+ const m = /^\s*<(p|h[1-6])\s+align="(center|right|justify)"\s*>([\s\S]*?)<\/\1>\s*$/i.exec(token.raw);
80
+ if (!m) return [{ type: "codeBlock", attrs: { language: "html" }, content: [{ type: "text", text: token.raw.replace(/\n+$/, "") }] }];
81
+ const content = inline(marked.Lexer.lexInline(m[3].trim(), marked.defaults));
82
+ const level = Number(m[1][1]);
83
+ return [level ? { type: "heading", attrs: { level, align: m[2] }, content } : { type: "paragraph", attrs: { align: m[2] }, content }];
84
+ }
85
+ case "heading":
86
+ return [{ type: "heading", attrs: { level: token.depth }, content: inline(token.tokens) }];
87
+ case "paragraph":
88
+ case "text":
89
+ return [{ type: "paragraph", content: token.tokens ? inline(token.tokens) : inline([{ type: "text", raw: token.text, text: token.text }]) }];
90
+ case "blockquote":
91
+ return [{ type: "blockquote", content: fill(token.tokens.flatMap((t) => block(t, hints))) }];
92
+ case "code": {
93
+ const fence = /^ {0,3}(`{3,}|~{3,})/.exec(token.raw)?.[1][0];
94
+ return [{ type: "codeBlock", attrs: { language: token.lang || null, ref: fence ? ref({ fence: fence.repeat(3) }) : null }, content: token.text ? [{ type: "text", text: token.text }] : [] }];
95
+ }
96
+ case "hr":
97
+ return [{ type: "horizontalRule" }];
98
+ case "list": {
99
+ const list = token;
100
+ const tasks = list.items.every((entry) => entry.task);
101
+ const marker = /^\s*(?:([-*+])|\d+([.)]))/.exec(list.raw);
102
+ const id = ref({ bullet: marker?.[1], delim: marker?.[2], loose: list.loose });
103
+ return [{
104
+ type: tasks ? "taskList" : list.ordered ? "orderedList" : "bulletList",
105
+ attrs: list.ordered && !tasks ? { start: list.start === "" ? 1 : Number(list.start), ref: id } : { ref: id },
106
+ content: list.items.map((entry) => {
107
+ const content = fill(entry.tokens.flatMap((t) => block(t, hints)));
108
+ if (!tasks && entry.task) content[0].content = [{ type: "text", text: entry.checked ? "[x] " : "[ ] " }, ...content[0].content ?? []];
109
+ return tasks ? { type: "taskItem", attrs: { checked: !!entry.checked }, content } : { type: "listItem", content };
110
+ })
111
+ }];
112
+ }
113
+ case "table": {
114
+ const table = token;
115
+ const cell = (type) => (c, i) => ({ type, attrs: { align: table.align[i] }, content: [{ type: "paragraph", content: inline(c.tokens) }] });
116
+ return [{ type: "table", content: [
117
+ { type: "tableRow", content: table.header.map(cell("tableHeader")) },
118
+ ...table.rows.map((row2) => ({ type: "tableRow", content: row2.map(cell("tableCell")) }))
119
+ ] }];
120
+ }
121
+ default:
122
+ return [{ type: "paragraph", content: inline([{ type: "text", raw: token.raw, text: token.raw }]) }];
123
+ }
124
+ }
125
+ var opens = /^\s*<!--\s*toc\s*-->\s*$/i;
126
+ var shuts = /^\s*<!--\s*\/toc\s*-->\s*$/i;
127
+ var row = /^(\s*)[-*+]\s+\[((?:\\.|[^\]\\])*)\]\(#[^)\s]*\)\s*$/;
128
+ function aligned(tokens, i, hints) {
129
+ const m = tokens[i].type === "html" ? /^\s*<div\s+align="(center|right|justify)"\s*>\s*$/i.exec(tokens[i].raw) : null;
130
+ if (!m) return null;
131
+ let j = i + 1;
132
+ const skip = () => {
133
+ while (tokens[j]?.type === "space") j++;
134
+ };
135
+ skip();
136
+ const inner = tokens[j]?.type === "paragraph" || tokens[j]?.type === "heading" ? tokens[j++] : null;
137
+ skip();
138
+ if (!inner || tokens[j]?.type !== "html" || !/^\s*<\/div>\s*$/i.test(tokens[j].raw)) return null;
139
+ const made = block(inner, hints);
140
+ made[0].attrs = { ...made[0].attrs, align: m[1] };
141
+ return { end: j, made };
142
+ }
143
+ function contents(tokens, i) {
144
+ if (tokens[i].type !== "html" || !opens.test(tokens[i].raw)) return null;
145
+ let j = i + 1;
146
+ const skip = () => {
147
+ while (tokens[j]?.type === "space") j++;
148
+ };
149
+ skip();
150
+ const list = tokens[j]?.type === "list" ? tokens[j++] : null;
151
+ skip();
152
+ if (tokens[j]?.type !== "html" || !shuts.test(tokens[j].raw)) return null;
153
+ const rows = list ? list.raw.split("\n").filter((line) => line.trim()).map((line) => row.exec(line)) : [];
154
+ if (rows.some((r) => !r)) return null;
155
+ const steps = [...new Set(rows.map((r) => r[1].length))].sort((a, b) => a - b);
156
+ return { end: j, entries: rows.map((r) => [steps.indexOf(r[1].length) + 1, r[2].replace(/\\(.)/g, "$1")]) };
157
+ }
158
+ var slug = (text, seen) => {
159
+ const base = text.toLowerCase().replace(/[^\p{L}\p{N}\s_-]/gu, "").trim().replace(/\s/g, "-");
160
+ const n = seen.get(base) ?? 0;
161
+ seen.set(base, n + 1);
162
+ return n ? `${base}-${n}` : base;
163
+ };
164
+ function sniff(tokens) {
165
+ const style = { bullet: "-", delim: ".", em: "*", strong: "**", fence: "```", br: "\\\n", loose: false };
166
+ const seen = /* @__PURE__ */ new Set();
167
+ const note = (key, value) => {
168
+ if (seen.has(key)) return;
169
+ seen.add(key);
170
+ style[key] = value;
171
+ };
172
+ let loose = 0;
173
+ marked.walkTokens(tokens, (token) => {
174
+ if (token.type === "list") {
175
+ const marker = /^\s*(?:([-*+])|\d+([.)]))/.exec(token.raw);
176
+ if (token.ordered) note("delim", marker?.[2] ?? ".");
177
+ else note("bullet", marker?.[1] ?? "-");
178
+ loose += token.loose ? 1 : -1;
179
+ } else if (token.type === "em") note("em", token.raw[0]);
180
+ else if (token.type === "strong") note("strong", token.raw.slice(0, 2));
181
+ else if (token.type === "code" && /^ {0,3}(```|~~~)/.test(token.raw)) note("fence", token.raw.trimStart().slice(0, 3));
182
+ else if (token.type === "br" && token.raw !== "<br>") note("br", token.raw.startsWith("\\") ? "\\\n" : " \n");
183
+ });
184
+ style.loose = loose > 0;
185
+ return style;
186
+ }
187
+ function fromMarkdown(source) {
188
+ const bom = source.startsWith("\uFEFF");
189
+ const crlf = source.includes("\r\n");
190
+ const tokens = marked.lexer(source.slice(bom ? 1 : 0).replace(/\r\n?/g, "\n"));
191
+ notes = /* @__PURE__ */ new Map();
192
+ marked.walkTokens(tokens, (token) => {
193
+ if (token.type === "footnoteDef") notes.set(token.id, token.text);
194
+ });
195
+ const hints = {};
196
+ const content = [];
197
+ const raws = [];
198
+ let head = "";
199
+ let gap = "";
200
+ for (let i = 0; i < tokens.length; i++) {
201
+ const token = tokens[i];
202
+ const toc = contents(tokens, i) ?? aligned(tokens, i, hints);
203
+ const made = toc ? "made" in toc ? toc.made : [{ type: "toc", attrs: { entries: JSON.stringify(toc.entries) } }] : block(token, hints);
204
+ if (!made.length) {
205
+ gap += token.raw;
206
+ continue;
207
+ }
208
+ if (raws.length) raws[raws.length - 1] += gap;
209
+ else head = gap;
210
+ gap = "";
211
+ content.push(...made);
212
+ raws.push(toc ? tokens.slice(i, toc.end + 1).map((t) => t.raw).join("") : token.raw);
213
+ if (toc) i = toc.end;
214
+ }
215
+ if (!content.length) {
216
+ content.push({ type: "paragraph" });
217
+ raws.push("");
218
+ head = "";
219
+ }
220
+ return { doc: { type: "doc", content }, raws, head, tail: gap, style: sniff(tokens), hints, crlf, bom };
221
+ }
222
+ var track = ({ doc: _json, ...parsed }, doc) => {
223
+ const nodes = [];
224
+ doc.forEach((node) => nodes.push(node));
225
+ return nodes.length === parsed.raws.length ? { ...parsed, nodes } : { ...parsed, nodes: [], raws: [], head: "", tail: "\n" };
226
+ };
227
+ var ticks = (node, side) => {
228
+ const len = Math.max(0, ...(node.isText ? node.text.match(/`+/g) ?? [] : []).map((run) => run.length));
229
+ return len ? side > 0 ? ` ${"`".repeat(len + 1)}` : `${"`".repeat(len + 1)} ` : "`";
230
+ };
231
+ var plain = (mark, parent, index) => {
232
+ const node = parent.child(index);
233
+ const href = mark.attrs.href;
234
+ if (!node.isText || node.marks.length !== 1 || index + 1 < parent.childCount && mark.isInSet(parent.child(index + 1).marks)) return null;
235
+ const text = node.text;
236
+ if (text !== href && `mailto:${text}` !== href && !(text.startsWith("www.") && `http://${text}` === href)) return null;
237
+ const before = index ? parent.child(index - 1) : null;
238
+ const after = index + 1 < parent.childCount ? parent.child(index + 1) : null;
239
+ const left = before ? before.isText ? before.text.slice(-1) : "x" : "";
240
+ const right = after ? after.isText ? after.text : "x" : "";
241
+ return /^[\s(*_~]?$/.test(left) && /^([\s)]|[.,:;!?]+(\s|$)|$)/.test(right) ? "bare" : text === href || href.startsWith("mailto:") ? "angle" : null;
242
+ };
243
+ function serializer(style, hints, before, cell = false) {
244
+ let form = null;
245
+ const hint = (node) => hints[node.attrs.ref] ?? {};
246
+ const run = (parent, index, types) => {
247
+ let n = 0;
248
+ for (let i = index - 1; i >= 0 && types.includes(parent.child(i).type.name); i--) n++;
249
+ if (!index && before && types.includes(before.type.name)) n++;
250
+ return n % 2;
251
+ };
252
+ const tight = (state, node, render) => {
253
+ const deep = node.content.content.some((entry) => entry.content.content.filter((child) => !child.type.name.endsWith("List")).length > 1);
254
+ const was = state.options.tightLists;
255
+ state.options.tightLists = !deep && !(hint(node).loose ?? style.loose);
256
+ render();
257
+ state.options.tightLists = was;
258
+ };
259
+ const list = (state, node, parent, index) => {
260
+ const bullet = hint(node).bullet ?? (run(parent, index, ["bulletList", "taskList"]) ? style.bullet === "-" ? "*" : "-" : style.bullet);
261
+ tight(state, node, () => state.renderList(node, " ", () => `${bullet} `));
262
+ };
263
+ const aligned2 = (state, node, render) => {
264
+ const side = cell ? null : node.attrs.align;
265
+ if (side && side !== "left") {
266
+ state.write(`<div align="${side}">`);
267
+ state.closeBlock(node);
268
+ }
269
+ render();
270
+ state.closeBlock(node);
271
+ if (side && side !== "left") {
272
+ state.write("</div>");
273
+ state.closeBlock(node);
274
+ }
275
+ };
276
+ const blank = { open: "", close: "", mixable: true };
277
+ const wrap = (open, close = open) => ({ open, close, mixable: true, expelEnclosingWhitespace: true });
278
+ return new MarkdownSerializer({
279
+ paragraph(state, node) {
280
+ aligned2(state, node, () => state.renderInline(node));
281
+ },
282
+ heading(state, node) {
283
+ aligned2(state, node, () => {
284
+ state.write(`${"#".repeat(node.attrs.level)} `);
285
+ state.renderInline(node, false);
286
+ });
287
+ },
288
+ math(state, node, parent) {
289
+ state.write(parent.childCount === 1 ? `$$${node.attrs.latex}$$` : `$${node.attrs.latex}$`);
290
+ },
291
+ footnote(state, node) {
292
+ state.write(`[^${node.attrs.id}]`);
293
+ },
294
+ blockquote(state, node) {
295
+ state.wrapBlock("> ", null, node, () => state.renderContent(node));
296
+ },
297
+ codeBlock(state, node) {
298
+ const mark = (hint(node).fence ?? style.fence)[0];
299
+ const longest = Math.max(2, ...(node.textContent.match(new RegExp(`${mark}{3,}`, "g")) ?? []).map((r) => r.length));
300
+ const fence = mark.repeat(longest + 1);
301
+ state.write(`${fence}${node.attrs.language ?? ""}
302
+ `);
303
+ state.text(node.textContent, false);
304
+ state.ensureNewLine();
305
+ state.write(fence);
306
+ state.closeBlock(node);
307
+ },
308
+ horizontalRule(state, node) {
309
+ state.write("---");
310
+ state.closeBlock(node);
311
+ },
312
+ pageBreak(state, node) {
313
+ state.closeBlock(node);
314
+ },
315
+ toc(state, node) {
316
+ const seen = /* @__PURE__ */ new Map();
317
+ const lines = JSON.parse(node.attrs.entries).map(([level, text]) => `${" ".repeat(level - 1)}${style.bullet} [${text.replace(/[[\]\\]/g, "\\$&")}](#${slug(text, seen)})
318
+ `);
319
+ state.write(`<!-- toc -->
320
+ ${lines.join("")}<!-- /toc -->`);
321
+ state.closeBlock(node);
322
+ },
323
+ bulletList: list,
324
+ taskList: list,
325
+ orderedList(state, node, parent, index) {
326
+ const start = node.attrs.start ?? 1;
327
+ const delim = hint(node).delim ?? (run(parent, index, ["orderedList"]) ? style.delim === "." ? ")" : "." : style.delim);
328
+ const width = String(start + node.childCount - 1).length;
329
+ tight(state, node, () => state.renderList(node, " ".repeat(width + 2), (i) => `${start + i}${delim} `));
330
+ },
331
+ listItem(state, node) {
332
+ state.renderContent(node);
333
+ },
334
+ taskItem(state, node) {
335
+ state.write(node.attrs.checked ? "[x] " : "[ ] ");
336
+ state.renderContent(node);
337
+ },
338
+ table(state, node) {
339
+ const rows = [];
340
+ const aligns = [];
341
+ node.forEach((row2, _, r) => {
342
+ const cells = [];
343
+ row2.forEach((c) => {
344
+ const span = c.attrs.colspan || 1;
345
+ const text = [];
346
+ c.forEach((child) => text.push(serializer(style, hints, null, true).serialize(c.type.schema.topNodeType.create(null, child)).replace(/\n+/g, " ")));
347
+ if (!r) aligns.push(c.attrs.align, ...Array(span - 1).fill(null));
348
+ cells.push(text.join("<br>").replace(/\|/g, "\\|"), ...Array(span - 1).fill(""));
349
+ });
350
+ rows.push(cells);
351
+ });
352
+ const width = Math.max(...rows.map((r) => r.length));
353
+ const line = (cells) => `| ${[...cells, ...Array(width - cells.length).fill("")].join(" | ")} |`;
354
+ const rule = Array.from({ length: width }, (_, i) => ({ left: ":---", center: ":---:", right: "---:" })[aligns[i] ?? ""] ?? "---");
355
+ [line(rows[0]), `| ${rule.join(" | ")} |`, ...rows.slice(1).map(line)].forEach((text, i) => {
356
+ if (i) state.ensureNewLine();
357
+ state.write(text);
358
+ });
359
+ state.closeBlock(node);
360
+ },
361
+ image(state, node) {
362
+ const src = String(node.attrs.src ?? "");
363
+ const title = node.attrs.title ? ` "${String(node.attrs.title).replace(/"/g, '\\"')}"` : "";
364
+ state.write(`![${state.esc(String(node.attrs.alt ?? ""))}](${/\s/.test(src) ? `<${src}>` : src.replace(/[()]/g, "\\$&")}${title})`);
365
+ },
366
+ hardBreak(state, node, parent, index) {
367
+ for (let i = index + 1; i < parent.childCount; i++) {
368
+ if (parent.child(i).type === node.type) continue;
369
+ state.write(cell ? "<br>" : style.br);
370
+ return;
371
+ }
372
+ },
373
+ text(state, node) {
374
+ state.text(node.text, !state.inAutolink);
375
+ }
376
+ }, {
377
+ italic: wrap(style.em),
378
+ bold: wrap(style.strong),
379
+ strike: wrap("~~"),
380
+ underline: wrap("<u>", "</u>"),
381
+ highlight: wrap("<mark>", "</mark>"),
382
+ textStyle: blank,
383
+ comment: blank,
384
+ link: {
385
+ open(state, mark, parent, index) {
386
+ form = plain(mark, parent, index);
387
+ state.inAutolink = !!form;
388
+ return form === "bare" ? "" : form === "angle" ? "<" : "[";
389
+ },
390
+ close(state, mark) {
391
+ state.inAutolink = void 0;
392
+ const was = form;
393
+ form = null;
394
+ return was === "bare" ? "" : was === "angle" ? ">" : `](${String(mark.attrs.href).replace(/[()"]/g, "\\$&")})`;
395
+ },
396
+ mixable: true
397
+ },
398
+ code: { open: (_s, _m, parent, index) => ticks(parent.child(index), -1), close: (_s, _m, parent, index) => ticks(parent.child(index - 1), 1), escape: false }
399
+ }, { hardBreakNodeName: "hardBreak", strict: false, escapeExtraCharacters: /<(?=[A-Za-z/!?])/g });
400
+ }
401
+ var one = (node, before, base) => serializer(base.style, base.hints, before).serialize(node.type.schema.topNodeType.create(null, node)).replace(/\n+$/, "");
402
+ var refs = (nodes) => {
403
+ const found = /* @__PURE__ */ new Map();
404
+ nodes.forEach((n) => n.descendants((d) => {
405
+ if (d.type.name === "footnote" && d.attrs.id) found.set(d.attrs.id, d.attrs.text);
406
+ }));
407
+ return found;
408
+ };
409
+ function toMarkdown(doc, base) {
410
+ const nodes = [];
411
+ const found = [];
412
+ let j = 0;
413
+ doc.forEach((node) => {
414
+ let k = -1;
415
+ for (let m = j; m < Math.min(base.nodes.length, j + 64) && k < 0; m++) if (base.nodes[m] === node || base.nodes[m].eq(node)) k = m;
416
+ if (k >= 0) j = k + 1;
417
+ nodes.push(node);
418
+ found.push(k);
419
+ });
420
+ const now = refs(nodes), was = refs(base.nodes);
421
+ const seen = /* @__PURE__ */ new Set();
422
+ const fix = (text2) => now.size || was.size ? text2.replace(defs, (all, id, note) => {
423
+ if (!now.has(id)) return was.has(id) ? "" : all;
424
+ seen.add(id);
425
+ return noteOf(note) === now.get(id) ? all : `[^${id}]: ${now.get(id).replace(/\n/g, "\n ")}
426
+ `;
427
+ }) : text2;
428
+ const kept = new Set(found);
429
+ const lost = base.raws.filter((_, m) => !kept.has(m)).flatMap((raw) => marked.lexer(raw).filter((t) => t.type === "def" || t.type === "footnoteDef").map((t) => t.raw.replace(/\n*$/, "\n"))).join("");
430
+ let out = fix(base.head);
431
+ const starts = [];
432
+ nodes.forEach((node, i) => {
433
+ const k = found[i];
434
+ if (i && !(k >= 0 && found[i - 1] === k - 1)) out = out.replace(/\n*$/, "\n\n");
435
+ starts.push(out.length);
436
+ out += k >= 0 ? fix(base.raws[k]) : one(node, i ? nodes[i - 1] : null, base);
437
+ });
438
+ const last = found[found.length - 1];
439
+ const end = last >= 0 && last === base.nodes.length - 1;
440
+ if (!end) out = out.replace(/\n*$/, "\n");
441
+ const cut = out.length;
442
+ out += fix(end ? base.tail : base.tail.trim() ? `
443
+ ${base.tail.replace(/^\n+/, "")}` : "");
444
+ const extra = fix(lost) + [...now].filter(([id]) => !seen.has(id)).map(([id, note]) => `[^${id}]: ${note.replace(/\n/g, "\n ")}
445
+ `).join("");
446
+ if (extra) out = `${out.replace(/\n*$/, "\n\n")}${extra}`;
447
+ const at2 = starts.map((s) => Math.min(s, cut));
448
+ const raws = at2.map((s, i) => out.slice(s, i + 1 < at2.length ? at2[i + 1] : cut));
449
+ const text = base.crlf ? out.replace(/\n/g, "\r\n") : out;
450
+ return { text: base.bom ? `\uFEFF${text}` : text, base: { ...base, nodes, raws, tail: out.slice(cut) } };
451
+ }
452
+
453
+ export {
454
+ fromMarkdown,
455
+ track,
456
+ toMarkdown
457
+ };
458
+ //# sourceMappingURL=chunk-EQLBYW42.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/editor/markdown.ts"],"sourcesContent":["import type { JSONContent } from '@tiptap/core';\nimport type { Mark, Node } from '@tiptap/pm/model';\nimport { Marked, type Token, type Tokens } from 'marked';\nimport { MarkdownSerializer, type MarkdownSerializerState } from 'prosemirror-markdown';\n\ntype Style = { bullet: string; delim: string; em: string; strong: string; fence: string; br: string; loose: boolean };\ntype Hint = { bullet?: string; delim?: string; loose?: boolean; fence?: string };\ntype Marks = { type: string; attrs?: Record<string, unknown> }[];\n\nexport type Parsed = { doc: JSONContent; raws: string[]; head: string; tail: string; style: Style; hints: Record<string, Hint>; crlf: boolean; bom: boolean };\nexport type Base = Omit<Parsed, 'doc'> & { nodes: Node[] };\n\nconst def = /^\\[\\^([^\\]\\s]+)\\]:[ \\t]*([^\\n]*(?:\\n {4}[^\\n]*)*)(?:\\n|$)/;\nconst defs = new RegExp(def.source.slice(1), 'gm');\nconst noteOf = (text: string) => text.replace(/\\n {4}/g, '\\n').trim();\nconst at = (src: string, find: RegExp) => { const i = src.search(find); return i < 0 ? undefined : i; };\n\nconst marked = new Marked({ extensions: [\n { name: 'footnoteDef', level: 'block', start: src => at(src, /^\\[\\^/m), tokenizer(src) {\n const m = def.exec(src);\n return m ? { type: 'footnoteDef', raw: m[0], id: m[1], text: noteOf(m[2]) } : undefined;\n } },\n { name: 'footnoteRef', level: 'inline', start: src => at(src, /\\[\\^/), tokenizer(src) {\n const m = /^\\[\\^([^\\]\\s]+)\\]/.exec(src);\n return m ? { type: 'footnoteRef', raw: m[0], id: m[1] } : undefined;\n } },\n { name: 'math', level: 'inline', start: src => at(src, /\\$/), tokenizer(src) {\n const m = /^\\$\\$([^$]+?)\\$\\$|^\\$(?![\\s$])((?:\\\\.|[^$\\\\\\n])*?[^\\s\\\\])\\$(?!\\d)/.exec(src);\n return m ? { type: 'math', raw: m[0], text: (m[1] ?? m[2]).trim() } : undefined;\n } },\n] });\n\nlet notes = new Map<string, string>();\n\nconst tags: Record<string, string> = { u: 'underline', ins: 'underline', mark: 'highlight', s: 'strike', del: 'strike', b: 'bold', strong: 'bold', i: 'italic', em: 'italic' };\n\nconst decode = (text: string) => text.includes('&')\n ? new DOMParser().parseFromString(`<p>${text.replace(/</g, '&lt;')}</p>`, 'text/html').body.textContent ?? text\n : text;\n\nconst unique = (marks: Marks) => [...new Map(marks.map(m => [m.type, m])).values()];\n\nfunction inline(tokens: Token[] = [], outer: Marks = []): JSONContent[] {\n const out: JSONContent[] = [];\n let open: Marks = [];\n const marks = () => unique([...outer, ...open]);\n const text = (value: string, extra: Marks = []) => {\n const set = unique([...marks(), ...extra]);\n const clean = out[out.length - 1]?.type === 'hardBreak' ? value.replace(/^\\n/, '') : value;\n if (clean) out.push({ type: 'text', text: clean, ...(set.length ? { marks: set } : {}) });\n };\n const wrap = (children: Token[] | undefined, mark: Marks[number]) => out.push(...inline(children, [...marks(), mark]));\n for (const token of tokens) {\n if (token.type === 'text') {\n if (token.tokens) out.push(...inline(token.tokens, marks()));\n else text(decode(token.text));\n } else if (token.type === 'escape') text(decode(token.text));\n else if (token.type === 'strong') wrap(token.tokens, { type: 'bold' });\n else if (token.type === 'em') wrap(token.tokens, { type: 'italic' });\n else if (token.type === 'del') wrap(token.tokens, { type: 'strike' });\n else if (token.type === 'codespan') text(token.text, [{ type: 'code' }]);\n else if (token.type === 'br') out.push({ type: 'hardBreak' });\n else if (token.type === 'math') out.push({ type: 'math', attrs: { latex: token.text } });\n else if (token.type === 'footnoteRef') out.push({ type: 'footnote', attrs: { id: token.id, text: notes.get(token.id) ?? '' } });\n else if (token.type === 'link') wrap(token.tokens, { type: 'link', attrs: { href: token.href } });\n else if (token.type === 'image') out.push({ type: 'image', attrs: { src: token.href, alt: token.text || null, title: token.title || null }, ...(marks().length ? { marks: marks() } : {}) });\n else if (token.type === 'html') {\n const tag = /^<(\\/?)([a-z]+)\\s*\\/?>$/i.exec(token.raw.trim());\n const name = tag?.[2].toLowerCase() ?? '';\n if (name === 'br') out.push({ type: 'hardBreak' });\n else if (!tags[name]) text(token.raw);\n else open = tag![1] ? open.filter(m => m.type !== tags[name]) : [...open, { type: tags[name] }];\n } else if (token.type !== 'checkbox') text(token.raw);\n }\n return out;\n}\n\nconst fill = (content: JSONContent[]) => content.length ? content : [{ type: 'paragraph' }];\n\nfunction block(token: Token, hints: Record<string, Hint>): JSONContent[] {\n const ref = (hint: Hint) => {\n const id = `md${Object.keys(hints).length + 1}`;\n hints[id] = hint;\n return id;\n };\n switch (token.type) {\n case 'space': case 'def': case 'checkbox': case 'footnoteDef': return [];\n case 'html': {\n const m = /^\\s*<(p|h[1-6])\\s+align=\"(center|right|justify)\"\\s*>([\\s\\S]*?)<\\/\\1>\\s*$/i.exec(token.raw);\n if (!m) return [{ type: 'codeBlock', attrs: { language: 'html' }, content: [{ type: 'text', text: token.raw.replace(/\\n+$/, '') }] }];\n const content = inline(marked.Lexer.lexInline(m[3].trim(), marked.defaults));\n const level = Number(m[1][1]);\n return [level ? { type: 'heading', attrs: { level, align: m[2] }, content } : { type: 'paragraph', attrs: { align: m[2] }, content }];\n }\n case 'heading': return [{ type: 'heading', attrs: { level: token.depth }, content: inline(token.tokens) }];\n case 'paragraph': case 'text': return [{ type: 'paragraph', content: token.tokens ? inline(token.tokens) : inline([{ type: 'text', raw: token.text, text: token.text }]) }];\n case 'blockquote': return [{ type: 'blockquote', content: fill(token.tokens!.flatMap(t => block(t, hints))) }];\n case 'code': {\n const fence = /^ {0,3}(`{3,}|~{3,})/.exec(token.raw)?.[1][0];\n return [{ type: 'codeBlock', attrs: { language: token.lang || null, ref: fence ? ref({ fence: fence.repeat(3) }) : null }, content: token.text ? [{ type: 'text', text: token.text }] : [] }];\n }\n case 'hr': return [{ type: 'horizontalRule' }];\n case 'list': {\n const list = token as Tokens.List;\n const tasks = list.items.every(entry => entry.task);\n const marker = /^\\s*(?:([-*+])|\\d+([.)]))/.exec(list.raw);\n const id = ref({ bullet: marker?.[1], delim: marker?.[2], loose: list.loose });\n return [{\n type: tasks ? 'taskList' : list.ordered ? 'orderedList' : 'bulletList',\n attrs: list.ordered && !tasks ? { start: list.start === '' ? 1 : Number(list.start), ref: id } : { ref: id },\n content: list.items.map(entry => {\n const content = fill(entry.tokens.flatMap(t => block(t, hints)));\n if (!tasks && entry.task) content[0].content = [{ type: 'text', text: entry.checked ? '[x] ' : '[ ] ' }, ...(content[0].content ?? [])];\n return tasks ? { type: 'taskItem', attrs: { checked: !!entry.checked }, content } : { type: 'listItem', content };\n }),\n }];\n }\n case 'table': {\n const table = token as Tokens.Table;\n const cell = (type: string) => (c: Tokens.TableCell, i: number) => ({ type, attrs: { align: table.align[i] }, content: [{ type: 'paragraph', content: inline(c.tokens) }] });\n return [{ type: 'table', content: [\n { type: 'tableRow', content: table.header.map(cell('tableHeader')) },\n ...table.rows.map(row => ({ type: 'tableRow', content: row.map(cell('tableCell')) })),\n ] }];\n }\n default: return [{ type: 'paragraph', content: inline([{ type: 'text', raw: token.raw, text: token.raw }]) }];\n }\n}\n\nconst opens = /^\\s*<!--\\s*toc\\s*-->\\s*$/i;\nconst shuts = /^\\s*<!--\\s*\\/toc\\s*-->\\s*$/i;\nconst row = /^(\\s*)[-*+]\\s+\\[((?:\\\\.|[^\\]\\\\])*)\\]\\(#[^)\\s]*\\)\\s*$/;\n\nfunction aligned(tokens: Token[], i: number, hints: Record<string, Hint>): { end: number; made: JSONContent[] } | null {\n const m = tokens[i].type === 'html' ? /^\\s*<div\\s+align=\"(center|right|justify)\"\\s*>\\s*$/i.exec(tokens[i].raw) : null;\n if (!m) return null;\n let j = i + 1;\n const skip = () => { while (tokens[j]?.type === 'space') j++; };\n skip();\n const inner = tokens[j]?.type === 'paragraph' || tokens[j]?.type === 'heading' ? tokens[j++] : null;\n skip();\n if (!inner || tokens[j]?.type !== 'html' || !/^\\s*<\\/div>\\s*$/i.test(tokens[j].raw)) return null;\n const made = block(inner, hints);\n made[0].attrs = { ...made[0].attrs, align: m[1] };\n return { end: j, made };\n}\n\nfunction contents(tokens: Token[], i: number): { end: number; entries: [number, string][] } | null {\n if (tokens[i].type !== 'html' || !opens.test(tokens[i].raw)) return null;\n let j = i + 1;\n const skip = () => { while (tokens[j]?.type === 'space') j++; };\n skip();\n const list = tokens[j]?.type === 'list' ? tokens[j++] : null;\n skip();\n if (tokens[j]?.type !== 'html' || !shuts.test(tokens[j].raw)) return null;\n const rows = list ? list.raw.split('\\n').filter(line => line.trim()).map(line => row.exec(line)) : [];\n if (rows.some(r => !r)) return null;\n const steps = [...new Set(rows.map(r => r![1].length))].sort((a, b) => a - b);\n return { end: j, entries: rows.map(r => [steps.indexOf(r![1].length) + 1, r![2].replace(/\\\\(.)/g, '$1')]) };\n}\n\nconst slug = (text: string, seen: Map<string, number>) => {\n const base = text.toLowerCase().replace(/[^\\p{L}\\p{N}\\s_-]/gu, '').trim().replace(/\\s/g, '-');\n const n = seen.get(base) ?? 0;\n seen.set(base, n + 1);\n return n ? `${base}-${n}` : base;\n};\n\nfunction sniff(tokens: Token[]): Style {\n const style: Style = { bullet: '-', delim: '.', em: '*', strong: '**', fence: '```', br: '\\\\\\n', loose: false };\n const seen = new Set<string>();\n const note = <K extends keyof Style>(key: K, value: Style[K]) => {\n if (seen.has(key)) return;\n seen.add(key);\n style[key] = value;\n };\n let loose = 0;\n marked.walkTokens(tokens, token => {\n if (token.type === 'list') {\n const marker = /^\\s*(?:([-*+])|\\d+([.)]))/.exec(token.raw);\n if (token.ordered) note('delim', marker?.[2] ?? '.');\n else note('bullet', marker?.[1] ?? '-');\n loose += token.loose ? 1 : -1;\n } else if (token.type === 'em') note('em', token.raw[0]);\n else if (token.type === 'strong') note('strong', token.raw.slice(0, 2));\n else if (token.type === 'code' && /^ {0,3}(```|~~~)/.test(token.raw)) note('fence', token.raw.trimStart().slice(0, 3));\n else if (token.type === 'br' && token.raw !== '<br>') note('br', token.raw.startsWith('\\\\') ? '\\\\\\n' : ' \\n');\n });\n style.loose = loose > 0;\n return style;\n}\n\nexport function fromMarkdown(source: string): Parsed {\n const bom = source.startsWith('');\n const crlf = source.includes('\\r\\n');\n const tokens = marked.lexer(source.slice(bom ? 1 : 0).replace(/\\r\\n?/g, '\\n'));\n notes = new Map();\n marked.walkTokens(tokens, token => { if (token.type === 'footnoteDef') notes.set(token.id, token.text); });\n const hints: Record<string, Hint> = {};\n const content: JSONContent[] = [];\n const raws: string[] = [];\n let head = '';\n let gap = '';\n for (let i = 0; i < tokens.length; i++) {\n const token = tokens[i];\n const toc = contents(tokens, i) ?? aligned(tokens, i, hints);\n const made = toc ? 'made' in toc ? toc.made : [{ type: 'toc', attrs: { entries: JSON.stringify(toc.entries) } }] : block(token, hints);\n if (!made.length) { gap += token.raw; continue; }\n if (raws.length) raws[raws.length - 1] += gap;\n else head = gap;\n gap = '';\n content.push(...made);\n raws.push(toc ? tokens.slice(i, toc.end + 1).map(t => t.raw).join('') : token.raw);\n if (toc) i = toc.end;\n }\n if (!content.length) { content.push({ type: 'paragraph' }); raws.push(''); head = ''; }\n return { doc: { type: 'doc', content }, raws, head, tail: gap, style: sniff(tokens), hints, crlf, bom };\n}\n\nexport const track = ({ doc: _json, ...parsed }: Parsed, doc: Node): Base => {\n const nodes: Node[] = [];\n doc.forEach(node => nodes.push(node));\n return nodes.length === parsed.raws.length ? { ...parsed, nodes } : { ...parsed, nodes: [], raws: [], head: '', tail: '\\n' };\n};\n\ntype Auto = { inAutolink?: boolean };\n\nconst ticks = (node: Node, side: number) => {\n const len = Math.max(0, ...(node.isText ? node.text!.match(/`+/g) ?? [] : []).map(run => run.length));\n return len ? (side > 0 ? ` ${'`'.repeat(len + 1)}` : `${'`'.repeat(len + 1)} `) : '`';\n};\n\nconst plain = (mark: Mark, parent: Node, index: number) => {\n const node = parent.child(index);\n const href = mark.attrs.href as string;\n if (!node.isText || node.marks.length !== 1 || (index + 1 < parent.childCount && mark.isInSet(parent.child(index + 1).marks))) return null;\n const text = node.text!;\n if (text !== href && `mailto:${text}` !== href && !(text.startsWith('www.') && `http://${text}` === href)) return null;\n const before = index ? parent.child(index - 1) : null;\n const after = index + 1 < parent.childCount ? parent.child(index + 1) : null;\n const left = before ? (before.isText ? before.text!.slice(-1) : 'x') : '';\n const right = after ? (after.isText ? after.text! : 'x') : '';\n return /^[\\s(*_~]?$/.test(left) && /^([\\s)]|[.,:;!?]+(\\s|$)|$)/.test(right) ? 'bare' : text === href || href.startsWith('mailto:') ? 'angle' : null;\n};\n\nfunction serializer(style: Style, hints: Record<string, Hint>, before: Node | null, cell = false) {\n let form: string | null = null;\n const hint = (node: Node) => hints[node.attrs.ref as string] ?? {};\n const run = (parent: Node, index: number, types: string[]) => {\n let n = 0;\n for (let i = index - 1; i >= 0 && types.includes(parent.child(i).type.name); i--) n++;\n if (!index && before && types.includes(before.type.name)) n++;\n return n % 2;\n };\n const tight = (state: MarkdownSerializerState, node: Node, render: () => void) => {\n const deep = node.content.content.some(entry => entry.content.content.filter(child => !child.type.name.endsWith('List')).length > 1);\n const was = state.options.tightLists;\n state.options.tightLists = !deep && !(hint(node).loose ?? style.loose);\n render();\n state.options.tightLists = was;\n };\n const list = (state: MarkdownSerializerState, node: Node, parent: Node, index: number) => {\n const bullet = hint(node).bullet ?? (run(parent, index, ['bulletList', 'taskList']) ? (style.bullet === '-' ? '*' : '-') : style.bullet);\n tight(state, node, () => state.renderList(node, ' ', () => `${bullet} `));\n };\n const aligned = (state: MarkdownSerializerState, node: Node, render: () => void) => {\n const side = cell ? null : node.attrs.align as string | null;\n if (side && side !== 'left') {\n state.write(`<div align=\"${side}\">`);\n state.closeBlock(node);\n }\n render();\n state.closeBlock(node);\n if (side && side !== 'left') {\n state.write('</div>');\n state.closeBlock(node);\n }\n };\n const blank = { open: '', close: '', mixable: true };\n const wrap = (open: string, close = open) => ({ open, close, mixable: true, expelEnclosingWhitespace: true });\n return new MarkdownSerializer({\n paragraph(state, node) { aligned(state, node, () => state.renderInline(node)); },\n heading(state, node) { aligned(state, node, () => { state.write(`${'#'.repeat(node.attrs.level)} `); state.renderInline(node, false); }); },\n math(state, node, parent) { state.write(parent.childCount === 1 ? `$$${node.attrs.latex}$$` : `$${node.attrs.latex}$`); },\n footnote(state, node) { state.write(`[^${node.attrs.id}]`); },\n blockquote(state, node) { state.wrapBlock('> ', null, node, () => state.renderContent(node)); },\n codeBlock(state, node) {\n const mark = (hint(node).fence ?? style.fence)[0];\n const longest = Math.max(2, ...(node.textContent.match(new RegExp(`${mark}{3,}`, 'g')) ?? []).map(r => r.length));\n const fence = mark.repeat(longest + 1);\n state.write(`${fence}${node.attrs.language ?? ''}\\n`);\n state.text(node.textContent, false);\n state.ensureNewLine();\n state.write(fence);\n state.closeBlock(node);\n },\n horizontalRule(state, node) { state.write('---'); state.closeBlock(node); },\n pageBreak(state, node) { state.closeBlock(node); },\n toc(state, node) {\n const seen = new Map<string, number>();\n const lines = (JSON.parse(node.attrs.entries) as [number, string][]).map(([level, text]) => `${' '.repeat(level - 1)}${style.bullet} [${text.replace(/[[\\]\\\\]/g, '\\\\$&')}](#${slug(text, seen)})\\n`);\n state.write(`<!-- toc -->\\n${lines.join('')}<!-- /toc -->`);\n state.closeBlock(node);\n },\n bulletList: list,\n taskList: list,\n orderedList(state, node, parent, index) {\n const start = (node.attrs.start as number | null) ?? 1;\n const delim = hint(node).delim ?? (run(parent, index, ['orderedList']) ? (style.delim === '.' ? ')' : '.') : style.delim);\n const width = String(start + node.childCount - 1).length;\n tight(state, node, () => state.renderList(node, ' '.repeat(width + 2), i => `${start + i}${delim} `));\n },\n listItem(state, node) { state.renderContent(node); },\n taskItem(state, node) { state.write(node.attrs.checked ? '[x] ' : '[ ] '); state.renderContent(node); },\n table(state, node) {\n const rows: string[][] = [];\n const aligns: (string | null)[] = [];\n node.forEach((row, _, r) => {\n const cells: string[] = [];\n row.forEach(c => {\n const span = (c.attrs.colspan as number) || 1;\n const text: string[] = [];\n c.forEach(child => text.push(serializer(style, hints, null, true).serialize(c.type.schema.topNodeType.create(null, child)).replace(/\\n+/g, ' ')));\n if (!r) aligns.push(c.attrs.align as string | null, ...Array(span - 1).fill(null));\n cells.push(text.join('<br>').replace(/\\|/g, '\\\\|'), ...Array(span - 1).fill(''));\n });\n rows.push(cells);\n });\n const width = Math.max(...rows.map(r => r.length));\n const line = (cells: string[]) => `| ${[...cells, ...Array(width - cells.length).fill('')].join(' | ')} |`;\n const rule = Array.from({ length: width }, (_, i) => ({ left: ':---', center: ':---:', right: '---:' })[aligns[i] ?? ''] ?? '---');\n [line(rows[0]), `| ${rule.join(' | ')} |`, ...rows.slice(1).map(line)].forEach((text, i) => {\n if (i) state.ensureNewLine();\n state.write(text);\n });\n state.closeBlock(node);\n },\n image(state, node) {\n const src = String(node.attrs.src ?? '');\n const title = node.attrs.title ? ` \"${String(node.attrs.title).replace(/\"/g, '\\\\\"')}\"` : '';\n state.write(`![${state.esc(String(node.attrs.alt ?? ''))}](${/\\s/.test(src) ? `<${src}>` : src.replace(/[()]/g, '\\\\$&')}${title})`);\n },\n hardBreak(state, node, parent, index) {\n for (let i = index + 1; i < parent.childCount; i++) {\n if (parent.child(i).type === node.type) continue;\n state.write(cell ? '<br>' : style.br);\n return;\n }\n },\n text(state, node) { state.text(node.text!, !(state as Auto).inAutolink); },\n }, {\n italic: wrap(style.em), bold: wrap(style.strong), strike: wrap('~~'), underline: wrap('<u>', '</u>'), highlight: wrap('<mark>', '</mark>'),\n textStyle: blank, comment: blank,\n link: {\n open(state, mark, parent, index) {\n form = plain(mark, parent, index);\n (state as Auto).inAutolink = !!form;\n return form === 'bare' ? '' : form === 'angle' ? '<' : '[';\n },\n close(state, mark) {\n (state as Auto).inAutolink = undefined;\n const was = form;\n form = null;\n return was === 'bare' ? '' : was === 'angle' ? '>' : `](${String(mark.attrs.href).replace(/[()\"]/g, '\\\\$&')})`;\n },\n mixable: true,\n },\n code: { open: (_s, _m, parent, index) => ticks(parent.child(index), -1), close: (_s, _m, parent, index) => ticks(parent.child(index - 1), 1), escape: false },\n }, { hardBreakNodeName: 'hardBreak', strict: false, escapeExtraCharacters: /<(?=[A-Za-z/!?])/g });\n}\n\nconst one = (node: Node, before: Node | null, base: Base) =>\n serializer(base.style, base.hints, before).serialize(node.type.schema.topNodeType.create(null, node)).replace(/\\n+$/, '');\n\nconst refs = (nodes: Node[]) => {\n const found = new Map<string, string>();\n nodes.forEach(n => n.descendants(d => { if (d.type.name === 'footnote' && d.attrs.id) found.set(d.attrs.id, d.attrs.text); }));\n return found;\n};\n\nexport function toMarkdown(doc: Node, base: Base): { text: string; base: Base } {\n const nodes: Node[] = [];\n const found: number[] = [];\n let j = 0;\n doc.forEach(node => {\n let k = -1;\n for (let m = j; m < Math.min(base.nodes.length, j + 64) && k < 0; m++) if (base.nodes[m] === node || base.nodes[m].eq(node)) k = m;\n if (k >= 0) j = k + 1;\n nodes.push(node);\n found.push(k);\n });\n const now = refs(nodes), was = refs(base.nodes);\n const seen = new Set<string>();\n const fix = (text: string) => now.size || was.size ? text.replace(defs, (all, id: string, note: string) => {\n if (!now.has(id)) return was.has(id) ? '' : all;\n seen.add(id);\n return noteOf(note) === now.get(id) ? all : `[^${id}]: ${now.get(id)!.replace(/\\n/g, '\\n ')}\\n`;\n }) : text;\n const kept = new Set(found);\n const lost = base.raws.filter((_, m) => !kept.has(m)).flatMap(raw => marked.lexer(raw).filter(t => t.type === 'def' || t.type === 'footnoteDef').map(t => t.raw.replace(/\\n*$/, '\\n'))).join('');\n let out = fix(base.head);\n const starts: number[] = [];\n nodes.forEach((node, i) => {\n const k = found[i];\n if (i && !(k >= 0 && found[i - 1] === k - 1)) out = out.replace(/\\n*$/, '\\n\\n');\n starts.push(out.length);\n out += k >= 0 ? fix(base.raws[k]) : one(node, i ? nodes[i - 1] : null, base);\n });\n const last = found[found.length - 1];\n const end = last >= 0 && last === base.nodes.length - 1;\n if (!end) out = out.replace(/\\n*$/, '\\n');\n const cut = out.length;\n out += fix(end ? base.tail : base.tail.trim() ? `\\n${base.tail.replace(/^\\n+/, '')}` : '');\n const extra = fix(lost) + [...now].filter(([id]) => !seen.has(id)).map(([id, note]) => `[^${id}]: ${note.replace(/\\n/g, '\\n ')}\\n`).join('');\n if (extra) out = `${out.replace(/\\n*$/, '\\n\\n')}${extra}`;\n const at = starts.map(s => Math.min(s, cut));\n const raws = at.map((s, i) => out.slice(s, i + 1 < at.length ? at[i + 1] : cut));\n const text = base.crlf ? out.replace(/\\n/g, '\\r\\n') : out;\n return { text: base.bom ? `${text}` : text, base: { ...base, nodes, raws, tail: out.slice(cut) } };\n}\n"],"mappings":"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","names":["row","aligned","text","at"]}