diff --git a/src/editor/deserialize.ts b/src/editor/deserialize.ts index 3b9c1cee2c..1d2d1f6b29 100644 --- a/src/editor/deserialize.ts +++ b/src/editor/deserialize.ts @@ -247,6 +247,10 @@ function parseNode(n: Node, pc: PartCreator, opts: IParseOptions, mkListItem?: ( return pc.plainWithEmoji(`${delimLeft}${tex}${delimRight}`); } + // Spoilers are translated back into their slash command form + else if ((n as Element).hasAttribute("data-mx-spoiler")) { + return [pc.plain("/spoiler "), ...parseChildren(n, pc, opts)]; + } } } diff --git a/test/editor/deserialize-test.ts b/test/editor/deserialize-test.ts index 275f34ca8f..2bd4925ec0 100644 --- a/test/editor/deserialize-test.ts +++ b/test/editor/deserialize-test.ts @@ -98,6 +98,11 @@ describe("editor/deserialize", function () { expect(parts.length).toBe(1); expect(parts[0]).toStrictEqual({ type: "plain", text: "/me says DON'T SHOUT!" }); }); + it("spoiler", function () { + const parts = normalize(parseEvent(textMessage("/spoiler broiler"), createPartCreator())); + expect(parts.length).toBe(1); + expect(parts[0]).toStrictEqual({ type: "plain", text: "/spoiler broiler" }); + }); }); describe("html messages", function () { it("inline styling", function () { @@ -295,6 +300,13 @@ describe("editor/deserialize", function () { expect(parts.length).toBe(1); expect(parts[0]).toStrictEqual({ type: "plain", text: "/me says _DON'T SHOUT_!" }); }); + it("spoiler", function () { + const parts = normalize( + parseEvent(htmlMessage("broiler"), createPartCreator()), + ); + expect(parts.length).toBe(1); + expect(parts[0]).toStrictEqual({ type: "plain", text: "/spoiler broiler" }); + }); it("preserves nested quotes", () => { const html = "
foo"; const parts = normalize(parseEvent(htmlMessage(html), createPartCreator()));bar