'use strict'; var raw_html_tree = document.getElementById('toc').firstChild.cloneNode(true); function createSearchable(el) { var par = el.parentElement; var obj = el.cloneNode(true); while(par != raw_html_tree) { var clone_parent = par.cloneNode(true); while (clone_parent.firstChild != clone_parent.lastChild) { clone_parent.removeChild(clone_parent.lastChild); } console.log("obj.innerHTML: " + obj.innerHTML); console.log("clone_parent.firstChild.innerHTML: " + clone_parent.firstChild.innerHTML); if (obj.innerHTML != clone_parent.firstChild.innerHTML) clone_parent.appendChild(obj); obj = clone_parent; par = par.parentElement; } return { searchable: el.innerHTML, obj: obj }; } var searchables = []; Array(...raw_html_tree.getElementsByTagName('a')) .forEach(el => searchables.push(createSearchable(el))); var fuse = new Fuse(searchables, { keys: [ 'searchable' ], includeMatches: true}); var searchBar = document.getElementById('search'); var resultsDiv = document.getElementById('toc'); function updateResults() { var ul = document.createElement('ul'); resultsDiv.innerHTML = ''; if (searchBar.value == '') { resultsDiv.appendChild(raw_html_tree); return; } var results = fuse.search(searchBar.value); results.forEach(r => { console.log(r) var content = r.item.obj var last_a = Array.from(r.item.obj.getElementsByTagName('a')).pop() r.matches.reverse().every(match => { var display_match = match.value; if (match.indices.length >= 1) { match.indices.sort((a, b) => (b[1]-b[0])-(a[1]-a[0])); const indexPair = match.indices[0]; const matching_slice = match.value.slice(indexPair[0], indexPair[1]+1); last_a.innerHTML = match.value.replace( matching_slice, '' + matching_slice + '' ); } return true; }) ul.appendChild(content); ul.appendChild(document.createElement('br')); }) resultsDiv.appendChild(ul); } searchBar.addEventListener('keyup', e => { // if user pressed enter if (e.keyCode === 13) { if (e.shiftKey) { window.open(results[0].item.path, '_blank'); } else { window.location.href = results[0].item.path; } return; } updateResults(); }) searchBar.addEventListener('change', updateResults); const searchParams = new URL(window.location.href).searchParams; searchBar.value = searchParams.get('q'); updateResults(); if (searchParams.has('lucky')) { window.location.href = results[0].item.path; }