// grab the table of contents filled with all the anchors function __result_handler() { function getMap() { var toc_element = document.getElementById("contents").nextElementSibling; function getSection() { function getIds(node) { var a = []; var nodes = node.querySelectorAll('*[id]'); for (var i = 0; i < nodes.length; i++) { a.push(nodes[i].getAttribute("id")); } return a; } function getTOCIds() { var a = []; var nodes = toc_element.querySelectorAll('li'); for (var i = 0; i < nodes.length; i++) { var href = nodes[i].firstElementChild.getAttribute("href"); a.push(href.substring(1)); } return a; } var obj = new Object(); var ids = getIds(document); var toc = getTOCIds(); for (var i = 1; i < toc.length; i++) { var key1 = toc[i-1]; var key2 = toc[i]; var map = []; var index1 = ids.indexOf(key1); var index2 = ids.indexOf(key2); if ((index2-index1) > 1) { for (var j = index1+1; j < index2;j++) { map.push(ids[j]); } } obj[key1] = map; } { var key = toc[toc.length-1]; var index = ids.indexOf(key); var map = []; for (var j = index+1; j < ids.length;j++) { map.push(ids[j]); } obj[key] = map; } return obj; } function section(id) { this.id = id; } function addSubSection(section, sub) { if (typeof section.sections === "undefined") { section.sections = []; } section.sections.push(sub); } function li(el, map) { var obj = new section(el.firstElementChild.getAttribute("href").substring(1)); obj.title = el.firstElementChild.textContent; var child = el.firstElementChild; var m = map[obj.id]; for (var i = 0; i < m.length; i++) { var sub = new section(m[i]); addSubSection(obj, sub); } while (child !== null) { if (child.nodeName === "OL") ol(child, obj, map); child = child.nextElementSibling; } return obj; } function ol(el, section, map) { var child = el.firstElementChild; while (child !== null) { addSubSection(section, li(child, map)); child = child.nextElementSibling; } } var map = getSection(); var main = new section("___main___"); main.title = document.title; ol(toc_element, main, map); return main; } return getMap(); }