// adapted from: https://github.com/aguingand/tiptap-markdown/blob/main/src/extensions/tiptap/clipboard.js - MIT import { Extension } from "@tiptap/core"; import { Plugin, PluginKey } from "@tiptap/pm/state"; import { DOMParser } from "@tiptap/pm/model"; import { find } from "linkifyjs"; import { markdownToHtml } from "@docmost/editor-ext"; export const MarkdownClipboard = Extension.create({ name: "markdownClipboard", priority: 50, addOptions() { return { transformPastedText: false, }; }, addProseMirrorPlugins() { return [ new Plugin({ key: new PluginKey("markdownClipboard"), props: { clipboardTextParser: (text, context, plainText) => { const link = find(text, { defaultProtocol: "http", }).find((item) => item.isLink && item.value === text); if (plainText || !this.options.transformPastedText || link) { // don't parse plaintext link to allow link paste handler to work // pasting with shift key prevents formatting return null; } const parsed = markdownToHtml(text); return DOMParser.fromSchema(this.editor.schema).parseSlice( elementFromString(parsed), { preserveWhitespace: true, context, }, ); }, }, }), ]; }, }); function elementFromString(value) { // add a wrapper to preserve leading and trailing whitespace const wrappedValue = `${value}`; return new window.DOMParser().parseFromString(wrappedValue, "text/html").body; }