@milkdown/preset-gfm 5.4.1 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.es.js CHANGED
@@ -23,7 +23,7 @@ import { $prose, createPlugin, createShortcut, createMark, createNode, AtomList,
23
23
  import remarkGFM from "remark-gfm";
24
24
  import { inputRules, InputRule, isInTable, Selection, findParentNode, TableMap, tableNodeTypes, CellSelection, cloneTr, addColumnBefore, addColumnAfter, selectedRect, setCellAttr, deleteTable, deleteColumn, deleteRow, calculateNodePosition, Decoration, Plugin, PluginKey, DecorationSet, tableNodes, TextSelection, goToNextCell, columnResizing, tableEditing, markRule, toggleMark, wrappingInputRule, splitListItem, sinkListItem, liftListItem, wrapIn } from "@milkdown/prose";
25
25
  import { themeToolCtx, createCmdKey, schemaCtx, createCmd } from "@milkdown/core";
26
- const urlRegex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/;
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: [
29
29
  new InputRule(urlRegex, (state, match, start, end) => {
@@ -47,7 +47,7 @@ const exitTable = (node) => (state, dispatch) => {
47
47
  dispatch == null ? void 0 : dispatch(tr.scrollIntoView());
48
48
  return true;
49
49
  };
50
- const findTable = (selection) => findParentNode((node) => node.type.spec.tableRole === "table")(selection);
50
+ const findTable = (selection) => findParentNode((node) => node.type.spec["tableRole"] === "table")(selection);
51
51
  const getCellsInColumn = (columnIndex) => (selection) => {
52
52
  const table2 = findTable(selection);
53
53
  if (!table2)
@@ -131,10 +131,13 @@ const getCellsInTable = (selection) => {
131
131
  };
132
132
  const selectTable = (tr) => {
133
133
  const cells = getCellsInTable(tr.selection);
134
- if (cells) {
134
+ if (cells && cells[0]) {
135
135
  const $firstCell = tr.doc.resolve(cells[0].pos);
136
- const $lastCell = tr.doc.resolve(cells[cells.length - 1].pos);
137
- return cloneTr(tr.setSelection(new CellSelection($lastCell, $firstCell)));
136
+ const last = cells[cells.length - 1];
137
+ if (last) {
138
+ const $lastCell = tr.doc.resolve(last.pos);
139
+ return cloneTr(tr.setSelection(new CellSelection($lastCell, $firstCell)));
140
+ }
138
141
  }
139
142
  return tr;
140
143
  };
@@ -145,7 +148,7 @@ function addRowWithAlignment(tr, { map, tableStart, table: table2 }, row) {
145
148
  const { cell: cellType, row: rowType } = tableNodeTypes(table2.type.schema);
146
149
  const cells = Array(map.width).fill(0).map((_, col) => {
147
150
  const headerCol = table2.nodeAt(map.map[col]);
148
- return cellType.createAndFill({ alignment: headerCol == null ? void 0 : headerCol.attrs.alignment });
151
+ return cellType.createAndFill({ alignment: headerCol == null ? void 0 : headerCol.attrs["alignment"] });
149
152
  });
150
153
  tr.insert(rowPos, rowType.create(null, cells));
151
154
  return tr;
@@ -657,7 +660,7 @@ const table = createPlugin((utils) => {
657
660
  parseMarkdown: {
658
661
  match: (node) => node.type === "table",
659
662
  runner: (state, node, type) => {
660
- const align = node.align;
663
+ const align = node["align"];
661
664
  const children = node.children.map((x, i) => __spreadProps(__spreadValues({}, x), {
662
665
  align,
663
666
  isHeader: i === 0
@@ -676,7 +679,7 @@ const table = createPlugin((utils) => {
676
679
  return;
677
680
  const align = [];
678
681
  firstLine.forEach((cell) => {
679
- align.push(cell.attrs.alignment);
682
+ align.push(cell.attrs["alignment"]);
680
683
  });
681
684
  state.openNode("table", void 0, { align });
682
685
  state.next(node.content);
@@ -688,10 +691,10 @@ const table = createPlugin((utils) => {
688
691
  parseMarkdown: {
689
692
  match: (node) => node.type === "tableRow",
690
693
  runner: (state, node, type) => {
691
- const align = node.align;
694
+ const align = node["align"];
692
695
  const children = node.children.map((x, i) => __spreadProps(__spreadValues({}, x), {
693
696
  align: align[i],
694
- isHeader: node.isHeader
697
+ isHeader: node["isHeader"]
695
698
  }));
696
699
  state.openNode(type);
697
700
  state.next(children);
@@ -709,10 +712,10 @@ const table = createPlugin((utils) => {
709
712
  }),
710
713
  table_cell: __spreadProps(__spreadValues({}, schema.table_cell), {
711
714
  parseMarkdown: {
712
- match: (node) => node.type === "tableCell" && !node.isHeader,
715
+ match: (node) => node.type === "tableCell" && !node["isHeader"],
713
716
  runner: (state, node, type) => {
714
- const align = node.align;
715
- state.openNode(type, { alignment: align }).openNode(state.schema.nodes.paragraph).next(node.children).closeNode().closeNode();
717
+ const align = node["align"];
718
+ state.openNode(type, { alignment: align }).openNode(state.schema.nodes["paragraph"]).next(node.children).closeNode().closeNode();
716
719
  }
717
720
  },
718
721
  toMarkdown: {
@@ -724,11 +727,11 @@ const table = createPlugin((utils) => {
724
727
  }),
725
728
  table_header: __spreadProps(__spreadValues({}, schema.table_header), {
726
729
  parseMarkdown: {
727
- match: (node) => node.type === "tableCell" && !!node.isHeader,
730
+ match: (node) => node.type === "tableCell" && !!node["isHeader"],
728
731
  runner: (state, node, type) => {
729
- const align = node.align;
732
+ const align = node["align"];
730
733
  state.openNode(type, { alignment: align });
731
- state.openNode(state.schema.nodes.paragraph);
734
+ state.openNode(state.schema.nodes["paragraph"]);
732
735
  state.next(node.children);
733
736
  state.closeNode();
734
737
  state.closeNode();
@@ -758,7 +761,7 @@ const table = createPlugin((utils) => {
758
761
  commands: (_, ctx) => [
759
762
  createCmd(PrevCell, () => goToNextCell(-1)),
760
763
  createCmd(NextCell, () => goToNextCell(1)),
761
- createCmd(BreakTable, () => exitTable(ctx.get(schemaCtx).nodes.paragraph)),
764
+ createCmd(BreakTable, () => exitTable(ctx.get(schemaCtx).nodes["paragraph"])),
762
765
  createCmd(InsertTable, () => (state, dispatch) => {
763
766
  const { selection, tr } = state;
764
767
  const { from } = selection;
@@ -895,7 +898,7 @@ const taskListItem = createNode((utils) => {
895
898
  if (!(dom instanceof HTMLElement)) {
896
899
  throw new Error();
897
900
  }
898
- return { checked: dom.dataset.checked === "true" };
901
+ return { checked: dom.dataset["checked"] === "true" };
899
902
  }
900
903
  }
901
904
  ],
@@ -903,7 +906,7 @@ const taskListItem = createNode((utils) => {
903
906
  "li",
904
907
  {
905
908
  "data-type": "task-item",
906
- "data-checked": node.attrs.checked ? "true" : "false",
909
+ "data-checked": node.attrs["checked"] ? "true" : "false",
907
910
  class: utils.getClassName(node.attrs, "task-list-item", style)
908
911
  },
909
912
  0
@@ -913,7 +916,7 @@ const taskListItem = createNode((utils) => {
913
916
  return type === "listItem" && checked !== null;
914
917
  },
915
918
  runner: (state, node, type) => {
916
- state.openNode(type, { checked: node.checked });
919
+ state.openNode(type, { checked: node["checked"] });
917
920
  state.next(node.children);
918
921
  state.closeNode();
919
922
  }
@@ -921,7 +924,7 @@ const taskListItem = createNode((utils) => {
921
924
  toMarkdown: {
922
925
  match: (node) => node.type.name === id,
923
926
  runner: (state, node) => {
924
- state.openNode("listItem", void 0, { checked: node.attrs.checked });
927
+ state.openNode("listItem", void 0, { checked: node.attrs["checked"] });
925
928
  state.next(node.content);
926
929
  state.closeNode();
927
930
  }
@@ -974,34 +977,34 @@ const taskListItem = createNode((utils) => {
974
977
  }));
975
978
  };
976
979
  checkbox.addEventListener("change", onChange);
977
- listItem2.dataset.checked = node.attrs.checked;
978
- if (node.attrs.checked) {
980
+ listItem2.dataset["checked"] = node.attrs["checked"];
981
+ if (node.attrs["checked"]) {
979
982
  checkbox.setAttribute("checked", "checked");
980
983
  }
981
984
  checkboxWrapper.append(checkbox, checkboxStyler);
982
985
  listItem2.append(checkboxWrapper, content);
983
986
  const attributes = {
984
987
  "data-type": "task-item",
985
- "data-checked": node.attrs.checked ? "true" : "false",
988
+ "data-checked": node.attrs["checked"] ? "true" : "false",
986
989
  class: utils.getClassName(node.attrs, "task-list-item", style)
987
990
  };
988
991
  Object.entries(attributes).forEach(([key, value]) => {
989
992
  listItem2.setAttribute(key, value);
990
993
  });
991
- setIcon(node.attrs.checked ? "checked" : "unchecked");
994
+ setIcon(node.attrs["checked"] ? "checked" : "unchecked");
992
995
  return {
993
996
  dom: listItem2,
994
997
  contentDOM: content,
995
998
  update: (updatedNode) => {
996
999
  if (updatedNode.type.name !== id)
997
1000
  return false;
998
- listItem2.dataset.checked = updatedNode.attrs.checked;
999
- if (updatedNode.attrs.checked) {
1001
+ listItem2.dataset["checked"] = updatedNode.attrs["checked"];
1002
+ if (updatedNode.attrs["checked"]) {
1000
1003
  checkbox.setAttribute("checked", "checked");
1001
1004
  } else {
1002
1005
  checkbox.removeAttribute("checked");
1003
1006
  }
1004
- setIcon(updatedNode.attrs.checked ? "checked" : "unchecked");
1007
+ setIcon(updatedNode.attrs["checked"] ? "checked" : "unchecked");
1005
1008
  return true;
1006
1009
  },
1007
1010
  destroy: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.es.js","sources":["../src/auto-link.ts","../src/table/command.ts","../src/table/utils.ts","../src/table/operator-plugin/helper.ts","../src/table/operator-plugin/actions.ts","../src/table/operator-plugin/calc-pos.ts","../src/table/operator-plugin/constant.ts","../src/table/operator-plugin/style.ts","../src/table/operator-plugin/widget.ts","../src/table/operator-plugin/index.ts","../src/table/nodes/schema.ts","../src/table/nodes/style.ts","../src/table/nodes/index.ts","../src/supported-keys.ts","../src/strike-through.ts","../src/task-list-item.ts","../src/index.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nimport { InputRule, inputRules } from '@milkdown/prose';\nimport { $prose } from '@milkdown/utils';\n\nconst urlRegex = /https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/;\n\nconst proseUrlPlugin = () =>\n inputRules({\n rules: [\n new InputRule(urlRegex, (state, match, start, end) => {\n const { schema } = state;\n const [text] = match;\n if (!text) return null;\n\n return state.tr\n .replaceWith(start, end, schema.text(text))\n .addMark(start, text.length + start, schema.marks.link.create({ href: text }));\n }),\n ],\n });\n\nexport const urlPlugin = $prose(() => proseUrlPlugin());\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Command, isInTable, Node, NodeType, Selection } from '@milkdown/prose';\n\nexport const exitTable =\n (node: NodeType): Command =>\n (state, dispatch) => {\n if (!isInTable(state)) {\n return false;\n }\n const { $head } = state.selection;\n const pos = $head.after();\n const tr = state.tr.replaceWith(pos, pos, node.createAndFill() as Node);\n tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n dispatch?.(tr.scrollIntoView());\n return true;\n };\n","/* Copyright 2021, Milkdown by Mirone. */\nimport {\n CellSelection,\n cloneTr,\n findParentNode,\n Node as ProsemirrorNode,\n Schema,\n Selection,\n TableMap,\n tableNodeTypes,\n TableRect,\n Transaction,\n} from '@milkdown/prose';\n\nexport type CellPos = {\n pos: number;\n start: number;\n node: ProsemirrorNode;\n};\n\nexport const findTable = (selection: Selection) =>\n findParentNode((node) => node.type.spec.tableRole === 'table')(selection);\n\nexport const getCellsInColumn =\n (columnIndex: number) =>\n (selection: Selection): CellPos[] | undefined => {\n const table = findTable(selection);\n if (!table) return undefined;\n const map = TableMap.get(table.node);\n if (columnIndex < 0 || columnIndex >= map.width) {\n return undefined;\n }\n\n return map.cellsInRect({ left: columnIndex, right: columnIndex + 1, top: 0, bottom: map.height }).map((pos) => {\n const node = table.node.nodeAt(pos);\n if (!node) throw new Error();\n const start = pos + table.start;\n return {\n pos: start,\n start: start + 1,\n node,\n };\n });\n };\n\nexport const getCellsInRow =\n (rowIndex: number) =>\n (selection: Selection): CellPos[] | undefined => {\n const table = findTable(selection);\n if (!table) return undefined;\n const map = TableMap.get(table.node);\n if (rowIndex < 0 || rowIndex >= map.height) {\n return undefined;\n }\n\n return map.cellsInRect({ left: 0, right: map.width, top: rowIndex, bottom: rowIndex + 1 }).map((pos) => {\n const node = table.node.nodeAt(pos);\n if (!node) throw new Error();\n const start = pos + table.start;\n return {\n pos: start,\n start: start + 1,\n node,\n };\n });\n };\n\nexport const createTable = (schema: Schema, rowsCount = 3, colsCount = 3) => {\n const { cell: tableCell, header_cell: tableHeader, row: tableRow, table } = tableNodeTypes(schema);\n\n const cells = Array(colsCount)\n .fill(0)\n .map(() => tableCell.createAndFill(null) as ProsemirrorNode);\n\n const headerCells = Array(colsCount)\n .fill(0)\n .map(() => tableHeader.createAndFill(null) as ProsemirrorNode);\n\n const rows = Array(rowsCount)\n .fill(0)\n .map((_, i) => tableRow.create(null, i === 0 ? headerCells : cells));\n\n return table.create(null, rows);\n};\n\nexport const selectLine = (type: 'row' | 'col') => (index: number) => (tr: Transaction) => {\n const table = findTable(tr.selection);\n const isRowSelection = type === 'row';\n if (table) {\n const map = TableMap.get(table.node);\n\n // Check if the index is valid\n if (index >= 0 && index < (isRowSelection ? map.height : map.width)) {\n const lastCell = map.positionAt(\n isRowSelection ? index : map.height - 1,\n isRowSelection ? map.width - 1 : index,\n table.node,\n );\n const $lastCell = tr.doc.resolve(table.start + lastCell);\n\n const createCellSelection = isRowSelection ? CellSelection.rowSelection : CellSelection.colSelection;\n\n const firstCell = map.positionAt(isRowSelection ? index : 0, isRowSelection ? 0 : index, table.node);\n const $firstCell = tr.doc.resolve(table.start + firstCell);\n return cloneTr(tr.setSelection(createCellSelection($lastCell, $firstCell) as unknown as Selection));\n }\n }\n return tr;\n};\n\nexport const getCellsInTable = (selection: Selection) => {\n const table = findTable(selection);\n if (!table) {\n return;\n }\n const map = TableMap.get(table.node);\n const cells = map.cellsInRect({\n left: 0,\n right: map.width,\n top: 0,\n bottom: map.height,\n });\n return cells.map((nodePos) => {\n const node = table.node.nodeAt(nodePos);\n const pos = nodePos + table.start;\n return { pos, start: pos + 1, node };\n });\n};\n\nexport const selectTable = (tr: Transaction) => {\n const cells = getCellsInTable(tr.selection);\n if (cells) {\n const $firstCell = tr.doc.resolve(cells[0].pos);\n const $lastCell = tr.doc.resolve(cells[cells.length - 1].pos);\n return cloneTr(tr.setSelection(new CellSelection($lastCell, $firstCell) as unknown as Selection));\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]);\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]) === -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, themeToolCtx } 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(themeToolCtx).slots.icon('leftArrow'),\n command: () => addColumnBefore,\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AddColRight]: {\n $: ctx.get(themeToolCtx).slots.icon('rightArrow'),\n command: () => addColumnAfter,\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AddRowTop]: {\n $: ctx.get(themeToolCtx).slots.icon('upArrow'),\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(themeToolCtx).slots.icon('downArrow'),\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(themeToolCtx).slots.icon('alignLeft'),\n command: () => setCellAttr('alignment', 'left'),\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AlignCenter]: {\n $: ctx.get(themeToolCtx).slots.icon('alignCenter'),\n command: () => setCellAttr('alignment', 'center'),\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AlignRight]: {\n $: ctx.get(themeToolCtx).slots.icon('alignRight'),\n command: () => setCellAttr('alignment', 'right'),\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.Delete]: {\n $: ctx.get(themeToolCtx).slots.icon('delete'),\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, ThemeTool } from '@milkdown/core';\n\nexport const injectStyle = ({ size, mixin, palette }: ThemeTool, { css }: Emotion) => 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: ${size.radius};\n\n ${mixin.border?.()};\n\n ${mixin.shadow?.()};\n\n overflow: hidden;\n background: ${palette('surface')};\n\n .icon {\n position: relative;\n color: ${palette('solid', 0.87)};\n\n width: 3rem;\n line-height: 3rem;\n text-align: center;\n transition: all 0.4s ease-in-out;\n &:hover {\n background-color: ${palette('secondary', 0.12)};\n }\n &.active {\n color: ${palette('primary')};\n }\n &:not(:last-child)::after {\n content: '';\n position: absolute;\n right: 0px;\n top: 0;\n width: ${size.lineWidth};\n bottom: 0;\n background: ${palette('line')};\n }\n }\n &.hide,\n .hide {\n display: none;\n }\n`;\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { Ctx, themeToolCtx } 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 const widget = 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(themeToolCtx).slots.icon('select'));\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 return widget;\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 { 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 const style = utils.getStyle(injectStyle);\n if (style) {\n tooltip.classList.add(style);\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, 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 { Emotion } from '@milkdown/design-system';\nimport { Utils } from '@milkdown/utils';\n\nconst proseTableStyle = ({ css }: Emotion) => css`\n /* copy from https://github.com/ProseMirror/prosemirror-tables/blob/master/style/tables.css */\n .ProseMirror .tableWrapper {\n overflow-x: auto;\n }\n .ProseMirror table {\n border-collapse: collapse;\n table-layout: fixed;\n width: 100%;\n overflow: hidden;\n }\n .ProseMirror td,\n .ProseMirror th {\n vertical-align: top;\n box-sizing: border-box;\n position: relative;\n }\n .ProseMirror .column-resize-handle {\n position: absolute;\n right: -2px;\n top: 0;\n bottom: 0;\n width: 4px;\n z-index: 20;\n background-color: #adf;\n pointer-events: none;\n }\n .ProseMirror.resize-cursor {\n cursor: ew-resize;\n cursor: col-resize;\n }\n /* Give selected cells a blue overlay */\n .ProseMirror .selectedCell:after {\n z-index: 2;\n position: absolute;\n content: '';\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background: rgba(200, 200, 255, 0.4);\n pointer-events: none;\n }\n`;\n\nexport const injectStyle = (utils: Utils) => {\n return utils.getStyle(({ size, palette, mixin }, emotion) => {\n const css = emotion.injectGlobal;\n css`\n ${proseTableStyle(emotion)}\n\n .tableWrapper {\n margin: 0 !important;\n\n ${mixin.scrollbar?.('x')};\n\n width: 100%;\n\n table {\n width: calc(100% - 2rem) !important;\n border-radius: ${size.radius};\n box-sizing: border-box;\n margin: 1rem 0 1rem 1rem !important;\n overflow: auto !important;\n * {\n margin: 0 !important;\n box-sizing: border-box;\n font-size: 1rem;\n }\n tr {\n ${mixin.border?.('bottom')};\n }\n\n th {\n background: ${palette('background', 0.5)};\n font-weight: 400;\n }\n\n th,\n td {\n min-width: 100px;\n ${mixin.border?.()};\n text-align: left;\n position: relative;\n line-height: 3rem;\n box-sizing: border-box;\n height: 3rem;\n }\n\n .selectedCell {\n &::after {\n background: ${palette('secondary', 0.38)};\n }\n & ::selection {\n background: transparent;\n }\n }\n\n .column-resize-handle {\n background: ${palette('primary')};\n width: ${size.lineWidth};\n }\n\n th,\n td {\n padding: 0 1rem;\n p {\n line-height: unset !important;\n }\n }\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 &:hover::after {\n background: ${palette('secondary', 0.38)};\n }\n }\n\n .milkdown-cell-left {\n left: calc(-6px - 0.5rem);\n top: 0;\n bottom: 0;\n width: 0.5rem;\n }\n\n .milkdown-cell-top {\n left: 0;\n right: 0;\n top: calc(-6px - 0.5rem);\n height: 0.5rem;\n }\n\n .milkdown-cell-point {\n left: calc(-2px - 1rem);\n top: calc(-2px - 1rem);\n width: 1rem;\n height: 1rem;\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","/* Copyright 2021, Milkdown by Mirone. */\nimport { createCmd, createCmdKey, MarkdownNode, schemaCtx } from '@milkdown/core';\nimport { columnResizing, goToNextCell, InputRule, Selection, tableEditing, TextSelection } 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';\nimport { injectStyle } from './style';\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 injectStyle(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)\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);\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)),\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\nexport const strikeThrough = createMark<Keys>((utils) => {\n const id = 'strike_through';\n const style = utils.getStyle(\n (themeTool, { css }) =>\n css`\n text-decoration-color: ${themeTool.palette('secondary')};\n `,\n );\n\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', style) }],\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, themeToolCtx } from '@milkdown/core';\nimport type { Icon } from '@milkdown/design-system';\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 const style = utils.getStyle(\n ({ palette, size }, { css }) =>\n css`\n list-style-type: none;\n position: relative;\n\n & > div {\n overflow: hidden;\n padding: 0 2px;\n }\n\n label {\n position: absolute;\n top: 0;\n left: -2rem;\n display: inline-block;\n width: 1.5rem;\n height: 1.5rem;\n margin: 0.5rem 0;\n input {\n visibility: hidden;\n }\n }\n label:before {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n border-radius: ${size.radius};\n }\n label:hover:before {\n background: ${palette('background')};\n }\n &[data-checked='true'] {\n label {\n color: ${palette('primary')};\n }\n }\n &[data-checked='false'] {\n label {\n color: ${palette('solid', 0.87)};\n }\n }\n .paragraph {\n margin: 0.5rem 0;\n }\n `,\n );\n\n return {\n id,\n schema: () => ({\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 'li',\n {\n 'data-type': 'task-item',\n 'data-checked': node.attrs.checked ? 'true' : 'false',\n class: utils.getClassName(node.attrs, 'task-list-item', style),\n },\n 0,\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: (ctx) => (node, view, getPos) => {\n const createIcon = ctx.get(themeToolCtx).slots.icon;\n\n const listItem = document.createElement('li');\n const checkboxWrapper = document.createElement('label');\n const checkboxStyler = document.createElement('span');\n const checkbox = document.createElement('input');\n const content = document.createElement('div');\n\n let icon = createIcon('unchecked');\n checkboxWrapper.appendChild(icon);\n const setIcon = (name: Icon) => {\n const nextIcon = createIcon(name);\n checkboxWrapper.replaceChild(nextIcon, icon);\n icon = nextIcon;\n };\n\n checkboxWrapper.contentEditable = 'false';\n checkbox.type = 'checkbox';\n const onChange = (event: Event) => {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) return;\n\n if (!view.editable) {\n checkbox.checked = !checkbox.checked;\n\n return;\n }\n\n const { tr } = view.state;\n\n view.dispatch(\n tr.setNodeMarkup(getPos(), undefined, {\n checked: target.checked,\n }),\n );\n };\n checkbox.addEventListener('change', onChange);\n\n listItem.dataset.checked = node.attrs.checked;\n if (node.attrs.checked) {\n checkbox.setAttribute('checked', 'checked');\n }\n\n checkboxWrapper.append(checkbox, checkboxStyler);\n listItem.append(checkboxWrapper, content);\n\n const attributes = {\n 'data-type': 'task-item',\n 'data-checked': node.attrs.checked ? 'true' : 'false',\n class: utils.getClassName(node.attrs, 'task-list-item', style),\n };\n Object.entries(attributes).forEach(([key, value]) => {\n listItem.setAttribute(key, value);\n });\n setIcon(node.attrs.checked ? 'checked' : 'unchecked');\n\n return {\n dom: listItem,\n contentDOM: content,\n update: (updatedNode) => {\n if (updatedNode.type.name !== id) return false;\n\n listItem.dataset.checked = updatedNode.attrs.checked;\n if (updatedNode.attrs.checked) {\n checkbox.setAttribute('checked', 'checked');\n } else {\n checkbox.removeAttribute('checked');\n }\n setIcon(updatedNode.attrs.checked ? 'checked' : 'unchecked');\n\n return true;\n },\n destroy: () => {\n checkbox.removeEventListener('change', onChange);\n },\n };\n },\n };\n});\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { commands as commonmarkCommands, commonmark } from '@milkdown/preset-commonmark';\nimport { $remark, AtomList } from '@milkdown/utils';\nimport remarkGFM from 'remark-gfm';\n\nimport { urlPlugin } from './auto-link';\nimport { strikeThrough, ToggleStrikeThrough } from './strike-through';\nimport { table } from './table';\nimport {\n LiftTaskListItem,\n SinkTaskListItem,\n SplitTaskListItem,\n taskListItem,\n TurnIntoTaskList,\n} from './task-list-item';\n\nexport * from './strike-through';\nexport { SupportedKeys } from './supported-keys';\nexport {\n BreakTable,\n // command\n createTable,\n InsertTable,\n NextCell,\n PrevCell,\n // gather\n table,\n} from './table';\nexport * from './task-list-item';\nexport {\n blockquote,\n bulletList,\n codeFence,\n codeInline,\n commonmark,\n // gather\n commonmarkNodes,\n commonmarkPlugins,\n // node\n doc,\n em,\n hardbreak,\n heading,\n hr,\n image,\n // command\n InsertHardbreak,\n InsertHr,\n InsertImage,\n LiftListItem,\n link,\n listItem,\n ModifyImage,\n ModifyLink,\n orderedList,\n paragraph,\n SinkListItem,\n SplitListItem,\n strong,\n text,\n ToggleBold,\n ToggleInlineCode,\n ToggleItalic,\n ToggleLink,\n TurnIntoCodeFence,\n TurnIntoHeading,\n TurnIntoText,\n WrapInBlockquote,\n WrapInBulletList,\n WrapInOrderedList,\n} from '@milkdown/preset-commonmark';\n\nexport const gfm = AtomList.create([\n ...commonmark,\n $remark(() => remarkGFM),\n table(),\n urlPlugin,\n strikeThrough(),\n taskListItem(),\n]);\n\nexport const commands = {\n ...commonmarkCommands,\n ToggleStrikeThrough,\n TurnIntoTaskList,\n SinkTaskListItem,\n LiftTaskListItem,\n SplitTaskListItem,\n} as const;\nexport type Commands = typeof commands;\n"],"names":["injectStyle","tableNodesSpecCreator","SupportedKeys","CommonmarkKeys","TableKeys","commonmarkCommands"],"mappings":"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"}
1
+ {"version":3,"file":"index.es.js","sources":["../src/auto-link.ts","../src/table/command.ts","../src/table/utils.ts","../src/table/operator-plugin/helper.ts","../src/table/operator-plugin/actions.ts","../src/table/operator-plugin/calc-pos.ts","../src/table/operator-plugin/constant.ts","../src/table/operator-plugin/style.ts","../src/table/operator-plugin/widget.ts","../src/table/operator-plugin/index.ts","../src/table/nodes/schema.ts","../src/table/nodes/style.ts","../src/table/nodes/index.ts","../src/supported-keys.ts","../src/strike-through.ts","../src/task-list-item.ts","../src/index.ts"],"sourcesContent":["/* Copyright 2021, Milkdown by Mirone. */\nimport { InputRule, inputRules } from '@milkdown/prose';\nimport { $prose } from '@milkdown/utils';\n\nconst urlRegex = /https?:\\/\\/(www\\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/;\n\nconst proseUrlPlugin = () =>\n inputRules({\n rules: [\n new InputRule(urlRegex, (state, match, start, end) => {\n const { schema } = state;\n const [text] = match;\n if (!text) return null;\n\n return state.tr\n .replaceWith(start, end, schema.text(text))\n .addMark(start, text.length + start, schema.marks.link.create({ href: text }));\n }),\n ],\n });\n\nexport const urlPlugin = $prose(() => proseUrlPlugin());\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Command, isInTable, Node, NodeType, Selection } from '@milkdown/prose';\n\nexport const exitTable =\n (node: NodeType): Command =>\n (state, dispatch) => {\n if (!isInTable(state)) {\n return false;\n }\n const { $head } = state.selection;\n const pos = $head.after();\n const tr = state.tr.replaceWith(pos, pos, node.createAndFill() as Node);\n tr.setSelection(Selection.near(tr.doc.resolve(pos), 1));\n dispatch?.(tr.scrollIntoView());\n return true;\n };\n","/* Copyright 2021, Milkdown by Mirone. */\nimport {\n CellSelection,\n cloneTr,\n findParentNode,\n Node as ProsemirrorNode,\n Schema,\n Selection,\n TableMap,\n tableNodeTypes,\n TableRect,\n Transaction,\n} from '@milkdown/prose';\n\nexport type CellPos = {\n pos: number;\n start: number;\n node: ProsemirrorNode;\n};\n\nexport const findTable = (selection: Selection) =>\n findParentNode((node) => node.type.spec['tableRole'] === 'table')(selection);\n\nexport const getCellsInColumn =\n (columnIndex: number) =>\n (selection: Selection): CellPos[] | undefined => {\n const table = findTable(selection);\n if (!table) return undefined;\n const map = TableMap.get(table.node);\n if (columnIndex < 0 || columnIndex >= map.width) {\n return undefined;\n }\n\n return map.cellsInRect({ left: columnIndex, right: columnIndex + 1, top: 0, bottom: map.height }).map((pos) => {\n const node = table.node.nodeAt(pos);\n if (!node) throw new Error();\n const start = pos + table.start;\n return {\n pos: start,\n start: start + 1,\n node,\n };\n });\n };\n\nexport const getCellsInRow =\n (rowIndex: number) =>\n (selection: Selection): CellPos[] | undefined => {\n const table = findTable(selection);\n if (!table) return undefined;\n const map = TableMap.get(table.node);\n if (rowIndex < 0 || rowIndex >= map.height) {\n return undefined;\n }\n\n return map.cellsInRect({ left: 0, right: map.width, top: rowIndex, bottom: rowIndex + 1 }).map((pos) => {\n const node = table.node.nodeAt(pos);\n if (!node) throw new Error();\n const start = pos + table.start;\n return {\n pos: start,\n start: start + 1,\n node,\n };\n });\n };\n\nexport const createTable = (schema: Schema, rowsCount = 3, colsCount = 3) => {\n const { cell: tableCell, header_cell: tableHeader, row: tableRow, table } = tableNodeTypes(schema);\n\n const cells = Array(colsCount)\n .fill(0)\n .map(() => tableCell.createAndFill(null) as ProsemirrorNode);\n\n const headerCells = Array(colsCount)\n .fill(0)\n .map(() => tableHeader.createAndFill(null) as ProsemirrorNode);\n\n const rows = Array(rowsCount)\n .fill(0)\n .map((_, i) => tableRow.create(null, i === 0 ? headerCells : cells));\n\n return table.create(null, rows);\n};\n\nexport const selectLine = (type: 'row' | 'col') => (index: number) => (tr: Transaction) => {\n const table = findTable(tr.selection);\n const isRowSelection = type === 'row';\n if (table) {\n const map = TableMap.get(table.node);\n\n // Check if the index is valid\n if (index >= 0 && index < (isRowSelection ? map.height : map.width)) {\n const lastCell = map.positionAt(\n isRowSelection ? index : map.height - 1,\n isRowSelection ? map.width - 1 : index,\n table.node,\n );\n const $lastCell = tr.doc.resolve(table.start + lastCell);\n\n const createCellSelection = isRowSelection ? CellSelection.rowSelection : CellSelection.colSelection;\n\n const firstCell = map.positionAt(isRowSelection ? index : 0, isRowSelection ? 0 : index, table.node);\n const $firstCell = tr.doc.resolve(table.start + firstCell);\n return cloneTr(tr.setSelection(createCellSelection($lastCell, $firstCell) as unknown as Selection));\n }\n }\n return tr;\n};\n\nexport const getCellsInTable = (selection: Selection) => {\n const table = findTable(selection);\n if (!table) {\n return;\n }\n const map = TableMap.get(table.node);\n const cells = map.cellsInRect({\n left: 0,\n right: map.width,\n top: 0,\n bottom: map.height,\n });\n return cells.map((nodePos) => {\n const node = table.node.nodeAt(nodePos);\n const pos = nodePos + table.start;\n return { pos, start: pos + 1, node };\n });\n};\n\nexport const selectTable = (tr: Transaction) => {\n const cells = getCellsInTable(tr.selection);\n if (cells && cells[0]) {\n const $firstCell = tr.doc.resolve(cells[0].pos);\n const last = cells[cells.length - 1];\n if (last) {\n const $lastCell = tr.doc.resolve(last.pos);\n return cloneTr(tr.setSelection(new CellSelection($lastCell, $firstCell) as unknown as Selection));\n }\n }\n return tr;\n};\n\nexport function addRowWithAlignment(tr: Transaction, { map, tableStart, table }: TableRect, row: number) {\n const rowPos = Array(row)\n .fill(0)\n .reduce((acc, _, i) => {\n return acc + table.child(i).nodeSize;\n }, tableStart);\n\n const { cell: cellType, row: rowType } = tableNodeTypes(table.type.schema);\n\n const cells = Array(map.width)\n .fill(0)\n .map((_, col) => {\n const headerCol = table.nodeAt(map.map[col] as number);\n return cellType.createAndFill({ alignment: headerCol?.attrs['alignment'] }) as ProsemirrorNode;\n });\n\n tr.insert(rowPos, rowType.create(null, cells));\n return tr;\n}\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { CellSelection, EditorView, TableMap } from '@milkdown/prose';\n\nimport { Item } from './actions';\n\nexport const getCellSelection = (view: EditorView): CellSelection => view.state.selection as unknown as CellSelection;\n\nexport const isFirstRowSelected = (selection: CellSelection) => {\n const map = TableMap.get(selection.$anchorCell.node(-1));\n const start = selection.$anchorCell.start(-1);\n const cells = map.cellsInRect({\n left: 0,\n right: map.width,\n top: 0,\n bottom: 1,\n });\n const selectedCells = map.cellsInRect(\n map.rectBetween(selection.$anchorCell.pos - start, selection.$headCell.pos - start),\n );\n\n for (let i = 0, count = cells.length; i < count; i++) {\n if (selectedCells.indexOf(cells[i] as number) === -1) {\n return false;\n }\n }\n return true;\n};\n\nexport const calculateItem = (actions: Record<string, Item>, view: EditorView) => {\n Object.values(actions).forEach((item) => {\n const disable = item.disable?.(view);\n if (disable) {\n item.$.classList.add('hide');\n return;\n }\n item.$.classList.remove('hide');\n });\n};\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { Ctx, themeToolCtx } 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(themeToolCtx).slots.icon('leftArrow'),\n command: () => addColumnBefore,\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AddColRight]: {\n $: ctx.get(themeToolCtx).slots.icon('rightArrow'),\n command: () => addColumnAfter,\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AddRowTop]: {\n $: ctx.get(themeToolCtx).slots.icon('upArrow'),\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(themeToolCtx).slots.icon('downArrow'),\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(themeToolCtx).slots.icon('alignLeft'),\n command: () => setCellAttr('alignment', 'left'),\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AlignCenter]: {\n $: ctx.get(themeToolCtx).slots.icon('alignCenter'),\n command: () => setCellAttr('alignment', 'center'),\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.AlignRight]: {\n $: ctx.get(themeToolCtx).slots.icon('alignRight'),\n command: () => setCellAttr('alignment', 'right'),\n disable: (view) => !getCellSelection(view).isColSelection(),\n },\n [Action.Delete]: {\n $: ctx.get(themeToolCtx).slots.icon('delete'),\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, ThemeTool } from '@milkdown/core';\n\nexport const injectStyle = ({ size, mixin, palette }: ThemeTool, { css }: Emotion) => 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: ${size.radius};\n\n ${mixin.border?.()};\n\n ${mixin.shadow?.()};\n\n overflow: hidden;\n background: ${palette('surface')};\n\n .icon {\n position: relative;\n color: ${palette('solid', 0.87)};\n\n width: 3rem;\n line-height: 3rem;\n text-align: center;\n transition: all 0.4s ease-in-out;\n &:hover {\n background-color: ${palette('secondary', 0.12)};\n }\n &.active {\n color: ${palette('primary')};\n }\n &:not(:last-child)::after {\n content: '';\n position: absolute;\n right: 0px;\n top: 0;\n width: ${size.lineWidth};\n bottom: 0;\n background: ${palette('line')};\n }\n }\n &.hide,\n .hide {\n display: none;\n }\n`;\n","/* Copyright 2021, Milkdown by Mirone. */\n\nimport { Ctx, themeToolCtx } 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 const widget = 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(themeToolCtx).slots.icon('select'));\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 return widget;\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 const style = utils.getStyle(injectStyle);\n if (style) {\n tooltip.classList.add(style);\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 { Emotion } from '@milkdown/design-system';\nimport { Utils } from '@milkdown/utils';\n\nconst proseTableStyle = ({ css }: Emotion) => css`\n /* copy from https://github.com/ProseMirror/prosemirror-tables/blob/master/style/tables.css */\n .ProseMirror .tableWrapper {\n overflow-x: auto;\n }\n .ProseMirror table {\n border-collapse: collapse;\n table-layout: fixed;\n width: 100%;\n overflow: hidden;\n }\n .ProseMirror td,\n .ProseMirror th {\n vertical-align: top;\n box-sizing: border-box;\n position: relative;\n }\n .ProseMirror .column-resize-handle {\n position: absolute;\n right: -2px;\n top: 0;\n bottom: 0;\n width: 4px;\n z-index: 20;\n background-color: #adf;\n pointer-events: none;\n }\n .ProseMirror.resize-cursor {\n cursor: ew-resize;\n cursor: col-resize;\n }\n /* Give selected cells a blue overlay */\n .ProseMirror .selectedCell:after {\n z-index: 2;\n position: absolute;\n content: '';\n left: 0;\n right: 0;\n top: 0;\n bottom: 0;\n background: rgba(200, 200, 255, 0.4);\n pointer-events: none;\n }\n`;\n\nexport const injectStyle = (utils: Utils) => {\n return utils.getStyle(({ size, palette, mixin }, emotion) => {\n const css = emotion.injectGlobal;\n css`\n ${proseTableStyle(emotion)}\n\n .tableWrapper {\n margin: 0 !important;\n\n ${mixin.scrollbar?.('x')};\n\n width: 100%;\n\n table {\n width: calc(100% - 2rem) !important;\n border-radius: ${size.radius};\n box-sizing: border-box;\n margin: 1rem 0 1rem 1rem !important;\n overflow: auto !important;\n * {\n margin: 0 !important;\n box-sizing: border-box;\n font-size: 1rem;\n }\n tr {\n ${mixin.border?.('bottom')};\n }\n\n th {\n background: ${palette('background', 0.5)};\n font-weight: 400;\n }\n\n th,\n td {\n min-width: 100px;\n ${mixin.border?.()};\n text-align: left;\n position: relative;\n line-height: 3rem;\n box-sizing: border-box;\n height: 3rem;\n }\n\n .selectedCell {\n &::after {\n background: ${palette('secondary', 0.38)};\n }\n & ::selection {\n background: transparent;\n }\n }\n\n .column-resize-handle {\n background: ${palette('primary')};\n width: ${size.lineWidth};\n }\n\n th,\n td {\n padding: 0 1rem;\n p {\n line-height: unset !important;\n }\n }\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 &:hover::after {\n background: ${palette('secondary', 0.38)};\n }\n }\n\n .milkdown-cell-left {\n left: calc(-6px - 0.5rem);\n top: 0;\n bottom: 0;\n width: 0.5rem;\n }\n\n .milkdown-cell-top {\n left: 0;\n right: 0;\n top: calc(-6px - 0.5rem);\n height: 0.5rem;\n }\n\n .milkdown-cell-point {\n left: calc(-2px - 1rem);\n top: calc(-2px - 1rem);\n width: 1rem;\n height: 1rem;\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","/* 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';\nimport { injectStyle } from './style';\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 injectStyle(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\nexport const strikeThrough = createMark<Keys>((utils) => {\n const id = 'strike_through';\n const style = utils.getStyle(\n (themeTool, { css }) =>\n css`\n text-decoration-color: ${themeTool.palette('secondary')};\n `,\n );\n\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', style) }],\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, themeToolCtx } from '@milkdown/core';\nimport type { Icon } from '@milkdown/design-system';\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 const style = utils.getStyle(\n ({ palette, size }, { css }) =>\n css`\n list-style-type: none;\n position: relative;\n\n & > div {\n overflow: hidden;\n padding: 0 2px;\n }\n\n label {\n position: absolute;\n top: 0;\n left: -2rem;\n display: inline-block;\n width: 1.5rem;\n height: 1.5rem;\n margin: 0.5rem 0;\n input {\n visibility: hidden;\n }\n }\n label:before {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n border-radius: ${size.radius};\n }\n label:hover:before {\n background: ${palette('background')};\n }\n &[data-checked='true'] {\n label {\n color: ${palette('primary')};\n }\n }\n &[data-checked='false'] {\n label {\n color: ${palette('solid', 0.87)};\n }\n }\n .paragraph {\n margin: 0.5rem 0;\n }\n `,\n );\n\n return {\n id,\n schema: () => ({\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 'li',\n {\n 'data-type': 'task-item',\n 'data-checked': node.attrs['checked'] ? 'true' : 'false',\n class: utils.getClassName(node.attrs, 'task-list-item', style),\n },\n 0,\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: (ctx) => (node, view, getPos) => {\n const createIcon = ctx.get(themeToolCtx).slots.icon;\n\n const listItem = document.createElement('li');\n const checkboxWrapper = document.createElement('label');\n const checkboxStyler = document.createElement('span');\n const checkbox = document.createElement('input');\n const content = document.createElement('div');\n\n let icon = createIcon('unchecked');\n checkboxWrapper.appendChild(icon);\n const setIcon = (name: Icon) => {\n const nextIcon = createIcon(name);\n checkboxWrapper.replaceChild(nextIcon, icon);\n icon = nextIcon;\n };\n\n checkboxWrapper.contentEditable = 'false';\n checkbox.type = 'checkbox';\n const onChange = (event: Event) => {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) return;\n\n if (!view.editable) {\n checkbox.checked = !checkbox.checked;\n\n return;\n }\n\n const { tr } = view.state;\n\n view.dispatch(\n tr.setNodeMarkup(getPos(), undefined, {\n checked: target.checked,\n }),\n );\n };\n checkbox.addEventListener('change', onChange);\n\n listItem.dataset['checked'] = node.attrs['checked'];\n if (node.attrs['checked']) {\n checkbox.setAttribute('checked', 'checked');\n }\n\n checkboxWrapper.append(checkbox, checkboxStyler);\n listItem.append(checkboxWrapper, content);\n\n const attributes = {\n 'data-type': 'task-item',\n 'data-checked': node.attrs['checked'] ? 'true' : 'false',\n class: utils.getClassName(node.attrs, 'task-list-item', style),\n };\n Object.entries(attributes).forEach(([key, value]) => {\n listItem.setAttribute(key, value);\n });\n setIcon(node.attrs['checked'] ? 'checked' : 'unchecked');\n\n return {\n dom: listItem,\n contentDOM: content,\n update: (updatedNode) => {\n if (updatedNode.type.name !== id) return false;\n\n listItem.dataset['checked'] = updatedNode.attrs['checked'];\n if (updatedNode.attrs['checked']) {\n checkbox.setAttribute('checked', 'checked');\n } else {\n checkbox.removeAttribute('checked');\n }\n setIcon(updatedNode.attrs['checked'] ? 'checked' : 'unchecked');\n\n return true;\n },\n destroy: () => {\n checkbox.removeEventListener('change', onChange);\n },\n };\n },\n };\n});\n","/* Copyright 2021, Milkdown by Mirone. */\nimport { commands as commonmarkCommands, commonmark } from '@milkdown/preset-commonmark';\nimport { $remark, AtomList } from '@milkdown/utils';\nimport remarkGFM from 'remark-gfm';\n\nimport { urlPlugin } from './auto-link';\nimport { strikeThrough, ToggleStrikeThrough } from './strike-through';\nimport { table } from './table';\nimport {\n LiftTaskListItem,\n SinkTaskListItem,\n SplitTaskListItem,\n taskListItem,\n TurnIntoTaskList,\n} from './task-list-item';\n\nexport * from './strike-through';\nexport { SupportedKeys } from './supported-keys';\nexport {\n BreakTable,\n // command\n createTable,\n InsertTable,\n NextCell,\n PrevCell,\n // gather\n table,\n} from './table';\nexport * from './task-list-item';\nexport {\n blockquote,\n bulletList,\n codeFence,\n codeInline,\n commonmark,\n // gather\n commonmarkNodes,\n commonmarkPlugins,\n // node\n doc,\n em,\n hardbreak,\n heading,\n hr,\n image,\n // command\n InsertHardbreak,\n InsertHr,\n InsertImage,\n LiftListItem,\n link,\n listItem,\n ModifyImage,\n ModifyLink,\n orderedList,\n paragraph,\n SinkListItem,\n SplitListItem,\n strong,\n text,\n ToggleBold,\n ToggleInlineCode,\n ToggleItalic,\n ToggleLink,\n TurnIntoCodeFence,\n TurnIntoHeading,\n TurnIntoText,\n WrapInBlockquote,\n WrapInBulletList,\n WrapInOrderedList,\n} from '@milkdown/preset-commonmark';\n\nexport const gfm = AtomList.create([\n ...commonmark,\n $remark(() => remarkGFM),\n table(),\n urlPlugin,\n strikeThrough(),\n taskListItem(),\n]);\n\nexport const commands = {\n ...commonmarkCommands,\n ToggleStrikeThrough,\n TurnIntoTaskList,\n SinkTaskListItem,\n LiftTaskListItem,\n SplitTaskListItem,\n} as const;\nexport type Commands = typeof commands;\n"],"names":["injectStyle","tableNodesSpecCreator","SupportedKeys","CommonmarkKeys","TableKeys","commonmarkCommands"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { NodeType } from '@milkdown/prose';
1
2
  export declare const SupportedKeys: {
2
3
  readonly NextCell: "NextCell";
3
4
  readonly PrevCell: "PrevCell";
@@ -9,10 +10,10 @@ export declare const NextCell: import("@milkdown/core").CmdKey<undefined>;
9
10
  export declare const BreakTable: import("@milkdown/core").CmdKey<undefined>;
10
11
  export declare const InsertTable: import("@milkdown/core").CmdKey<undefined>;
11
12
  export declare const table: import("@milkdown/utils/lib/src/types").WithExtend<"NextCell" | "PrevCell" | "ExitTable", Record<string, unknown>, {
12
- table: import("prosemirror-model").NodeType<any>;
13
- table_row: import("prosemirror-model").NodeType<any>;
14
- table_cell: import("prosemirror-model").NodeType<any>;
15
- table_header: import("prosemirror-model").NodeType<any>;
13
+ table: NodeType<any>;
14
+ table_row: NodeType<any>;
15
+ table_cell: NodeType<any>;
16
+ table_header: NodeType<any>;
16
17
  } & {
17
18
  [x: string]: import("prosemirror-model").MarkType<any>;
18
19
  }, {
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,aAAa;;;;CAIhB,CAAC;AACX,oBAAY,aAAa,GAAG,OAAO,aAAa,CAAC;AAIjD,eAAO,MAAM,QAAQ,4CAA2B,CAAC;AACjD,eAAO,MAAM,QAAQ,4CAA2B,CAAC;AACjD,eAAO,MAAM,UAAU,4CAA6B,CAAC;AACrD,eAAO,MAAM,WAAW,4CAA8B,CAAC;AAEvD,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;EA+IhB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAEA,OAAO,EAIH,QAAQ,EAIX,MAAM,iBAAiB,CAAC;AASzB,eAAO,MAAM,aAAa;;;;CAIhB,CAAC;AACX,oBAAY,aAAa,GAAG,OAAO,aAAa,CAAC;AAIjD,eAAO,MAAM,QAAQ,4CAA2B,CAAC;AACjD,eAAO,MAAM,QAAQ,4CAA2B,CAAC;AACjD,eAAO,MAAM,UAAU,4CAA6B,CAAC;AACrD,eAAO,MAAM,WAAW,4CAA8B,CAAC;AAEvD,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;EA+IhB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.ts"],"names":[],"mappings":"AACA,OAAO,EAIH,IAAI,IAAI,eAAe,EACvB,MAAM,EACN,SAAS,EAGT,SAAS,EACT,WAAW,EACd,MAAM,iBAAiB,CAAC;AAEzB,oBAAY,OAAO,GAAG;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,SAAS,cAAe,SAAS,6DAC+B,CAAC;AAE9E,eAAO,MAAM,gBAAgB,gBACX,MAAM,iBACR,SAAS,KAAG,OAAO,EAAE,GAAG,SAkBnC,CAAC;AAEN,eAAO,MAAM,aAAa,aACX,MAAM,iBACL,SAAS,KAAG,OAAO,EAAE,GAAG,SAkBnC,CAAC;AAEN,eAAO,MAAM,WAAW,WAAY,MAAM,iEAgBzC,CAAC;AAEF,eAAO,MAAM,UAAU,SAAU,KAAK,GAAG,KAAK,aAAa,MAAM,UAAU,WAAW,QAuBrF,CAAC;AAEF,eAAO,MAAM,eAAe,cAAe,SAAS;;;;eAiBnD,CAAC;AAEF,eAAO,MAAM,WAAW,OAAQ,WAAW,QAQ1C,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,oBAkBtG"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["utils.ts"],"names":[],"mappings":"AACA,OAAO,EAIH,IAAI,IAAI,eAAe,EACvB,MAAM,EACN,SAAS,EAGT,SAAS,EACT,WAAW,EACd,MAAM,iBAAiB,CAAC;AAEzB,oBAAY,OAAO,GAAG;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,eAAe,CAAC;CACzB,CAAC;AAEF,eAAO,MAAM,SAAS,cAAe,SAAS,6DACkC,CAAC;AAEjF,eAAO,MAAM,gBAAgB,gBACX,MAAM,iBACR,SAAS,KAAG,OAAO,EAAE,GAAG,SAkBnC,CAAC;AAEN,eAAO,MAAM,aAAa,aACX,MAAM,iBACL,SAAS,KAAG,OAAO,EAAE,GAAG,SAkBnC,CAAC;AAEN,eAAO,MAAM,WAAW,WAAY,MAAM,iEAgBzC,CAAC;AAEF,eAAO,MAAM,UAAU,SAAU,KAAK,GAAG,KAAK,aAAa,MAAM,UAAU,WAAW,QAuBrF,CAAC;AAEF,eAAO,MAAM,eAAe,cAAe,SAAS;;;;eAiBnD,CAAC;AAEF,eAAO,MAAM,WAAW,OAAQ,WAAW,QAW1C,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,WAAW,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,oBAkBtG"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@milkdown/preset-gfm",
3
- "version": "5.4.1",
3
+ "version": "5.5.0",
4
4
  "type": "module",
5
5
  "main": "./lib/index.es.js",
6
6
  "types": "./lib/index.d.ts",
@@ -17,10 +17,10 @@
17
17
  "gfm"
18
18
  ],
19
19
  "devDependencies": {
20
- "@milkdown/core": "5.4.1",
21
- "@milkdown/prose": "5.4.1",
22
- "@milkdown/design-system": "5.4.1",
23
- "@milkdown/preset-commonmark": "5.4.1"
20
+ "@milkdown/core": "5.5.0",
21
+ "@milkdown/prose": "5.5.0",
22
+ "@milkdown/design-system": "5.5.0",
23
+ "@milkdown/preset-commonmark": "5.5.0"
24
24
  },
25
25
  "peerDependencies": {
26
26
  "@milkdown/core": "^5.4.0",
@@ -28,7 +28,7 @@
28
28
  "@milkdown/preset-commonmark": "^5.4.0"
29
29
  },
30
30
  "dependencies": {
31
- "@milkdown/utils": "5.4.1",
31
+ "@milkdown/utils": "5.5.0",
32
32
  "remark-gfm": "^3.0.0",
33
33
  "tslib": "^2.3.1"
34
34
  },
package/src/auto-link.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  import { InputRule, inputRules } from '@milkdown/prose';
3
3
  import { $prose } from '@milkdown/utils';
4
4
 
5
- const urlRegex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)/;
5
+ const urlRegex = /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_+.~#?&//=]*)$/;
6
6
 
7
7
  const proseUrlPlugin = () =>
8
8
  inputRules({
@@ -1,6 +1,14 @@
1
1
  /* Copyright 2021, Milkdown by Mirone. */
2
2
  import { createCmd, createCmdKey, MarkdownNode, schemaCtx } from '@milkdown/core';
3
- import { columnResizing, goToNextCell, InputRule, Selection, tableEditing, TextSelection } from '@milkdown/prose';
3
+ import {
4
+ columnResizing,
5
+ goToNextCell,
6
+ InputRule,
7
+ NodeType,
8
+ Selection,
9
+ tableEditing,
10
+ TextSelection,
11
+ } from '@milkdown/prose';
4
12
  import { createPlugin, createShortcut } from '@milkdown/utils';
5
13
 
6
14
  import { exitTable } from '../command';
@@ -33,7 +41,7 @@ export const table = createPlugin<Keys, Record<string, unknown>, keyof typeof sc
33
41
  parseMarkdown: {
34
42
  match: (node) => node.type === 'table',
35
43
  runner: (state, node, type) => {
36
- const align = node.align as (string | null)[];
44
+ const align = node['align'] as (string | null)[];
37
45
  const children = (node.children as MarkdownNode[]).map((x, i) => ({
38
46
  ...x,
39
47
  align,
@@ -52,7 +60,7 @@ export const table = createPlugin<Keys, Record<string, unknown>, keyof typeof sc
52
60
 
53
61
  const align: (string | null)[] = [];
54
62
  firstLine.forEach((cell) => {
55
- align.push(cell.attrs.alignment);
63
+ align.push(cell.attrs['alignment']);
56
64
  });
57
65
  state.openNode('table', undefined, { align });
58
66
  state.next(node.content);
@@ -65,11 +73,11 @@ export const table = createPlugin<Keys, Record<string, unknown>, keyof typeof sc
65
73
  parseMarkdown: {
66
74
  match: (node) => node.type === 'tableRow',
67
75
  runner: (state, node, type) => {
68
- const align = node.align as (string | null)[];
76
+ const align = node['align'] as (string | null)[];
69
77
  const children = (node.children as MarkdownNode[]).map((x, i) => ({
70
78
  ...x,
71
79
  align: align[i],
72
- isHeader: node.isHeader,
80
+ isHeader: node['isHeader'],
73
81
  }));
74
82
  state.openNode(type);
75
83
  state.next(children);
@@ -88,12 +96,12 @@ export const table = createPlugin<Keys, Record<string, unknown>, keyof typeof sc
88
96
  table_cell: {
89
97
  ...schema.table_cell,
90
98
  parseMarkdown: {
91
- match: (node) => node.type === 'tableCell' && !node.isHeader,
99
+ match: (node) => node.type === 'tableCell' && !node['isHeader'],
92
100
  runner: (state, node, type) => {
93
- const align = node.align as string;
101
+ const align = node['align'] as string;
94
102
  state
95
103
  .openNode(type, { alignment: align })
96
- .openNode(state.schema.nodes.paragraph)
104
+ .openNode(state.schema.nodes['paragraph'] as NodeType)
97
105
  .next(node.children)
98
106
  .closeNode()
99
107
  .closeNode();
@@ -109,11 +117,11 @@ export const table = createPlugin<Keys, Record<string, unknown>, keyof typeof sc
109
117
  table_header: {
110
118
  ...schema.table_header,
111
119
  parseMarkdown: {
112
- match: (node) => node.type === 'tableCell' && !!node.isHeader,
120
+ match: (node) => node.type === 'tableCell' && !!node['isHeader'],
113
121
  runner: (state, node, type) => {
114
- const align = node.align as string;
122
+ const align = node['align'] as string;
115
123
  state.openNode(type, { alignment: align });
116
- state.openNode(state.schema.nodes.paragraph);
124
+ state.openNode(state.schema.nodes['paragraph'] as NodeType);
117
125
  state.next(node.children);
118
126
  state.closeNode();
119
127
  state.closeNode();
@@ -144,7 +152,7 @@ export const table = createPlugin<Keys, Record<string, unknown>, keyof typeof sc
144
152
  commands: (_, ctx) => [
145
153
  createCmd(PrevCell, () => goToNextCell(-1)),
146
154
  createCmd(NextCell, () => goToNextCell(1)),
147
- createCmd(BreakTable, () => exitTable(ctx.get(schemaCtx).nodes.paragraph)),
155
+ createCmd(BreakTable, () => exitTable(ctx.get(schemaCtx).nodes['paragraph'] as NodeType)),
148
156
  createCmd(InsertTable, () => (state, dispatch) => {
149
157
  const { selection, tr } = state;
150
158
  const { from } = selection;
@@ -19,7 +19,7 @@ export const isFirstRowSelected = (selection: CellSelection) => {
19
19
  );
20
20
 
21
21
  for (let i = 0, count = cells.length; i < count; i++) {
22
- if (selectedCells.indexOf(cells[i]) === -1) {
22
+ if (selectedCells.indexOf(cells[i] as number) === -1) {
23
23
  return false;
24
24
  }
25
25
  }
@@ -4,7 +4,7 @@ import { Ctx } from '@milkdown/core';
4
4
  import { CellSelection, Decoration, DecorationSet, Plugin, PluginKey } from '@milkdown/prose';
5
5
  import { Utils } from '@milkdown/utils';
6
6
 
7
- import { getCellsInColumn, getCellsInRow } from '../utils';
7
+ import { CellPos, getCellsInColumn, getCellsInRow } from '../utils';
8
8
  import { createActions } from './actions';
9
9
  import { calculatePosition } from './calc-pos';
10
10
  import { ToolTipPos } from './constant';
@@ -35,7 +35,7 @@ export const operatorPlugin = (ctx: Ctx, utils: Utils) => {
35
35
 
36
36
  const [topLeft] = leftCells;
37
37
 
38
- decorations.push(createWidget(ctx, topLeft, ToolTipPos.Point));
38
+ decorations.push(createWidget(ctx, topLeft as CellPos, ToolTipPos.Point));
39
39
  leftCells.forEach((cell, i) => {
40
40
  decorations.push(createWidget(ctx, cell, ToolTipPos.Left, i));
41
41
  });
@@ -19,7 +19,7 @@ export type CellPos = {
19
19
  };
20
20
 
21
21
  export const findTable = (selection: Selection) =>
22
- findParentNode((node) => node.type.spec.tableRole === 'table')(selection);
22
+ findParentNode((node) => node.type.spec['tableRole'] === 'table')(selection);
23
23
 
24
24
  export const getCellsInColumn =
25
25
  (columnIndex: number) =>
@@ -129,10 +129,13 @@ export const getCellsInTable = (selection: Selection) => {
129
129
 
130
130
  export const selectTable = (tr: Transaction) => {
131
131
  const cells = getCellsInTable(tr.selection);
132
- if (cells) {
132
+ if (cells && cells[0]) {
133
133
  const $firstCell = tr.doc.resolve(cells[0].pos);
134
- const $lastCell = tr.doc.resolve(cells[cells.length - 1].pos);
135
- return cloneTr(tr.setSelection(new CellSelection($lastCell, $firstCell) as unknown as Selection));
134
+ const last = cells[cells.length - 1];
135
+ if (last) {
136
+ const $lastCell = tr.doc.resolve(last.pos);
137
+ return cloneTr(tr.setSelection(new CellSelection($lastCell, $firstCell) as unknown as Selection));
138
+ }
136
139
  }
137
140
  return tr;
138
141
  };
@@ -149,8 +152,8 @@ export function addRowWithAlignment(tr: Transaction, { map, tableStart, table }:
149
152
  const cells = Array(map.width)
150
153
  .fill(0)
151
154
  .map((_, col) => {
152
- const headerCol = table.nodeAt(map.map[col]);
153
- return cellType.createAndFill({ alignment: headerCol?.attrs.alignment }) as ProsemirrorNode;
155
+ const headerCol = table.nodeAt(map.map[col] as number);
156
+ return cellType.createAndFill({ alignment: headerCol?.attrs['alignment'] }) as ProsemirrorNode;
154
157
  });
155
158
 
156
159
  tr.insert(rowPos, rowType.create(null, cells));
@@ -84,7 +84,7 @@ export const taskListItem = createNode<Keys>((utils) => {
84
84
  if (!(dom instanceof HTMLElement)) {
85
85
  throw new Error();
86
86
  }
87
- return { checked: dom.dataset.checked === 'true' };
87
+ return { checked: dom.dataset['checked'] === 'true' };
88
88
  },
89
89
  },
90
90
  ],
@@ -92,7 +92,7 @@ export const taskListItem = createNode<Keys>((utils) => {
92
92
  'li',
93
93
  {
94
94
  'data-type': 'task-item',
95
- 'data-checked': node.attrs.checked ? 'true' : 'false',
95
+ 'data-checked': node.attrs['checked'] ? 'true' : 'false',
96
96
  class: utils.getClassName(node.attrs, 'task-list-item', style),
97
97
  },
98
98
  0,
@@ -102,7 +102,7 @@ export const taskListItem = createNode<Keys>((utils) => {
102
102
  return type === 'listItem' && checked !== null;
103
103
  },
104
104
  runner: (state, node, type) => {
105
- state.openNode(type, { checked: node.checked as boolean });
105
+ state.openNode(type, { checked: node['checked'] as boolean });
106
106
  state.next(node.children);
107
107
  state.closeNode();
108
108
  },
@@ -110,7 +110,7 @@ export const taskListItem = createNode<Keys>((utils) => {
110
110
  toMarkdown: {
111
111
  match: (node) => node.type.name === id,
112
112
  runner: (state, node) => {
113
- state.openNode('listItem', undefined, { checked: node.attrs.checked });
113
+ state.openNode('listItem', undefined, { checked: node.attrs['checked'] });
114
114
  state.next(node.content);
115
115
  state.closeNode();
116
116
  },
@@ -172,8 +172,8 @@ export const taskListItem = createNode<Keys>((utils) => {
172
172
  };
173
173
  checkbox.addEventListener('change', onChange);
174
174
 
175
- listItem.dataset.checked = node.attrs.checked;
176
- if (node.attrs.checked) {
175
+ listItem.dataset['checked'] = node.attrs['checked'];
176
+ if (node.attrs['checked']) {
177
177
  checkbox.setAttribute('checked', 'checked');
178
178
  }
179
179
 
@@ -182,13 +182,13 @@ export const taskListItem = createNode<Keys>((utils) => {
182
182
 
183
183
  const attributes = {
184
184
  'data-type': 'task-item',
185
- 'data-checked': node.attrs.checked ? 'true' : 'false',
185
+ 'data-checked': node.attrs['checked'] ? 'true' : 'false',
186
186
  class: utils.getClassName(node.attrs, 'task-list-item', style),
187
187
  };
188
188
  Object.entries(attributes).forEach(([key, value]) => {
189
189
  listItem.setAttribute(key, value);
190
190
  });
191
- setIcon(node.attrs.checked ? 'checked' : 'unchecked');
191
+ setIcon(node.attrs['checked'] ? 'checked' : 'unchecked');
192
192
 
193
193
  return {
194
194
  dom: listItem,
@@ -196,13 +196,13 @@ export const taskListItem = createNode<Keys>((utils) => {
196
196
  update: (updatedNode) => {
197
197
  if (updatedNode.type.name !== id) return false;
198
198
 
199
- listItem.dataset.checked = updatedNode.attrs.checked;
200
- if (updatedNode.attrs.checked) {
199
+ listItem.dataset['checked'] = updatedNode.attrs['checked'];
200
+ if (updatedNode.attrs['checked']) {
201
201
  checkbox.setAttribute('checked', 'checked');
202
202
  } else {
203
203
  checkbox.removeAttribute('checked');
204
204
  }
205
- setIcon(updatedNode.attrs.checked ? 'checked' : 'unchecked');
205
+ setIcon(updatedNode.attrs['checked'] ? 'checked' : 'unchecked');
206
206
 
207
207
  return true;
208
208
  },