@xiangfa/mindmap 0.3.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/README.md +534 -0
- package/README.zh-CN.md +534 -0
- package/dist/MindMap.d.ts +3 -0
- package/dist/components/MindMapContextMenu.d.ts +20 -0
- package/dist/components/MindMapControls.d.ts +16 -0
- package/dist/components/MindMapNode.d.ts +32 -0
- package/dist/components/icons.d.ts +8 -0
- package/dist/esm/MindMap2.js +713 -0
- package/dist/esm/components/MindMapContextMenu.js +123 -0
- package/dist/esm/components/MindMapControls.js +114 -0
- package/dist/esm/components/MindMapNode.js +588 -0
- package/dist/esm/components/icons.js +45 -0
- package/dist/esm/hooks/useDrag.js +346 -0
- package/dist/esm/hooks/useNewNodeAnimation.js +20 -0
- package/dist/esm/hooks/useNodeEdit.js +57 -0
- package/dist/esm/hooks/usePanZoom.js +85 -0
- package/dist/esm/hooks/useTheme.js +16 -0
- package/dist/esm/index.js +14 -0
- package/dist/esm/logo.svg +9 -0
- package/dist/esm/plugins/cross-link.js +65 -0
- package/dist/esm/plugins/dotted-line.js +23 -0
- package/dist/esm/plugins/folding.js +20 -0
- package/dist/esm/plugins/front-matter.js +19 -0
- package/dist/esm/plugins/index.js +19 -0
- package/dist/esm/plugins/latex.js +132 -0
- package/dist/esm/plugins/multi-line.js +39 -0
- package/dist/esm/plugins/runner.js +128 -0
- package/dist/esm/plugins/tags.js +55 -0
- package/dist/esm/style.css +2 -0
- package/dist/esm/utils/export.js +50 -0
- package/dist/esm/utils/i18n.js +61 -0
- package/dist/esm/utils/inline-markdown.js +189 -0
- package/dist/esm/utils/layout.js +208 -0
- package/dist/esm/utils/markdown.js +288 -0
- package/dist/esm/utils/theme.js +119 -0
- package/dist/esm/utils/tree-ops.js +136 -0
- package/dist/hooks/useDrag.d.ts +40 -0
- package/dist/hooks/useNewNodeAnimation.d.ts +2 -0
- package/dist/hooks/useNodeEdit.d.ts +17 -0
- package/dist/hooks/usePanZoom.d.ts +26 -0
- package/dist/hooks/useTheme.d.ts +3 -0
- package/dist/index.d.ts +16 -0
- package/dist/logo.svg +9 -0
- package/dist/mindmap.umd.cjs +24 -0
- package/dist/plugins/cross-link.d.ts +2 -0
- package/dist/plugins/dotted-line.d.ts +2 -0
- package/dist/plugins/folding.d.ts +2 -0
- package/dist/plugins/front-matter.d.ts +2 -0
- package/dist/plugins/index.d.ts +11 -0
- package/dist/plugins/latex.d.ts +20 -0
- package/dist/plugins/multi-line.d.ts +2 -0
- package/dist/plugins/runner.d.ts +30 -0
- package/dist/plugins/tags.d.ts +2 -0
- package/dist/plugins/types.d.ts +78 -0
- package/dist/style.css +2 -0
- package/dist/types.d.ts +105 -0
- package/dist/utils/export.d.ts +18 -0
- package/dist/utils/i18n.d.ts +22 -0
- package/dist/utils/inline-markdown.d.ts +66 -0
- package/dist/utils/layout.d.ts +14 -0
- package/dist/utils/markdown.d.ts +20 -0
- package/dist/utils/theme.d.ts +62 -0
- package/dist/utils/tree-ops.d.ts +36 -0
- package/package.json +65 -0
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
//#region src/components/MindMap/utils/inline-markdown.ts
|
|
2
|
+
var e = "!\\[([^\\]]*)\\]\\(([^)]+)\\)|\\[([^\\]]+)\\]\\(([^)]+)\\)|`([^`]+)`|\\*\\*(.+?)\\*\\*|\\*(.+?)\\*|~~(.+?)~~|==(.+?)==";
|
|
3
|
+
function t(t, r) {
|
|
4
|
+
let i = [], a = e, o = [];
|
|
5
|
+
if (r && r.length > 0) {
|
|
6
|
+
let e = [];
|
|
7
|
+
for (let t of r) if (t.inlineTokenPattern) {
|
|
8
|
+
let { pattern: n, priority: r } = t.inlineTokenPattern();
|
|
9
|
+
e.push({
|
|
10
|
+
plugin: t,
|
|
11
|
+
pattern: n,
|
|
12
|
+
priority: r
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
e.sort((e, t) => e.priority - t.priority);
|
|
16
|
+
let t = 0;
|
|
17
|
+
for (let r of e) {
|
|
18
|
+
let e = n(r.pattern);
|
|
19
|
+
o.push({
|
|
20
|
+
plugin: r.plugin,
|
|
21
|
+
groupOffset: t,
|
|
22
|
+
pattern: r.pattern
|
|
23
|
+
}), t += e;
|
|
24
|
+
}
|
|
25
|
+
o.length > 0 && (a = o.map((e) => e.pattern).join("|") + "|!\\[([^\\]]*)\\]\\(([^)]+)\\)|\\[([^\\]]+)\\]\\(([^)]+)\\)|`([^`]+)`|\\*\\*(.+?)\\*\\*|\\*(.+?)\\*|~~(.+?)~~|==(.+?)==");
|
|
26
|
+
}
|
|
27
|
+
let s = new RegExp(a, "g"), c = o.reduce((e, t) => e + n(t.pattern), 0), l = 0, u;
|
|
28
|
+
for (; (u = s.exec(t)) !== null;) {
|
|
29
|
+
u.index > l && i.push({
|
|
30
|
+
type: "text",
|
|
31
|
+
content: t.slice(l, u.index)
|
|
32
|
+
});
|
|
33
|
+
let e = !1;
|
|
34
|
+
if (o.length > 0) for (let t of o) {
|
|
35
|
+
let r = t.groupOffset + 1, a = n(t.pattern), o = !1;
|
|
36
|
+
for (let e = r; e < r + a; e++) if (u[e] !== void 0) {
|
|
37
|
+
o = !0;
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
40
|
+
if (o && t.plugin.createInlineToken) {
|
|
41
|
+
let n = t.plugin.createInlineToken(u, t.groupOffset);
|
|
42
|
+
if (n) {
|
|
43
|
+
i.push(n), e = !0;
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (!e) {
|
|
49
|
+
let e = c, t = (t) => u[e + t];
|
|
50
|
+
t(1) !== void 0 || t(2) !== void 0 ? i.push({
|
|
51
|
+
type: "image",
|
|
52
|
+
alt: t(1) ?? "",
|
|
53
|
+
url: t(2)
|
|
54
|
+
}) : t(3) === void 0 ? t(5) === void 0 ? t(6) === void 0 ? t(7) === void 0 ? t(8) === void 0 ? t(9) !== void 0 && i.push({
|
|
55
|
+
type: "highlight",
|
|
56
|
+
content: t(9)
|
|
57
|
+
}) : i.push({
|
|
58
|
+
type: "strikethrough",
|
|
59
|
+
content: t(8)
|
|
60
|
+
}) : i.push({
|
|
61
|
+
type: "italic",
|
|
62
|
+
content: t(7)
|
|
63
|
+
}) : i.push({
|
|
64
|
+
type: "bold",
|
|
65
|
+
content: t(6)
|
|
66
|
+
}) : i.push({
|
|
67
|
+
type: "code",
|
|
68
|
+
content: t(5)
|
|
69
|
+
}) : i.push({
|
|
70
|
+
type: "link",
|
|
71
|
+
text: t(3),
|
|
72
|
+
url: t(4)
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
l = u.index + u[0].length;
|
|
76
|
+
}
|
|
77
|
+
return l < t.length && i.push({
|
|
78
|
+
type: "text",
|
|
79
|
+
content: t.slice(l)
|
|
80
|
+
}), i.length === 0 && i.push({
|
|
81
|
+
type: "text",
|
|
82
|
+
content: t
|
|
83
|
+
}), i;
|
|
84
|
+
}
|
|
85
|
+
function n(e) {
|
|
86
|
+
let t = 0;
|
|
87
|
+
for (let n = 0; n < e.length; n++) {
|
|
88
|
+
if (e[n] === "\\") {
|
|
89
|
+
n++;
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
e[n] === "(" && e[n + 1] !== "?" && t++;
|
|
93
|
+
}
|
|
94
|
+
return t;
|
|
95
|
+
}
|
|
96
|
+
function r(e) {
|
|
97
|
+
return e.replace(/!\[([^\]]*)\]\([^)]+\)/g, "$1").replace(/\[([^\]]+)\]\([^)]+\)/g, "$1").replace(/`([^`]+)`/g, "$1").replace(/\*\*(.+?)\*\*/g, "$1").replace(/\*(.+?)\*/g, "$1").replace(/~~(.+?)~~/g, "$1").replace(/==(.+?)==/g, "$1").replace(/\$\$(.+?)\$\$/g, "$1").replace(/\$([^$]+?)\$/g, "$1");
|
|
98
|
+
}
|
|
99
|
+
var i = "'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, monospace", a = null;
|
|
100
|
+
function o() {
|
|
101
|
+
return a ||= document.createElement("canvas").getContext("2d"), a;
|
|
102
|
+
}
|
|
103
|
+
function s(e, t, n, r) {
|
|
104
|
+
let i = o();
|
|
105
|
+
return i.font = `${n} ${t}px ${r}`, i.measureText(e).width;
|
|
106
|
+
}
|
|
107
|
+
function c(e, t, n, r) {
|
|
108
|
+
let a = [], o = 0;
|
|
109
|
+
for (let c of e) {
|
|
110
|
+
let e;
|
|
111
|
+
switch (c.type) {
|
|
112
|
+
case "bold":
|
|
113
|
+
e = s(c.content, t, 700, r);
|
|
114
|
+
break;
|
|
115
|
+
case "code":
|
|
116
|
+
e = s(c.content, t * .88, 400, i);
|
|
117
|
+
break;
|
|
118
|
+
case "link":
|
|
119
|
+
e = s(c.text, t, n, r);
|
|
120
|
+
break;
|
|
121
|
+
case "image":
|
|
122
|
+
e = s(`[${c.alt || "image"}]`, t, n, r);
|
|
123
|
+
break;
|
|
124
|
+
case "latex-inline":
|
|
125
|
+
case "latex-block":
|
|
126
|
+
e = s(c.content, t * .9, n, i);
|
|
127
|
+
break;
|
|
128
|
+
default:
|
|
129
|
+
e = s("content" in c ? c.content : "", t, n, r);
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
a.push({
|
|
133
|
+
token: c,
|
|
134
|
+
x: o,
|
|
135
|
+
width: e
|
|
136
|
+
}), o += e;
|
|
137
|
+
}
|
|
138
|
+
return a;
|
|
139
|
+
}
|
|
140
|
+
function l(e) {
|
|
141
|
+
return e.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """);
|
|
142
|
+
}
|
|
143
|
+
function u(e, n, r, i, a, o, s, l, u, p, m) {
|
|
144
|
+
let h = c(t(e, l), n, r, i), g = h.length > 0 ? h[h.length - 1].x + h[h.length - 1].width : 0, _ = n * .85, v = o ? _ + (o ? 4 : 0) : 0, y = n * .7, b = s ? 4 : 0, x = s ? y + b : 0, S = -(v + g + x) / 2, C = S + v, w = [];
|
|
145
|
+
o && (w.push(`<g transform="translate(${S}, ${-_ / 2})">`), w.push(f(o, _)), w.push("</g>"));
|
|
146
|
+
let T = -n / 2 - 2, E = n + 4;
|
|
147
|
+
for (let e of h) e.token.type === "code" ? w.push(`<rect x="${C + e.x - 2}" y="${T}" width="${e.width + 4}" height="${E}" rx="3" fill="rgba(128,128,128,0.12)"/>`) : e.token.type === "highlight" && w.push(`<rect x="${C + e.x - 1}" y="${T}" width="${e.width + 2}" height="${E}" rx="2" fill="${p || "rgba(255,213,79,0.3)"}"/>`);
|
|
148
|
+
w.push(`<text text-anchor="start" dominant-baseline="central" x="${C}" fill="${a}" font-size="${n}" font-weight="${r}" font-family="${i}">`);
|
|
149
|
+
for (let e of h) w.push(d(e.token, l, u, m));
|
|
150
|
+
return w.push("</text>"), s && w.push(`<text x="${C + g + b}" text-anchor="start" dominant-baseline="central" font-size="${y}" opacity="0.5">💬</text>`), w.join("");
|
|
151
|
+
}
|
|
152
|
+
function d(e, t, n, r) {
|
|
153
|
+
switch (e.type) {
|
|
154
|
+
case "bold": return `<tspan font-weight="700">${l(e.content)}</tspan>`;
|
|
155
|
+
case "italic": return `<tspan font-style="italic">${l(e.content)}</tspan>`;
|
|
156
|
+
case "strikethrough": return `<tspan text-decoration="line-through" opacity="0.6">${l(e.content)}</tspan>`;
|
|
157
|
+
case "code": return `<tspan font-family="${i}" font-size="0.88em">${l(e.content)}</tspan>`;
|
|
158
|
+
case "highlight": return `<tspan fill="${n || "#FFEB3B"}">${l(e.content)}</tspan>`;
|
|
159
|
+
case "link": return `<a href="${l(e.url)}" target="_blank"><tspan fill="#2563EB" text-decoration="underline">${l(e.text)}</tspan></a>`;
|
|
160
|
+
case "image": return `<tspan font-style="italic">[${l(e.alt || "image")}]</tspan>`;
|
|
161
|
+
case "latex-inline":
|
|
162
|
+
case "latex-block":
|
|
163
|
+
if (t) {
|
|
164
|
+
for (let n of t) if (n.exportInlineToken) {
|
|
165
|
+
let t = n.exportInlineToken({
|
|
166
|
+
token: e,
|
|
167
|
+
x: 0,
|
|
168
|
+
width: 0
|
|
169
|
+
}, r);
|
|
170
|
+
if (t) return t;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return `<tspan font-family="${i}" font-style="italic" font-size="0.9em">${l(e.content)}</tspan>`;
|
|
174
|
+
default: return l(e.content);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function f(e, t) {
|
|
178
|
+
return e === "done" ? `<rect x="0" y="0" width="${t}" height="${t}" rx="${t * .2}" fill="#22C55E"/><path d="M${t * .28} ${t * .5}L${t * .44} ${t * .66}L${t * .72} ${t * .34}" stroke="white" stroke-width="${t * .13}" stroke-linecap="round" stroke-linejoin="round" fill="none"/>` : e === "doing" ? `<rect x="0" y="0" width="${t}" height="${t}" rx="${t * .2}" fill="none" stroke="#FBBF24" stroke-width="${t * .1}"/><rect x="${t * .25}" y="${t * .25}" width="${t * .5}" height="${t * .5}" rx="${t * .1}" fill="#FBBF24" opacity="0.6"/>` : `<rect x="0" y="0" width="${t}" height="${t}" rx="${t * .2}" fill="none" stroke="#999" stroke-width="${t * .1}" opacity="0.4"/>`;
|
|
179
|
+
}
|
|
180
|
+
function p(e, n, r, i, a, o, s, l, u, f) {
|
|
181
|
+
let p = c(t(e, s), n, r, i), m = -(p.length > 0 ? p[p.length - 1].x + p[p.length - 1].width : 0) / 2, h = [], g = o - n / 2 - 2, _ = n + 4;
|
|
182
|
+
for (let e of p) e.token.type === "code" ? h.push(`<rect x="${m + e.x - 2}" y="${g}" width="${e.width + 4}" height="${_}" rx="3" fill="rgba(128,128,128,0.12)"/>`) : e.token.type === "highlight" && h.push(`<rect x="${m + e.x - 1}" y="${g}" width="${e.width + 2}" height="${_}" rx="2" fill="${u || "rgba(255,213,79,0.3)"}"/>`);
|
|
183
|
+
let v = f === void 0 ? "" : ` opacity="${f}"`;
|
|
184
|
+
h.push(`<text x="${m}" y="${o}" text-anchor="start" dominant-baseline="central" fill="${a}" font-size="${n}" font-weight="${r}" font-family="${i}"${v}>`);
|
|
185
|
+
for (let e of p) h.push(d(e.token, s, l));
|
|
186
|
+
return h.push("</text>"), h.join("");
|
|
187
|
+
}
|
|
188
|
+
//#endregion
|
|
189
|
+
export { u as buildSvgNodeTextString, p as buildSvgTextLineString, c as computeTokenLayouts, l as escapeXml, t as parseInlineMarkdown, r as stripInlineMarkdown };
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { BRANCH_COLORS as e, THEME as t } from "./theme.js";
|
|
2
|
+
import { stripInlineMarkdown as n } from "./inline-markdown.js";
|
|
3
|
+
import { runAdjustNodeSize as r, runFilterChildren as i, runGenerateExtraEdges as a, runTransformEdge as o, runTransformNodeColor as s } from "../plugins/runner.js";
|
|
4
|
+
//#region src/components/MindMap/utils/layout.ts
|
|
5
|
+
var c = null;
|
|
6
|
+
function l() {
|
|
7
|
+
return c ||= document.createElement("canvas").getContext("2d"), c;
|
|
8
|
+
}
|
|
9
|
+
function u(e, n, r, i) {
|
|
10
|
+
let a = l();
|
|
11
|
+
return a.font = `${r} ${n}px ${i || t.root.fontFamily}`, a.measureText(e).width;
|
|
12
|
+
}
|
|
13
|
+
var d = 4, f = 20;
|
|
14
|
+
function p(e, t, r, i, a) {
|
|
15
|
+
let o = u(n(e), t, r);
|
|
16
|
+
return i && (o += t * .9 + d), a && (o += f), o;
|
|
17
|
+
}
|
|
18
|
+
function m(n, a, o, c, l, u, d) {
|
|
19
|
+
let f = a === 0, h = a === 1, g = f ? t.root.fontSize : h ? t.level1.fontSize : t.node.fontSize, _ = f ? t.root.fontWeight : h ? t.level1.fontWeight : t.node.fontWeight, v = f ? t.root.paddingH : t.node.paddingH, y = f ? t.root.paddingV : t.node.paddingV, b = p(n.text, g, _, n.taskStatus, !!n.remark) + v * 2, x = g + y * 2;
|
|
20
|
+
if (u && u.length > 0) {
|
|
21
|
+
let e = r(u, n, b, x, g);
|
|
22
|
+
b = e.width, x = e.height;
|
|
23
|
+
}
|
|
24
|
+
let S = n.children || [];
|
|
25
|
+
u && u.length > 0 && d && (S = i(u, n, S, d));
|
|
26
|
+
let C = c;
|
|
27
|
+
if (u && u.length > 0) {
|
|
28
|
+
let e = s(u, {
|
|
29
|
+
id: n.id,
|
|
30
|
+
text: n.text,
|
|
31
|
+
x: 0,
|
|
32
|
+
y: 0,
|
|
33
|
+
width: b,
|
|
34
|
+
height: x,
|
|
35
|
+
color: c,
|
|
36
|
+
depth: a,
|
|
37
|
+
side: o,
|
|
38
|
+
parentId: l
|
|
39
|
+
}, n, c);
|
|
40
|
+
e.color && (C = e.color);
|
|
41
|
+
}
|
|
42
|
+
let w = S.map((t, r) => {
|
|
43
|
+
let i = f ? e[r % e.length] : C;
|
|
44
|
+
return m(t, a + 1, o, i, n.id, u, d);
|
|
45
|
+
});
|
|
46
|
+
return {
|
|
47
|
+
id: n.id,
|
|
48
|
+
text: n.text,
|
|
49
|
+
children: w,
|
|
50
|
+
width: b,
|
|
51
|
+
height: x,
|
|
52
|
+
depth: a,
|
|
53
|
+
side: o,
|
|
54
|
+
color: C,
|
|
55
|
+
x: 0,
|
|
56
|
+
y: 0,
|
|
57
|
+
subtreeHeight: 0,
|
|
58
|
+
parentId: l,
|
|
59
|
+
remark: n.remark,
|
|
60
|
+
taskStatus: n.taskStatus,
|
|
61
|
+
dottedLine: n.dottedLine,
|
|
62
|
+
multiLineContent: n.multiLineContent,
|
|
63
|
+
tags: n.tags,
|
|
64
|
+
anchorId: n.anchorId,
|
|
65
|
+
crossLinks: n.crossLinks,
|
|
66
|
+
collapsed: n.collapsed
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
function h(e) {
|
|
70
|
+
if (e.children.length === 0) return e.subtreeHeight = e.height, e.height;
|
|
71
|
+
let n = e.children.reduce((e, t) => e + h(t), 0) + (e.children.length - 1) * t.layout.verticalGap;
|
|
72
|
+
return e.subtreeHeight = Math.max(e.height, n), e.subtreeHeight;
|
|
73
|
+
}
|
|
74
|
+
function g(e, n, r) {
|
|
75
|
+
if (e.x = n, e.y = r, e.children.length === 0) return;
|
|
76
|
+
let i = e.side === "left" ? -1 : 1, a = r - (e.children.reduce((e, t) => e + t.subtreeHeight, 0) + (e.children.length - 1) * t.layout.verticalGap) / 2;
|
|
77
|
+
for (let r of e.children) {
|
|
78
|
+
let o = a + r.subtreeHeight / 2;
|
|
79
|
+
g(r, n + i * (e.width / 2 + t.layout.horizontalGap + r.width / 2), o), a += r.subtreeHeight + t.layout.verticalGap;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function _(e, t) {
|
|
83
|
+
t.push({
|
|
84
|
+
id: e.id,
|
|
85
|
+
text: e.text,
|
|
86
|
+
x: e.x,
|
|
87
|
+
y: e.y,
|
|
88
|
+
width: e.width,
|
|
89
|
+
height: e.height,
|
|
90
|
+
color: e.color,
|
|
91
|
+
depth: e.depth,
|
|
92
|
+
side: e.side,
|
|
93
|
+
parentId: e.parentId,
|
|
94
|
+
remark: e.remark,
|
|
95
|
+
taskStatus: e.taskStatus,
|
|
96
|
+
dottedLine: e.dottedLine,
|
|
97
|
+
multiLineContent: e.multiLineContent,
|
|
98
|
+
tags: e.tags,
|
|
99
|
+
anchorId: e.anchorId,
|
|
100
|
+
crossLinks: e.crossLinks,
|
|
101
|
+
collapsed: e.collapsed
|
|
102
|
+
});
|
|
103
|
+
for (let n of e.children) _(n, t);
|
|
104
|
+
}
|
|
105
|
+
function v(e, t, n, r, i, a, o) {
|
|
106
|
+
let s = o === "left" ? -1 : 1, c = e + n / 2 * s, l = t, u = r - a / 2 * s, d = i, f = c + (u - c) * .5;
|
|
107
|
+
return `M ${c},${l} C ${f},${l} ${f},${d} ${u},${d}`;
|
|
108
|
+
}
|
|
109
|
+
function y(e, t, n, r) {
|
|
110
|
+
for (let i of e.children) {
|
|
111
|
+
let a = {
|
|
112
|
+
key: `${e.id}-${i.id}`,
|
|
113
|
+
path: v(e.x, e.y, e.width, i.x, i.y, i.width, i.side),
|
|
114
|
+
color: i.color,
|
|
115
|
+
fromId: e.id,
|
|
116
|
+
toId: i.id
|
|
117
|
+
};
|
|
118
|
+
if (r && r.length > 0) {
|
|
119
|
+
let t = n.find((t) => t.id === e.id), s = n.find((e) => e.id === i.id);
|
|
120
|
+
t && s && (a = o(r, a, t, s));
|
|
121
|
+
}
|
|
122
|
+
t.push(a), y(i, t, n, r);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
function b(n, r = "both", i, o, s, c, l) {
|
|
126
|
+
let u = s && s.length > 0 ? {
|
|
127
|
+
direction: r,
|
|
128
|
+
theme: t,
|
|
129
|
+
readonly: !!c,
|
|
130
|
+
foldOverrides: l || {}
|
|
131
|
+
} : void 0, d = n.children || [], f, p, v;
|
|
132
|
+
r === "right" ? (f = d, p = [], v = d.length) : r === "left" ? (f = [], p = d, v = 0) : (v = o ?? Math.ceil(d.length / 2), v = Math.min(Math.max(v, 0), d.length), f = d.slice(0, v), p = d.slice(v));
|
|
133
|
+
let b = m({
|
|
134
|
+
...n,
|
|
135
|
+
children: []
|
|
136
|
+
}, 0, "root", t.root.bgColor, void 0, s, u), x = f.map((t, r) => m(t, 1, "right", i?.[t.id] ?? e[r % e.length], n.id, s, u)), S = p.map((t, a) => m(t, 1, "left", i?.[t.id] ?? e[((r === "left" ? 0 : v) + a) % e.length], n.id, s, u));
|
|
137
|
+
b.children = [...x, ...S];
|
|
138
|
+
for (let e of b.children) h(e);
|
|
139
|
+
b.x = 0, b.y = 0;
|
|
140
|
+
let C = b.children.filter((e) => e.side === "right"), w = b.children.filter((e) => e.side === "left"), T = (e, n) => {
|
|
141
|
+
let r = -(e.reduce((e, t) => e + t.subtreeHeight, 0) + Math.max(0, e.length - 1) * t.layout.verticalGap) / 2;
|
|
142
|
+
for (let i of e) {
|
|
143
|
+
let e = r + i.subtreeHeight / 2;
|
|
144
|
+
g(i, n * (b.width / 2 + t.layout.horizontalGap + i.width / 2), e), r += i.subtreeHeight + t.layout.verticalGap;
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
T(C, 1), T(w, -1);
|
|
148
|
+
let E = [], D = [];
|
|
149
|
+
if (_(b, E), y(b, D, E, s), s && s.length > 0 && u) {
|
|
150
|
+
let e = a(s, E, [n], u);
|
|
151
|
+
D.push(...e);
|
|
152
|
+
}
|
|
153
|
+
return {
|
|
154
|
+
nodes: E,
|
|
155
|
+
edges: D
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function x(e, t = "both", n, r, i, a, o) {
|
|
159
|
+
if (e.length === 0) return {
|
|
160
|
+
nodes: [],
|
|
161
|
+
edges: []
|
|
162
|
+
};
|
|
163
|
+
if (e.length === 1) return b(e[0], t, n, r?.[e[0].id], i, a, o);
|
|
164
|
+
let s = e.map((e) => b(e, t, n, r?.[e.id], i, a, o)), c = s.map((e) => {
|
|
165
|
+
let t = Infinity, n = -Infinity;
|
|
166
|
+
for (let r of e.nodes) t = Math.min(t, r.y - r.height / 2), n = Math.max(n, r.y + r.height / 2);
|
|
167
|
+
return {
|
|
168
|
+
minY: t,
|
|
169
|
+
maxY: n
|
|
170
|
+
};
|
|
171
|
+
}), l = [], u = [], d = c[0].maxY;
|
|
172
|
+
for (let e of s[0].nodes) l.push(e);
|
|
173
|
+
for (let e of s[0].edges) u.push(e);
|
|
174
|
+
for (let e = 1; e < s.length; e++) {
|
|
175
|
+
let t = d + 80 - c[e].minY, n = l.length;
|
|
176
|
+
for (let n of s[e].nodes) l.push({
|
|
177
|
+
...n,
|
|
178
|
+
y: n.y + t
|
|
179
|
+
});
|
|
180
|
+
for (let t of s[e].edges) {
|
|
181
|
+
let e = l.slice(n).find((e) => e.id === t.fromId), r = l.slice(n).find((e) => e.id === t.toId);
|
|
182
|
+
e && r ? u.push({
|
|
183
|
+
...t,
|
|
184
|
+
path: v(e.x, e.y, e.width, r.x, r.y, r.width, r.side)
|
|
185
|
+
}) : u.push(t);
|
|
186
|
+
}
|
|
187
|
+
d = d + 80 + (c[e].maxY - c[e].minY);
|
|
188
|
+
}
|
|
189
|
+
let f = -(Math.min(...l.map((e) => e.y - e.height / 2)) + Math.max(...l.map((e) => e.y + e.height / 2))) / 2;
|
|
190
|
+
if (Math.abs(f) > .1) {
|
|
191
|
+
for (let e of l) e.y += f;
|
|
192
|
+
for (let e = 0; e < u.length; e++) {
|
|
193
|
+
let t = u[e];
|
|
194
|
+
if (t.isCrossLink) continue;
|
|
195
|
+
let n = l.find((e) => e.id === t.fromId), r = l.find((e) => e.id === t.toId);
|
|
196
|
+
n && r && (u[e] = {
|
|
197
|
+
...t,
|
|
198
|
+
path: v(n.x, n.y, n.width, r.x, r.y, r.width, r.side)
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return {
|
|
203
|
+
nodes: l,
|
|
204
|
+
edges: u
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
//#endregion
|
|
208
|
+
export { v as computeEdgePath, x as layoutMultiRoot };
|
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import { runCollectFollowLines as e, runParseLine as t, runPostParseTree as n, runPreParseMarkdown as r, runSerializeFollowLines as i, runSerializeListMarker as a, runSerializeNodeText as o, runSerializePreamble as s, runTransformNodeData as c } from "../plugins/runner.js";
|
|
2
|
+
//#region src/components/MindMap/utils/markdown.ts
|
|
3
|
+
function l(e) {
|
|
4
|
+
let t = e.match(/^\[([ x\-])\]\s+(.*)/);
|
|
5
|
+
if (!t) return { text: e };
|
|
6
|
+
let n = t[1], r = t[2];
|
|
7
|
+
return n === " " ? {
|
|
8
|
+
taskStatus: "todo",
|
|
9
|
+
text: r
|
|
10
|
+
} : n === "x" ? {
|
|
11
|
+
taskStatus: "done",
|
|
12
|
+
text: r
|
|
13
|
+
} : n === "-" ? {
|
|
14
|
+
taskStatus: "doing",
|
|
15
|
+
text: r
|
|
16
|
+
} : { text: e };
|
|
17
|
+
}
|
|
18
|
+
function u(i, a) {
|
|
19
|
+
let o = a && a.length > 0 ? a : void 0, s = o ? {
|
|
20
|
+
lines: [],
|
|
21
|
+
frontMatter: {}
|
|
22
|
+
} : void 0, u = i;
|
|
23
|
+
o && s && (u = r(o, u, s));
|
|
24
|
+
let f = u.split("\n");
|
|
25
|
+
s && (s.lines = f);
|
|
26
|
+
let p = [], m = null, h = [], g = 0;
|
|
27
|
+
for (; g < f.length;) {
|
|
28
|
+
let n = f[g], r = o && s ? t(o, n, g, s) : null;
|
|
29
|
+
if (r) {
|
|
30
|
+
let t = r.text.trim(), n = r.taskStatus, { taskStatus: i, text: a } = n ? {
|
|
31
|
+
taskStatus: n,
|
|
32
|
+
text: t
|
|
33
|
+
} : l(t);
|
|
34
|
+
if (a) {
|
|
35
|
+
let t = {
|
|
36
|
+
indent: r.indent,
|
|
37
|
+
text: a,
|
|
38
|
+
taskStatus: i,
|
|
39
|
+
remarkLines: [],
|
|
40
|
+
dottedLine: r.dottedLine,
|
|
41
|
+
collapsed: r.collapsed
|
|
42
|
+
}, n = g + 1;
|
|
43
|
+
for (; n < f.length;) {
|
|
44
|
+
let e = f[n].match(/^(\s*)>\s?(.*)$/);
|
|
45
|
+
if (e) t.remarkLines.push(e[2]), n++;
|
|
46
|
+
else break;
|
|
47
|
+
}
|
|
48
|
+
if (o && s) {
|
|
49
|
+
let r = {
|
|
50
|
+
id: "temp",
|
|
51
|
+
text: a
|
|
52
|
+
}, i = e(o, f, n, r, s);
|
|
53
|
+
Object.assign(t, { _pluginNode: r }), n += i;
|
|
54
|
+
}
|
|
55
|
+
p.push(t), g = n;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
let i = n.match(/^(\s*)[*-]\s+(.+)/);
|
|
60
|
+
if (i) {
|
|
61
|
+
let t = i[1].replace(/\t/g, " ").length, { taskStatus: n, text: r } = l(i[2].trim());
|
|
62
|
+
if (r) {
|
|
63
|
+
let i = {
|
|
64
|
+
indent: t,
|
|
65
|
+
text: r,
|
|
66
|
+
taskStatus: n,
|
|
67
|
+
remarkLines: []
|
|
68
|
+
}, a = g + 1;
|
|
69
|
+
for (; a < f.length;) {
|
|
70
|
+
let e = f[a].match(/^(\s*)>\s?(.*)$/);
|
|
71
|
+
if (e) i.remarkLines.push(e[2]), a++;
|
|
72
|
+
else break;
|
|
73
|
+
}
|
|
74
|
+
if (o && s) {
|
|
75
|
+
let t = {
|
|
76
|
+
id: "temp",
|
|
77
|
+
text: r
|
|
78
|
+
}, n = e(o, f, a, t, s);
|
|
79
|
+
Object.assign(i, { _pluginNode: t }), a += n;
|
|
80
|
+
}
|
|
81
|
+
p.push(i), g = a;
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
if (m === null && p.length === 0) {
|
|
86
|
+
let e = n.trim();
|
|
87
|
+
if (e) {
|
|
88
|
+
m = e;
|
|
89
|
+
let t = g + 1;
|
|
90
|
+
for (; t < f.length;) {
|
|
91
|
+
let e = f[t].match(/^(\s*)>\s?(.*)$/);
|
|
92
|
+
if (e) h.push(e[2]), t++;
|
|
93
|
+
else break;
|
|
94
|
+
}
|
|
95
|
+
g = t;
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
g++;
|
|
100
|
+
}
|
|
101
|
+
if (p.length === 0 && m === null) return {
|
|
102
|
+
id: "md-0",
|
|
103
|
+
text: "Root"
|
|
104
|
+
};
|
|
105
|
+
let _ = (e, t) => {
|
|
106
|
+
t.dottedLine && (e = {
|
|
107
|
+
...e,
|
|
108
|
+
dottedLine: !0
|
|
109
|
+
}), t.collapsed && (e = {
|
|
110
|
+
...e,
|
|
111
|
+
collapsed: !0
|
|
112
|
+
});
|
|
113
|
+
let n = t._pluginNode;
|
|
114
|
+
return n && n.multiLineContent && (e = {
|
|
115
|
+
...e,
|
|
116
|
+
multiLineContent: n.multiLineContent
|
|
117
|
+
}), o && s && (e = c(o, e, e.text, s)), e;
|
|
118
|
+
};
|
|
119
|
+
if (m !== null) {
|
|
120
|
+
let e = {
|
|
121
|
+
id: "md-0",
|
|
122
|
+
text: m,
|
|
123
|
+
children: [],
|
|
124
|
+
...h.length > 0 ? { remark: h.join("\n") } : {}
|
|
125
|
+
};
|
|
126
|
+
if (o && s && (e = c(o, e, m, s)), p.length === 0) return delete e.children, e;
|
|
127
|
+
let t = 2;
|
|
128
|
+
for (let e of p) if (e.indent > 0) {
|
|
129
|
+
t = e.indent;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
let r = p.map((e) => ({
|
|
133
|
+
level: e.indent > 0 ? Math.round(e.indent / t) : 0,
|
|
134
|
+
text: e.text,
|
|
135
|
+
taskStatus: e.taskStatus,
|
|
136
|
+
remarkLines: e.remarkLines,
|
|
137
|
+
_item: e
|
|
138
|
+
})), i = [[e, -1]];
|
|
139
|
+
for (let e = 0; e < r.length; e++) {
|
|
140
|
+
let { level: t, text: n, taskStatus: a, remarkLines: o, _item: s } = r[e], c = {
|
|
141
|
+
id: "md-tmp",
|
|
142
|
+
text: n,
|
|
143
|
+
...a ? { taskStatus: a } : {},
|
|
144
|
+
...o.length > 0 ? { remark: o.join("\n") } : {}
|
|
145
|
+
};
|
|
146
|
+
for (; i.length > 1 && i[i.length - 1][1] >= t;) i.pop();
|
|
147
|
+
let l = i[i.length - 1][0];
|
|
148
|
+
l.children ||= [], c.id = `${l.id}-${l.children.length}`, c = _(c, s), l.children.push(c), i.push([c, t]);
|
|
149
|
+
}
|
|
150
|
+
if (d(e), o && s) {
|
|
151
|
+
let [t] = n(o, [e], s);
|
|
152
|
+
return t;
|
|
153
|
+
}
|
|
154
|
+
return e;
|
|
155
|
+
}
|
|
156
|
+
let v = 2;
|
|
157
|
+
for (let e of p) if (e.indent > 0) {
|
|
158
|
+
v = e.indent;
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
let y = p.map((e) => ({
|
|
162
|
+
level: e.indent > 0 ? Math.round(e.indent / v) : 0,
|
|
163
|
+
text: e.text,
|
|
164
|
+
taskStatus: e.taskStatus,
|
|
165
|
+
remarkLines: e.remarkLines,
|
|
166
|
+
_item: e
|
|
167
|
+
})), b = {
|
|
168
|
+
id: "md-0",
|
|
169
|
+
text: y[0].text,
|
|
170
|
+
children: [],
|
|
171
|
+
...y[0].taskStatus ? { taskStatus: y[0].taskStatus } : {},
|
|
172
|
+
...y[0].remarkLines.length > 0 ? { remark: y[0].remarkLines.join("\n") } : {}
|
|
173
|
+
};
|
|
174
|
+
b = _(b, y[0]._item);
|
|
175
|
+
let x = [[b, 0]];
|
|
176
|
+
for (let e = 1; e < y.length; e++) {
|
|
177
|
+
let { level: t, text: n, taskStatus: r, remarkLines: i, _item: a } = y[e], o = t === 0 ? 1 : t, s = {
|
|
178
|
+
id: "md-tmp",
|
|
179
|
+
text: n,
|
|
180
|
+
...r ? { taskStatus: r } : {},
|
|
181
|
+
...i.length > 0 ? { remark: i.join("\n") } : {}
|
|
182
|
+
};
|
|
183
|
+
for (; x.length > 1 && x[x.length - 1][1] >= o;) x.pop();
|
|
184
|
+
let c = x[x.length - 1][0];
|
|
185
|
+
c.children ||= [];
|
|
186
|
+
let l = c.children.length;
|
|
187
|
+
s.id = `${c.id}-${l}`, s = _(s, a), c.children.push(s), x.push([s, o]);
|
|
188
|
+
}
|
|
189
|
+
if (d(b), o && s) {
|
|
190
|
+
let [e] = n(o, [b], s);
|
|
191
|
+
return e;
|
|
192
|
+
}
|
|
193
|
+
return b;
|
|
194
|
+
}
|
|
195
|
+
function d(e) {
|
|
196
|
+
if (e.children && e.children.length === 0) delete e.children;
|
|
197
|
+
else if (e.children) for (let t of e.children) d(t);
|
|
198
|
+
}
|
|
199
|
+
function f(e, t = 0, n) {
|
|
200
|
+
let r = n && n.length > 0 ? n : void 0, s;
|
|
201
|
+
if (t === 0) {
|
|
202
|
+
let t = e.text;
|
|
203
|
+
r && (t = o(r, e, t)), s = t + "\n";
|
|
204
|
+
} else {
|
|
205
|
+
let n = "";
|
|
206
|
+
e.taskStatus && (n = {
|
|
207
|
+
todo: "[ ]",
|
|
208
|
+
doing: "[-]",
|
|
209
|
+
done: "[x]"
|
|
210
|
+
}[e.taskStatus] + " ");
|
|
211
|
+
let i = "- ";
|
|
212
|
+
r && (i = a(r, e, i));
|
|
213
|
+
let c = e.text;
|
|
214
|
+
r && (c = o(r, e, c)), s = " ".repeat(t - 1) + i + n + c + "\n";
|
|
215
|
+
}
|
|
216
|
+
if (e.remark) {
|
|
217
|
+
let n = t === 0 ? " " : " ".repeat(t);
|
|
218
|
+
for (let t of e.remark.split("\n")) s += n + "> " + t + "\n";
|
|
219
|
+
}
|
|
220
|
+
if (r) {
|
|
221
|
+
let n = i(r, e, t), a = t === 0 ? " " : " ".repeat(t);
|
|
222
|
+
for (let e of n) s += a + e + "\n";
|
|
223
|
+
}
|
|
224
|
+
if (e.children) for (let r of e.children) s += f(r, t + 1, n);
|
|
225
|
+
return s;
|
|
226
|
+
}
|
|
227
|
+
function p(e, t) {
|
|
228
|
+
let i = t && t.length > 0 ? t : void 0, a = e, o = i ? {
|
|
229
|
+
lines: [],
|
|
230
|
+
frontMatter: {}
|
|
231
|
+
} : void 0;
|
|
232
|
+
i && o && (a = r(i, a, o)), a = a.split("\n").filter((e) => e.trim().length > 0).join("\n");
|
|
233
|
+
let s = a.split(/\n[ \t]*\n/).filter((e) => e.trim());
|
|
234
|
+
if (s.length === 0) return [{
|
|
235
|
+
id: "md-0",
|
|
236
|
+
text: "Root"
|
|
237
|
+
}];
|
|
238
|
+
let c = i ? i.map((e) => ({
|
|
239
|
+
...e,
|
|
240
|
+
preParseMarkdown: void 0
|
|
241
|
+
})) : void 0;
|
|
242
|
+
if (s.length === 1) {
|
|
243
|
+
let e = [u(a, c)];
|
|
244
|
+
return i && o ? n(i, e, o) : e;
|
|
245
|
+
}
|
|
246
|
+
let l = s.map((e, t) => {
|
|
247
|
+
let n = u(e, c);
|
|
248
|
+
return m(n, `md-${t}`), n;
|
|
249
|
+
});
|
|
250
|
+
return i && o ? n(i, l, o) : l;
|
|
251
|
+
}
|
|
252
|
+
function m(e, t) {
|
|
253
|
+
if (e.id = t, e.children) for (let n = 0; n < e.children.length; n++) m(e.children[n], `${t}-${n}`);
|
|
254
|
+
}
|
|
255
|
+
function h(e, t) {
|
|
256
|
+
let n = t && t.length > 0 ? t : void 0, r = "";
|
|
257
|
+
n && (r = s(n, e));
|
|
258
|
+
let i = e.map((e) => f(e, 0, t)).join("\n");
|
|
259
|
+
return r + i;
|
|
260
|
+
}
|
|
261
|
+
function g(e, t) {
|
|
262
|
+
let i = {
|
|
263
|
+
lines: [],
|
|
264
|
+
frontMatter: {}
|
|
265
|
+
}, a = r(t, e, i);
|
|
266
|
+
a = a.split("\n").filter((e) => e.trim().length > 0).join("\n");
|
|
267
|
+
let o = t.map((e) => ({
|
|
268
|
+
...e,
|
|
269
|
+
preParseMarkdown: void 0
|
|
270
|
+
})), s = a.split(/\n[ \t]*\n/).filter((e) => e.trim());
|
|
271
|
+
if (s.length === 0) return {
|
|
272
|
+
roots: [{
|
|
273
|
+
id: "md-0",
|
|
274
|
+
text: "Root"
|
|
275
|
+
}],
|
|
276
|
+
frontMatter: i.frontMatter
|
|
277
|
+
};
|
|
278
|
+
let c;
|
|
279
|
+
return c = s.length === 1 ? [u(a, o)] : s.map((e, t) => {
|
|
280
|
+
let n = u(e, o);
|
|
281
|
+
return m(n, `md-${t}`), n;
|
|
282
|
+
}), c = n(t, c, i), {
|
|
283
|
+
roots: c,
|
|
284
|
+
frontMatter: i.frontMatter
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
//#endregion
|
|
288
|
+
export { u as parseMarkdownList, p as parseMarkdownMultiRoot, g as parseMarkdownWithFrontMatter, f as toMarkdownList, h as toMarkdownMultiRoot };
|