html-table-to-dataframe
Version:
Convert HTML tables to data-frames
96 lines (95 loc) • 4.99 kB
JavaScript
"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;