diff --git a/packages/super-editor/src/core/InputRule.js b/packages/super-editor/src/core/InputRule.js index f3294fc8f6..4e27f3163a 100644 --- a/packages/super-editor/src/core/InputRule.js +++ b/packages/super-editor/src/core/InputRule.js @@ -392,10 +392,13 @@ export function sanitizeHtml(html, forbiddenTags = ['meta', 'svg', 'script', 'st continue; } - // Remove linebreaktype here - we don't want it when pasting HTML + // Internal/runtime-only attributes must not be preserved across paste. if (child.hasAttribute('linebreaktype')) { child.removeAttribute('linebreaktype'); } + if (child.hasAttribute('data-sd-block-id')) { + child.removeAttribute('data-sd-block-id'); + } walkAndClean(child); } diff --git a/packages/super-editor/src/core/InputRule.test.js b/packages/super-editor/src/core/InputRule.test.js index 7b839896a3..a874f28111 100644 --- a/packages/super-editor/src/core/InputRule.test.js +++ b/packages/super-editor/src/core/InputRule.test.js @@ -80,11 +80,15 @@ describe('InputRule helpers', () => { }); it('sanitizes forbidden tags and attributes', () => { - const sanitized = sanitizeHtml('
ok
+
2. Second item
@@ -133,6 +133,7 @@ describe('handleDocxPaste', () => { const parsedNode = parseSpy.mock.calls[0][0]; const generatedParagraphs = Array.from(parsedNode.querySelectorAll('p[data-list-level]')); expect(generatedParagraphs).toHaveLength(2); + expect(parsedNode.querySelector('[data-sd-block-id]')).toBeNull(); expect(generatedParagraphs[0].getAttribute('data-num-id')).toBe('200'); expect(generatedParagraphs[0].getAttribute('data-list-level')).toBe('[1]'); expect(generatedParagraphs[1].getAttribute('data-list-level')).toBe('[2]');