1
0
Fork 0
mirror of https://github.com/futurepress/epub.js.git synced 2025-10-04 15:09:16 +02:00

Return nested TOC with duplicate ids

This commit is contained in:
niels 2020-08-21 11:33:10 +02:00
parent a1e77b745b
commit 7297af051b

View file

@ -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;
}
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 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 {