diff --git a/packages/tiptap-commands/src/commands/markInputRule.js b/packages/tiptap-commands/src/commands/markInputRule.js new file mode 100644 index 00000000..78f16a53 --- /dev/null +++ b/packages/tiptap-commands/src/commands/markInputRule.js @@ -0,0 +1,20 @@ +import { InputRule } from 'prosemirror-inputrules' + +export default function (regexp, markType, getAttrs) { + return new InputRule(regexp, (state, match, start, end) => { + let attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs + let tr = state.tr + + if (match[1]) { + let textStart = start + match[0].indexOf(match[1]) + let textEnd = textStart + match[1].length + if (textEnd < end) tr.delete(textEnd, end) + if (textStart > start) tr.delete(start, textStart) + end = start + match[1].length + } + + tr.addMark(start, end, markType.create(attrs)) + tr.removeStoredMark(markType) // Do not continue with mark. + return tr + }) +} diff --git a/packages/tiptap-commands/src/index.js b/packages/tiptap-commands/src/index.js index 074f68fd..6218b9d7 100644 --- a/packages/tiptap-commands/src/index.js +++ b/packages/tiptap-commands/src/index.js @@ -38,6 +38,7 @@ import { textblockTypeInputRule, } from 'prosemirror-inputrules' +import markInputRule from './commands/markInputRule' import removeMark from './commands/removeMark' import toggleBlockType from './commands/toggleBlockType' import toggleList from './commands/toggleList' @@ -82,6 +83,7 @@ export { textblockTypeInputRule, // custom + markInputRule, removeMark, toggleBlockType, toggleList, diff --git a/packages/tiptap-extensions/src/marks/Bold.js b/packages/tiptap-extensions/src/marks/Bold.js index b94034d9..a6dba903 100644 --- a/packages/tiptap-extensions/src/marks/Bold.js +++ b/packages/tiptap-extensions/src/marks/Bold.js @@ -1,5 +1,5 @@ import { Mark } from 'tiptap' -import { toggleMark } from 'tiptap-commands' +import { toggleMark, markInputRule } from 'tiptap-commands' export default class BoldMark extends Mark { @@ -36,4 +36,10 @@ export default class BoldMark extends Mark { return toggleMark(type) } + inputRules({ type }) { + return [ + markInputRule(/(?:\*\*|__)([^\*_]+)(?:\*\*|__)$/, type), + ] + } + } diff --git a/packages/tiptap-extensions/src/marks/Code.js b/packages/tiptap-extensions/src/marks/Code.js index 1762e21d..49e4c91a 100644 --- a/packages/tiptap-extensions/src/marks/Code.js +++ b/packages/tiptap-extensions/src/marks/Code.js @@ -1,5 +1,5 @@ import { Mark } from 'tiptap' -import { toggleMark } from 'tiptap-commands' +import { toggleMark, markInputRule } from 'tiptap-commands' export default class CodeMark extends Mark { @@ -26,4 +26,10 @@ export default class CodeMark extends Mark { return toggleMark(type) } + inputRules({ type }) { + return [ + markInputRule(/(?:`)([^`]+)(?:`)$/, type), + ] + } + } diff --git a/packages/tiptap-extensions/src/marks/Italic.js b/packages/tiptap-extensions/src/marks/Italic.js index aad09e06..6a513f37 100644 --- a/packages/tiptap-extensions/src/marks/Italic.js +++ b/packages/tiptap-extensions/src/marks/Italic.js @@ -1,5 +1,5 @@ import { Mark } from 'tiptap' -import { toggleMark } from 'tiptap-commands' +import { toggleMark, markInputRule } from 'tiptap-commands' export default class ItalicMark extends Mark { @@ -28,4 +28,10 @@ export default class ItalicMark extends Mark { return toggleMark(type) } + inputRules({ type }) { + return [ + markInputRule(/(?:^|[^\*_])(?:\*|_)([^\*_]+)(?:\*|_)$/, type), + ] + } + }