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 navElement = querySelectorByType(navHtml, "nav", "toc");
var navItems = navElement ? qsa(navElement, "li") : []; var navItems = navElement ? qsa(navElement, "li") : [];
var length = navItems.length; var length = navItems.length;
var i;
var toc = {};
var list = []; var list = [];
var item, parent;
if(!navItems || length === 0) return list; if(!navItems || length === 0) return list;
for (i = 0; i < length; ++i) { if (!navElement) return list;
item = this.navItem(navItems[i]); if (!navElement.children) return list;
if (item) { if (!navElement.children[0]) return list;
toc[item.id] = item;
if(!item.parent) { list = this.parseNavList(navElement.children[0]);
list.push(item); return list;
} else {
parent = toc[item.parent];
parent.subitems.push(item);
}
}
} }
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 * @param {element} item
* @return {object} navItem * @return {object} navItem
*/ */
navItem(item){ navItem(item, parent) {
let id = item.getAttribute("id") || undefined; let id = item.getAttribute("id") || undefined;
let content = filterChildren(item, "a", true); let content = filterChildren(item, "a", true);
@ -194,27 +202,11 @@ class Navigation {
id = src; id = src;
} }
let text = content.textContent || ""; let text = content.textContent || "";
let subitems = []; let subitems = [];
let parentItem = getParentByTagName(item, "li"); let nested = filterChildren(item, "ol", true);
let parent; if (nested) {
subitems = this.parseNavList(nested, id);
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");
}
}
} }
return { return {