diff --git a/.gitignore b/.gitignore index c948854..f8e98d2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ node_modules/ -build/* \ No newline at end of file +build/* + +.~lock* \ No newline at end of file diff --git a/scripts/shared.js b/scripts/shared.js index fd6dcf1..3420155 100644 --- a/scripts/shared.js +++ b/scripts/shared.js @@ -32,11 +32,26 @@ export async function _getODSTableRawContent(arrayBuffer, parseXML) { for (let cell of Array.from(cells)) { const cellType = cell.getAttribute('office:value-type'); - const cellValue = cellType === 'string' ? cell.textContent : cell.getAttribute('office:value'); - rowData.push({ - value: cellValue, - type: cellType - }); + let cellValue; + + if (cellType === 'string') { + cellValue = cell.textContent; + } else if (cellType === 'date') { + cellValue = cell.getAttribute('office:date-value'); + } else { + cellValue = cell.getAttribute('office:value'); + } + + const numberOfColumnsRepeated = cell.getAttribute('table:number-columns-repeated'); + const repeatCount = numberOfColumnsRepeated ? parseInt(numberOfColumnsRepeated, 10) : 1; + if(repeatCount < 100){ // ignore excessive repetitions + for (let i = 0; i < repeatCount; i++) { + rowData.push({ + value: cellValue, + type: cellType + }); + } + } } sheetData.push(rowData); @@ -48,6 +63,7 @@ export async function _getODSTableRawContent(arrayBuffer, parseXML) { return tableMap; } + /** * Extracts raw table content from an XLSX file. * @param {ArrayBuffer} arrayBuffer - The XLSX file. diff --git a/tests/data/cellules avec dates.ods b/tests/data/cellules avec dates.ods new file mode 100644 index 0000000..0bf6d52 Binary files /dev/null and b/tests/data/cellules avec dates.ods differ diff --git a/tests/data/cellules-répétées.ods b/tests/data/cellules-répétées.ods new file mode 100644 index 0000000..ea0dbf1 Binary files /dev/null and b/tests/data/cellules-répétées.ods differ diff --git a/tests/ods-files.js b/tests/ods-files.js new file mode 100644 index 0000000..a785794 --- /dev/null +++ b/tests/ods-files.js @@ -0,0 +1,41 @@ +import {readFile} from 'node:fs/promises' + +import test from 'ava'; + +import {getODSTableRawContent} from '../scripts/main.js' + +test('.ods file with table:number-columns-repeated attribute in cell', async t => { + const repeatedCellFileContent = (await readFile('./tests/data/cellules-répétées.ods')).buffer + + const table = await getODSTableRawContent(repeatedCellFileContent); + + const feuille1 = table.get('Feuille 1') + + console.log('yo repeated', feuille1) + t.deepEqual(feuille1[0].length, feuille1[1].length, `First and second row should have the same number of columns`) +}); + + + +test('.ods cells with dates should be recognized', async t => { + const odsFileWithDates = (await readFile('./tests/data/cellules avec dates.ods')).buffer + const table = await getODSTableRawContent(odsFileWithDates); + + const feuille1 = table.get('Feuille1') + + console.log('yo dates', feuille1) + + const row1 = feuille1[0] + t.deepEqual(row1[0].value, 'Nom') + t.deepEqual(row1[1].value, 'Date de naissance') + + const row2 = feuille1[1] + t.deepEqual(row2[0].value, 'Dav') + t.deepEqual(row2[1].type, 'date') + t.deepEqual(row2[1].value, '1987-03-08') + + const row3 = feuille1[2] + t.deepEqual(row3[0].value, 'Fanny') + t.deepEqual(row3[1].type, 'date') + t.deepEqual(row3[1].value, '1986-06-01') +}); \ No newline at end of file