diff --git a/packages/core/src/inputRules/markInputRule.ts b/packages/core/src/inputRules/markInputRule.ts index fa99778b..fc1ba923 100644 --- a/packages/core/src/inputRules/markInputRule.ts +++ b/packages/core/src/inputRules/markInputRule.ts @@ -26,7 +26,7 @@ export default function (regexp: RegExp, markType: MarkType, getAttrs?: Function if (match[m]) { const matchStart = start + match[0].indexOf(match[m - 1]) - const matchEnd = matchStart + match[m - 1].length - 1 + const matchEnd = matchStart + match[m - 1].length const textStart = matchStart + match[m - 1].lastIndexOf(match[m]) const textEnd = textStart + match[m].length diff --git a/packages/core/src/plugins/index.ts b/packages/core/src/plugins/index.ts index 94fc6a97..d4b64f83 100644 --- a/packages/core/src/plugins/index.ts +++ b/packages/core/src/plugins/index.ts @@ -1,10 +1,10 @@ -import { undoInputRule } from 'prosemirror-inputrules' import { keymap } from 'prosemirror-keymap' import { baseKeymap } from 'prosemirror-commands' import { dropCursor } from 'prosemirror-dropcursor' import { gapCursor } from 'prosemirror-gapcursor' import editable from './editable' import focus from './focus' +import undoInputRule from '../utils/undoInputRule' export default [ () => dropCursor(), diff --git a/packages/core/src/utils/undoInputRule.ts b/packages/core/src/utils/undoInputRule.ts new file mode 100644 index 00000000..d3a94f18 --- /dev/null +++ b/packages/core/src/utils/undoInputRule.ts @@ -0,0 +1,32 @@ +import { EditorState, Transaction } from 'prosemirror-state' + +// source: https://github.com/ProseMirror/prosemirror-inputrules/blob/2d3ae3abe3428a1b4d343808915aafeff8563371/src/inputrules.js#L101 +export default function undoInputRule(state: EditorState, dispatch?: (tr: Transaction) => void) { + let plugins = state.plugins + + for (let i = 0; i < plugins.length; i++) { + let plugin = plugins[i], undoable + // @ts-ignore + if (plugin.spec.isInputRules && (undoable = plugin.getState(state))) { + if (dispatch) { + let tr = state.tr, toUndo = undoable.transform + + for (let j = toUndo.steps.length - 1; j >= 0; j--) { + tr.step(toUndo.steps[j].invert(toUndo.docs[j])) + } + + let marks = tr.doc.resolve(undoable.from).marks() + + if (!undoable.text) { + return false + } + + dispatch(tr.replaceWith(undoable.from, undoable.to, state.schema.text(undoable.text, marks))) + } + + return true + } + } + + return false +} \ No newline at end of file