@milkdown/preset-gfm 7.0.0 → 7.1.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/lib/composed/inputrules.d.ts.map +1 -1
- package/lib/index.es.js +142 -130
- package/lib/index.es.js.map +1 -1
- package/lib/node/task-list-item.d.ts +1 -0
- package/lib/node/task-list-item.d.ts.map +1 -1
- package/package.json +8 -8
- package/src/composed/inputrules.ts +2 -1
- package/src/node/task-list-item.ts +29 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inputrules.d.ts","sourceRoot":"","sources":["../../src/composed/inputrules.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAInD,eAAO,MAAM,UAAU,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"inputrules.d.ts","sourceRoot":"","sources":["../../src/composed/inputrules.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAA;AAInD,eAAO,MAAM,UAAU,EAAE,cAAc,EAGtC,CAAA"}
|
package/lib/index.es.js
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { expectDomTypeError as $ } from "@milkdown/exception";
|
|
2
|
-
import { paragraphSchema as W, listItemSchema as
|
|
2
|
+
import { paragraphSchema as W, listItemSchema as se } from "@milkdown/preset-commonmark";
|
|
3
|
+
import { InputRule as K } from "@milkdown/prose/inputrules";
|
|
4
|
+
import { $markAttr as ce, $markSchema as ae, $command as p, $useKeymap as L, $nodeSchema as w, $inputRule as z, $prose as _, $remark as ie } from "@milkdown/utils";
|
|
3
5
|
import { commandsCtx as S } from "@milkdown/core";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
|
|
10
|
-
import Te from "remark-gfm";
|
|
11
|
-
const j = Ce("strike_through"), V = we("strike_through", (e) => ({
|
|
6
|
+
import { TextSelection as de, Selection as G, PluginKey as ue, Plugin as me } from "@milkdown/prose/state";
|
|
7
|
+
import { TableMap as h, CellSelection as C, tableNodes as fe, goToNextCell as j, isInTable as y, deleteTable as pe, deleteColumn as he, deleteRow as ge, addColumnBefore as be, addColumnAfter as Ce, selectedRect as V, setCellAttr as we, columnResizing as ke, tableEditing as ye } from "@milkdown/prose/tables";
|
|
8
|
+
import { findParentNode as Se, cloneTr as T, browser as D } from "@milkdown/prose";
|
|
9
|
+
import { toggleMark as Te } from "@milkdown/prose/commands";
|
|
10
|
+
import Ae from "remark-gfm";
|
|
11
|
+
const Z = ce("strike_through"), U = ae("strike_through", (e) => ({
|
|
12
12
|
inclusive: !1,
|
|
13
13
|
parseDOM: [
|
|
14
14
|
{ tag: "del" },
|
|
15
15
|
{ style: "text-decoration", getAttrs: (t) => t === "line-through" }
|
|
16
16
|
],
|
|
17
|
-
toDOM: (t) => ["del", e.get(
|
|
17
|
+
toDOM: (t) => ["del", e.get(Z.key)(t)],
|
|
18
18
|
parseMarkdown: {
|
|
19
19
|
match: (t) => t.type === "delete",
|
|
20
20
|
runner: (t, n, o) => {
|
|
@@ -27,17 +27,17 @@ const j = Ce("strike_through"), V = we("strike_through", (e) => ({
|
|
|
27
27
|
t.withMark(n, "delete");
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
|
-
})),
|
|
30
|
+
})), X = p("ToggleStrikeThrough", () => () => Te(U.type())), Me = L("strikeThroughKeymap", {
|
|
31
31
|
ToggleStrikethrough: {
|
|
32
32
|
shortcuts: "Mod-Alt-x",
|
|
33
33
|
command: (e) => {
|
|
34
34
|
const t = e.get(S);
|
|
35
|
-
return () => t.call(
|
|
35
|
+
return () => t.call(X.key);
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
}),
|
|
39
|
-
const n = Array(t).fill(0).map(() => O.type().createAndFill()), o = Array(t).fill(0).map(() =>
|
|
40
|
-
return
|
|
38
|
+
}), q = (e = 3, t = 3) => {
|
|
39
|
+
const n = Array(t).fill(0).map(() => O.type().createAndFill()), o = Array(t).fill(0).map(() => oe.type().createAndFill()), l = Array(e).fill(0).map((r, s) => E.type().create(null, s === 0 ? o : n));
|
|
40
|
+
return I.type().create(null, l);
|
|
41
41
|
}, k = (e) => Se((t) => t.type.spec.tableRole === "table")(e), g = (e, t) => {
|
|
42
42
|
const n = k(t);
|
|
43
43
|
if (!n)
|
|
@@ -92,19 +92,19 @@ const j = Ce("strike_through"), V = we("strike_through", (e) => ({
|
|
|
92
92
|
const n = e.doc.resolve(t[0].pos), o = t[t.length - 1];
|
|
93
93
|
if (o) {
|
|
94
94
|
const l = e.doc.resolve(o.pos);
|
|
95
|
-
return
|
|
95
|
+
return T(e.setSelection(new C(l, n)));
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
return e;
|
|
99
99
|
};
|
|
100
|
-
function
|
|
101
|
-
const r = Array(l).fill(0).reduce((i, a,
|
|
102
|
-
const
|
|
103
|
-
return O.type().createAndFill({ alignment:
|
|
100
|
+
function J(e, { map: t, tableStart: n, table: o }, l) {
|
|
101
|
+
const r = Array(l).fill(0).reduce((i, a, d) => i + o.child(d).nodeSize, n), s = Array(t.width).fill(0).map((i, a) => {
|
|
102
|
+
const d = o.nodeAt(t.map[a]);
|
|
103
|
+
return O.type().createAndFill({ alignment: d == null ? void 0 : d.attrs.alignment });
|
|
104
104
|
});
|
|
105
|
-
return e.insert(r,
|
|
105
|
+
return e.insert(r, E.type().create(null, s)), e;
|
|
106
106
|
}
|
|
107
|
-
const
|
|
107
|
+
const Q = (e) => (t) => (n) => {
|
|
108
108
|
const o = k(n.selection), l = e === "row";
|
|
109
109
|
if (o) {
|
|
110
110
|
const r = h.get(o.node);
|
|
@@ -113,19 +113,19 @@ const q = (e) => (t) => (n) => {
|
|
|
113
113
|
l ? t : r.height - 1,
|
|
114
114
|
l ? r.width - 1 : t,
|
|
115
115
|
o.node
|
|
116
|
-
), i = n.doc.resolve(o.start + s), a = l ? C.rowSelection : C.colSelection,
|
|
117
|
-
return
|
|
116
|
+
), i = n.doc.resolve(o.start + s), a = l ? C.rowSelection : C.colSelection, d = r.positionAt(l ? t : 0, l ? 0 : t, o.node), c = n.doc.resolve(o.start + d);
|
|
117
|
+
return T(n.setSelection(a(i, c)));
|
|
118
118
|
}
|
|
119
119
|
}
|
|
120
120
|
return n;
|
|
121
|
-
}, Ne =
|
|
121
|
+
}, Ne = Q("row"), xe = Q("col"), P = (e) => e[0].map((t, n) => e.map((o) => o[n])), Y = (e, t) => {
|
|
122
122
|
const n = [], o = h.get(e);
|
|
123
123
|
for (let r = 0; r < o.height; r++) {
|
|
124
124
|
const s = e.child(r), i = [];
|
|
125
125
|
for (let a = 0; a < o.width; a++) {
|
|
126
126
|
if (!t[r][a])
|
|
127
127
|
continue;
|
|
128
|
-
const
|
|
128
|
+
const d = o.map[r * o.width + a], c = t[r][a], m = e.nodeAt(d).type.createChecked(
|
|
129
129
|
Object.assign({}, c.attrs),
|
|
130
130
|
c.content,
|
|
131
131
|
c.marks
|
|
@@ -139,13 +139,13 @@ const q = (e) => (t) => (n) => {
|
|
|
139
139
|
n,
|
|
140
140
|
e.marks
|
|
141
141
|
);
|
|
142
|
-
},
|
|
142
|
+
}, ee = (e) => {
|
|
143
143
|
const t = h.get(e), n = [];
|
|
144
144
|
for (let o = 0; o < t.height; o++) {
|
|
145
145
|
const l = [], r = {};
|
|
146
146
|
for (let s = 0; s < t.width; s++) {
|
|
147
|
-
const i = t.map[o * t.width + s], a = e.nodeAt(i),
|
|
148
|
-
if (r[i] ||
|
|
147
|
+
const i = t.map[o * t.width + s], a = e.nodeAt(i), d = t.findCell(i);
|
|
148
|
+
if (r[i] || d.top !== o) {
|
|
149
149
|
l.push(null);
|
|
150
150
|
continue;
|
|
151
151
|
}
|
|
@@ -154,36 +154,36 @@ const q = (e) => (t) => (n) => {
|
|
|
154
154
|
n.push(l);
|
|
155
155
|
}
|
|
156
156
|
return n;
|
|
157
|
-
},
|
|
157
|
+
}, te = (e, t, n, o) => {
|
|
158
158
|
const l = t[0] > n[0] ? -1 : 1, r = e.splice(t[0], t.length), s = r.length % 2 === 0 ? 1 : 0;
|
|
159
159
|
let i;
|
|
160
160
|
return o === -1 && l === 1 ? i = n[0] - 1 : o === 1 && l === -1 ? i = n[n.length - 1] - s + 1 : i = l === -1 ? n[0] : n[n.length - 1] - s, e.splice(i, 0, ...r), e;
|
|
161
161
|
}, $e = (e, t, n, o) => {
|
|
162
|
-
let l = P(
|
|
163
|
-
return l =
|
|
162
|
+
let l = P(ee(e.node));
|
|
163
|
+
return l = te(l, t, n, o), l = P(l), Y(e.node, l);
|
|
164
164
|
}, _e = (e, t, n, o) => {
|
|
165
|
-
let l =
|
|
166
|
-
return l =
|
|
165
|
+
let l = ee(e.node);
|
|
166
|
+
return l = te(l, t, n, o), Y(e.node, l);
|
|
167
167
|
}, B = (e, t) => {
|
|
168
168
|
let n = e, o = e;
|
|
169
169
|
for (let c = e; c >= 0; c--) {
|
|
170
|
-
const
|
|
171
|
-
|
|
170
|
+
const u = g(c, t.selection);
|
|
171
|
+
u && u.forEach((m) => {
|
|
172
172
|
const f = m.node.attrs.colspan + c - 1;
|
|
173
173
|
f >= n && (n = c), f > o && (o = f);
|
|
174
174
|
});
|
|
175
175
|
}
|
|
176
176
|
for (let c = e; c <= o; c++) {
|
|
177
|
-
const
|
|
178
|
-
|
|
177
|
+
const u = g(c, t.selection);
|
|
178
|
+
u && u.forEach((m) => {
|
|
179
179
|
const f = m.node.attrs.colspan + c - 1;
|
|
180
180
|
m.node.attrs.colspan > 1 && f > o && (o = f);
|
|
181
181
|
});
|
|
182
182
|
}
|
|
183
183
|
const l = [];
|
|
184
184
|
for (let c = n; c <= o; c++) {
|
|
185
|
-
const
|
|
186
|
-
|
|
185
|
+
const u = g(c, t.selection);
|
|
186
|
+
u && u.length && l.push(c);
|
|
187
187
|
}
|
|
188
188
|
n = l[0], o = l[l.length - 1];
|
|
189
189
|
const r = g(n, t.selection), s = b(0, t.selection), i = t.doc.resolve(
|
|
@@ -191,19 +191,19 @@ const q = (e) => (t) => (n) => {
|
|
|
191
191
|
);
|
|
192
192
|
let a;
|
|
193
193
|
for (let c = o; c >= n; c--) {
|
|
194
|
-
const
|
|
195
|
-
if (
|
|
194
|
+
const u = g(c, t.selection);
|
|
195
|
+
if (u && u.length) {
|
|
196
196
|
for (let m = s.length - 1; m >= 0; m--)
|
|
197
|
-
if (s[m].pos ===
|
|
198
|
-
a =
|
|
197
|
+
if (s[m].pos === u[0].pos) {
|
|
198
|
+
a = u[0];
|
|
199
199
|
break;
|
|
200
200
|
}
|
|
201
201
|
if (a)
|
|
202
202
|
break;
|
|
203
203
|
}
|
|
204
204
|
}
|
|
205
|
-
const
|
|
206
|
-
return { $anchor: i, $head:
|
|
205
|
+
const d = t.doc.resolve(a.pos);
|
|
206
|
+
return { $anchor: i, $head: d, indexes: l };
|
|
207
207
|
}, F = (e, t) => {
|
|
208
208
|
let n = e, o = e;
|
|
209
209
|
for (let c = e; c >= 0; c--)
|
|
@@ -218,28 +218,28 @@ const q = (e) => (t) => (n) => {
|
|
|
218
218
|
});
|
|
219
219
|
const l = [];
|
|
220
220
|
for (let c = n; c <= o; c++) {
|
|
221
|
-
const
|
|
222
|
-
|
|
221
|
+
const u = b(c, t.selection);
|
|
222
|
+
u && u.length && l.push(c);
|
|
223
223
|
}
|
|
224
224
|
n = l[0], o = l[l.length - 1];
|
|
225
225
|
const r = b(n, t.selection), s = g(0, t.selection), i = t.doc.resolve(r[r.length - 1].pos);
|
|
226
226
|
let a;
|
|
227
227
|
for (let c = o; c >= n; c--) {
|
|
228
|
-
const
|
|
229
|
-
if (
|
|
228
|
+
const u = b(c, t.selection);
|
|
229
|
+
if (u && u.length) {
|
|
230
230
|
for (let m = s.length - 1; m >= 0; m--)
|
|
231
|
-
if (s[m].pos ===
|
|
232
|
-
a =
|
|
231
|
+
if (s[m].pos === u[0].pos) {
|
|
232
|
+
a = u[0];
|
|
233
233
|
break;
|
|
234
234
|
}
|
|
235
235
|
if (a)
|
|
236
236
|
break;
|
|
237
237
|
}
|
|
238
238
|
}
|
|
239
|
-
const
|
|
240
|
-
return { $anchor: i, $head:
|
|
239
|
+
const d = t.doc.resolve(a.pos);
|
|
240
|
+
return { $anchor: i, $head: d, indexes: l };
|
|
241
241
|
};
|
|
242
|
-
function
|
|
242
|
+
function Ie(e, t, n, o = !0) {
|
|
243
243
|
const l = k(e.selection);
|
|
244
244
|
if (!l)
|
|
245
245
|
return e;
|
|
@@ -251,17 +251,17 @@ function Ee(e, t, n, o = !0) {
|
|
|
251
251
|
r,
|
|
252
252
|
s,
|
|
253
253
|
0
|
|
254
|
-
), a =
|
|
254
|
+
), a = T(e).replaceWith(
|
|
255
255
|
l.pos,
|
|
256
256
|
l.pos + l.node.nodeSize,
|
|
257
257
|
i
|
|
258
258
|
);
|
|
259
259
|
if (!o)
|
|
260
260
|
return a;
|
|
261
|
-
const
|
|
261
|
+
const d = h.get(i), c = l.start, u = n, m = d.positionAt(d.height - 1, u, i), f = a.doc.resolve(c + m), M = C.colSelection, R = d.positionAt(0, u, i), v = a.doc.resolve(c + R);
|
|
262
262
|
return a.setSelection(M(f, v));
|
|
263
263
|
}
|
|
264
|
-
function
|
|
264
|
+
function Ee(e, t, n, o = !0) {
|
|
265
265
|
const l = k(e.selection);
|
|
266
266
|
if (!l)
|
|
267
267
|
return e;
|
|
@@ -273,17 +273,17 @@ function Ie(e, t, n, o = !0) {
|
|
|
273
273
|
r,
|
|
274
274
|
s,
|
|
275
275
|
0
|
|
276
|
-
), a =
|
|
276
|
+
), a = T(e).replaceWith(
|
|
277
277
|
l.pos,
|
|
278
278
|
l.pos + l.node.nodeSize,
|
|
279
279
|
i
|
|
280
280
|
);
|
|
281
281
|
if (!o)
|
|
282
282
|
return a;
|
|
283
|
-
const
|
|
283
|
+
const d = h.get(i), c = l.start, u = n, m = d.positionAt(u, d.width - 1, i), f = a.doc.resolve(c + m), M = C.rowSelection, R = d.positionAt(u, 0, i), v = a.doc.resolve(c + R);
|
|
284
284
|
return a.setSelection(M(f, v));
|
|
285
285
|
}
|
|
286
|
-
const
|
|
286
|
+
const A = fe({
|
|
287
287
|
tableGroup: "block",
|
|
288
288
|
cellContent: "paragraph",
|
|
289
289
|
cellAttributes: {
|
|
@@ -295,8 +295,8 @@ const T = ie({
|
|
|
295
295
|
}
|
|
296
296
|
}
|
|
297
297
|
}
|
|
298
|
-
}),
|
|
299
|
-
...
|
|
298
|
+
}), I = w("table", () => ({
|
|
299
|
+
...A.table,
|
|
300
300
|
parseMarkdown: {
|
|
301
301
|
match: (e) => e.type === "table",
|
|
302
302
|
runner: (e, t, n) => {
|
|
@@ -321,8 +321,8 @@ const T = ie({
|
|
|
321
321
|
}), e.openNode("table", void 0, { align: o }), e.next(t.content), e.closeNode();
|
|
322
322
|
}
|
|
323
323
|
}
|
|
324
|
-
})),
|
|
325
|
-
...
|
|
324
|
+
})), E = w("table_row", () => ({
|
|
325
|
+
...A.table_row,
|
|
326
326
|
parseMarkdown: {
|
|
327
327
|
match: (e) => e.type === "tableRow",
|
|
328
328
|
runner: (e, t, n) => {
|
|
@@ -341,7 +341,7 @@ const T = ie({
|
|
|
341
341
|
}
|
|
342
342
|
}
|
|
343
343
|
})), O = w("table_cell", () => ({
|
|
344
|
-
...
|
|
344
|
+
...A.table_cell,
|
|
345
345
|
parseMarkdown: {
|
|
346
346
|
match: (e) => e.type === "tableCell" && !e.isHeader,
|
|
347
347
|
runner: (e, t, n) => {
|
|
@@ -355,8 +355,8 @@ const T = ie({
|
|
|
355
355
|
e.openNode("tableCell").next(t.content).closeNode();
|
|
356
356
|
}
|
|
357
357
|
}
|
|
358
|
-
})),
|
|
359
|
-
...
|
|
358
|
+
})), oe = w("table_header", () => ({
|
|
359
|
+
...A.table_header,
|
|
360
360
|
parseMarkdown: {
|
|
361
361
|
match: (e) => e.type === "tableCell" && !!e.isHeader,
|
|
362
362
|
runner: (e, t, n) => {
|
|
@@ -370,32 +370,32 @@ const T = ie({
|
|
|
370
370
|
e.openNode("tableCell"), e.next(t.content), e.closeNode();
|
|
371
371
|
}
|
|
372
372
|
}
|
|
373
|
-
})), Oe =
|
|
373
|
+
})), Oe = z(() => new K(
|
|
374
374
|
/^\|(?<col>\d+)[xX](?<row>\d+)\|\s$/,
|
|
375
375
|
(e, t, n, o) => {
|
|
376
376
|
var i, a;
|
|
377
377
|
const l = e.doc.resolve(n);
|
|
378
|
-
if (!l.node(-1).canReplaceWith(l.index(-1), l.indexAfter(-1),
|
|
378
|
+
if (!l.node(-1).canReplaceWith(l.index(-1), l.indexAfter(-1), I.type()))
|
|
379
379
|
return null;
|
|
380
|
-
const r =
|
|
380
|
+
const r = q(
|
|
381
381
|
Number((i = t.groups) == null ? void 0 : i.row),
|
|
382
382
|
Number((a = t.groups) == null ? void 0 : a.col)
|
|
383
383
|
), s = e.tr.replaceRangeWith(n, o, r).scrollIntoView();
|
|
384
|
-
return s.setSelection(
|
|
384
|
+
return s.setSelection(de.create(s.doc, n + 3));
|
|
385
385
|
}
|
|
386
|
-
)),
|
|
386
|
+
)), ne = p("GoToPrevTableCell", () => () => j(-1)), le = p("GoToNextTableCell", () => () => j(1)), re = p("BreakTable", () => () => (e, t) => {
|
|
387
387
|
if (!y(e))
|
|
388
388
|
return !1;
|
|
389
389
|
const { $head: n } = e.selection, o = n.after(), l = e.tr.replaceWith(o, o, W.type().createAndFill());
|
|
390
|
-
return l.setSelection(
|
|
390
|
+
return l.setSelection(G.near(l.doc.resolve(o), 1)).scrollIntoView(), t == null || t(l), !0;
|
|
391
391
|
}), De = p("InsertTable", () => ({ row: e, col: t } = {}) => (n, o) => {
|
|
392
|
-
const { selection: l, tr: r } = n, { from: s } = l, i =
|
|
393
|
-
return
|
|
392
|
+
const { selection: l, tr: r } = n, { from: s } = l, i = q(e, t), a = r.replaceSelectionWith(i), d = G.findFrom(a.doc.resolve(s), 1, !0);
|
|
393
|
+
return d && (o == null || o(a.setSelection(d))), !0;
|
|
394
394
|
}), Pe = p("MoveRow", () => ({ from: e, to: t } = {}) => (n, o) => {
|
|
395
|
-
const { tr: l } = n, r = o == null ? void 0 : o(
|
|
395
|
+
const { tr: l } = n, r = o == null ? void 0 : o(Ee(l, e ?? 0, t ?? 0, !0));
|
|
396
396
|
return Boolean(r);
|
|
397
397
|
}), Be = p("MoveCol", () => ({ from: e, to: t } = {}) => (n, o) => {
|
|
398
|
-
const { tr: l } = n, r = o == null ? void 0 : o(
|
|
398
|
+
const { tr: l } = n, r = o == null ? void 0 : o(Ie(l, e ?? 0, t ?? 0, !0));
|
|
399
399
|
return Boolean(r);
|
|
400
400
|
}), Fe = p("SelectRow", () => (e = 0) => (t, n) => {
|
|
401
401
|
const { tr: o } = t, l = n == null ? void 0 : n(Ne(e)(o));
|
|
@@ -411,43 +411,43 @@ const T = ie({
|
|
|
411
411
|
if (!(n instanceof C))
|
|
412
412
|
return !1;
|
|
413
413
|
const o = n.isRowSelection(), l = n.isColSelection();
|
|
414
|
-
return o && l ?
|
|
415
|
-
}), Le = p("AddColBefore", () => () =>
|
|
414
|
+
return o && l ? pe(e, t) : l ? he(e, t) : ge(e, t);
|
|
415
|
+
}), Le = p("AddColBefore", () => () => be), ze = p("AddColAfter", () => () => Ce), Ge = p("AddRowBefore", () => () => (e, t) => {
|
|
416
416
|
if (!y(e))
|
|
417
417
|
return !1;
|
|
418
418
|
if (t) {
|
|
419
|
-
const n =
|
|
420
|
-
t(
|
|
419
|
+
const n = V(e);
|
|
420
|
+
t(J(e.tr, n, n.top));
|
|
421
421
|
}
|
|
422
422
|
return !0;
|
|
423
423
|
}), je = p("AddRowAfter", () => () => (e, t) => {
|
|
424
424
|
if (!y(e))
|
|
425
425
|
return !1;
|
|
426
426
|
if (t) {
|
|
427
|
-
const n =
|
|
428
|
-
t(
|
|
427
|
+
const n = V(e);
|
|
428
|
+
t(J(e.tr, n, n.bottom));
|
|
429
429
|
}
|
|
430
430
|
return !0;
|
|
431
|
-
}), Ve = p("SetAlign", () => (e = "left") =>
|
|
431
|
+
}), Ve = p("SetAlign", () => (e = "left") => we("alignment", e)), Ze = L("tableKeymap", {
|
|
432
432
|
NextCell: {
|
|
433
433
|
shortcuts: ["Mod-]", "Tab"],
|
|
434
434
|
command: (e) => {
|
|
435
435
|
const t = e.get(S);
|
|
436
|
-
return () => t.call(
|
|
436
|
+
return () => t.call(le.key);
|
|
437
437
|
}
|
|
438
438
|
},
|
|
439
439
|
PrevCell: {
|
|
440
440
|
shortcuts: ["Mod-[", "Shift-Tab"],
|
|
441
441
|
command: (e) => {
|
|
442
442
|
const t = e.get(S);
|
|
443
|
-
return () => t.call(
|
|
443
|
+
return () => t.call(ne.key);
|
|
444
444
|
}
|
|
445
445
|
},
|
|
446
446
|
ExitTable: {
|
|
447
447
|
shortcuts: ["Mod-Enter"],
|
|
448
448
|
command: (e) => {
|
|
449
449
|
const t = e.get(S);
|
|
450
|
-
return () => t.call(
|
|
450
|
+
return () => t.call(re.key);
|
|
451
451
|
}
|
|
452
452
|
}
|
|
453
453
|
}), N = "footnote_definition", H = "footnoteDefinition", Ue = w("footnote_definition", () => ({
|
|
@@ -550,7 +550,7 @@ const T = ie({
|
|
|
550
550
|
});
|
|
551
551
|
}
|
|
552
552
|
}
|
|
553
|
-
})), qe =
|
|
553
|
+
})), qe = se.extendSchema((e) => (t) => {
|
|
554
554
|
const n = e(t);
|
|
555
555
|
return {
|
|
556
556
|
...n,
|
|
@@ -594,8 +594,8 @@ const T = ie({
|
|
|
594
594
|
n.parseMarkdown.runner(o, l, r);
|
|
595
595
|
return;
|
|
596
596
|
}
|
|
597
|
-
const s = l.label != null ? `${l.label}.` : "•", i = l.checked != null ? Boolean(l.checked) : null, a = l.label != null ? "ordered" : "bullet",
|
|
598
|
-
o.openNode(r, { label: s, listType: a, spread:
|
|
597
|
+
const s = l.label != null ? `${l.label}.` : "•", i = l.checked != null ? Boolean(l.checked) : null, a = l.label != null ? "ordered" : "bullet", d = l.spread != null ? `${l.spread}` : "true";
|
|
598
|
+
o.openNode(r, { label: s, listType: a, spread: d, checked: i }), o.next(l.children), o.closeNode();
|
|
599
599
|
}
|
|
600
600
|
},
|
|
601
601
|
toMarkdown: {
|
|
@@ -610,14 +610,25 @@ const T = ie({
|
|
|
610
610
|
}
|
|
611
611
|
}
|
|
612
612
|
};
|
|
613
|
-
}), Je = [
|
|
613
|
+
}), Je = z(() => new K(/^\[(?<checked>\s|x)\]\s$/, (e, t, n, o) => {
|
|
614
|
+
var c;
|
|
615
|
+
const l = e.doc.resolve(n);
|
|
616
|
+
let r = 0, s = l.node(r);
|
|
617
|
+
for (; s && s.type.name !== "list_item"; )
|
|
618
|
+
r--, s = l.node(r);
|
|
619
|
+
if (!s || s.attrs.checked != null)
|
|
620
|
+
return null;
|
|
621
|
+
const i = Boolean(((c = t.groups) == null ? void 0 : c.checked) === "x"), a = l.before(r), d = e.tr;
|
|
622
|
+
return d.deleteRange(n, o).setNodeMarkup(a, void 0, { ...s.attrs, checked: i }), d;
|
|
623
|
+
})), Qe = [
|
|
614
624
|
Me,
|
|
615
625
|
Ze
|
|
616
|
-
].flat(),
|
|
617
|
-
Oe
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
626
|
+
].flat(), Ye = [
|
|
627
|
+
Oe,
|
|
628
|
+
Je
|
|
629
|
+
], et = _(() => {
|
|
630
|
+
const e = new ue("MILKDOWN_AUTO_INSERT_ZERO_SPACE"), t = (o) => o.type === W.type(), n = (o) => t(o) && o.nodeSize === 2;
|
|
631
|
+
return new me({
|
|
621
632
|
key: e,
|
|
622
633
|
props: {
|
|
623
634
|
handleDOMEvents: {
|
|
@@ -632,25 +643,25 @@ const T = ie({
|
|
|
632
643
|
}
|
|
633
644
|
}
|
|
634
645
|
});
|
|
635
|
-
}),
|
|
636
|
-
Ye,
|
|
646
|
+
}), tt = _(() => ke({})), ot = _(() => ye()), nt = ie(() => Ae), lt = [
|
|
637
647
|
et,
|
|
638
648
|
tt,
|
|
639
|
-
ot
|
|
640
|
-
|
|
649
|
+
ot,
|
|
650
|
+
nt
|
|
651
|
+
], rt = [
|
|
641
652
|
qe,
|
|
642
|
-
E,
|
|
643
653
|
I,
|
|
644
|
-
|
|
654
|
+
E,
|
|
655
|
+
oe,
|
|
645
656
|
O,
|
|
646
657
|
Ue,
|
|
647
658
|
Xe,
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
].flat(),
|
|
651
|
-
|
|
652
|
-
te,
|
|
659
|
+
Z,
|
|
660
|
+
U
|
|
661
|
+
].flat(), st = [
|
|
662
|
+
le,
|
|
653
663
|
ne,
|
|
664
|
+
re,
|
|
654
665
|
De,
|
|
655
666
|
Pe,
|
|
656
667
|
Be,
|
|
@@ -663,17 +674,17 @@ const T = ie({
|
|
|
663
674
|
Le,
|
|
664
675
|
ze,
|
|
665
676
|
Ve,
|
|
666
|
-
|
|
667
|
-
],
|
|
677
|
+
X
|
|
678
|
+
], bt = [rt, Ye, Qe, lt, st].flat();
|
|
668
679
|
export {
|
|
669
680
|
ze as addColAfterCommand,
|
|
670
681
|
Le as addColBeforeCommand,
|
|
671
682
|
je as addRowAfterCommand,
|
|
672
683
|
Ge as addRowBeforeCommand,
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
684
|
+
J as addRowWithAlignment,
|
|
685
|
+
re as breakTableCommand,
|
|
686
|
+
st as commands,
|
|
687
|
+
q as createTable,
|
|
677
688
|
Ke as deleteSelectedCellsCommand,
|
|
678
689
|
qe as extendListItemSchemaForTask,
|
|
679
690
|
k as findTable,
|
|
@@ -682,35 +693,36 @@ export {
|
|
|
682
693
|
Re as getAllCellsInTable,
|
|
683
694
|
g as getCellsInCol,
|
|
684
695
|
b as getCellsInRow,
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
696
|
+
bt as gfm,
|
|
697
|
+
le as goToNextTableCellCommand,
|
|
698
|
+
ne as goToPrevTableCellCommand,
|
|
699
|
+
Ye as inputrules,
|
|
689
700
|
De as insertTableCommand,
|
|
690
701
|
Oe as insertTableInputRule,
|
|
691
|
-
|
|
692
|
-
|
|
702
|
+
Qe as keymap,
|
|
703
|
+
Ie as moveCol,
|
|
693
704
|
Be as moveColCommand,
|
|
694
|
-
|
|
705
|
+
Ee as moveRow,
|
|
695
706
|
Pe as moveRowCommand,
|
|
696
|
-
|
|
697
|
-
|
|
707
|
+
lt as plugins,
|
|
708
|
+
rt as schema,
|
|
698
709
|
xe as selectCol,
|
|
699
710
|
He as selectColCommand,
|
|
700
|
-
|
|
711
|
+
Q as selectLine,
|
|
701
712
|
Ne as selectRow,
|
|
702
713
|
Fe as selectRowCommand,
|
|
703
714
|
ve as selectTable,
|
|
704
715
|
We as selectTableCommand,
|
|
705
716
|
Ve as setAlignCommand,
|
|
706
|
-
|
|
717
|
+
Z as strikethroughAttr,
|
|
707
718
|
Me as strikethroughKeymap,
|
|
708
|
-
|
|
719
|
+
U as strikethroughSchema,
|
|
709
720
|
O as tableCellSchema,
|
|
710
|
-
|
|
721
|
+
oe as tableHeaderSchema,
|
|
711
722
|
Ze as tableKeymap,
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
723
|
+
E as tableRowSchema,
|
|
724
|
+
I as tableSchema,
|
|
725
|
+
X as toggleStrikethroughCommand,
|
|
726
|
+
Je as wrapInTaskListInputRule
|
|
715
727
|
};
|
|
716
728
|
//# sourceMappingURL=index.es.js.map
|
package/lib/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.es.js","sources":["../src/mark/strike-through.ts","../src/node/table/utils.ts","../src/node/table/index.ts","../src/node/footnote/definition.ts","../src/node/footnote/reference.ts","../src/node/task-list-item.ts","../src/composed/keymap.ts","../src/composed/inputrules.ts","../src/plugin/auto-insert-zero-space-plugin.ts","../src/plugin/column-resizing-plugin.ts","../src/plugin/table-editing-plugin.ts","../src/plugin/remark-gfm-plugin.ts","../src/composed/plugins.ts","../src/composed/schema.ts","../src/composed/commands.ts","../src/index.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nimport { commandsCtx } from '@milkdown/core'\nimport { toggleMark } from '@milkdown/prose/commands'\nimport { $command, $markAttr, $markSchema, $useKeymap } from '@milkdown/utils'\n\n/// HTML attributes for the strikethrough mark.\nexport const strikethroughAttr = $markAttr('strike_through')\n\n/// Strikethrough mark schema.\nexport const strikethroughSchema = $markSchema('strike_through', ctx => ({\n inclusive: false,\n parseDOM: [\n { tag: 'del' },\n { style: 'text-decoration', getAttrs: value => (value === 'line-through') as false },\n ],\n toDOM: mark => ['del', ctx.get(strikethroughAttr.key)(mark)],\n parseMarkdown: {\n match: node => node.type === 'delete',\n runner: (state, node, markType) => {\n state.openMark(markType)\n state.next(node.children)\n state.closeMark(markType)\n },\n },\n toMarkdown: {\n match: mark => mark.type.name === 'strike_through',\n runner: (state, mark) => {\n state.withMark(mark, 'delete')\n },\n },\n}))\n\n/// A command to toggle the strikethrough mark.\nexport const toggleStrikethroughCommand = $command('ToggleStrikeThrough', () => () => toggleMark(strikethroughSchema.type()))\n\n/// Keymap for the strikethrough mark.\n/// - `Mod-Alt-x` - Toggle the strikethrough mark.\nexport const strikethroughKeymap = $useKeymap('strikeThroughKeymap', {\n ToggleStrikethrough: {\n shortcuts: 'Mod-Alt-x',\n command: (ctx) => {\n const commands = ctx.get(commandsCtx)\n return () => commands.call(toggleStrikethroughCommand.key)\n },\n },\n})\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport type { ContentNodeWithPos } from '@milkdown/prose'\nimport { cloneTr, findParentNode } from '@milkdown/prose'\nimport type { Node } from '@milkdown/prose/model'\nimport type { Selection, Transaction } from '@milkdown/prose/state'\nimport type { TableRect } from '@milkdown/prose/tables'\nimport { CellSelection, TableMap } from '@milkdown/prose/tables'\n\nimport { tableCellSchema, tableHeaderSchema, tableRowSchema, tableSchema } from '.'\n\n/// @internal\nexport interface CellPos {\n pos: number\n start: number\n node: Node\n}\n\n/// @internal\nexport const createTable = (rowsCount = 3, colsCount = 3): Node => {\n const cells = Array(colsCount)\n .fill(0)\n .map(() => tableCellSchema.type().createAndFill()!)\n\n const headerCells = Array(colsCount)\n .fill(0)\n .map(() => tableHeaderSchema.type().createAndFill()!)\n\n const rows = Array(rowsCount)\n .fill(0)\n .map((_, i) => tableRowSchema.type().create(null, i === 0 ? headerCells : cells))\n\n return tableSchema.type().create(null, rows)\n}\n\n/// Find the table node with position information for current selection.\nexport const findTable = (selection: Selection) =>\n findParentNode(node => node.type.spec.tableRole === 'table')(selection)\n\n/// Get cells in a column of a table.\nexport const getCellsInCol = (columnIndex: number, selection: Selection): CellPos[] | undefined => {\n const table = findTable(selection)\n if (!table)\n return undefined\n const map = TableMap.get(table.node)\n if (columnIndex < 0 || columnIndex >= map.width)\n return undefined\n\n return map\n .cellsInRect({ left: columnIndex, right: columnIndex + 1, top: 0, bottom: map.height })\n .map((pos) => {\n const node = table.node.nodeAt(pos)\n if (!node)\n return undefined\n const start = pos + table.start\n return {\n pos: start,\n start: start + 1,\n node,\n }\n })\n .filter((x): x is CellPos => x != null)\n}\n\n/// Get cells in a row of a table.\nexport const getCellsInRow = (rowIndex: number, selection: Selection): CellPos[] | undefined => {\n const table = findTable(selection)\n if (!table)\n return undefined\n const map = TableMap.get(table.node)\n if (rowIndex < 0 || rowIndex >= map.height)\n return undefined\n\n return map\n .cellsInRect({ left: 0, right: map.width, top: rowIndex, bottom: rowIndex + 1 })\n .map((pos) => {\n const node = table.node.nodeAt(pos)\n if (!node)\n return undefined\n const start = pos + table.start\n return {\n pos: start,\n start: start + 1,\n node,\n }\n })\n .filter((x): x is CellPos => x != null)\n}\n\n/// Get all cells in a table.\nexport const getAllCellsInTable = (selection: Selection) => {\n const table = findTable(selection)\n if (!table)\n return\n\n const map = TableMap.get(table.node)\n const cells = map.cellsInRect({\n left: 0,\n right: map.width,\n top: 0,\n bottom: map.height,\n })\n return cells.map((nodePos) => {\n const node = table.node.nodeAt(nodePos)\n const pos = nodePos + table.start\n return { pos, start: pos + 1, node }\n })\n}\n\n/// Select a possible table in current selection.\nexport const selectTable = (tr: Transaction) => {\n const cells = getAllCellsInTable(tr.selection)\n if (cells && cells[0]) {\n const $firstCell = tr.doc.resolve(cells[0].pos)\n const last = cells[cells.length - 1]\n if (last) {\n const $lastCell = tr.doc.resolve(last.pos)\n return cloneTr(tr.setSelection(new CellSelection($lastCell, $firstCell)))\n }\n }\n return tr\n}\n\n/// @internal\nexport function addRowWithAlignment(tr: Transaction, { map, tableStart, table }: TableRect, row: number) {\n const rowPos = Array(row)\n .fill(0)\n .reduce((acc, _, i) => {\n return acc + table.child(i).nodeSize\n }, tableStart)\n\n const cells = Array(map.width)\n .fill(0)\n .map((_, col) => {\n const headerCol = table.nodeAt(map.map[col] as number)\n return tableCellSchema.type().createAndFill({ alignment: headerCol?.attrs.alignment }) as Node\n })\n\n tr.insert(rowPos, tableRowSchema.type().create(null, cells))\n return tr\n}\n\n/// @internal\nexport const selectLine = (type: 'row' | 'col') => (index: number) => (tr: Transaction) => {\n const table = findTable(tr.selection)\n const isRowSelection = type === 'row'\n if (table) {\n const map = TableMap.get(table.node)\n\n // Check if the index is valid\n if (index >= 0 && index < (isRowSelection ? map.height : map.width)) {\n const lastCell = map.positionAt(\n isRowSelection ? index : map.height - 1,\n isRowSelection ? map.width - 1 : index,\n table.node,\n )\n const $lastCell = tr.doc.resolve(table.start + lastCell)\n\n const createCellSelection = isRowSelection ? CellSelection.rowSelection : CellSelection.colSelection\n\n const firstCell = map.positionAt(isRowSelection ? index : 0, isRowSelection ? 0 : index, table.node)\n const $firstCell = tr.doc.resolve(table.start + firstCell)\n return cloneTr(tr.setSelection(createCellSelection($lastCell, $firstCell) as unknown as Selection))\n }\n }\n return tr\n}\n\n/// If the selection is in a table,\n/// select the {index} row.\nexport const selectRow = selectLine('row')\n\n/// If the selection is in a table,\n/// select the {index} column.\nexport const selectCol = selectLine('col')\n\nconst transpose = <T>(array: T[][]) => {\n return array[0]!.map((_, i) => {\n return array.map(column => column[i])\n }) as T[][]\n}\n\nconst convertArrayOfRowsToTableNode = (tableNode: Node, arrayOfNodes: (Node | null)[][]) => {\n const rowsPM = []\n const map = TableMap.get(tableNode)\n for (let rowIndex = 0; rowIndex < map.height; rowIndex++) {\n const row = tableNode.child(rowIndex)\n const rowCells = []\n\n for (let colIndex = 0; colIndex < map.width; colIndex++) {\n if (!arrayOfNodes[rowIndex]![colIndex])\n continue\n\n const cellPos = map.map[rowIndex * map.width + colIndex]!\n\n const cell = arrayOfNodes[rowIndex]![colIndex]!\n const oldCell = tableNode.nodeAt(cellPos)!\n const newCell = oldCell.type.createChecked(\n Object.assign({}, cell.attrs),\n cell.content,\n cell.marks,\n )\n rowCells.push(newCell)\n }\n\n rowsPM.push(row.type.createChecked(row.attrs, rowCells, row.marks))\n }\n\n const newTable = tableNode.type.createChecked(\n tableNode.attrs,\n rowsPM,\n tableNode.marks,\n )\n\n return newTable\n}\n\nconst convertTableNodeToArrayOfRows = (tableNode: Node) => {\n const map = TableMap.get(tableNode)\n const rows: (Node | null)[][] = []\n for (let rowIndex = 0; rowIndex < map.height; rowIndex++) {\n const rowCells: (Node | null)[] = []\n const seen: Record<number, boolean> = {}\n\n for (let colIndex = 0; colIndex < map.width; colIndex++) {\n const cellPos = map.map[rowIndex * map.width + colIndex]!\n const cell = tableNode.nodeAt(cellPos)\n const rect = map.findCell(cellPos)\n if (seen[cellPos] || rect.top !== rowIndex) {\n rowCells.push(null)\n continue\n }\n seen[cellPos] = true\n\n rowCells.push(cell)\n }\n\n rows.push(rowCells)\n }\n\n return rows\n}\n\nconst moveRowInArrayOfRows = (\n rows: (Node | null)[][],\n indexesOrigin: number[],\n indexesTarget: number[],\n directionOverride: -1 | 1 | 0,\n) => {\n const direction = indexesOrigin[0]! > indexesTarget[0]! ? -1 : 1\n\n const rowsExtracted = rows.splice(indexesOrigin[0]!, indexesOrigin.length)\n const positionOffset = rowsExtracted.length % 2 === 0 ? 1 : 0\n let target: number\n\n if (directionOverride === -1 && direction === 1) {\n target = indexesTarget[0]! - 1\n }\n else if (directionOverride === 1 && direction === -1) {\n target = indexesTarget[indexesTarget.length - 1]! - positionOffset + 1\n }\n else {\n target\n = direction === -1\n ? indexesTarget[0]!\n : indexesTarget[indexesTarget.length - 1]! - positionOffset\n }\n\n rows.splice(target, 0, ...rowsExtracted)\n return rows\n}\n\nconst moveTableColumn = (\n table: ContentNodeWithPos,\n indexesOrigin: number[],\n indexesTarget: number[],\n direction: -1 | 1 | 0,\n) => {\n let rows = transpose(convertTableNodeToArrayOfRows(table.node))\n\n rows = moveRowInArrayOfRows(rows, indexesOrigin, indexesTarget, direction)\n rows = transpose(rows)\n\n return convertArrayOfRowsToTableNode(table.node, rows)\n}\n\nconst moveTableRow = (\n table: ContentNodeWithPos,\n indexesOrigin: number[],\n indexesTarget: number[],\n direction: -1 | 1 | 0,\n) => {\n let rows = convertTableNodeToArrayOfRows(table.node)\n\n rows = moveRowInArrayOfRows(rows, indexesOrigin, indexesTarget, direction)\n\n return convertArrayOfRowsToTableNode(table.node, rows)\n}\n\nconst getSelectionRangeInColumn = (columnIndex: number, tr: Transaction) => {\n let startIndex = columnIndex\n let endIndex = columnIndex\n\n // looking for selection start column (startIndex)\n for (let i = columnIndex; i >= 0; i--) {\n const cells = getCellsInCol(i, tr.selection)\n if (cells) {\n cells.forEach((cell) => {\n const maybeEndIndex = cell.node.attrs.colspan + i - 1\n if (maybeEndIndex >= startIndex)\n startIndex = i\n\n if (maybeEndIndex > endIndex)\n endIndex = maybeEndIndex\n })\n }\n }\n // looking for selection end column (endIndex)\n for (let i = columnIndex; i <= endIndex; i++) {\n const cells = getCellsInCol(i, tr.selection)\n if (cells) {\n cells.forEach((cell) => {\n const maybeEndIndex = cell.node.attrs.colspan + i - 1\n if (cell.node.attrs.colspan > 1 && maybeEndIndex > endIndex)\n endIndex = maybeEndIndex\n })\n }\n }\n\n // filter out columns without cells (where all rows have colspan > 1 in the same column)\n const indexes = []\n for (let i = startIndex; i <= endIndex; i++) {\n const maybeCells = getCellsInCol(i, tr.selection)\n if (maybeCells && maybeCells.length)\n indexes.push(i)\n }\n startIndex = indexes[0]!\n endIndex = indexes[indexes.length - 1]!\n\n const firstSelectedColumnCells = getCellsInCol(startIndex, tr.selection)!\n const firstRowCells = getCellsInRow(0, tr.selection)!\n const $anchor = tr.doc.resolve(\n firstSelectedColumnCells[firstSelectedColumnCells.length - 1]!.pos,\n )\n\n let headCell: CellPos | undefined\n for (let i = endIndex; i >= startIndex; i--) {\n const columnCells = getCellsInCol(i, tr.selection)\n if (columnCells && columnCells.length) {\n for (let j = firstRowCells.length - 1; j >= 0; j--) {\n if (firstRowCells[j]!.pos === columnCells[0]!.pos) {\n headCell = columnCells[0]\n break\n }\n }\n if (headCell)\n break\n }\n }\n\n const $head = tr.doc.resolve(headCell!.pos)\n return { $anchor, $head, indexes }\n}\n\nconst getSelectionRangeInRow = (rowIndex: number, tr: Transaction) => {\n let startIndex = rowIndex\n let endIndex = rowIndex\n // looking for selection start row (startIndex)\n for (let i = rowIndex; i >= 0; i--) {\n const cells = getCellsInRow(i, tr.selection)\n cells!.forEach((cell) => {\n const maybeEndIndex = cell.node.attrs.rowspan + i - 1\n if (maybeEndIndex >= startIndex)\n startIndex = i\n\n if (maybeEndIndex > endIndex)\n endIndex = maybeEndIndex\n })\n }\n // looking for selection end row (endIndex)\n for (let i = rowIndex; i <= endIndex; i++) {\n const cells = getCellsInRow(i, tr.selection)\n cells!.forEach((cell) => {\n const maybeEndIndex = cell.node.attrs.rowspan + i - 1\n if (cell.node.attrs.rowspan > 1 && maybeEndIndex > endIndex)\n endIndex = maybeEndIndex\n })\n }\n\n // filter out rows without cells (where all columns have rowspan > 1 in the same row)\n const indexes = []\n for (let i = startIndex; i <= endIndex; i++) {\n const maybeCells = getCellsInRow(i, tr.selection)\n if (maybeCells && maybeCells.length)\n indexes.push(i)\n }\n startIndex = indexes[0]!\n endIndex = indexes[indexes.length - 1]!\n\n const firstSelectedRowCells = getCellsInRow(startIndex, tr.selection)!\n const firstColumnCells = getCellsInCol(0, tr.selection)!\n const $anchor = tr.doc.resolve(firstSelectedRowCells[firstSelectedRowCells.length - 1]!.pos)\n\n let headCell: CellPos | undefined\n for (let i = endIndex; i >= startIndex; i--) {\n const rowCells = getCellsInRow(i, tr.selection)\n if (rowCells && rowCells.length) {\n for (let j = firstColumnCells.length - 1; j >= 0; j--) {\n if (firstColumnCells[j]!.pos === rowCells[0]!.pos) {\n headCell = rowCells[0]!\n break\n }\n }\n if (headCell)\n break\n }\n }\n\n const $head = tr.doc.resolve(headCell!.pos)\n return { $anchor, $head, indexes }\n}\n\n/// If the selection is in a table,\n/// Move the columns at `origin` to `target` in current table.\n/// The `select` is true by default, which means the selection will be set to the moved column.\nexport function moveCol(tr: Transaction, origin: number, target: number, select = true) {\n const table = findTable(tr.selection)\n if (!table)\n return tr\n\n const { indexes: indexesOriginColumn } = getSelectionRangeInColumn(origin, tr)\n const { indexes: indexesTargetColumn } = getSelectionRangeInColumn(target, tr)\n\n if (indexesOriginColumn.includes(target))\n return tr\n\n const newTable = moveTableColumn(\n table,\n indexesOriginColumn,\n indexesTargetColumn,\n 0,\n )\n\n const _tr = cloneTr(tr).replaceWith(\n table.pos,\n table.pos + table.node.nodeSize,\n newTable,\n )\n\n if (!select)\n return _tr\n\n const map = TableMap.get(newTable)\n const start = table.start\n const index = target\n const lastCell = map.positionAt(map.height - 1, index, newTable)\n const $lastCell = _tr.doc.resolve(start + lastCell)\n\n const createCellSelection = CellSelection.colSelection\n\n const firstCell = map.positionAt(0, index, newTable)\n const $firstCell = _tr.doc.resolve(start + firstCell)\n\n return _tr.setSelection(createCellSelection($lastCell, $firstCell))\n}\n\n/// If the selection is in a table,\n/// Move the rows at `origin` and `target` in current table.\n/// The `select` is true by default, which means the selection will be set to the moved row.\nexport function moveRow(tr: Transaction, origin: number, target: number, select = true) {\n const table = findTable(tr.selection)\n if (!table)\n return tr\n\n const { indexes: indexesOriginRow } = getSelectionRangeInRow(origin, tr)\n const { indexes: indexesTargetRow } = getSelectionRangeInRow(target, tr)\n\n if (indexesOriginRow.includes(target))\n return tr\n\n const newTable = moveTableRow(\n table,\n indexesOriginRow,\n indexesTargetRow,\n 0,\n )\n\n const _tr = cloneTr(tr).replaceWith(\n table.pos,\n table.pos + table.node.nodeSize,\n newTable,\n )\n\n if (!select)\n return _tr\n\n const map = TableMap.get(newTable)\n const start = table.start\n const index = target\n const lastCell = map.positionAt(index, map.width - 1, newTable)\n const $lastCell = _tr.doc.resolve(start + lastCell)\n\n const createCellSelection = CellSelection.rowSelection\n\n const firstCell = map.positionAt(index, 0, newTable)\n const $firstCell = _tr.doc.resolve(start + firstCell)\n\n return _tr.setSelection(createCellSelection($lastCell, $firstCell))\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { MarkdownNode } from '@milkdown/transformer'\nimport { commandsCtx } from '@milkdown/core'\nimport { paragraphSchema } from '@milkdown/preset-commonmark'\nimport { InputRule } from '@milkdown/prose/inputrules'\nimport type { NodeType } from '@milkdown/prose/model'\nimport { Selection, TextSelection } from '@milkdown/prose/state'\nimport { CellSelection, addColumnAfter, addColumnBefore, deleteColumn, deleteRow, deleteTable, goToNextCell, isInTable, selectedRect, setCellAttr, tableNodes } from '@milkdown/prose/tables'\nimport { $command, $inputRule, $nodeSchema, $useKeymap } from '@milkdown/utils'\nimport { addRowWithAlignment, createTable, moveCol, moveRow, selectCol, selectRow, selectTable } from './utils'\n\nconst originalSchema = tableNodes({\n tableGroup: 'block',\n cellContent: 'paragraph',\n cellAttributes: {\n alignment: {\n default: 'left',\n getFromDOM: dom => (dom as HTMLElement).style.textAlign || 'left',\n setDOMAttr: (value, attrs) => {\n attrs.style = `text-align: ${value || 'left'}`\n },\n },\n },\n})\n\n/// Schema for table node.\nexport const tableSchema = $nodeSchema('table', () => ({\n ...originalSchema.table,\n parseMarkdown: {\n match: node => node.type === 'table',\n runner: (state, node, type) => {\n const align = node.align as (string | null)[]\n const children = (node.children as MarkdownNode[]).map((x, i) => ({\n ...x,\n align,\n isHeader: i === 0,\n }))\n state.openNode(type)\n state.next(children)\n state.closeNode()\n },\n },\n toMarkdown: {\n match: node => node.type.name === 'table',\n runner: (state, node) => {\n const firstLine = node.content.firstChild?.content\n if (!firstLine)\n return\n\n const align: (string | null)[] = []\n firstLine.forEach((cell) => {\n align.push(cell.attrs.alignment)\n })\n state.openNode('table', undefined, { align })\n state.next(node.content)\n state.closeNode()\n },\n },\n\n}))\n\n/// Schema for table row node.\nexport const tableRowSchema = $nodeSchema('table_row', () => ({\n ...originalSchema.table_row,\n parseMarkdown: {\n match: node => node.type === 'tableRow',\n runner: (state, node, type) => {\n const align = node.align as (string | null)[]\n const children = (node.children as MarkdownNode[]).map((x, i) => ({\n ...x,\n align: align[i],\n isHeader: node.isHeader,\n }))\n state.openNode(type)\n state.next(children)\n state.closeNode()\n },\n },\n toMarkdown: {\n match: node => node.type.name === 'table_row',\n runner: (state, node) => {\n state.openNode('tableRow')\n state.next(node.content)\n state.closeNode()\n },\n },\n}))\n\n/// Schema for table cell node.\nexport const tableCellSchema = $nodeSchema('table_cell', () => ({\n ...originalSchema.table_cell,\n parseMarkdown: {\n match: node => node.type === 'tableCell' && !node.isHeader,\n runner: (state, node, type) => {\n const align = node.align as string\n state\n .openNode(type, { alignment: align })\n .openNode(state.schema.nodes.paragraph as NodeType)\n .next(node.children)\n .closeNode()\n .closeNode()\n },\n },\n toMarkdown: {\n match: node => node.type.name === 'table_cell',\n runner: (state, node) => {\n state.openNode('tableCell').next(node.content).closeNode()\n },\n },\n}))\n\n/// Schema for table header node.\nexport const tableHeaderSchema = $nodeSchema('table_header', () => ({\n ...originalSchema.table_header,\n parseMarkdown: {\n match: node => node.type === 'tableCell' && !!node.isHeader,\n runner: (state, node, type) => {\n const align = node.align as string\n state.openNode(type, { alignment: align })\n state.openNode(state.schema.nodes.paragraph as NodeType)\n state.next(node.children)\n state.closeNode()\n state.closeNode()\n },\n },\n toMarkdown: {\n match: node => node.type.name === 'table_header',\n runner: (state, node) => {\n state.openNode('tableCell')\n state.next(node.content)\n state.closeNode()\n },\n },\n}))\n\n/// A input rule for creating table.\n/// For example, `|2x2|` will create a 2x2 table.\nexport const insertTableInputRule = $inputRule(() => new InputRule(\n /^\\|(?<col>\\d+)[xX](?<row>\\d+)\\|\\s$/, (state, match, start, end) => {\n const $start = state.doc.resolve(start)\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), tableSchema.type()))\n return null\n\n const tableNode = createTable(\n Number(match.groups?.row),\n Number(match.groups?.col),\n )\n const tr = state.tr.replaceRangeWith(start, end, tableNode).scrollIntoView()\n return tr.setSelection(TextSelection.create(tr.doc, start + 3))\n },\n))\n\n/// A command for moving cursor to previous cell.\nexport const goToPrevTableCellCommand = $command('GoToPrevTableCell', () => () => goToNextCell(-1))\n\n/// A command for moving cursor to next cell.\nexport const goToNextTableCellCommand = $command('GoToNextTableCell', () => () => goToNextCell(1))\n\n/// A command for splitting current table into two tables.\n/// If the selection is at the end of the table,\n/// it will just quit the table and insert a new paragraph node.\nexport const breakTableCommand = $command('BreakTable', () => () => (state, dispatch) => {\n if (!isInTable(state))\n return false\n\n const { $head } = state.selection\n const pos = $head.after()\n const tr = state.tr\n .replaceWith(pos, pos, paragraphSchema.type().createAndFill()!)\n\n tr.setSelection(Selection.near(tr.doc.resolve(pos), 1)).scrollIntoView()\n dispatch?.(tr)\n return true\n})\n\n/// A command for inserting a table.\n/// You can specify the number of rows and columns.\n/// By default, it will insert a 3x3 table.\nexport const insertTableCommand = $command('InsertTable', () => ({ row, col }: { row?: number; col?: number } = {}) => (state, dispatch) => {\n const { selection, tr } = state\n const { from } = selection\n const table = createTable(row, col)\n const _tr = tr.replaceSelectionWith(table)\n const sel = Selection.findFrom(_tr.doc.resolve(from), 1, true)\n if (sel)\n dispatch?.(_tr.setSelection(sel))\n\n return true\n})\n\n/// A command for moving a row in a table.\n/// You should specify the `from` and `to` index.\nexport const moveRowCommand = $command('MoveRow', () => ({ from, to }: { from?: number; to?: number } = {}) => (state, dispatch) => {\n const { tr } = state\n const result = dispatch?.(moveRow(tr, from ?? 0, to ?? 0, true))\n\n return Boolean(result)\n})\n\n/// A command for moving a column in a table.\n/// You should specify the `from` and `to` index.\nexport const moveColCommand = $command('MoveCol', () => ({ from, to }: { from?: number; to?: number } = {}) => (state, dispatch) => {\n const { tr } = state\n const result = dispatch?.(moveCol(tr, from ?? 0, to ?? 0, true))\n\n return Boolean(result)\n})\n\n/// A command for selecting a row.\nexport const selectRowCommand = $command<number, 'SelectRow'>('SelectRow', () => (index = 0) => (state, dispatch) => {\n const { tr } = state\n const result = dispatch?.(selectRow(index)(tr))\n\n return Boolean(result)\n})\n\n/// A command for selecting a column.\nexport const selectColCommand = $command<number, 'SelectCol'>('SelectCol', () => (index = 0) => (state, dispatch) => {\n const { tr } = state\n const result = dispatch?.(selectCol(index)(tr))\n\n return Boolean(result)\n})\n\n/// A command for selecting a table.\nexport const selectTableCommand = $command('SelectTable', () => () => (state, dispatch) => {\n const { tr } = state\n const result = dispatch?.(selectTable(tr))\n\n return Boolean(result)\n})\n\n/// A command for deleting selected cells.\n/// If the selection is a row or column, the row or column will be deleted.\n/// If all cells are selected, the table will be deleted.\nexport const deleteSelectedCellsCommand = $command('DeleteSelectedCells', () => () => (state, dispatch) => {\n const { selection } = state\n if (!(selection instanceof CellSelection))\n return false\n\n const isRow = selection.isRowSelection()\n const isCol = selection.isColSelection()\n\n if (isRow && isCol)\n return deleteTable(state, dispatch)\n\n if (isCol)\n return deleteColumn(state, dispatch)\n\n else\n return deleteRow(state, dispatch)\n})\n\n/// A command for adding a column before the current column.\nexport const addColBeforeCommand = $command('AddColBefore', () => () => addColumnBefore)\n\n/// A command for adding a column after the current column.\nexport const addColAfterCommand = $command('AddColAfter', () => () => addColumnAfter)\n\n/// A command for adding a row before the current row.\nexport const addRowBeforeCommand = $command('AddRowBefore', () => () => (state, dispatch) => {\n if (!isInTable(state))\n return false\n if (dispatch) {\n const rect = selectedRect(state)\n dispatch(addRowWithAlignment(state.tr, rect, rect.top))\n }\n return true\n})\n\n/// A command for adding a row after the current row.\nexport const addRowAfterCommand = $command('AddRowAfter', () => () => (state, dispatch) => {\n if (!isInTable(state))\n return false\n if (dispatch) {\n const rect = selectedRect(state)\n dispatch(addRowWithAlignment(state.tr, rect, rect.bottom))\n }\n return true\n})\n\n/// A command for setting alignment property for selected cells.\n/// You can specify the alignment as `left`, `center`, or `right`.\n/// It's `left` by default.\nexport const setAlignCommand = $command<'left' | 'center' | 'right', 'SetAlign'>('SetAlign', () => (alignment = 'left') => setCellAttr('alignment', alignment))\n\n/// Keymap for table commands.\n/// - `<Mod-]>`/`<Tab>`: Move to the next cell.\n/// - `<Mod-[>`/`<Shift-Tab>`: Move to the previous cell.\n/// - `<Mod-Enter>`: Exit the table, and break it if possible.\nexport const tableKeymap = $useKeymap('tableKeymap', {\n NextCell: {\n shortcuts: ['Mod-]', 'Tab'],\n command: (ctx) => {\n const commands = ctx.get(commandsCtx)\n\n return () => commands.call(goToNextTableCellCommand.key)\n },\n },\n PrevCell: {\n shortcuts: ['Mod-[', 'Shift-Tab'],\n command: (ctx) => {\n const commands = ctx.get(commandsCtx)\n\n return () => commands.call(goToPrevTableCellCommand.key)\n },\n },\n ExitTable: {\n shortcuts: ['Mod-Enter'],\n command: (ctx) => {\n const commands = ctx.get(commandsCtx)\n\n return () => commands.call(breakTableCommand.key)\n },\n },\n})\n\nexport * from './utils'\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { expectDomTypeError } from '@milkdown/exception'\nimport { $nodeSchema } from '@milkdown/utils'\n\nconst id = 'footnote_definition'\nconst markdownId = 'footnoteDefinition'\n\n/// Footnote definition node schema.\nexport const footnoteDefinitionSchema = $nodeSchema('footnote_definition', () => ({\n group: 'block',\n content: 'block+',\n defining: true,\n attrs: {\n label: {\n default: '',\n },\n },\n parseDOM: [\n {\n tag: `dl[data-type=\"${id}\"]`,\n getAttrs: (dom) => {\n if (!(dom instanceof HTMLElement))\n throw expectDomTypeError(dom)\n\n return {\n label: dom.dataset.label,\n }\n },\n contentElement: 'dd',\n },\n ],\n toDOM: (node) => {\n const label = node.attrs.label\n\n return [\n 'dl',\n {\n // TODO: add a prosemirror plugin to sync label on change\n 'data-label': label,\n 'data-type': id,\n },\n ['dt', label],\n ['dd', 0],\n ]\n },\n parseMarkdown: {\n match: ({ type }) => type === markdownId,\n runner: (state, node, type) => {\n state\n .openNode(type, {\n label: node.label as string,\n })\n .next(node.children)\n .closeNode()\n },\n },\n toMarkdown: {\n match: node => node.type.name === id,\n runner: (state, node) => {\n state\n .openNode(markdownId, undefined, {\n label: node.attrs.label,\n identifier: node.attrs.label,\n })\n .next(node.content)\n .closeNode()\n },\n },\n}))\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { expectDomTypeError } from '@milkdown/exception'\nimport { $nodeSchema } from '@milkdown/utils'\n\nconst id = 'footnote_reference'\n\n/// Footnote reference node schema.\nexport const footnoteReferenceSchema = $nodeSchema('footnote_reference', () => ({\n group: 'inline',\n inline: true,\n atom: true,\n attrs: {\n label: {\n default: '',\n },\n },\n parseDOM: [\n {\n tag: `sup[data-type=\"${id}\"]`,\n getAttrs: (dom) => {\n if (!(dom instanceof HTMLElement))\n throw expectDomTypeError(dom)\n\n return {\n label: dom.dataset.label,\n }\n },\n },\n ],\n toDOM: (node) => {\n const label = node.attrs.label\n return [\n 'sup',\n {\n // TODO: add a prosemirror plugin to sync label on change\n 'data-label': label,\n 'data-type': id,\n },\n label,\n ]\n },\n parseMarkdown: {\n match: ({ type }) => type === 'footnoteReference',\n runner: (state, node, type) => {\n state.addNode(type, {\n label: node.label as string,\n })\n },\n },\n toMarkdown: {\n match: node => node.type.name === id,\n runner: (state, node) => {\n state.addNode('footnoteReference', undefined, undefined, {\n label: node.attrs.label,\n identifier: node.attrs.label,\n })\n },\n },\n}))\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { expectDomTypeError } from '@milkdown/exception'\nimport { listItemSchema } from '@milkdown/preset-commonmark'\n\n/// This schema extends the [list item](/preset-commonmark#list-item) schema and add task list support for it.\nexport const extendListItemSchemaForTask = listItemSchema.extendSchema((prev) => {\n return (ctx) => {\n const baseSchema = prev(ctx)\n return {\n ...baseSchema,\n attrs: {\n ...baseSchema.attrs,\n checked: {\n default: null,\n },\n },\n parseDOM: [\n {\n tag: 'li[data-item-type=\"task\"]',\n getAttrs: (dom) => {\n if (!(dom instanceof HTMLElement))\n throw expectDomTypeError(dom)\n\n return {\n label: dom.dataset.label,\n listType: dom.dataset['list-type'],\n spread: dom.dataset.spread,\n checked: dom.dataset.checked ? dom.dataset.checked === 'true' : null,\n }\n },\n },\n ...baseSchema?.parseDOM || [],\n ],\n toDOM: (node) => {\n if (baseSchema.toDOM && node.attrs.checked == null)\n return baseSchema.toDOM(node)\n\n return [\n 'li',\n {\n 'data-item-type': 'task',\n 'data-label': node.attrs.label,\n 'data-list-type': node.attrs.listType,\n 'data-spread': node.attrs.spread,\n 'data-checked': node.attrs.checked,\n },\n 0,\n ]\n },\n parseMarkdown: {\n match: ({ type }) => type === 'listItem',\n runner: (state, node, type) => {\n if (node.checked == null) {\n baseSchema.parseMarkdown.runner(state, node, type)\n return\n }\n\n const label = node.label != null ? `${node.label}.` : '•'\n const checked = node.checked != null ? Boolean(node.checked) : null\n const listType = node.label != null ? 'ordered' : 'bullet'\n const spread = node.spread != null ? `${node.spread}` : 'true'\n\n state.openNode(type, { label, listType, spread, checked })\n state.next(node.children)\n state.closeNode()\n },\n },\n toMarkdown: {\n match: node => node.type.name === 'list_item',\n runner: (state, node) => {\n if (node.attrs.checked == null) {\n baseSchema.toMarkdown.runner(state, node)\n return\n }\n\n const label = node.attrs.label\n const listType = node.attrs.listType\n const spread = node.attrs.spread === 'true'\n const checked = node.attrs.checked\n\n state.openNode('listItem', undefined, { label, listType, spread, checked })\n state.next(node.content)\n state.closeNode()\n },\n },\n }\n }\n})\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { MilkdownPlugin } from '@milkdown/ctx'\nimport { strikethroughKeymap } from '../mark'\nimport { tableKeymap } from '../node'\n\n/// @internal\nexport const keymap: MilkdownPlugin[] = [\n strikethroughKeymap,\n tableKeymap,\n].flat()\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { MilkdownPlugin } from '@milkdown/ctx'\nimport { insertTableInputRule } from '../node'\n\n/// @internal\nexport const inputrules: MilkdownPlugin[] = [\n insertTableInputRule,\n]\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { browser } from '@milkdown/prose'\nimport type { Node } from '@milkdown/prose/model'\nimport { isInTable } from '@milkdown/prose/tables'\nimport { Plugin, PluginKey } from '@milkdown/prose/state'\nimport { paragraphSchema } from '@milkdown/preset-commonmark'\nimport { $prose } from '@milkdown/utils'\n\n/// This plugin is used to fix the bug of IME composing in table in Safari browser.\n/// original discussion in https://discuss.prosemirror.net/t/ime-composing-problems-on-td-or-th-element-in-safari-browser/4501\nexport const autoInsertZeroSpaceInTablePlugin = $prose(() => {\n const pluginKey = new PluginKey('MILKDOWN_AUTO_INSERT_ZERO_SPACE')\n\n const isParagraph = (node: Node) => node.type === paragraphSchema.type()\n\n const isEmptyParagraph = (node: Node) => isParagraph(node) && node.nodeSize === 2\n\n return new Plugin({\n key: pluginKey,\n props: {\n handleDOMEvents: {\n compositionstart(view) {\n const { state, dispatch } = view\n const { tr, selection } = state\n const { $from } = selection\n if (browser.safari && isInTable(state) && selection.empty && isEmptyParagraph($from.parent))\n dispatch(tr.insertText('\\u2060', $from.start()))\n\n return false\n },\n compositionend(view) {\n const { state, dispatch } = view\n const { tr, selection } = state\n const { $from } = selection\n\n if (\n browser.safari\n && isInTable(state)\n && selection.empty\n && isParagraph($from.parent)\n && $from.parent.textContent.startsWith('\\u2060')\n )\n dispatch(tr.delete($from.start(), $from.start() + 1))\n\n return false\n },\n },\n },\n })\n})\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { columnResizing } from '@milkdown/prose/tables'\nimport { $prose } from '@milkdown/utils'\n\n/// This plugin is wrapping the `columnResizing` plugin from [prosemirror-tables](https://github.com/ProseMirror/prosemirror-tables).\nexport const columnResizingPlugin = $prose(() => columnResizing({}))\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { tableEditing } from '@milkdown/prose/tables'\nimport { $prose } from '@milkdown/utils'\n\n/// This plugin is wrapping the `tableEditing` plugin from [prosemirror-tables](https://github.com/ProseMirror/prosemirror-tables).\nexport const tableEditingPlugin = $prose(() => tableEditing())\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { $remark } from '@milkdown/utils'\nimport remarkGFM from 'remark-gfm'\n\n/// This plugin is wrapping the [remark-gfm](https://github.com/remarkjs/remark-gfm).\nexport const remarkGFMPlugin = $remark(() => remarkGFM)\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { MilkdownPlugin } from '@milkdown/ctx'\nimport { autoInsertZeroSpaceInTablePlugin, columnResizingPlugin, remarkGFMPlugin, tableEditingPlugin } from '../plugin'\n\n/// @internal\nexport const plugins: MilkdownPlugin[] = [\n autoInsertZeroSpaceInTablePlugin,\n columnResizingPlugin,\n tableEditingPlugin,\n remarkGFMPlugin,\n]\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { MilkdownPlugin } from '@milkdown/ctx'\nimport { strikethroughAttr, strikethroughSchema } from '../mark'\nimport { extendListItemSchemaForTask, footnoteDefinitionSchema, footnoteReferenceSchema, tableCellSchema, tableHeaderSchema, tableRowSchema, tableSchema } from '../node'\n\n/// @internal\nexport const schema: MilkdownPlugin[] = [\n extendListItemSchemaForTask,\n\n tableSchema,\n tableRowSchema,\n tableHeaderSchema,\n tableCellSchema,\n\n footnoteDefinitionSchema,\n footnoteReferenceSchema,\n\n strikethroughAttr,\n strikethroughSchema,\n].flat()\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { toggleStrikethroughCommand } from '../mark'\nimport { addColAfterCommand, addColBeforeCommand, addRowAfterCommand, addRowBeforeCommand, breakTableCommand, deleteSelectedCellsCommand, goToNextTableCellCommand, goToPrevTableCellCommand, insertTableCommand, moveColCommand, moveRowCommand, selectColCommand, selectRowCommand, selectTableCommand, setAlignCommand } from '../node'\n\n/// @internal\nexport const commands = [\n goToNextTableCellCommand,\n goToPrevTableCellCommand,\n breakTableCommand,\n insertTableCommand,\n moveRowCommand,\n moveColCommand,\n selectRowCommand,\n selectColCommand,\n selectTableCommand,\n deleteSelectedCellsCommand,\n addRowBeforeCommand,\n addRowAfterCommand,\n addColBeforeCommand,\n addColAfterCommand,\n setAlignCommand,\n\n toggleStrikethroughCommand,\n]\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { commands, inputrules, keymap, plugins, schema } from './composed'\n\nexport * from './node'\nexport * from './mark'\nexport * from './composed'\n\n/// The GFM preset, includes all the plugins.\nexport const gfm = [schema, inputrules, keymap, plugins, commands].flat()\n"],"names":["strikethroughAttr","$markAttr","strikethroughSchema","$markSchema","ctx","value","mark","node","state","markType","toggleStrikethroughCommand","$command","toggleMark","strikethroughKeymap","$useKeymap","commands","commandsCtx","createTable","rowsCount","colsCount","cells","tableCellSchema","headerCells","tableHeaderSchema","rows","_","i","tableRowSchema","tableSchema","findTable","selection","findParentNode","getCellsInCol","columnIndex","table","map","TableMap","pos","start","x","getCellsInRow","rowIndex","getAllCellsInTable","nodePos","selectTable","tr","$firstCell","last","$lastCell","cloneTr","CellSelection","addRowWithAlignment","tableStart","row","rowPos","acc","col","headerCol","selectLine","type","index","isRowSelection","lastCell","createCellSelection","firstCell","selectRow","selectCol","transpose","array","column","convertArrayOfRowsToTableNode","tableNode","arrayOfNodes","rowsPM","rowCells","colIndex","cellPos","cell","newCell","convertTableNodeToArrayOfRows","seen","rect","moveRowInArrayOfRows","indexesOrigin","indexesTarget","directionOverride","direction","rowsExtracted","positionOffset","target","moveTableColumn","moveTableRow","getSelectionRangeInColumn","startIndex","endIndex","maybeEndIndex","indexes","maybeCells","firstSelectedColumnCells","firstRowCells","$anchor","headCell","columnCells","j","$head","getSelectionRangeInRow","firstSelectedRowCells","firstColumnCells","moveCol","origin","select","indexesOriginColumn","indexesTargetColumn","newTable","_tr","moveRow","indexesOriginRow","indexesTargetRow","originalSchema","tableNodes","dom","attrs","$nodeSchema","align","children","firstLine","_a","insertTableInputRule","$inputRule","InputRule","match","end","$start","_b","TextSelection","goToPrevTableCellCommand","goToNextCell","goToNextTableCellCommand","breakTableCommand","dispatch","isInTable","paragraphSchema","Selection","insertTableCommand","from","sel","moveRowCommand","to","result","moveColCommand","selectRowCommand","selectColCommand","selectTableCommand","deleteSelectedCellsCommand","isRow","isCol","deleteTable","deleteColumn","deleteRow","addColBeforeCommand","addColumnBefore","addColAfterCommand","addColumnAfter","addRowBeforeCommand","selectedRect","addRowAfterCommand","setAlignCommand","alignment","setCellAttr","tableKeymap","id","markdownId","footnoteDefinitionSchema","expectDomTypeError","label","footnoteReferenceSchema","extendListItemSchemaForTask","listItemSchema","prev","baseSchema","checked","listType","spread","keymap","inputrules","autoInsertZeroSpaceInTablePlugin","$prose","pluginKey","PluginKey","isParagraph","isEmptyParagraph","Plugin","view","$from","browser","columnResizingPlugin","columnResizing","tableEditingPlugin","tableEditing","remarkGFMPlugin","$remark","remarkGFM","plugins","schema","gfm"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.es.js","sources":["../src/mark/strike-through.ts","../src/node/table/utils.ts","../src/node/table/index.ts","../src/node/footnote/definition.ts","../src/node/footnote/reference.ts","../src/node/task-list-item.ts","../src/composed/keymap.ts","../src/composed/inputrules.ts","../src/plugin/auto-insert-zero-space-plugin.ts","../src/plugin/column-resizing-plugin.ts","../src/plugin/table-editing-plugin.ts","../src/plugin/remark-gfm-plugin.ts","../src/composed/plugins.ts","../src/composed/schema.ts","../src/composed/commands.ts","../src/index.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nimport { commandsCtx } from '@milkdown/core'\nimport { toggleMark } from '@milkdown/prose/commands'\nimport { $command, $markAttr, $markSchema, $useKeymap } from '@milkdown/utils'\n\n/// HTML attributes for the strikethrough mark.\nexport const strikethroughAttr = $markAttr('strike_through')\n\n/// Strikethrough mark schema.\nexport const strikethroughSchema = $markSchema('strike_through', ctx => ({\n inclusive: false,\n parseDOM: [\n { tag: 'del' },\n { style: 'text-decoration', getAttrs: value => (value === 'line-through') as false },\n ],\n toDOM: mark => ['del', ctx.get(strikethroughAttr.key)(mark)],\n parseMarkdown: {\n match: node => node.type === 'delete',\n runner: (state, node, markType) => {\n state.openMark(markType)\n state.next(node.children)\n state.closeMark(markType)\n },\n },\n toMarkdown: {\n match: mark => mark.type.name === 'strike_through',\n runner: (state, mark) => {\n state.withMark(mark, 'delete')\n },\n },\n}))\n\n/// A command to toggle the strikethrough mark.\nexport const toggleStrikethroughCommand = $command('ToggleStrikeThrough', () => () => toggleMark(strikethroughSchema.type()))\n\n/// Keymap for the strikethrough mark.\n/// - `Mod-Alt-x` - Toggle the strikethrough mark.\nexport const strikethroughKeymap = $useKeymap('strikeThroughKeymap', {\n ToggleStrikethrough: {\n shortcuts: 'Mod-Alt-x',\n command: (ctx) => {\n const commands = ctx.get(commandsCtx)\n return () => commands.call(toggleStrikethroughCommand.key)\n },\n },\n})\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport type { ContentNodeWithPos } from '@milkdown/prose'\nimport { cloneTr, findParentNode } from '@milkdown/prose'\nimport type { Node } from '@milkdown/prose/model'\nimport type { Selection, Transaction } from '@milkdown/prose/state'\nimport type { TableRect } from '@milkdown/prose/tables'\nimport { CellSelection, TableMap } from '@milkdown/prose/tables'\n\nimport { tableCellSchema, tableHeaderSchema, tableRowSchema, tableSchema } from '.'\n\n/// @internal\nexport interface CellPos {\n pos: number\n start: number\n node: Node\n}\n\n/// @internal\nexport const createTable = (rowsCount = 3, colsCount = 3): Node => {\n const cells = Array(colsCount)\n .fill(0)\n .map(() => tableCellSchema.type().createAndFill()!)\n\n const headerCells = Array(colsCount)\n .fill(0)\n .map(() => tableHeaderSchema.type().createAndFill()!)\n\n const rows = Array(rowsCount)\n .fill(0)\n .map((_, i) => tableRowSchema.type().create(null, i === 0 ? headerCells : cells))\n\n return tableSchema.type().create(null, rows)\n}\n\n/// Find the table node with position information for current selection.\nexport const findTable = (selection: Selection) =>\n findParentNode(node => node.type.spec.tableRole === 'table')(selection)\n\n/// Get cells in a column of a table.\nexport const getCellsInCol = (columnIndex: number, selection: Selection): CellPos[] | undefined => {\n const table = findTable(selection)\n if (!table)\n return undefined\n const map = TableMap.get(table.node)\n if (columnIndex < 0 || columnIndex >= map.width)\n return undefined\n\n return map\n .cellsInRect({ left: columnIndex, right: columnIndex + 1, top: 0, bottom: map.height })\n .map((pos) => {\n const node = table.node.nodeAt(pos)\n if (!node)\n return undefined\n const start = pos + table.start\n return {\n pos: start,\n start: start + 1,\n node,\n }\n })\n .filter((x): x is CellPos => x != null)\n}\n\n/// Get cells in a row of a table.\nexport const getCellsInRow = (rowIndex: number, selection: Selection): CellPos[] | undefined => {\n const table = findTable(selection)\n if (!table)\n return undefined\n const map = TableMap.get(table.node)\n if (rowIndex < 0 || rowIndex >= map.height)\n return undefined\n\n return map\n .cellsInRect({ left: 0, right: map.width, top: rowIndex, bottom: rowIndex + 1 })\n .map((pos) => {\n const node = table.node.nodeAt(pos)\n if (!node)\n return undefined\n const start = pos + table.start\n return {\n pos: start,\n start: start + 1,\n node,\n }\n })\n .filter((x): x is CellPos => x != null)\n}\n\n/// Get all cells in a table.\nexport const getAllCellsInTable = (selection: Selection) => {\n const table = findTable(selection)\n if (!table)\n return\n\n const map = TableMap.get(table.node)\n const cells = map.cellsInRect({\n left: 0,\n right: map.width,\n top: 0,\n bottom: map.height,\n })\n return cells.map((nodePos) => {\n const node = table.node.nodeAt(nodePos)\n const pos = nodePos + table.start\n return { pos, start: pos + 1, node }\n })\n}\n\n/// Select a possible table in current selection.\nexport const selectTable = (tr: Transaction) => {\n const cells = getAllCellsInTable(tr.selection)\n if (cells && cells[0]) {\n const $firstCell = tr.doc.resolve(cells[0].pos)\n const last = cells[cells.length - 1]\n if (last) {\n const $lastCell = tr.doc.resolve(last.pos)\n return cloneTr(tr.setSelection(new CellSelection($lastCell, $firstCell)))\n }\n }\n return tr\n}\n\n/// @internal\nexport function addRowWithAlignment(tr: Transaction, { map, tableStart, table }: TableRect, row: number) {\n const rowPos = Array(row)\n .fill(0)\n .reduce((acc, _, i) => {\n return acc + table.child(i).nodeSize\n }, tableStart)\n\n const cells = Array(map.width)\n .fill(0)\n .map((_, col) => {\n const headerCol = table.nodeAt(map.map[col] as number)\n return tableCellSchema.type().createAndFill({ alignment: headerCol?.attrs.alignment }) as Node\n })\n\n tr.insert(rowPos, tableRowSchema.type().create(null, cells))\n return tr\n}\n\n/// @internal\nexport const selectLine = (type: 'row' | 'col') => (index: number) => (tr: Transaction) => {\n const table = findTable(tr.selection)\n const isRowSelection = type === 'row'\n if (table) {\n const map = TableMap.get(table.node)\n\n // Check if the index is valid\n if (index >= 0 && index < (isRowSelection ? map.height : map.width)) {\n const lastCell = map.positionAt(\n isRowSelection ? index : map.height - 1,\n isRowSelection ? map.width - 1 : index,\n table.node,\n )\n const $lastCell = tr.doc.resolve(table.start + lastCell)\n\n const createCellSelection = isRowSelection ? CellSelection.rowSelection : CellSelection.colSelection\n\n const firstCell = map.positionAt(isRowSelection ? index : 0, isRowSelection ? 0 : index, table.node)\n const $firstCell = tr.doc.resolve(table.start + firstCell)\n return cloneTr(tr.setSelection(createCellSelection($lastCell, $firstCell) as unknown as Selection))\n }\n }\n return tr\n}\n\n/// If the selection is in a table,\n/// select the {index} row.\nexport const selectRow = selectLine('row')\n\n/// If the selection is in a table,\n/// select the {index} column.\nexport const selectCol = selectLine('col')\n\nconst transpose = <T>(array: T[][]) => {\n return array[0]!.map((_, i) => {\n return array.map(column => column[i])\n }) as T[][]\n}\n\nconst convertArrayOfRowsToTableNode = (tableNode: Node, arrayOfNodes: (Node | null)[][]) => {\n const rowsPM = []\n const map = TableMap.get(tableNode)\n for (let rowIndex = 0; rowIndex < map.height; rowIndex++) {\n const row = tableNode.child(rowIndex)\n const rowCells = []\n\n for (let colIndex = 0; colIndex < map.width; colIndex++) {\n if (!arrayOfNodes[rowIndex]![colIndex])\n continue\n\n const cellPos = map.map[rowIndex * map.width + colIndex]!\n\n const cell = arrayOfNodes[rowIndex]![colIndex]!\n const oldCell = tableNode.nodeAt(cellPos)!\n const newCell = oldCell.type.createChecked(\n Object.assign({}, cell.attrs),\n cell.content,\n cell.marks,\n )\n rowCells.push(newCell)\n }\n\n rowsPM.push(row.type.createChecked(row.attrs, rowCells, row.marks))\n }\n\n const newTable = tableNode.type.createChecked(\n tableNode.attrs,\n rowsPM,\n tableNode.marks,\n )\n\n return newTable\n}\n\nconst convertTableNodeToArrayOfRows = (tableNode: Node) => {\n const map = TableMap.get(tableNode)\n const rows: (Node | null)[][] = []\n for (let rowIndex = 0; rowIndex < map.height; rowIndex++) {\n const rowCells: (Node | null)[] = []\n const seen: Record<number, boolean> = {}\n\n for (let colIndex = 0; colIndex < map.width; colIndex++) {\n const cellPos = map.map[rowIndex * map.width + colIndex]!\n const cell = tableNode.nodeAt(cellPos)\n const rect = map.findCell(cellPos)\n if (seen[cellPos] || rect.top !== rowIndex) {\n rowCells.push(null)\n continue\n }\n seen[cellPos] = true\n\n rowCells.push(cell)\n }\n\n rows.push(rowCells)\n }\n\n return rows\n}\n\nconst moveRowInArrayOfRows = (\n rows: (Node | null)[][],\n indexesOrigin: number[],\n indexesTarget: number[],\n directionOverride: -1 | 1 | 0,\n) => {\n const direction = indexesOrigin[0]! > indexesTarget[0]! ? -1 : 1\n\n const rowsExtracted = rows.splice(indexesOrigin[0]!, indexesOrigin.length)\n const positionOffset = rowsExtracted.length % 2 === 0 ? 1 : 0\n let target: number\n\n if (directionOverride === -1 && direction === 1) {\n target = indexesTarget[0]! - 1\n }\n else if (directionOverride === 1 && direction === -1) {\n target = indexesTarget[indexesTarget.length - 1]! - positionOffset + 1\n }\n else {\n target\n = direction === -1\n ? indexesTarget[0]!\n : indexesTarget[indexesTarget.length - 1]! - positionOffset\n }\n\n rows.splice(target, 0, ...rowsExtracted)\n return rows\n}\n\nconst moveTableColumn = (\n table: ContentNodeWithPos,\n indexesOrigin: number[],\n indexesTarget: number[],\n direction: -1 | 1 | 0,\n) => {\n let rows = transpose(convertTableNodeToArrayOfRows(table.node))\n\n rows = moveRowInArrayOfRows(rows, indexesOrigin, indexesTarget, direction)\n rows = transpose(rows)\n\n return convertArrayOfRowsToTableNode(table.node, rows)\n}\n\nconst moveTableRow = (\n table: ContentNodeWithPos,\n indexesOrigin: number[],\n indexesTarget: number[],\n direction: -1 | 1 | 0,\n) => {\n let rows = convertTableNodeToArrayOfRows(table.node)\n\n rows = moveRowInArrayOfRows(rows, indexesOrigin, indexesTarget, direction)\n\n return convertArrayOfRowsToTableNode(table.node, rows)\n}\n\nconst getSelectionRangeInColumn = (columnIndex: number, tr: Transaction) => {\n let startIndex = columnIndex\n let endIndex = columnIndex\n\n // looking for selection start column (startIndex)\n for (let i = columnIndex; i >= 0; i--) {\n const cells = getCellsInCol(i, tr.selection)\n if (cells) {\n cells.forEach((cell) => {\n const maybeEndIndex = cell.node.attrs.colspan + i - 1\n if (maybeEndIndex >= startIndex)\n startIndex = i\n\n if (maybeEndIndex > endIndex)\n endIndex = maybeEndIndex\n })\n }\n }\n // looking for selection end column (endIndex)\n for (let i = columnIndex; i <= endIndex; i++) {\n const cells = getCellsInCol(i, tr.selection)\n if (cells) {\n cells.forEach((cell) => {\n const maybeEndIndex = cell.node.attrs.colspan + i - 1\n if (cell.node.attrs.colspan > 1 && maybeEndIndex > endIndex)\n endIndex = maybeEndIndex\n })\n }\n }\n\n // filter out columns without cells (where all rows have colspan > 1 in the same column)\n const indexes = []\n for (let i = startIndex; i <= endIndex; i++) {\n const maybeCells = getCellsInCol(i, tr.selection)\n if (maybeCells && maybeCells.length)\n indexes.push(i)\n }\n startIndex = indexes[0]!\n endIndex = indexes[indexes.length - 1]!\n\n const firstSelectedColumnCells = getCellsInCol(startIndex, tr.selection)!\n const firstRowCells = getCellsInRow(0, tr.selection)!\n const $anchor = tr.doc.resolve(\n firstSelectedColumnCells[firstSelectedColumnCells.length - 1]!.pos,\n )\n\n let headCell: CellPos | undefined\n for (let i = endIndex; i >= startIndex; i--) {\n const columnCells = getCellsInCol(i, tr.selection)\n if (columnCells && columnCells.length) {\n for (let j = firstRowCells.length - 1; j >= 0; j--) {\n if (firstRowCells[j]!.pos === columnCells[0]!.pos) {\n headCell = columnCells[0]\n break\n }\n }\n if (headCell)\n break\n }\n }\n\n const $head = tr.doc.resolve(headCell!.pos)\n return { $anchor, $head, indexes }\n}\n\nconst getSelectionRangeInRow = (rowIndex: number, tr: Transaction) => {\n let startIndex = rowIndex\n let endIndex = rowIndex\n // looking for selection start row (startIndex)\n for (let i = rowIndex; i >= 0; i--) {\n const cells = getCellsInRow(i, tr.selection)\n cells!.forEach((cell) => {\n const maybeEndIndex = cell.node.attrs.rowspan + i - 1\n if (maybeEndIndex >= startIndex)\n startIndex = i\n\n if (maybeEndIndex > endIndex)\n endIndex = maybeEndIndex\n })\n }\n // looking for selection end row (endIndex)\n for (let i = rowIndex; i <= endIndex; i++) {\n const cells = getCellsInRow(i, tr.selection)\n cells!.forEach((cell) => {\n const maybeEndIndex = cell.node.attrs.rowspan + i - 1\n if (cell.node.attrs.rowspan > 1 && maybeEndIndex > endIndex)\n endIndex = maybeEndIndex\n })\n }\n\n // filter out rows without cells (where all columns have rowspan > 1 in the same row)\n const indexes = []\n for (let i = startIndex; i <= endIndex; i++) {\n const maybeCells = getCellsInRow(i, tr.selection)\n if (maybeCells && maybeCells.length)\n indexes.push(i)\n }\n startIndex = indexes[0]!\n endIndex = indexes[indexes.length - 1]!\n\n const firstSelectedRowCells = getCellsInRow(startIndex, tr.selection)!\n const firstColumnCells = getCellsInCol(0, tr.selection)!\n const $anchor = tr.doc.resolve(firstSelectedRowCells[firstSelectedRowCells.length - 1]!.pos)\n\n let headCell: CellPos | undefined\n for (let i = endIndex; i >= startIndex; i--) {\n const rowCells = getCellsInRow(i, tr.selection)\n if (rowCells && rowCells.length) {\n for (let j = firstColumnCells.length - 1; j >= 0; j--) {\n if (firstColumnCells[j]!.pos === rowCells[0]!.pos) {\n headCell = rowCells[0]!\n break\n }\n }\n if (headCell)\n break\n }\n }\n\n const $head = tr.doc.resolve(headCell!.pos)\n return { $anchor, $head, indexes }\n}\n\n/// If the selection is in a table,\n/// Move the columns at `origin` to `target` in current table.\n/// The `select` is true by default, which means the selection will be set to the moved column.\nexport function moveCol(tr: Transaction, origin: number, target: number, select = true) {\n const table = findTable(tr.selection)\n if (!table)\n return tr\n\n const { indexes: indexesOriginColumn } = getSelectionRangeInColumn(origin, tr)\n const { indexes: indexesTargetColumn } = getSelectionRangeInColumn(target, tr)\n\n if (indexesOriginColumn.includes(target))\n return tr\n\n const newTable = moveTableColumn(\n table,\n indexesOriginColumn,\n indexesTargetColumn,\n 0,\n )\n\n const _tr = cloneTr(tr).replaceWith(\n table.pos,\n table.pos + table.node.nodeSize,\n newTable,\n )\n\n if (!select)\n return _tr\n\n const map = TableMap.get(newTable)\n const start = table.start\n const index = target\n const lastCell = map.positionAt(map.height - 1, index, newTable)\n const $lastCell = _tr.doc.resolve(start + lastCell)\n\n const createCellSelection = CellSelection.colSelection\n\n const firstCell = map.positionAt(0, index, newTable)\n const $firstCell = _tr.doc.resolve(start + firstCell)\n\n return _tr.setSelection(createCellSelection($lastCell, $firstCell))\n}\n\n/// If the selection is in a table,\n/// Move the rows at `origin` and `target` in current table.\n/// The `select` is true by default, which means the selection will be set to the moved row.\nexport function moveRow(tr: Transaction, origin: number, target: number, select = true) {\n const table = findTable(tr.selection)\n if (!table)\n return tr\n\n const { indexes: indexesOriginRow } = getSelectionRangeInRow(origin, tr)\n const { indexes: indexesTargetRow } = getSelectionRangeInRow(target, tr)\n\n if (indexesOriginRow.includes(target))\n return tr\n\n const newTable = moveTableRow(\n table,\n indexesOriginRow,\n indexesTargetRow,\n 0,\n )\n\n const _tr = cloneTr(tr).replaceWith(\n table.pos,\n table.pos + table.node.nodeSize,\n newTable,\n )\n\n if (!select)\n return _tr\n\n const map = TableMap.get(newTable)\n const start = table.start\n const index = target\n const lastCell = map.positionAt(index, map.width - 1, newTable)\n const $lastCell = _tr.doc.resolve(start + lastCell)\n\n const createCellSelection = CellSelection.rowSelection\n\n const firstCell = map.positionAt(index, 0, newTable)\n const $firstCell = _tr.doc.resolve(start + firstCell)\n\n return _tr.setSelection(createCellSelection($lastCell, $firstCell))\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { MarkdownNode } from '@milkdown/transformer'\nimport { commandsCtx } from '@milkdown/core'\nimport { paragraphSchema } from '@milkdown/preset-commonmark'\nimport { InputRule } from '@milkdown/prose/inputrules'\nimport type { NodeType } from '@milkdown/prose/model'\nimport { Selection, TextSelection } from '@milkdown/prose/state'\nimport { CellSelection, addColumnAfter, addColumnBefore, deleteColumn, deleteRow, deleteTable, goToNextCell, isInTable, selectedRect, setCellAttr, tableNodes } from '@milkdown/prose/tables'\nimport { $command, $inputRule, $nodeSchema, $useKeymap } from '@milkdown/utils'\nimport { addRowWithAlignment, createTable, moveCol, moveRow, selectCol, selectRow, selectTable } from './utils'\n\nconst originalSchema = tableNodes({\n tableGroup: 'block',\n cellContent: 'paragraph',\n cellAttributes: {\n alignment: {\n default: 'left',\n getFromDOM: dom => (dom as HTMLElement).style.textAlign || 'left',\n setDOMAttr: (value, attrs) => {\n attrs.style = `text-align: ${value || 'left'}`\n },\n },\n },\n})\n\n/// Schema for table node.\nexport const tableSchema = $nodeSchema('table', () => ({\n ...originalSchema.table,\n parseMarkdown: {\n match: node => node.type === 'table',\n runner: (state, node, type) => {\n const align = node.align as (string | null)[]\n const children = (node.children as MarkdownNode[]).map((x, i) => ({\n ...x,\n align,\n isHeader: i === 0,\n }))\n state.openNode(type)\n state.next(children)\n state.closeNode()\n },\n },\n toMarkdown: {\n match: node => node.type.name === 'table',\n runner: (state, node) => {\n const firstLine = node.content.firstChild?.content\n if (!firstLine)\n return\n\n const align: (string | null)[] = []\n firstLine.forEach((cell) => {\n align.push(cell.attrs.alignment)\n })\n state.openNode('table', undefined, { align })\n state.next(node.content)\n state.closeNode()\n },\n },\n\n}))\n\n/// Schema for table row node.\nexport const tableRowSchema = $nodeSchema('table_row', () => ({\n ...originalSchema.table_row,\n parseMarkdown: {\n match: node => node.type === 'tableRow',\n runner: (state, node, type) => {\n const align = node.align as (string | null)[]\n const children = (node.children as MarkdownNode[]).map((x, i) => ({\n ...x,\n align: align[i],\n isHeader: node.isHeader,\n }))\n state.openNode(type)\n state.next(children)\n state.closeNode()\n },\n },\n toMarkdown: {\n match: node => node.type.name === 'table_row',\n runner: (state, node) => {\n state.openNode('tableRow')\n state.next(node.content)\n state.closeNode()\n },\n },\n}))\n\n/// Schema for table cell node.\nexport const tableCellSchema = $nodeSchema('table_cell', () => ({\n ...originalSchema.table_cell,\n parseMarkdown: {\n match: node => node.type === 'tableCell' && !node.isHeader,\n runner: (state, node, type) => {\n const align = node.align as string\n state\n .openNode(type, { alignment: align })\n .openNode(state.schema.nodes.paragraph as NodeType)\n .next(node.children)\n .closeNode()\n .closeNode()\n },\n },\n toMarkdown: {\n match: node => node.type.name === 'table_cell',\n runner: (state, node) => {\n state.openNode('tableCell').next(node.content).closeNode()\n },\n },\n}))\n\n/// Schema for table header node.\nexport const tableHeaderSchema = $nodeSchema('table_header', () => ({\n ...originalSchema.table_header,\n parseMarkdown: {\n match: node => node.type === 'tableCell' && !!node.isHeader,\n runner: (state, node, type) => {\n const align = node.align as string\n state.openNode(type, { alignment: align })\n state.openNode(state.schema.nodes.paragraph as NodeType)\n state.next(node.children)\n state.closeNode()\n state.closeNode()\n },\n },\n toMarkdown: {\n match: node => node.type.name === 'table_header',\n runner: (state, node) => {\n state.openNode('tableCell')\n state.next(node.content)\n state.closeNode()\n },\n },\n}))\n\n/// A input rule for creating table.\n/// For example, `|2x2|` will create a 2x2 table.\nexport const insertTableInputRule = $inputRule(() => new InputRule(\n /^\\|(?<col>\\d+)[xX](?<row>\\d+)\\|\\s$/, (state, match, start, end) => {\n const $start = state.doc.resolve(start)\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), tableSchema.type()))\n return null\n\n const tableNode = createTable(\n Number(match.groups?.row),\n Number(match.groups?.col),\n )\n const tr = state.tr.replaceRangeWith(start, end, tableNode).scrollIntoView()\n return tr.setSelection(TextSelection.create(tr.doc, start + 3))\n },\n))\n\n/// A command for moving cursor to previous cell.\nexport const goToPrevTableCellCommand = $command('GoToPrevTableCell', () => () => goToNextCell(-1))\n\n/// A command for moving cursor to next cell.\nexport const goToNextTableCellCommand = $command('GoToNextTableCell', () => () => goToNextCell(1))\n\n/// A command for splitting current table into two tables.\n/// If the selection is at the end of the table,\n/// it will just quit the table and insert a new paragraph node.\nexport const breakTableCommand = $command('BreakTable', () => () => (state, dispatch) => {\n if (!isInTable(state))\n return false\n\n const { $head } = state.selection\n const pos = $head.after()\n const tr = state.tr\n .replaceWith(pos, pos, paragraphSchema.type().createAndFill()!)\n\n tr.setSelection(Selection.near(tr.doc.resolve(pos), 1)).scrollIntoView()\n dispatch?.(tr)\n return true\n})\n\n/// A command for inserting a table.\n/// You can specify the number of rows and columns.\n/// By default, it will insert a 3x3 table.\nexport const insertTableCommand = $command('InsertTable', () => ({ row, col }: { row?: number; col?: number } = {}) => (state, dispatch) => {\n const { selection, tr } = state\n const { from } = selection\n const table = createTable(row, col)\n const _tr = tr.replaceSelectionWith(table)\n const sel = Selection.findFrom(_tr.doc.resolve(from), 1, true)\n if (sel)\n dispatch?.(_tr.setSelection(sel))\n\n return true\n})\n\n/// A command for moving a row in a table.\n/// You should specify the `from` and `to` index.\nexport const moveRowCommand = $command('MoveRow', () => ({ from, to }: { from?: number; to?: number } = {}) => (state, dispatch) => {\n const { tr } = state\n const result = dispatch?.(moveRow(tr, from ?? 0, to ?? 0, true))\n\n return Boolean(result)\n})\n\n/// A command for moving a column in a table.\n/// You should specify the `from` and `to` index.\nexport const moveColCommand = $command('MoveCol', () => ({ from, to }: { from?: number; to?: number } = {}) => (state, dispatch) => {\n const { tr } = state\n const result = dispatch?.(moveCol(tr, from ?? 0, to ?? 0, true))\n\n return Boolean(result)\n})\n\n/// A command for selecting a row.\nexport const selectRowCommand = $command<number, 'SelectRow'>('SelectRow', () => (index = 0) => (state, dispatch) => {\n const { tr } = state\n const result = dispatch?.(selectRow(index)(tr))\n\n return Boolean(result)\n})\n\n/// A command for selecting a column.\nexport const selectColCommand = $command<number, 'SelectCol'>('SelectCol', () => (index = 0) => (state, dispatch) => {\n const { tr } = state\n const result = dispatch?.(selectCol(index)(tr))\n\n return Boolean(result)\n})\n\n/// A command for selecting a table.\nexport const selectTableCommand = $command('SelectTable', () => () => (state, dispatch) => {\n const { tr } = state\n const result = dispatch?.(selectTable(tr))\n\n return Boolean(result)\n})\n\n/// A command for deleting selected cells.\n/// If the selection is a row or column, the row or column will be deleted.\n/// If all cells are selected, the table will be deleted.\nexport const deleteSelectedCellsCommand = $command('DeleteSelectedCells', () => () => (state, dispatch) => {\n const { selection } = state\n if (!(selection instanceof CellSelection))\n return false\n\n const isRow = selection.isRowSelection()\n const isCol = selection.isColSelection()\n\n if (isRow && isCol)\n return deleteTable(state, dispatch)\n\n if (isCol)\n return deleteColumn(state, dispatch)\n\n else\n return deleteRow(state, dispatch)\n})\n\n/// A command for adding a column before the current column.\nexport const addColBeforeCommand = $command('AddColBefore', () => () => addColumnBefore)\n\n/// A command for adding a column after the current column.\nexport const addColAfterCommand = $command('AddColAfter', () => () => addColumnAfter)\n\n/// A command for adding a row before the current row.\nexport const addRowBeforeCommand = $command('AddRowBefore', () => () => (state, dispatch) => {\n if (!isInTable(state))\n return false\n if (dispatch) {\n const rect = selectedRect(state)\n dispatch(addRowWithAlignment(state.tr, rect, rect.top))\n }\n return true\n})\n\n/// A command for adding a row after the current row.\nexport const addRowAfterCommand = $command('AddRowAfter', () => () => (state, dispatch) => {\n if (!isInTable(state))\n return false\n if (dispatch) {\n const rect = selectedRect(state)\n dispatch(addRowWithAlignment(state.tr, rect, rect.bottom))\n }\n return true\n})\n\n/// A command for setting alignment property for selected cells.\n/// You can specify the alignment as `left`, `center`, or `right`.\n/// It's `left` by default.\nexport const setAlignCommand = $command<'left' | 'center' | 'right', 'SetAlign'>('SetAlign', () => (alignment = 'left') => setCellAttr('alignment', alignment))\n\n/// Keymap for table commands.\n/// - `<Mod-]>`/`<Tab>`: Move to the next cell.\n/// - `<Mod-[>`/`<Shift-Tab>`: Move to the previous cell.\n/// - `<Mod-Enter>`: Exit the table, and break it if possible.\nexport const tableKeymap = $useKeymap('tableKeymap', {\n NextCell: {\n shortcuts: ['Mod-]', 'Tab'],\n command: (ctx) => {\n const commands = ctx.get(commandsCtx)\n\n return () => commands.call(goToNextTableCellCommand.key)\n },\n },\n PrevCell: {\n shortcuts: ['Mod-[', 'Shift-Tab'],\n command: (ctx) => {\n const commands = ctx.get(commandsCtx)\n\n return () => commands.call(goToPrevTableCellCommand.key)\n },\n },\n ExitTable: {\n shortcuts: ['Mod-Enter'],\n command: (ctx) => {\n const commands = ctx.get(commandsCtx)\n\n return () => commands.call(breakTableCommand.key)\n },\n },\n})\n\nexport * from './utils'\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { expectDomTypeError } from '@milkdown/exception'\nimport { $nodeSchema } from '@milkdown/utils'\n\nconst id = 'footnote_definition'\nconst markdownId = 'footnoteDefinition'\n\n/// Footnote definition node schema.\nexport const footnoteDefinitionSchema = $nodeSchema('footnote_definition', () => ({\n group: 'block',\n content: 'block+',\n defining: true,\n attrs: {\n label: {\n default: '',\n },\n },\n parseDOM: [\n {\n tag: `dl[data-type=\"${id}\"]`,\n getAttrs: (dom) => {\n if (!(dom instanceof HTMLElement))\n throw expectDomTypeError(dom)\n\n return {\n label: dom.dataset.label,\n }\n },\n contentElement: 'dd',\n },\n ],\n toDOM: (node) => {\n const label = node.attrs.label\n\n return [\n 'dl',\n {\n // TODO: add a prosemirror plugin to sync label on change\n 'data-label': label,\n 'data-type': id,\n },\n ['dt', label],\n ['dd', 0],\n ]\n },\n parseMarkdown: {\n match: ({ type }) => type === markdownId,\n runner: (state, node, type) => {\n state\n .openNode(type, {\n label: node.label as string,\n })\n .next(node.children)\n .closeNode()\n },\n },\n toMarkdown: {\n match: node => node.type.name === id,\n runner: (state, node) => {\n state\n .openNode(markdownId, undefined, {\n label: node.attrs.label,\n identifier: node.attrs.label,\n })\n .next(node.content)\n .closeNode()\n },\n },\n}))\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { expectDomTypeError } from '@milkdown/exception'\nimport { $nodeSchema } from '@milkdown/utils'\n\nconst id = 'footnote_reference'\n\n/// Footnote reference node schema.\nexport const footnoteReferenceSchema = $nodeSchema('footnote_reference', () => ({\n group: 'inline',\n inline: true,\n atom: true,\n attrs: {\n label: {\n default: '',\n },\n },\n parseDOM: [\n {\n tag: `sup[data-type=\"${id}\"]`,\n getAttrs: (dom) => {\n if (!(dom instanceof HTMLElement))\n throw expectDomTypeError(dom)\n\n return {\n label: dom.dataset.label,\n }\n },\n },\n ],\n toDOM: (node) => {\n const label = node.attrs.label\n return [\n 'sup',\n {\n // TODO: add a prosemirror plugin to sync label on change\n 'data-label': label,\n 'data-type': id,\n },\n label,\n ]\n },\n parseMarkdown: {\n match: ({ type }) => type === 'footnoteReference',\n runner: (state, node, type) => {\n state.addNode(type, {\n label: node.label as string,\n })\n },\n },\n toMarkdown: {\n match: node => node.type.name === id,\n runner: (state, node) => {\n state.addNode('footnoteReference', undefined, undefined, {\n label: node.attrs.label,\n identifier: node.attrs.label,\n })\n },\n },\n}))\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { expectDomTypeError } from '@milkdown/exception'\nimport { listItemSchema } from '@milkdown/preset-commonmark'\nimport { InputRule } from '@milkdown/prose/inputrules'\nimport { $inputRule } from '@milkdown/utils'\n\n/// This schema extends the [list item](/preset-commonmark#list-item) schema and add task list support for it.\nexport const extendListItemSchemaForTask = listItemSchema.extendSchema((prev) => {\n return (ctx) => {\n const baseSchema = prev(ctx)\n return {\n ...baseSchema,\n attrs: {\n ...baseSchema.attrs,\n checked: {\n default: null,\n },\n },\n parseDOM: [\n {\n tag: 'li[data-item-type=\"task\"]',\n getAttrs: (dom) => {\n if (!(dom instanceof HTMLElement))\n throw expectDomTypeError(dom)\n\n return {\n label: dom.dataset.label,\n listType: dom.dataset['list-type'],\n spread: dom.dataset.spread,\n checked: dom.dataset.checked ? dom.dataset.checked === 'true' : null,\n }\n },\n },\n ...baseSchema?.parseDOM || [],\n ],\n toDOM: (node) => {\n if (baseSchema.toDOM && node.attrs.checked == null)\n return baseSchema.toDOM(node)\n\n return [\n 'li',\n {\n 'data-item-type': 'task',\n 'data-label': node.attrs.label,\n 'data-list-type': node.attrs.listType,\n 'data-spread': node.attrs.spread,\n 'data-checked': node.attrs.checked,\n },\n 0,\n ]\n },\n parseMarkdown: {\n match: ({ type }) => type === 'listItem',\n runner: (state, node, type) => {\n if (node.checked == null) {\n baseSchema.parseMarkdown.runner(state, node, type)\n return\n }\n\n const label = node.label != null ? `${node.label}.` : '•'\n const checked = node.checked != null ? Boolean(node.checked) : null\n const listType = node.label != null ? 'ordered' : 'bullet'\n const spread = node.spread != null ? `${node.spread}` : 'true'\n\n state.openNode(type, { label, listType, spread, checked })\n state.next(node.children)\n state.closeNode()\n },\n },\n toMarkdown: {\n match: node => node.type.name === 'list_item',\n runner: (state, node) => {\n if (node.attrs.checked == null) {\n baseSchema.toMarkdown.runner(state, node)\n return\n }\n\n const label = node.attrs.label\n const listType = node.attrs.listType\n const spread = node.attrs.spread === 'true'\n const checked = node.attrs.checked\n\n state.openNode('listItem', undefined, { label, listType, spread, checked })\n state.next(node.content)\n state.closeNode()\n },\n },\n }\n }\n})\n\n/// Input rule for wrapping a block in task list node.\n/// Users can type `[ ] ` or `[x] ` to wrap the block in task list node with checked status.\nexport const wrapInTaskListInputRule = $inputRule(() => {\n return new InputRule(/^\\[(?<checked>\\s|x)\\]\\s$/, (state, match, start, end) => {\n const pos = state.doc.resolve(start)\n let depth = 0\n let node = pos.node(depth)\n while (node && node.type.name !== 'list_item') {\n depth--\n node = pos.node(depth)\n }\n\n if (!node || node.attrs.checked != null)\n return null\n\n const checked = Boolean(match.groups?.checked === 'x')\n\n const finPos = pos.before(depth)\n const tr = state.tr\n\n tr.deleteRange(start, end)\n .setNodeMarkup(finPos, undefined, { ...node.attrs, checked })\n\n return tr\n })\n})\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { MilkdownPlugin } from '@milkdown/ctx'\nimport { strikethroughKeymap } from '../mark'\nimport { tableKeymap } from '../node'\n\n/// @internal\nexport const keymap: MilkdownPlugin[] = [\n strikethroughKeymap,\n tableKeymap,\n].flat()\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { MilkdownPlugin } from '@milkdown/ctx'\nimport { insertTableInputRule, wrapInTaskListInputRule } from '../node'\n\n/// @internal\nexport const inputrules: MilkdownPlugin[] = [\n insertTableInputRule,\n wrapInTaskListInputRule,\n]\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { browser } from '@milkdown/prose'\nimport type { Node } from '@milkdown/prose/model'\nimport { isInTable } from '@milkdown/prose/tables'\nimport { Plugin, PluginKey } from '@milkdown/prose/state'\nimport { paragraphSchema } from '@milkdown/preset-commonmark'\nimport { $prose } from '@milkdown/utils'\n\n/// This plugin is used to fix the bug of IME composing in table in Safari browser.\n/// original discussion in https://discuss.prosemirror.net/t/ime-composing-problems-on-td-or-th-element-in-safari-browser/4501\nexport const autoInsertZeroSpaceInTablePlugin = $prose(() => {\n const pluginKey = new PluginKey('MILKDOWN_AUTO_INSERT_ZERO_SPACE')\n\n const isParagraph = (node: Node) => node.type === paragraphSchema.type()\n\n const isEmptyParagraph = (node: Node) => isParagraph(node) && node.nodeSize === 2\n\n return new Plugin({\n key: pluginKey,\n props: {\n handleDOMEvents: {\n compositionstart(view) {\n const { state, dispatch } = view\n const { tr, selection } = state\n const { $from } = selection\n if (browser.safari && isInTable(state) && selection.empty && isEmptyParagraph($from.parent))\n dispatch(tr.insertText('\\u2060', $from.start()))\n\n return false\n },\n compositionend(view) {\n const { state, dispatch } = view\n const { tr, selection } = state\n const { $from } = selection\n\n if (\n browser.safari\n && isInTable(state)\n && selection.empty\n && isParagraph($from.parent)\n && $from.parent.textContent.startsWith('\\u2060')\n )\n dispatch(tr.delete($from.start(), $from.start() + 1))\n\n return false\n },\n },\n },\n })\n})\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { columnResizing } from '@milkdown/prose/tables'\nimport { $prose } from '@milkdown/utils'\n\n/// This plugin is wrapping the `columnResizing` plugin from [prosemirror-tables](https://github.com/ProseMirror/prosemirror-tables).\nexport const columnResizingPlugin = $prose(() => columnResizing({}))\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { tableEditing } from '@milkdown/prose/tables'\nimport { $prose } from '@milkdown/utils'\n\n/// This plugin is wrapping the `tableEditing` plugin from [prosemirror-tables](https://github.com/ProseMirror/prosemirror-tables).\nexport const tableEditingPlugin = $prose(() => tableEditing())\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { $remark } from '@milkdown/utils'\nimport remarkGFM from 'remark-gfm'\n\n/// This plugin is wrapping the [remark-gfm](https://github.com/remarkjs/remark-gfm).\nexport const remarkGFMPlugin = $remark(() => remarkGFM)\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { MilkdownPlugin } from '@milkdown/ctx'\nimport { autoInsertZeroSpaceInTablePlugin, columnResizingPlugin, remarkGFMPlugin, tableEditingPlugin } from '../plugin'\n\n/// @internal\nexport const plugins: MilkdownPlugin[] = [\n autoInsertZeroSpaceInTablePlugin,\n columnResizingPlugin,\n tableEditingPlugin,\n remarkGFMPlugin,\n]\n","/* Copyright 2021, Milkdown by Mirone. */\nimport type { MilkdownPlugin } from '@milkdown/ctx'\nimport { strikethroughAttr, strikethroughSchema } from '../mark'\nimport { extendListItemSchemaForTask, footnoteDefinitionSchema, footnoteReferenceSchema, tableCellSchema, tableHeaderSchema, tableRowSchema, tableSchema } from '../node'\n\n/// @internal\nexport const schema: MilkdownPlugin[] = [\n extendListItemSchemaForTask,\n\n tableSchema,\n tableRowSchema,\n tableHeaderSchema,\n tableCellSchema,\n\n footnoteDefinitionSchema,\n footnoteReferenceSchema,\n\n strikethroughAttr,\n strikethroughSchema,\n].flat()\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { toggleStrikethroughCommand } from '../mark'\nimport { addColAfterCommand, addColBeforeCommand, addRowAfterCommand, addRowBeforeCommand, breakTableCommand, deleteSelectedCellsCommand, goToNextTableCellCommand, goToPrevTableCellCommand, insertTableCommand, moveColCommand, moveRowCommand, selectColCommand, selectRowCommand, selectTableCommand, setAlignCommand } from '../node'\n\n/// @internal\nexport const commands = [\n goToNextTableCellCommand,\n goToPrevTableCellCommand,\n breakTableCommand,\n insertTableCommand,\n moveRowCommand,\n moveColCommand,\n selectRowCommand,\n selectColCommand,\n selectTableCommand,\n deleteSelectedCellsCommand,\n addRowBeforeCommand,\n addRowAfterCommand,\n addColBeforeCommand,\n addColAfterCommand,\n setAlignCommand,\n\n toggleStrikethroughCommand,\n]\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { commands, inputrules, keymap, plugins, schema } from './composed'\n\nexport * from './node'\nexport * from './mark'\nexport * from './composed'\n\n/// The GFM preset, includes all the plugins.\nexport const gfm = [schema, inputrules, keymap, plugins, commands].flat()\n"],"names":["strikethroughAttr","$markAttr","strikethroughSchema","$markSchema","ctx","value","mark","node","state","markType","toggleStrikethroughCommand","$command","toggleMark","strikethroughKeymap","$useKeymap","commands","commandsCtx","createTable","rowsCount","colsCount","cells","tableCellSchema","headerCells","tableHeaderSchema","rows","_","i","tableRowSchema","tableSchema","findTable","selection","findParentNode","getCellsInCol","columnIndex","table","map","TableMap","pos","start","x","getCellsInRow","rowIndex","getAllCellsInTable","nodePos","selectTable","tr","$firstCell","last","$lastCell","cloneTr","CellSelection","addRowWithAlignment","tableStart","row","rowPos","acc","col","headerCol","selectLine","type","index","isRowSelection","lastCell","createCellSelection","firstCell","selectRow","selectCol","transpose","array","column","convertArrayOfRowsToTableNode","tableNode","arrayOfNodes","rowsPM","rowCells","colIndex","cellPos","cell","newCell","convertTableNodeToArrayOfRows","seen","rect","moveRowInArrayOfRows","indexesOrigin","indexesTarget","directionOverride","direction","rowsExtracted","positionOffset","target","moveTableColumn","moveTableRow","getSelectionRangeInColumn","startIndex","endIndex","maybeEndIndex","indexes","maybeCells","firstSelectedColumnCells","firstRowCells","$anchor","headCell","columnCells","j","$head","getSelectionRangeInRow","firstSelectedRowCells","firstColumnCells","moveCol","origin","select","indexesOriginColumn","indexesTargetColumn","newTable","_tr","moveRow","indexesOriginRow","indexesTargetRow","originalSchema","tableNodes","dom","attrs","$nodeSchema","align","children","firstLine","_a","insertTableInputRule","$inputRule","InputRule","match","end","$start","_b","TextSelection","goToPrevTableCellCommand","goToNextCell","goToNextTableCellCommand","breakTableCommand","dispatch","isInTable","paragraphSchema","Selection","insertTableCommand","from","sel","moveRowCommand","to","result","moveColCommand","selectRowCommand","selectColCommand","selectTableCommand","deleteSelectedCellsCommand","isRow","isCol","deleteTable","deleteColumn","deleteRow","addColBeforeCommand","addColumnBefore","addColAfterCommand","addColumnAfter","addRowBeforeCommand","selectedRect","addRowAfterCommand","setAlignCommand","alignment","setCellAttr","tableKeymap","id","markdownId","footnoteDefinitionSchema","expectDomTypeError","label","footnoteReferenceSchema","extendListItemSchemaForTask","listItemSchema","prev","baseSchema","checked","listType","spread","wrapInTaskListInputRule","depth","finPos","keymap","inputrules","autoInsertZeroSpaceInTablePlugin","$prose","pluginKey","PluginKey","isParagraph","isEmptyParagraph","Plugin","view","$from","browser","columnResizingPlugin","columnResizing","tableEditingPlugin","tableEditing","remarkGFMPlugin","$remark","remarkGFM","plugins","schema","gfm"],"mappings":";;;;;;;;;;AAMa,MAAAA,IAAoBC,GAAU,gBAAgB,GAG9CC,IAAsBC,GAAY,kBAAkB,CAAQC,OAAA;AAAA,EACvE,WAAW;AAAA,EACX,UAAU;AAAA,IACR,EAAE,KAAK,MAAM;AAAA,IACb,EAAE,OAAO,mBAAmB,UAAU,CAAAC,MAAUA,MAAU,eAAyB;AAAA,EACrF;AAAA,EACA,OAAO,CAAQC,MAAA,CAAC,OAAOF,EAAI,IAAIJ,EAAkB,GAAG,EAAEM,CAAI,CAAC;AAAA,EAC3D,eAAe;AAAA,IACb,OAAO,CAAQC,MAAAA,EAAK,SAAS;AAAA,IAC7B,QAAQ,CAACC,GAAOD,GAAME,MAAa;AACjC,MAAAD,EAAM,SAASC,CAAQ,GACjBD,EAAA,KAAKD,EAAK,QAAQ,GACxBC,EAAM,UAAUC,CAAQ;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,OAAO,CAAAH,MAAQA,EAAK,KAAK,SAAS;AAAA,IAClC,QAAQ,CAACE,GAAOF,MAAS;AACjB,MAAAE,EAAA,SAASF,GAAM,QAAQ;AAAA,IAC/B;AAAA,EACF;AACF,EAAE,GAGWI,IAA6BC,EAAS,uBAAuB,MAAM,MAAMC,GAAWV,EAAoB,KAAK,CAAC,CAAC,GAI/GW,KAAsBC,EAAW,uBAAuB;AAAA,EACnE,qBAAqB;AAAA,IACnB,WAAW;AAAA,IACX,SAAS,CAACV,MAAQ;AACV,YAAAW,IAAWX,EAAI,IAAIY,CAAW;AACpC,aAAO,MAAMD,EAAS,KAAKL,EAA2B,GAAG;AAAA,IAC3D;AAAA,EACF;AACF,CAAC,GC1BYO,IAAc,CAACC,IAAY,GAAGC,IAAY,MAAY;AACjE,QAAMC,IAAQ,MAAMD,CAAS,EAC1B,KAAK,CAAC,EACN,IAAI,MAAME,EAAgB,OAAO,cAAgB,CAAA,GAE9CC,IAAc,MAAMH,CAAS,EAChC,KAAK,CAAC,EACN,IAAI,MAAMI,GAAkB,OAAO,cAAgB,CAAA,GAEhDC,IAAO,MAAMN,CAAS,EACzB,KAAK,CAAC,EACN,IAAI,CAACO,GAAGC,MAAMC,EAAe,KAAA,EAAO,OAAO,MAAMD,MAAM,IAAIJ,IAAcF,CAAK,CAAC;AAElF,SAAOQ,EAAY,KAAO,EAAA,OAAO,MAAMJ,CAAI;AAC7C,GAGaK,IAAY,CAACC,MACxBC,GAAe,CAAAxB,MAAQA,EAAK,KAAK,KAAK,cAAc,OAAO,EAAEuB,CAAS,GAG3DE,IAAgB,CAACC,GAAqBH,MAAgD;AAC3F,QAAAI,IAAQL,EAAUC,CAAS;AACjC,MAAI,CAACI;AACI;AACT,QAAMC,IAAMC,EAAS,IAAIF,EAAM,IAAI;AAC/B,MAAA,EAAAD,IAAc,KAAKA,KAAeE,EAAI;AAG1C,WAAOA,EACJ,YAAY,EAAE,MAAMF,GAAa,OAAOA,IAAc,GAAG,KAAK,GAAG,QAAQE,EAAI,OAAQ,CAAA,EACrF,IAAI,CAACE,MAAQ;AACZ,YAAM9B,IAAO2B,EAAM,KAAK,OAAOG,CAAG;AAClC,UAAI,CAAC9B;AACI;AACH,YAAA+B,IAAQD,IAAMH,EAAM;AACnB,aAAA;AAAA,QACL,KAAKI;AAAA,QACL,OAAOA,IAAQ;AAAA,QACf,MAAA/B;AAAA,MAAA;AAAA,IAEH,CAAA,EACA,OAAO,CAACgC,MAAoBA,KAAK,IAAI;AAC1C,GAGaC,IAAgB,CAACC,GAAkBX,MAAgD;AACxF,QAAAI,IAAQL,EAAUC,CAAS;AACjC,MAAI,CAACI;AACI;AACT,QAAMC,IAAMC,EAAS,IAAIF,EAAM,IAAI;AAC/B,MAAA,EAAAO,IAAW,KAAKA,KAAYN,EAAI;AAGpC,WAAOA,EACJ,YAAY,EAAE,MAAM,GAAG,OAAOA,EAAI,OAAO,KAAKM,GAAU,QAAQA,IAAW,EAAG,CAAA,EAC9E,IAAI,CAACJ,MAAQ;AACZ,YAAM9B,IAAO2B,EAAM,KAAK,OAAOG,CAAG;AAClC,UAAI,CAAC9B;AACI;AACH,YAAA+B,IAAQD,IAAMH,EAAM;AACnB,aAAA;AAAA,QACL,KAAKI;AAAA,QACL,OAAOA,IAAQ;AAAA,QACf,MAAA/B;AAAA,MAAA;AAAA,IAEH,CAAA,EACA,OAAO,CAACgC,MAAoBA,KAAK,IAAI;AAC1C,GAGaG,KAAqB,CAACZ,MAAyB;AACpD,QAAAI,IAAQL,EAAUC,CAAS;AACjC,MAAI,CAACI;AACH;AAEF,QAAMC,IAAMC,EAAS,IAAIF,EAAM,IAAI;AAO5B,SANOC,EAAI,YAAY;AAAA,IAC5B,MAAM;AAAA,IACN,OAAOA,EAAI;AAAA,IACX,KAAK;AAAA,IACL,QAAQA,EAAI;AAAA,EAAA,CACb,EACY,IAAI,CAACQ,MAAY;AAC5B,UAAMpC,IAAO2B,EAAM,KAAK,OAAOS,CAAO,GAChCN,IAAMM,IAAUT,EAAM;AAC5B,WAAO,EAAE,KAAAG,GAAK,OAAOA,IAAM,GAAG,MAAA9B,EAAK;AAAA,EAAA,CACpC;AACH,GAGaqC,KAAc,CAACC,MAAoB;AACxC,QAAAzB,IAAQsB,GAAmBG,EAAG,SAAS;AACzC,MAAAzB,KAASA,EAAM,IAAI;AACrB,UAAM0B,IAAaD,EAAG,IAAI,QAAQzB,EAAM,GAAG,GAAG,GACxC2B,IAAO3B,EAAMA,EAAM,SAAS;AAClC,QAAI2B,GAAM;AACR,YAAMC,IAAYH,EAAG,IAAI,QAAQE,EAAK,GAAG;AAClC,aAAAE,EAAQJ,EAAG,aAAa,IAAIK,EAAcF,GAAWF,CAAU,CAAC,CAAC;AAAA,IAC1E;AAAA,EACF;AACO,SAAAD;AACT;AAGO,SAASM,EAAoBN,GAAiB,EAAE,KAAAV,GAAK,YAAAiB,GAAY,OAAAlB,KAAoBmB,GAAa;AACjG,QAAAC,IAAS,MAAMD,CAAG,EACrB,KAAK,CAAC,EACN,OAAO,CAACE,GAAK9B,GAAGC,MACR6B,IAAMrB,EAAM,MAAMR,CAAC,EAAE,UAC3B0B,CAAU,GAEThC,IAAQ,MAAMe,EAAI,KAAK,EAC1B,KAAK,CAAC,EACN,IAAI,CAACV,GAAG+B,MAAQ;AACf,UAAMC,IAAYvB,EAAM,OAAOC,EAAI,IAAIqB,EAAc;AAC9C,WAAAnC,EAAgB,KAAO,EAAA,cAAc,EAAE,WAAWoC,KAAA,gBAAAA,EAAW,MAAM,UAAA,CAAW;AAAA,EAAA,CACtF;AAEA,SAAAZ,EAAA,OAAOS,GAAQ3B,EAAe,OAAO,OAAO,MAAMP,CAAK,CAAC,GACpDyB;AACT;AAGO,MAAMa,IAAa,CAACC,MAAwB,CAACC,MAAkB,CAACf,MAAoB;AACnF,QAAAX,IAAQL,EAAUgB,EAAG,SAAS,GAC9BgB,IAAiBF,MAAS;AAChC,MAAIzB,GAAO;AACT,UAAMC,IAAMC,EAAS,IAAIF,EAAM,IAAI;AAGnC,QAAI0B,KAAS,KAAKA,KAASC,IAAiB1B,EAAI,SAASA,EAAI,QAAQ;AACnE,YAAM2B,IAAW3B,EAAI;AAAA,QACnB0B,IAAiBD,IAAQzB,EAAI,SAAS;AAAA,QACtC0B,IAAiB1B,EAAI,QAAQ,IAAIyB;AAAA,QACjC1B,EAAM;AAAA,MAAA,GAEFc,IAAYH,EAAG,IAAI,QAAQX,EAAM,QAAQ4B,CAAQ,GAEjDC,IAAsBF,IAAiBX,EAAc,eAAeA,EAAc,cAElFc,IAAY7B,EAAI,WAAW0B,IAAiBD,IAAQ,GAAGC,IAAiB,IAAID,GAAO1B,EAAM,IAAI,GAC7FY,IAAaD,EAAG,IAAI,QAAQX,EAAM,QAAQ8B,CAAS;AACzD,aAAOf,EAAQJ,EAAG,aAAakB,EAAoBf,GAAWF,CAAU,CAAyB,CAAC;AAAA,IACpG;AAAA,EACF;AACO,SAAAD;AACT,GAIaoB,KAAYP,EAAW,KAAK,GAI5BQ,KAAYR,EAAW,KAAK,GAEnCS,IAAY,CAAIC,MACbA,EAAM,GAAI,IAAI,CAAC3C,GAAGC,MAChB0C,EAAM,IAAI,CAAUC,MAAAA,EAAO3C,EAAE,CACrC,GAGG4C,IAAgC,CAACC,GAAiBC,MAAoC;AAC1F,QAAMC,IAAS,CAAA,GACTtC,IAAMC,EAAS,IAAImC,CAAS;AAClC,WAAS9B,IAAW,GAAGA,IAAWN,EAAI,QAAQM,KAAY;AAClD,UAAAY,IAAMkB,EAAU,MAAM9B,CAAQ,GAC9BiC,IAAW,CAAA;AAEjB,aAASC,IAAW,GAAGA,IAAWxC,EAAI,OAAOwC,KAAY;AACnD,UAAA,CAACH,EAAa/B,GAAWkC;AAC3B;AAEF,YAAMC,IAAUzC,EAAI,IAAIM,IAAWN,EAAI,QAAQwC,IAEzCE,IAAOL,EAAa/B,GAAWkC,IAE/BG,IADUP,EAAU,OAAOK,CAAO,EAChB,KAAK;AAAA,QAC3B,OAAO,OAAO,IAAIC,EAAK,KAAK;AAAA,QAC5BA,EAAK;AAAA,QACLA,EAAK;AAAA,MAAA;AAEP,MAAAH,EAAS,KAAKI,CAAO;AAAA,IACvB;AAEO,IAAAL,EAAA,KAAKpB,EAAI,KAAK,cAAcA,EAAI,OAAOqB,GAAUrB,EAAI,KAAK,CAAC;AAAA,EACpE;AAQO,SANUkB,EAAU,KAAK;AAAA,IAC9BA,EAAU;AAAA,IACVE;AAAA,IACAF,EAAU;AAAA,EAAA;AAId,GAEMQ,KAAgC,CAACR,MAAoB;AACnD,QAAApC,IAAMC,EAAS,IAAImC,CAAS,GAC5B/C,IAA0B,CAAA;AAChC,WAASiB,IAAW,GAAGA,IAAWN,EAAI,QAAQM,KAAY;AACxD,UAAMiC,IAA4B,CAAA,GAC5BM,IAAgC,CAAA;AAEtC,aAASL,IAAW,GAAGA,IAAWxC,EAAI,OAAOwC,KAAY;AACvD,YAAMC,IAAUzC,EAAI,IAAIM,IAAWN,EAAI,QAAQwC,IACzCE,IAAON,EAAU,OAAOK,CAAO,GAC/BK,IAAO9C,EAAI,SAASyC,CAAO;AACjC,UAAII,EAAKJ,MAAYK,EAAK,QAAQxC,GAAU;AAC1C,QAAAiC,EAAS,KAAK,IAAI;AAClB;AAAA,MACF;AACA,MAAAM,EAAKJ,KAAW,IAEhBF,EAAS,KAAKG,CAAI;AAAA,IACpB;AAEA,IAAArD,EAAK,KAAKkD,CAAQ;AAAA,EACpB;AAEO,SAAAlD;AACT,GAEM0D,KAAuB,CAC3B1D,GACA2D,GACAC,GACAC,MACG;AACH,QAAMC,IAAYH,EAAc,KAAMC,EAAc,KAAM,KAAK,GAEzDG,IAAgB/D,EAAK,OAAO2D,EAAc,IAAKA,EAAc,MAAM,GACnEK,IAAiBD,EAAc,SAAS,MAAM,IAAI,IAAI;AACxD,MAAAE;AAEA,SAAAJ,MAAsB,MAAMC,MAAc,IAC5CG,IAASL,EAAc,KAAM,IAEtBC,MAAsB,KAAKC,MAAc,KAChDG,IAASL,EAAcA,EAAc,SAAS,KAAMI,IAAiB,IAGrEC,IACIH,MAAc,KACZF,EAAc,KACdA,EAAcA,EAAc,SAAS,KAAMI,GAGnDhE,EAAK,OAAOiE,GAAQ,GAAG,GAAGF,CAAa,GAChC/D;AACT,GAEMkE,KAAkB,CACtBxD,GACAiD,GACAC,GACAE,MACG;AACH,MAAI9D,IAAO2C,EAAUY,GAA8B7C,EAAM,IAAI,CAAC;AAE9D,SAAAV,IAAO0D,GAAqB1D,GAAM2D,GAAeC,GAAeE,CAAS,GACzE9D,IAAO2C,EAAU3C,CAAI,GAEd8C,EAA8BpC,EAAM,MAAMV,CAAI;AACvD,GAEMmE,KAAe,CACnBzD,GACAiD,GACAC,GACAE,MACG;AACC,MAAA9D,IAAOuD,GAA8B7C,EAAM,IAAI;AAEnD,SAAAV,IAAO0D,GAAqB1D,GAAM2D,GAAeC,GAAeE,CAAS,GAElEhB,EAA8BpC,EAAM,MAAMV,CAAI;AACvD,GAEMoE,IAA4B,CAAC3D,GAAqBY,MAAoB;AAC1E,MAAIgD,IAAa5D,GACb6D,IAAW7D;AAGf,WAASP,IAAIO,GAAaP,KAAK,GAAGA,KAAK;AACrC,UAAMN,IAAQY,EAAcN,GAAGmB,EAAG,SAAS;AAC3C,IAAIzB,KACIA,EAAA,QAAQ,CAACyD,MAAS;AACtB,YAAMkB,IAAgBlB,EAAK,KAAK,MAAM,UAAUnD,IAAI;AACpD,MAAIqE,KAAiBF,MACNA,IAAAnE,IAEXqE,IAAgBD,MACPA,IAAAC;AAAA,IAAA,CACd;AAAA,EAEL;AAEA,WAASrE,IAAIO,GAAaP,KAAKoE,GAAUpE,KAAK;AAC5C,UAAMN,IAAQY,EAAcN,GAAGmB,EAAG,SAAS;AAC3C,IAAIzB,KACIA,EAAA,QAAQ,CAACyD,MAAS;AACtB,YAAMkB,IAAgBlB,EAAK,KAAK,MAAM,UAAUnD,IAAI;AACpD,MAAImD,EAAK,KAAK,MAAM,UAAU,KAAKkB,IAAgBD,MACtCA,IAAAC;AAAA,IAAA,CACd;AAAA,EAEL;AAGA,QAAMC,IAAU,CAAA;AAChB,WAAStE,IAAImE,GAAYnE,KAAKoE,GAAUpE,KAAK;AAC3C,UAAMuE,IAAajE,EAAcN,GAAGmB,EAAG,SAAS;AAChD,IAAIoD,KAAcA,EAAW,UAC3BD,EAAQ,KAAKtE,CAAC;AAAA,EAClB;AACA,EAAAmE,IAAaG,EAAQ,IACVF,IAAAE,EAAQA,EAAQ,SAAS;AAEpC,QAAME,IAA2BlE,EAAc6D,GAAYhD,EAAG,SAAS,GACjEsD,IAAgB3D,EAAc,GAAGK,EAAG,SAAS,GAC7CuD,IAAUvD,EAAG,IAAI;AAAA,IACrBqD,EAAyBA,EAAyB,SAAS,GAAI;AAAA,EAAA;AAG7D,MAAAG;AACJ,WAAS3E,IAAIoE,GAAUpE,KAAKmE,GAAYnE,KAAK;AAC3C,UAAM4E,IAActE,EAAcN,GAAGmB,EAAG,SAAS;AAC7C,QAAAyD,KAAeA,EAAY,QAAQ;AACrC,eAASC,IAAIJ,EAAc,SAAS,GAAGI,KAAK,GAAGA;AAC7C,YAAIJ,EAAcI,GAAI,QAAQD,EAAY,GAAI,KAAK;AACjD,UAAAD,IAAWC,EAAY;AACvB;AAAA,QACF;AAEE,UAAAD;AACF;AAAA,IACJ;AAAA,EACF;AAEA,QAAMG,IAAQ3D,EAAG,IAAI,QAAQwD,EAAU,GAAG;AACnC,SAAA,EAAE,SAAAD,GAAS,OAAAI,GAAO,SAAAR;AAC3B,GAEMS,IAAyB,CAAChE,GAAkBI,MAAoB;AACpE,MAAIgD,IAAapD,GACbqD,IAAWrD;AAEf,WAASf,IAAIe,GAAUf,KAAK,GAAGA;AAEtB,IADOc,EAAcd,GAAGmB,EAAG,SAAS,EACpC,QAAQ,CAACgC,MAAS;AACvB,YAAMkB,IAAgBlB,EAAK,KAAK,MAAM,UAAUnD,IAAI;AACpD,MAAIqE,KAAiBF,MACNA,IAAAnE,IAEXqE,IAAgBD,MACPA,IAAAC;AAAA,IAAA,CACd;AAGH,WAASrE,IAAIe,GAAUf,KAAKoE,GAAUpE;AAE7B,IADOc,EAAcd,GAAGmB,EAAG,SAAS,EACpC,QAAQ,CAACgC,MAAS;AACvB,YAAMkB,IAAgBlB,EAAK,KAAK,MAAM,UAAUnD,IAAI;AACpD,MAAImD,EAAK,KAAK,MAAM,UAAU,KAAKkB,IAAgBD,MACtCA,IAAAC;AAAA,IAAA,CACd;AAIH,QAAMC,IAAU,CAAA;AAChB,WAAStE,IAAImE,GAAYnE,KAAKoE,GAAUpE,KAAK;AAC3C,UAAMuE,IAAazD,EAAcd,GAAGmB,EAAG,SAAS;AAChD,IAAIoD,KAAcA,EAAW,UAC3BD,EAAQ,KAAKtE,CAAC;AAAA,EAClB;AACA,EAAAmE,IAAaG,EAAQ,IACVF,IAAAE,EAAQA,EAAQ,SAAS;AAEpC,QAAMU,IAAwBlE,EAAcqD,GAAYhD,EAAG,SAAS,GAC9D8D,IAAmB3E,EAAc,GAAGa,EAAG,SAAS,GAChDuD,IAAUvD,EAAG,IAAI,QAAQ6D,EAAsBA,EAAsB,SAAS,GAAI,GAAG;AAEvF,MAAAL;AACJ,WAAS3E,IAAIoE,GAAUpE,KAAKmE,GAAYnE,KAAK;AAC3C,UAAMgD,IAAWlC,EAAcd,GAAGmB,EAAG,SAAS;AAC1C,QAAA6B,KAAYA,EAAS,QAAQ;AAC/B,eAAS6B,IAAII,EAAiB,SAAS,GAAGJ,KAAK,GAAGA;AAChD,YAAII,EAAiBJ,GAAI,QAAQ7B,EAAS,GAAI,KAAK;AACjD,UAAA2B,IAAW3B,EAAS;AACpB;AAAA,QACF;AAEE,UAAA2B;AACF;AAAA,IACJ;AAAA,EACF;AAEA,QAAMG,IAAQ3D,EAAG,IAAI,QAAQwD,EAAU,GAAG;AACnC,SAAA,EAAE,SAAAD,GAAS,OAAAI,GAAO,SAAAR;AAC3B;AAKO,SAASY,GAAQ/D,GAAiBgE,GAAgBpB,GAAgBqB,IAAS,IAAM;AAChF,QAAA5E,IAAQL,EAAUgB,EAAG,SAAS;AACpC,MAAI,CAACX;AACI,WAAAW;AAET,QAAM,EAAE,SAASkE,EAAA,IAAwBnB,EAA0BiB,GAAQhE,CAAE,GACvE,EAAE,SAASmE,EAAA,IAAwBpB,EAA0BH,GAAQ5C,CAAE;AAEzE,MAAAkE,EAAoB,SAAStB,CAAM;AAC9B,WAAA5C;AAET,QAAMoE,IAAWvB;AAAA,IACfxD;AAAA,IACA6E;AAAA,IACAC;AAAA,IACA;AAAA,EAAA,GAGIE,IAAMjE,EAAQJ,CAAE,EAAE;AAAA,IACtBX,EAAM;AAAA,IACNA,EAAM,MAAMA,EAAM,KAAK;AAAA,IACvB+E;AAAA,EAAA;AAGF,MAAI,CAACH;AACI,WAAAI;AAEH,QAAA/E,IAAMC,EAAS,IAAI6E,CAAQ,GAC3B3E,IAAQJ,EAAM,OACd0B,IAAQ6B,GACR3B,IAAW3B,EAAI,WAAWA,EAAI,SAAS,GAAGyB,GAAOqD,CAAQ,GACzDjE,IAAYkE,EAAI,IAAI,QAAQ5E,IAAQwB,CAAQ,GAE5CC,IAAsBb,EAAc,cAEpCc,IAAY7B,EAAI,WAAW,GAAGyB,GAAOqD,CAAQ,GAC7CnE,IAAaoE,EAAI,IAAI,QAAQ5E,IAAQ0B,CAAS;AAEpD,SAAOkD,EAAI,aAAanD,EAAoBf,GAAWF,CAAU,CAAC;AACpE;AAKO,SAASqE,GAAQtE,GAAiBgE,GAAgBpB,GAAgBqB,IAAS,IAAM;AAChF,QAAA5E,IAAQL,EAAUgB,EAAG,SAAS;AACpC,MAAI,CAACX;AACI,WAAAW;AAET,QAAM,EAAE,SAASuE,EAAA,IAAqBX,EAAuBI,GAAQhE,CAAE,GACjE,EAAE,SAASwE,EAAA,IAAqBZ,EAAuBhB,GAAQ5C,CAAE;AAEnE,MAAAuE,EAAiB,SAAS3B,CAAM;AAC3B,WAAA5C;AAET,QAAMoE,IAAWtB;AAAA,IACfzD;AAAA,IACAkF;AAAA,IACAC;AAAA,IACA;AAAA,EAAA,GAGIH,IAAMjE,EAAQJ,CAAE,EAAE;AAAA,IACtBX,EAAM;AAAA,IACNA,EAAM,MAAMA,EAAM,KAAK;AAAA,IACvB+E;AAAA,EAAA;AAGF,MAAI,CAACH;AACI,WAAAI;AAEH,QAAA/E,IAAMC,EAAS,IAAI6E,CAAQ,GAC3B3E,IAAQJ,EAAM,OACd0B,IAAQ6B,GACR3B,IAAW3B,EAAI,WAAWyB,GAAOzB,EAAI,QAAQ,GAAG8E,CAAQ,GACxDjE,IAAYkE,EAAI,IAAI,QAAQ5E,IAAQwB,CAAQ,GAE5CC,IAAsBb,EAAc,cAEpCc,IAAY7B,EAAI,WAAWyB,GAAO,GAAGqD,CAAQ,GAC7CnE,IAAaoE,EAAI,IAAI,QAAQ5E,IAAQ0B,CAAS;AAEpD,SAAOkD,EAAI,aAAanD,EAAoBf,GAAWF,CAAU,CAAC;AACpE;ACjfA,MAAMwE,IAAiBC,GAAW;AAAA,EAChC,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,gBAAgB;AAAA,IACd,WAAW;AAAA,MACT,SAAS;AAAA,MACT,YAAY,CAAAC,MAAQA,EAAoB,MAAM,aAAa;AAAA,MAC3D,YAAY,CAACnH,GAAOoH,MAAU;AACtB,QAAAA,EAAA,QAAQ,eAAepH,KAAS;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AACF,CAAC,GAGYuB,IAAc8F,EAAY,SAAS,OAAO;AAAA,EACrD,GAAGJ,EAAe;AAAA,EAClB,eAAe;AAAA,IACb,OAAO,CAAQ/G,MAAAA,EAAK,SAAS;AAAA,IAC7B,QAAQ,CAACC,GAAOD,GAAMoD,MAAS;AAC7B,YAAMgE,IAAQpH,EAAK,OACbqH,IAAYrH,EAAK,SAA4B,IAAI,CAACgC,GAAGb,OAAO;AAAA,QAChE,GAAGa;AAAA,QACH,OAAAoF;AAAA,QACA,UAAUjG,MAAM;AAAA,MAChB,EAAA;AACF,MAAAlB,EAAM,SAASmD,CAAI,GACnBnD,EAAM,KAAKoH,CAAQ,GACnBpH,EAAM,UAAU;AAAA,IAClB;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,OAAO,CAAAD,MAAQA,EAAK,KAAK,SAAS;AAAA,IAClC,QAAQ,CAACC,GAAOD,MAAS;;AACjB,YAAAsH,KAAYC,IAAAvH,EAAK,QAAQ,eAAb,gBAAAuH,EAAyB;AAC3C,UAAI,CAACD;AACH;AAEF,YAAMF,IAA2B,CAAA;AACvB,MAAAE,EAAA,QAAQ,CAAChD,MAAS;AACpB,QAAA8C,EAAA,KAAK9C,EAAK,MAAM,SAAS;AAAA,MAAA,CAChC,GACDrE,EAAM,SAAS,SAAS,QAAW,EAAE,OAAAmH,GAAO,GACtCnH,EAAA,KAAKD,EAAK,OAAO,GACvBC,EAAM,UAAU;AAAA,IAClB;AAAA,EACF;AAEF,EAAE,GAGWmB,IAAiB+F,EAAY,aAAa,OAAO;AAAA,EAC5D,GAAGJ,EAAe;AAAA,EAClB,eAAe;AAAA,IACb,OAAO,CAAQ/G,MAAAA,EAAK,SAAS;AAAA,IAC7B,QAAQ,CAACC,GAAOD,GAAMoD,MAAS;AAC7B,YAAMgE,IAAQpH,EAAK,OACbqH,IAAYrH,EAAK,SAA4B,IAAI,CAACgC,GAAGb,OAAO;AAAA,QAChE,GAAGa;AAAA,QACH,OAAOoF,EAAMjG;AAAA,QACb,UAAUnB,EAAK;AAAA,MACf,EAAA;AACF,MAAAC,EAAM,SAASmD,CAAI,GACnBnD,EAAM,KAAKoH,CAAQ,GACnBpH,EAAM,UAAU;AAAA,IAClB;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,OAAO,CAAAD,MAAQA,EAAK,KAAK,SAAS;AAAA,IAClC,QAAQ,CAACC,GAAOD,MAAS;AACvB,MAAAC,EAAM,SAAS,UAAU,GACnBA,EAAA,KAAKD,EAAK,OAAO,GACvBC,EAAM,UAAU;AAAA,IAClB;AAAA,EACF;AACF,EAAE,GAGWa,IAAkBqG,EAAY,cAAc,OAAO;AAAA,EAC9D,GAAGJ,EAAe;AAAA,EAClB,eAAe;AAAA,IACb,OAAO,CAAQ/G,MAAAA,EAAK,SAAS,eAAe,CAACA,EAAK;AAAA,IAClD,QAAQ,CAACC,GAAOD,GAAMoD,MAAS;AAC7B,YAAMgE,IAAQpH,EAAK;AACnB,MAAAC,EACG,SAASmD,GAAM,EAAE,WAAWgE,GAAO,EACnC,SAASnH,EAAM,OAAO,MAAM,SAAqB,EACjD,KAAKD,EAAK,QAAQ,EAClB,UAAA,EACA;IACL;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,OAAO,CAAAA,MAAQA,EAAK,KAAK,SAAS;AAAA,IAClC,QAAQ,CAACC,GAAOD,MAAS;AACvB,MAAAC,EAAM,SAAS,WAAW,EAAE,KAAKD,EAAK,OAAO,EAAE;IACjD;AAAA,EACF;AACF,EAAE,GAGWgB,KAAoBmG,EAAY,gBAAgB,OAAO;AAAA,EAClE,GAAGJ,EAAe;AAAA,EAClB,eAAe;AAAA,IACb,OAAO,CAAQ/G,MAAAA,EAAK,SAAS,eAAe,CAAC,CAACA,EAAK;AAAA,IACnD,QAAQ,CAACC,GAAOD,GAAMoD,MAAS;AAC7B,YAAMgE,IAAQpH,EAAK;AACnB,MAAAC,EAAM,SAASmD,GAAM,EAAE,WAAWgE,EAAO,CAAA,GACzCnH,EAAM,SAASA,EAAM,OAAO,MAAM,SAAqB,GACjDA,EAAA,KAAKD,EAAK,QAAQ,GACxBC,EAAM,UAAU,GAChBA,EAAM,UAAU;AAAA,IAClB;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,OAAO,CAAAD,MAAQA,EAAK,KAAK,SAAS;AAAA,IAClC,QAAQ,CAACC,GAAOD,MAAS;AACvB,MAAAC,EAAM,SAAS,WAAW,GACpBA,EAAA,KAAKD,EAAK,OAAO,GACvBC,EAAM,UAAU;AAAA,IAClB;AAAA,EACF;AACF,EAAE,GAIWuH,KAAuBC,EAAW,MAAM,IAAIC;AAAA,EACvD;AAAA,EAAsC,CAACzH,GAAO0H,GAAO5F,GAAO6F,MAAQ;;AAClE,UAAMC,IAAS5H,EAAM,IAAI,QAAQ8B,CAAK;AACtC,QAAI,CAAC8F,EAAO,KAAK,EAAE,EAAE,eAAeA,EAAO,MAAM,EAAE,GAAGA,EAAO,WAAW,EAAE,GAAGxG,EAAY,MAAM;AACtF,aAAA;AAET,UAAM2C,IAAYtD;AAAA,MAChB,QAAO6G,IAAAI,EAAM,WAAN,gBAAAJ,EAAc,GAAG;AAAA,MACxB,QAAOO,IAAAH,EAAM,WAAN,gBAAAG,EAAc,GAAG;AAAA,IAAA,GAEpBxF,IAAKrC,EAAM,GAAG,iBAAiB8B,GAAO6F,GAAK5D,CAAS,EAAE;AACrD,WAAA1B,EAAG,aAAayF,GAAc,OAAOzF,EAAG,KAAKP,IAAQ,CAAC,CAAC;AAAA,EAChE;AACF,CAAC,GAGYiG,KAA2B5H,EAAS,qBAAqB,MAAM,MAAM6H,EAAa,EAAE,CAAC,GAGrFC,KAA2B9H,EAAS,qBAAqB,MAAM,MAAM6H,EAAa,CAAC,CAAC,GAKpFE,KAAoB/H,EAAS,cAAc,MAAM,MAAM,CAACH,GAAOmI,MAAa;AACnF,MAAA,CAACC,EAAUpI,CAAK;AACX,WAAA;AAEH,QAAA,EAAE,OAAAgG,EAAM,IAAIhG,EAAM,WAClB6B,IAAMmE,EAAM,SACZ3D,IAAKrC,EAAM,GACd,YAAY6B,GAAKA,GAAKwG,EAAgB,OAAO,cAAgB,CAAA;AAE7D,SAAAhG,EAAA,aAAaiG,EAAU,KAAKjG,EAAG,IAAI,QAAQR,CAAG,GAAG,CAAC,CAAC,EAAE,eAAe,GACvEsG,KAAA,QAAAA,EAAW9F,IACJ;AACT,CAAC,GAKYkG,KAAqBpI,EAAS,eAAe,MAAM,CAAC,EAAE,KAAA0C,GAAK,KAAAG,EAAA,IAAwC,CAAO,MAAA,CAAChD,GAAOmI,MAAa;AACpI,QAAA,EAAE,WAAA7G,GAAW,IAAAe,EAAO,IAAArC,GACpB,EAAE,MAAAwI,EAAS,IAAAlH,GACXI,IAAQjB,EAAYoC,GAAKG,CAAG,GAC5B0D,IAAMrE,EAAG,qBAAqBX,CAAK,GACnC+G,IAAMH,EAAU,SAAS5B,EAAI,IAAI,QAAQ8B,CAAI,GAAG,GAAG,EAAI;AACzD,SAAAC,MACSN,KAAA,QAAAA,EAAAzB,EAAI,aAAa+B,CAAG,KAE1B;AACT,CAAC,GAIYC,KAAiBvI,EAAS,WAAW,MAAM,CAAC,EAAE,MAAAqI,GAAM,IAAAG,EAAA,IAAuC,CAAO,MAAA,CAAC3I,GAAOmI,MAAa;AAC5H,QAAA,EAAE,IAAA9F,EAAO,IAAArC,GACT4I,IAAST,KAAA,gBAAAA,EAAWxB,GAAQtE,GAAImG,KAAQ,GAAGG,KAAM,GAAG,EAAI;AAE9D,SAAO,QAAQC,CAAM;AACvB,CAAC,GAIYC,KAAiB1I,EAAS,WAAW,MAAM,CAAC,EAAE,MAAAqI,GAAM,IAAAG,EAAA,IAAuC,CAAO,MAAA,CAAC3I,GAAOmI,MAAa;AAC5H,QAAA,EAAE,IAAA9F,EAAO,IAAArC,GACT4I,IAAST,KAAA,gBAAAA,EAAW/B,GAAQ/D,GAAImG,KAAQ,GAAGG,KAAM,GAAG,EAAI;AAE9D,SAAO,QAAQC,CAAM;AACvB,CAAC,GAGYE,KAAmB3I,EAA8B,aAAa,MAAM,CAACiD,IAAQ,MAAM,CAACpD,GAAOmI,MAAa;AAC7G,QAAA,EAAE,IAAA9F,EAAO,IAAArC,GACT4I,IAAST,KAAA,gBAAAA,EAAW1E,GAAUL,CAAK,EAAEf,CAAE;AAE7C,SAAO,QAAQuG,CAAM;AACvB,CAAC,GAGYG,KAAmB5I,EAA8B,aAAa,MAAM,CAACiD,IAAQ,MAAM,CAACpD,GAAOmI,MAAa;AAC7G,QAAA,EAAE,IAAA9F,EAAO,IAAArC,GACT4I,IAAST,KAAA,gBAAAA,EAAWzE,GAAUN,CAAK,EAAEf,CAAE;AAE7C,SAAO,QAAQuG,CAAM;AACvB,CAAC,GAGYI,KAAqB7I,EAAS,eAAe,MAAM,MAAM,CAACH,GAAOmI,MAAa;AACnF,QAAA,EAAE,IAAA9F,EAAO,IAAArC,GACT4I,IAAST,KAAA,gBAAAA,EAAW/F,GAAYC,CAAE;AAExC,SAAO,QAAQuG,CAAM;AACvB,CAAC,GAKYK,KAA6B9I,EAAS,uBAAuB,MAAM,MAAM,CAACH,GAAOmI,MAAa;AACnG,QAAA,EAAE,WAAA7G,EAAc,IAAAtB;AACtB,MAAI,EAAEsB,aAAqBoB;AAClB,WAAA;AAEH,QAAAwG,IAAQ5H,EAAU,kBAClB6H,IAAQ7H,EAAU;AAExB,SAAI4H,KAASC,IACJC,GAAYpJ,GAAOmI,CAAQ,IAEhCgB,IACKE,GAAarJ,GAAOmI,CAAQ,IAG5BmB,GAAUtJ,GAAOmI,CAAQ;AACpC,CAAC,GAGYoB,KAAsBpJ,EAAS,gBAAgB,MAAM,MAAMqJ,EAAe,GAG1EC,KAAqBtJ,EAAS,eAAe,MAAM,MAAMuJ,EAAc,GAGvEC,KAAsBxJ,EAAS,gBAAgB,MAAM,MAAM,CAACH,GAAOmI,MAAa;AACvF,MAAA,CAACC,EAAUpI,CAAK;AACX,WAAA;AACT,MAAImI,GAAU;AACN,UAAA1D,IAAOmF,EAAa5J,CAAK;AAC/B,IAAAmI,EAASxF,EAAoB3C,EAAM,IAAIyE,GAAMA,EAAK,GAAG,CAAC;AAAA,EACxD;AACO,SAAA;AACT,CAAC,GAGYoF,KAAqB1J,EAAS,eAAe,MAAM,MAAM,CAACH,GAAOmI,MAAa;AACrF,MAAA,CAACC,EAAUpI,CAAK;AACX,WAAA;AACT,MAAImI,GAAU;AACN,UAAA1D,IAAOmF,EAAa5J,CAAK;AAC/B,IAAAmI,EAASxF,EAAoB3C,EAAM,IAAIyE,GAAMA,EAAK,MAAM,CAAC;AAAA,EAC3D;AACO,SAAA;AACT,CAAC,GAKYqF,KAAkB3J,EAAkD,YAAY,MAAM,CAAC4J,IAAY,WAAWC,GAAY,aAAaD,CAAS,CAAC,GAMjJE,KAAc3J,EAAW,eAAe;AAAA,EACnD,UAAU;AAAA,IACR,WAAW,CAAC,SAAS,KAAK;AAAA,IAC1B,SAAS,CAACV,MAAQ;AACV,YAAAW,IAAWX,EAAI,IAAIY,CAAW;AAEpC,aAAO,MAAMD,EAAS,KAAK0H,GAAyB,GAAG;AAAA,IACzD;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR,WAAW,CAAC,SAAS,WAAW;AAAA,IAChC,SAAS,CAACrI,MAAQ;AACV,YAAAW,IAAWX,EAAI,IAAIY,CAAW;AAEpC,aAAO,MAAMD,EAAS,KAAKwH,GAAyB,GAAG;AAAA,IACzD;AAAA,EACF;AAAA,EACA,WAAW;AAAA,IACT,WAAW,CAAC,WAAW;AAAA,IACvB,SAAS,CAACnI,MAAQ;AACV,YAAAW,IAAWX,EAAI,IAAIY,CAAW;AAEpC,aAAO,MAAMD,EAAS,KAAK2H,GAAkB,GAAG;AAAA,IAClD;AAAA,EACF;AACF,CAAC,GCtTKgC,IAAK,uBACLC,IAAa,sBAGNC,KAA2BlD,EAAY,uBAAuB,OAAO;AAAA,EAChF,OAAO;AAAA,EACP,SAAS;AAAA,EACT,UAAU;AAAA,EACV,OAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE,KAAK,iBAAiBgD;AAAAA,MACtB,UAAU,CAAClD,MAAQ;AACjB,YAAI,EAAEA,aAAe;AACnB,gBAAMqD,EAAmBrD,CAAG;AAEvB,eAAA;AAAA,UACL,OAAOA,EAAI,QAAQ;AAAA,QAAA;AAAA,MAEvB;AAAA,MACA,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA,EACA,OAAO,CAACjH,MAAS;AACT,UAAAuK,IAAQvK,EAAK,MAAM;AAElB,WAAA;AAAA,MACL;AAAA,MACA;AAAA,QAEE,cAAcuK;AAAA,QACd,aAAaJ;AAAAA,MACf;AAAA,MACA,CAAC,MAAMI,CAAK;AAAA,MACZ,CAAC,MAAM,CAAC;AAAA,IAAA;AAAA,EAEZ;AAAA,EACA,eAAe;AAAA,IACb,OAAO,CAAC,EAAE,MAAAnH,QAAWA,MAASgH;AAAA,IAC9B,QAAQ,CAACnK,GAAOD,GAAMoD,MAAS;AAC7B,MAAAnD,EACG,SAASmD,GAAM;AAAA,QACd,OAAOpD,EAAK;AAAA,MACb,CAAA,EACA,KAAKA,EAAK,QAAQ,EAClB,UAAU;AAAA,IACf;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,OAAO,CAAAA,MAAQA,EAAK,KAAK,SAASmK;AAAAA,IAClC,QAAQ,CAAClK,GAAOD,MAAS;AAEpB,MAAAC,EAAA,SAASmK,GAAY,QAAW;AAAA,QAC/B,OAAOpK,EAAK,MAAM;AAAA,QAClB,YAAYA,EAAK,MAAM;AAAA,MACxB,CAAA,EACA,KAAKA,EAAK,OAAO,EACjB,UAAU;AAAA,IACf;AAAA,EACF;AACF,EAAE,GChEImK,IAAK,sBAGEK,KAA0BrD,EAAY,sBAAsB,OAAO;AAAA,EAC9E,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO;AAAA,IACL,OAAO;AAAA,MACL,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,UAAU;AAAA,IACR;AAAA,MACE,KAAK,kBAAkBgD;AAAA,MACvB,UAAU,CAAClD,MAAQ;AACjB,YAAI,EAAEA,aAAe;AACnB,gBAAMqD,EAAmBrD,CAAG;AAEvB,eAAA;AAAA,UACL,OAAOA,EAAI,QAAQ;AAAA,QAAA;AAAA,MAEvB;AAAA,IACF;AAAA,EACF;AAAA,EACA,OAAO,CAACjH,MAAS;AACT,UAAAuK,IAAQvK,EAAK,MAAM;AAClB,WAAA;AAAA,MACL;AAAA,MACA;AAAA,QAEE,cAAcuK;AAAA,QACd,aAAaJ;AAAA,MACf;AAAA,MACAI;AAAA,IAAA;AAAA,EAEJ;AAAA,EACA,eAAe;AAAA,IACb,OAAO,CAAC,EAAE,MAAAnH,QAAWA,MAAS;AAAA,IAC9B,QAAQ,CAACnD,GAAOD,GAAMoD,MAAS;AAC7B,MAAAnD,EAAM,QAAQmD,GAAM;AAAA,QAClB,OAAOpD,EAAK;AAAA,MAAA,CACb;AAAA,IACH;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,OAAO,CAAAA,MAAQA,EAAK,KAAK,SAASmK;AAAA,IAClC,QAAQ,CAAClK,GAAOD,MAAS;AACjB,MAAAC,EAAA,QAAQ,qBAAqB,QAAW,QAAW;AAAA,QACvD,OAAOD,EAAK,MAAM;AAAA,QAClB,YAAYA,EAAK,MAAM;AAAA,MAAA,CACxB;AAAA,IACH;AAAA,EACF;AACF,EAAE,GCpDWyK,KAA8BC,GAAe,aAAa,CAACC,MAC/D,CAAC9K,MAAQ;AACR,QAAA+K,IAAaD,EAAK9K,CAAG;AACpB,SAAA;AAAA,IACL,GAAG+K;AAAA,IACH,OAAO;AAAA,MACL,GAAGA,EAAW;AAAA,MACd,SAAS;AAAA,QACP,SAAS;AAAA,MACX;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR;AAAA,QACE,KAAK;AAAA,QACL,UAAU,CAAC3D,MAAQ;AACjB,cAAI,EAAEA,aAAe;AACnB,kBAAMqD,EAAmBrD,CAAG;AAEvB,iBAAA;AAAA,YACL,OAAOA,EAAI,QAAQ;AAAA,YACnB,UAAUA,EAAI,QAAQ;AAAA,YACtB,QAAQA,EAAI,QAAQ;AAAA,YACpB,SAASA,EAAI,QAAQ,UAAUA,EAAI,QAAQ,YAAY,SAAS;AAAA,UAAA;AAAA,QAEpE;AAAA,MACF;AAAA,MACA,IAAG2D,KAAA,gBAAAA,EAAY,aAAY,CAAC;AAAA,IAC9B;AAAA,IACA,OAAO,CAAC5K,MACF4K,EAAW,SAAS5K,EAAK,MAAM,WAAW,OACrC4K,EAAW,MAAM5K,CAAI,IAEvB;AAAA,MACL;AAAA,MACA;AAAA,QACE,kBAAkB;AAAA,QAClB,cAAcA,EAAK,MAAM;AAAA,QACzB,kBAAkBA,EAAK,MAAM;AAAA,QAC7B,eAAeA,EAAK,MAAM;AAAA,QAC1B,gBAAgBA,EAAK,MAAM;AAAA,MAC7B;AAAA,MACA;AAAA,IAAA;AAAA,IAGJ,eAAe;AAAA,MACb,OAAO,CAAC,EAAE,MAAAoD,QAAWA,MAAS;AAAA,MAC9B,QAAQ,CAACnD,GAAOD,GAAMoD,MAAS;AACzB,YAAApD,EAAK,WAAW,MAAM;AACxB,UAAA4K,EAAW,cAAc,OAAO3K,GAAOD,GAAMoD,CAAI;AACjD;AAAA,QACF;AAEA,cAAMmH,IAAQvK,EAAK,SAAS,OAAO,GAAGA,EAAK,WAAW,KAChD6K,IAAU7K,EAAK,WAAW,OAAO,QAAQA,EAAK,OAAO,IAAI,MACzD8K,IAAW9K,EAAK,SAAS,OAAO,YAAY,UAC5C+K,IAAS/K,EAAK,UAAU,OAAO,GAAGA,EAAK,WAAW;AAExD,QAAAC,EAAM,SAASmD,GAAM,EAAE,OAAAmH,GAAO,UAAAO,GAAU,QAAAC,GAAQ,SAAAF,GAAS,GACnD5K,EAAA,KAAKD,EAAK,QAAQ,GACxBC,EAAM,UAAU;AAAA,MAClB;AAAA,IACF;AAAA,IACA,YAAY;AAAA,MACV,OAAO,CAAAD,MAAQA,EAAK,KAAK,SAAS;AAAA,MAClC,QAAQ,CAACC,GAAOD,MAAS;AACnB,YAAAA,EAAK,MAAM,WAAW,MAAM;AACnB,UAAA4K,EAAA,WAAW,OAAO3K,GAAOD,CAAI;AACxC;AAAA,QACF;AAEM,cAAAuK,IAAQvK,EAAK,MAAM,OACnB8K,IAAW9K,EAAK,MAAM,UACtB+K,IAAS/K,EAAK,MAAM,WAAW,QAC/B6K,IAAU7K,EAAK,MAAM;AAErB,QAAAC,EAAA,SAAS,YAAY,QAAW,EAAE,OAAAsK,GAAO,UAAAO,GAAU,QAAAC,GAAQ,SAAAF,GAAS,GACpE5K,EAAA,KAAKD,EAAK,OAAO,GACvBC,EAAM,UAAU;AAAA,MAClB;AAAA,IACF;AAAA,EAAA;AACF,CAEH,GAIY+K,KAA0BvD,EAAW,MACzC,IAAIC,EAAU,4BAA4B,CAACzH,GAAO0H,GAAO5F,GAAO6F,MAAQ;;AAC7E,QAAM9F,IAAM7B,EAAM,IAAI,QAAQ8B,CAAK;AACnC,MAAIkJ,IAAQ,GACRjL,IAAO8B,EAAI,KAAKmJ,CAAK;AACzB,SAAOjL,KAAQA,EAAK,KAAK,SAAS;AAChC,IAAAiL,KACOjL,IAAA8B,EAAI,KAAKmJ,CAAK;AAGvB,MAAI,CAACjL,KAAQA,EAAK,MAAM,WAAW;AAC1B,WAAA;AAET,QAAM6K,IAAU,UAAQtD,IAAAI,EAAM,WAAN,gBAAAJ,EAAc,aAAY,GAAG,GAE/C2D,IAASpJ,EAAI,OAAOmJ,CAAK,GACzB3I,IAAKrC,EAAM;AAEjB,SAAAqC,EAAG,YAAYP,GAAO6F,CAAG,EACtB,cAAcsD,GAAQ,QAAW,EAAE,GAAGlL,EAAK,OAAO,SAAA6K,EAAS,CAAA,GAEvDvI;AAAA,CACR,CACF,GC9GY6I,KAA2B;AAAA,EACtC7K;AAAA,EACA4J;AACF,EAAE,KAAK,GCJMkB,KAA+B;AAAA,EAC1C5D;AAAA,EACAwD;AACF,GCEaK,KAAmCC,EAAO,MAAM;AACrD,QAAAC,IAAY,IAAIC,GAAU,iCAAiC,GAE3DC,IAAc,CAACzL,MAAeA,EAAK,SAASsI,EAAgB,QAE5DoD,IAAmB,CAAC1L,MAAeyL,EAAYzL,CAAI,KAAKA,EAAK,aAAa;AAEhF,SAAO,IAAI2L,GAAO;AAAA,IAChB,KAAKJ;AAAA,IACL,OAAO;AAAA,MACL,iBAAiB;AAAA,QACf,iBAAiBK,GAAM;AACf,gBAAA,EAAE,OAAA3L,GAAO,UAAAmI,EAAa,IAAAwD,GACtB,EAAE,IAAAtJ,GAAI,WAAAf,EAAc,IAAAtB,GACpB,EAAE,OAAA4L,EAAU,IAAAtK;AACd,iBAAAuK,EAAQ,UAAUzD,EAAUpI,CAAK,KAAKsB,EAAU,SAASmK,EAAiBG,EAAM,MAAM,KACxFzD,EAAS9F,EAAG,WAAW,KAAUuJ,EAAM,MAAO,CAAA,CAAC,GAE1C;AAAA,QACT;AAAA,QACA,eAAeD,GAAM;AACb,gBAAA,EAAE,OAAA3L,GAAO,UAAAmI,EAAa,IAAAwD,GACtB,EAAE,IAAAtJ,GAAI,WAAAf,EAAc,IAAAtB,GACpB,EAAE,OAAA4L,EAAU,IAAAtK;AAElB,iBACEuK,EAAQ,UACHzD,EAAUpI,CAAK,KACfsB,EAAU,SACVkK,EAAYI,EAAM,MAAM,KACxBA,EAAM,OAAO,YAAY,WAAW,GAAQ,KAExCzD,EAAA9F,EAAG,OAAOuJ,EAAM,SAASA,EAAM,MAAA,IAAU,CAAC,CAAC,GAE/C;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAAA,EAAA,CACD;AACH,CAAC,GC5CYE,KAAuBT,EAAO,MAAMU,GAAe,CAAE,CAAA,CAAC,GCAtDC,KAAqBX,EAAO,MAAMY,IAAc,GCAhDC,KAAkBC,GAAQ,MAAMC,EAAS,GCAzCC,KAA4B;AAAA,EACvCjB;AAAA,EACAU;AAAA,EACAE;AAAA,EACAE;AACF,GCJaI,KAA2B;AAAA,EACtC9B;AAAA,EAEApJ;AAAA,EACAD;AAAA,EACAJ;AAAA,EACAF;AAAA,EAEAuJ;AAAA,EACAG;AAAA,EAEA/K;AAAA,EACAE;AACF,EAAE,KAAK,GCdMa,KAAW;AAAA,EACtB0H;AAAA,EACAF;AAAA,EACAG;AAAA,EACAK;AAAA,EACAG;AAAA,EACAG;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAC;AAAA,EACAU;AAAA,EACAE;AAAA,EACAN;AAAA,EACAE;AAAA,EACAK;AAAA,EAEA5J;AACF,GCdaqM,KAAM,CAACD,IAAQnB,IAAYD,IAAQmB,IAAS9L,EAAQ,EAAE,KAAK;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-list-item.d.ts","sourceRoot":"","sources":["../../src/node/task-list-item.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"task-list-item.d.ts","sourceRoot":"","sources":["../../src/node/task-list-item.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,2BAA2B,wCAkFtC,CAAA;AAIF,eAAO,MAAM,uBAAuB,sCAuBlC,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@milkdown/preset-gfm",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "7.
|
|
4
|
+
"version": "7.1.0",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
7
7
|
"type": "git",
|
|
@@ -31,15 +31,15 @@
|
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"remark-gfm": "^3.0.0",
|
|
33
33
|
"tslib": "^2.4.0",
|
|
34
|
-
"@milkdown/exception": "7.
|
|
35
|
-
"@milkdown/utils": "7.
|
|
34
|
+
"@milkdown/exception": "7.1.0",
|
|
35
|
+
"@milkdown/utils": "7.1.0"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
|
-
"@milkdown/core": "7.
|
|
39
|
-
"@milkdown/ctx": "7.
|
|
40
|
-
"@milkdown/preset-commonmark": "7.
|
|
41
|
-
"@milkdown/prose": "7.
|
|
42
|
-
"@milkdown/transformer": "7.
|
|
38
|
+
"@milkdown/core": "7.1.0",
|
|
39
|
+
"@milkdown/ctx": "7.1.0",
|
|
40
|
+
"@milkdown/preset-commonmark": "7.1.0",
|
|
41
|
+
"@milkdown/prose": "7.1.0",
|
|
42
|
+
"@milkdown/transformer": "7.1.0"
|
|
43
43
|
},
|
|
44
44
|
"nx": {
|
|
45
45
|
"targets": {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/* Copyright 2021, Milkdown by Mirone. */
|
|
2
2
|
import type { MilkdownPlugin } from '@milkdown/ctx'
|
|
3
|
-
import { insertTableInputRule } from '../node'
|
|
3
|
+
import { insertTableInputRule, wrapInTaskListInputRule } from '../node'
|
|
4
4
|
|
|
5
5
|
/// @internal
|
|
6
6
|
export const inputrules: MilkdownPlugin[] = [
|
|
7
7
|
insertTableInputRule,
|
|
8
|
+
wrapInTaskListInputRule,
|
|
8
9
|
]
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
/* Copyright 2021, Milkdown by Mirone. */
|
|
2
2
|
import { expectDomTypeError } from '@milkdown/exception'
|
|
3
3
|
import { listItemSchema } from '@milkdown/preset-commonmark'
|
|
4
|
+
import { InputRule } from '@milkdown/prose/inputrules'
|
|
5
|
+
import { $inputRule } from '@milkdown/utils'
|
|
4
6
|
|
|
5
7
|
/// This schema extends the [list item](/preset-commonmark#list-item) schema and add task list support for it.
|
|
6
8
|
export const extendListItemSchemaForTask = listItemSchema.extendSchema((prev) => {
|
|
@@ -86,3 +88,30 @@ export const extendListItemSchemaForTask = listItemSchema.extendSchema((prev) =>
|
|
|
86
88
|
}
|
|
87
89
|
}
|
|
88
90
|
})
|
|
91
|
+
|
|
92
|
+
/// Input rule for wrapping a block in task list node.
|
|
93
|
+
/// Users can type `[ ] ` or `[x] ` to wrap the block in task list node with checked status.
|
|
94
|
+
export const wrapInTaskListInputRule = $inputRule(() => {
|
|
95
|
+
return new InputRule(/^\[(?<checked>\s|x)\]\s$/, (state, match, start, end) => {
|
|
96
|
+
const pos = state.doc.resolve(start)
|
|
97
|
+
let depth = 0
|
|
98
|
+
let node = pos.node(depth)
|
|
99
|
+
while (node && node.type.name !== 'list_item') {
|
|
100
|
+
depth--
|
|
101
|
+
node = pos.node(depth)
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (!node || node.attrs.checked != null)
|
|
105
|
+
return null
|
|
106
|
+
|
|
107
|
+
const checked = Boolean(match.groups?.checked === 'x')
|
|
108
|
+
|
|
109
|
+
const finPos = pos.before(depth)
|
|
110
|
+
const tr = state.tr
|
|
111
|
+
|
|
112
|
+
tr.deleteRange(start, end)
|
|
113
|
+
.setNodeMarkup(finPos, undefined, { ...node.attrs, checked })
|
|
114
|
+
|
|
115
|
+
return tr
|
|
116
|
+
})
|
|
117
|
+
})
|