From 7f0a50be42cf0d3326d6904f03f875445bfb4e1b Mon Sep 17 00:00:00 2001 From: mic Date: Wed, 26 Jun 2024 22:22:57 +0200 Subject: [PATCH] correctly preservig formatting. see #70 --- js/mzta-chatgpt.js | 78 ++++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 37 deletions(-) diff --git a/js/mzta-chatgpt.js b/js/mzta-chatgpt.js index a006a188..5452e7c3 100644 --- a/js/mzta-chatgpt.js +++ b/js/mzta-chatgpt.js @@ -350,58 +350,62 @@ async function doProceed(message, customText = ''){ operation_done(); } + function removeTagsAndReturnHTML(rootElement, removeTags, preserveTags) { - removeTags.forEach(tag => { - const elements = rootElement.getElementsByTagName(tag); - while (elements.length > 0) { - const element = elements[0]; - const fragment = document.createDocumentFragment(); + const fragment = document.createDocumentFragment(); - // Preserve specified tags and their children in the correct order - let child = element.firstChild; - while (child) { - console.log(">>>>>>>>>>>> ciclo child: " + child.tagName.toLowerCase()); - const nextSibling = child.nextSibling; - if (preserveTags.includes(child.tagName.toLowerCase())) { - console.log(">>>>>>>>>>>> preserve: " + child.tagName.toLowerCase()); - fragment.appendChild(child); - } - child = nextSibling; + function handleElement(element) { + let child = element.firstChild; + while (child) { + const nextSibling = child.nextSibling; + if (preserveTags.includes(child.nodeName.toLowerCase())) { + //console.log(">>>>>>>>>>>> preserve child: " + child.tagName.toLowerCase()); + fragment.appendChild(child); + } else if (child.nodeType === Node.ELEMENT_NODE) { + //console.log(">>>>>>>>>>>> handleElement(child): " + child.tagName.toLowerCase()); + handleElement(child); } - - // Append preserved elements back to the parent of the removed element - element.parentNode.insertBefore(fragment, element); - - // Remove the element and all its remaining children - element.parentNode.removeChild(element); + child = nextSibling; } + } + + removeTags.forEach(tag => { + const elements = Array.from(rootElement.getElementsByTagName(tag)); + elements.forEach(element => { + handleElement(element); + element.parentNode.insertBefore(fragment.cloneNode(true), element); + element.parentNode.removeChild(element); + //console.log(">>>>>>>>>>>> removeChild: " + element.tagName.toLowerCase()); + }); }); replaceNewlinesWithBr(rootElement); + //console.log(">>>>>>>>>>>> rootElement.innerHTML: " + rootElement.innerHTML); // Return the updated HTML as a string return rootElement.innerHTML; } - // Replace newline characters with
tags - function replaceNewlinesWithBr(node) { +// Replace newline characters with
tags +function replaceNewlinesWithBr(node) { for (let child of Array.from(node.childNodes)) { - if (child.nodeType === Node.TEXT_NODE) { - const parts = child.textContent.split('\\n'); - if (parts.length > 1) { - const fragment = document.createDocumentFragment(); - parts.forEach((part, index) => { - fragment.appendChild(document.createTextNode(part)); - if (index < parts.length - 1) { - fragment.appendChild(document.createElement('br')); + if (child.nodeType === Node.TEXT_NODE) { + const parts = child.textContent.split('\\n'); + if (parts.length > 1) { + const fragment = document.createDocumentFragment(); + parts.forEach((part, index) => { + fragment.appendChild(document.createTextNode(part)); + if (index < parts.length - 1) { + fragment.appendChild(document.createElement('br')); + } + }); + child.parentNode.replaceChild(fragment, child); } - }); - child.parentNode.replaceChild(fragment, child); + } else if (child.nodeType === Node.ELEMENT_NODE) { + replaceNewlinesWithBr(child); } - } else if (child.nodeType === Node.ELEMENT_NODE) { - replaceNewlinesWithBr(child); - } } - } +} + // In the content script browser.runtime.onMessage.addListener((message, sender, sendResponse) => {