alchi/src/alchi-book/scripts/transform-html.js

75 lines
2.3 KiB
JavaScript

// alternative: https://www.npmjs.com/package/htmlparser2
const fs = require('fs')
const appRoot = require('app-root-path')
const glob = require('fast-glob')
const { parse } = require('node-html-parser')
function main() {
glob.sync(appRoot + '/src/pages/page-*.html')
.forEach(infile => {
const outfile = infile + '.out'
const insrc = fs.readFileSync(infile, 'utf8')
const root = parse(insrc);
/*
replaceNodes(root, 'div.fragment', 'lang')
.forEach(nodeNew => {
replaceNodes(nodeNew, 'p', (node => node.attributes && node.attributes.lang));
});
*/
replaceNodes(root, 'p', (node => node.attributes && node.attributes.lang));
replaceNodes(root, 'div.fragment', 'p')
fs.writeFileSync(outfile, root.toString(), 'utf8');
console.log(outfile);
})
}
// https://github.com/taoqf/node-html-parser/pull/104
function replaceNodes(root, selector, name = 'div', attributes = {}) {
const getName = (typeof name == 'function') ? (node => name(node)) : (() => name);
const getAttributes = (typeof attributes == 'function') ? (node => attributes(node)) : (() => attributes);
const result = [];
root.querySelectorAll(selector).forEach(node => {
const nameNew = getName(node);
if (!nameNew || !node.innerHTML) return; // no replace
const attributesNew = getAttributes(node);
const nodeNew = parse(`<html><${nameNew}></${nameNew}></html>`).childNodes[0].childNodes[0];
for (const [name, value] of Object.entries(attributesNew)) {
nodeNew.setAttribute(name, value);
}
nodeNew.innerHTML = node.innerHTML;
if (1) {
// working
node.insertAdjacentHTML('afterend', nodeNew.toString());
const nodeNewReal = node.nextElementSibling;
result.push(nodeNewReal);
node.remove();
}
});
return result;
}
/*
else if (0) {
// breaks when called multiple times
node.replaceWith(nodeNew);
result.push(nodeNew);
}
else {
// breaks when called multiple times
node.insertAdjacentHTML('afterend', `<${nameNew}></${nameNew}>`);
const nodeNew = node.nextElementSibling;
for (const [name, value] of Object.entries(attributesNew)) {
nodeNew.setAttribute(name, value);
}
nodeNew.innerHTML = node.innerHTML;
result.push(nodeNew);
node.remove();
}
*/
main();