mirror of
https://github.com/webstudio-is/webstudio.git
synced 2026-10-29 08:07:48 +09:00
41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
import { gfm, gfmHtml } from "micromark-extension-gfm";
|
|
import { micromark } from "micromark";
|
|
import { insertWebstudioFragmentAt } from "../instance-utils";
|
|
import { denormalizeSrcProps } from "./asset-upload";
|
|
import { generateFragmentFromHtml } from "../html";
|
|
import type { Plugin } from "./init-copy-paste";
|
|
|
|
const parse = (clipboardData: string) => {
|
|
const html = micromark(clipboardData, "utf-8", {
|
|
extensions: [gfm()],
|
|
htmlExtensions: [gfmHtml()],
|
|
});
|
|
const fragment = generateFragmentFromHtml(html);
|
|
const instances = new Map(fragment.instances.map((item) => [item.id, item]));
|
|
for (const instance of fragment.instances) {
|
|
if (instance.tag === "img") {
|
|
delete instance.tag;
|
|
instance.component = "Image";
|
|
}
|
|
}
|
|
fragment.instances = Array.from(instances.values());
|
|
return fragment;
|
|
};
|
|
|
|
export const markdown: Plugin = {
|
|
name: "markdown",
|
|
mimeType: "text/plain",
|
|
onPaste: async (clipboardData: string) => {
|
|
let fragment = parse(clipboardData);
|
|
if (fragment === undefined) {
|
|
return false;
|
|
}
|
|
fragment = await denormalizeSrcProps(fragment);
|
|
return insertWebstudioFragmentAt(fragment);
|
|
},
|
|
};
|
|
|
|
export const __testing__ = {
|
|
parse,
|
|
};
|