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

Merge pull request #280 from futurepress/toc_fix

Fix toc and nav for ie, parse request result is XML not present
This commit is contained in:
Fred Chasen 2015-09-25 11:19:11 -04:00
commit a9136f95ec
15 changed files with 1772 additions and 1809 deletions

2
books

@ -1 +1 @@
Subproject commit e9790315c2510315e270a7a4c4921825e9918039 Subproject commit 8d6c46ef23ca637d89e66b18b2146ccef93c1ac4

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

9
build/epub.min.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -8,5 +8,5 @@
"hooks/default/transculsions.js" "hooks/default/transculsions.js"
], ],
"names": [], "names": [],
"mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA" "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;AC9JA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;A"
} }

File diff suppressed because one or more lines are too long

View file

@ -12,13 +12,14 @@
<!-- EPUBJS Renderer --> <!-- EPUBJS Renderer -->
<script src="../build/epub.min.js"></script> <script src="../build/epub.min.js"></script>
<script src="../build/libs/zip.min.js"></script>
<script> <script>
"use strict"; "use strict";
var Book = ePub("../reader/moby-dick/", { restore: true }); var Book = ePub("../reader/moby-dick/", { restore: false });
</script> </script>
</head> </head>
<body> <body>
@ -30,12 +31,12 @@
<select id="toc"></select> <select id="toc"></select>
</div> </div>
<script> <script>
Book.getMetadata().then(function(meta){ Book.getMetadata().then(function(meta){
document.title = meta.bookTitle+" "+meta.creator; document.title = meta.bookTitle+" "+meta.creator;
}); });
Book.getToc().then(function(toc){ Book.getToc().then(function(toc){
@ -56,13 +57,13 @@
$select.onchange = function(){ $select.onchange = function(){
var index = $select.selectedIndex, var index = $select.selectedIndex,
url = $select.options[index].ref; url = $select.options[index].ref;
Book.goto(url); Book.goto(url);
return false; return false;
} }
}); });
Book.ready.all.then(function(){ Book.ready.all.then(function(){
document.getElementById("loader").style.display = "none"; document.getElementById("loader").style.display = "none";
}); });

View file

