From 24f8f07f41d1721ddd78f2cc4b8aeb24d5755e44 Mon Sep 17 00:00:00 2001 From: fantasticit Date: Tue, 5 Jul 2022 11:56:37 +0800 Subject: [PATCH] tiptap: fix paste code --- .../src/tiptap/core/extensions/code-block.ts | 53 ------------------- .../src/tiptap/core/extensions/paste.ts | 17 +++--- 2 files changed, 7 insertions(+), 63 deletions(-) diff --git a/packages/client/src/tiptap/core/extensions/code-block.ts b/packages/client/src/tiptap/core/extensions/code-block.ts index 91d8b277..2f11f720 100644 --- a/packages/client/src/tiptap/core/extensions/code-block.ts +++ b/packages/client/src/tiptap/core/extensions/code-block.ts @@ -242,59 +242,6 @@ export const BuiltInCodeBlock = Node.create({ }), ]; }, - - addProseMirrorPlugins() { - return [ - // this plugin creates a code block for pasted content from VS Code - // we can also detect the copied code language - new Plugin({ - key: new PluginKey('codeBlockVSCodeHandler'), - props: { - handlePaste: (view, event) => { - if (!event.clipboardData) { - return false; - } - - // don’t create a new code block within code blocks - if (this.editor.isActive(this.type.name)) { - return false; - } - - const text = event.clipboardData.getData('text/plain'); - const vscode = event.clipboardData.getData('vscode-editor-data'); - const vscodeData = vscode ? JSON.parse(vscode) : undefined; - const language = vscodeData?.mode; - - if (!text || !language) { - return false; - } - - const { tr } = view.state; - - // create an empty code block - tr.replaceSelectionWith(this.type.create({ language })); - - // put cursor inside the newly created code block - tr.setSelection(TextSelection.near(tr.doc.resolve(Math.max(0, tr.selection.from - 2)))); - - // add text to code block - // strip carriage return chars from text pasted as code - // see: https://github.com/ProseMirror/prosemirror-view/commit/a50a6bcceb4ce52ac8fcc6162488d8875613aacd - tr.insertText(text.replace(/\r\n?/g, '\n')); - - // store meta information - // this is useful for other plugins that depends on the paste event - // like the paste rule plugin - tr.setMeta('paste', true); - - view.dispatch(tr); - - return true; - }, - }, - }), - ]; - }, }); export interface CodeBlockLowlightOptions extends CodeBlockOptions { diff --git a/packages/client/src/tiptap/core/extensions/paste.ts b/packages/client/src/tiptap/core/extensions/paste.ts index 530b9898..8e646f72 100644 --- a/packages/client/src/tiptap/core/extensions/paste.ts +++ b/packages/client/src/tiptap/core/extensions/paste.ts @@ -2,7 +2,7 @@ import { Extension } from '@tiptap/core'; import { safeJSONParse } from 'helpers/json'; import { toggleMark } from 'prosemirror-commands'; import { DOMParser, Fragment, Schema } from 'prosemirror-model'; -import { Plugin, PluginKey } from 'prosemirror-state'; +import { Plugin, PluginKey, TextSelection } from 'prosemirror-state'; import { EXTENSION_PRIORITY_HIGHEST } from 'tiptap/core/constants'; import { debug, @@ -132,15 +132,12 @@ export const Paste = Extension.create({ if (pasteCodeLanguage && pasteCodeLanguage !== 'markdown') { event.preventDefault(); - view.dispatch( - view.state.tr - .replaceSelectionWith( - view.state.schema.nodes.codeBlock.create({ - language: Object.keys(LANGUAGES).includes(vscodeMeta.mode) ? vscodeMeta.mode : null, - }) - ) - .insertText(text) - ); + const { tr } = view.state; + tr.replaceSelectionWith(view.state.schema.nodes.codeBlock.create({ language: pasteCodeLanguage })); + tr.setSelection(TextSelection.near(tr.doc.resolve(Math.max(0, tr.selection.from - 2)))); + tr.insertText(text.replace(/\r\n?/g, '\n')); + tr.setMeta('paste', true); + view.dispatch(tr); return true; }