@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.
- package/dist/Compare-M57FG4R3.js +96 -0
- package/dist/Compare-M57FG4R3.js.map +1 -0
- package/dist/{SheetView-72KXS4DM.js → SheetView-EFBSMY7K.js} +6 -4
- package/dist/{SheetView-72KXS4DM.js.map → SheetView-EFBSMY7K.js.map} +1 -1
- package/dist/{TextEditor-NSICFE6U.js → TextEditor-MGCSGGGA.js} +128 -43
- package/dist/TextEditor-MGCSGGGA.js.map +1 -0
- package/dist/{chunk-Z7UNJ4ND.js → chunk-2L3TK7UF.js} +87 -411
- package/dist/chunk-2L3TK7UF.js.map +1 -0
- package/dist/{chunk-OXC4PUOC.js → chunk-3OLRFIHQ.js} +2 -2
- package/dist/chunk-EQLBYW42.js +458 -0
- package/dist/chunk-EQLBYW42.js.map +1 -0
- package/dist/chunk-RKV3N6OS.js +1011 -0
- package/dist/chunk-RKV3N6OS.js.map +1 -0
- package/dist/{chunk-M4OQG3EN.js → chunk-ZAVXCH7V.js} +55 -1034
- package/dist/chunk-ZAVXCH7V.js.map +1 -0
- package/dist/collab.cjs +350 -202
- package/dist/collab.cjs.map +1 -1
- package/dist/collab.js +4 -2
- package/dist/index.cjs +935 -602
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +135 -0
- package/dist/index.css.map +1 -1
- package/dist/index.js +19 -8
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/dist/TextEditor-NSICFE6U.js.map +0 -1
- package/dist/chunk-M4OQG3EN.js.map +0 -1
- package/dist/chunk-Z7UNJ4ND.js.map +0 -1
- /package/dist/{chunk-OXC4PUOC.js.map → chunk-3OLRFIHQ.js.map} +0 -0
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
pending,
|
|
6
6
|
save,
|
|
7
7
|
seed
|
|
8
|
-
} from "./chunk-
|
|
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-
|
|
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, "<")}</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(` ? `<${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, '<')}</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(` ? `<${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"]}
|