@ -1,6 +1,6 @@
{ {
"name": "epub.js", "name": "epub.js",
"version": "0.2.10", "version": "0.2.11",
"repository": "https://github.com/futurepress/epub.js", "repository": "https://github.com/futurepress/epub.js",
"description": "Render ePub documents in the browser, across many devices", "description": "Render ePub documents in the browser, across many devices",
"main": "server.js", "main": "server.js",

File diff suppressed because one or more lines are too long

1649
reader/js/epub.min.js vendored

File diff suppressed because it is too large Load diff

File diff suppressed because one or more lines are too long

View file

@ -1,7 +1,7 @@
'use strict'; 'use strict';
var EPUBJS = EPUBJS || {}; var EPUBJS = EPUBJS || {};
EPUBJS.VERSION = "0.2.10"; EPUBJS.VERSION = "0.2.11";
EPUBJS.plugins = EPUBJS.plugins || {}; EPUBJS.plugins = EPUBJS.plugins || {};

View file

@ -59,7 +59,14 @@ EPUBJS.core.request = function(url, type, withCredentials) {
var r; var r;
if(type == 'xml'){ if(type == 'xml'){
r = this.responseXML;
// If this.responseXML wasn't set, try to parse using a DOMParser from text
if(!this.responseXML){
r = new DOMParser().parseFromString(this.response, "text/xml");
} else {
r = this.responseXML;
}
}else }else
if(type == 'json'){ if(type == 'json'){
r = JSON.parse(this.response); r = JSON.parse(this.response);

View file

@ -259,143 +259,131 @@ EPUBJS.Parser.prototype.spine = function(spineXml, manifest){
}; };
EPUBJS.Parser.prototype.nav = function(navHtml, spineIndexByURL, bookSpine){ EPUBJS.Parser.prototype.nav = function(navHtml, spineIndexByURL, bookSpine){
var navEl = navHtml.querySelector('nav[*|type="toc"]'), //-- [*|type="toc"] * Doesn't seem to work var navPoints = navHtml.querySelectorAll('nav[*|type="toc"] ol li');
idCounter = 0; var length = navPoints.length;
var i;
if(!navEl) return []; var toc = {};
var list = [];
// Implements `> ol > li` var item, parent;
function findListItems(parent){
var items = [];
Array.prototype.slice.call(parent.childNodes).forEach(function(node){
if('ol' == node.tagName){
Array.prototype.slice.call(node.childNodes).forEach(function(item){
if('li' == item.tagName){
items.push(item);
}
});
}
});
return items;
if(!navPoints || length === 0) return list;
for (i = 0; i < length; ++i) {
item = this.navItem(navPoints[i], spineIndexByURL, bookSpine);
toc[item.id] = item;
if(!item.parent) {
list.push(item);
} else {
parent = toc[item.parent];
parent.subitems.push(item);
}
} }
// Implements `> a, > span` return list;
function findAnchorOrSpan(parent){ };
var item = null;
Array.prototype.slice.call(parent.childNodes).forEach(function(node){ EPUBJS.Parser.prototype.navItem = function(item, spineIndexByURL, bookSpine){
if('a' == node.tagName || 'span' == node.tagName){ var id = item.getAttribute('id') || false,
item = node; content = item.querySelector("a, span"),
} src = content.getAttribute('href') || '',
}); text = content.textContent || "",
split = src.split("#"),
baseUrl = split[0],
spinePos = spineIndexByURL[baseUrl],
spineItem = bookSpine[spinePos],
subitems = [],
parentNode = item.parentNode,
parent,
cfi = spineItem ? spineItem.cfi : '';
return item; if(parentNode && parentNode.nodeName === "navPoint") {
parent = parentNode.getAttribute('id');
} }
function getTOC(parent){ if(!id) {
var list = [], if(spinePos) {
nodes = findListItems(parent), spineItem = bookSpine[spinePos];
items = Array.prototype.slice.call(nodes), id = spineItem.id;
length = items.length, cfi = spineItem.cfi;
node; } else {
id = 'epubjs-autogen-toc-id-' + EPUBJS.core.uuid();
if(length === 0) return false; item.setAttribute('id', id);
}
items.forEach(function(item){
var id = item.getAttribute('id') || false,
content = findAnchorOrSpan(item),
href = content.getAttribute('href') || '',
text = content.textContent || "",
split = href.split("#"),
baseUrl = split[0],
subitems = getTOC(item),
spinePos = spineIndexByURL[baseUrl],
spineItem = bookSpine[spinePos],
cfi = spineItem ? spineItem.cfi : '';
if(!id) {
if(spinePos) {
spineItem = bookSpine[spinePos];
id = spineItem.id;
cfi = spineItem.cfi;
} else {
id = 'epubjs-autogen-toc-id-' + (idCounter++);
}
}
item.setAttribute('id', id); // Ensure all elements have an id
list.push({
"id": id,
"href": href,
"label": text,
"subitems" : subitems,
"parent" : parent ? parent.getAttribute('id') : null,
"cfi" : cfi
});
});
return list;
} }
return getTOC(navEl); return {
"id": id,
"href": src,
"label": text,
"spinePos": spinePos,
"subitems" : subitems,
"parent" : parent,
"cfi" : cfi
};
}; };
EPUBJS.Parser.prototype.toc = function(tocXml, spineIndexByURL, bookSpine){ EPUBJS.Parser.prototype.toc = function(tocXml, spineIndexByURL, bookSpine){
var navMap = tocXml.querySelector("navMap"); var navPoints = tocXml.querySelectorAll("navMap navPoint");
if(!navMap) return []; var length = navPoints.length;
var i;
var toc = {};
var list = [];
var item, parent;
function getTOC(parent){ if(!navPoints || length === 0) return list;
var list = [],
snapshot = tocXml.evaluate("*[local-name()='navPoint']", parent, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null),
length = snapshot.snapshotLength;
if(length === 0) return [];
for ( var i=length-1 ; i >= 0; i-- ) {
var item = snapshot.snapshotItem(i);
var id = item.getAttribute('id') || false,
content = item.querySelector("content"),
src = content.getAttribute('src'),
navLabel = item.querySelector("navLabel"),
text = navLabel.textContent ? navLabel.textContent : "",
split = src.split("#"),
baseUrl = split[0],
spinePos = spineIndexByURL[baseUrl],
spineItem = bookSpine[spinePos],
subitems = getTOC(item),
cfi = spineItem ? spineItem.cfi : '';
if(!id) {
if(spinePos) {
spineItem = bookSpine[spinePos];
id = spineItem.id;
cfi = spineItem.cfi;
} else {
id = 'epubjs-autogen-toc-id-' + (idCounter++);
}
}
list.unshift({
"id": id,
"href": src,
"label": text,
"spinePos": spinePos,
"subitems" : subitems,
"parent" : parent ? parent.getAttribute('id') : null,
"cfi" : cfi
});
for (i = 0; i < length; ++i) {
item = this.tocItem(navPoints[i], spineIndexByURL, bookSpine);
toc[item.id] = item;
if(!item.parent) {
list.push(item);
} else {
parent = toc[item.parent];
parent.subitems.push(item);
} }
return list;
} }
return getTOC(navMap); return list;
};
EPUBJS.Parser.prototype.tocItem = function(item, spineIndexByURL, bookSpine){
var id = item.getAttribute('id') || false,
content = item.querySelector("content"),
src = content.getAttribute('src'),
navLabel = item.querySelector("navLabel"),
text = navLabel.textContent ? navLabel.textContent : "",
split = src.split("#"),
baseUrl = split[0],
spinePos = spineIndexByURL[baseUrl],
spineItem = bookSpine[spinePos],
subitems = [],
parentNode = item.parentNode,
parent,
cfi = spineItem ? spineItem.cfi : '';
if(parentNode && parentNode.nodeName === "navPoint") {
parent = parentNode.getAttribute('id');
}
if(!id) {
if(spinePos) {
spineItem = bookSpine[spinePos];
id = spineItem.id;
cfi = spineItem.cfi;
} else {
id = 'epubjs-autogen-toc-id-' + EPUBJS.core.uuid();
item.setAttribute('id', id);
}
}
return {
"id": id,
"href": src,
"label": text,
"spinePos": spinePos,
"subitems" : subitems,
"parent" : parent,
"cfi" : cfi
};
}; };
EPUBJS.Parser.prototype.pageList = function(navHtml, spineIndexByURL, bookSpine){ EPUBJS.Parser.prototype.pageList = function(navHtml, spineIndexByURL, bookSpine){