@milkdown/preset-gfm 6.0.0-next.1 → 6.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/footnote/definition.d.ts.map +1 -1
- package/lib/footnote/reference.d.ts.map +1 -1
- package/lib/footnote/utils.d.ts.map +1 -1
- package/lib/index.es.js +76 -59
- package/lib/index.es.js.map +1 -1
- package/lib/table/operator-plugin/index.d.ts.map +1 -1
- package/package.json +9 -9
- package/src/footnote/definition.ts +54 -49
- package/src/footnote/reference.ts +22 -4
- package/src/footnote/utils.ts +2 -2
- package/src/table/operator-plugin/index.ts +9 -10
|
@@ -1 +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;;;;
|
|
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;;;;EAuK7B,CAAC"}
|
|
@@ -1 +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;;;;
|
|
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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/footnote/utils.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB,UAAW,MAAM,
|
|
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.es.js
CHANGED
|
@@ -22,7 +22,7 @@ export { InsertHardbreak, InsertHr, InsertImage, LiftListItem, ModifyImage, Modi
|
|
|
22
22
|
import { $prose, createNode, createPlugin, createShortcut, createMark, AtomList, $remark } from "@milkdown/utils";
|
|
23
23
|
import remarkGFM from "remark-gfm";
|
|
24
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,
|
|
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,8 +36,8 @@ const proseUrlPlugin = () => inputRules({
|
|
|
36
36
|
]
|
|
37
37
|
});
|
|
38
38
|
const urlPlugin = $prose(() => proseUrlPlugin());
|
|
39
|
-
const getFootnoteRefId = (label) => `
|
|
40
|
-
const getFootnoteDefId = (label) => `
|
|
39
|
+
const getFootnoteRefId = (label) => `footnote-ref-${label}`;
|
|
40
|
+
const getFootnoteDefId = (label) => `footnote-def-${label}`;
|
|
41
41
|
const key$1 = new PluginKey("MILKDOWN_PLUGIN_FOOTNOTE_DEF_INPUT");
|
|
42
42
|
const ModifyFootnoteDef = createCmdKey("ModifyFootnoteDef");
|
|
43
43
|
const footnoteDefinition = createNode((utils) => {
|
|
@@ -71,12 +71,19 @@ const footnoteDefinition = createNode((utils) => {
|
|
|
71
71
|
const label = node.attrs["label"];
|
|
72
72
|
const className = utils.getClassName(node.attrs, "footnote-definition");
|
|
73
73
|
const dt = document.createElement("dt");
|
|
74
|
-
dt.textContent = `[
|
|
74
|
+
dt.textContent = `[${label}]:`;
|
|
75
75
|
dt.onclick = () => {
|
|
76
76
|
const view = ctx.get(editorViewCtx);
|
|
77
77
|
const selection = NodeSelection.create(view.state.doc, view.state.selection.from - 2);
|
|
78
78
|
view.dispatch(view.state.tr.setSelection(selection));
|
|
79
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
|
+
};
|
|
80
87
|
return [
|
|
81
88
|
"div",
|
|
82
89
|
{
|
|
@@ -86,19 +93,7 @@ const footnoteDefinition = createNode((utils) => {
|
|
|
86
93
|
id: getFootnoteDefId(label)
|
|
87
94
|
},
|
|
88
95
|
["div", { class: "footnote-definition_content" }, dt, ["dd", 0]],
|
|
89
|
-
[
|
|
90
|
-
"div",
|
|
91
|
-
{ class: "footnote-definition_anchor" },
|
|
92
|
-
[
|
|
93
|
-
"a",
|
|
94
|
-
{
|
|
95
|
-
href: `#${getFootnoteRefId(label)}`,
|
|
96
|
-
"content-editable": "false",
|
|
97
|
-
class: className
|
|
98
|
-
},
|
|
99
|
-
"\u21A9"
|
|
100
|
-
]
|
|
101
|
-
]
|
|
96
|
+
["div", { class: "footnote-definition_anchor" }, a]
|
|
102
97
|
];
|
|
103
98
|
},
|
|
104
99
|
parseMarkdown: {
|
|
@@ -137,42 +132,45 @@ const footnoteDefinition = createNode((utils) => {
|
|
|
137
132
|
return {
|
|
138
133
|
label
|
|
139
134
|
};
|
|
140
|
-
})
|
|
135
|
+
}, () => false)
|
|
141
136
|
],
|
|
142
137
|
prosePlugins: (type, ctx) => {
|
|
143
|
-
const inputChipRenderer = utils.themeManager.get("input-chip", {
|
|
144
|
-
placeholder: "Input Footnote Label",
|
|
145
|
-
onUpdate: (value) => {
|
|
146
|
-
ctx.get(commandsCtx).call(ModifyFootnoteDef, value);
|
|
147
|
-
},
|
|
148
|
-
isBindMode: true
|
|
149
|
-
});
|
|
150
|
-
const shouldDisplay = (view) => {
|
|
151
|
-
return Boolean(type && findSelectedNodeOfType(view.state.selection, type));
|
|
152
|
-
};
|
|
153
|
-
const getCurrentLabel = (view) => {
|
|
154
|
-
const result = findSelectedNodeOfType(view.state.selection, type);
|
|
155
|
-
if (!result)
|
|
156
|
-
return;
|
|
157
|
-
const value = result.node.attrs["label"];
|
|
158
|
-
return value;
|
|
159
|
-
};
|
|
160
|
-
const renderByView = (view) => {
|
|
161
|
-
if (!view.editable) {
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
const display = shouldDisplay(view);
|
|
165
|
-
if (display) {
|
|
166
|
-
inputChipRenderer.show(view);
|
|
167
|
-
inputChipRenderer.update(getCurrentLabel(view));
|
|
168
|
-
} else {
|
|
169
|
-
inputChipRenderer.hide();
|
|
170
|
-
}
|
|
171
|
-
};
|
|
172
138
|
return [
|
|
173
139
|
new Plugin({
|
|
174
140
|
key: key$1,
|
|
175
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(view.hasFocus() && 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
|
+
};
|
|
176
174
|
inputChipRenderer.init(editorView);
|
|
177
175
|
renderByView(editorView);
|
|
178
176
|
return {
|
|
@@ -198,7 +196,7 @@ const footnoteReference = createNode((utils) => {
|
|
|
198
196
|
const id2 = "footnote_reference";
|
|
199
197
|
return {
|
|
200
198
|
id: id2,
|
|
201
|
-
schema: () => ({
|
|
199
|
+
schema: (ctx) => ({
|
|
202
200
|
group: "inline",
|
|
203
201
|
inline: true,
|
|
204
202
|
atom: true,
|
|
@@ -222,6 +220,22 @@ const footnoteReference = createNode((utils) => {
|
|
|
222
220
|
],
|
|
223
221
|
toDOM: (node) => {
|
|
224
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
|
+
};
|
|
225
239
|
return [
|
|
226
240
|
"sup",
|
|
227
241
|
{
|
|
@@ -229,7 +243,7 @@ const footnoteReference = createNode((utils) => {
|
|
|
229
243
|
"data-type": id2,
|
|
230
244
|
id: getFootnoteRefId(label)
|
|
231
245
|
},
|
|
232
|
-
|
|
246
|
+
a
|
|
233
247
|
];
|
|
234
248
|
},
|
|
235
249
|
parseMarkdown: {
|
|
@@ -277,14 +291,17 @@ const footnoteReference = createNode((utils) => {
|
|
|
277
291
|
],
|
|
278
292
|
prosePlugins: (type, ctx) => {
|
|
279
293
|
const inputChipRenderer = utils.themeManager.get("input-chip", {
|
|
294
|
+
width: "12em",
|
|
280
295
|
placeholder: "Input Footnote Label",
|
|
281
296
|
onUpdate: (value) => {
|
|
282
297
|
ctx.get(commandsCtx).call(ModifyFootnoteRef, value);
|
|
283
298
|
},
|
|
284
299
|
isBindMode: true
|
|
285
300
|
});
|
|
301
|
+
if (!inputChipRenderer)
|
|
302
|
+
return [];
|
|
286
303
|
const shouldDisplay = (view) => {
|
|
287
|
-
return Boolean(type && findSelectedNodeOfType(view.state.selection, type));
|
|
304
|
+
return Boolean(view.hasFocus() && type && findSelectedNodeOfType(view.state.selection, type));
|
|
288
305
|
};
|
|
289
306
|
const getCurrentLabel = (view) => {
|
|
290
307
|
const result = findSelectedNodeOfType(view.state.selection, type);
|
|
@@ -740,15 +757,6 @@ function createWidget(ctx, cell, pos, index = 0) {
|
|
|
740
757
|
});
|
|
741
758
|
}
|
|
742
759
|
const operatorPlugin = (ctx, utils) => {
|
|
743
|
-
const items = createActions(ctx);
|
|
744
|
-
const tooltip = document.createElement("div");
|
|
745
|
-
utils.themeManager.onFlush(() => {
|
|
746
|
-
const style = utils.getStyle(injectStyle);
|
|
747
|
-
if (style) {
|
|
748
|
-
tooltip.classList.add(style);
|
|
749
|
-
}
|
|
750
|
-
});
|
|
751
|
-
tooltip.classList.add("table-tooltip", "hide");
|
|
752
760
|
return new Plugin({
|
|
753
761
|
key: new PluginKey("MILKDOWN_TABLE_OP"),
|
|
754
762
|
props: {
|
|
@@ -773,6 +781,15 @@ const operatorPlugin = (ctx, utils) => {
|
|
|
773
781
|
},
|
|
774
782
|
view: (editorView) => {
|
|
775
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");
|
|
776
793
|
Object.values(items).forEach(({ $ }) => tooltip.appendChild($));
|
|
777
794
|
(_a = editorView.dom.parentNode) == null ? void 0 : _a.appendChild(tooltip);
|
|
778
795
|
const listener = (e) => {
|
package/lib/index.es.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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) => `milkdown_footnote_ref_${label}`;\n\nexport const getFootnoteDefId = (label: string) => `milkdown_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 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 [\n 'div',\n { class: 'footnote-definition_anchor' },\n [\n 'a',\n {\n href: `#${getFootnoteRefId(label)}`,\n 'content-editable': 'false',\n class: className,\n },\n '↩',\n ],\n ],\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(/(?:\\[\\^)([^:]+)(?::)$/, nodeType, (match) => {\n const label = match[1] ?? 'footnote';\n return {\n label,\n };\n }),\n ],\n prosePlugins: (type, ctx) => {\n const inputChipRenderer = utils.themeManager.get<ThemeInputChipType>('input-chip', {\n placeholder: 'Input Footnote Label',\n onUpdate: (value) => {\n ctx.get(commandsCtx).call(ModifyFootnoteDef, value);\n },\n isBindMode: true,\n });\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. */\n\nimport { commandsCtx, createCmd, createCmdKey, 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: () => ({\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 return [\n 'sup',\n {\n 'data-label': label,\n 'data-type': id,\n id: getFootnoteRefId(label),\n },\n ['a', { href: `#${getFootnoteDefId(label)}` }, `[${label}]`],\n ];\n },\n parseMarkdown: {\n match: ({ type }) => type === 'footnoteReference',\n runner: (state, node, type) => {\n state.addNode(type, {\n label: node['label'] as string,\n });\n },\n },\n toMarkdown: {\n match: (node) => node.type.name === id,\n runner: (state, node) => {\n state.addNode('footnoteReference', undefined, undefined, {\n label: node.attrs['label'],\n identifier: node.attrs['label'],\n });\n },\n },\n }),\n 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 placeholder: 'Input Footnote Label',\n onUpdate: (value) => {\n ctx.get(commandsCtx).call(ModifyFootnoteRef, value);\n },\n isBindMode: true,\n });\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 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 { 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
|
+
{"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(\n view.hasFocus() && type && findSelectedNodeOfType(view.state.selection, type),\n );\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(view.hasFocus() && 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,
|
|
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.
|
|
3
|
+
"version": "6.0.2",
|
|
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.
|
|
21
|
-
"@milkdown/prose": "6.0.
|
|
22
|
-
"@milkdown/design-system": "6.0.
|
|
23
|
-
"@milkdown/preset-commonmark": "6.0.
|
|
20
|
+
"@milkdown/core": "6.0.2",
|
|
21
|
+
"@milkdown/prose": "6.0.2",
|
|
22
|
+
"@milkdown/design-system": "6.0.2",
|
|
23
|
+
"@milkdown/preset-commonmark": "6.0.2"
|
|
24
24
|
},
|
|
25
25
|
"peerDependencies": {
|
|
26
|
-
"@milkdown/core": "^6.0.
|
|
27
|
-
"@milkdown/prose": "^6.0.
|
|
28
|
-
"@milkdown/preset-commonmark": "^6.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.
|
|
31
|
+
"@milkdown/utils": "6.0.2",
|
|
32
32
|
"remark-gfm": "^3.0.0",
|
|
33
33
|
"tslib": "^2.3.1"
|
|
34
34
|
},
|
|
@@ -49,13 +49,21 @@ export const footnoteDefinition = createNode((utils) => {
|
|
|
49
49
|
const className = utils.getClassName(node.attrs, 'footnote-definition');
|
|
50
50
|
|
|
51
51
|
const dt = document.createElement('dt');
|
|
52
|
-
dt.textContent = `[
|
|
52
|
+
dt.textContent = `[${label}]:`;
|
|
53
53
|
dt.onclick = () => {
|
|
54
54
|
const view = ctx.get(editorViewCtx);
|
|
55
55
|
const selection = NodeSelection.create(view.state.doc, view.state.selection.from - 2);
|
|
56
56
|
view.dispatch(view.state.tr.setSelection(selection));
|
|
57
57
|
};
|
|
58
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
|
+
|
|
59
67
|
return [
|
|
60
68
|
'div',
|
|
61
69
|
{
|
|
@@ -65,19 +73,7 @@ export const footnoteDefinition = createNode((utils) => {
|
|
|
65
73
|
id: getFootnoteDefId(label),
|
|
66
74
|
},
|
|
67
75
|
['div', { class: 'footnote-definition_content' }, dt, ['dd', 0]],
|
|
68
|
-
[
|
|
69
|
-
'div',
|
|
70
|
-
{ class: 'footnote-definition_anchor' },
|
|
71
|
-
[
|
|
72
|
-
'a',
|
|
73
|
-
{
|
|
74
|
-
href: `#${getFootnoteRefId(label)}`,
|
|
75
|
-
'content-editable': 'false',
|
|
76
|
-
class: className,
|
|
77
|
-
},
|
|
78
|
-
'↩',
|
|
79
|
-
],
|
|
80
|
-
],
|
|
76
|
+
['div', { class: 'footnote-definition_anchor' }, a],
|
|
81
77
|
];
|
|
82
78
|
},
|
|
83
79
|
parseMarkdown: {
|
|
@@ -117,47 +113,56 @@ export const footnoteDefinition = createNode((utils) => {
|
|
|
117
113
|
}),
|
|
118
114
|
],
|
|
119
115
|
inputRules: (nodeType) => [
|
|
120
|
-
wrappingInputRule(
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
116
|
+
wrappingInputRule(
|
|
117
|
+
/(?:\[\^)([^:]+)(?::)$/,
|
|
118
|
+
nodeType,
|
|
119
|
+
(match) => {
|
|
120
|
+
const label = match[1] ?? 'footnote';
|
|
121
|
+
return {
|
|
122
|
+
label,
|
|
123
|
+
};
|
|
124
|
+
},
|
|
125
|
+
() => false,
|
|
126
|
+
),
|
|
126
127
|
],
|
|
127
128
|
prosePlugins: (type, ctx) => {
|
|
128
|
-
const inputChipRenderer = utils.themeManager.get<ThemeInputChipType>('input-chip', {
|
|
129
|
-
placeholder: 'Input Footnote Label',
|
|
130
|
-
onUpdate: (value) => {
|
|
131
|
-
ctx.get(commandsCtx).call(ModifyFootnoteDef, value);
|
|
132
|
-
},
|
|
133
|
-
isBindMode: true,
|
|
134
|
-
});
|
|
135
|
-
const shouldDisplay = (view: EditorView) => {
|
|
136
|
-
return Boolean(type && findSelectedNodeOfType(view.state.selection, type));
|
|
137
|
-
};
|
|
138
|
-
const getCurrentLabel = (view: EditorView) => {
|
|
139
|
-
const result = findSelectedNodeOfType(view.state.selection, type);
|
|
140
|
-
if (!result) return;
|
|
141
|
-
|
|
142
|
-
const value = result.node.attrs['label'];
|
|
143
|
-
return value;
|
|
144
|
-
};
|
|
145
|
-
const renderByView = (view: EditorView) => {
|
|
146
|
-
if (!view.editable) {
|
|
147
|
-
return;
|
|
148
|
-
}
|
|
149
|
-
const display = shouldDisplay(view);
|
|
150
|
-
if (display) {
|
|
151
|
-
inputChipRenderer.show(view);
|
|
152
|
-
inputChipRenderer.update(getCurrentLabel(view));
|
|
153
|
-
} else {
|
|
154
|
-
inputChipRenderer.hide();
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
129
|
return [
|
|
158
130
|
new Plugin({
|
|
159
131
|
key,
|
|
160
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(
|
|
144
|
+
view.hasFocus() && type && findSelectedNodeOfType(view.state.selection, type),
|
|
145
|
+
);
|
|
146
|
+
};
|
|
147
|
+
const getCurrentLabel = (view: EditorView) => {
|
|
148
|
+
const result = findSelectedNodeOfType(view.state.selection, type);
|
|
149
|
+
if (!result) return;
|
|
150
|
+
|
|
151
|
+
const value = result.node.attrs['label'];
|
|
152
|
+
return value;
|
|
153
|
+
};
|
|
154
|
+
const renderByView = (view: EditorView) => {
|
|
155
|
+
if (!view.editable) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const display = shouldDisplay(view);
|
|
159
|
+
if (display) {
|
|
160
|
+
inputChipRenderer.show(view);
|
|
161
|
+
inputChipRenderer.update(getCurrentLabel(view));
|
|
162
|
+
} else {
|
|
163
|
+
inputChipRenderer.hide();
|
|
164
|
+
}
|
|
165
|
+
};
|
|
161
166
|
inputChipRenderer.init(editorView);
|
|
162
167
|
renderByView(editorView);
|
|
163
168
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/* Copyright 2021, Milkdown by Mirone. */
|
|
2
2
|
|
|
3
|
-
import { commandsCtx, createCmd, createCmdKey, ThemeInputChipType } from '@milkdown/core';
|
|
3
|
+
import { commandsCtx, createCmd, createCmdKey, editorViewCtx, ThemeInputChipType } from '@milkdown/core';
|
|
4
4
|
import { EditorView, findSelectedNodeOfType, InputRule, NodeSelection, Plugin, PluginKey } from '@milkdown/prose';
|
|
5
5
|
import { createNode } from '@milkdown/utils';
|
|
6
6
|
|
|
@@ -14,7 +14,7 @@ export const footnoteReference = createNode((utils) => {
|
|
|
14
14
|
|
|
15
15
|
return {
|
|
16
16
|
id,
|
|
17
|
-
schema: () => ({
|
|
17
|
+
schema: (ctx) => ({
|
|
18
18
|
group: 'inline',
|
|
19
19
|
inline: true,
|
|
20
20
|
atom: true,
|
|
@@ -38,6 +38,22 @@ export const footnoteReference = createNode((utils) => {
|
|
|
38
38
|
],
|
|
39
39
|
toDOM: (node) => {
|
|
40
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
|
+
};
|
|
41
57
|
return [
|
|
42
58
|
'sup',
|
|
43
59
|
{
|
|
@@ -45,7 +61,7 @@ export const footnoteReference = createNode((utils) => {
|
|
|
45
61
|
'data-type': id,
|
|
46
62
|
id: getFootnoteRefId(label),
|
|
47
63
|
},
|
|
48
|
-
|
|
64
|
+
a,
|
|
49
65
|
];
|
|
50
66
|
},
|
|
51
67
|
parseMarkdown: {
|
|
@@ -98,14 +114,16 @@ export const footnoteReference = createNode((utils) => {
|
|
|
98
114
|
],
|
|
99
115
|
prosePlugins: (type, ctx) => {
|
|
100
116
|
const inputChipRenderer = utils.themeManager.get<ThemeInputChipType>('input-chip', {
|
|
117
|
+
width: '12em',
|
|
101
118
|
placeholder: 'Input Footnote Label',
|
|
102
119
|
onUpdate: (value) => {
|
|
103
120
|
ctx.get(commandsCtx).call(ModifyFootnoteRef, value);
|
|
104
121
|
},
|
|
105
122
|
isBindMode: true,
|
|
106
123
|
});
|
|
124
|
+
if (!inputChipRenderer) return [];
|
|
107
125
|
const shouldDisplay = (view: EditorView) => {
|
|
108
|
-
return Boolean(type && findSelectedNodeOfType(view.state.selection, type));
|
|
126
|
+
return Boolean(view.hasFocus() && type && findSelectedNodeOfType(view.state.selection, type));
|
|
109
127
|
};
|
|
110
128
|
const getCurrentLabel = (view: EditorView) => {
|
|
111
129
|
const result = findSelectedNodeOfType(view.state.selection, type);
|
package/src/footnote/utils.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
/* Copyright 2021, Milkdown by Mirone. */
|
|
2
|
-
export const getFootnoteRefId = (label: string) => `
|
|
2
|
+
export const getFootnoteRefId = (label: string) => `footnote-ref-${label}`;
|
|
3
3
|
|
|
4
|
-
export const getFootnoteDefId = (label: string) => `
|
|
4
|
+
export const getFootnoteDefId = (label: string) => `footnote-def-${label}`;
|
|
@@ -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
|
|