import { gfm, gfmHtml } from "micromark-extension-gfm";
import { micromark } from "micromark";
import { denormalizeSrcProps } from "./asset-upload";
import { generateFragmentFromHtml } from "@webstudio-is/project-build/runtime";
import { pasteHandled, pasteIgnored, type Plugin } from "./copy-paste";
import {
hasFragmentData,
insertFragmentWithBreakpointWarning,
} from "./fragment-utils";
const parse = (clipboardData: string) => {
const html = micromark(clipboardData, "utf-8", {
extensions: [gfm()],
htmlExtensions: [gfmHtml()],
});
const { skippedSelectors: _skipped, ...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;
};
const handlePasteMarkdown = async (clipboardData: string) => {
let fragment = parse(clipboardData);
if (hasFragmentData(fragment) === false) {
return pasteIgnored;
}
fragment = await denormalizeSrcProps(fragment);
await insertFragmentWithBreakpointWarning(fragment);
return pasteHandled;
};
export const markdown: Plugin = {
name: "markdown",
mimeType: "text/plain",
onPaste: handlePasteMarkdown,
};
export const __testing__ = {
parse,
};