function nbs(selector = "[data-nb]", heading = "<b>Notes</b>") {
return Generators.observe((notify) => {
let headings = [];
function observed() {
let nbNum = 0;
const h = Array.from(document.querySelectorAll(selector));
if (h.length !== headings.length || h.some((h, i) => headings[i] !== h)) {
notify(
html`${heading}<div>${Array.from((headings = h), (h) => {
h.innerHTML = `<a href="#_${h.dataset.nb}">[${++nbNum}]</a>`;
h.onclick = (e) => {
e.preventDefault();
hashLinkCheck(e.target.href);
};
let atag = Object.assign(html`<a href=#${h.id}>${nbNum}.</a>`, {
onclick: (e) => (e.preventDefault(), h.scrollIntoView())
});
return html`<div id="_${h.dataset.nb}">${atag} ${
document.getElementById(h.dataset.nb)
? document.getElementById(h.dataset.nb).innerHTML
: ""
}</div>`;
})}`
);
}
}
function hashLinkCheck(hashLink) {
let hashLinkChecks = 0;
const hashLinkChecker = setInterval((checksLimit = 2) => {
let div = document.getElementById(
hashLink.substring(hashLink.indexOf("#") + 1)
);
if (div) {
div.scrollIntoView();
clearInterval(hashLinkChecker);
}
if (++hashLinkChecks >= checksLimit && !div) {
console.log("check #", hashLinkChecks);
clearInterval(hashLinkChecker);
}
}, 100);
}
const observer = new MutationObserver(observed);
observer.observe(document.body, { childList: true, subtree: true });
observed();
return () => observer.disconnect();
});
}