function MAKE_DATA(html) {
const debug = [];
const state = {};
let datasets, dataset, measurements, measurement;
datasets = {};
dataset = null;
for (let el=html.querySelector(':scope body').firstChild; el.nextSibling; el = el.nextSibling) {
const { tagName, textContent } = el;
debug.push({ tagName, textContent });
if (tagName === 'P') {
let match;
if (match = textContent.match(/^\s*(?<name>.+)\s*:\s*$/)) {
const { name } = match.groups;
debug.push({ name });
if (name.startsWith('Results')) {
continue;
} else if (name.startsWith('Dataset ')) {
measurements = {};
measurement = null;
dataset = { name, measurements };
datasets[name] = dataset;
} else {
measurement = { name };
measurements[name] = measurement;
}
}
} else if (tagName === 'TABLE') {
const rows = [];
debug.push({ el });
for (const tr of el.querySelectorAll(':scope > tbody > tr')) {
debug.push({ tr });
const row = [];
for (const td of tr.querySelectorAll(':scope > td')) {
debug.push({ td });
const { textContent } = td;
const text = textContent;
const parsed = text
.trim()
.replaceAll(/\s*%\s*/g, ' ')
.split(/\s*,\s*/g)
.map((v) => {
const parts = v.trim().split(/\s+/g);
if (parts.length === 1) {
let [value] = parts;
value = Number.parseFloat(value);
return { value };
} else if (parts.length === 2) {
let [value, sigdig] = parts;
value = Number.parseFloat(value);
sigdig = Number.parseInt(sigdig, 10);
return { value, sigdig };
}
});
if (text.match(/^\s*$/)) {
continue;
}
row.push({ text, parsed });
}
if (row.length > 0) {
rows.push(row);
}
}
const [columns] = rows.splice(0, 1);
if (columns.length === rows[0].length - 1) {
columns.unshift('name');
}
Object.assign(measurement, {
columns,
rows,
});
}
}
return datasets;
}