fix: move markdown clipboard extension to client app

This commit is contained in:
Philipinho
2025-01-04 21:25:05 +00:00
parent f5bc99b449
commit 95715421c6
3 changed files with 3 additions and 10 deletions

View File

@ -36,7 +36,6 @@ import {
Drawio,
Excalidraw,
Embed,
MarkdownClipboard,
} from "@docmost/editor-ext";
import {
randomElement,
@ -66,6 +65,7 @@ import fortran from "highlight.js/lib/languages/fortran";
import haskell from "highlight.js/lib/languages/haskell";
import scala from "highlight.js/lib/languages/scala";
import i18n from "@/i18n.ts";
import { MarkdownClipboard } from "@/features/editor/extensions/markdown-clipboard.ts";
const lowlight = createLowlight(common);
lowlight.register("mermaid", plaintext);
@ -133,7 +133,6 @@ export const mainExtensions = [
class: "comment-mark",
},
}),
Table.configure({
resizable: true,
lastColumnResizable: false,
@ -142,7 +141,6 @@ export const mainExtensions = [
TableRow,
TableCell,
TableHeader,
MathInline.configure({
view: MathInlineView,
}),

View File

@ -0,0 +1,53 @@
// 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 = `<body>${value}</body>`;
return new window.DOMParser().parseFromString(wrappedValue, "text/html").body;
}