diff --git a/packages/tiptap-commands/src/commands/nodeInputRule.js b/packages/tiptap-commands/src/commands/nodeInputRule.js new file mode 100644 index 00000000..05fde32c --- /dev/null +++ b/packages/tiptap-commands/src/commands/nodeInputRule.js @@ -0,0 +1,14 @@ +import { InputRule } from 'prosemirror-inputrules' + +export default function (regexp, type, getAttrs) { + return new InputRule(regexp, (state, match, start, end) => { + const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs + const { tr } = state + + if (match[0]) { + tr.replaceWith(start - 1, end, type.create(attrs)) + } + + return tr + }) +} diff --git a/packages/tiptap-commands/src/index.js b/packages/tiptap-commands/src/index.js index 33e90265..c200c2d0 100644 --- a/packages/tiptap-commands/src/index.js +++ b/packages/tiptap-commands/src/index.js @@ -40,6 +40,7 @@ import { import insertText from './commands/insertText' import markInputRule from './commands/markInputRule' +import nodeInputRule from './commands/nodeInputRule' import pasteRule from './commands/pasteRule' import removeMark from './commands/removeMark' import replaceText from './commands/replaceText' @@ -91,6 +92,7 @@ export { // custom insertText, markInputRule, + nodeInputRule, pasteRule, removeMark, replaceText, diff --git a/packages/tiptap-extensions/src/nodes/HorizontalRule.js b/packages/tiptap-extensions/src/nodes/HorizontalRule.js index 23fede78..f74d02a5 100644 --- a/packages/tiptap-extensions/src/nodes/HorizontalRule.js +++ b/packages/tiptap-extensions/src/nodes/HorizontalRule.js @@ -1,4 +1,5 @@ import { Node } from 'tiptap' +import { nodeInputRule } from 'tiptap-commands' export default class HorizontalRule extends Node { get name() { @@ -16,4 +17,10 @@ export default class HorizontalRule extends Node { commands({ type }) { return () => (state, dispatch) => dispatch(state.tr.replaceSelectionWith(type.create())) } + + inputRules({ type }) { + return [ + nodeInputRule(/^(?:---|___\s|\*\*\*\s)$/, type), + ] + } }