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:
parent
a1e77b745b
commit
7297af051b
1 changed files with 28 additions and 36 deletions
|
@ -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);
|
/**
|
||||||
}
|
* 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
|
* @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 {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue