uhtml
Version:
A micro HTML/SVG render
39 lines (37 loc) • 1.3 kB
JavaScript
;
const { PersistentFragment } = require('./persistent-fragment.js');
const { bc, detail } = require('./literals.js');
const { array, hole } = require('./handler.js');
const { empty, find } = require('./utils.js');
const { cache } = require('./literals.js');
/** @param {(template: TemplateStringsArray, values: any[]) => import("./parser.js").Resolved} parse */
module.exports = parse => (
/**
* @param {TemplateStringsArray} template
* @param {any[]} values
* @returns {import("./literals.js").Cache}
*/
(template, values) => {
const { a: fragment, b: entries, c: direct } = parse(template, values);
const root = document.importNode(fragment, true);
/** @type {import("./literals.js").Detail[]} */
let details = empty;
if (entries !== empty) {
details = [];
for (let current, prev, i = 0; i < entries.length; i++) {
const { a: path, b: update, c: name } = entries[i];
const node = path === prev ? current : (current = find(root, (prev = path)));
details[i] = detail(
update,
node,
name,
update === array ? [] : (update === hole ? cache() : null)
);
}
}
return bc(
direct ? root.firstChild : new PersistentFragment(root),
details,
);
}
);