From 26e672e2f02a8f94941c704f3cd6cc4adef40df7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Ku=CC=88hn?= Date: Thu, 6 May 2021 18:39:47 +0200 Subject: [PATCH] feat: add addExtensions option --- packages/core/src/Extension.ts | 11 ++++++++++ packages/core/src/ExtensionManager.ts | 29 +++++++++++++++++++++++++-- packages/core/src/Mark.ts | 11 ++++++++++ packages/core/src/Node.ts | 11 ++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/packages/core/src/Extension.ts b/packages/core/src/Extension.ts index a8e30145..1d89d5d1 100644 --- a/packages/core/src/Extension.ts +++ b/packages/core/src/Extension.ts @@ -5,6 +5,7 @@ import { Node } from './Node' import { Mark } from './Mark' import mergeDeep from './utilities/mergeDeep' import { + AnyExtension, GlobalAttributes, RawCommands, ParentConfig, @@ -92,6 +93,16 @@ declare module '@tiptap/core' { parent: ParentConfig>['addProseMirrorPlugins'], }) => Plugin[], + /** + * Extensions + */ + addExtensions?: (this: { + name: string, + options: Options, + editor: Editor, + parent: ParentConfig>['addExtensions'], + }) => AnyExtension[], + /** * Extend Node Schema */ diff --git a/packages/core/src/ExtensionManager.ts b/packages/core/src/ExtensionManager.ts index e48d6510..5b3a4bfa 100644 --- a/packages/core/src/ExtensionManager.ts +++ b/packages/core/src/ExtensionManager.ts @@ -27,7 +27,7 @@ export default class ExtensionManager { constructor(extensions: Extensions, editor: Editor) { this.editor = editor - this.extensions = this.sort(extensions) + this.extensions = this.sort(this.flatten(extensions)) this.schema = getSchema(this.extensions) this.extensions.forEach(extension => { @@ -128,7 +128,32 @@ export default class ExtensionManager { }) } - private sort(extensions: Extensions) { + private flatten(extensions: Extensions): Extensions { + return extensions + .map(extension => { + const context = { + name: extension.name, + options: extension.options, + editor: this.editor, + } + + const addExtensions = getExtensionField( + extension, + 'addExtensions', + context, + ) + + if (addExtensions) { + return this.flatten(addExtensions()) + } + + return extension + }) + // `Infinity` will break TypeScript so we set a number that is probably high enough + .flat(10) + } + + private sort(extensions: Extensions): Extensions { const defaultPriority = 100 return extensions.sort((a, b) => { diff --git a/packages/core/src/Mark.ts b/packages/core/src/Mark.ts index 6aaa5db4..4714ab1f 100644 --- a/packages/core/src/Mark.ts +++ b/packages/core/src/Mark.ts @@ -8,6 +8,7 @@ import { Plugin, Transaction } from 'prosemirror-state' import { InputRule } from 'prosemirror-inputrules' import mergeDeep from './utilities/mergeDeep' import { + AnyExtension, Attributes, RawCommands, GlobalAttributes, @@ -103,6 +104,16 @@ declare module '@tiptap/core' { parent: ParentConfig>['addProseMirrorPlugins'], }) => Plugin[], + /** + * Extensions + */ + addExtensions?: (this: { + name: string, + options: Options, + editor: Editor, + parent: ParentConfig>['addExtensions'], + }) => AnyExtension[], + /** * Extend Node Schema */ diff --git a/packages/core/src/Node.ts b/packages/core/src/Node.ts index 58708adc..23c28db3 100644 --- a/packages/core/src/Node.ts +++ b/packages/core/src/Node.ts @@ -8,6 +8,7 @@ import { Plugin, Transaction } from 'prosemirror-state' import { InputRule } from 'prosemirror-inputrules' import mergeDeep from './utilities/mergeDeep' import { + AnyExtension, Attributes, NodeViewRenderer, GlobalAttributes, @@ -103,6 +104,16 @@ declare module '@tiptap/core' { parent: ParentConfig>['addProseMirrorPlugins'], }) => Plugin[], + /** + * Extensions + */ + addExtensions?: (this: { + name: string, + options: Options, + editor: Editor, + parent: ParentConfig>['addExtensions'], + }) => AnyExtension[], + /** * Extend Node Schema */