diff --git a/reader_src/reader.js b/reader_src/reader.js index 3ec82e5..10173b0 100644 --- a/reader_src/reader.js +++ b/reader_src/reader.js @@ -269,8 +269,12 @@ EPUBJS.Reader.prototype.applySavedSettings = function() { if(!localStorage) { return false; } - + + try { stored = JSON.parse(localStorage.getItem(this.settings.bookKey)); + } catch (e) { // parsing error of localStorage + return false; + } if(stored) { this.settings = _.defaults(this.settings, stored); diff --git a/src/epubcfi.js b/src/epubcfi.js index 6ab147f..359f96d 100644 --- a/src/epubcfi.js +++ b/src/epubcfi.js @@ -40,8 +40,14 @@ EPUBJS.EpubCFI.prototype.generateCfiFromElement = function(element, chapter) { // Start of Chapter return "epubcfi(" + chapter + "!/4/)"; } else { + var offset = ""; + var embeddedElements = ["audio", "canvas", "embed", "iframe", "img", "math", "object", "svg", "video"]; + if (embeddedElements.indexOf(element.tagName.toLowerCase()) === -1) { + // if the element could contain text, set the character offset; + offset += "/1:0"; + } // First Text Node - return "epubcfi(" + chapter + "!" + path + "/1:0)"; + return "epubcfi(" + chapter + "!" + path + offset + ")"; } }; diff --git a/src/renderer.js b/src/renderer.js index 04f2e26..5f99738 100644 --- a/src/renderer.js +++ b/src/renderer.js @@ -484,6 +484,15 @@ EPUBJS.Renderer.prototype.firstElementisTextNode = function(node) { return false; }; +EPUBJS.Renderer.prototype.isGoodNode = function(node) { + var embeddedElements = ["audio", "canvas", "embed", "iframe", "img", "math", "object", "svg", "video"]; + if (embeddedElements.indexOf(node.tagName.toLowerCase()) !== -1) { + // Embedded elements usually do not have a text node as first element, but are also good nodes + return true; + } + return this.firstElementisTextNode(node); +}; + // Walk the node tree from a start element to next visible element EPUBJS.Renderer.prototype.walk = function(node, x, y) { var r, children, leng, @@ -495,7 +504,7 @@ EPUBJS.Renderer.prototype.walk = function(node, x, y) { while(!r && stack.length) { node = stack.shift(); - if( this.containsPoint(node, x, y) && this.firstElementisTextNode(node)) { + if( this.containsPoint(node, x, y) && this.isGoodNode(node)) { r = node; } diff --git a/src/replace.js b/src/replace.js index 20f0b9d..7286fd6 100644 --- a/src/replace.js +++ b/src/replace.js @@ -77,7 +77,10 @@ EPUBJS.replace.links = function(_store, full, done, link){ }, 5); //-- Allow for css to apply before displaying chapter }); }else{ - _store.getUrl(full).then(done); + _store.getUrl(full).then(done, function(reason) { + // we were unable to get the url, signal to upper layer + done(null); + }); } };