Fixed TOC level bug + linked id values

This commit is contained in:
andris9 2011-06-13 13:11:29 +03:00
parent e0f3931a19
commit b4f333ca81

52
epub.js
View File

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