Add support for newline in .ods cell texts (#4)

This commit is contained in:
David Bruant 2024-07-24 22:09:08 +02:00 committed by GitHub
parent 08a2d5f63c
commit c90359bc7b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 60 additions and 2 deletions

View File

@ -8,7 +8,7 @@ Small lib to parse/understand .ods and .xsls files in the browser and node.js
### Install ### Install
```sh ```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
``` ```

View File

@ -3,6 +3,44 @@ import { unzip } from 'unzipit';
import './types.js' 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 <text:p>
} else if (pChild.nodeName === 'text:line-break') {
text += '\n'; // Append newline for <text:line-break />
}
}
} else if (child.nodeName === 'text:line-break') {
text += '\n'; // Append newline for <text:line-break /> directly under <table:table-cell>
}
}
return text.trim();
}
/** /**
* Extracts raw table content from an ODS file. * Extracts raw table content from an ODS file.
* @param {ArrayBuffer} arrayBuffer - The ODS file. * @param {ArrayBuffer} arrayBuffer - The ODS file.
@ -35,7 +73,7 @@ export async function _getODSTableRawContent(arrayBuffer, parseXML) {
let cellValue; let cellValue;
if (cellType === 'string') { if (cellType === 'string') {
cellValue = cell.textContent; cellValue = extraxtODSCellText(cell)
} else if (cellType === 'date') { } else if (cellType === 'date') {
cellValue = cell.getAttribute('office:date-value'); cellValue = cell.getAttribute('office:date-value');
} else { } else {

Binary file not shown.

View File

@ -35,4 +35,24 @@ test('.ods cells with dates should be recognized', async t => {
t.deepEqual(row3[0].value, 'Fanny') t.deepEqual(row3[0].value, 'Fanny')
t.deepEqual(row3[1].type, 'date') t.deepEqual(row3[1].type, 'date')
t.deepEqual(row3[1].value, '1986-06-01') 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)
}); });