diff --git a/src/navigation.js b/src/navigation.js index 3a84d4c..0b6c9f1 100644 --- a/src/navigation.js +++ b/src/navigation.js @@ -151,27 +151,35 @@ class Navigation { var navElement = querySelectorByType(navHtml, "nav", "toc"); var navItems = navElement ? qsa(navElement, "li") : []; var length = navItems.length; - var i; - var toc = {}; var list = []; - var item, parent; if(!navItems || length === 0) return list; - for (i = 0; i < length; ++i) { - item = this.navItem(navItems[i]); - if (item) { - toc[item.id] = item; - if(!item.parent) { - list.push(item); - } else { - parent = toc[item.parent]; - parent.subitems.push(item); - } - } + if (!navElement) return list; + if (!navElement.children) return list; + if (!navElement.children[0]) return list; + + list = this.parseNavList(navElement.children[0]); + return list; + } + + /** + * Parses lists in the toc + * @param {document} navListHtml + * @param {string} parent id + * @return {array} navigation list + */ + parseNavList(navListHtml, parent) { + const result = []; + + if (!navListHtml) return result; + if (!navListHtml.children) return result; + + for (let i = 0; i < navListHtml.children.length; i++) { + result.push(this.navItem(navListHtml.children[i], parent)); } - return list; + return result; } /** @@ -180,7 +188,7 @@ class Navigation { * @param {element} item * @return {object} navItem */ - navItem(item){ + navItem(item, parent) { let id = item.getAttribute("id") || undefined; let content = filterChildren(item, "a", true); @@ -194,27 +202,11 @@ class Navigation { id = src; } let text = content.textContent || ""; + let subitems = []; - let parentItem = getParentByTagName(item, "li"); - let parent; - - if (parentItem) { - parent = parentItem.getAttribute("id"); - if (!parent) { - const parentContent = filterChildren(parentItem, "a", true); - parent = parentContent && parentContent.getAttribute("href"); - } - } - - while (!parent && parentItem) { - parentItem = getParentByTagName(parentItem, "li"); - if (parentItem) { - parent = parentItem.getAttribute("id"); - if (!parent) { - const parentContent = filterChildren(parentItem, "a", true); - parent = parentContent && parentContent.getAttribute("href"); - } - } + let nested = filterChildren(item, "ol", true); + if (nested) { + subitems = this.parseNavList(nested, id); } return {