diff --git a/packages/editor/src/extensions/clipboard/clipboard-dom-parser.ts b/packages/editor/src/extensions/clipboard/clipboard-dom-parser.ts index 60ffff2c85..e6992d6cd3 100644 --- a/packages/editor/src/extensions/clipboard/clipboard-dom-parser.ts +++ b/packages/editor/src/extensions/clipboard/clipboard-dom-parser.ts @@ -75,29 +75,43 @@ export function convertBrToSingleSpacedParagraphs(dom: HTMLElement | Document) { for (const br of dom.querySelectorAll("br")) { let paragraph = br.closest("p"); - // if no paragraph is found over the br, we add one. - if (!paragraph && br.parentElement) { - const parent = br.parentElement; - const p = document.createElement("p"); - p.append(...parent.childNodes); - parent.append(p); - paragraph = p; + if (!paragraph) { + // we split and wrap all text nodes into their own single spaced + // paragraphs + const nodes = getSiblingTextNodes(br); + if (nodes.length > 0) { + paragraph = document.createElement("p"); + paragraph.dataset.spacing = "single"; + paragraph.append(...nodes); + br.replaceWith(paragraph); + continue; + } + + // we convert the next pargraph into a single spaced paragraph + if (br.nextElementSibling instanceof HTMLParagraphElement) { + br.nextElementSibling.dataset.spacing = "single"; + } + + // just convert all br tags into single spaced paragraphs + const newParagraph = document.createElement("p"); + newParagraph.dataset.spacing = "single"; + br.replaceWith(newParagraph); } - // if paragraph is empty, we clean out the paragraph and move on. if ( paragraph && (paragraph.childNodes.length === 1 || !paragraph.textContent || paragraph.textContent.trim().length === 0) ) { + // if paragraph is empty, we clean out the paragraph and move on. paragraph.innerHTML = ""; continue; } if (paragraph) { splitOn(paragraph, br); - const children = Array.from(paragraph.childNodes.values()); + const children = Array.from(paragraph.childNodes); const newParagraph = document.createElement("p"); newParagraph.dataset.spacing = "single"; newParagraph.append(...children.slice(children.indexOf(br) + 1)); @@ -123,3 +137,13 @@ function splitOn(bound: Element, cutElement: Element) { } } } + +function getSiblingTextNodes(element: ChildNode) { + const siblings = []; + let sibling: ChildNode | null = element; + while ((sibling = sibling.previousSibling)) { + if (sibling.nodeType === Node.ELEMENT_NODE) break; + else if (sibling.nodeType === Node.TEXT_NODE) siblings.push(sibling); + } + return siblings; +} diff --git a/packages/editor/src/extensions/clipboard/tests/__snapshots__/clipboard-dom-parser.test.ts.snap b/packages/editor/src/extensions/clipboard/tests/__snapshots__/clipboard-dom-parser.test.ts.snap index 53be41b23f..4dc50aea3f 100644 --- a/packages/editor/src/extensions/clipboard/tests/__snapshots__/clipboard-dom-parser.test.ts.snap +++ b/packages/editor/src/extensions/clipboard/tests/__snapshots__/clipboard-dom-parser.test.ts.snap @@ -11,14 +11,12 @@ exports[`convert br tags to paragraphs 4`] = `"
line 1 exports[`convert br tags to paragraphs 5`] = `"
"`; exports[`convert br tags to paragraphs 6`] = ` -"-A troll, they call me, but I have no wish
+"
A troll, they call me, but I have no wish +
to be associated with those dolls
We lack religion, purpose, politics,
-and yet, we somehow manage to get by.
- -
" +and yet, we somehow manage to get by." `; exports[`convert br tags to paragraphs 7`] = ` @@ -54,6 +52,29 @@ exports[`convert br tags to paragraphs 9`] = ` " `; +exports[`convert br tags to paragraphs 10`] = ` +"+ I am not talking to you
+
+I am talking to you
+Hello
world
+ +Sure! Here's an implementation of a word counter for Thai that considers each syllable consisting of a consonant sound followed by a vowel sound as a word:
javascript
function countThaiWords(text) {
diff --git a/packages/editor/src/extensions/clipboard/tests/clipboard-dom-parser.test.ts b/packages/editor/src/extensions/clipboard/tests/clipboard-dom-parser.test.ts
index 8bc1494c73..fcef59e7f9 100644
--- a/packages/editor/src/extensions/clipboard/tests/clipboard-dom-parser.test.ts
+++ b/packages/editor/src/extensions/clipboard/tests/clipboard-dom-parser.test.ts
@@ -77,6 +77,26 @@ and yet, we somehow manage to get by.
you
+ I am not talking to you
+I am talking to you
+Hello
world
+ +