From b7107832c04f78a6aa1681b47b0e8d747420aac0 Mon Sep 17 00:00:00 2001 From: Illia Sakovich Date: Mon, 8 Apr 2024 15:12:40 +0400 Subject: [PATCH] Add `blockSeparator` option to `clipboardTextSerializer` core extension (#5019) * Update clipboardTextSerializer.ts * Update clipboardTextSerializer.ts * feat(core): add core extension options to editor options --------- Co-authored-by: Dominik Biedebach --- packages/core/src/Editor.ts | 19 ++++++++++++++++--- .../src/extensions/clipboardTextSerializer.ts | 15 ++++++++++++++- packages/core/src/types.ts | 5 +++++ 3 files changed, 35 insertions(+), 4 deletions(-) diff --git a/packages/core/src/Editor.ts b/packages/core/src/Editor.ts index 3bc5fff098..e461b3cd88 100644 --- a/packages/core/src/Editor.ts +++ b/packages/core/src/Editor.ts @@ -9,7 +9,9 @@ import { EditorView } from '@tiptap/pm/view' import { CommandManager } from './CommandManager.js' import { EventEmitter } from './EventEmitter.js' import { ExtensionManager } from './ExtensionManager.js' -import * as extensions from './extensions/index.js' +import { + ClipboardTextSerializer, Commands, Editable, FocusEvents, Keymap, Tabindex, +} from './extensions/index.js' import { createDocument } from './helpers/createDocument.js' import { getAttributes } from './helpers/getAttributes.js' import { getHTMLFromFragment } from './helpers/getHTMLFromFragment.js' @@ -32,7 +34,7 @@ import { import { createStyleTag } from './utilities/createStyleTag.js' import { isFunction } from './utilities/isFunction.js' -export { extensions } +export * as extensions from './extensions/index.js' export interface HTMLElement { editor?: Editor @@ -63,6 +65,7 @@ export class Editor extends EventEmitter { editable: true, editorProps: {}, parseOptions: {}, + coreExtensionOptions: {}, enableInputRules: true, enablePasteRules: true, enableCoreExtensions: true, @@ -235,7 +238,17 @@ export class Editor extends EventEmitter { * Creates an extension manager. */ private createExtensionManager(): void { - const coreExtensions = this.options.enableCoreExtensions ? Object.values(extensions) : [] + + const coreExtensions = this.options.enableCoreExtensions ? [ + Editable, + ClipboardTextSerializer.configure({ + blockSeparator: this.options.coreExtensionOptions?.clipboardTextSerializer?.blockSeparator, + }), + Commands, + FocusEvents, + Keymap, + Tabindex, + ] : [] const allExtensions = [...coreExtensions, ...this.options.extensions].filter(extension => { return ['extension', 'node', 'mark'].includes(extension?.type) }) diff --git a/packages/core/src/extensions/clipboardTextSerializer.ts b/packages/core/src/extensions/clipboardTextSerializer.ts index 0986fc81cb..f42a9e8f64 100644 --- a/packages/core/src/extensions/clipboardTextSerializer.ts +++ b/packages/core/src/extensions/clipboardTextSerializer.ts @@ -4,9 +4,19 @@ import { Extension } from '../Extension.js' import { getTextBetween } from '../helpers/getTextBetween.js' import { getTextSerializersFromSchema } from '../helpers/getTextSerializersFromSchema.js' -export const ClipboardTextSerializer = Extension.create({ +export type ClipboardTextSerializerOptions = { + blockSeparator?: string, +} + +export const ClipboardTextSerializer = Extension.create({ name: 'clipboardTextSerializer', + addOptions() { + return { + blockSeparator: undefined, + } + }, + addProseMirrorPlugins() { return [ new Plugin({ @@ -23,6 +33,9 @@ export const ClipboardTextSerializer = Extension.create({ const range = { from, to } return getTextBetween(doc, range, { + ...(this.options.blockSeparator !== undefined + ? { blockSeparator: this.options.blockSeparator } + : {}), textSerializers, }) }, diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index ea38ffee99..291cf35798 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -59,6 +59,11 @@ export interface EditorOptions { editable: boolean editorProps: EditorProps parseOptions: ParseOptions + coreExtensionOptions?: { + clipboardTextSerializer?: { + blockSeparator?: string + } + } enableInputRules: EnableRules enablePasteRules: EnableRules enableCoreExtensions: boolean