mirror of
https://github.com/futurepress/epub.js.git
synced 2025-10-04 15:09:16 +02:00
Fix toc and nav for ie, parse request result is XML not present
This commit is contained in:
parent
4023acd354
commit
26f8346c33
15 changed files with 1772 additions and 1809 deletions
2
books
2
books
|
@ -1 +1 @@
|
|||
Subproject commit e9790315c2510315e270a7a4c4921825e9918039
|
||||
Subproject commit 8d6c46ef23ca637d89e66b18b2146ccef93c1ac4
|
1649
build/epub.js
1649
build/epub.js
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
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
|
@ -8,5 +8,5 @@
|
|||
"hooks/default/transculsions.js"
|
||||
],
|
||||
"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
|
@ -12,13 +12,14 @@
|
|||
|
||||
<!-- EPUBJS Renderer -->
|
||||
<script src="../build/epub.min.js"></script>
|
||||
<script src="../build/libs/zip.min.js"></script>
|
||||
|
||||
<script>
|
||||
"use strict";
|
||||
|
||||
var Book = ePub("../reader/moby-dick/", { restore: true });
|
||||
|
||||
|
||||
|
||||
var Book = ePub("../reader/moby-dick/", { restore: false });
|
||||
|
||||
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
|
@ -30,12 +31,12 @@
|
|||
<select id="toc"></select>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
<script>
|
||||
|
||||
Book.getMetadata().then(function(meta){
|
||||
|
||||
document.title = meta.bookTitle+" – "+meta.creator;
|
||||
|
||||
|
||||
});
|
||||
|
||||
Book.getToc().then(function(toc){
|
||||
|
@ -56,13 +57,13 @@
|
|||
$select.onchange = function(){
|
||||
var index = $select.selectedIndex,
|
||||
url = $select.options[index].ref;
|
||||
|
||||
|
||||
Book.goto(url);
|
||||
return false;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
|
||||
Book.ready.all.then(function(){
|
||||
document.getElementById("loader").style.display = "none";
|
||||
});
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "epub.js",
|
||||
"version": "0.2.10",
|
||||
"version": "0.2.11",
|
||||
"repository": "https://github.com/futurepress/epub.js",
|
||||
"description": "Render ePub documents in the browser, across many devices",
|
||||
"main": "server.js",
|
||||
|
|
File diff suppressed because one or more lines are too long
1649
reader/js/epub.min.js
vendored
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
|
@ -1,7 +1,7 @@
|
|||
'use strict';
|
||||
|
||||
var EPUBJS = EPUBJS || {};
|
||||
EPUBJS.VERSION = "0.2.10";
|
||||
EPUBJS.VERSION = "0.2.11";
|
||||
|
||||
EPUBJS.plugins = EPUBJS.plugins || {};
|
||||
|
||||
|
|
|
@ -59,7 +59,14 @@ EPUBJS.core.request = function(url, type, withCredentials) {
|
|||
var r;
|
||||
|
||||
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
|
||||
if(type == 'json'){
|
||||
r = JSON.parse(this.response);
|
||||
|
|
228
src/parser.js
228
src/parser.js
|
@ -259,143 +259,131 @@ EPUBJS.Parser.prototype.spine = function(spineXml, manifest){
|
|||
};
|
||||
|
||||
EPUBJS.Parser.prototype.nav = function(navHtml, spineIndexByURL, bookSpine){
|
||||
var navEl = navHtml.querySelector('nav[*|type="toc"]'), //-- [*|type="toc"] * Doesn't seem to work
|
||||
idCounter = 0;
|
||||
|
||||
if(!navEl) return [];
|
||||
|
||||
// Implements `> ol > li`
|
||||
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;
|
||||
var navPoints = navHtml.querySelectorAll('nav[*|type="toc"] ol li');
|
||||
var length = navPoints.length;
|
||||
var i;
|
||||
var toc = {};
|
||||
var list = [];
|
||||
var item, parent;
|
||||
|
||||
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`
|
||||
function findAnchorOrSpan(parent){
|
||||
var item = null;
|
||||
return list;
|
||||
};
|
||||
|
||||
Array.prototype.slice.call(parent.childNodes).forEach(function(node){
|
||||
if('a' == node.tagName || 'span' == node.tagName){
|
||||
item = node;
|
||||
}
|
||||
});
|
||||
EPUBJS.Parser.prototype.navItem = function(item, spineIndexByURL, bookSpine){
|
||||
var id = item.getAttribute('id') || false,
|
||||
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){
|
||||
var list = [],
|
||||
nodes = findListItems(parent),
|
||||
items = Array.prototype.slice.call(nodes),
|
||||
length = items.length,
|
||||
node;
|
||||
|
||||
if(length === 0) return false;
|
||||
|
||||
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;
|
||||
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 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){
|
||||
var navMap = tocXml.querySelector("navMap");
|
||||
if(!navMap) return [];
|
||||
var navPoints = tocXml.querySelectorAll("navMap navPoint");
|
||||
var length = navPoints.length;
|
||||
var i;
|
||||
var toc = {};
|
||||
var list = [];
|
||||
var item, parent;
|
||||
|
||||
function getTOC(parent){
|
||||
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
|
||||
});
|
||||
if(!navPoints || length === 0) return list;
|
||||
|
||||
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){
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue