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 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

+
" +`; + +exports[`convert br tags to paragraphs 11`] = ` +"
+

Hello

world

+ +
" +`; + +exports[`convert br tags to paragraphs 12`] = ` +"
+

Write notes

Welcome of Notesnook, an syncing.

Enjoy the read!

vision?

everyone means

+ +
" +`; + exports[`properly format codeblocks 1`] = ` "

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

+ +
` + ], + [ + `
+

Write notes


Welcome of Notesnook, an syncing.


Enjoy the read!



vision?


everyone means

+ +
` ] ];