diff --git a/src/simulator/vendor/table2csv.js b/src/simulator/vendor/table2csv.js deleted file mode 100644 index ab734062..00000000 --- a/src/simulator/vendor/table2csv.js +++ /dev/null @@ -1,113 +0,0 @@ -jQuery.fn.table2CSV = function (options) { - var options = jQuery.extend( - { - separator: ',', - header: [], - headerSelector: 'none', - columnSelector: 'td, th', - delivery: 'value', // popup, value, download - // filename: 'test.csv', // filename to download - transform_gt_lt: true, // make > and < to > and < - }, - options - ) - - var csvData = [] - var headerArr = [] - var el = this - - //header - var numCols = options.header.length - var tmpRow = [] // construct header avalible array - - if (numCols > 0) { - for (var i = 0; i < numCols; i++) { - tmpRow[tmpRow.length] = formatData(options.header[i]) - } - } else { - $(el) - .filter(':visible') - .find(options.headerSelector) - .each(function () { - if ($(this).css('display') != 'none') - tmpRow[tmpRow.length] = formatData($(this).html()) - }) - } - - row2CSV(tmpRow) - - // actual data - $(el) - .find('tr') - .each(function () { - var tmpRow = [] - $(this) - .filter(':visible') - .find(options.columnSelector) - .each(function () { - if ($(this).css('display') != 'none') - tmpRow[tmpRow.length] = formatData($(this).html()) - }) - row2CSV(tmpRow) - }) - if (options.delivery == 'popup') { - var mydata = csvData.join('\n') - if (options.transform_gt_lt) { - mydata = sinri_recover_gt_and_lt(mydata) - } - return popup(mydata) - } else if (options.delivery == 'download') { - var mydata = csvData.join('\n') - if (options.transform_gt_lt) { - mydata = sinri_recover_gt_and_lt(mydata) - } - var url = 'data:text/csv;charset=utf8,' + encodeURIComponent(mydata) - window.open(url) - return true - } else { - var mydata = csvData.join('\n') - if (options.transform_gt_lt) { - mydata = sinri_recover_gt_and_lt(mydata) - } - return mydata - } - - function sinri_recover_gt_and_lt(input) { - var regexp = new RegExp(/>/g) - var input = input.replace(regexp, '>') - var regexp = new RegExp(/</g) - var input = input.replace(regexp, '<') - return input - } - - function row2CSV(tmpRow) { - var tmp = tmpRow.join('') // to remove any blank rows - // alert(tmp); - if (tmpRow.length > 0 && tmp != '') { - var mystr = tmpRow.join(options.separator) - csvData[csvData.length] = mystr - } - } - function formatData(input) { - // double " according to rfc4180 - var regexp = new RegExp(/["]/g) - var output = input.replace(regexp, '""') - //HTML - var regexp = new RegExp(/\<[^\<]+\>/g) - var output = output.replace(regexp, '') - output = output.replace(/ /gi, ' ') //replace   - if (output == '') return '' - return '"' + output.trim() + '"' - } - function popup(data) { - var generator = window.open('', 'csv', 'height=400,width=600') - generator.document.write('CSV') - generator.document.write('') - generator.document.write('') - generator.document.write('') - generator.document.close() - return true - } -} diff --git a/src/simulator/vendor/table2csv.ts b/src/simulator/vendor/table2csv.ts new file mode 100644 index 00000000..3efd316b --- /dev/null +++ b/src/simulator/vendor/table2csv.ts @@ -0,0 +1,56 @@ +function tableToCSV( + table: HTMLTableElement, + options: { + separator?: string; + header?: string[]; + columnSelector?: string; + transformGtLt?: boolean; + } = {} +): string { + const { + separator = ",", + header = [], + columnSelector = "td, th", + transformGtLt = true, + } = options; + + const csvData: string[] = []; + + // Add header + if (header.length > 0) { + csvData.push(header.map(formatData).join(separator)); + } else { + const headers = table.querySelectorAll("thead th"); + const headerRow = Array.from(headers).map((th) => formatData(th.textContent || "")); + if (headerRow.length > 0) csvData.push(headerRow.join(separator)); + } + + // Add rows + const rows = table.querySelectorAll("tbody tr"); + rows.forEach((row) => { + const columns = row.querySelectorAll(columnSelector); + const rowData = Array.from(columns).map((col) => formatData(col.textContent || "")); + if (rowData.some((data) => data.trim() !== "")) { + csvData.push(rowData.join(separator)); + } + }); + + // Transform `>` and `<` if required + const result = csvData.join("\n"); + if (transformGtLt) { + const entities: Record = { + '>': '>', + '<': '<', + '&': '&', + '"': '"', + ''': "'", + // Add more common entities as needed + }; + return result.replace(/&[^;]+;/g, (entity) => entities[entity] || entity); + } + return result; + + function formatData(input: string): string { + return `"${input.replace(/"/g, '""').trim()}"`; + } +}