(function () {
"use strict";
var MARGIN_GAP = 18; var MIN_VIEWPORT = 1100;
function absTop(el) {
var rect = el.getBoundingClientRect();
var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
return rect.top + scrollTop;
}
function layoutMargins() {
if (window.innerWidth < MIN_VIEWPORT) return;
var column = document.getElementById("margin-column");
if (!column) return;
var pageEl = document.querySelector(".page");
if (!pageEl) return;
var wrapper = document.getElementById("page-wrapper");
if (!wrapper) return;
var pageRect = pageEl.getBoundingClientRect();
var pageRight = pageRect.right + (window.pageXOffset || 0);
var wrapperLeft = wrapper.getBoundingClientRect().left + (window.pageXOffset || 0);
column.style.left = (pageRight - wrapperLeft + MARGIN_GAP) + "px";
var oldSvgs = column.querySelectorAll(".margin-connector");
for (var i = 0; i < oldSvgs.length; i++) oldSvgs[i].parentNode.removeChild(oldSvgs[i]);
var anchorEls = document.querySelectorAll(".margin-anchor[data-margin]");
var anchorMap = {};
for (var i = 0; i < anchorEls.length; i++) {
anchorMap[anchorEls[i].getAttribute("data-margin")] = anchorEls[i];
}
var noteEls = document.querySelectorAll(
".margin-note[data-margin], .margin-interactive[data-margin]"
);
if (noteEls.length === 0) return;
var notes = [];
for (var i = 0; i < noteEls.length; i++) notes.push(noteEls[i]);
notes.sort(function (a, b) {
var aa = anchorMap[a.getAttribute("data-margin")];
var ba = anchorMap[b.getAttribute("data-margin")];
if (!aa || !ba) return 0;
return absTop(aa) - absTop(ba);
});
for (var i = 0; i < notes.length; i++) {
if (notes[i].parentNode !== column) {
column.appendChild(notes[i]);
}
}
var wrapperAbsTop = absTop(wrapper);
var cursor = 0;
for (var i = 0; i < notes.length; i++) {
var note = notes[i];
var mid = note.getAttribute("data-margin");
var anchor = anchorMap[mid];
if (!anchor) continue;
var anchorTop = absTop(anchor);
var targetTop = anchorTop - wrapperAbsTop;
var top = Math.max(cursor + 6, targetTop);
note.style.position = "absolute";
note.style.top = top + "px";
cursor = top + note.offsetHeight;
drawConnector(column, anchor, note, wrapperAbsTop);
}
}
function drawConnector(column, anchor, note, wrapperAbsTop) {
var noteTop = parseFloat(note.style.top) || 0;
var noteHeight = note.offsetHeight;
var y1 = absTop(anchor) - wrapperAbsTop + (anchor.offsetHeight || 4) / 2;
var y2 = noteTop + noteHeight / 2;
var svg = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svg.setAttribute("class", "margin-connector");
var minY = Math.min(y1, y2);
var maxY = Math.max(y1, y2);
var h = maxY - minY || 1;
svg.style.cssText =
"position:absolute;" +
"left:" + (-MARGIN_GAP) + "px;" +
"top:" + minY + "px;" +
"width:" + (MARGIN_GAP + 4) + "px;" +
"height:" + (h + 4) + "px;" +
"overflow:visible;" +
"pointer-events:none;";
var line = document.createElementNS("http://www.w3.org/2000/svg", "line");
line.setAttribute("x1", "0");
line.setAttribute("y1", String(y1 - minY));
line.setAttribute("x2", String(MARGIN_GAP));
line.setAttribute("y2", String(y2 - minY));
svg.appendChild(line);
column.appendChild(svg);
}
function setupColumn() {
if (document.getElementById("margin-column")) return;
var wrapper = document.getElementById("page-wrapper");
if (!wrapper) return;
var wStyle = window.getComputedStyle(wrapper);
if (wStyle.position === "static") {
wrapper.style.position = "relative";
}
var col = document.createElement("div");
col.id = "margin-column";
wrapper.appendChild(col);
}
var layoutTimer = null;
function scheduleLayout(delay) {
clearTimeout(layoutTimer);
layoutTimer = setTimeout(function () {
requestAnimationFrame(layoutMargins);
}, delay || 50);
}
function init() {
setupColumn();
window.addEventListener("load", function () {
scheduleLayout(200);
setTimeout(function () { scheduleLayout(100); }, 1000);
setTimeout(function () { scheduleLayout(100); }, 2500);
});
window.addEventListener("resize", function () {
scheduleLayout(120);
});
var mjPollCount = 0;
var mjPoll = setInterval(function () {
mjPollCount++;
if (mjPollCount > 50) { clearInterval(mjPoll); return; }
if (window.MathJax && MathJax.startup && MathJax.startup.promise) {
clearInterval(mjPoll);
MathJax.startup.promise.then(function () {
scheduleLayout(200);
setTimeout(function () { scheduleLayout(100); }, 500);
});
}
}, 100);
var contentEl = document.getElementById("mdbook-content") || document.querySelector(".content");
if (contentEl && window.MutationObserver) {
var mutTimer = null;
var observer = new MutationObserver(function () {
clearTimeout(mutTimer);
mutTimer = setTimeout(function () {
requestAnimationFrame(layoutMargins);
}, 300);
});
observer.observe(contentEl, { childList: true, subtree: true });
}
}
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
init();
}
})();