// Borrowed from haacked/haackbar and modified for many purposes. var SpaacedOut = (function() {
// NodeList foreach Polyfill if (window.NodeList && !NodeList.prototype.forEach) { NodeList.prototype.forEach = function (callback, thisArg) { thisArg = thisArg || window for (var i = 0; i < this.length; i++) { callback.call(thisArg, this[i], i, this) } } } // Return the namespace object. return { ready: function(init) { if (document.readyState === "complete" || (document.readyState !== "loading" && !document.documentElement.doScroll)) { window.setTimeout(init) } else { var completed = function() { document.removeEventListener("DOMContentLoaded", completed) window.removeEventListener("load", completed) init() } document.addEventListener("DOMContentLoaded", completed) window.addEventListener("load", completed) } }, get: function(elementId) { var element = document.getElementById(elementId) if (element) return element var elements = document.getElementsByClassName(elementId) if (elements && elements.length > 0) return elements[0] return null }, codeIdentity: function() { document.querySelectorAll(".highlighter-rouge, figure.highlight").forEach(i => { i.setAttribute("data-lang", "code"); var l = i.getAttribute("class").split("language-"); if (l.length > 1) { var lang = l[1].split(" "); if (lang.length > 0) { i.setAttribute("data-lang", lang[0]); } } //1 < l.length && (l = l[1].split(" "[0], i.setAttribute("data-lang", l))); }); }, setupMenuToggle: function() { var menuToggle = document.getElementById('menu-toggle'); if (menuToggle) { menuToggle.addEventListener('click', function(e){ document.body.classList.toggle('menu--opened'); SpaacedOut.menuToggleIcon(); e.preventDefault(); },false); document.body.classList.remove('menu--opened'); window.addEventListener('resize', function () { if (menuToggle.offsetParent === null) { document.body.classList.remove('menu--opened'); } }, true); } }, menuToggleIcon: function() { var menuToggle = document.getElementById('menu-toggle'); if (document.body.classList.contains('menu--opened')) { menuToggle.getElementsByClassName('fa-bars')[0].style.display = "none"; menuToggle.getElementsByClassName('fa-bars')[0].style.visibility = "hidden"; menuToggle.getElementsByClassName('fa-times')[0].style.display = "block"; menuToggle.getElementsByClassName('fa-times')[0].style.visibility = "visible"; } else { menuToggle.getElementsByClassName('fa-bars')[0].style.display = "block"; menuToggle.getElementsByClassName('fa-bars')[0].style.visibility = "visible"; menuToggle.getElementsByClassName('fa-times')[0].style.display = "none"; menuToggle.getElementsByClassName('fa-times')[0].style.visibility = "hidden"; } }, setPostLinkTargetToBlank: function() { var postContent = document.getElementsByClassName("post-content"); if (postContent.length > 0) { var links = postContent[0].getElementsByTagName("a"); for (var link of links) { if (link.hash.length == 0) { link.setAttribute("target", "_blank"); link.setAttribute("rel", "noopener"); } } } } }; })() // This sets the `current-page` css class on the nav link // that points to the current page so we can render it differently // We do this in JS so that we can cache the header once rather than // generate it for every single page. SpaacedOut.ready(function() { // Set current page on navigation const path = window.location.pathname const currentPageLink = document.querySelector('.site-nav li a[href="' + path + '"]') if (currentPageLink) { const listItem = currentPageLink.parentElement listItem.classList.add('current-page') const span = document.createElement('span') span.innerText = currentPageLink.textContent listItem.appendChild(span) listItem.removeChild(currentPageLink) } SpaacedOut.codeIdentity(); SpaacedOut.setupMenuToggle(); SpaacedOut.menuToggleIcon(); SpaacedOut.setPostLinkTargetToBlank();
})