js/use.js

48 lines
1.0 KiB
JavaScript

const apply = (func, node) => {
if (typeof func == "function") {
func(node)
} else if ("then" in func) {
func.then(result => apply(result, node))
} else if ("default" in func) {
apply(func.default, node)
}
}
export const use = node => {
const code = Function("return (" + node.getAttribute("use") + ")")
node.removeAttribute("use")
const func = code()
apply(func, node)
}
export const observe = (root = document) => {
const observer = new MutationObserver(mutations => {
mutations.forEach(mutation => {
mutation.addedNodes.forEach(node => {
if (node.hasAttribute("use")) {
use(node)
}
})
})
})
observer.observe(root, {subtree: true, childList: true})
return observer
}
export const run = (root = document) => {
root.querySelectorAll("[use]").forEach(use)
}
export const whenReady = () => {
if (document.readyState == "complete")
run(document)
else
document.addEventListener("readystatechange", whenReady, {once: true})
}
export const install = () => {
observe(document)
run(document)
}
export default install