@milkdown/preset-gfm 6.0.0-next.0 → 6.0.1

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.
@@ -0,0 +1,7 @@
1
+ export declare const ModifyFootnoteDef: import("@milkdown/core").CmdKey<string>;
2
+ export declare const footnoteDefinition: import("@milkdown/utils/lib/types").WithExtend<string, import("@milkdown/utils").UnknownRecord, import("prosemirror-model").NodeType<any>, {
3
+ id: string;
4
+ schema: (ctx: import("@milkdown/core").Ctx) => import("@milkdown/core").NodeSchema;
5
+ view?: ((ctx: import("@milkdown/core").Ctx) => import("@milkdown/prose").NodeViewFactory) | undefined;
6
+ }>;
7
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/footnote/definition.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,iBAAiB,yCAA4C,CAAC;AAE3E,eAAO,MAAM,kBAAkB;;;;EAqK7B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './definition';
2
+ export * from './reference';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/footnote/index.ts"],"names":[],"mappings":"AACA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const ModifyFootnoteRef: import("@milkdown/core").CmdKey<string>;
2
+ export declare const footnoteReference: import("@milkdown/utils/lib/types").WithExtend<string, import("@milkdown/utils").UnknownRecord, import("prosemirror-model").NodeType<any>, {
3
+ id: string;
4
+ schema: (ctx: import("@milkdown/core").Ctx) => import("@milkdown/core").NodeSchema;
5
+ view?: ((ctx: import("@milkdown/core").Ctx) => import("@milkdown/prose").NodeViewFactory) | undefined;
6
+ }>;
7
+ //# sourceMappingURL=reference.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference.d.ts","sourceRoot":"","sources":["../../src/footnote/reference.ts"],"names":[],"mappings":"AAQA,eAAO,MAAM,iBAAiB,yCAA4C,CAAC;AAG3E,eAAO,MAAM,iBAAiB;;;;EA+J5B,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const getFootnoteRefId: (label: string) => string;
2
+ export declare const getFootnoteDefId: (label: string) => string;
3
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/footnote/utils.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB,UAAW,MAAM,WAA4B,CAAC;AAE3E,eAAO,MAAM,gBAAgB,UAAW,MAAM,WAA4B,CAAC"}
package/lib/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { AtomList } from '@milkdown/utils';
2
+ export * from './footnote';
2
3
  export * from './strike-through';
3
4
  export { SupportedKeys } from './supported-keys';
4
5
  export { BreakTable, createTable, InsertTable, NextCell, PrevCell, table, } from './table';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAcpD,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACH,UAAU,EAEV,WAAW,EACX,WAAW,EACX,QAAQ,EACR,QAAQ,EAER,KAAK,GACR,MAAM,SAAS,CAAC;AACjB,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACH,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,UAAU,EAEV,eAAe,EACf,iBAAiB,EAEjB,GAAG,EACH,EAAE,EACF,SAAS,EACT,OAAO,EACP,EAAE,EACF,KAAK,EAEL,eAAe,EACf,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,IAAI,EACJ,QAAQ,EACR,WAAW,EACX,UAAU,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,aAAa,EACb,MAAM,EACN,IAAI,EACJ,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GACpB,MAAM,6BAA6B,CAAC;AAErC,eAAO,MAAM,GAAG;;+CAOd,CAAC;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;CAOX,CAAC;AACX,oBAAY,QAAQ,GAAG,OAAO,QAAQ,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAW,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAgBpD,cAAc,YAAY,CAAC;AAC3B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EACH,UAAU,EAEV,WAAW,EACX,WAAW,EACX,QAAQ,EACR,QAAQ,EAER,KAAK,GACR,MAAM,SAAS,CAAC;AACjB,cAAc,kBAAkB,CAAC;AACjC,OAAO,EACH,UAAU,EACV,UAAU,EACV,SAAS,EACT,UAAU,EACV,UAAU,EAEV,eAAe,EACf,iBAAiB,EAEjB,GAAG,EACH,EAAE,EACF,SAAS,EACT,OAAO,EACP,EAAE,EACF,KAAK,EAEL,eAAe,EACf,QAAQ,EACR,WAAW,EACX,YAAY,EACZ,IAAI,EACJ,QAAQ,EACR,WAAW,EACX,UAAU,EACV,WAAW,EACX,SAAS,EACT,YAAY,EACZ,aAAa,EACb,MAAM,EACN,IAAI,EACJ,UAAU,EACV,gBAAgB,EAChB,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GACpB,MAAM,6BAA6B,CAAC;AAErC,eAAO,MAAM,GAAG;;+CASd,CAAC;AAEH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;CAOX,CAAC;AACX,oBAAY,QAAQ,GAAG,OAAO,QAAQ,CAAC"}
package/lib/index.es.js CHANGED
@@ -4,7 +4,7 @@ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
4
4
  var __getOwnPropSymbols = Object.getOwnPropertySymbols;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
6
  var __propIsEnum = Object.prototype.propertyIsEnumerable;
