Files
webstudio/apps/builder/app/shared/copy-paste/plugin-markdown.ts
Oleg Isonen 1784d635c0 feat: Paste HTML with CSS with full selectors and regular syntax support (#5648)
## Description

1. What is this PR about (link the issue and add a short description)

## Steps for reproduction

1. click button
2. expect xyz

## Code Review

- [ ] hi @kof, I need you to do
  - conceptual review (architecture, feature-correctness)
  - detailed review (read every line)
  - test it on preview

## Before requesting a review

- [ ] made a self-review
- [ ] added inline comments where things may be not obvious (the "why",
not "what")

## Before merging

- [ ] tested locally and on preview environment (preview dev login:
0000)
- [ ] updated [test
cases](https://github.com/webstudio-is/webstudio/blob/main/apps/builder/docs/test-cases.md)
document
- [ ] added tests
- [ ] if any new env variables are added, added them to `.env` file
2026-03-20 19:56:36 +01:00

42 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 { 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;
};
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,
};