Fixed TOC level bug + linked id values
This commit is contained in:
parent
e0f3931a19
commit
b4f333ca81
52
epub.js
52
epub.js
@ -413,9 +413,14 @@ EPub.prototype.parseSpine = function(spine){
|
|||||||
* Parses ncx file for table of contents (title, html file)
|
* Parses ncx file for table of contents (title, html file)
|
||||||
**/
|
**/
|
||||||
EPub.prototype.parseTOC = function(){
|
EPub.prototype.parseTOC = function(){
|
||||||
var path = this.spine.toc.href.split("/");
|
var path = this.spine.toc.href.split("/"), id_list = {}, keys;
|
||||||
path.pop();
|
path.pop();
|
||||||
|
|
||||||
|
keys = Object.keys(this.manifest);
|
||||||
|
for(var i=0, len = keys.length; i<len; i++){
|
||||||
|
id_list[this.manifest[keys[i]].href] = keys[i];
|
||||||
|
}
|
||||||
|
|
||||||
this.zip.readFile(this.spine.toc.href, (function(err, data){
|
this.zip.readFile(this.spine.toc.href, (function(err, data){
|
||||||
if(err){
|
if(err){
|
||||||
this.emit("error", new Error("Reading archive failed"));
|
this.emit("error", new Error("Reading archive failed"));
|
||||||
@ -426,7 +431,7 @@ EPub.prototype.parseTOC = function(){
|
|||||||
|
|
||||||
xmlparser.on("end", (function(result){
|
xmlparser.on("end", (function(result){
|
||||||
if(result.navMap && result.navMap.navPoint){
|
if(result.navMap && result.navMap.navPoint){
|
||||||
this.toc = this.walkNavMap(result.navMap.navPoint, path);
|
this.toc = this.walkNavMap(result.navMap.navPoint, path, id_list);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.emit("end");
|
this.emit("end");
|
||||||
@ -443,19 +448,22 @@ EPub.prototype.parseTOC = function(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* EPub#walkNavMap(branch, path[, level]) -> Array
|
* EPub#walkNavMap(branch, path, id_list,[, level]) -> Array
|
||||||
* - branch (Array | Object): NCX NavPoint object
|
* - branch (Array | Object): NCX NavPoint object
|
||||||
* - path (Array): Base path
|
* - path (Array): Base path
|
||||||
|
* - id_list (Object): map of file paths and id values
|
||||||
* - level (Number): deepness
|
* - level (Number): deepness
|
||||||
*
|
*
|
||||||
* Walks the NavMap object through all levels and finds elements
|
* Walks the NavMap object through all levels and finds elements
|
||||||
* for TOC
|
* for TOC
|
||||||
**/
|
**/
|
||||||
EPub.prototype.walkNavMap = function(branch, path, level){
|
EPub.prototype.walkNavMap = function(branch, path, id_list, level){
|
||||||
level || level || 0;
|
level = level || 0;
|
||||||
|
|
||||||
|
// don't go too far
|
||||||
if(level>7)return [];
|
if(level>7)return [];
|
||||||
|
|
||||||
var output = [], element;
|
var output = [], element, id, title, order, href;
|
||||||
|
|
||||||
if(!Array.isArray(branch)){
|
if(!Array.isArray(branch)){
|
||||||
branch = [branch];
|
branch = [branch];
|
||||||
@ -463,20 +471,38 @@ EPub.prototype.walkNavMap = function(branch, path, level){
|
|||||||
|
|
||||||
for(var i=0, len = branch.length; i<len; i++){
|
for(var i=0, len = branch.length; i<len; i++){
|
||||||
if(branch[i]["navLabel"]){
|
if(branch[i]["navLabel"]){
|
||||||
|
|
||||||
|
title = (branch[i]["navLabel"] && branch[i]["navLabel"].text || branch[i]["navLabel"] || "").trim();
|
||||||
|
order = Number(branch[i]["@"] && branch[i]["@"].playOrder || 0);
|
||||||
|
href = (branch[i]["content"] && branch[i]["content"]["@"] && branch[i]["content"]["@"].src || "").trim();
|
||||||
|
|
||||||
element = {
|
element = {
|
||||||
id: (branch[i]["@"] && branch[i]["@"].id || "").trim(),
|
level: level,
|
||||||
order: Number(branch[i]["@"] && branch[i]["@"].playOrder || 0),
|
order: order,
|
||||||
title: (branch[i]["navLabel"] && branch[i]["navLabel"].text || branch[i]["navLabel"] || "").trim(),
|
title: title
|
||||||
href: (branch[i]["content"] && branch[i]["content"]["@"] && branch[i]["content"]["@"].src || "").trim()
|
}
|
||||||
|
|
||||||
|
if(href){
|
||||||
|
href = path.concat([href]).join("/")
|
||||||
|
element.href = href;
|
||||||
|
|
||||||
|
if(id_list[element.href]){
|
||||||
|
// link existing object
|
||||||
|
element = this.manifest[id_list[element.href]];
|
||||||
|
element.title = title;
|
||||||
|
element.order = order;
|
||||||
|
element.level = level;
|
||||||
|
}else{
|
||||||
|
// use new one
|
||||||
|
element.href = href;
|
||||||
|
element.id = (branch[i]["@"] && branch[i]["@"].id || "").trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
if(element.href){
|
|
||||||
element.href = path.concat([element.href]).join("/");
|
|
||||||
output.push(element);
|
output.push(element);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(branch[i]["navPoint"]){
|
if(branch[i]["navPoint"]){
|
||||||
output = output.concat(this.walkNavMap(branch[i]["navPoint"], path, level + 1));
|
output = output.concat(this.walkNavMap(branch[i]["navPoint"], path, id_list, level + 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return output;
|
return output;
|
||||||
|
Reference in New Issue
Block a user