UNPKG

html-table-to-dataframe

Version:
96 lines (95 loc) 4.99 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DataFrame = void 0; const base_frame_1 = require("./base-frame"); class DataFrame extends base_frame_1.BaseDataFrame { buildBody() { var _a, _b; let headers; if (((_a = this.options) === null || _a === void 0 ? void 0 : _a.header) && this.options.header.length > 0) { headers = this.options.header; this.validateHeaders(headers); } else { headers = this.generateHeaders(); // Generate headers if not provided } // Extract rows, potentially handling footer based on options let rowElements = Array.from(this.document.querySelectorAll('table tbody tr')); if ((_b = this.options) === null || _b === void 0 ? void 0 : _b.footer) { rowElements = rowElements.slice(0, -1); // Exclude the last row as footer } const rows = rowElements.map((row) => Array.from(row.querySelectorAll('td,th')).map((cell) => { const queryOnElements = 'input, textarea, button, select'; const inputElements = cell.querySelectorAll(queryOnElements); if (inputElements.length > 0) { const element = inputElements[0]; if (element instanceof this.dom.window.HTMLInputElement || element instanceof this.dom.window.HTMLTextAreaElement) { return element.value; } if (element instanceof this.dom.window.HTMLButtonElement) { return inputElements[0].getAttribute('aria-checked') || ''; } if (element instanceof this.dom.window.HTMLSelectElement) { const selectedOption = inputElements[0].querySelector('option:checked'); if (selectedOption) { return selectedOption.value; } // Empty return ''; } } return cell.textContent ? cell.textContent.trim() : ''; })); return this.buildData(rows, headers); } buildFooter() { var _a, _b; const tfoot = this.document.querySelector('table tfoot'); if (!tfoot) { throw new Error('No <tfoot> element found in the table, but footer option is enabled.'); } // Get footer headers let footerHeaders = Array.from(tfoot.querySelectorAll('th')).map((th) => { var _a; return ((_a = th.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || ''; }); // If footerHeaders is empty, fall back to options.headers if (footerHeaders.length === 0 && ((_a = this.options) === null || _a === void 0 ? void 0 : _a.header)) { footerHeaders = [...this.options.header]; // Use options.headers as fallback } if (((_b = this.options) === null || _b === void 0 ? void 0 : _b.footer) && this.options.locatorId) { const rowElements = Array.from(this.document.querySelectorAll(this.options.locatorId)); const footerCells = rowElements.map((row) => { return Array.from(row.querySelectorAll('td')).map((cell) => { const queryOnElements = 'input, textarea, button'; const inputElements = cell.querySelectorAll(queryOnElements); if (inputElements && inputElements.length > 0) { return inputElements[0].value; } else { return cell.textContent ? cell.textContent.trim() : ''; } }); }); return this.buildData(footerCells, footerHeaders); } // Get footer cells const footerCells = Array.from(tfoot.querySelectorAll('tr')).map((row) => Array.from(row.querySelectorAll('td')).map((cell) => { var _a; const queryOnElements = 'input, textarea, button'; const inputElements = cell.querySelectorAll(queryOnElements); if (inputElements.length > 0) { const element = inputElements[0]; if (element instanceof this.dom.window.HTMLInputElement || element instanceof this.dom.window.HTMLTextAreaElement) { return element.value; // Extract value from input/textarea } if (element instanceof this.dom.window.HTMLButtonElement) { const ariaChecked = element.getAttribute('aria-checked'); return ariaChecked || ((_a = element.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || ''; // Return aria-checked or button text } } return cell.textContent ? cell.textContent.trim() : ''; // Return text content })); return this.buildData(footerCells, footerHeaders); } } exports.DataFrame = DataFrame;