Réorganisation de code
This commit is contained in:
parent
e7be870938
commit
1e67672d68
@ -1,7 +1,8 @@
|
|||||||
{
|
{
|
||||||
"name": "front-end-template",
|
"name": "front-end-template",
|
||||||
"version": "2.0.0",
|
"version": "0.0.1",
|
||||||
"type": "module",
|
"type": "module",
|
||||||
|
"browser": "./scripts/main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "rollup -c",
|
"build": "rollup -c",
|
||||||
"dev": "npm-run-all --parallel dev:* start",
|
"dev": "npm-run-all --parallel dev:* start",
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<script>
|
<script>
|
||||||
import {getTableRawContentFromFile, tableRawContentToObjects} from './getTableRawContentFromFile.js'
|
import {getTableRawContentFromFile, tableRawContentToObjects} from './main.js'
|
||||||
|
|
||||||
const ODS_TYPE = "application/vnd.oasis.opendocument.spreadsheet";
|
const ODS_TYPE = "application/vnd.oasis.opendocument.spreadsheet";
|
||||||
const XLSX_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
const XLSX_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||||
@ -68,9 +68,6 @@
|
|||||||
max-width: 80rem;
|
max-width: 80rem;
|
||||||
margin: 0 auto;
|
margin: 0 auto;
|
||||||
|
|
||||||
@media (min-width: 640px) {
|
|
||||||
max-width: none;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
table{
|
table{
|
||||||
|
|||||||
@ -2,24 +2,18 @@
|
|||||||
|
|
||||||
import { unzip } from 'unzipit';
|
import { unzip } from 'unzipit';
|
||||||
|
|
||||||
const parser = new DOMParser();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
* @typedef SheetCellRawContent
|
||||||
* @param {string} str
|
|
||||||
* @returns {Document}
|
|
||||||
*/
|
|
||||||
function parseXML(str){
|
|
||||||
return parser.parseFromString(str, 'application/xml');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef TableCellRawContent
|
|
||||||
* @prop {string | null | undefined} value
|
* @prop {string | null | undefined} value
|
||||||
* @prop {'float' | 'percentage' | 'currency' | 'date' | 'time' | 'boolean' | 'string' | 'b' | 'd' | 'e' | 'inlineStr' | 'n' | 's' | 'str'} type
|
* @prop {'float' | 'percentage' | 'currency' | 'date' | 'time' | 'boolean' | 'string' | 'b' | 'd' | 'e' | 'inlineStr' | 'n' | 's' | 'str'} type
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/** @typedef {SheetCellRawContent[]} SheetRowRawContent */
|
||||||
|
/** @typedef {SheetRowRawContent[]} SheetRawContent */
|
||||||
|
|
||||||
|
/** @typedef {string} SheetName */
|
||||||
|
|
||||||
|
|
||||||
const ODS_TYPE = "application/vnd.oasis.opendocument.spreadsheet";
|
const ODS_TYPE = "application/vnd.oasis.opendocument.spreadsheet";
|
||||||
const XLSX_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
const XLSX_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
|
||||||
|
|
||||||
@ -29,7 +23,7 @@ const XLSX_TYPE = "application/vnd.openxmlformats-officedocument.spreadsheetml.s
|
|||||||
* @param {File} file - The ODS file.
|
* @param {File} file - The ODS file.
|
||||||
* @param {Function} unzip - Function to unzip the file.
|
* @param {Function} unzip - Function to unzip the file.
|
||||||
* @param {Function} parseXML - Function to parse XML content.
|
* @param {Function} parseXML - Function to parse XML content.
|
||||||
* @returns {Promise<Map<SheetName, TableCellRawContent[][]>>}
|
* @returns {Promise<Map<SheetName, SheetRawContent>>}
|
||||||
*/
|
*/
|
||||||
async function getTableRawContentFromODSFile(file, unzip, parseXML) {
|
async function getTableRawContentFromODSFile(file, unzip, parseXML) {
|
||||||
const zip = await unzip(file);
|
const zip = await unzip(file);
|
||||||
@ -41,7 +35,6 @@ async function getTableRawContentFromODSFile(file, unzip, parseXML) {
|
|||||||
|
|
||||||
const tableMap = new Map();
|
const tableMap = new Map();
|
||||||
|
|
||||||
// Navigate the XML structure to extract table data
|
|
||||||
const tables = contentDoc.getElementsByTagName('table:table');
|
const tables = contentDoc.getElementsByTagName('table:table');
|
||||||
|
|
||||||
for (let table of tables) {
|
for (let table of tables) {
|
||||||
@ -76,13 +69,12 @@ async function getTableRawContentFromODSFile(file, unzip, parseXML) {
|
|||||||
* @param {File} file - The XLSX file.
|
* @param {File} file - The XLSX file.
|
||||||
* @param {Function} unzip - Function to unzip the file.
|
* @param {Function} unzip - Function to unzip the file.
|
||||||
* @param {Function} parseXML - Function to parse XML content.
|
* @param {Function} parseXML - Function to parse XML content.
|
||||||
* @returns {Promise<Map<SheetName, TableCellRawContent[][]>>}
|
* @returns {Promise<Map<SheetName, SheetRawContent>>}
|
||||||
*/
|
*/
|
||||||
async function getTableRawContentFromXSLXFile(file, unzip, parseXML) {
|
async function getTableRawContentFromXSLXFile(file, unzip, parseXML) {
|
||||||
const zip = await unzip(file);
|
const zip = await unzip(file);
|
||||||
const entries = zip.entries;
|
const entries = zip.entries;
|
||||||
|
|
||||||
// Read shared strings
|
|
||||||
const sharedStringsXml = await entries['xl/sharedStrings.xml'].text();
|
const sharedStringsXml = await entries['xl/sharedStrings.xml'].text();
|
||||||
const sharedStringsDoc = parseXML(sharedStringsXml);
|
const sharedStringsDoc = parseXML(sharedStringsXml);
|
||||||
const sharedStrings = Array.from(sharedStringsDoc.getElementsByTagName('sst')[0].getElementsByTagName('si')).map(si => si.textContent);
|
const sharedStrings = Array.from(sharedStringsDoc.getElementsByTagName('sst')[0].getElementsByTagName('si')).map(si => si.textContent);
|
||||||
@ -138,12 +130,21 @@ async function getTableRawContentFromXSLXFile(file, unzip, parseXML) {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** @typedef {string} SheetName */
|
const parser = new DOMParser();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {string} str
|
||||||
|
* @returns {Document}
|
||||||
|
*/
|
||||||
|
function parseXML(str){
|
||||||
|
return parser.parseFromString(str, 'application/xml');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {File} file
|
* @param {File} file
|
||||||
* @returns {Promise<Map<SheetName, TableCellRawContent[][]>>}
|
* @returns {Promise<Map<SheetName, SheetRawContent>>}
|
||||||
*/
|
*/
|
||||||
export function getTableRawContentFromFile(file){
|
export function getTableRawContentFromFile(file){
|
||||||
if(file.type === ODS_TYPE)
|
if(file.type === ODS_TYPE)
|
||||||
@ -159,7 +160,7 @@ export function getTableRawContentFromFile(file){
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a cell value to the appropriate JavaScript type based on its cell type.
|
* Converts a cell value to the appropriate JavaScript type based on its cell type.
|
||||||
* @param {TableCellRawContent} _
|
* @param {SheetCellRawContent} _
|
||||||
* @returns {number | boolean | string | Date} The converted value.
|
* @returns {number | boolean | string | Date} The converted value.
|
||||||
*/
|
*/
|
||||||
function convertCellValue({value, type}) {
|
function convertCellValue({value, type}) {
|
||||||
@ -192,38 +193,55 @@ function convertCellValue({value, type}) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {SheetCellRawContent} rawCellContent
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
function isCellNotEmpty({value}){
|
||||||
|
return value !== '' && value !== null && value !== undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param {SheetRowRawContent} rawContentRow
|
||||||
|
* @returns {boolean}
|
||||||
|
*/
|
||||||
|
function isRowNotEmpty(rawContentRow){
|
||||||
|
return rawContentRow.some(isCellNotEmpty)
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {TableCellRawContent[][]} rawContent
|
* @param {SheetRawContent} rawContent
|
||||||
* @returns {any[]}
|
* @returns {any[]}
|
||||||
*/
|
*/
|
||||||
function rawContentToObjects(rawContent){
|
function rawContentToObjects(rawContent){
|
||||||
let [firstRow, ...dataRows] = rawContent
|
let [firstRow, ...dataRows] = rawContent
|
||||||
|
|
||||||
/** @type {string[]} */
|
/** @type {string[]} */
|
||||||
//@ts-expect-error trust me, this is true after the filter
|
//@ts-expect-error this type is correct after the filter
|
||||||
const columns = firstRow.filter(({value}) => typeof value === 'string' && value.length >= 1).map(r => r.value)
|
const columns = firstRow.filter(({value}) => typeof value === 'string' && value.length >= 1).map(r => r.value)
|
||||||
|
|
||||||
return dataRows.map(row => {
|
return dataRows
|
||||||
|
.filter(isRowNotEmpty) // remove empty rows
|
||||||
|
.map(row => {
|
||||||
const obj = Object.create(null)
|
const obj = Object.create(null)
|
||||||
let empty = true
|
|
||||||
columns.forEach((column, i) => {
|
columns.forEach((column, i) => {
|
||||||
const rawValue = row[i]
|
const rawValue = row[i]
|
||||||
obj[column] = rawValue ? convertCellValue(rawValue) : ''
|
obj[column] = rawValue ? convertCellValue(rawValue) : ''
|
||||||
empty = empty && (obj[column] === '')
|
|
||||||
})
|
})
|
||||||
return empty ? undefined : obj
|
return obj
|
||||||
}).filter(x => x !== undefined) // remove empty rows
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param {Map<SheetName, TableCellRawContent[][]>} rawContentSheets
|
* @param {Map<SheetName, SheetRawContent>} rawContentSheets
|
||||||
* @returns {Map<SheetName, any[]>}
|
* @returns {Map<SheetName, any[]>}
|
||||||
*/
|
*/
|
||||||
export function tableRawContentToObjects(rawContentSheets){
|
export function sheetRawContentToObjects(rawContentSheets){
|
||||||
return new Map(
|
return new Map(
|
||||||
[...rawContentSheets].map(([sheetName, rawContent]) => {
|
[...rawContentSheets].map(([sheetName, rawContent]) => {
|
||||||
return [sheetName, rawContentToObjects(rawContent)]
|
return [sheetName, rawContentToObjects(rawContent)]
|
||||||
Loading…
x
Reference in New Issue
Block a user