fix removing html elements added by thunderai when extracting text or html from the email. see #710

This commit is contained in:
mic 2026-03-27 23:00:33 +01:00
parent 29ed9e6df6
commit 2460e40bf7
2 changed files with 21 additions and 27 deletions

View file

@ -26,28 +26,22 @@ const MZTA_INJECTED_SELECTORS = [
'.mzta_dialog', '.mzta_dialog',
]; ];
// Mirrors removeMozMainHeader() from mzta-utils.js. function getCleanBodyHtml() {
// Removes the Thunderbird-injected header table and any preceding divs.
function removeMozMainHeader(root) {
const table = root.querySelector('table.moz-main-header');
if (!table) return;
let sibling = table.previousElementSibling;
while (sibling && sibling.tagName === 'DIV') {
const toRemove = sibling;
sibling = sibling.previousElementSibling;
toRemove.remove();
}
table.remove();
}
function getCleanBodyClone() {
const clone = document.body.cloneNode(true); const clone = document.body.cloneNode(true);
for (const selector of MZTA_INJECTED_SELECTORS) { for (const selector of MZTA_INJECTED_SELECTORS) {
for (const el of clone.querySelectorAll(selector)) { for (const el of clone.querySelectorAll(selector)) {
el.remove(); el.remove();
} }
} }
removeMozMainHeader(clone); for (const table of clone.querySelectorAll('table.moz-main-header')) {
let sibling = table.previousElementSibling;
while (sibling && sibling.tagName === 'DIV') {
const toRemove = sibling;
sibling = sibling.previousElementSibling;
toRemove.remove();
}
table.remove();
}
return clone; return clone;
} }
@ -174,7 +168,7 @@ switch (message.command) {
case "getText": { case "getText": {
let t = ''; let t = '';
const children = getCleanBodyClone().childNodes; const children = getCleanBodyHtml().childNodes;
for (const node of children) { for (const node of children) {
if (node instanceof Element) { if (node instanceof Element) {
if (node.classList.contains('moz-signature')) { if (node.classList.contains('moz-signature')) {
@ -187,11 +181,11 @@ switch (message.command) {
} }
case "getTextOnly": { case "getTextOnly": {
return Promise.resolve(getCleanBodyClone().innerText); return Promise.resolve(getCleanBodyHtml().innerText);
} }
case "getFullHtml": { case "getFullHtml": {
return Promise.resolve(getCleanBodyClone().innerHTML); return Promise.resolve(getCleanBodyHtml().innerHTML);
} }
case "getOnlyTypedText": { case "getOnlyTypedText": {

View file

@ -272,15 +272,15 @@ export function htmlBodyToPlainText(htmlString) {
} }
export function removeMozMainHeader(root) { export function removeMozMainHeader(root) {
const table = root.querySelector('table.moz-main-header'); for (const table of root.querySelectorAll('table.moz-main-header')) {
if (!table) return; let sibling = table.previousElementSibling;
let sibling = table.previousElementSibling; while (sibling && sibling.tagName === 'DIV') {
while (sibling && sibling.tagName === 'DIV') { const toRemove = sibling;
const toRemove = sibling; sibling = sibling.previousElementSibling;
sibling = sibling.previousElementSibling; toRemove.remove();
toRemove.remove(); }
table.remove();
} }
table.remove();
} }
export function cleanupNewlines(text) { export function cleanupNewlines(text) {