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) {
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])
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
})

View File

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