From c90359bc7b14674639de08ea24d46ff42345594d Mon Sep 17 00:00:00 2001 From: David Bruant Date: Wed, 24 Jul 2024 22:09:08 +0200 Subject: [PATCH] Add support for newline in .ods cell texts (#4) --- readme.md | 2 +- scripts/shared.js | 40 +++++++++++++++++++++++++++++- tests/data/cellule avec sauts.ods | Bin 0 -> 18209 bytes tests/ods-files.js | 20 +++++++++++++++ 4 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 tests/data/cellule avec sauts.ods diff --git a/readme.md b/readme.md index c99243e..93bfa68 100644 --- a/readme.md +++ b/readme.md @@ -8,7 +8,7 @@ Small lib to parse/understand .ods and .xsls files in the browser and node.js ### Install ```sh -npm i https://github.com/DavidBruant/ods-xlsx.git#v0.7.0 +npm i https://github.com/DavidBruant/ods-xlsx.git#v0.8.0 ``` diff --git a/scripts/shared.js b/scripts/shared.js index e996da6..6bd8c52 100644 --- a/scripts/shared.js +++ b/scripts/shared.js @@ -3,6 +3,44 @@ import { unzip } from 'unzipit'; import './types.js' +// https://dom.spec.whatwg.org/#interface-node +const TEXT_NODE = 3 + +/** + * + * @param {Element} cell + * @returns {string} + */ +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 + text += child.nodeValue; + } else if (child.nodeName === 'text:p') { + if (text.length > 0) { + // Add a newline before appending new paragraph if text already exists + text += '\n'; + } + const pNodes = child.childNodes; + for (const pChild of Array.from(pNodes)) { + if (pChild.nodeType === TEXT_NODE) { + text += pChild.nodeValue; // Append text inside + } else if (pChild.nodeName === 'text:line-break') { + text += '\n'; // Append newline for + } + } + } else if (child.nodeName === 'text:line-break') { + text += '\n'; // Append newline for directly under + } + } + + return text.trim(); +} + + /** * Extracts raw table content from an ODS file. * @param {ArrayBuffer} arrayBuffer - The ODS file. @@ -35,7 +73,7 @@ export async function _getODSTableRawContent(arrayBuffer, parseXML) { let cellValue; if (cellType === 'string') { - cellValue = cell.textContent; + cellValue = extraxtODSCellText(cell) } else if (cellType === 'date') { cellValue = cell.getAttribute('office:date-value'); } else { diff --git a/tests/data/cellule avec sauts.ods b/tests/data/cellule avec sauts.ods new file mode 100644 index 0000000000000000000000000000000000000000..ca5a4195de7cb021639cf59db2e5790e270204c8 GIT binary patch literal 18209 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 x`c^*%!e5!~{(W0{{YSe>mL9B literal 0 HcmV?d00001 diff --git a/tests/ods-files.js b/tests/ods-files.js index 05b8190..6635de9 100644 --- a/tests/ods-files.js +++ b/tests/ods-files.js @@ -35,4 +35,24 @@ test('.ods cells with dates should be recognized', async t => { t.deepEqual(row3[0].value, 'Fanny') t.deepEqual(row3[1].type, 'date') t.deepEqual(row3[1].value, '1986-06-01') +}); + + +test('.ods file with new lines in content is ', async t => { + const repeatedCellFileContent = (await readFile('./tests/data/cellule avec sauts.ods')).buffer + + const table = await getODSTableRawContent(repeatedCellFileContent); + + const feuille1 = table.get('Feuille1') + +const expectedValue = `Deviens génial, deviens génial +Tu n'sais pas encore l'enfer qui t'attend +Le regard des uns, le rejet des autres +Si t'es bizarre, si t'es pas marrant +Deviens génial, deviens génial +Deviens génial, deviens génial +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) }); \ No newline at end of file