perf: Add fast read-only editor (#8704)

* stash

* tests

* sp
This commit is contained in:
Tom Moor
2025-03-16 10:12:16 -04:00
committed by GitHub
parent c311ee915e
commit 6869d4cb02
4 changed files with 192 additions and 18 deletions
+128
View File
@@ -1,3 +1,4 @@
import { ProsemirrorData } from "../types";
import { CommentMark, ProsemirrorHelper } from "./ProsemirrorHelper";
describe("ProsemirrorHelper", () => {
@@ -87,4 +88,131 @@ describe("ProsemirrorHelper", () => {
expect(returnedAnchorText).toBeUndefined();
});
});
describe("getPlainParagraphs", () => {
it("should return an array of plain paragraphs", async () => {
const data = {
type: "doc",
content: [
{
type: "paragraph",
content: [
{
type: "text",
text: "some content in a paragraph",
},
],
},
{
type: "paragraph",
content: [
{
type: "text",
text: "some content in another paragraph",
},
],
},
],
} as ProsemirrorData;
const paragraphs = ProsemirrorHelper.getPlainParagraphs(data);
expect(paragraphs).toEqual([
{
type: "paragraph",
content: [
{
type: "text",
text: "some content in a paragraph",
},
],
},
{
type: "paragraph",
content: [
{
type: "text",
text: "some content in another paragraph",
},
],
},
]);
});
it("should return undefined when data contains inline nodes", async () => {
const data = {
type: "doc",
content: [
{
type: "paragraph",
content: [
{
type: "text",
text: "some content in a paragraph",
},
{
type: "emoji",
attrs: {
"data-name": "😆",
},
},
],
},
],
} as ProsemirrorData;
const paragraphs = ProsemirrorHelper.getPlainParagraphs(data);
expect(paragraphs).toBeUndefined();
});
it("should return undefined when data contains block nodes", async () => {
const data = {
type: "doc",
content: [
{
type: "blockquote",
content: [
{
type: "paragraph",
content: [
{
type: "text",
text: "some content in a paragraph",
},
],
},
],
},
],
} as ProsemirrorData;
const paragraphs = ProsemirrorHelper.getPlainParagraphs(data);
expect(paragraphs).toBeUndefined();
});
it("should return undefined when data contains marks", async () => {
const data = {
type: "doc",
content: [
{
type: "paragraph",
content: [
{
type: "text",
text: "some content in a paragraph",
marks: [
{
type: "bold",
},
],
},
],
},
],
} as ProsemirrorData;
const paragraphs = ProsemirrorHelper.getPlainParagraphs(data);
expect(paragraphs).toBeUndefined();
});
});
});
+25
View File
@@ -346,4 +346,29 @@ export class ProsemirrorHelper {
return replace(data);
}
/**
* Returns the paragraphs from the data if there are only plain paragraphs
* without any formatting. Otherwise returns undefined.
*
* @param data The ProsemirrorData object
* @returns An array of paragraph nodes or undefined
*/
static getPlainParagraphs(data: ProsemirrorData) {
const paragraphs = [];
for (const node of data.content) {
if (
node.type === "paragraph" &&
!node.content.some(
(item) =>
item.type !== "text" || (item.marks && item.marks.length > 0)
)
) {
paragraphs.push(node);
} else {
return undefined;
}
}
return paragraphs;
}
}