From 667d735a12052cae2fb47ffef88e04b3364752c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Ku=CC=88hn?= Date: Thu, 10 Sep 2020 12:28:14 +0200 Subject: [PATCH] add horizontal rule extension --- docs/src/docPages/api/extensions.md | 2 +- packages/core/index.ts | 1 + packages/core/src/inputRules/nodeInputRule.ts | 15 ++++++++++ packages/extension-horizontal-rule/index.ts | 28 +++++++++++++++++++ .../extension-horizontal-rule/package.json | 18 ++++++++++++ packages/starter-kit/index.ts | 2 ++ packages/vue-starter-kit/index.ts | 2 ++ 7 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 packages/core/src/inputRules/nodeInputRule.ts create mode 100644 packages/extension-horizontal-rule/index.ts create mode 100644 packages/extension-horizontal-rule/package.json diff --git a/docs/src/docPages/api/extensions.md b/docs/src/docPages/api/extensions.md index f8c77e9c..b11fdde9 100644 --- a/docs/src/docPages/api/extensions.md +++ b/docs/src/docPages/api/extensions.md @@ -22,7 +22,7 @@ You don’t have to use it, but we prepared a `@tiptap/vue-starter-kit` which in | [HardBreak](/api/extensions/hard-break) | Yes | [GitHub](https://github.com/ueberdosis/tiptap-next/blob/main/packages/extension-hard-break/) | | [Heading](/api/extensions/heading) | Yes | [GitHub](https://github.com/ueberdosis/tiptap-next/blob/main/packages/extension-heading/) | | [History](/api/extensions/history) | Yes | [GitHub](https://github.com/ueberdosis/tiptap-next/blob/main/packages/extension-history/) | -| [HorizontalRule](/api/extensions/horizontal-rule) | – | [GitHub](https://github.com/ueberdosis/tiptap-next/blob/main/packages/extension-horizontal-rule/) | +| [HorizontalRule](/api/extensions/horizontal-rule) | Yes | [GitHub](https://github.com/ueberdosis/tiptap-next/blob/main/packages/extension-horizontal-rule/) | | [Italic](/api/extensions/italic) | Yes | [GitHub](https://github.com/ueberdosis/tiptap-next/blob/main/packages/extension-italic/) | | [Link](/api/extensions/link) | – | [GitHub](https://github.com/ueberdosis/tiptap-next/blob/main/packages/extension-link/) | | [OrderedList](/api/extensions/ordered-list) | – | [GitHub](https://github.com/ueberdosis/tiptap-next/blob/main/packages/extension-ordered-list/) | diff --git a/packages/core/index.ts b/packages/core/index.ts index 415ed0e1..99135e79 100644 --- a/packages/core/index.ts +++ b/packages/core/index.ts @@ -8,6 +8,7 @@ export { default as Node } from './src/Node' export { default as Mark } from './src/Mark' export { Extensions } from './src/types' +export { default as nodeInputRule } from './src/inputRules/nodeInputRule' export { default as markInputRule } from './src/inputRules/markInputRule' export { default as markPasteRule } from './src/pasteRules/markPasteRule' diff --git a/packages/core/src/inputRules/nodeInputRule.ts b/packages/core/src/inputRules/nodeInputRule.ts new file mode 100644 index 00000000..057798b9 --- /dev/null +++ b/packages/core/src/inputRules/nodeInputRule.ts @@ -0,0 +1,15 @@ +import { InputRule } from 'prosemirror-inputrules' +import { NodeType } from 'prosemirror-model' + +export default function (regexp: RegExp, type: NodeType, getAttrs?: Function) { + 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 + }) +} \ No newline at end of file diff --git a/packages/extension-horizontal-rule/index.ts b/packages/extension-horizontal-rule/index.ts new file mode 100644 index 00000000..9804d105 --- /dev/null +++ b/packages/extension-horizontal-rule/index.ts @@ -0,0 +1,28 @@ +import { Node, nodeInputRule } from '@tiptap/core' + +declare module '@tiptap/core/src/Editor' { + interface Editor { + horizontalRule(): Editor, + } +} + +export default new Node() + .name('horizontalRule') + .schema(() => ({ + group: 'block', + parseDOM: [{ tag: 'hr' }], + toDOM: () => ['hr'], + })) + .commands(({ editor, type }) => ({ + horizontalRule: next => () => { + const { state, view } = editor + const { dispatch } = view + + dispatch(state.tr.replaceSelectionWith(type.create())) + next() + }, + })) + .inputRules(({ type }) => [ + nodeInputRule(/^(?:---|___\s|\*\*\*\s)$/, type), + ]) + .create() diff --git a/packages/extension-horizontal-rule/package.json b/packages/extension-horizontal-rule/package.json new file mode 100644 index 00000000..ac41c60f --- /dev/null +++ b/packages/extension-horizontal-rule/package.json @@ -0,0 +1,18 @@ +{ + "name": "@tiptap/extension-horizontal-rule", + "version": "1.0.0", + "source": "index.ts", + "main": "dist/tiptap-extension-horizontal-rule.js", + "umd:main": "dist/tiptap-extension-horizontal-rule.umd.js", + "module": "dist/tiptap-extension-horizontal-rule.mjs", + "unpkg": "dist/tiptap-extension-horizontal-rule.js", + "jsdelivr": "dist/tiptap-extension-horizontal-rule.js", + "files": [ + "src", + "dist" + ], + "peerDependencies": { + "@tiptap/core": "2.x", + "prosemirror-commands": "^1.1.3" + } +} diff --git a/packages/starter-kit/index.ts b/packages/starter-kit/index.ts index f6a3eb59..e052487d 100644 --- a/packages/starter-kit/index.ts +++ b/packages/starter-kit/index.ts @@ -11,6 +11,7 @@ import HardBreak from '@tiptap/extension-hard-break' import Strike from '@tiptap/extension-strike' import Underline from '@tiptap/extension-underline' import Blockquote from '@tiptap/extension-blockquote' +import HorizontalRule from '@tiptap/extension-horizontal-rule' export default function defaultExtensions() { return [ @@ -27,5 +28,6 @@ export default function defaultExtensions() { Strike(), Underline(), Blockquote(), + HorizontalRule(), ] } \ No newline at end of file diff --git a/packages/vue-starter-kit/index.ts b/packages/vue-starter-kit/index.ts index 4d59865c..25255d7d 100644 --- a/packages/vue-starter-kit/index.ts +++ b/packages/vue-starter-kit/index.ts @@ -13,6 +13,7 @@ import HardBreak from '@tiptap/extension-hard-break' import Strike from '@tiptap/extension-strike' import Underline from '@tiptap/extension-underline' import Blockquote from '@tiptap/extension-blockquote' +import HorizontalRule from '@tiptap/extension-horizontal-rule' export function defaultExtensions() { return [ @@ -29,5 +30,6 @@ export function defaultExtensions() { Strike(), Underline(), Blockquote(), + HorizontalRule(), ] } \ No newline at end of file