| import type { NodeType, Schema } from 'prosemirror-model'; |
| import { |
| inputRules, |
| wrappingInputRule, |
| smartQuotes, |
| emDash, |
| ellipsis, |
| InputRule, |
| } from 'prosemirror-inputrules'; |
|
|
| const blockQuoteRule = (nodeType: NodeType) => wrappingInputRule(/^\s*>\s$/, nodeType); |
|
|
| const orderedListRule = (nodeType: NodeType) => |
| wrappingInputRule( |
| /^(\d+)\.\s$/, |
| nodeType, |
| (match) => ({ order: +match[1] }), |
| (match, node) => node.childCount + node.attrs.order === +match[1], |
| ); |
|
|
| const bulletListRule = (nodeType: NodeType) => wrappingInputRule(/^\s*([-+*])\s$/, nodeType); |
|
|
| const codeRule = () => { |
| const inputRegex = /(?:^|\s)((?:`)((?:[^`]+))(?:`))$/; |
|
|
| return new InputRule(inputRegex, (state, match, start, end) => { |
| const { schema } = state; |
|
|
| const tr = state.tr.insertText(`${match[2]} `, start, end); |
| const mark = schema.marks.code.create(); |
|
|
| return tr.addMark(start, start + match[2].length, mark); |
| }); |
| }; |
|
|
| const linkRule = () => { |
| const urlRegEx = /(?:https?:\/\/)?[\w-]+(?:\.[\w-]+)+\.?(?:\d+)?(?:\/\S*)?$/; |
|
|
| return new InputRule(urlRegEx, (state, match, start, end) => { |
| const { schema } = state; |
|
|
| const tr = state.tr.insertText(match[0], start, end); |
| const mark = schema.marks.link.create({ href: match[0], title: match[0] }); |
|
|
| return tr.addMark(start, start + match[0].length, mark); |
| }); |
| }; |
|
|
| export const buildInputRules = (schema: Schema) => { |
| const rules = [...smartQuotes, ellipsis, emDash]; |
| rules.push(blockQuoteRule(schema.nodes.blockquote)); |
| rules.push(orderedListRule(schema.nodes.ordered_list)); |
| rules.push(bulletListRule(schema.nodes.bullet_list)); |
| rules.push(codeRule()); |
| rules.push(linkRule()); |
|
|
| return inputRules({ rules }); |
| }; |
|
|