From 8cc74a6fe68c4f9512a83f6d3d075469ff0bbf20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9mence?= <107830431+clemencefrz@users.noreply.github.com> Date: Thu, 18 Sep 2025 10:36:59 +0200 Subject: [PATCH] Extract text inside a text:a tag (#21) * Extract text inside a text:a tag * Extract text inside a text:a tag and create a test * Fix test regression * Use example domain name for mails * nettoyage console.log --------- Co-authored-by: David Bruant --- .../odf/templating/fillOdtElementTemplate.js | 2 +- scripts/shared.js | 3 ++- tests/fixtures/cellules avec emails.ods | Bin 0 -> 12445 bytes tests/ods-files.js | 20 ++++++++++++++++++ 4 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 tests/fixtures/cellules avec emails.ods diff --git a/scripts/odf/templating/fillOdtElementTemplate.js b/scripts/odf/templating/fillOdtElementTemplate.js index a03e5f2..788dda9 100644 --- a/scripts/odf/templating/fillOdtElementTemplate.js +++ b/scripts/odf/templating/fillOdtElementTemplate.js @@ -799,7 +799,7 @@ export default function fillOdtElementTemplate(rootElements, compartment, addIma } else { const imageMarker = findImageMarker(currentNode.data, compartment) if (imageMarker){ - console.log({imageMarker}, "dans le if imageMarker") + //console.log({imageMarker}, "dans le if imageMarker") if (imageMarker.odfjsImage) { const href = addImageToOdtFile(imageMarker.odfjsImage) diff --git a/scripts/shared.js b/scripts/shared.js index ba3b9ed..6a97bbd 100644 --- a/scripts/shared.js +++ b/scripts/shared.js @@ -18,7 +18,6 @@ const TEXT_NODE = 3 function extraxtODSCellText(cell) { let text = ''; const childNodes = cell.childNodes; - for (const child of Array.from(childNodes)) { if (child.nodeType === TEXT_NODE) { // Direct text node, append the text directly @@ -34,6 +33,8 @@ function extraxtODSCellText(cell) { text += pChild.nodeValue; // Append text inside } else if (pChild.nodeName === 'text:line-break') { text += '\n'; // Append newline for + } else if (pChild.nodeName === 'text:a') { + text += pChild.textContent } } } else if (child.nodeName === 'text:line-break') { diff --git a/tests/fixtures/cellules avec emails.ods b/tests/fixtures/cellules avec emails.ods new file mode 100644 index 0000000000000000000000000000000000000000..0b82277c34f264f6d0416a258507838609eca70e GIT binary patch literal 12445 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 Zze&{cQqV9zyP-Y*jGmJY8Qssl{{?zzb#edz literal 0 HcmV?d00001 diff --git a/tests/ods-files.js b/tests/ods-files.js index 5926b5b..fe7aa79 100644 --- a/tests/ods-files.js +++ b/tests/ods-files.js @@ -55,4 +55,24 @@ Pourquoi t'aimeraient-ils seulement comme tu es ? (hein) Si t'es pas comme eux quand t'es naturel` t.deepEqual(feuille1[0][0].value, expectedValue) +}); + +test('.ods cells with mails should be recognized', async t => { + const odsFileWithEmails = (await readFile('./tests/fixtures/cellules avec emails.ods')).buffer + const table = await getODSTableRawContent(odsFileWithEmails); + + const feuille1 = table.get('Feuille1') + + const row1 = feuille1[0] + t.deepEqual(row1[0].value, 'Nom') + t.deepEqual(row1[1].value, 'Email') + + const row2 = feuille1[1] + + t.deepEqual(row2[0].value, 'Dav') + t.deepEqual(row2[1].value, 'david@example.org') + + const row3 = feuille1[2] + t.deepEqual(row3[0].value, 'Fanny') + t.deepEqual(row3[1].value, 'lemaildeFanny@example.com') }); \ No newline at end of file