diff --git a/packages/tiptap-commands/src/commands/markInputRule.js b/packages/tiptap-commands/src/commands/markInputRule.js index 066760e6..f9ad91c2 100644 --- a/packages/tiptap-commands/src/commands/markInputRule.js +++ b/packages/tiptap-commands/src/commands/markInputRule.js @@ -3,23 +3,30 @@ import { InputRule } from 'prosemirror-inputrules' export default function (regexp, markType, getAttrs) { return new InputRule(regexp, (state, match, start, end) => { const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs - const { tr } = state - let markEnd = end + const { tr } = state + const m = match.length - 1 + let markEnd = end + let markStart = start - if (match[1]) { - const startSpaces = match[0].search(/\S/) - const textStart = start + match[0].indexOf(match[1]) - const textEnd = textStart + match[1].length - if (textEnd < end) { - tr.delete(textEnd, end) + if (match[m]) { + const matchStart = start + match[0].indexOf(match[m - 1]) + // matchEnd index is -1 because the last matching char is not yet member of transaction + // and actually never will be because it triggered the inputrule and vanishes ;) + const matchEnd = matchStart + match[m - 1].length - 1 + const textStart = matchStart + match[m - 1].lastIndexOf(match[m]) + const textEnd = textStart + match[m].length + + if (textEnd < matchEnd) { + tr.delete(textEnd, matchEnd) } - if (textStart > start) { - tr.delete(start + startSpaces, textStart) + if (textStart > matchStart) { + tr.delete(matchStart, textStart) } - markEnd = start + startSpaces + match[1].length + markStart = matchStart + markEnd = markStart + match[m].length } - tr.addMark(start, markEnd, markType.create(attrs)) + tr.addMark(markStart, markEnd, markType.create(attrs)) tr.removeStoredMark(markType) // Do not continue with mark. return tr }) diff --git a/packages/tiptap-extensions/src/marks/Italic.js b/packages/tiptap-extensions/src/marks/Italic.js index e3d79e75..30f68621 100644 --- a/packages/tiptap-extensions/src/marks/Italic.js +++ b/packages/tiptap-extensions/src/marks/Italic.js @@ -30,13 +30,15 @@ export default class Italic extends Mark { inputRules({ type }) { return [ - markInputRule(/(?:^|[^*_])(?:\*|_)([^*_]+)(?:\*|_)$/, type), + markInputRule(/(?:^|[^_])(_([^_]+)_)$/, type), + markInputRule(/(?:^|[^*])(\*([^*]+)\*)$/, type), ] } pasteRules({ type }) { return [ - markPasteRule(/(?:^|[^*_])(?:\*|_)([^*_]+)(?:\*|_)/g, type), + markPasteRule(/_([^_]+)_/g, type), + markPasteRule(/\*([^*]+)\*/g, type), ] }