fix markInputRules for italics mark

add another layer of matching by introducing support for second match group
since javascript (at least in current browsers) still lacks lookbehind in regex

so now supports

/nomatch(markstart(text)markend)nomatch/ and still supports the
/markstart(text)markend/ syntax

all `nomatch` will be kept as is so kindof simulating lookbehinds
This commit is contained in:
Marius Tolzmann 2019-05-07 18:50:04 +02:00
parent b0c28da3c1
commit 98cf0e425a
2 changed files with 19 additions and 13 deletions

View File

@ -3,23 +3,28 @@ import { InputRule } from 'prosemirror-inputrules'
export default function (regexp, markType, getAttrs) { export default function (regexp, markType, getAttrs) {
return new InputRule(regexp, (state, match, start, end) => { return new InputRule(regexp, (state, match, start, end) => {
const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs
const { tr } = state const { tr } = state
let markEnd = end const m = match.length - 1
let markEnd = end
let markStart = start
if (match[1]) { if (match[m]) {
const startSpaces = match[0].search(/\S/) const matchStart = start + match[0].indexOf(match[m - 1])
const textStart = start + match[0].indexOf(match[1]) const matchEnd = matchStart + match[m - 1].length - 1
const textEnd = textStart + match[1].length const textStart = matchStart + match[m - 1].lastIndexOf(match[m])
if (textEnd < end) { const textEnd = textStart + match[m].length
tr.delete(textEnd, end)
if (textEnd < matchEnd) {
tr.delete(textEnd, matchEnd)
} }
if (textStart > start) { if (textStart > matchStart) {
tr.delete(start + startSpaces, textStart) 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. tr.removeStoredMark(markType) // Do not continue with mark.
return tr return tr
}) })

View File

@ -30,7 +30,8 @@ export default class Italic extends Mark {
inputRules({ type }) { inputRules({ type }) {
return [ return [
markInputRule(/(?:^|[^*_])(?:\*|_)([^*_]+)(?:\*|_)$/, type), markInputRule(/(?:^|[^_])(_([^_]+)_)$/, type),
markInputRule(/(?:^|[^*])(\*([^*]+)\*)$/, type),
] ]
} }