function isObj(obj) { return (obj && typeof obj === 'object' && obj !== null) ? true : false; } function createEl(element = 'div') { return document.createElement(element); } function emptyEl(el) { while(el.firstChild) el.removeChild(el.firstChild); } function elem(selector, parent = document){ let elem = isObj(parent) ? parent.querySelector(selector) : false; return elem ? elem : false; } function elems(selector, parent = document) { let elems = isObj(parent) ?parent.querySelectorAll(selector) : []; return elems.length ? elems : false; } function pushClass(el, targetClass) { if (isObj(el) && targetClass) { let elClass = el.classList; elClass.contains(targetClass) ? false : elClass.add(targetClass); } } function deleteClass(el, targetClass) { if (isObj(el) && targetClass) { let elClass = el.classList; elClass.contains(targetClass) ? elClass.remove(targetClass) : false; } } function modifyClass(el, targetClass) { if (isObj(el) && targetClass) { const elClass = el.classList; elClass.contains(targetClass) ? elClass.remove(targetClass) : elClass.add(targetClass); } } function containsClass(el, targetClass) { if (isObj(el) && targetClass && el !== document ) { return el.classList.contains(targetClass) ? true : false; } } function isChild(node, parentClass) { let objectsAreValid = isObj(node) && parentClass && typeof parentClass == 'string'; return (objectsAreValid && node.closest(parentClass)) ? true : false; } function elemAttribute(elem, attr, value = null) { if (value) { elem.setAttribute(attr, value); } else { value = elem.getAttribute(attr); return value ? value : false; } } function deleteChars(str, subs) { let newStr = str; if (Array.isArray(subs)) { for (let i = 0; i < subs.length; i++) { newStr = newStr.replace(subs[i], ''); } } else { newStr = newStr.replace(subs, ''); } return newStr; } function isBlank(str) { return (!str || str.trim().length === 0); } function isMatch(element, selectors) { if(isObj(element)) { if(selectors.isArray) { let matching = selectors.map(function(selector){ return element.matches(selector) }) return matching.includes(true); } return element.matches(selectors) } } function closestInt(goal, collection) { const closest = collection.reduce(function(prev, curr) { return (Math.abs(curr - goal) < Math.abs(prev - goal) ? curr : prev); }); return closest } function activeHeading(position, listLinks) { let active = 'active'; let linksToModify = Object.create(null); linksToModify.active = listLinks.filter(function(link) { return containsClass(link, active); })[0]; // activeTocLink ? deleteClass linksToModify.new = listLinks.filter(function(link){ return parseInt(link.dataset.position) === position })[0]; console.log(linksToModify.new) if (linksToModify.active != linksToModify.new) { linksToModify.active ? deleteClass(linksToModify.active, active): false; pushClass(linksToModify.new, active); } }; function loadActions() { (function updateDate() { const date = new Date(); const year = date.getFullYear(); const yearEl = elem('.year'); yearEl ? year.innerHTML = year : false; })(); (function customizeSidebar(){ const tocActive = 'toc_active'; const aside = elem('aside'); const tocs = elems('nav', aside); if(tocs) { tocs.forEach(function(toc){ toc.id = ""; pushClass(toc, 'toc'); const tocItems = Array.from(toc.children[0].children); const previousHeading = toc.previousElementSibling; previousHeading.matches('.active') ? pushClass(toc, tocActive) : false; tocItems.forEach(function(item){ pushClass(item, 'toc_item'); pushClass(item.firstElementChild, 'toc_link'); }) }); const currentToc = elem(`.${tocActive}`); if(currentToc) { const pageInternalLinks = Array.from(elems('a', currentToc)); const pageIds = pageInternalLinks.map(function(link){ return link.hash; }); const linkPositions = pageIds.map(function(id){ const heading = elem(id); const position = heading.offsetTop; return position; }); pageInternalLinks.forEach(function(link, index){ link.dataset.position = linkPositions[index] }); console.log(linkPositions); window.addEventListener('scroll', function(e) { // this.setTimeout(function(){ let position = window.scrollY; let active = closestInt(position, linkPositions); console.log(active); activeHeading(active, pageInternalLinks); // }, 1500) }); } } })(); function searchResults(results=[], order =[]) { let resultsFragment = new DocumentFragment(); let showResults = elem('.search_results'); emptyEl(showResults); let index = 0 results.forEach(function(result){ let item = createEl('a'); item.href = result.link; item.className = 'search_result'; item.textContent = result.title; item.style.order = order[index]; resultsFragment.appendChild(item); index += 1 }); showResults.appendChild(resultsFragment); } (function search(){ const searchField = elem('.search_field'); if (searchField) { searchField.addEventListener('input', function() { console.log('typing') let rawResults = idx.search(`${ this.value }`).slice(0,6); let refs = rawResults.map(function(ref){ // return id and score in a single string return `${ref.ref}:${ref.score}`; }); let ids = refs.map(function(id){ let positionOfSeparator = id.indexOf(":"); id = id.substring(0,positionOfSeparator) return Number(id); }); let scores = refs.map(function(score){ let positionOfSeparator = score.indexOf(":"); score = score.substring((positionOfSeparator + 1), (score.length - 1)); return (parseFloat(score) * 50).toFixed(0); }); let matchedDocuments = simpleIndex.filter(function(doc){ return ids.includes(doc.id); }); matchedDocuments.length >= 1 ? searchResults(matchedDocuments, scores) : false; }); } })(); } window.addEventListener('load', loadActions());