7
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
7
+ var __defNormalProp = (obj, key2, value) => key2 in obj ? __defProp(obj, key2, { enumerable: true, configurable: true, writable: true, value }) : obj[key2] = value;
8
8
  var __spreadValues = (a, b) => {
9
9
  for (var prop in b || (b = {}))
10
10
  if (__hasOwnProp.call(b, prop))
@@ -19,10 +19,10 @@ var __spreadValues = (a, b) => {
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
20
  import { SupportedKeys as SupportedKeys$2, commonmark, commands as commands$1 } from "@milkdown/preset-commonmark";
21
21
  export { InsertHardbreak, InsertHr, InsertImage, LiftListItem, ModifyImage, ModifyLink, SinkListItem, SplitListItem, ToggleBold, ToggleInlineCode, ToggleItalic, ToggleLink, TurnIntoCodeFence, TurnIntoHeading, TurnIntoText, WrapInBlockquote, WrapInBulletList, WrapInOrderedList, blockquote, bulletList, codeFence, codeInline, commonmark, commonmarkNodes, commonmarkPlugins, doc, em, hardbreak, heading, hr, image, link, listItem, orderedList, paragraph, strong, text } from "@milkdown/preset-commonmark";
22
- import { $prose, createPlugin, createShortcut, createMark, createNode, AtomList, $remark } from "@milkdown/utils";
22
+ import { $prose, createNode, createPlugin, createShortcut, createMark, AtomList, $remark } from "@milkdown/utils";
23
23
  import remarkGFM from "remark-gfm";
24
- import { inputRules, InputRule, isInTable, Selection, findParentNode, TableMap, CellSelection, cloneTr, tableNodeTypes, addColumnBefore, addColumnAfter, selectedRect, setCellAttr, deleteTable, deleteColumn, deleteRow, calculateNodePosition, Decoration, Plugin, PluginKey, DecorationSet, tableNodes, TextSelection, goToNextCell, columnResizing, tableEditing, markRule, toggleMark, wrappingInputRule, splitListItem, sinkListItem, liftListItem, wrapIn } from "@milkdown/prose";
25
- import { themeManagerCtx, ThemeIcon, getPalette, ThemeSize, ThemeBorder, ThemeShadow, createCmdKey, schemaCtx, createCmd, editorViewCtx } from "@milkdown/core";
24
+ import { inputRules, InputRule, PluginKey, NodeSelection, findSelectedNodeOfType, wrappingInputRule, Plugin, isInTable, Selection, findParentNode, TableMap, CellSelection, cloneTr, tableNodeTypes, addColumnBefore, addColumnAfter, selectedRect, setCellAttr, deleteTable, deleteColumn, deleteRow, calculateNodePosition, Decoration, DecorationSet, tableNodes, TextSelection, goToNextCell, columnResizing, tableEditing, markRule, toggleMark, splitListItem, sinkListItem, liftListItem, wrapIn } from "@milkdown/prose";
25
+ import { createCmdKey, editorViewCtx, createCmd, commandsCtx, themeManagerCtx, ThemeIcon, ThemeBorder, ThemeShadow, getPalette, ThemeSize, schemaCtx } from "@milkdown/core";
26
26
  const urlRegex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/;
27
27
  const proseUrlPlugin = () => inputRules({
28
28
  rules: [
@@ -36,6 +36,315 @@ const proseUrlPlugin = () => inputRules({
36
36
  ]
37
37
  });
38
38
  const urlPlugin = $prose(() => proseUrlPlugin());
39
+ const getFootnoteRefId = (label) => `footnote-ref-${label}`;
40
+ const getFootnoteDefId = (label) => `footnote-def-${label}`;
41
+ const key$1 = new PluginKey("MILKDOWN_PLUGIN_FOOTNOTE_DEF_INPUT");
42
+ const ModifyFootnoteDef = createCmdKey("ModifyFootnoteDef");
43
+ const footnoteDefinition = createNode((utils) => {
44
+ const id2 = "footnote_definition";
45
+ const markdownId = "footnoteDefinition";
46
+ return {
47
+ id: id2,
48
+ schema: (ctx) => ({
49
+ group: "block",
50
+ content: "block+",
51
+ defining: true,
52
+ attrs: {
53
+ label: {
54
+ default: ""
55
+ }
56
+ },
57
+ parseDOM: [
58
+ {
59
+ tag: `div[data-type="${id2}"]`,
60
+ getAttrs: (dom) => {
61
+ if (!(dom instanceof HTMLElement)) {
62
+ throw new Error();
63
+ }
64
+ return {
65
+ label: dom.dataset["label"]
66
+ };
67
+ }
68
+ }
69
+ ],
70
+ toDOM: (node) => {
71
+ const label = node.attrs["label"];
72
+ const className = utils.getClassName(node.attrs, "footnote-definition");
73
+ const dt = document.createElement("dt");
74
+ dt.textContent = `[${label}]:`;
75
+ dt.onclick = () => {
76
+ const view = ctx.get(editorViewCtx);
77
+ const selection = NodeSelection.create(view.state.doc, view.state.selection.from - 2);
78
+ view.dispatch(view.state.tr.setSelection(selection));
79
+ };
80
+ const a = document.createElement("a");
81
+ a.href = `#${getFootnoteRefId(label)}`;
82
+ a.contentEditable = "false";
83
+ a.textContent = "\u21A9";
84
+ a.onmousedown = (e) => {
85
+ e.preventDefault();
86
+ };
87
+ return [
88
+ "div",
89
+ {
90
+ class: className,
91
+ "data-label": label,
92
+ "data-type": id2,
93
+ id: getFootnoteDefId(label)
94
+ },
95
+ ["div", { class: "footnote-definition_content" }, dt, ["dd", 0]],
96
+ ["div", { class: "footnote-definition_anchor" }, a]
97
+ ];
98
+ },
99
+ parseMarkdown: {
100
+ match: ({ type }) => type === markdownId,
101
+ runner: (state, node, type) => {
102
+ state.openNode(type, {
103
+ label: node["label"]
104
+ }).next(node.children).closeNode();
105
+ }
106
+ },
107
+ toMarkdown: {
108
+ match: (node) => node.type.name === id2,
109
+ runner: (state, node) => {
110
+ state.openNode(markdownId, void 0, {
111
+ label: node.attrs["label"],
112
+ identifier: node.attrs["label"]
113
+ }).next(node.content).closeNode();
114
+ }
115
+ }
116
+ }),
117
+ commands: (nodeType) => [
118
+ createCmd(ModifyFootnoteDef, (label = "") => (state, dispatch) => {
119
+ const node = findSelectedNodeOfType(state.selection, nodeType);
120
+ if (!node)
121
+ return false;
122
+ const { tr } = state;
123
+ const _tr = tr.setNodeMarkup(node.pos, void 0, __spreadProps(__spreadValues({}, node.node.attrs), { label }));
124
+ dispatch == null ? void 0 : dispatch(_tr.setSelection(NodeSelection.create(_tr.doc, node.pos)));
125
+ return true;
126
+ })
127
+ ],
128
+ inputRules: (nodeType) => [
129
+ wrappingInputRule(/(?:\[\^)([^:]+)(?::)$/, nodeType, (match) => {
130
+ var _a;
131
+ const label = (_a = match[1]) != null ? _a : "footnote";
132
+ return {
133
+ label
134
+ };
135
+ }, () => false)
136
+ ],
137
+ prosePlugins: (type, ctx) => {
138
+ return [
139
+ new Plugin({
140
+ key: key$1,
141
+ view: (editorView) => {
142
+ const inputChipRenderer = utils.themeManager.get("input-chip", {
143
+ width: "12em",
144
+ placeholder: "Input Footnote Label",
145
+ onUpdate: (value) => {
146
+ ctx.get(commandsCtx).call(ModifyFootnoteDef, value);
147
+ },
148
+ isBindMode: true
149
+ });
150
+ if (!inputChipRenderer)
151
+ return {};
152
+ const shouldDisplay = (view) => {
153
+ return Boolean(type && findSelectedNodeOfType(view.state.selection, type));
154
+ };
155
+ const getCurrentLabel = (view) => {
156
+ const result = findSelectedNodeOfType(view.state.selection, type);
157
+ if (!result)
158
+ return;
159
+ const value = result.node.attrs["label"];
160
+ return value;
161
+ };
162
+ const renderByView = (view) => {
163
+ if (!view.editable) {
164
+ return;
165
+ }
166
+ const display = shouldDisplay(view);
167
+ if (display) {
168
+ inputChipRenderer.show(view);
169
+ inputChipRenderer.update(getCurrentLabel(view));
170
+ } else {
171
+ inputChipRenderer.hide();
172
+ }
173
+ };
174
+ inputChipRenderer.init(editorView);
175
+ renderByView(editorView);
176
+ return {
177
+ update: (view, prevState) => {
178
+ const isEqualSelection = (prevState == null ? void 0 : prevState.doc.eq(view.state.doc)) && prevState.selection.eq(view.state.selection);
179
+ if (isEqualSelection)
180
+ return;
181
+ renderByView(view);
182
+ },
183
+ destroy: () => {
184
+ inputChipRenderer.destroy();
185
+ }
186
+ };
187
+ }
188
+ })
189
+ ];
190
+ }
191
+ };
192
+ });
193
+ const ModifyFootnoteRef = createCmdKey("ModifyFootnoteRef");
194
+ const key = new PluginKey("MILKDOWN_PLUGIN_FOOTNOTE_REF_INPUT");
195
+ const footnoteReference = createNode((utils) => {
196
+ const id2 = "footnote_reference";
197
+ return {
198
+ id: id2,
199
+ schema: (ctx) => ({
200
+ group: "inline",
201
+ inline: true,
202
+ atom: true,
203
+ attrs: {
204
+ label: {
205
+ default: ""
206
+ }
207
+ },
208
+ parseDOM: [
209
+ {
210
+ tag: `sup[data-type="${id2}"]`,
211
+ getAttrs: (dom) => {
212
+ if (!(dom instanceof HTMLElement)) {
213
+ throw new Error();
214
+ }
215
+ return {
216
+ label: dom.dataset["label"]
217
+ };
218
+ }
219
+ }
220
+ ],
221
+ toDOM: (node) => {
222
+ const label = node.attrs["label"];
223
+ const a = document.createElement("a");
224
+ const href = `#${getFootnoteDefId(label)}`;
225
+ a.href = href;
226
+ a.textContent = `[${label}]`;
227
+ a.onclick = (e) => {
228
+ const view = ctx.get(editorViewCtx);
229
+ if (view.editable) {
230
+ e.preventDefault();
231
+ }
232
+ };
233
+ a.ondblclick = () => {
234
+ const view = ctx.get(editorViewCtx);
235
+ if (view.editable) {
236
+ window.location.href = href;
237
+ }
238
+ };
239
+ return [
240
+ "sup",
241
+ {
242
+ "data-label": label,
243
+ "data-type": id2,
244
+ id: getFootnoteRefId(label)
245
+ },
246
+ a
247
+ ];
248
+ },
249
+ parseMarkdown: {
250
+ match: ({ type }) => type === "footnoteReference",
251
+ runner: (state, node, type) => {
252
+ state.addNode(type, {
253
+ label: node["label"]
254
+ });
255
+ }
256
+ },
257
+ toMarkdown: {
258
+ match: (node) => node.type.name === id2,
259
+ runner: (state, node) => {
260
+ state.addNode("footnoteReference", void 0, void 0, {
261
+ label: node.attrs["label"],
262
+ identifier: node.attrs["label"]
263
+ });
264
+ }
265
+ }
266
+ }),
267
+ commands: (nodeType) => [
268
+ createCmd(ModifyFootnoteRef, (label = "") => (state, dispatch) => {
269
+ const node = findSelectedNodeOfType(state.selection, nodeType);
270
+ if (!node)
271
+ return false;
272
+ const { tr } = state;
273
+ const _tr = tr.setNodeMarkup(node.pos, void 0, __spreadProps(__spreadValues({}, node.node.attrs), { label }));
274
+ dispatch == null ? void 0 : dispatch(_tr.setSelection(NodeSelection.create(_tr.doc, node.pos)));
275
+ return true;
276
+ })
277
+ ],
278
+ inputRules: (nodeType) => [
279
+ new InputRule(/(?:\[\^)([^\]]+)(?:\])$/, (state, match, start, end) => {
280
+ const $start = state.doc.resolve(start);
281
+ const index = $start.index();
282
+ const $end = state.doc.resolve(end);
283
+ if (!$start.parent.canReplaceWith(index, $end.index(), nodeType)) {
284
+ return null;
285
+ }
286
+ const label = match[1];
287
+ return state.tr.replaceRangeWith(start, end, nodeType.create({
288
+ label
289
+ }));
290
+ })
291
+ ],
292
+ prosePlugins: (type, ctx) => {
293
+ const inputChipRenderer = utils.themeManager.get("input-chip", {
294
+ width: "12em",
295
+ placeholder: "Input Footnote Label",
296
+ onUpdate: (value) => {
297
+ ctx.get(commandsCtx).call(ModifyFootnoteRef, value);
298
+ },
299
+ isBindMode: true
300
+ });
301
+ if (!inputChipRenderer)
302
+ return [];
303
+ const shouldDisplay = (view) => {
304
+ return Boolean(type && findSelectedNodeOfType(view.state.selection, type));
305
+ };
306
+ const getCurrentLabel = (view) => {
307
+ const result = findSelectedNodeOfType(view.state.selection, type);
308
+ if (!result)
309
+ return;
310
+ const value = result.node.attrs["label"];
311
+ return value;
312
+ };
313
+ const renderByView = (view) => {
314
+ if (!view.editable) {
315
+ return;
316
+ }
317
+ const display = shouldDisplay(view);
318
+ if (display) {
319
+ inputChipRenderer.show(view);
320
+ inputChipRenderer.update(getCurrentLabel(view));
321
+ } else {
322
+ inputChipRenderer.hide();
323
+ }
324
+ };
325
+ return [
326
+ new Plugin({
327
+ key,
328
+ view: (editorView) => {
329
+ inputChipRenderer.init(editorView);
330
+ renderByView(editorView);
331
+ return {
332
+ update: (view, prevState) => {
333
+ const isEqualSelection = (prevState == null ? void 0 : prevState.doc.eq(view.state.doc)) && prevState.selection.eq(view.state.selection);
334
+ if (isEqualSelection)
335
+ return;
336
+ renderByView(view);
337
+ },
338
+ destroy: () => {
339
+ inputChipRenderer.destroy();
340
+ }
341
+ };
342
+ }
343
+ })
344
+ ];
345
+ }
346
+ };
347
+ });
39
348
  const exitTable = (node) => (state, dispatch) => {
40
349
  if (!isInTable(state)) {
41
350
  return false;
@@ -448,15 +757,6 @@ function createWidget(ctx, cell, pos, index = 0) {
448
757
  });
449
758
  }
450
759
  const operatorPlugin = (ctx, utils) => {
451
- const items = createActions(ctx);
452
- const tooltip = document.createElement("div");
453
- utils.themeManager.onFlush(() => {
454
- const style = utils.getStyle(injectStyle);
455
- if (style) {
456
- tooltip.classList.add(style);
457
- }
458
- });
459
- tooltip.classList.add("table-tooltip", "hide");
460
760
  return new Plugin({
461
761
  key: new PluginKey("MILKDOWN_TABLE_OP"),
462
762
  props: {
@@ -481,6 +781,15 @@ const operatorPlugin = (ctx, utils) => {
481
781
  },
482
782
  view: (editorView) => {
483
783
  var _a;
784
+ const items = Object.fromEntries(Object.entries(createActions(ctx)).filter(([, value]) => value.$ != null));
785
+ const tooltip = document.createElement("div");
786
+ utils.themeManager.onFlush(() => {
787
+ const style = utils.getStyle((emotion) => injectStyle(utils.themeManager, emotion));
788
+ if (style) {
789
+ tooltip.classList.add(style);
790
+ }
791
+ });
792
+ tooltip.classList.add("table-tooltip", "hide");
484
793
  Object.values(items).forEach(({ $ }) => tooltip.appendChild($));
485
794
  (_a = editorView.dom.parentNode) == null ? void 0 : _a.appendChild(tooltip);
486
795
  const listener = (e) => {
@@ -852,7 +1161,9 @@ const gfm = AtomList.create([
852
1161
  table(),
853
1162
  urlPlugin,
854
1163
  strikeThrough(),
855
- taskListItem()
1164
+ taskListItem(),
1165
+ footnoteReference(),
1166
+ footnoteDefinition()
856
1167
  ]);
857
1168
  const commands = __spreadProps(__spreadValues({}, commands$1), {
858
1169
  ToggleStrikeThrough,
@@ -861,5 +1172,5 @@ const commands = __spreadProps(__spreadValues({}, commands$1), {
861
1172
  LiftTaskListItem,
862
1173
  SplitTaskListItem
863
1174
  });
864
- export { BreakTable, InsertTable, LiftTaskListItem, NextCell, PrevCell, SinkTaskListItem, SplitTaskListItem, SupportedKeys, ToggleStrikeThrough, TurnIntoTaskList, commands, createTable, gfm, strikeThrough, table, taskListItem };
1175
+ export { BreakTable, InsertTable, LiftTaskListItem, ModifyFootnoteDef, ModifyFootnoteRef, NextCell, PrevCell, SinkTaskListItem, SplitTaskListItem, SupportedKeys, ToggleStrikeThrough, TurnIntoTaskList, commands, createTable, footnoteDefinition, footnoteReference, gfm, strikeThrough, table, taskListItem };
865
1176
  //# sourceMappingURL=index.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/auto-link.ts","../src/table/command.ts","../src/table/utils.ts","../src/table/operator-plugin/helper.ts","../src/table/operator-plugin/actions.ts","../src/table/operator-plugin/calc-pos.ts","../src/table/operator-plugin/constant.ts","../src/table/operator-plugin/style.ts","../src/table/operator-plugin/widget.ts","../src/table/operator-plugin/index.ts","../src/table/nodes/schema.ts","../src/table/nodes/index.ts","../src/supported-keys.ts","../src/strike-through.ts","../src/task-list-item.ts","../src/index.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nimport { InputRule, inputRules } from '@milkdown/prose';\nimport { $prose } from '@milkdown/utils';\n\nconst urlRegex = /https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/;\n\nconst proseUrlPlugin = () =>\n inputRules({\n rules: [\n new InputRule(urlRegex, (state, match, start, end) => {\n const { schema } = state;\n const [text] = match;\n if (!text) return null;\n\n return state.tr\n .replaceWith(start, end, schema.text(text))\n .addMark(start, text.length + start, schema.marks.link.create({ href: text }));\n }),\n ],\n });\n\nexport const urlPlugin = $prose(() => proseUrlPlugin());\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Command, isInTable, Node, NodeType, Selection } from '@milkdown/prose';\n\nexport const exitTable =\n (node: NodeType): Command =>\n (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.replaceWith(pos, pos, node.createAndFill() as Node);\n tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n dispatch?.(tr.scrollIntoView());\n return true;\n };\n","/* Copyright 2021, Milkdown by Mirone. */\nimport {\n CellSelection,\n cloneTr,\n findParentNode,\n Node as ProsemirrorNode,\n Schema,\n Selection,\n TableMap,\n tableNodeTypes,\n TableRect,\n Transaction,\n} from '@milkdown/prose';\n\nexport type CellPos = {\n pos: number;\n start: number;\n node: ProsemirrorNode;\n};\n\nexport const findTable = (selection: Selection) =>\n findParentNode((node) => node.type.spec['tableRole'] === 'table')(selection);\n\nexport const getCellsInColumn =\n (columnIndex: number) =>\n (selection: Selection): CellPos[] | undefined => {\n const table = findTable(selection);\n if (!table) return undefined;\n const map = TableMap.get(table.node);\n if (columnIndex < 0 || columnIndex >= map.width) {\n return undefined;\n }\n\n return map.cellsInRect({ left: columnIndex, right: columnIndex + 1, top: 0, bottom: map.height }).map((pos) => {\n const node = table.node.nodeAt(pos);\n if (!node) throw new Error();\n const start = pos + table.start;\n return {\n pos: start,\n start: start + 1,\n node,\n };\n });\n };\n\nexport const getCellsInRow =\n (rowIndex: number) =>\n (selection: Selection): CellPos[] | undefined => {\n const table = findTable(selection);\n if (!table) return undefined;\n const map = TableMap.get(table.node);\n if (rowIndex < 0 || rowIndex >= map.height) {\n return undefined;\n }\n\n return map.cellsInRect({ left: 0, right: map.width, top: rowIndex, bottom: rowIndex + 1 }).map((pos) => {\n const node = table.node.nodeAt(pos);\n if (!node) throw new Error();\n const start = pos + table.start;\n return {\n pos: start,\n start: start + 1,\n node,\n };\n });\n };\n\nexport const createTable = (schema: Schema, rowsCount = 3, colsCount = 3) => {\n const { cell: tableCell, header_cell: tableHeader, row: tableRow, table } = tableNodeTypes(schema);\n\n const cells = Array(colsCount)\n .fill(0)\n .map(() => tableCell.createAndFill(null) as ProsemirrorNode);\n\n const headerCells = Array(colsCount)\n .fill(0)\n .map(() => tableHeader.createAndFill(null) as ProsemirrorNode);\n\n const rows = Array(rowsCount)\n .fill(0)\n .map((_, i) => tableRow.create(null, i === 0 ? headerCells : cells));\n\n return table.create(null, rows);\n};\n\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\nexport const getCellsInTable = (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\nexport const selectTable = (tr: Transaction) => {\n const cells = getCellsInTable(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) as unknown as Selection));\n }\n }\n return tr;\n};\n\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 { cell: cellType, row: rowType } = tableNodeTypes(table.type.schema);\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 cellType.createAndFill({ alignment: headerCol?.attrs['alignment'] }) as ProsemirrorNode;\n });\n\n tr.insert(rowPos, rowType.create(null, cells));\n return tr;\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { CellSelection, EditorView, TableMap } from '@milkdown/prose';\n\nimport { Item } from './actions';\n\nexport const getCellSelection = (view: EditorView): CellSelection => view.state.selection as unknown as CellSelection;\n\nexport const isFirstRowSelected = (selection: CellSelection) => {\n const map = TableMap.get(selection.$anchorCell.node(-1));\n const start = selection.$anchorCell.start(-1);\n const cells = map.cellsInRect({\n left: 0,\n right: map.width,\n top: 0,\n bottom: 1,\n });\n const selectedCells = map.cellsInRect(\n map.rectBetween(selection.$anchorCell.pos - start, selection.$headCell.pos - start),\n );\n\n for (let i = 0, count = cells.length; i < count; i++) {\n if (selectedCells.indexOf(cells[i] as number) === -1) {\n return false;\n }\n }\n return true;\n};\n\nexport const calculateItem = (actions: Record<string, Item>, view: EditorView) => {\n Object.values(actions).forEach((item) => {\n const disable = item.disable?.(view);\n if (disable) {\n item.$.classList.add('hide');\n return;\n }\n item.$.classList.remove('hide');\n });\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Ctx, ThemeIcon, themeManagerCtx } from '@milkdown/core';\nimport {\n addColumnAfter,\n addColumnBefore,\n Command,\n deleteColumn,\n deleteRow,\n deleteTable,\n EditorView,\n isInTable,\n selectedRect,\n setCellAttr,\n} from '@milkdown/prose';\n\nimport { addRowWithAlignment } from '../utils';\nimport { getCellSelection, isFirstRowSelected } from './helper';\n\nexport type Item = {\n $: HTMLElement;\n command: (e: Event, view: EditorView) => Command;\n disable?: (view: EditorView) => boolean;\n};\n\nexport enum Action {\n AddColLeft,\n AddColRight,\n AddRowTop,\n AddRowBottom,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Delete,\n}\n\nexport const createActions: (ctx: Ctx) => Record<Action, Item> = (ctx) => ({\n [Action.AddColLeft]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'leftArrow')?.dom as HTMLElement,\n command: () => addColumnBefore,\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AddColRight]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'rightArrow')?.dom as HTMLElement,\n command: () => addColumnAfter,\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AddRowTop]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'upArrow')?.dom as HTMLElement,\n command: () => (state, dispatch) => {\n if (!isInTable(state)) return false;\n if (dispatch) {\n const rect = selectedRect(state);\n dispatch(addRowWithAlignment(state.tr, rect, rect.top));\n }\n return true;\n },\n disable: (view) =>\n !getCellSelection(view).isRowSelection() ||\n getCellSelection(view).$head.parent.type.name === 'table_header',\n },\n [Action.AddRowBottom]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'downArrow')?.dom as HTMLElement,\n command: () => (state, dispatch) => {\n if (!isInTable(state)) return false;\n if (dispatch) {\n const rect = selectedRect(state);\n dispatch(addRowWithAlignment(state.tr, rect, rect.bottom));\n }\n return true;\n },\n disable: (view) => !getCellSelection(view).isRowSelection(),\n },\n [Action.AlignLeft]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'alignLeft')?.dom as HTMLElement,\n command: () => setCellAttr('alignment', 'left'),\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AlignCenter]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'alignCenter')?.dom as HTMLElement,\n command: () => setCellAttr('alignment', 'center'),\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AlignRight]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'alignRight')?.dom as HTMLElement,\n command: () => setCellAttr('alignment', 'right'),\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.Delete]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'delete')?.dom as HTMLElement,\n command: (_, view) => {\n const selection = getCellSelection(view);\n const isCol = selection.isColSelection();\n const isRow = selection.isRowSelection();\n if (isCol && isRow) {\n return deleteTable;\n }\n\n if (isCol) {\n return deleteColumn;\n }\n\n return deleteRow;\n },\n disable: (view) => {\n const selection = getCellSelection(view);\n if (selection.isRowSelection()) {\n if (selection.isColSelection()) {\n return false;\n }\n return isFirstRowSelected(selection);\n }\n return false;\n },\n },\n});\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { calculateNodePosition, CellSelection, EditorView } from '@milkdown/prose';\n\nexport const calculatePosition = (view: EditorView, dom: HTMLElement) => {\n const { selection } = view.state as unknown as { selection: CellSelection };\n const isCol = selection.isColSelection();\n const isRow = selection.isRowSelection();\n\n calculateNodePosition(view, dom, (selected, target, parent) => {\n const $editor = dom.parentElement;\n if (!$editor) {\n throw new Error();\n }\n let left = !isRow\n ? selected.left - parent.left + (selected.width - target.width) / 2\n : selected.left - parent.left - target.width / 2 - 8;\n const top = selected.top - parent.top - target.height - (isCol ? 14 : 0) - 14 + $editor.scrollTop;\n\n if (left < 0) {\n left = 0;\n }\n return [top, left];\n });\n};\n","/* Copyright 2021, Milkdown by Mirone. */\n\nexport enum ToolTipPos {\n Left = 'Left',\n Top = 'Top',\n Point = 'Point',\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Emotion, getPalette, ThemeBorder, ThemeManager, ThemeShadow, ThemeSize } from '@milkdown/core';\n\nexport const injectStyle = (themeManager: ThemeManager, { css, injectGlobal }: Emotion) => {\n const palette = getPalette(themeManager);\n const radius = themeManager.get(ThemeSize, 'radius');\n const lineWidth = themeManager.get(ThemeSize, 'lineWidth');\n\n injectGlobal`\n .milkdown {\n .tableWrapper {\n table {\n width: calc(100% - 2em) !important;\n margin: 1em 0 1em 1em !important;\n\n .milkdown-cell-left,\n .milkdown-cell-point,\n .milkdown-cell-top {\n position: absolute;\n\n &::after {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n display: block;\n transition: all 0.2s ease-in-out;\n background: ${palette('secondary', 0.12)};\n content: '';\n }\n\n &:hover::after {\n background: ${palette('secondary', 0.38)};\n }\n }\n\n .milkdown-cell-left {\n left: calc(-6px - 0.5em);\n top: 0;\n bottom: 0;\n width: 0.5em;\n }\n\n .milkdown-cell-top {\n left: 0;\n right: 0;\n top: calc(-6px - 0.5em);\n height: 0.5em;\n }\n\n .milkdown-cell-point {\n left: calc(-2px - 1em);\n top: calc(-2px - 1em);\n width: 1em;\n height: 1em;\n\n .icon {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n }\n }\n }\n }\n }\n `;\n\n return css`\n display: inline-flex;\n cursor: pointer;\n z-index: 2;\n\n justify-content: space-evenly;\n\n position: absolute;\n\n border-radius: ${radius};\n\n ${themeManager.get(ThemeBorder, undefined)};\n ${themeManager.get(ThemeShadow, undefined)};\n\n overflow: hidden;\n background: ${palette('surface')};\n\n .icon {\n position: relative;\n color: ${palette('solid', 0.87)};\n\n width: 2em;\n line-height: 2em;\n text-align: center;\n transition: all 0.4s ease-in-out;\n\n &:hover {\n background-color: ${palette('secondary', 0.12)};\n }\n\n &.active {\n color: ${palette('primary')};\n }\n\n &:not(:last-child)::after {\n content: '';\n position: absolute;\n right: 0;\n top: 0;\n width: ${lineWidth};\n bottom: 0;\n background: ${palette('line')};\n }\n }\n\n &.hide,\n .hide {\n display: none;\n }\n `;\n};\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { Ctx, ThemeIcon, themeManagerCtx } from '@milkdown/core';\nimport { Decoration, WidgetDecorationSpec } from '@milkdown/prose';\n\nimport { CellPos, selectLine, selectTable } from '../utils';\nimport { ToolTipPos } from './constant';\n\nconst calculateClassName = (pos: ToolTipPos) => {\n switch (pos) {\n case ToolTipPos.Left: {\n return 'milkdown-cell-left';\n }\n case ToolTipPos.Top: {\n return 'milkdown-cell-top';\n }\n case ToolTipPos.Point:\n default: {\n return 'milkdown-cell-point';\n }\n }\n};\n\nexport function createWidget(ctx: Ctx, cell: CellPos, pos: ToolTipPos.Point): Decoration<WidgetDecorationSpec>;\nexport function createWidget(\n ctx: Ctx,\n cell: CellPos,\n pos: ToolTipPos.Left,\n index: number,\n): Decoration<WidgetDecorationSpec>;\nexport function createWidget(\n ctx: Ctx,\n cell: CellPos,\n pos: ToolTipPos.Top,\n index: number,\n): Decoration<WidgetDecorationSpec>;\nexport function createWidget(ctx: Ctx, cell: CellPos, pos: ToolTipPos, index = 0) {\n return Decoration.widget(cell.pos + 1, (view) => {\n const div = document.createElement('div');\n div.classList.add(calculateClassName(pos));\n if (pos === ToolTipPos.Point) {\n div.appendChild(ctx.get(themeManagerCtx).get(ThemeIcon, 'select')?.dom as HTMLElement);\n }\n div.addEventListener('mousedown', (e) => {\n if (!view) return;\n\n e.preventDefault();\n switch (pos) {\n case ToolTipPos.Point: {\n view.dispatch(selectTable(view.state.tr));\n return;\n }\n case ToolTipPos.Left: {\n view.dispatch(selectLine('row')(index)(view.state.tr));\n return;\n }\n case ToolTipPos.Top: {\n view.dispatch(selectLine('col')(index)(view.state.tr));\n return;\n }\n }\n });\n return div;\n });\n}\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { Ctx } from '@milkdown/core';\nimport { CellSelection, Decoration, DecorationSet, Plugin, PluginKey } from '@milkdown/prose';\nimport { Utils } from '@milkdown/utils';\n\nimport { CellPos, getCellsInColumn, getCellsInRow } from '../utils';\nimport { createActions } from './actions';\nimport { calculatePosition } from './calc-pos';\nimport { ToolTipPos } from './constant';\nimport { calculateItem } from './helper';\nimport { injectStyle } from './style';\nimport { createWidget } from './widget';\n\nexport const key = 'MILKDOWN_PLUGIN_TABLE';\n\nexport const operatorPlugin = (ctx: Ctx, utils: Utils) => {\n const items = createActions(ctx);\n const tooltip = document.createElement('div');\n utils.themeManager.onFlush(() => {\n const style = utils.getStyle(injectStyle);\n if (style) {\n tooltip.classList.add(style);\n }\n });\n tooltip.classList.add('table-tooltip', 'hide');\n\n return new Plugin({\n key: new PluginKey('MILKDOWN_TABLE_OP'),\n props: {\n decorations: (state) => {\n const decorations: Decoration[] = [];\n const leftCells = getCellsInColumn(0)(state.selection);\n if (!leftCells) return null;\n const topCells = getCellsInRow(0)(state.selection);\n if (!topCells) return null;\n\n const [topLeft] = leftCells;\n\n decorations.push(createWidget(ctx, topLeft as CellPos, ToolTipPos.Point));\n leftCells.forEach((cell, i) => {\n decorations.push(createWidget(ctx, cell, ToolTipPos.Left, i));\n });\n topCells.forEach((cell, i) => {\n decorations.push(createWidget(ctx, cell, ToolTipPos.Top, i));\n });\n\n return DecorationSet.create(state.doc, decorations);\n },\n },\n view: (editorView) => {\n Object.values(items).forEach(({ $ }) => tooltip.appendChild($));\n editorView.dom.parentNode?.appendChild(tooltip);\n\n const listener = (e: Event) => {\n if (!editorView) return;\n e.stopPropagation();\n e.preventDefault();\n Object.values(items).forEach(({ $, command }) => {\n if ($.contains(e.target as Element)) {\n command(e, editorView)(editorView.state, editorView.dispatch, editorView);\n }\n });\n };\n\n const hide = () => {\n tooltip.classList.add('hide');\n };\n\n tooltip.addEventListener('mousedown', listener);\n\n return {\n update: (view, prevState) => {\n const state = view.state;\n\n if (prevState?.doc.eq(state.doc) && prevState.selection.eq(state.selection)) return;\n\n const isCellSelection = state.selection instanceof CellSelection;\n\n if (!isCellSelection || !view.editable) {\n hide();\n return;\n }\n\n calculateItem(items, view);\n if (Object.values(items).every(({ $ }) => $.classList.contains('hide'))) {\n hide();\n return;\n }\n tooltip.classList.remove('hide');\n calculatePosition(view, tooltip);\n },\n destroy: () => {\n tooltip.removeEventListener('mousedown', listener);\n tooltip.remove();\n },\n };\n },\n });\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { tableNodes as tableNodesSpecCreator } from '@milkdown/prose';\n\nexport const schema = tableNodesSpecCreator({\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","/* Copyright 2021, Milkdown by Mirone. */\nimport { createCmd, createCmdKey, MarkdownNode, schemaCtx } from '@milkdown/core';\nimport {\n columnResizing,\n goToNextCell,\n InputRule,\n NodeType,\n Selection,\n tableEditing,\n TextSelection,\n} from '@milkdown/prose';\nimport { createPlugin, createShortcut } from '@milkdown/utils';\n\nimport { exitTable } from '../command';\nimport { operatorPlugin } from '../operator-plugin';\nimport { createTable } from '../utils';\nimport { schema } from './schema';\n\nexport const SupportedKeys = {\n NextCell: 'NextCell',\n PrevCell: 'PrevCell',\n ExitTable: 'ExitTable',\n} as const;\nexport type SupportedKeys = typeof SupportedKeys;\n\ntype Keys = keyof SupportedKeys;\n\nexport const PrevCell = createCmdKey('PrevCell');\nexport const NextCell = createCmdKey('NextCell');\nexport const BreakTable = createCmdKey('BreakTable');\nexport const InsertTable = createCmdKey('InsertTable');\n\nexport const table = createPlugin<Keys, Record<string, unknown>, keyof typeof schema>((utils) => {\n return {\n schema: () => ({\n node: {\n table: {\n ...schema.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) 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 table_row: {\n ...schema.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 table_cell: {\n ...schema.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 table_header: {\n ...schema.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 }),\n inputRules: (nodeType, ctx) => [\n new InputRule(/^\\|\\|\\s$/, (state, _match, start, end) => {\n const $start = state.doc.resolve(start);\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), nodeType.table))\n return null;\n\n const tableNode = createTable(ctx.get(schemaCtx));\n const tr = state.tr.replaceRangeWith(start, end, tableNode).scrollIntoView();\n return tr.setSelection(TextSelection.create(tr.doc, start + 3));\n }),\n ],\n commands: (_, ctx) => [\n createCmd(PrevCell, () => goToNextCell(-1)),\n createCmd(NextCell, () => goToNextCell(1)),\n createCmd(BreakTable, () => exitTable(ctx.get(schemaCtx).nodes['paragraph'] as NodeType)),\n createCmd(InsertTable, () => (state, dispatch) => {\n const { selection, tr } = state;\n const { from } = selection;\n const table = createTable(ctx.get(schemaCtx));\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 shortcuts: {\n [SupportedKeys.NextCell]: createShortcut(NextCell, 'Mod-]'),\n [SupportedKeys.PrevCell]: createShortcut(PrevCell, 'Mod-['),\n [SupportedKeys.ExitTable]: createShortcut(BreakTable, 'Mod-Enter'),\n },\n prosePlugins: (_, ctx) => {\n return [operatorPlugin(ctx, utils), columnResizing({}), tableEditing()];\n },\n };\n});\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { SupportedKeys as CommonmarkKeys } from '@milkdown/preset-commonmark';\n\nimport { SupportedKeys as TableKeys } from './table';\n\nexport const SupportedKeys = {\n ...CommonmarkKeys,\n ...TableKeys,\n StrikeThrough: 'StrikeThrough',\n TaskList: 'TaskList',\n} as const;\nexport type SupportedKeys = typeof SupportedKeys;\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { createCmd, createCmdKey } from '@milkdown/core';\nimport { markRule, toggleMark } from '@milkdown/prose';\nimport { createMark, createShortcut } from '@milkdown/utils';\n\nimport { SupportedKeys } from './supported-keys';\n\ntype Keys = SupportedKeys['StrikeThrough'];\n\nexport const ToggleStrikeThrough = createCmdKey('ToggleStrikeThrough');\n\nconst id = 'strike_through';\nexport const strikeThrough = createMark<Keys>((utils) => {\n return {\n id,\n schema: () => ({\n parseDOM: [\n { tag: 'del' },\n { style: 'text-decoration', getAttrs: (value) => (value === 'line-through') as false },\n ],\n toDOM: (mark) => ['del', { class: utils.getClassName(mark.attrs, 'strike-through') }],\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 === id,\n runner: (state, mark) => {\n state.withMark(mark, 'delete');\n },\n },\n }),\n inputRules: (markType) => [\n markRule(/(?:~~)([^~]+)(?:~~)$/, markType),\n markRule(/(?:^|[^~])(~([^~]+)~)$/, markType),\n ],\n commands: (markType) => [createCmd(ToggleStrikeThrough, () => toggleMark(markType))],\n shortcuts: {\n [SupportedKeys.StrikeThrough]: createShortcut(ToggleStrikeThrough, 'Mod-Alt-x'),\n },\n };\n});\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { createCmd, createCmdKey, editorViewCtx, ThemeTaskListItemType } from '@milkdown/core';\nimport { liftListItem, sinkListItem, splitListItem, wrapIn, wrappingInputRule } from '@milkdown/prose';\nimport { createNode, createShortcut } from '@milkdown/utils';\n\nimport { SupportedKeys } from './supported-keys';\n\ntype Keys = Extract<keyof SupportedKeys, 'SinkListItem' | 'LiftListItem' | 'NextListItem' | 'TaskList'>;\n\nexport const SplitTaskListItem = createCmdKey('SplitTaskListItem');\nexport const SinkTaskListItem = createCmdKey('SinkTaskListItem');\nexport const LiftTaskListItem = createCmdKey('LiftTaskListItem');\nexport const TurnIntoTaskList = createCmdKey('TurnIntoTaskList');\n\nexport const taskListItem = createNode<Keys>((utils) => {\n const id = 'task_list_item';\n\n return {\n id,\n schema: (ctx) => ({\n group: 'listItem',\n content: 'paragraph block*',\n defining: true,\n priority: 60,\n attrs: {\n checked: {\n default: false,\n },\n },\n parseDOM: [\n {\n tag: 'li[data-type=\"task-item\"]',\n getAttrs: (dom) => {\n if (!(dom instanceof HTMLElement)) {\n throw new Error();\n }\n return { checked: dom.dataset['checked'] === 'true' };\n },\n },\n ],\n toDOM: (node) => {\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = node.attrs['checked'];\n checkbox.className = utils.getClassName(node.attrs, 'task-list-item_checkbox');\n checkbox.onchange = (event) => {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) return;\n const view = ctx.get(editorViewCtx);\n\n if (!view.editable) {\n checkbox.checked = !checkbox.checked;\n\n return;\n }\n\n const { top, left } = target.getBoundingClientRect();\n const result = view.posAtCoords({ top, left });\n if (!result) return;\n\n const { tr } = view.state;\n\n view.dispatch(\n tr.setNodeMarkup(result.inside, undefined, {\n checked: target.checked,\n }),\n );\n };\n return [\n 'li',\n {\n 'data-type': 'task-item',\n 'data-checked': node.attrs['checked'] ? 'true' : 'false',\n class: utils.getClassName(node.attrs, 'task-list-item'),\n },\n checkbox,\n ['span', { class: utils.getClassName(node.attrs, 'task-list-item_body') }, 0],\n ];\n },\n parseMarkdown: {\n match: ({ type, checked }) => {\n return type === 'listItem' && checked !== null;\n },\n runner: (state, node, type) => {\n state.openNode(type, { checked: node['checked'] as boolean });\n state.next(node.children);\n state.closeNode();\n },\n },\n toMarkdown: {\n match: (node) => node.type.name === id,\n runner: (state, node) => {\n state.openNode('listItem', undefined, { checked: node.attrs['checked'] });\n state.next(node.content);\n state.closeNode();\n },\n },\n }),\n inputRules: (nodeType) => [\n wrappingInputRule(/^\\s*(\\[([ |x])\\])\\s$/, nodeType, (match) => ({\n checked: match[match.length - 1] === 'x',\n })),\n ],\n commands: (nodeType) => [\n createCmd(SplitTaskListItem, () => splitListItem(nodeType)),\n createCmd(SinkTaskListItem, () => sinkListItem(nodeType)),\n createCmd(LiftTaskListItem, () => liftListItem(nodeType)),\n createCmd(TurnIntoTaskList, () => wrapIn(nodeType)),\n ],\n shortcuts: {\n [SupportedKeys.NextListItem]: createShortcut(SplitTaskListItem, 'Enter'),\n [SupportedKeys.SinkListItem]: createShortcut(SinkTaskListItem, 'Mod-]'),\n [SupportedKeys.LiftListItem]: createShortcut(LiftTaskListItem, 'Mod-['),\n [SupportedKeys.TaskList]: createShortcut(TurnIntoTaskList, 'Mod-Alt-9'),\n },\n view: () => (node, view, getPos) => {\n let currNode = node;\n\n const renderer = utils.themeManager.get<ThemeTaskListItemType>('task-list-item', {\n editable: () => view.editable,\n onChange: (selected) => {\n const { tr } = view.state;\n view.dispatch(\n tr.setNodeMarkup(getPos(), undefined, {\n checked: selected,\n }),\n );\n },\n });\n\n if (!renderer) return {};\n\n const { dom, contentDOM, onUpdate } = renderer;\n onUpdate(currNode);\n\n return {\n dom,\n contentDOM,\n update: (updatedNode) => {\n if (updatedNode.type.name !== id) return false;\n\n currNode = updatedNode;\n onUpdate(currNode);\n\n return true;\n },\n };\n },\n };\n});\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { commands as commonmarkCommands, commonmark } from '@milkdown/preset-commonmark';\nimport { $remark, AtomList } from '@milkdown/utils';\nimport remarkGFM from 'remark-gfm';\n\nimport { urlPlugin } from './auto-link';\nimport { strikeThrough, ToggleStrikeThrough } from './strike-through';\nimport { table } from './table';\nimport {\n LiftTaskListItem,\n SinkTaskListItem,\n SplitTaskListItem,\n taskListItem,\n TurnIntoTaskList,\n} from './task-list-item';\n\nexport * from './strike-through';\nexport { SupportedKeys } from './supported-keys';\nexport {\n BreakTable,\n // command\n createTable,\n InsertTable,\n NextCell,\n PrevCell,\n // gather\n table,\n} from './table';\nexport * from './task-list-item';\nexport {\n blockquote,\n bulletList,\n codeFence,\n codeInline,\n commonmark,\n // gather\n commonmarkNodes,\n commonmarkPlugins,\n // node\n doc,\n em,\n hardbreak,\n heading,\n hr,\n image,\n // command\n InsertHardbreak,\n InsertHr,\n InsertImage,\n LiftListItem,\n link,\n listItem,\n ModifyImage,\n ModifyLink,\n orderedList,\n paragraph,\n SinkListItem,\n SplitListItem,\n strong,\n text,\n ToggleBold,\n ToggleInlineCode,\n ToggleItalic,\n ToggleLink,\n TurnIntoCodeFence,\n TurnIntoHeading,\n TurnIntoText,\n WrapInBlockquote,\n WrapInBulletList,\n WrapInOrderedList,\n} from '@milkdown/preset-commonmark';\n\nexport const gfm = AtomList.create([\n ...commonmark,\n $remark(() => remarkGFM),\n table(),\n urlPlugin,\n strikeThrough(),\n taskListItem(),\n]);\n\nexport const commands = {\n ...commonmarkCommands,\n ToggleStrikeThrough,\n TurnIntoTaskList,\n SinkTaskListItem,\n LiftTaskListItem,\n SplitTaskListItem,\n} as const;\nexport type Commands = typeof commands;\n"],"names":["tableNodesSpecCreator","SupportedKeys","CommonmarkKeys","TableKeys","commonmarkCommands"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/auto-link.ts","../src/footnote/utils.ts","../src/footnote/definition.ts","../src/footnote/reference.ts","../src/table/command.ts","../src/table/utils.ts","../src/table/operator-plugin/helper.ts","../src/table/operator-plugin/actions.ts","../src/table/operator-plugin/calc-pos.ts","../src/table/operator-plugin/constant.ts","../src/table/operator-plugin/style.ts","../src/table/operator-plugin/widget.ts","../src/table/operator-plugin/index.ts","../src/table/nodes/schema.ts","../src/table/nodes/index.ts","../src/supported-keys.ts","../src/strike-through.ts","../src/task-list-item.ts","../src/index.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nimport { InputRule, inputRules } from '@milkdown/prose';\nimport { $prose } from '@milkdown/utils';\n\nconst urlRegex = /https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/;\n\nconst proseUrlPlugin = () =>\n inputRules({\n rules: [\n new InputRule(urlRegex, (state, match, start, end) => {\n const { schema } = state;\n const [text] = match;\n if (!text) return null;\n\n return state.tr\n .replaceWith(start, end, schema.text(text))\n .addMark(start, text.length + start, schema.marks.link.create({ href: text }));\n }),\n ],\n });\n\nexport const urlPlugin = $prose(() => proseUrlPlugin());\n","/* Copyright 2021, Milkdown by Mirone. */\nexport const getFootnoteRefId = (label: string) => `footnote-ref-${label}`;\n\nexport const getFootnoteDefId = (label: string) => `footnote-def-${label}`;\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { commandsCtx, createCmd, createCmdKey, editorViewCtx, ThemeInputChipType } from '@milkdown/core';\nimport {\n EditorView,\n findSelectedNodeOfType,\n NodeSelection,\n Plugin,\n PluginKey,\n wrappingInputRule,\n} from '@milkdown/prose';\nimport { createNode } from '@milkdown/utils';\n\nimport { getFootnoteDefId, getFootnoteRefId } from './utils';\n\nconst key = new PluginKey('MILKDOWN_PLUGIN_FOOTNOTE_DEF_INPUT');\nexport const ModifyFootnoteDef = createCmdKey<string>('ModifyFootnoteDef');\n\nexport const footnoteDefinition = createNode((utils) => {\n const id = 'footnote_definition';\n const markdownId = 'footnoteDefinition';\n\n return {\n id,\n schema: (ctx) => ({\n group: 'block',\n content: 'block+',\n defining: true,\n attrs: {\n label: {\n default: '',\n },\n },\n parseDOM: [\n {\n tag: `div[data-type=\"${id}\"]`,\n getAttrs: (dom) => {\n if (!(dom instanceof HTMLElement)) {\n throw new Error();\n }\n return {\n label: dom.dataset['label'],\n };\n },\n },\n ],\n toDOM: (node) => {\n const label = node.attrs['label'];\n const className = utils.getClassName(node.attrs, 'footnote-definition');\n\n const dt = document.createElement('dt');\n dt.textContent = `[${label}]:`;\n dt.onclick = () => {\n const view = ctx.get(editorViewCtx);\n const selection = NodeSelection.create(view.state.doc, view.state.selection.from - 2);\n view.dispatch(view.state.tr.setSelection(selection));\n };\n\n const a = document.createElement('a');\n a.href = `#${getFootnoteRefId(label)}`;\n a.contentEditable = 'false';\n a.textContent = '↩';\n a.onmousedown = (e) => {\n e.preventDefault();\n };\n\n return [\n 'div',\n {\n class: className,\n 'data-label': label,\n 'data-type': id,\n id: getFootnoteDefId(label),\n },\n ['div', { class: 'footnote-definition_content' }, dt, ['dd', 0]],\n ['div', { class: 'footnote-definition_anchor' }, a],\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 commands: (nodeType) => [\n createCmd(ModifyFootnoteDef, (label = '') => (state, dispatch) => {\n const node = findSelectedNodeOfType(state.selection, nodeType);\n if (!node) return false;\n\n const { tr } = state;\n const _tr = tr.setNodeMarkup(node.pos, undefined, { ...node.node.attrs, label });\n dispatch?.(_tr.setSelection(NodeSelection.create(_tr.doc, node.pos)));\n\n return true;\n }),\n ],\n inputRules: (nodeType) => [\n wrappingInputRule(\n /(?:\\[\\^)([^:]+)(?::)$/,\n nodeType,\n (match) => {\n const label = match[1] ?? 'footnote';\n return {\n label,\n };\n },\n () => false,\n ),\n ],\n prosePlugins: (type, ctx) => {\n return [\n new Plugin({\n key,\n view: (editorView) => {\n const inputChipRenderer = utils.themeManager.get<ThemeInputChipType>('input-chip', {\n width: '12em',\n placeholder: 'Input Footnote Label',\n onUpdate: (value) => {\n ctx.get(commandsCtx).call(ModifyFootnoteDef, value);\n },\n isBindMode: true,\n });\n if (!inputChipRenderer) return {};\n const shouldDisplay = (view: EditorView) => {\n return Boolean(type && findSelectedNodeOfType(view.state.selection, type));\n };\n const getCurrentLabel = (view: EditorView) => {\n const result = findSelectedNodeOfType(view.state.selection, type);\n if (!result) return;\n\n const value = result.node.attrs['label'];\n return value;\n };\n const renderByView = (view: EditorView) => {\n if (!view.editable) {\n return;\n }\n const display = shouldDisplay(view);\n if (display) {\n inputChipRenderer.show(view);\n inputChipRenderer.update(getCurrentLabel(view));\n } else {\n inputChipRenderer.hide();\n }\n };\n inputChipRenderer.init(editorView);\n renderByView(editorView);\n\n return {\n update: (view, prevState) => {\n const isEqualSelection =\n prevState?.doc.eq(view.state.doc) && prevState.selection.eq(view.state.selection);\n if (isEqualSelection) return;\n\n renderByView(view);\n },\n destroy: () => {\n inputChipRenderer.destroy();\n },\n };\n },\n }),\n ];\n },\n };\n});\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { commandsCtx, createCmd, createCmdKey, editorViewCtx, ThemeInputChipType } from '@milkdown/core';\nimport { EditorView, findSelectedNodeOfType, InputRule, NodeSelection, Plugin, PluginKey } from '@milkdown/prose';\nimport { createNode } from '@milkdown/utils';\n\nimport { getFootnoteDefId, getFootnoteRefId } from './utils';\n\nexport const ModifyFootnoteRef = createCmdKey<string>('ModifyFootnoteRef');\nconst key = new PluginKey('MILKDOWN_PLUGIN_FOOTNOTE_REF_INPUT');\n\nexport const footnoteReference = createNode((utils) => {\n const id = 'footnote_reference';\n\n return {\n id,\n schema: (ctx) => ({\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 new Error();\n }\n return {\n label: dom.dataset['label'],\n };\n },\n },\n ],\n toDOM: (node) => {\n const label = node.attrs['label'];\n const a = document.createElement('a');\n const href = `#${getFootnoteDefId(label)}`;\n a.href = href;\n a.textContent = `[${label}]`;\n a.onclick = (e) => {\n const view = ctx.get(editorViewCtx);\n if (view.editable) {\n e.preventDefault();\n }\n };\n a.ondblclick = () => {\n const view = ctx.get(editorViewCtx);\n if (view.editable) {\n window.location.href = href;\n }\n };\n return [\n 'sup',\n {\n 'data-label': label,\n 'data-type': id,\n id: getFootnoteRefId(label),\n },\n a,\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 commands: (nodeType) => [\n createCmd(ModifyFootnoteRef, (label = '') => (state, dispatch) => {\n const node = findSelectedNodeOfType(state.selection, nodeType);\n if (!node) return false;\n\n const { tr } = state;\n const _tr = tr.setNodeMarkup(node.pos, undefined, { ...node.node.attrs, label });\n dispatch?.(_tr.setSelection(NodeSelection.create(_tr.doc, node.pos)));\n\n return true;\n }),\n ],\n inputRules: (nodeType) => [\n new InputRule(/(?:\\[\\^)([^\\]]+)(?:\\])$/, (state, match, start, end) => {\n const $start = state.doc.resolve(start);\n const index = $start.index();\n const $end = state.doc.resolve(end);\n if (!$start.parent.canReplaceWith(index, $end.index(), nodeType)) {\n return null;\n }\n const label = match[1];\n return state.tr.replaceRangeWith(\n start,\n end,\n nodeType.create({\n label,\n }),\n );\n }),\n ],\n prosePlugins: (type, ctx) => {\n const inputChipRenderer = utils.themeManager.get<ThemeInputChipType>('input-chip', {\n width: '12em',\n placeholder: 'Input Footnote Label',\n onUpdate: (value) => {\n ctx.get(commandsCtx).call(ModifyFootnoteRef, value);\n },\n isBindMode: true,\n });\n if (!inputChipRenderer) return [];\n const shouldDisplay = (view: EditorView) => {\n return Boolean(type && findSelectedNodeOfType(view.state.selection, type));\n };\n const getCurrentLabel = (view: EditorView) => {\n const result = findSelectedNodeOfType(view.state.selection, type);\n if (!result) return;\n\n const value = result.node.attrs['label'];\n return value;\n };\n const renderByView = (view: EditorView) => {\n if (!view.editable) {\n return;\n }\n const display = shouldDisplay(view);\n if (display) {\n inputChipRenderer.show(view);\n inputChipRenderer.update(getCurrentLabel(view));\n } else {\n inputChipRenderer.hide();\n }\n };\n return [\n new Plugin({\n key,\n view: (editorView) => {\n inputChipRenderer.init(editorView);\n renderByView(editorView);\n\n return {\n update: (view, prevState) => {\n const isEqualSelection =\n prevState?.doc.eq(view.state.doc) && prevState.selection.eq(view.state.selection);\n if (isEqualSelection) return;\n\n renderByView(view);\n },\n destroy: () => {\n inputChipRenderer.destroy();\n },\n };\n },\n }),\n ];\n },\n };\n});\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Command, isInTable, Node, NodeType, Selection } from '@milkdown/prose';\n\nexport const exitTable =\n (node: NodeType): Command =>\n (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.replaceWith(pos, pos, node.createAndFill() as Node);\n tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n dispatch?.(tr.scrollIntoView());\n return true;\n };\n","/* Copyright 2021, Milkdown by Mirone. */\nimport {\n CellSelection,\n cloneTr,\n findParentNode,\n Node as ProsemirrorNode,\n Schema,\n Selection,\n TableMap,\n tableNodeTypes,\n TableRect,\n Transaction,\n} from '@milkdown/prose';\n\nexport type CellPos = {\n pos: number;\n start: number;\n node: ProsemirrorNode;\n};\n\nexport const findTable = (selection: Selection) =>\n findParentNode((node) => node.type.spec['tableRole'] === 'table')(selection);\n\nexport const getCellsInColumn =\n (columnIndex: number) =>\n (selection: Selection): CellPos[] | undefined => {\n const table = findTable(selection);\n if (!table) return undefined;\n const map = TableMap.get(table.node);\n if (columnIndex < 0 || columnIndex >= map.width) {\n return undefined;\n }\n\n return map.cellsInRect({ left: columnIndex, right: columnIndex + 1, top: 0, bottom: map.height }).map((pos) => {\n const node = table.node.nodeAt(pos);\n if (!node) throw new Error();\n const start = pos + table.start;\n return {\n pos: start,\n start: start + 1,\n node,\n };\n });\n };\n\nexport const getCellsInRow =\n (rowIndex: number) =>\n (selection: Selection): CellPos[] | undefined => {\n const table = findTable(selection);\n if (!table) return undefined;\n const map = TableMap.get(table.node);\n if (rowIndex < 0 || rowIndex >= map.height) {\n return undefined;\n }\n\n return map.cellsInRect({ left: 0, right: map.width, top: rowIndex, bottom: rowIndex + 1 }).map((pos) => {\n const node = table.node.nodeAt(pos);\n if (!node) throw new Error();\n const start = pos + table.start;\n return {\n pos: start,\n start: start + 1,\n node,\n };\n });\n };\n\nexport const createTable = (schema: Schema, rowsCount = 3, colsCount = 3) => {\n const { cell: tableCell, header_cell: tableHeader, row: tableRow, table } = tableNodeTypes(schema);\n\n const cells = Array(colsCount)\n .fill(0)\n .map(() => tableCell.createAndFill(null) as ProsemirrorNode);\n\n const headerCells = Array(colsCount)\n .fill(0)\n .map(() => tableHeader.createAndFill(null) as ProsemirrorNode);\n\n const rows = Array(rowsCount)\n .fill(0)\n .map((_, i) => tableRow.create(null, i === 0 ? headerCells : cells));\n\n return table.create(null, rows);\n};\n\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\nexport const getCellsInTable = (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\nexport const selectTable = (tr: Transaction) => {\n const cells = getCellsInTable(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) as unknown as Selection));\n }\n }\n return tr;\n};\n\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 { cell: cellType, row: rowType } = tableNodeTypes(table.type.schema);\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 cellType.createAndFill({ alignment: headerCol?.attrs['alignment'] }) as ProsemirrorNode;\n });\n\n tr.insert(rowPos, rowType.create(null, cells));\n return tr;\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { CellSelection, EditorView, TableMap } from '@milkdown/prose';\n\nimport { Item } from './actions';\n\nexport const getCellSelection = (view: EditorView): CellSelection => view.state.selection as unknown as CellSelection;\n\nexport const isFirstRowSelected = (selection: CellSelection) => {\n const map = TableMap.get(selection.$anchorCell.node(-1));\n const start = selection.$anchorCell.start(-1);\n const cells = map.cellsInRect({\n left: 0,\n right: map.width,\n top: 0,\n bottom: 1,\n });\n const selectedCells = map.cellsInRect(\n map.rectBetween(selection.$anchorCell.pos - start, selection.$headCell.pos - start),\n );\n\n for (let i = 0, count = cells.length; i < count; i++) {\n if (selectedCells.indexOf(cells[i] as number) === -1) {\n return false;\n }\n }\n return true;\n};\n\nexport const calculateItem = (actions: Record<string, Item>, view: EditorView) => {\n Object.values(actions).forEach((item) => {\n const disable = item.disable?.(view);\n if (disable) {\n item.$.classList.add('hide');\n return;\n }\n item.$.classList.remove('hide');\n });\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Ctx, ThemeIcon, themeManagerCtx } from '@milkdown/core';\nimport {\n addColumnAfter,\n addColumnBefore,\n Command,\n deleteColumn,\n deleteRow,\n deleteTable,\n EditorView,\n isInTable,\n selectedRect,\n setCellAttr,\n} from '@milkdown/prose';\n\nimport { addRowWithAlignment } from '../utils';\nimport { getCellSelection, isFirstRowSelected } from './helper';\n\nexport type Item = {\n $: HTMLElement;\n command: (e: Event, view: EditorView) => Command;\n disable?: (view: EditorView) => boolean;\n};\n\nexport enum Action {\n AddColLeft,\n AddColRight,\n AddRowTop,\n AddRowBottom,\n AlignLeft,\n AlignCenter,\n AlignRight,\n Delete,\n}\n\nexport const createActions: (ctx: Ctx) => Record<Action, Item> = (ctx) => ({\n [Action.AddColLeft]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'leftArrow')?.dom as HTMLElement,\n command: () => addColumnBefore,\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AddColRight]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'rightArrow')?.dom as HTMLElement,\n command: () => addColumnAfter,\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AddRowTop]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'upArrow')?.dom as HTMLElement,\n command: () => (state, dispatch) => {\n if (!isInTable(state)) return false;\n if (dispatch) {\n const rect = selectedRect(state);\n dispatch(addRowWithAlignment(state.tr, rect, rect.top));\n }\n return true;\n },\n disable: (view) =>\n !getCellSelection(view).isRowSelection() ||\n getCellSelection(view).$head.parent.type.name === 'table_header',\n },\n [Action.AddRowBottom]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'downArrow')?.dom as HTMLElement,\n command: () => (state, dispatch) => {\n if (!isInTable(state)) return false;\n if (dispatch) {\n const rect = selectedRect(state);\n dispatch(addRowWithAlignment(state.tr, rect, rect.bottom));\n }\n return true;\n },\n disable: (view) => !getCellSelection(view).isRowSelection(),\n },\n [Action.AlignLeft]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'alignLeft')?.dom as HTMLElement,\n command: () => setCellAttr('alignment', 'left'),\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AlignCenter]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'alignCenter')?.dom as HTMLElement,\n command: () => setCellAttr('alignment', 'center'),\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AlignRight]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'alignRight')?.dom as HTMLElement,\n command: () => setCellAttr('alignment', 'right'),\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.Delete]: {\n $: ctx.get(themeManagerCtx).get(ThemeIcon, 'delete')?.dom as HTMLElement,\n command: (_, view) => {\n const selection = getCellSelection(view);\n const isCol = selection.isColSelection();\n const isRow = selection.isRowSelection();\n if (isCol && isRow) {\n return deleteTable;\n }\n\n if (isCol) {\n return deleteColumn;\n }\n\n return deleteRow;\n },\n disable: (view) => {\n const selection = getCellSelection(view);\n if (selection.isRowSelection()) {\n if (selection.isColSelection()) {\n return false;\n }\n return isFirstRowSelected(selection);\n }\n return false;\n },\n },\n});\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { calculateNodePosition, CellSelection, EditorView } from '@milkdown/prose';\n\nexport const calculatePosition = (view: EditorView, dom: HTMLElement) => {\n const { selection } = view.state as unknown as { selection: CellSelection };\n const isCol = selection.isColSelection();\n const isRow = selection.isRowSelection();\n\n calculateNodePosition(view, dom, (selected, target, parent) => {\n const $editor = dom.parentElement;\n if (!$editor) {\n throw new Error();\n }\n let left = !isRow\n ? selected.left - parent.left + (selected.width - target.width) / 2\n : selected.left - parent.left - target.width / 2 - 8;\n const top = selected.top - parent.top - target.height - (isCol ? 14 : 0) - 14 + $editor.scrollTop;\n\n if (left < 0) {\n left = 0;\n }\n return [top, left];\n });\n};\n","/* Copyright 2021, Milkdown by Mirone. */\n\nexport enum ToolTipPos {\n Left = 'Left',\n Top = 'Top',\n Point = 'Point',\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Emotion, getPalette, ThemeBorder, ThemeManager, ThemeShadow, ThemeSize } from '@milkdown/core';\n\nexport const injectStyle = (themeManager: ThemeManager, { css, injectGlobal }: Emotion) => {\n const palette = getPalette(themeManager);\n const radius = themeManager.get(ThemeSize, 'radius');\n const lineWidth = themeManager.get(ThemeSize, 'lineWidth');\n\n injectGlobal`\n .milkdown {\n .tableWrapper {\n table {\n width: calc(100% - 2em) !important;\n margin: 1em 0 1em 1em !important;\n\n .milkdown-cell-left,\n .milkdown-cell-point,\n .milkdown-cell-top {\n position: absolute;\n\n &::after {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 0;\n height: 100%;\n width: 100%;\n display: block;\n transition: all 0.2s ease-in-out;\n background: ${palette('secondary', 0.12)};\n content: '';\n }\n\n &:hover::after {\n background: ${palette('secondary', 0.38)};\n }\n }\n\n .milkdown-cell-left {\n left: calc(-6px - 0.5em);\n top: 0;\n bottom: 0;\n width: 0.5em;\n }\n\n .milkdown-cell-top {\n left: 0;\n right: 0;\n top: calc(-6px - 0.5em);\n height: 0.5em;\n }\n\n .milkdown-cell-point {\n left: calc(-2px - 1em);\n top: calc(-2px - 1em);\n width: 1em;\n height: 1em;\n\n .icon {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n }\n }\n }\n }\n }\n `;\n\n return css`\n display: inline-flex;\n cursor: pointer;\n z-index: 2;\n\n justify-content: space-evenly;\n\n position: absolute;\n\n border-radius: ${radius};\n\n ${themeManager.get(ThemeBorder, undefined)};\n ${themeManager.get(ThemeShadow, undefined)};\n\n overflow: hidden;\n background: ${palette('surface')};\n\n .icon {\n position: relative;\n color: ${palette('solid', 0.87)};\n\n width: 2em;\n line-height: 2em;\n text-align: center;\n transition: all 0.4s ease-in-out;\n\n &:hover {\n background-color: ${palette('secondary', 0.12)};\n }\n\n &.active {\n color: ${palette('primary')};\n }\n\n &:not(:last-child)::after {\n content: '';\n position: absolute;\n right: 0;\n top: 0;\n width: ${lineWidth};\n bottom: 0;\n background: ${palette('line')};\n }\n }\n\n &.hide,\n .hide {\n display: none;\n }\n `;\n};\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { Ctx, ThemeIcon, themeManagerCtx } from '@milkdown/core';\nimport { Decoration, WidgetDecorationSpec } from '@milkdown/prose';\n\nimport { CellPos, selectLine, selectTable } from '../utils';\nimport { ToolTipPos } from './constant';\n\nconst calculateClassName = (pos: ToolTipPos) => {\n switch (pos) {\n case ToolTipPos.Left: {\n return 'milkdown-cell-left';\n }\n case ToolTipPos.Top: {\n return 'milkdown-cell-top';\n }\n case ToolTipPos.Point:\n default: {\n return 'milkdown-cell-point';\n }\n }\n};\n\nexport function createWidget(ctx: Ctx, cell: CellPos, pos: ToolTipPos.Point): Decoration<WidgetDecorationSpec>;\nexport function createWidget(\n ctx: Ctx,\n cell: CellPos,\n pos: ToolTipPos.Left,\n index: number,\n): Decoration<WidgetDecorationSpec>;\nexport function createWidget(\n ctx: Ctx,\n cell: CellPos,\n pos: ToolTipPos.Top,\n index: number,\n): Decoration<WidgetDecorationSpec>;\nexport function createWidget(ctx: Ctx, cell: CellPos, pos: ToolTipPos, index = 0) {\n return Decoration.widget(cell.pos + 1, (view) => {\n const div = document.createElement('div');\n div.classList.add(calculateClassName(pos));\n if (pos === ToolTipPos.Point) {\n div.appendChild(ctx.get(themeManagerCtx).get(ThemeIcon, 'select')?.dom as HTMLElement);\n }\n div.addEventListener('mousedown', (e) => {\n if (!view) return;\n\n e.preventDefault();\n switch (pos) {\n case ToolTipPos.Point: {\n view.dispatch(selectTable(view.state.tr));\n return;\n }\n case ToolTipPos.Left: {\n view.dispatch(selectLine('row')(index)(view.state.tr));\n return;\n }\n case ToolTipPos.Top: {\n view.dispatch(selectLine('col')(index)(view.state.tr));\n return;\n }\n }\n });\n return div;\n });\n}\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { Ctx } from '@milkdown/core';\nimport { CellSelection, Decoration, DecorationSet, Plugin, PluginKey } from '@milkdown/prose';\nimport { Utils } from '@milkdown/utils';\n\nimport { CellPos, getCellsInColumn, getCellsInRow } from '../utils';\nimport { createActions } from './actions';\nimport { calculatePosition } from './calc-pos';\nimport { ToolTipPos } from './constant';\nimport { calculateItem } from './helper';\nimport { injectStyle } from './style';\nimport { createWidget } from './widget';\n\nexport const key = 'MILKDOWN_PLUGIN_TABLE';\n\nexport const operatorPlugin = (ctx: Ctx, utils: Utils) => {\n return new Plugin({\n key: new PluginKey('MILKDOWN_TABLE_OP'),\n props: {\n decorations: (state) => {\n const decorations: Decoration[] = [];\n const leftCells = getCellsInColumn(0)(state.selection);\n if (!leftCells) return null;\n const topCells = getCellsInRow(0)(state.selection);\n if (!topCells) return null;\n\n const [topLeft] = leftCells;\n\n decorations.push(createWidget(ctx, topLeft as CellPos, ToolTipPos.Point));\n leftCells.forEach((cell, i) => {\n decorations.push(createWidget(ctx, cell, ToolTipPos.Left, i));\n });\n topCells.forEach((cell, i) => {\n decorations.push(createWidget(ctx, cell, ToolTipPos.Top, i));\n });\n\n return DecorationSet.create(state.doc, decorations);\n },\n },\n view: (editorView) => {\n const items = Object.fromEntries(Object.entries(createActions(ctx)).filter(([, value]) => value.$ != null));\n const tooltip = document.createElement('div');\n utils.themeManager.onFlush(() => {\n const style = utils.getStyle((emotion) => injectStyle(utils.themeManager, emotion));\n if (style) {\n tooltip.classList.add(style);\n }\n });\n tooltip.classList.add('table-tooltip', 'hide');\n Object.values(items).forEach(({ $ }) => tooltip.appendChild($));\n editorView.dom.parentNode?.appendChild(tooltip);\n\n const listener = (e: Event) => {\n if (!editorView) return;\n e.stopPropagation();\n e.preventDefault();\n Object.values(items).forEach(({ $, command }) => {\n if ($.contains(e.target as Element)) {\n command(e, editorView)(editorView.state, editorView.dispatch, editorView);\n }\n });\n };\n\n const hide = () => {\n tooltip.classList.add('hide');\n };\n\n tooltip.addEventListener('mousedown', listener);\n\n return {\n update: (view, prevState) => {\n const state = view.state;\n\n if (prevState?.doc.eq(state.doc) && prevState.selection.eq(state.selection)) return;\n\n const isCellSelection = state.selection instanceof CellSelection;\n\n if (!isCellSelection || !view.editable) {\n hide();\n return;\n }\n\n calculateItem(items, view);\n if (Object.values(items).every(({ $ }) => $.classList.contains('hide'))) {\n hide();\n return;\n }\n tooltip.classList.remove('hide');\n calculatePosition(view, tooltip);\n },\n destroy: () => {\n tooltip.removeEventListener('mousedown', listener);\n tooltip.remove();\n },\n };\n },\n });\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { tableNodes as tableNodesSpecCreator } from '@milkdown/prose';\n\nexport const schema = tableNodesSpecCreator({\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","/* Copyright 2021, Milkdown by Mirone. */\nimport { createCmd, createCmdKey, MarkdownNode, schemaCtx } from '@milkdown/core';\nimport {\n columnResizing,\n goToNextCell,\n InputRule,\n NodeType,\n Selection,\n tableEditing,\n TextSelection,\n} from '@milkdown/prose';\nimport { createPlugin, createShortcut } from '@milkdown/utils';\n\nimport { exitTable } from '../command';\nimport { operatorPlugin } from '../operator-plugin';\nimport { createTable } from '../utils';\nimport { schema } from './schema';\n\nexport const SupportedKeys = {\n NextCell: 'NextCell',\n PrevCell: 'PrevCell',\n ExitTable: 'ExitTable',\n} as const;\nexport type SupportedKeys = typeof SupportedKeys;\n\ntype Keys = keyof SupportedKeys;\n\nexport const PrevCell = createCmdKey('PrevCell');\nexport const NextCell = createCmdKey('NextCell');\nexport const BreakTable = createCmdKey('BreakTable');\nexport const InsertTable = createCmdKey('InsertTable');\n\nexport const table = createPlugin<Keys, Record<string, unknown>, keyof typeof schema>((utils) => {\n return {\n schema: () => ({\n node: {\n table: {\n ...schema.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) 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 table_row: {\n ...schema.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 table_cell: {\n ...schema.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 table_header: {\n ...schema.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 }),\n inputRules: (nodeType, ctx) => [\n new InputRule(/^\\|\\|\\s$/, (state, _match, start, end) => {\n const $start = state.doc.resolve(start);\n if (!$start.node(-1).canReplaceWith($start.index(-1), $start.indexAfter(-1), nodeType.table))\n return null;\n\n const tableNode = createTable(ctx.get(schemaCtx));\n const tr = state.tr.replaceRangeWith(start, end, tableNode).scrollIntoView();\n return tr.setSelection(TextSelection.create(tr.doc, start + 3));\n }),\n ],\n commands: (_, ctx) => [\n createCmd(PrevCell, () => goToNextCell(-1)),\n createCmd(NextCell, () => goToNextCell(1)),\n createCmd(BreakTable, () => exitTable(ctx.get(schemaCtx).nodes['paragraph'] as NodeType)),\n createCmd(InsertTable, () => (state, dispatch) => {\n const { selection, tr } = state;\n const { from } = selection;\n const table = createTable(ctx.get(schemaCtx));\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 shortcuts: {\n [SupportedKeys.NextCell]: createShortcut(NextCell, 'Mod-]'),\n [SupportedKeys.PrevCell]: createShortcut(PrevCell, 'Mod-['),\n [SupportedKeys.ExitTable]: createShortcut(BreakTable, 'Mod-Enter'),\n },\n prosePlugins: (_, ctx) => {\n return [operatorPlugin(ctx, utils), columnResizing({}), tableEditing()];\n },\n };\n});\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { SupportedKeys as CommonmarkKeys } from '@milkdown/preset-commonmark';\n\nimport { SupportedKeys as TableKeys } from './table';\n\nexport const SupportedKeys = {\n ...CommonmarkKeys,\n ...TableKeys,\n StrikeThrough: 'StrikeThrough',\n TaskList: 'TaskList',\n} as const;\nexport type SupportedKeys = typeof SupportedKeys;\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { createCmd, createCmdKey } from '@milkdown/core';\nimport { markRule, toggleMark } from '@milkdown/prose';\nimport { createMark, createShortcut } from '@milkdown/utils';\n\nimport { SupportedKeys } from './supported-keys';\n\ntype Keys = SupportedKeys['StrikeThrough'];\n\nexport const ToggleStrikeThrough = createCmdKey('ToggleStrikeThrough');\n\nconst id = 'strike_through';\nexport const strikeThrough = createMark<Keys>((utils) => {\n return {\n id,\n schema: () => ({\n parseDOM: [\n { tag: 'del' },\n { style: 'text-decoration', getAttrs: (value) => (value === 'line-through') as false },\n ],\n toDOM: (mark) => ['del', { class: utils.getClassName(mark.attrs, 'strike-through') }],\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 === id,\n runner: (state, mark) => {\n state.withMark(mark, 'delete');\n },\n },\n }),\n inputRules: (markType) => [\n markRule(/(?:~~)([^~]+)(?:~~)$/, markType),\n markRule(/(?:^|[^~])(~([^~]+)~)$/, markType),\n ],\n commands: (markType) => [createCmd(ToggleStrikeThrough, () => toggleMark(markType))],\n shortcuts: {\n [SupportedKeys.StrikeThrough]: createShortcut(ToggleStrikeThrough, 'Mod-Alt-x'),\n },\n };\n});\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { createCmd, createCmdKey, editorViewCtx, ThemeTaskListItemType } from '@milkdown/core';\nimport { liftListItem, sinkListItem, splitListItem, wrapIn, wrappingInputRule } from '@milkdown/prose';\nimport { createNode, createShortcut } from '@milkdown/utils';\n\nimport { SupportedKeys } from './supported-keys';\n\ntype Keys = Extract<keyof SupportedKeys, 'SinkListItem' | 'LiftListItem' | 'NextListItem' | 'TaskList'>;\n\nexport const SplitTaskListItem = createCmdKey('SplitTaskListItem');\nexport const SinkTaskListItem = createCmdKey('SinkTaskListItem');\nexport const LiftTaskListItem = createCmdKey('LiftTaskListItem');\nexport const TurnIntoTaskList = createCmdKey('TurnIntoTaskList');\n\nexport const taskListItem = createNode<Keys>((utils) => {\n const id = 'task_list_item';\n\n return {\n id,\n schema: (ctx) => ({\n group: 'listItem',\n content: 'paragraph block*',\n defining: true,\n priority: 60,\n attrs: {\n checked: {\n default: false,\n },\n },\n parseDOM: [\n {\n tag: 'li[data-type=\"task-item\"]',\n getAttrs: (dom) => {\n if (!(dom instanceof HTMLElement)) {\n throw new Error();\n }\n return { checked: dom.dataset['checked'] === 'true' };\n },\n },\n ],\n toDOM: (node) => {\n const checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = node.attrs['checked'];\n checkbox.className = utils.getClassName(node.attrs, 'task-list-item_checkbox');\n checkbox.onchange = (event) => {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) return;\n const view = ctx.get(editorViewCtx);\n\n if (!view.editable) {\n checkbox.checked = !checkbox.checked;\n\n return;\n }\n\n const { top, left } = target.getBoundingClientRect();\n const result = view.posAtCoords({ top, left });\n if (!result) return;\n\n const { tr } = view.state;\n\n view.dispatch(\n tr.setNodeMarkup(result.inside, undefined, {\n checked: target.checked,\n }),\n );\n };\n return [\n 'li',\n {\n 'data-type': 'task-item',\n 'data-checked': node.attrs['checked'] ? 'true' : 'false',\n class: utils.getClassName(node.attrs, 'task-list-item'),\n },\n checkbox,\n ['span', { class: utils.getClassName(node.attrs, 'task-list-item_body') }, 0],\n ];\n },\n parseMarkdown: {\n match: ({ type, checked }) => {\n return type === 'listItem' && checked !== null;\n },\n runner: (state, node, type) => {\n state.openNode(type, { checked: node['checked'] as boolean });\n state.next(node.children);\n state.closeNode();\n },\n },\n toMarkdown: {\n match: (node) => node.type.name === id,\n runner: (state, node) => {\n state.openNode('listItem', undefined, { checked: node.attrs['checked'] });\n state.next(node.content);\n state.closeNode();\n },\n },\n }),\n inputRules: (nodeType) => [\n wrappingInputRule(/^\\s*(\\[([ |x])\\])\\s$/, nodeType, (match) => ({\n checked: match[match.length - 1] === 'x',\n })),\n ],\n commands: (nodeType) => [\n createCmd(SplitTaskListItem, () => splitListItem(nodeType)),\n createCmd(SinkTaskListItem, () => sinkListItem(nodeType)),\n createCmd(LiftTaskListItem, () => liftListItem(nodeType)),\n createCmd(TurnIntoTaskList, () => wrapIn(nodeType)),\n ],\n shortcuts: {\n [SupportedKeys.NextListItem]: createShortcut(SplitTaskListItem, 'Enter'),\n [SupportedKeys.SinkListItem]: createShortcut(SinkTaskListItem, 'Mod-]'),\n [SupportedKeys.LiftListItem]: createShortcut(LiftTaskListItem, 'Mod-['),\n [SupportedKeys.TaskList]: createShortcut(TurnIntoTaskList, 'Mod-Alt-9'),\n },\n view: () => (node, view, getPos) => {\n let currNode = node;\n\n const renderer = utils.themeManager.get<ThemeTaskListItemType>('task-list-item', {\n editable: () => view.editable,\n onChange: (selected) => {\n const { tr } = view.state;\n view.dispatch(\n tr.setNodeMarkup(getPos(), undefined, {\n checked: selected,\n }),\n );\n },\n });\n\n if (!renderer) return {};\n\n const { dom, contentDOM, onUpdate } = renderer;\n onUpdate(currNode);\n\n return {\n dom,\n contentDOM,\n update: (updatedNode) => {\n if (updatedNode.type.name !== id) return false;\n\n currNode = updatedNode;\n onUpdate(currNode);\n\n return true;\n },\n };\n },\n };\n});\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { commands as commonmarkCommands, commonmark } from '@milkdown/preset-commonmark';\nimport { $remark, AtomList } from '@milkdown/utils';\nimport remarkGFM from 'remark-gfm';\n\nimport { urlPlugin } from './auto-link';\nimport { footnoteReference } from './footnote';\nimport { footnoteDefinition } from './footnote/definition';\nimport { strikeThrough, ToggleStrikeThrough } from './strike-through';\nimport { table } from './table';\nimport {\n LiftTaskListItem,\n SinkTaskListItem,\n SplitTaskListItem,\n taskListItem,\n TurnIntoTaskList,\n} from './task-list-item';\n\nexport * from './footnote';\nexport * from './strike-through';\nexport { SupportedKeys } from './supported-keys';\nexport {\n BreakTable,\n // command\n createTable,\n InsertTable,\n NextCell,\n PrevCell,\n // gather\n table,\n} from './table';\nexport * from './task-list-item';\nexport {\n blockquote,\n bulletList,\n codeFence,\n codeInline,\n commonmark,\n // gather\n commonmarkNodes,\n commonmarkPlugins,\n // node\n doc,\n em,\n hardbreak,\n heading,\n hr,\n image,\n // command\n InsertHardbreak,\n InsertHr,\n InsertImage,\n LiftListItem,\n link,\n listItem,\n ModifyImage,\n ModifyLink,\n orderedList,\n paragraph,\n SinkListItem,\n SplitListItem,\n strong,\n text,\n ToggleBold,\n ToggleInlineCode,\n ToggleItalic,\n ToggleLink,\n TurnIntoCodeFence,\n TurnIntoHeading,\n TurnIntoText,\n WrapInBlockquote,\n WrapInBulletList,\n WrapInOrderedList,\n} from '@milkdown/preset-commonmark';\n\nexport const gfm = AtomList.create([\n ...commonmark,\n $remark(() => remarkGFM),\n table(),\n urlPlugin,\n strikeThrough(),\n taskListItem(),\n footnoteReference(),\n footnoteDefinition(),\n]);\n\nexport const commands = {\n ...commonmarkCommands,\n ToggleStrikeThrough,\n TurnIntoTaskList,\n SinkTaskListItem,\n LiftTaskListItem,\n SplitTaskListItem,\n} as const;\nexport type Commands = typeof commands;\n"],"names":["key","tableNodesSpecCreator","SupportedKeys","CommonmarkKeys","TableKeys","commonmarkCommands"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/table/operator-plugin/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAA4C,MAAM,EAAa,MAAM,iBAAiB,CAAC;AAC9F,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAUxC,eAAO,MAAM,GAAG,0BAA0B,CAAC;AAE3C,eAAO,MAAM,cAAc,QAAS,GAAG,SAAS,KAAK,qBAmFpD,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/table/operator-plugin/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAC;AACrC,OAAO,EAA4C,MAAM,EAAa,MAAM,iBAAiB,CAAC;AAC9F,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAUxC,eAAO,MAAM,GAAG,0BAA0B,CAAC;AAE3C,eAAO,MAAM,cAAc,QAAS,GAAG,SAAS,KAAK,qBAkFpD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milkdown/preset-gfm",
3
- "version": "6.0.0-next.0",
3
+ "version": "6.0.1",
4
4
  "type": "module",
5
5
  "main": "./lib/index.es.js",
6
6
  "types": "./lib/index.d.ts",
@@ -17,18 +17,18 @@
17
17
  "gfm"
18
18
  ],
19
19
  "devDependencies": {
20
- "@milkdown/core": "6.0.0-next.0",
21
- "@milkdown/prose": "6.0.0-next.0",
22
- "@milkdown/design-system": "6.0.0-next.0",
23
- "@milkdown/preset-commonmark": "6.0.0-next.0"
20
+ "@milkdown/core": "6.0.1",
21
+ "@milkdown/prose": "6.0.1",
22
+ "@milkdown/design-system": "6.0.1",
23
+ "@milkdown/preset-commonmark": "6.0.1"
24
24
  },
25
25
  "peerDependencies": {
26
- "@milkdown/core": "^6.0.0-next.0",
27
- "@milkdown/prose": "^6.0.0-next.0",
28
- "@milkdown/preset-commonmark": "^6.0.0-next.0"
26
+ "@milkdown/core": "^6.0.1",
27
+ "@milkdown/prose": "^6.0.1",
28
+ "@milkdown/preset-commonmark": "^6.0.1"
29
29
  },
30
30
  "dependencies": {
31
- "@milkdown/utils": "6.0.0-next.0",
31
+ "@milkdown/utils": "6.0.1",
32
32
  "remark-gfm": "^3.0.0",
33
33
  "tslib": "^2.3.1"
34
34
  },
@@ -0,0 +1,184 @@
1
+ /* Copyright 2021, Milkdown by Mirone. */
2
+
3
+ import { commandsCtx, createCmd, createCmdKey, editorViewCtx, ThemeInputChipType } from '@milkdown/core';
4
+ import {
5
+ EditorView,
6
+ findSelectedNodeOfType,
7
+ NodeSelection,
8
+ Plugin,
9
+ PluginKey,
10
+ wrappingInputRule,
11
+ } from '@milkdown/prose';
12
+ import { createNode } from '@milkdown/utils';
13
+
14
+ import { getFootnoteDefId, getFootnoteRefId } from './utils';
15
+
16
+ const key = new PluginKey('MILKDOWN_PLUGIN_FOOTNOTE_DEF_INPUT');
17
+ export const ModifyFootnoteDef = createCmdKey<string>('ModifyFootnoteDef');
18
+
19
+ export const footnoteDefinition = createNode((utils) => {
20
+ const id = 'footnote_definition';
21
+ const markdownId = 'footnoteDefinition';
22
+
23
+ return {
24
+ id,
25
+ schema: (ctx) => ({
26
+ group: 'block',
27
+ content: 'block+',
28
+ defining: true,
29
+ attrs: {
30
+ label: {
31
+ default: '',
32
+ },
33
+ },
34
+ parseDOM: [
35
+ {
36
+ tag: `div[data-type="${id}"]`,
37
+ getAttrs: (dom) => {
38
+ if (!(dom instanceof HTMLElement)) {
39
+ throw new Error();
40
+ }
41
+ return {
42
+ label: dom.dataset['label'],
43
+ };
44
+ },
45
+ },
46
+ ],
47
+ toDOM: (node) => {
48
+ const label = node.attrs['label'];
49
+ const className = utils.getClassName(node.attrs, 'footnote-definition');
50
+
51
+ const dt = document.createElement('dt');
52
+ dt.textContent = `[${label}]:`;
53
+ dt.onclick = () => {
54
+ const view = ctx.get(editorViewCtx);
55
+ const selection = NodeSelection.create(view.state.doc, view.state.selection.from - 2);
56
+ view.dispatch(view.state.tr.setSelection(selection));
57
+ };
58
+
59
+ const a = document.createElement('a');
60
+ a.href = `#${getFootnoteRefId(label)}`;
61
+ a.contentEditable = 'false';
62
+ a.textContent = '↩';
63
+ a.onmousedown = (e) => {
64
+ e.preventDefault();
65
+ };
66
+
67
+ return [
68
+ 'div',
69
+ {
70
+ class: className,
71
+ 'data-label': label,
72
+ 'data-type': id,
73
+ id: getFootnoteDefId(label),
74
+ },
75
+ ['div', { class: 'footnote-definition_content' }, dt, ['dd', 0]],
76
+ ['div', { class: 'footnote-definition_anchor' }, a],
77
+ ];
78
+ },
79
+ parseMarkdown: {
80
+ match: ({ type }) => type === markdownId,
81
+ runner: (state, node, type) => {
82
+ state
83
+ .openNode(type, {
84
+ label: node['label'] as string,
85
+ })
86
+ .next(node.children)
87
+ .closeNode();
88
+ },
89
+ },
90
+ toMarkdown: {
91
+ match: (node) => node.type.name === id,
92
+ runner: (state, node) => {
93
+ state
94
+ .openNode(markdownId, undefined, {
95
+ label: node.attrs['label'],
96
+ identifier: node.attrs['label'],
97
+ })
98
+ .next(node.content)
99
+ .closeNode();
100
+ },
101
+ },
102
+ }),
103
+ commands: (nodeType) => [
104
+ createCmd(ModifyFootnoteDef, (label = '') => (state, dispatch) => {
105
+ const node = findSelectedNodeOfType(state.selection, nodeType);
106
+ if (!node) return false;
107
+
108
+ const { tr } = state;
109
+ const _tr = tr.setNodeMarkup(node.pos, undefined, { ...node.node.attrs, label });
110
+ dispatch?.(_tr.setSelection(NodeSelection.create(_tr.doc, node.pos)));
111
+
112
+ return true;
113
+ }),
114
+ ],
115
+ inputRules: (nodeType) => [
116
+ wrappingInputRule(
117
+ /(?:\[\^)([^:]+)(?::)$/,
118
+ nodeType,
119
+ (match) => {
120
+ const label = match[1] ?? 'footnote';
121
+ return {
122
+ label,
123
+ };
124
+ },
125
+ () => false,
126
+ ),
127
+ ],
128
+ prosePlugins: (type, ctx) => {
129
+ return [
130
+ new Plugin({
131
+ key,
132
+ view: (editorView) => {
133
+ const inputChipRenderer = utils.themeManager.get<ThemeInputChipType>('input-chip', {
134
+ width: '12em',
135
+ placeholder: 'Input Footnote Label',
136
+ onUpdate: (value) => {
137
+ ctx.get(commandsCtx).call(ModifyFootnoteDef, value);
138
+ },
139
+ isBindMode: true,
140
+ });
141
+ if (!inputChipRenderer) return {};
142
+ const shouldDisplay = (view: EditorView) => {
143
+ return Boolean(type && findSelectedNodeOfType(view.state.selection, type));
144
+ };
145
+ const getCurrentLabel = (view: EditorView) => {
146
+ const result = findSelectedNodeOfType(view.state.selection, type);
147
+ if (!result) return;
148
+
149
+ const value = result.node.attrs['label'];
150
+ return value;
151
+ };
152
+ const renderByView = (view: EditorView) => {
153
+ if (!view.editable) {
154
+ return;
155
+ }
156
+ const display = shouldDisplay(view);
157
+ if (display) {
158
+ inputChipRenderer.show(view);
159
+ inputChipRenderer.update(getCurrentLabel(view));
160
+ } else {
161
+ inputChipRenderer.hide();
162
+ }
163
+ };
164
+ inputChipRenderer.init(editorView);
165
+ renderByView(editorView);
166
+
167
+ return {
168
+ update: (view, prevState) => {
169
+ const isEqualSelection =
170
+ prevState?.doc.eq(view.state.doc) && prevState.selection.eq(view.state.selection);
171
+ if (isEqualSelection) return;
172
+
173
+ renderByView(view);
174
+ },
175
+ destroy: () => {
176
+ inputChipRenderer.destroy();
177
+ },
178
+ };
179
+ },
180
+ }),
181
+ ];
182
+ },
183
+ };
184
+ });
@@ -0,0 +1,3 @@
1
+ /* Copyright 2021, Milkdown by Mirone. */
2
+ export * from './definition';
3
+ export * from './reference';
@@ -0,0 +1,171 @@
1
+ /* Copyright 2021, Milkdown by Mirone. */
2
+
3
+ import { commandsCtx, createCmd, createCmdKey, editorViewCtx, ThemeInputChipType } from '@milkdown/core';
4
+ import { EditorView, findSelectedNodeOfType, InputRule, NodeSelection, Plugin, PluginKey } from '@milkdown/prose';
5
+ import { createNode } from '@milkdown/utils';
6
+
7
+ import { getFootnoteDefId, getFootnoteRefId } from './utils';
8
+
9
+ export const ModifyFootnoteRef = createCmdKey<string>('ModifyFootnoteRef');
10
+ const key = new PluginKey('MILKDOWN_PLUGIN_FOOTNOTE_REF_INPUT');
11
+
12
+ export const footnoteReference = createNode((utils) => {
13
+ const id = 'footnote_reference';
14
+
15
+ return {
16
+ id,
17
+ schema: (ctx) => ({
18
+ group: 'inline',
19
+ inline: true,
20
+ atom: true,
21
+ attrs: {
22
+ label: {
23
+ default: '',
24
+ },
25
+ },
26
+ parseDOM: [
27
+ {
28
+ tag: `sup[data-type="${id}"]`,
29
+ getAttrs: (dom) => {
30
+ if (!(dom instanceof HTMLElement)) {
31
+ throw new Error();
32
+ }
33
+ return {
34
+ label: dom.dataset['label'],
35
+ };
36
+ },
37
+ },
38
+ ],
39
+ toDOM: (node) => {
40
+ const label = node.attrs['label'];
41
+ const a = document.createElement('a');
42
+ const href = `#${getFootnoteDefId(label)}`;
43
+ a.href = href;
44
+ a.textContent = `[${label}]`;
45
+ a.onclick = (e) => {
46
+ const view = ctx.get(editorViewCtx);
47
+ if (view.editable) {
48
+ e.preventDefault();
49
+ }
50
+ };
51
+ a.ondblclick = () => {
52
+ const view = ctx.get(editorViewCtx);
53
+ if (view.editable) {
54
+ window.location.href = href;
55
+ }
56
+ };
57
+ return [
58
+ 'sup',
59
+ {
60
+ 'data-label': label,
61
+ 'data-type': id,
62
+ id: getFootnoteRefId(label),
63
+ },
64
+ a,
65
+ ];
66
+ },
67
+ parseMarkdown: {
68
+ match: ({ type }) => type === 'footnoteReference',
69
+ runner: (state, node, type) => {
70
+ state.addNode(type, {
71
+ label: node['label'] as string,
72
+ });
73
+ },
74
+ },
75
+ toMarkdown: {
76
+ match: (node) => node.type.name === id,
77
+ runner: (state, node) => {
78
+ state.addNode('footnoteReference', undefined, undefined, {
79
+ label: node.attrs['label'],
80
+ identifier: node.attrs['label'],
81
+ });
82
+ },
83
+ },
84
+ }),
85
+ commands: (nodeType) => [
86
+ createCmd(ModifyFootnoteRef, (label = '') => (state, dispatch) => {
87
+ const node = findSelectedNodeOfType(state.selection, nodeType);
88
+ if (!node) return false;
89
+
90
+ const { tr } = state;
91
+ const _tr = tr.setNodeMarkup(node.pos, undefined, { ...node.node.attrs, label });
92
+ dispatch?.(_tr.setSelection(NodeSelection.create(_tr.doc, node.pos)));
93
+
94
+ return true;
95
+ }),
96
+ ],
97
+ inputRules: (nodeType) => [
98
+ new InputRule(/(?:\[\^)([^\]]+)(?:\])$/, (state, match, start, end) => {
99
+ const $start = state.doc.resolve(start);
100
+ const index = $start.index();
101
+ const $end = state.doc.resolve(end);
102
+ if (!$start.parent.canReplaceWith(index, $end.index(), nodeType)) {
103
+ return null;
104
+ }
105
+ const label = match[1];
106
+ return state.tr.replaceRangeWith(
107
+ start,
108
+ end,
109
+ nodeType.create({
110
+ label,
111
+ }),
112
+ );
113
+ }),
114
+ ],
115
+ prosePlugins: (type, ctx) => {
116
+ const inputChipRenderer = utils.themeManager.get<ThemeInputChipType>('input-chip', {
117
+ width: '12em',
118
+ placeholder: 'Input Footnote Label',
119
+ onUpdate: (value) => {
120
+ ctx.get(commandsCtx).call(ModifyFootnoteRef, value);
121
+ },
122
+ isBindMode: true,
123
+ });
124
+ if (!inputChipRenderer) return [];
125
+ const shouldDisplay = (view: EditorView) => {
126
+ return Boolean(type && findSelectedNodeOfType(view.state.selection, type));
127
+ };
128
+ const getCurrentLabel = (view: EditorView) => {
129
+ const result = findSelectedNodeOfType(view.state.selection, type);
130
+ if (!result) return;
131
+
132
+ const value = result.node.attrs['label'];
133
+ return value;
134
+ };
135
+ const renderByView = (view: EditorView) => {
136
+ if (!view.editable) {
137
+ return;
138
+ }
139
+ const display = shouldDisplay(view);
140
+ if (display) {
141
+ inputChipRenderer.show(view);
142
+ inputChipRenderer.update(getCurrentLabel(view));
143
+ } else {
144
+ inputChipRenderer.hide();
145
+ }
146
+ };
147
+ return [
148
+ new Plugin({
149
+ key,
150
+ view: (editorView) => {
151
+ inputChipRenderer.init(editorView);
152
+ renderByView(editorView);
153
+
154
+ return {
155
+ update: (view, prevState) => {
156
+ const isEqualSelection =
157
+ prevState?.doc.eq(view.state.doc) && prevState.selection.eq(view.state.selection);
158
+ if (isEqualSelection) return;
159
+
160
+ renderByView(view);
161
+ },
162
+ destroy: () => {
163
+ inputChipRenderer.destroy();
164
+ },
165
+ };
166
+ },
167
+ }),
168
+ ];
169
+ },
170
+ };
171
+ });
@@ -0,0 +1,4 @@
1
+ /* Copyright 2021, Milkdown by Mirone. */
2
+ export const getFootnoteRefId = (label: string) => `footnote-ref-${label}`;
3
+
4
+ export const getFootnoteDefId = (label: string) => `footnote-def-${label}`;
package/src/index.ts CHANGED
@@ -4,6 +4,8 @@ import { $remark, AtomList } from '@milkdown/utils';
4
4
  import remarkGFM from 'remark-gfm';
5
5
 
6
6
  import { urlPlugin } from './auto-link';
7
+ import { footnoteReference } from './footnote';
8
+ import { footnoteDefinition } from './footnote/definition';
7
9
  import { strikeThrough, ToggleStrikeThrough } from './strike-through';
8
10
  import { table } from './table';
9
11
  import {
@@ -14,6 +16,7 @@ import {
14
16
  TurnIntoTaskList,
15
17
  } from './task-list-item';
16
18
 
19
+ export * from './footnote';
17
20
  export * from './strike-through';
18
21
  export { SupportedKeys } from './supported-keys';
19
22
  export {
@@ -77,6 +80,8 @@ export const gfm = AtomList.create([
77
80
  urlPlugin,
78
81
  strikeThrough(),
79
82
  taskListItem(),
83
+ footnoteReference(),
84
+ footnoteDefinition(),
80
85
  ]);
81
86
 
82
87
  export const commands = {
@@ -15,16 +15,6 @@ import { createWidget } from './widget';
15
15
  export const key = 'MILKDOWN_PLUGIN_TABLE';
16
16
 
17
17
  export const operatorPlugin = (ctx: Ctx, utils: Utils) => {
18
- const items = createActions(ctx);
19
- const tooltip = document.createElement('div');
20
- utils.themeManager.onFlush(() => {
21
- const style = utils.getStyle(injectStyle);
22
- if (style) {
23
- tooltip.classList.add(style);
24
- }
25
- });
26
- tooltip.classList.add('table-tooltip', 'hide');
27
-
28
18
  return new Plugin({
29
19
  key: new PluginKey('MILKDOWN_TABLE_OP'),
30
20
  props: {
@@ -49,6 +39,15 @@ export const operatorPlugin = (ctx: Ctx, utils: Utils) => {
49
39
  },
50
40
  },
51
41
  view: (editorView) => {
42
+ const items = Object.fromEntries(Object.entries(createActions(ctx)).filter(([, value]) => value.$ != null));
43
+ const tooltip = document.createElement('div');
44
+ utils.themeManager.onFlush(() => {
45
+ const style = utils.getStyle((emotion) => injectStyle(utils.themeManager, emotion));
46
+ if (style) {
47
+ tooltip.classList.add(style);
48
+ }
49
+ });
50
+ tooltip.classList.add('table-tooltip', 'hide');
52
51
  Object.values(items).forEach(({ $ }) => tooltip.appendChild($));
53
52
  editorView.dom.parentNode?.appendChild(tooltip);
54
53