diff --git a/dist/epub.js b/dist/epub.js index a6a3157..3be94cf 100644 --- a/dist/epub.js +++ b/dist/epub.js @@ -1,37 +1,3 @@ -if (typeof EPUBJS === 'undefined') { - (typeof window !== 'undefined' ? window : this).EPUBJS = {}; -} - -EPUBJS.VERSION = "0.3.0"; -EPUBJS.Render = {}; - -(function(root) { - "use strict"; - var ePub = function(_url) { - return new EPUBJS.Book(_url); - }; - - ePub.Render = { - register: function(name, renderer) { - ePub.Render[name] = renderer; - } - } - - // CommonJS - if (typeof exports === "object") { - root.RSVP = require("rsvp"); - module.exports = ePub; - // RequireJS - } else if (typeof define === "function" && define.amd) { - define(ePub); - // Global - } else { - root.ePub = ePub; - } - -})(this); - - (function(global) { /** @class RSVP @@ -2229,4592 +2195,4 @@ define('rsvp', [ __exports__.filter = filter; }); global.RSVP = require('rsvp'); -}(self)); -EPUBJS.core = {}; - -EPUBJS.core.request = function(url, type, withCredentials, headers) { - var supportsURL = window.URL; - var BLOB_RESPONSE = supportsURL ? "blob" : "arraybuffer"; - - var deferred = new RSVP.defer(); - - var xhr = new XMLHttpRequest(); - - //-- Check from PDF.js: - // https://github.com/mozilla/pdf.js/blob/master/web/compatibility.js - var xhrPrototype = XMLHttpRequest.prototype; - - var header; - - if (!('overrideMimeType' in xhrPrototype)) { - // IE10 might have response, but not overrideMimeType - Object.defineProperty(xhrPrototype, 'overrideMimeType', { - value: function xmlHttpRequestOverrideMimeType(mimeType) {} - }); - } - if(withCredentials) { - xhr.withCredentials = true; - } - - xhr.open("GET", url, true); - - for(header in headers) { - xhr.setRequestHeader(header, headers[header]); - } - - xhr.onreadystatechange = handler; - - if(type == 'blob'){ - xhr.responseType = BLOB_RESPONSE; - } - - if(type == "json") { - xhr.setRequestHeader("Accept", "application/json"); - } - - if(type == 'xml') { - xhr.overrideMimeType('text/xml'); - } - - xhr.send(); - - function handler() { - if (this.readyState === this.DONE) { - if (this.status === 200 || this.responseXML ) { //-- Firefox is reporting 0 for blob urls - var r; - - if(type == 'xml'){ - - // 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); - }else - if(type == 'blob'){ - - if(supportsURL) { - r = this.response; - } else { - //-- Safari doesn't support responseType blob, so create a blob from arraybuffer - r = new Blob([this.response]); - } - - }else{ - r = this.response; - } - - deferred.resolve(r); - } else { - deferred.reject({ - status: this.status, - message : this.response, - stack : new Error().stack - }); - } - } - } - - return deferred.promise; -}; - -//-- Parse the different parts of a url, returning a object -EPUBJS.core.uri = function(url){ - var uri = { - protocol : '', - host : '', - path : '', - origin : '', - directory : '', - base : '', - filename : '', - extension : '', - fragment : '', - href : url - }, - doubleSlash = url.indexOf('://'), - search = url.indexOf('?'), - fragment = url.indexOf("#"), - withoutProtocol, - dot, - firstSlash; - - if(fragment != -1) { - uri.fragment = url.slice(fragment + 1); - url = url.slice(0, fragment); - } - - if(search != -1) { - uri.search = url.slice(search + 1); - url = url.slice(0, search); - href = url; - } - - if(doubleSlash != -1) { - uri.protocol = url.slice(0, doubleSlash); - withoutProtocol = url.slice(doubleSlash+3); - firstSlash = withoutProtocol.indexOf('/'); - - if(firstSlash === -1) { - uri.host = uri.path; - uri.path = ""; - } else { - uri.host = withoutProtocol.slice(0, firstSlash); - uri.path = withoutProtocol.slice(firstSlash); - } - - - uri.origin = uri.protocol + "://" + uri.host; - - uri.directory = EPUBJS.core.folder(uri.path); - - uri.base = uri.origin + uri.directory; - // return origin; - } else { - uri.path = url; - uri.directory = EPUBJS.core.folder(url); - uri.base = uri.directory; - } - - //-- Filename - uri.filename = url.replace(uri.base, ''); - dot = uri.filename.lastIndexOf('.'); - if(dot != -1) { - uri.extension = uri.filename.slice(dot+1); - } - return uri; -}; - -//-- Parse out the folder, will return everything before the last slash -EPUBJS.core.folder = function(url){ - - var lastSlash = url.lastIndexOf('/'); - - if(lastSlash == -1) var folder = ''; - - folder = url.slice(0, lastSlash + 1); - - return folder; - -}; - - -EPUBJS.core.queue = function(_scope){ - var _q = []; - var scope = _scope; - // Add an item to the queue - var enqueue = function(funcName, args, context) { - _q.push({ - "funcName" : funcName, - "args" : args, - "context" : context - }); - return _q; - }; - // Run one item - var dequeue = function(){ - var inwait; - if(_q.length) { - inwait = _q.shift(); - // Defer to any current tasks - // setTimeout(function(){ - scope[inwait.funcName].apply(inwait.context || scope, inwait.args); - // }, 0); - } - }; - - // Run All - var flush = function(){ - while(_q.length) { - dequeue(); - } - }; - // Clear all items in wait - var clear = function(){ - _q = []; - }; - - var length = function(){ - return _q.length; - }; - - return { - "enqueue" : enqueue, - "dequeue" : dequeue, - "flush" : flush, - "clear" : clear, - "length" : length - }; -}; - -EPUBJS.core.isElement = function(obj) { - return !!(obj && obj.nodeType == 1); -}; - -// http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript -EPUBJS.core.uuid = function() { - var d = new Date().getTime(); - var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { - var r = (d + Math.random()*16)%16 | 0; - d = Math.floor(d/16); - return (c=='x' ? r : (r&0x7|0x8)).toString(16); - }); - return uuid; -}; - -// From Lodash -EPUBJS.core.values = function(object) { - var index = -1, - props = Object.keys(object), - length = props.length, - result = Array(length); - - while (++index < length) { - result[index] = object[props[index]]; - } - return result; -}; - -EPUBJS.core.resolveUrl = function(base, path) { - var url = [], - segments = [], - baseUri = EPUBJS.core.uri(base), - pathUri = EPUBJS.core.uri(path), - baseDirectory = baseUri.directory, - pathDirectory = pathUri.directory, - directories = [], - // folders = base.split("/"), - paths; - - // if(uri.host) { - // return path; - // } - - if(baseDirectory[0] === "/") { - baseDirectory = baseDirectory.substring(1); - } - - if(pathDirectory[pathDirectory.length-1] === "/") { - baseDirectory = baseDirectory.substring(0, baseDirectory.length-1); - } - - if(pathDirectory[0] === "/") { - pathDirectory = pathDirectory.substring(1); - } - - if(pathDirectory[pathDirectory.length-1] === "/") { - pathDirectory = pathDirectory.substring(0, pathDirectory.length-1); - } - - if(baseDirectory) { - directories = baseDirectory.split("/"); - } - - paths = pathDirectory.split("/"); - - paths.reverse().forEach(function(part, index){ - if(part === ".."){ - directories.pop(); - } else if(part === directories[directories.length-1]) { - directories.pop(); - segments.unshift(part); - } else { - segments.unshift(part); - } - }); - - url = [baseUri.origin]; - - if(directories.length) { - url = url.concat(directories); - } - - if(segments) { - url = url.concat(segments); - } - - url = url.concat(pathUri.filename); - - return url.join("/"); -}; - -EPUBJS.core.documentHeight = function() { - return Math.max( - document.documentElement.clientHeight, - document.body.scrollHeight, - document.documentElement.scrollHeight, - document.body.offsetHeight, - document.documentElement.offsetHeight - ); -}; - -EPUBJS.core.isNumber = function(n) { - return !isNaN(parseFloat(n)) && isFinite(n); -}; - -EPUBJS.core.prefixed = function(unprefixed) { - var vendors = ["Webkit", "Moz", "O", "ms" ], - prefixes = ['-Webkit-', '-moz-', '-o-', '-ms-'], - upper = unprefixed[0].toUpperCase() + unprefixed.slice(1), - length = vendors.length; - - if (typeof(document.body.style[unprefixed]) != 'undefined') { - return unprefixed; - } - - for ( var i=0; i < length; i++ ) { - if (typeof(document.body.style[vendors[i] + upper]) != 'undefined') { - return vendors[i] + upper; - } - } - - return unprefixed; -}; - -EPUBJS.core.defaults = function(obj) { - for (var i = 1, length = arguments.length; i < length; i++) { - var source = arguments[i]; - for (var prop in source) { - if (obj[prop] === void 0) obj[prop] = source[prop]; - } - } - return obj; -}; - -EPUBJS.core.extend = function(target) { - var sources = [].slice.call(arguments, 1); - sources.forEach(function (source) { - if(!source) return; - Object.getOwnPropertyNames(source).forEach(function(propName) { - Object.defineProperty(target, propName, Object.getOwnPropertyDescriptor(source, propName)); - }); - }); - return target; -}; - -// Fast quicksort insert for sorted array -- based on: -// http://stackoverflow.com/questions/1344500/efficient-way-to-insert-a-number-into-a-sorted-array-of-numbers -EPUBJS.core.insert = function(item, array, compareFunction) { - var location = EPUBJS.core.locationOf(item, array, compareFunction); - array.splice(location, 0, item); - - return location; -}; -// Returns where something would fit in -EPUBJS.core.locationOf = function(item, array, compareFunction, _start, _end) { - var start = _start || 0; - var end = _end || array.length; - var pivot = parseInt(start + (end - start) / 2); - var compared; - if(!compareFunction){ - compareFunction = function(a, b) { - if(a > b) return 1; - if(a < b) return -1; - if(a = b) return 0; - }; - } - if(end-start <= 0) { - return pivot; - } - - compared = compareFunction(array[pivot], item); - if(end-start === 1) { - return compared > 0 ? pivot : pivot + 1; - } - - if(compared === 0) { - return pivot; - } - if(compared === -1) { - return EPUBJS.core.locationOf(item, array, compareFunction, pivot, end); - } else{ - return EPUBJS.core.locationOf(item, array, compareFunction, start, pivot); - } -}; -// Returns -1 of mpt found -EPUBJS.core.indexOfSorted = function(item, array, compareFunction, _start, _end) { - var start = _start || 0; - var end = _end || array.length; - var pivot = parseInt(start + (end - start) / 2); - var compared; - if(!compareFunction){ - compareFunction = function(a, b) { - if(a > b) return 1; - if(a < b) return -1; - if(a = b) return 0; - }; - } - if(end-start <= 0) { - return -1; // Not found - } - - compared = compareFunction(array[pivot], item); - if(end-start === 1) { - return compared === 0 ? pivot : -1; - } - if(compared === 0) { - return pivot; // Found - } - if(compared === -1) { - return EPUBJS.core.indexOfSorted(item, array, compareFunction, pivot, end); - } else{ - return EPUBJS.core.indexOfSorted(item, array, compareFunction, start, pivot); - } -}; - -EPUBJS.core.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame || window.msRequestAnimationFrame; - -EPUBJS.core.bounds = function(el) { - - var style = window.getComputedStyle(el); - var widthProps = ["width", "paddingRight", "paddingLeft", "marginRight", "marginLeft", "borderRightWidth", "borderLeftWidth"]; - var heightProps = ["height", "paddingTop", "paddingBottom", "marginTop", "marginBottom", "borderTopWidth", "borderBottomWidth"]; - - var width = 0; - var height = 0; - - widthProps.forEach(function(prop){ - width += parseFloat(style[prop]) || 0; - }) - - heightProps.forEach(function(prop){ - height += parseFloat(style[prop]) || 0; - }) - - return { - height: height, - width: width - } - -}; - -EPUBJS.core.borders = function(el) { - - var style = window.getComputedStyle(el); - var widthProps = ["paddingRight", "paddingLeft", "marginRight", "marginLeft", "borderRightWidth", "borderLeftWidth"]; - var heightProps = ["paddingTop", "paddingBottom", "marginTop", "marginBottom", "borderTopWidth", "borderBottomWidth"]; - - var width = 0; - var height = 0; - - widthProps.forEach(function(prop){ - width += parseFloat(style[prop]) || 0; - }) - - heightProps.forEach(function(prop){ - height += parseFloat(style[prop]) || 0; - }) - - return { - height: height, - width: width - } - -}; - -EPUBJS.core.windowBounds = function() { - - var width = window.innerWidth; - var height = window.innerHeight; - - return { - top: 0, - left: 0, - right: width, - bottom: height, - width: width, - height: height - } - -}; - -//https://stackoverflow.com/questions/13482352/xquery-looking-for-text-with-single-quote/13483496#13483496 -EPUBJS.core.cleanStringForXpath = function(str) { - var parts = str.match(/[^'"]+|['"]/g); - parts = parts.map(function(part){ - if (part === "'") { - return '\"\'\"'; // output "'" - } - - if (part === '"') { - return "\'\"\'"; // output '"' - } - return "\'" + part + "\'"; - }); - return "concat(\'\'," + parts.join(",") + ")"; -}; - -EPUBJS.core.indexOfTextNode = function(textNode){ - var parent = textNode.parentNode; - var children = parent.childNodes; - var sib; - var index = -1; - for (var i = 0; i < children.length; i++) { - sib = children[i]; - if(sib.nodeType === Node.TEXT_NODE){ - index++; - } - if(sib == textNode) break; - } - - return index; -}; -EPUBJS.Queue = function(_context){ - this._q = []; - this.context = _context; - this.tick = EPUBJS.core.requestAnimationFrame; - this.running = false; -}; - -// Add an item to the queue -EPUBJS.Queue.prototype.enqueue = function() { - var deferred, promise; - var queued; - var task = [].shift.call(arguments); - var args = arguments - - // Handle single args without context - // if(args && !Array.isArray(args)) { - // args = [args]; - // } - - if(typeof task === "function"){ - - deferred = new RSVP.defer(); - promise = deferred.promise; - - queued = { - "task" : task, - "args" : args, - //"context" : context, - "deferred" : deferred, - "promise" : promise - }; - - } else { - // Task is a promise - queued = { - "promise" : task - }; - - } - - this._q.push(queued); - - // Wait to start queue flush - setTimeout(this.flush.bind(this), 0); - - return queued.promise; -}; - -// Run one item -EPUBJS.Queue.prototype.dequeue = function(){ - var inwait, task, result; - - if(this._q.length) { - inwait = this._q.shift(); - task = inwait.task; - if(task){ - // console.log(task) - - result = task.apply(this.context, inwait.args); - - if(result && typeof result["then"] === "function") { - // Task is a function that returns a promise - return result.then(function(){ - inwait.deferred.resolve.apply(this.context, arguments); - }.bind(this)); - } else { - // Task is resolves immediately - inwait.deferred.resolve.apply(this.context, result); - return inwait.promise; - } - - - - } else if(inwait.promise) { - // Task is a promise - return inwait.promise; - } - - } else { - inwait = new RSVP.defer(); - inwait.deferred.resolve(); - return inwait.promise; - } - -}; - -// Run All Immediately -EPUBJS.Queue.prototype.dump = function(){ - while(this._q.length) { - this.dequeue(); - } -}; - -// Run all sequentially, at convince - -EPUBJS.Queue.prototype.run = function(){ - if(!this.running && this._q.length) { - this.running = true; - this.dequeue().then(function(){ - this.running = false; - }.bind(this)); - } - - this.tick.call(window, this.run.bind(this)); -}; - -// Flush all, as quickly as possible -EPUBJS.Queue.prototype.flush = function(){ - if(this.running){ - return this.running; - } - - if(this._q.length) { - this.running = this.dequeue(). - then(function(){ - this.running = undefined; - return this.flush(); - }.bind(this)); - - return this.running; - } - -}; - -// Clear all items in wait -EPUBJS.Queue.prototype.clear = function(){ - this._q = []; - this.running = false; -}; - -EPUBJS.Queue.prototype.length = function(){ - return this._q.length; -}; - -// Create a new task from a callback -EPUBJS.Task = function(task, args, context){ - - return function(){ - var toApply = arguments || []; - - return new RSVP.Promise(function(resolve, reject) { - var callback = function(value){ - resolve(value); - }; - // Add the callback to the arguments list - toApply.push(callback); - - // Apply all arguments to the functions - task.apply(this, toApply); - - }.bind(this)); - - }; - -}; -EPUBJS.Hook = function(context){ - this.context = context || this; - this.hooks = []; -}; - -//-- Hooks allow for injecting async functions that must all complete in order before finishing -// Functions must return a promise. - -// this.beforeDisplay = new EPUBJS.Hook(); -// this.beforeDisplay.register(function(){}); -// this.beforeDisplay.trigger(args).then(function(){}); - -// Adds a function to be run before a hook completes -EPUBJS.Hook.prototype.register = function(func){ - this.hooks.push(func); -}; - -// Triggers a hook to run all functions -EPUBJS.Hook.prototype.trigger = function(){ - var length = this.hooks.length; - var current = 0; - var executing; - var defer = new RSVP.defer(); - var args = arguments; - - if(length) { - - executing = this.hooks[current].apply(this.context, args); - executing.then(function(){ - current += 1; - if(current < length) { - return this.hooks[current].apply(this.context, args); - } - }.bind(this)); - - } else { - executing = defer.promise; - defer.resolve(); - } - - return executing; -}; -EPUBJS.Parser = function(){}; - -EPUBJS.Parser.prototype.container = function(containerXml){ - //-- - var rootfile, fullpath, folder, encoding; - - if(!containerXml) { - console.error("Container File Not Found"); - return; - } - - rootfile = containerXml.querySelector("rootfile"); - - if(!rootfile) { - console.error("No RootFile Found"); - return; - } - - fullpath = rootfile.getAttribute('full-path'); - folder = EPUBJS.core.uri(fullpath).directory; - encoding = containerXml.xmlEncoding; - - //-- Now that we have the path we can parse the contents - return { - 'packagePath' : fullpath, - 'basePath' : folder, - 'encoding' : encoding - }; -}; - -EPUBJS.Parser.prototype.identifier = function(packageXml){ - var metadataNode; - - if(!packageXml) { - console.error("Package File Not Found"); - return; - } - - metadataNode = packageXml.querySelector("metadata"); - - if(!metadataNode) { - console.error("No Metadata Found"); - return; - } - - return this.getElementText(metadataNode, "identifier"); -}; - -EPUBJS.Parser.prototype.packageContents = function(packageXml){ - var parse = this; - var metadataNode, manifestNode, spineNode; - var manifest, navPath, ncxPath, coverPath; - var spineNodeIndex; - var spine; - var spineIndexByURL; - - if(!packageXml) { - console.error("Package File Not Found"); - return; - } - - metadataNode = packageXml.querySelector("metadata"); - if(!metadataNode) { - console.error("No Metadata Found"); - return; - } - - manifestNode = packageXml.querySelector("manifest"); - if(!manifestNode) { - console.error("No Manifest Found"); - return; - } - - spineNode = packageXml.querySelector("spine"); - if(!spineNode) { - console.error("No Spine Found"); - return; - } - - manifest = parse.manifest(manifestNode); - navPath = parse.findNavPath(manifestNode); - ncxPath = parse.findNcxPath(manifestNode); - coverPath = parse.findCoverPath(manifestNode); - - spineNodeIndex = Array.prototype.indexOf.call(spineNode.parentNode.childNodes, spineNode); - - spine = parse.spine(spineNode, manifest); - - return { - 'metadata' : parse.metadata(metadataNode), - 'spine' : spine, - 'manifest' : manifest, - 'navPath' : navPath, - 'ncxPath' : ncxPath, - 'coverPath': coverPath, - 'spineNodeIndex' : spineNodeIndex - }; -}; - -//-- Find TOC NAV: media-type="application/xhtml+xml" href="toc.ncx" -EPUBJS.Parser.prototype.findNavPath = function(manifestNode){ - var node = manifestNode.querySelector("item[properties^='nav']"); - return node ? node.getAttribute('href') : false; -}; - -//-- Find TOC NCX: media-type="application/x-dtbncx+xml" href="toc.ncx" -EPUBJS.Parser.prototype.findNcxPath = function(manifestNode){ - var node = manifestNode.querySelector("item[media-type='application/x-dtbncx+xml']"); - return node ? node.getAttribute('href') : false; -}; - -//-- Find Cover: -EPUBJS.Parser.prototype.findCoverPath = function(manifestNode){ - var node = manifestNode.querySelector("item[properties='cover-image']"); - return node ? node.getAttribute('href') : false; -}; - -//-- Expanded to match Readium web components -EPUBJS.Parser.prototype.metadata = function(xml){ - var metadata = {}, - p = this; - - metadata.title = p.getElementText(xml, 'title'); - metadata.creator = p.getElementText(xml, 'creator'); - metadata.description = p.getElementText(xml, 'description'); - - metadata.pubdate = p.getElementText(xml, 'date'); - - metadata.publisher = p.getElementText(xml, 'publisher'); - - metadata.identifier = p.getElementText(xml, "identifier"); - metadata.language = p.getElementText(xml, "language"); - metadata.rights = p.getElementText(xml, "rights"); - - metadata.modified_date = p.querySelectorText(xml, "meta[property='dcterms:modified']"); - metadata.layout = p.querySelectorText(xml, "meta[property='rendition:layout']"); - metadata.orientation = p.querySelectorText(xml, "meta[property='rendition:orientation']"); - metadata.spread = p.querySelectorText(xml, "meta[property='rendition:spread']"); - // metadata.page_prog_dir = packageXml.querySelector("spine").getAttribute("page-progression-direction"); - - return metadata; -}; - -EPUBJS.Parser.prototype.getElementText = function(xml, tag){ - var found = xml.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/", tag), - el; - - if(!found || found.length === 0) return ''; - - el = found[0]; - - if(el.childNodes.length){ - return el.childNodes[0].nodeValue; - } - - return ''; - -}; - -EPUBJS.Parser.prototype.querySelectorText = function(xml, q){ - var el = xml.querySelector(q); - - if(el && el.childNodes.length){ - return el.childNodes[0].nodeValue; - } - - return ''; -}; - -EPUBJS.Parser.prototype.manifest = function(manifestXml){ - var manifest = {}; - - //-- Turn items into an array - var selected = manifestXml.querySelectorAll("item"), - items = Array.prototype.slice.call(selected); - - //-- Create an object with the id as key - items.forEach(function(item){ - var id = item.getAttribute('id'), - href = item.getAttribute('href') || '', - type = item.getAttribute('media-type') || '', - properties = item.getAttribute('properties') || ''; - - manifest[id] = { - 'href' : href, - // 'url' : href, - 'type' : type, - 'properties' : properties.length ? properties.split(' ') : [] - }; - - }); - - return manifest; - -}; - -EPUBJS.Parser.prototype.spine = function(spineXml, manifest){ - var spine = []; - - var selected = spineXml.getElementsByTagName("itemref"), - items = Array.prototype.slice.call(selected); - - var epubcfi = new EPUBJS.EpubCFI(); - - //-- Add to array to mantain ordering and cross reference with manifest - items.forEach(function(item, index){ - var idref = item.getAttribute('idref'); - // var cfiBase = epubcfi.generateChapterComponent(spineNodeIndex, index, Id); - var props = item.getAttribute('properties') || ''; - var propArray = props.length ? props.split(' ') : []; - // var manifestProps = manifest[Id].properties; - // var manifestPropArray = manifestProps.length ? manifestProps.split(' ') : []; - - var itemref = { - 'idref' : idref, - 'linear' : item.getAttribute('linear') || '', - 'properties' : propArray, - // 'href' : manifest[Id].href, - // 'url' : manifest[Id].url, - 'index' : index - // 'cfiBase' : cfiBase - }; - spine.push(itemref); - }); - - return spine; -}; - -EPUBJS.Parser.prototype.nav = function(navHtml){ - 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; - - } - - // Implements `> a, > span` - function findAnchorOrSpan(parent){ - var item = null; - - Array.prototype.slice.call(parent.childNodes).forEach(function(node){ - if('a' == node.tagName || 'span' == node.tagName){ - item = node; - } - }); - - return item; - } - - 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; - } - - return getTOC(navEl); -}; - -EPUBJS.Parser.prototype.ncx = function(tocXml){ - var navMap = tocXml.querySelector("navMap"); - if(!navMap) return []; - - 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 - }); - - } - - return list; - } - - return getTOC(navMap); -}; -EPUBJS.EpubCFI = function(cfiStr){ - if(cfiStr) return this.parse(cfiStr); -}; - -EPUBJS.EpubCFI.prototype.generateChapterComponent = function(_spineNodeIndex, _pos, id) { - var pos = parseInt(_pos), - spineNodeIndex = _spineNodeIndex + 1, - cfi = '/'+spineNodeIndex+'/'; - - cfi += (pos + 1) * 2; - - if(id) cfi += "[" + id + "]"; - - //cfi += "!"; - - return cfi; -}; - -EPUBJS.EpubCFI.prototype.generatePathComponent = function(steps) { - var parts = []; - - steps.forEach(function(part){ - var segment = ''; - segment += (part.index + 1) * 2; - - if(part.id) { - segment += "[" + part.id + "]"; - } - - parts.push(segment); - }); - - return parts.join('/'); -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromElement = function(element, chapter) { - var steps = this.pathTo(element); - var path = this.generatePathComponent(steps); - if(!path.length) { - // Start of Chapter - return "epubcfi(" + chapter + "!/4/)"; - } else { - // First Text Node - return "epubcfi(" + chapter + "!" + path + "/1:0)"; - } -}; - -EPUBJS.EpubCFI.prototype.pathTo = function(node) { - var stack = [], - children; - - while(node && node.parentNode !== null && node.parentNode.nodeType != 9) { - children = node.parentNode.children; - - stack.unshift({ - 'id' : node.id, - // 'classList' : node.classList, - 'tagName' : node.tagName, - 'index' : children ? Array.prototype.indexOf.call(children, node) : 0 - }); - - node = node.parentNode; - } - - return stack; -}; - -EPUBJS.EpubCFI.prototype.getChapterComponent = function(cfiStr) { - - var splitStr = cfiStr.split("!"); - - return splitStr[0]; -}; - -EPUBJS.EpubCFI.prototype.getPathComponent = function(cfiStr) { - - var splitStr = cfiStr.split("!"); - var pathComponent = splitStr[1] ? splitStr[1].split(":") : ''; - - return pathComponent[0]; -}; - -EPUBJS.EpubCFI.prototype.getCharecterOffsetComponent = function(cfiStr) { - var splitStr = cfiStr.split(":"); - return splitStr[1] || ''; -}; - - -EPUBJS.EpubCFI.prototype.parse = function(cfiStr) { - var cfi = {}, - chapSegment, - chapterComponent, - pathComponent, - charecterOffsetComponent, - assertion, - chapId, - path, - end, - endInt, - text, - parseStep = function(part){ - var type, index, has_brackets, id; - - type = "element"; - index = parseInt(part) / 2 - 1; - has_brackets = part.match(/\[(.*)\]/); - if(has_brackets && has_brackets[1]){ - id = has_brackets[1]; - } - - return { - "type" : type, - 'index' : index, - 'id' : id || false - }; - }; - - if(typeof cfiStr !== "string") { - return {spinePos: -1}; - } - - cfi.str = cfiStr; - - if(cfiStr.indexOf("epubcfi(") === 0 && cfiStr[cfiStr.length-1] === ")") { - // Remove intial epubcfi( and ending ) - cfiStr = cfiStr.slice(8, cfiStr.length-1); - } - - chapterComponent = this.getChapterComponent(cfiStr); - pathComponent = this.getPathComponent(cfiStr) || ''; - charecterOffsetComponent = this.getCharecterOffsetComponent(cfiStr); - // Make sure this is a valid cfi or return - if(!chapterComponent) { - return {spinePos: -1}; - } - - // Chapter segment is always the second one - chapSegment = chapterComponent.split("/")[2] || ''; - if(!chapSegment) return {spinePos:-1}; - - cfi.spinePos = (parseInt(chapSegment) / 2 - 1 ) || 0; - - chapId = chapSegment.match(/\[(.*)\]/); - - cfi.spineId = chapId ? chapId[1] : false; - - if(pathComponent.indexOf(',') != -1) { - // Handle ranges -- not supported yet - console.warn("CFI Ranges are not supported"); - } - - path = pathComponent.split('/'); - end = path.pop(); - - cfi.steps = []; - - path.forEach(function(part){ - var step; - - if(part) { - step = parseStep(part); - cfi.steps.push(step); - } - }); - - //-- Check if END is a text node or element - endInt = parseInt(end); - if(!isNaN(endInt)) { - - if(endInt % 2 === 0) { // Even = is an element - cfi.steps.push(parseStep(end)); - } else { - cfi.steps.push({ - "type" : "text", - 'index' : (endInt - 1 ) / 2 - }); - } - - } - - assertion = charecterOffsetComponent.match(/\[(.*)\]/); - if(assertion && assertion[1]){ - cfi.characterOffset = parseInt(charecterOffsetComponent.split('[')[0]); - // We arent handling these assertions yet - cfi.textLocationAssertion = assertion[1]; - } else { - cfi.characterOffset = parseInt(charecterOffsetComponent); - } - - return cfi; -}; - -EPUBJS.EpubCFI.prototype.addMarker = function(cfi, _doc, _marker) { - var doc = _doc || document; - var marker = _marker || this.createMarker(doc); - var parent; - var lastStep; - var text; - var split; - - if(typeof cfi === 'string') { - cfi = this.parse(cfi); - } - // Get the terminal step - lastStep = cfi.steps[cfi.steps.length-1]; - - // check spinePos - if(cfi.spinePos === -1) { - // Not a valid CFI - return false; - } - - // Find the CFI elements parent - parent = this.findParent(cfi, doc); - - if(!parent) { - // CFI didn't return an element - // Maybe it isnt in the current chapter? - return false; - } - - if(lastStep && lastStep.type === "text") { - text = parent.childNodes[lastStep.index]; - if(cfi.characterOffset){ - split = text.splitText(cfi.characterOffset); - marker.classList.add("EPUBJS-CFI-SPLIT"); - parent.insertBefore(marker, split); - } else { - parent.insertBefore(marker, text); - } - } else { - parent.insertBefore(marker, parent.firstChild); - } - - return marker; -}; - -EPUBJS.EpubCFI.prototype.createMarker = function(_doc) { - var doc = _doc || document; - var element = doc.createElement('span'); - element.id = "EPUBJS-CFI-MARKER:"+ EPUBJS.core.uuid(); - element.classList.add("EPUBJS-CFI-MARKER"); - - return element; -}; - -EPUBJS.EpubCFI.prototype.removeMarker = function(marker, _doc) { - var doc = _doc || document; - // var id = marker.id; - - // Cleanup textnodes if they were split - if(marker.classList.contains("EPUBJS-CFI-SPLIT")){ - nextSib = marker.nextSibling; - prevSib = marker.previousSibling; - if(nextSib && - prevSib && - nextSib.nodeType === 3 && - prevSib.nodeType === 3){ - - prevSib.textContent += nextSib.textContent; - marker.parentNode.removeChild(nextSib); - } - marker.parentNode.removeChild(marker); - } else if(marker.classList.contains("EPUBJS-CFI-MARKER")) { - // Remove only elements added as markers - marker.parentNode.removeChild(marker); - } - -}; - -EPUBJS.EpubCFI.prototype.findParent = function(cfi, _doc) { - var doc = _doc || document, - element = doc.getElementsByTagName('html')[0], - children = Array.prototype.slice.call(element.children), - num, index, part, sections, - text, textBegin, textEnd; - - if(typeof cfi === 'string') { - cfi = this.parse(cfi); - } - - sections = cfi.steps.slice(0); // Clone steps array - if(!sections.length) { - return doc.getElementsByTagName('body')[0]; - } - - while(sections && sections.length > 0) { - part = sections.shift(); - // Find textNodes Parent - if(part.type === "text") { - text = element.childNodes[part.index]; - element = text.parentNode || element; - // Find element by id if present - } else if(part.id){ - element = doc.getElementById(part.id); - // Find element in parent - }else{ - element = children[part.index]; - } - // Element can't be found - if(typeof element === "undefined") { - console.error("No Element For", part, cfi.str); - return false; - } - // Get current element children and continue through steps - children = Array.prototype.slice.call(element.children); - } - - return element; -}; - -EPUBJS.EpubCFI.prototype.compare = function(cfiOne, cfiTwo) { - if(typeof cfiOne === 'string') { - cfiOne = new EPUBJS.EpubCFI(cfiOne); - } - if(typeof cfiTwo === 'string') { - cfiTwo = new EPUBJS.EpubCFI(cfiTwo); - } - // Compare Spine Positions - if(cfiOne.spinePos > cfiTwo.spinePos) { - return 1; - } - if(cfiOne.spinePos < cfiTwo.spinePos) { - return -1; - } - - - // Compare Each Step in the First item - for (var i = 0; i < cfiOne.steps.length; i++) { - if(!cfiTwo.steps[i]) { - return 1; - } - if(cfiOne.steps[i].index > cfiTwo.steps[i].index) { - return 1; - } - if(cfiOne.steps[i].index < cfiTwo.steps[i].index) { - return -1; - } - // Otherwise continue checking - } - - // All steps in First present in Second - if(cfiOne.steps.length < cfiTwo.steps.length) { - return -1; - } - - // Compare the charecter offset of the text node - if(cfiOne.characterOffset > cfiTwo.characterOffset) { - return 1; - } - if(cfiOne.characterOffset < cfiTwo.characterOffset) { - return -1; - } - - // CFI's are equal - return 0; -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromHref = function(href, book) { - var uri = EPUBJS.core.uri(href); - var path = uri.path; - var fragment = uri.fragment; - var spinePos = book.spineIndexByURL[path]; - var loaded; - var deferred = new RSVP.defer(); - var epubcfi = new EPUBJS.EpubCFI(); - var spineItem; - - if(typeof spinePos !== "undefined"){ - spineItem = book.spine[spinePos]; - loaded = book.loadXml(spineItem.url); - loaded.then(function(doc){ - var element = doc.getElementById(fragment); - var cfi; - cfi = epubcfi.generateCfiFromElement(element, spineItem.cfiBase); - deferred.resolve(cfi); - }); - } - - return deferred.promise; -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromTextNode = function(anchor, offset, base) { - var parent = anchor.parentNode; - var steps = this.pathTo(parent); - var path = this.generatePathComponent(steps); - var index = 1 + (2 * Array.prototype.indexOf.call(parent.childNodes, anchor)); - return "epubcfi(" + base + "!" + path + "/"+index+":"+(offset || 0)+")"; -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromRangeAnchor = function(range, base) { - var anchor = range.anchorNode; - var offset = range.anchorOffset; - return this.generateCfiFromTextNode(anchor, offset, base); -}; - -EPUBJS.EpubCFI.prototype.generateCfiFromRange = function(range, base) { - var start, startElement, startSteps, startPath, startOffset, startIndex; - var end, endElement, endSteps, endPath, endOffset, endIndex; - - start = range.startContainer; - - if(start.nodeType === 3) { // text node - startElement = start.parentNode; - //startIndex = 1 + (2 * Array.prototype.indexOf.call(startElement.childNodes, start)); - startIndex = 1 + (2 * EPUBJS.core.indexOfTextNode(start)); - startSteps = this.pathTo(startElement); - } else if(range.collapsed) { - return this.generateCfiFromElement(start, base); // single element - } else { - startSteps = this.pathTo(start); - } - - startPath = this.generatePathComponent(startSteps); - startOffset = range.startOffset; - - if(!range.collapsed) { - end = range.endContainer; - - if(end.nodeType === 3) { // text node - endElement = end.parentNode; - // endIndex = 1 + (2 * Array.prototype.indexOf.call(endElement.childNodes, end)); - endIndex = 1 + (2 * EPUBJS.core.indexOfTextNode(end)); - - endSteps = this.pathTo(endElement); - } else { - endSteps = this.pathTo(end); - } - - endPath = this.generatePathComponent(endSteps); - endOffset = range.endOffset; - - return "epubcfi(" + base + "!" + startPath + "/" + startIndex + ":" + startOffset + "," + endPath + "/" + endIndex + ":" + endOffset + ")"; - - } else { - return "epubcfi(" + base + "!" + startPath + "/"+ startIndex +":"+ startOffset +")"; - } -}; - -EPUBJS.EpubCFI.prototype.generateXpathFromSteps = function(steps) { - var xpath = [".", "*"]; - - steps.forEach(function(step){ - var position = step.index + 1; - - if(step.id){ - xpath.push("*[position()=" + position + " and @id='" + step.id + "']"); - } else if(step.type === "text") { - xpath.push("text()[" + position + "]"); - } else { - xpath.push("*[" + position + "]"); - } - }); - - return xpath.join("/"); -}; - - -EPUBJS.EpubCFI.prototype.generateRangeFromCfi = function(cfi, _doc) { - var doc = _doc || document; - var range = doc.createRange(); - var lastStep; - var xpath; - var startContainer; - var textLength; - - if(typeof cfi === 'string') { - cfi = this.parse(cfi); - } - - // check spinePos - if(cfi.spinePos === -1) { - // Not a valid CFI - return false; - } - - xpath = this.generateXpathFromSteps(cfi.steps); - - // Get the terminal step - lastStep = cfi.steps[cfi.steps.length-1]; - startContainer = doc.evaluate(xpath, doc, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue; - - if(!startContainer) { - return null; - } - - if(startContainer && cfi.characterOffset >= 0) { - textLength = startContainer.length; - - if(cfi.characterOffset < textLength) { - range.setStart(startContainer, cfi.characterOffset); - range.setEnd(startContainer, textLength ); - } else { - console.debug("offset greater than length:", cfi.characterOffset, textLength); - range.setStart(startContainer, textLength - 1 ); - range.setEnd(startContainer, textLength ); - } - } else if(startContainer) { - range.selectNode(startContainer); - } - // doc.defaultView.getSelection().addRange(range); - return range; -}; - -EPUBJS.EpubCFI.prototype.isCfiString = function(target) { - if(typeof target === "string" && - target.indexOf("epubcfi(") === 0) { - return true; - } - - return false; -} -EPUBJS.Navigation = function(_package, _request){ - var navigation = this; - var parse = new EPUBJS.Parser(); - var request = _request || EPUBJS.core.request; - - this.package = _package; - this.toc = []; - this.tocByHref = {}; - this.tocById = {}; - - if(_package.navPath) { - this.navUrl = _package.baseUrl + _package.navPath; - this.nav = {}; - - this.nav.load = function(_request){ - var loading = new RSVP.defer(); - var loaded = loading.promise; - - request(navigation.navUrl, 'xml').then(function(xml){ - navigation.toc = parse.nav(xml); - navigation.loaded(navigation.toc); - loading.resolve(navigation.toc); - }); - - return loaded; - }; - - } - - if(_package.ncxPath) { - this.ncxUrl = _package.baseUrl + _package.ncxPath; - this.ncx = {}; - - this.ncx.load = function(_request){ - var loading = new RSVP.defer(); - var loaded = loading.promise; - - request(navigation.ncxUrl, 'xml').then(function(xml){ - navigation.toc = parse.ncx(xml); - navigation.loaded(navigation.toc); - loading.resolve(navigation.toc); - }); - - return loaded; - }; - - } -}; - -// Load the navigation -EPUBJS.Navigation.prototype.load = function(_request) { - var request = _request || EPUBJS.core.request; - var loading, loaded; - - if(this.nav) { - loading = this.nav.load(); - } else if(this.ncx) { - loading = this.ncx.load(); - } else { - loaded = new RSVP.defer(); - loaded.resolve([]); - loading = loaded.promise; - } - - return loading; - -}; - -EPUBJS.Navigation.prototype.loaded = function(toc) { - var item; - - for (var i = 0; i < toc.length; i++) { - item = toc[i]; - this.tocByHref[item.href] = i; - this.tocById[item.id] = i; - } - -}; - -// Get an item from the navigation -EPUBJS.Navigation.prototype.get = function(target) { - var index; - - if(!target) { - return this.toc; - } - - if(target.indexOf("#") === 0) { - index = this.tocById[target.substring(1)]; - } else if(target in this.tocByHref){ - index = this.tocByHref[target]; - } - - return this.toc[index]; -}; -EPUBJS.Section = function(item){ - this.idref = item.idref; - this.linear = item.linear; - this.properties = item.properties; - this.index = item.index; - this.href = item.href; - this.url = item.url; - this.next = item.next; - this.prev = item.prev; - - this.epubcfi = new EPUBJS.EpubCFI(); - this.cfiBase = item.cfiBase; - - this.hooks = {}; - this.hooks.replacements = new EPUBJS.Hook(this); - - // Register replacements - this.hooks.replacements.register(this.replacements); -}; - - -EPUBJS.Section.prototype.load = function(_request){ - var request = _request || this.request || EPUBJS.core.request; - var loading = new RSVP.defer(); - var loaded = loading.promise; - - if(this.contents) { - loading.resolve(this.contents); - } else { - request(this.url, 'xml') - .then(function(xml){ - var base; - var directory = EPUBJS.core.folder(this.url); - - this.document = xml; - this.contents = xml.documentElement; - - return this.hooks.replacements.trigger(this.document); - }.bind(this)) - .then(function(){ - loading.resolve(this.contents); - }.bind(this)) - .catch(function(error){ - loading.reject(error); - }); - } - - return loaded; -}; - -EPUBJS.Section.prototype.replacements = function(_document){ - var task = new RSVP.defer(); - var base = _document.createElement("base"); // TODO: check if exists - var head; - - base.setAttribute("href", this.url); - - if(_document) { - head = _document.querySelector("head"); - } - if(head) { - head.insertBefore(base, head.firstChild); - task.resolve(); - } else { - task.reject(new Error("No head to insert into")); - } - - - return task.promise; -}; - -EPUBJS.Section.prototype.beforeSectionLoad = function(){ - // Stub for a hook - replace me for now -}; - -EPUBJS.Section.prototype.render = function(_request){ - var rendering = new RSVP.defer(); - var rendered = rendering.promise; - - this.load(_request).then(function(contents){ - var serializer = new XMLSerializer(); - var output = serializer.serializeToString(contents); - rendering.resolve(output); - }) - .catch(function(error){ - rendering.reject(error); - }); - - return rendered; -}; - -EPUBJS.Section.prototype.find = function(_query){ - -}; - -/** -* Reconciles the current chapters layout properies with -* the global layout properities. -* Takes: global layout settings object, chapter properties string -* Returns: Object with layout properties -*/ -EPUBJS.Section.prototype.reconcileLayoutSettings = function(global){ - //-- Get the global defaults - var settings = { - layout : global.layout, - spread : global.spread, - orientation : global.orientation - }; - - //-- Get the chapter's display type - this.properties.forEach(function(prop){ - var rendition = prop.replace("rendition:", ''); - var split = rendition.indexOf("-"); - var property, value; - - if(split != -1){ - property = rendition.slice(0, split); - value = rendition.slice(split+1); - - settings[property] = value; - } - }); - return settings; -}; - -EPUBJS.Section.prototype.cfiFromRange = function(_range) { - return this.epubcfi.generateCfiFromRange(_range, this.cfiBase); -}; -EPUBJS.Spine = function(_request){ - this.request = _request; - this.spineItems = []; - this.spineByHref = {}; - this.spineById = {}; - -}; - -EPUBJS.Spine.prototype.load = function(_package) { - - this.items = _package.spine; - this.manifest = _package.manifest; - this.spineNodeIndex = _package.spineNodeIndex; - this.baseUrl = _package.baseUrl || ''; - this.length = this.items.length; - this.epubcfi = new EPUBJS.EpubCFI(); - - this.items.forEach(function(item, index){ - var href, url; - var manifestItem = this.manifest[item.idref]; - var spineItem; - item.cfiBase = this.epubcfi.generateChapterComponent(this.spineNodeIndex, item.index, item.idref); - - if(manifestItem) { - item.href = manifestItem.href; - item.url = this.baseUrl + item.href; - - - if(manifestItem.properties.length){ - item.properties.push.apply(item.properties, manifestItem.properties) - } - } - - // if(index > 0) { - item.prev = function(){ return this.get(index-1); }.bind(this); - // } - - // if(index+1 < this.items.length) { - item.next = function(){ return this.get(index+1); }.bind(this); - // } - - spineItem = new EPUBJS.Section(item); - this.append(spineItem); - - - }.bind(this)); - -}; - -// book.spine.get(); -// book.spine.get(1); -// book.spine.get("chap1.html"); -// book.spine.get("#id1234"); -EPUBJS.Spine.prototype.get = function(target) { - var index = 0; - - if(this.epubcfi.isCfiString(target)) { - cfi = this.epubcfi.parse(target); - index = cfi.spinePos; - } if(target && (typeof target === "number" || isNaN(target) === false)){ - index = target; - } else if(target && target.indexOf("#") === 0) { - index = this.spineById[target.substring(1)]; - } else if(target) { - // Remove fragments - target = target.split("#")[0]; - index = this.spineByHref[target]; - } - - return this.spineItems[index] || null; -}; - -EPUBJS.Spine.prototype.append = function(section) { - var index = this.spineItems.length; - section.index = index; - - this.spineItems.push(section); - - this.spineByHref[section.href] = index; - this.spineById[section.idref] = index; - - return index; -}; - -EPUBJS.Spine.prototype.prepend = function(section) { - var index = this.spineItems.unshift(section); - this.spineByHref[section.href] = 0; - this.spineById[section.idref] = 0; - - // Re-index - this.spineItems.forEach(function(item, index){ - item.index = index; - }); - - return 0; -}; - -EPUBJS.Spine.prototype.insert = function(section, index) { - -}; - -EPUBJS.Spine.prototype.remove = function(section) { - var index = this.spineItems.indexOf(section); - - if(index > -1) { - delete this.spineByHref[section.href]; - delete this.spineById[section.idref]; - - return this.spineItems.splice(index, 1); - } -}; -EPUBJS.replace = {}; -EPUBJS.replace.links = function(view, renderer) { - var task = new RSVP.defer(); - var links = view.document.querySelectorAll("a[href]"); - var replaceLinks = function(link){ - var href = link.getAttribute("href"); - var uri = new EPUBJS.core.uri(href); - - - if(uri.protocol){ - - link.setAttribute("target", "_blank"); - - }else{ - - // relative = EPUBJS.core.resolveUrl(directory, href); - // if(uri.fragment && !base) { - // link.onclick = function(){ - // renderer.fragment(href); - // return false; - // }; - // } else { - - //} - - if(href.indexOf("#") === 0) { - // do nothing with fragment yet - } else { - link.onclick = function(){ - renderer.display(href); - return false; - }; - } - - } - }; - - for (var i = 0; i < links.length; i++) { - replaceLinks(links[i]); - } - - task.resolve(); - return task.promise; -}; -EPUBJS.Book = function(_url){ - // Promises - this.opening = new RSVP.defer(); - this.opened = this.opening.promise; - this.isOpen = false; - - this.url = undefined; - - this.spine = new EPUBJS.Spine(this.request); - - this.loading = { - manifest: new RSVP.defer(), - spine: new RSVP.defer(), - metadata: new RSVP.defer(), - cover: new RSVP.defer(), - navigation: new RSVP.defer(), - pageList: new RSVP.defer() - }; - - this.loaded = { - manifest: this.loading.manifest.promise, - spine: this.loading.spine.promise, - metadata: this.loading.metadata.promise, - cover: this.loading.cover.promise, - navigation: this.loading.navigation.promise, - pageList: this.loading.pageList.promise - }; - - this.ready = RSVP.hash(this.loaded); - - // Queue for methods used before opening - this.isRendered = false; - this._q = EPUBJS.core.queue(this); - - this.request = this.requestMethod.bind(this); - - if(_url) { - this.open(_url); - } -}; - -EPUBJS.Book.prototype.open = function(_url){ - var uri; - var parse = new EPUBJS.Parser(); - var epubPackage; - var book = this; - var containerPath = "META-INF/container.xml"; - var location; - - if(!_url) { - this.opening.resolve(this); - return this.opened; - } - - // Reuse parsed url or create a new uri object - if(typeof(_url) === "object") { - uri = _url; - } else { - uri = EPUBJS.core.uri(_url); - } - - // Find path to the Container - if(uri.extension === "opf") { - // Direct link to package, no container - this.packageUrl = uri.href; - this.containerUrl = ''; - - if(uri.origin) { - this.url = uri.base; - } else if(window){ - location = EPUBJS.core.uri(window.location.href); - this.url = EPUBJS.core.resolveUrl(location.base, uri.directory); - } else { - this.url = uri.directory; - } - - epubPackage = this.request(this.packageUrl); - - } else if(uri.extension === "epub" || uri.extension === "zip" ) { - // Book is archived - this.archived = true; - this.url = ''; - } - - // Find the path to the Package from the container - else if (!uri.extension) { - - this.containerUrl = _url + containerPath; - - epubPackage = this.request(this.containerUrl). - then(function(containerXml){ - return parse.container(containerXml); // Container has path to content - }). - then(function(paths){ - var packageUri = EPUBJS.core.uri(paths.packagePath); - book.packageUrl = _url + paths.packagePath; - book.encoding = paths.encoding; - - // Set Url relative to the content - if(packageUri.origin) { - book.url = packageUri.base; - } else if(window){ - location = EPUBJS.core.uri(window.location.href); - book.url = EPUBJS.core.resolveUrl(location.base, _url + packageUri.directory); - } else { - book.url = packageUri.directory; - } - - return book.request(book.packageUrl); - }).catch(function(error) { - // handle errors in either of the two requests - console.error("Could not load book at: " + (this.packageUrl || this.containerPath)); - book.trigger("book:loadFailed", (this.packageUrl || this.containerPath)); - book.opening.reject(error); - }); - } - - - epubPackage.then(function(packageXml) { - // Get package information from epub opf - book.unpack(packageXml); - - // Resolve promises - book.loading.manifest.resolve(book.package.manifest); - book.loading.metadata.resolve(book.package.metadata); - book.loading.spine.resolve(book.spine); - book.loading.cover.resolve(book.cover); - - this.isOpen = true; - - // Clear queue of any waiting book request - - // Resolve book opened promise - book.opening.resolve(book); - - }).catch(function(error) { - // handle errors in parsing the book - console.error(error.message, error.stack); - book.opening.reject(error); - }); - - return this.opened; -}; - -EPUBJS.Book.prototype.unpack = function(packageXml){ - var book = this, - parse = new EPUBJS.Parser(); - - book.package = parse.packageContents(packageXml); // Extract info from contents - book.package.baseUrl = book.url; // Provides a url base for resolving paths - - this.spine.load(book.package); - - book.navigation = new EPUBJS.Navigation(book.package, this.request); - book.navigation.load().then(function(toc){ - book.toc = toc; - book.loading.navigation.resolve(book.toc); - }); - - // //-- Set Global Layout setting based on metadata - // MOVE TO RENDER - // book.globalLayoutProperties = book.parseLayoutProperties(book.package.metadata); - - book.cover = book.url + book.package.coverPath; -}; - -// Alias for book.spine.get -EPUBJS.Book.prototype.section = function(target) { - return this.spine.get(target); -}; - -// Sugar to render a book -EPUBJS.Book.prototype.renderTo = function(element, options) { - var renderer = (options && options.method) ? - options.method.charAt(0).toUpperCase() + options.method.substr(1) : - "Rendition"; - - this.rendition = new EPUBJS[renderer](this, options); - this.rendition.attachTo(element); - return this.rendition; -}; - -EPUBJS.Book.prototype.requestMethod = function(_url) { - // Switch request methods - if(this.archived) { - // TODO: handle archived - } else { - return EPUBJS.core.request(_url, 'xml', this.requestCredentials, this.requestHeaders); - } - -}; - -EPUBJS.Book.prototype.setRequestCredentials = function(_credentials) { - this.requestCredentials = _credentials; -}; - -EPUBJS.Book.prototype.setRequestHeaders = function(_headers) { - this.requestHeaders = _headers; -}; -//-- Enable binding events to book -RSVP.EventTarget.mixin(EPUBJS.Book.prototype); - -//-- Handle RSVP Errors -RSVP.on('error', function(event) { - //console.error(event, event.detail); -}); - -RSVP.configure('instrument', true); //-- true | will logging out all RSVP rejections -// RSVP.on('created', listener); -// RSVP.on('chained', listener); -// RSVP.on('fulfilled', listener); -RSVP.on('rejected', function(event){ - console.error(event.detail.message, event.detail.stack); -}); -EPUBJS.View = function(section, options) { - this.settings = options || {}; - - this.id = "epubjs-view:" + EPUBJS.core.uuid(); - this.section = section; - this.index = section.index; - - this.element = document.createElement('div'); - this.element.classList.add("epub-view"); - - - // this.element.style.minHeight = "100px"; - this.element.style.height = "0px"; - this.element.style.width = "0px"; - this.element.style.overflow = "hidden"; - - this.displayed = false; - this.rendered = false; - - //this.width = 0; - //this.height = 0; - - // Blank Cfi for Parsing - this.epubcfi = new EPUBJS.EpubCFI(); - - if(this.settings.axis && this.settings.axis == "horizontal"){ - this.element.style.display = "inline-block"; - } else { - this.element.style.display = "block"; - } - -}; - -EPUBJS.View.prototype.create = function() { - - if(this.iframe) { - return this.iframe; - } - - this.iframe = document.createElement('iframe'); - this.iframe.id = this.id; - this.iframe.scrolling = "no"; - this.iframe.seamless = "seamless"; - // Back up if seamless isn't supported - this.iframe.style.border = "none"; - - this.resizing = true; - - // this.iframe.style.display = "none"; - this.element.style.visibility = "hidden"; - this.iframe.style.visibility = "hidden"; - - this.element.appendChild(this.iframe); - this.rendered = true; - - this.elementBounds = EPUBJS.core.bounds(this.element); - - // if(width || height){ - // this.resize(width, height); - // } else if(this.width && this.height){ - // this.resize(this.width, this.height); - // } else { - // this.iframeBounds = EPUBJS.core.bounds(this.iframe); - // } - - // Firefox has trouble with baseURI and srcdoc - // Disabled for now - /* - if(!!("srcdoc" in this.iframe)) { - this.supportsSrcdoc = true; - } else { - this.supportsSrcdoc = false; - } - */ - this.supportsSrcdoc = false; - - return this.iframe; -}; - - -EPUBJS.View.prototype.lock = function(what, width, height) { - - var elBorders = EPUBJS.core.borders(this.element); - var iframeBorders; - - if(this.iframe) { - iframeBorders = EPUBJS.core.borders(this.iframe); - } else { - iframeBorders = {width: 0, height: 0}; - } - - if(what == "width" && EPUBJS.core.isNumber(width)){ - this.lockedWidth = width - elBorders.width - iframeBorders.width; - this.resize(this.lockedWidth, width); // width keeps ratio correct - } - - if(what == "height" && EPUBJS.core.isNumber(height)){ - this.lockedHeight = height - elBorders.height - iframeBorders.height; - this.resize(width, this.lockedHeight); - } - - if(what === "both" && - EPUBJS.core.isNumber(width) && - EPUBJS.core.isNumber(height)){ - - this.lockedWidth = width - elBorders.width - iframeBorders.width; - this.lockedHeight = height - elBorders.height - iframeBorders.height; - - this.resize(this.lockedWidth, this.lockedHeight); - } - - if(this.displayed && this.iframe) { - - this.layout(); - this.expand(); - - } - - - -}; - -EPUBJS.View.prototype.resize = function(width, height) { - - if(!this.iframe) return; - - if(EPUBJS.core.isNumber(width)){ - this.iframe.style.width = width + "px"; - } - - if(EPUBJS.core.isNumber(height)){ - this.iframe.style.height = height + "px"; - } - - this.iframeBounds = EPUBJS.core.bounds(this.iframe); - - this.reframe(this.iframeBounds.width, this.iframeBounds.height); - -}; - -EPUBJS.View.prototype.reframe = function(width, height) { - //var prevBounds; - - if(!this.displayed) return; - - if(EPUBJS.core.isNumber(width)){ - this.element.style.width = width + "px"; - } - - if(EPUBJS.core.isNumber(height)){ - this.element.style.height = height + "px"; - } - - this.prevBounds = this.elementBounds; - - this.elementBounds = EPUBJS.core.bounds(this.element); - - this.trigger("resized", { - width: this.elementBounds.width, - height: this.elementBounds.height, - widthDelta: this.elementBounds.width - this.prevBounds.width, - heightDelta: this.elementBounds.height - this.prevBounds.height, - }); - -}; - -EPUBJS.View.prototype.resized = function(e) { - /* - if (!this.resizing) { - if(this.iframe) { - // this.expand(); - } - } else { - this.resizing = false; - }*/ - -}; - -EPUBJS.View.prototype.render = function(_request) { - - // if(this.rendering){ - // return this.displayed; - // } - - this.rendering = true; - // this.displayingDefer = new RSVP.defer(); - // this.displayedPromise = this.displaying.promise; - - return this.section.render(_request) - .then(function(contents){ - return this.load(contents); - }.bind(this)); -}; - -EPUBJS.View.prototype.load = function(contents) { - var loading = new RSVP.defer(); - var loaded = loading.promise; - - this.document = this.iframe.contentDocument; - - if(!this.document) { - loading.reject(new Error("No Document Available")); - return loaded; - } - - this.iframe.addEventListener("load", function(event) { - - this.window = this.iframe.contentWindow; - this.document = this.iframe.contentDocument; - this.rendering = false; - loading.resolve(this); - - }.bind(this)); - - if(this.supportsSrcdoc){ - this.iframe.srcdoc = contents; - } else { - this.document.open(); - this.document.write(contents); - this.document.close(); - } - - return loaded; -}; - - -EPUBJS.View.prototype.layout = function(layoutFunc) { - - this.iframe.style.display = "inline-block"; - - - // Reset Body Styles - this.document.body.style.margin = "0"; - //this.document.body.style.display = "inline-block"; - //this.document.documentElement.style.width = "auto"; - - if(layoutFunc){ - layoutFunc(this); - } - - this.onLayout(this); - -}; - -EPUBJS.View.prototype.onLayout = function(view) { - // stub -}; - -EPUBJS.View.prototype.listeners = function() { - /* - setTimeout(function(){ - this.window.addEventListener("resize", this.resized.bind(this), false); - }.bind(this), 10); // Wait to listen for resize events - */ - - // Wait for fonts to load to finish - // http://dev.w3.org/csswg/css-font-loading/ - // Not implemented fully - /* - if(this.document.fonts && this.document.fonts.status === "loading") { - console.log("fonts unloaded"); - this.document.fonts.onloadingdone = function(){ - console.log("loaded fonts"); - this.expand(); - }.bind(this); - } - */ - if(this.section.properties.indexOf("scripted") > -1){ - this.observer = this.observe(this.document.body); - } - - this.imageLoadListeners(); - - this.mediaQueryListeners(); - -}; - -EPUBJS.View.prototype.expand = function() { - var width = this.lockedWidth; - var height = this.lockedHeight; - - // Resize to the locked width; - //this.resize(width, height); - - // Expand Vertically - if(width && !height) { - height = this.document.documentElement.scrollHeight; - this.resize(null, height); - } - - // Expand Horizontally - if(height && !width) { - width = this.document.body.scrollWidth; - this.resize(width, null); - }; - - //this.reframe(width, height); - -}; - -//https://github.com/tylergaw/media-query-events/blob/master/js/mq-events.js -EPUBJS.View.prototype.mediaQueryListeners = function() { - var sheets = this.document.styleSheets; - var mediaChangeHandler = function(m){ - if(m.matches) { - this.expand(); - } - }.bind(this); - - for (var i = 0; i < sheets.length; i += 1) { - var rules = sheets[i].cssRules; - - for (var j = 0; j < rules.length; j += 1) { - //if (rules[j].constructor === CSSMediaRule) { - if(rules[j].media){ - var mql = this.window.matchMedia(rules[j].media.mediaText); - mql.addListener(mediaChangeHandler); - //mql.onchange = mediaChangeHandler; - } - } - } -}; - -EPUBJS.View.prototype.observe = function(target) { - var renderer = this; - - // create an observer instance - var observer = new MutationObserver(function(mutations) { - renderer.expand(); - // mutations.forEach(function(mutation) { - // console.log(mutation); - // }); - }); - - // configuration of the observer: - var config = { attributes: true, childList: true, characterData: true, subtree: true }; - - // pass in the target node, as well as the observer options - observer.observe(target, config); - - return observer; -}; - -// EPUBJS.View.prototype.appendTo = function(element) { -// this.element = element; -// this.element.appendChild(this.iframe); -// }; -// -// EPUBJS.View.prototype.prependTo = function(element) { -// this.element = element; -// element.insertBefore(this.iframe, element.firstChild); -// }; - -EPUBJS.View.prototype.imageLoadListeners = function(target) { - var images = this.document.body.querySelectorAll("img"); - var img; - for (var i = 0; i < images.length; i++) { - img = images[i]; - - if (typeof img.naturalWidth !== "undefined" && - img.naturalWidth === 0) { - img.onload = this.expand.bind(this); - } - } -}; - -EPUBJS.View.prototype.display = function() { - var displayed = new RSVP.defer(); - - this.displayed = true; - - this.layout(); - - this.listeners(); - - this.expand(); - - this.trigger("displayed", this); - this.onDisplayed(this); - - displayed.resolve(this); - - return displayed.promise; -}; - -EPUBJS.View.prototype.show = function() { - - this.element.style.visibility = "visible"; - - if(this.iframe){ - this.iframe.style.visibility = "visible"; - } - - this.trigger("shown", this); -}; - -EPUBJS.View.prototype.hide = function() { - // this.iframe.style.display = "none"; - this.element.style.visibility = "hidden"; - this.iframe.style.visibility = "hidden"; - - this.stopExpanding = true; - this.trigger("hidden", this); -}; - -EPUBJS.View.prototype.position = function() { - return this.element.getBoundingClientRect(); -}; - -EPUBJS.View.prototype.onDisplayed = function(view) { - // Stub, override with a custom functions -}; - -EPUBJS.View.prototype.bounds = function() { - if(!this.elementBounds) { - this.elementBounds = EPUBJS.core.bounds(this.element); - } - return this.elementBounds; -}; - -EPUBJS.View.prototype.destroy = function() { - // Stop observing - if(this.observer) { - this.observer.disconnect(); - } - - if(this.displayed){ - this.stopExpanding = true; - this.element.removeChild(this.iframe); - this.displayed = false; - this.iframe = null; - } - - // this.element.style.height = "0px"; - // this.element.style.width = "0px"; -}; - -EPUBJS.View.prototype.root = function() { - if(!this.document) return null; - return this.document.documentElement; -}; - -EPUBJS.View.prototype.locationOf = function(target) { - - if(!this.document) return; - - if(this.epubcfi.isCfiString(target)) { - cfi = this.epubcfi.parse(target); - - if(typeof document.evaluate === 'undefined') { - marker = this.epubcfi.addMarker(cfi, this.document); - if(marker) { - // Must Clean up Marker before going to page - this.epubcfi.removeMarker(marker, this.document); - - return marker.getBoundingClientRect(); - } - } else { - range = this.epubcfi.generateRangeFromCfi(cfi, this.document); - if(range) { - return range.getBoundingClientRect(); - } - } - } else if(typeof target === "string" && - target.indexOf("#") > -1) { - - id = target.substring(target.indexOf("#")); - el = this.document.getElementById(id); - - if(el) { - return el.getBoundingClientRect(); - } - } - - return {"left": 0, "top": 0}; -}; - - -RSVP.EventTarget.mixin(EPUBJS.View.prototype); -EPUBJS.Layout = EPUBJS.Layout || {}; - -EPUBJS.Layout.Reflowable = function(){ - -}; - -EPUBJS.Layout.Reflowable.prototype.calculate = function(_width, _height, _gap, _devisor){ - - var divisor = _devisor || 1; - - //-- Check the width and create even width columns - var fullWidth = Math.floor(_width); - var width = (fullWidth % 2 === 0) ? fullWidth : fullWidth - 1; - - var section = Math.floor(width / 8); - var gap = (_gap >= 0) ? _gap : ((section % 2 === 0) ? section : section - 1); - - var colWidth; - var spreadWidth; - var delta; - - //-- Double Page - if(divisor > 1) { - colWidth = Math.floor((width - gap) / divisor); - } else { - colWidth = width; - } - - spreadWidth = colWidth * divisor; - - delta = (colWidth + gap) * divisor; - - - - this.columnAxis = EPUBJS.core.prefixed('columnAxis'); - this.columnGap = EPUBJS.core.prefixed('columnGap'); - this.columnWidth = EPUBJS.core.prefixed('columnWidth'); - this.columnFill = EPUBJS.core.prefixed('columnFill'); - - this.width = width; - this.height = _height; - this.spread = spreadWidth; - this.delta = delta; - - this.column = colWidth; - this.gap = gap; - this.divisor = divisor; - -}; - -EPUBJS.Layout.Reflowable.prototype.format = function(view){ - - var $doc = view.document.documentElement; - var $body = view.document.body;//view.document.querySelector("body"); - - $doc.style.overflow = "hidden"; - - // Must be set to the new calculated width or the columns will be off - $body.style.width = this.width + "px"; - - //-- Adjust height - $body.style.height = this.height + "px"; - - //-- Add columns - $body.style[this.columnAxis] = "horizontal"; - $body.style[this.columnFill] = "auto"; - $body.style[this.columnGap] = this.gap+"px"; - $body.style[this.columnWidth] = this.column+"px"; - - // Add extra padding for the gap between this and the next view - view.iframe.style.marginRight = this.gap+"px"; -}; - -EPUBJS.Layout.Reflowable.prototype.count = function(view) { - var totalWidth = view.root().scrollWidth; - var spreads = Math.ceil(totalWidth / this.spread); - - return { - spreads : spreads, - pages : spreads * this.divisor - }; -}; - -EPUBJS.Layout.Fixed = function(_width, _height){ - -}; - -EPUBJS.Layout.Fixed.prototype.calculate = function(_width, _height){ - -}; - -EPUBJS.Layout.Fixed.prototype.format = function(view){ - var width, height; - - var $doc = view.document.documentElement; - var $viewport = documentElement.querySelector("[name=viewport"); - - /** - * check for the viewport size - * - */ - if($viewport && $viewport.hasAttribute("content")) { - content = $viewport.getAttribute("content"); - contents = content.split(','); - if(contents[0]){ - width = contents[0].replace("width=", ''); - } - if(contents[1]){ - height = contents[1].replace("height=", ''); - } - } - - //-- Adjust width and height - // $doc.style.width = width + "px" || "auto"; - // $doc.style.height = height + "px" || "auto"; - view.resize(width, height); - - //-- Scroll - $doc.style.overflow = "auto"; - -}; - -EPUBJS.Layout.Fixed.prototype.count = function(){ - return { - spreads : 1, - pages : 1 - }; -}; - -EPUBJS.Layout.Scroll = function(){ - -}; - -EPUBJS.Layout.Scroll.prototype.calculate = function(_width, _height){ - this.spread = _width; - this.column = _width; - this.gap = 0; -}; - -EPUBJS.Layout.Scroll.prototype.format = function(view){ - - var $doc = view.document.documentElement; - - $doc.style.width = "auto"; - $doc.style.height = "auto"; - -}; - -EPUBJS.Layout.Scroll.prototype.count = function(){ - return { - spreads : 1, - pages : 1 - }; -}; - -EPUBJS.Rendition = function(book, options) { - - this.settings = EPUBJS.core.extend(this.settings || {}, { - infinite: true, - hidden: false, - width: false, - height: null, - layoutOveride : null, // Default: { spread: 'reflowable', layout: 'auto', orientation: 'auto'}, - axis: "vertical" - }); - - EPUBJS.core.extend(this.settings, options); - - this.viewSettings = {}; - - this.book = book; - - this.views = []; - - //-- Adds Hook methods to the Rendition prototype - this.hooks = {}; - this.hooks.display = new EPUBJS.Hook(this); - this.hooks.layout = new EPUBJS.Hook(this); - this.hooks.replacements = new EPUBJS.Hook(this); - - this.hooks.replacements.register(EPUBJS.replace.links.bind(this)); - // this.hooks.display.register(this.afterDisplay.bind(this)); - - this.epubcfi = new EPUBJS.EpubCFI(); - - this.q = new EPUBJS.Queue(this); - - this.q.enqueue(this.book.opened); - - this.q.enqueue(this.parseLayoutProperties); - -}; - -/** -* Creates an element to render to. -* Resizes to passed width and height or to the elements size -*/ -EPUBJS.Rendition.prototype.initialize = function(_options){ - var options = _options || {}; - var height = options.height;// !== false ? options.height : "100%"; - var width = options.width;// !== false ? options.width : "100%"; - var hidden = options.hidden || false; - var container; - var wrapper; - - if(options.height && EPUBJS.core.isNumber(options.height)) { - height = options.height + "px"; - } - - if(options.width && EPUBJS.core.isNumber(options.width)) { - width = options.width + "px"; - } - - // Create new container element - container = document.createElement("div"); - - container.id = "epubjs-container:" + EPUBJS.core.uuid(); - container.classList.add("epub-container"); - - // Style Element - container.style.fontSize = "0"; - container.style.wordSpacing = "0"; - container.style.lineHeight = "0"; - container.style.verticalAlign = "top"; - - if(this.settings.axis === "horizontal") { - container.style.whiteSpace = "nowrap"; - } - - if(width){ - container.style.width = width; - } - - if(height){ - container.style.height = height; - } - - container.style.overflow = this.settings.overflow; - - return container; -}; - -EPUBJS.Rendition.wrap = function(container) { - var wrapper = document.createElement("div"); - - wrapper.style.visibility = "hidden"; - wrapper.style.overflow = "hidden"; - wrapper.style.width = "0"; - wrapper.style.height = "0"; - - wrapper.appendChild(container); - return wrapper; -}; - -// Call to attach the container to an element in the dom -// Container must be attached before rendering can begin -EPUBJS.Rendition.prototype.attachTo = function(_element){ - var bounds; - - this.container = this.initialize({ - "width" : this.settings.width, - "height" : this.settings.height - }); - - if(EPUBJS.core.isElement(_element)) { - this.element = _element; - } else if (typeof _element === "string") { - this.element = document.getElementById(_element); - } - - if(!this.element){ - console.error("Not an Element"); - return; - } - - if(this.settings.hidden) { - this.wrapper = this.wrap(this.container); - this.element.appendChild(this.wrapper); - } else { - this.element.appendChild(this.container); - } - - // Attach Listeners - this.attachListeners(); - - // Calculate Stage Size - this.stageSize(); - - // Add Layout method - this.layoutMethod(); - - // Trigger Attached - this.trigger("attached"); - - // Start processing queue - // this.q.run(); - -}; - -EPUBJS.Rendition.prototype.attachListeners = function(){ - - // Listen to window for resize event if width or height is set to 100% - if(!EPUBJS.core.isNumber(this.settings.width) || - !EPUBJS.core.isNumber(this.settings.height) ) { - window.addEventListener("resize", this.onResized.bind(this), false); - } - -}; - -EPUBJS.Rendition.prototype.bounds = function() { - return this.container.getBoundingClientRect(); -}; - -EPUBJS.Rendition.prototype.display = function(target){ - - return this.q.enqueue(this._display, target); - -}; - -EPUBJS.Rendition.prototype._display = function(target){ - - var displaying = new RSVP.defer(); - var displayed = displaying.promise; - - var section; - var view; - var cfi, spinePos; - - if(this.epubcfi.isCfiString(target)) { - cfi = this.epubcfi.parse(target); - spinePos = cfi.spinePos; - section = this.book.spine.get(spinePos); - } else { - section = this.book.spine.get(target); - } - - this.displaying = true; - - // Hide current views - this.hide(); - - if(section){ - view = this.createView(section); - - // Show view - this.q.enqueue(this.append, view); - - // Move to correct place within the section, if needed - // this.moveTo(what) - - // Show views - this.show(); - - this.hooks.display.trigger(view); - - displaying.resolve(this); - - } else { - displaying.reject(new Error("No Section Found")); - } - - return displayed; - -}; -// Takes a cfi, fragment or page? -EPUBJS.Rendition.prototype.moveTo = function(what){ - -}; - -EPUBJS.Rendition.prototype.render = function(view, show) { - - view.create(); - - view.onLayout = this.layout.format.bind(this.layout); - - // Fit to size of the container, apply padding - this.resizeView(view); - - // Render Chain - return view.render(this.book.request) - .then(function(){ - return this.hooks.replacements.trigger(view, this); - }.bind(this)) - .then(function(){ - return this.hooks.layout.trigger(view); - }.bind(this)) - .then(function(){ - return view.display() - }.bind(this)) - .then(function(view){ - - if(show != false && this.hidden === false) { - this.q.enqueue(function(view){ - view.show(); - }, view); - } - - - // this.map = new EPUBJS.Map(view, this.layout); - this.trigger("rendered", view.section); - - }.bind(this)) - .catch(function(e){ - this.trigger("loaderror", e); - }.bind(this)); - -}; - - -EPUBJS.Rendition.prototype.afterDisplayed = function(view){ - this.trigger("displayed", view.section); -}; - -EPUBJS.Rendition.prototype.append = function(view){ - // Clear existing views - this.clear(); - - this.views.push(view); - // view.appendTo(this.container); - this.container.appendChild(view.element); - - // view.on("displayed", this.afterDisplayed.bind(this)); - view.onDisplayed = this.afterDisplayed.bind(this); - // this.resizeView(view); - - return this.render(view); -}; - -EPUBJS.Rendition.prototype.clear = function(){ - // Remove all views - this.views.forEach(function(view){ - this._remove(view); - }.bind(this)); - this.views = []; -}; - -EPUBJS.Rendition.prototype.remove = function(view) { - var index = this.views.indexOf(view); - - if(index > -1) { - this.views.splice(index, 1); - } - - - this._remove(view); - -}; - -EPUBJS.Rendition.prototype._remove = function(view) { - view.off("resized"); - - if(view.displayed){ - view.destroy(); - } - - this.container.removeChild(view.element); - view = null; -}; - -EPUBJS.Rendition.prototype.resizeView = function(view) { - - if(this.globalLayoutProperties.layout === "pre-paginated") { - view.lock("both", this.stage.width, this.stage.height); - } else { - view.lock("width", this.stage.width, this.stage.height); - } - -}; - -EPUBJS.Rendition.prototype.stageSize = function(_width, _height){ - var bounds; - var width = _width || this.settings.width; - var height = _height || this.settings.height; - - // If width or height are set to false, inherit them from containing element - if(width === false) { - bounds = this.element.getBoundingClientRect(); - - if(bounds.width) { - width = bounds.width; - this.container.style.width = bounds.width + "px"; - } - } - - if(height === false) { - bounds = bounds || this.element.getBoundingClientRect(); - - if(bounds.height) { - height = bounds.height; - this.container.style.height = bounds.height + "px"; - } - - } - - if(width && !EPUBJS.core.isNumber(width)) { - bounds = this.container.getBoundingClientRect(); - width = bounds.width; - //height = bounds.height; - } - - if(height && !EPUBJS.core.isNumber(height)) { - bounds = bounds || this.container.getBoundingClientRect(); - //width = bounds.width; - height = bounds.height; - } - - - this.containerStyles = window.getComputedStyle(this.container); - this.containerPadding = { - left: parseFloat(this.containerStyles["padding-left"]) || 0, - right: parseFloat(this.containerStyles["padding-right"]) || 0, - top: parseFloat(this.containerStyles["padding-top"]) || 0, - bottom: parseFloat(this.containerStyles["padding-bottom"]) || 0 - }; - - this.stage = { - width: width - - this.containerPadding.left - - this.containerPadding.right, - height: height - - this.containerPadding.top - - this.containerPadding.bottom - }; - - return this.stage; - -}; - -EPUBJS.Rendition.prototype.layoutMethod = function() { - - this.layout = new EPUBJS.Layout.Scroll(); - this.layoutUpdate(); - - this.map = new EPUBJS.Map(this.layout); -}; - -EPUBJS.Rendition.prototype.layoutUpdate = function() { - - this.layout.calculate(this.stage.width, this.stage.height); - -}; - -EPUBJS.Rendition.prototype.resize = function(width, height){ - - this.stageSize(width, height); - - this.layoutUpdate(); - - this.views.forEach(this.resizeView.bind(this)); - - this.trigger("resized", { - width: this.stage.width, - height: this.stage.height - }); - -}; - -EPUBJS.Rendition.prototype.onResized = function(e) { - this.resize(); -}; - -EPUBJS.Rendition.prototype.createView = function(section) { - return new EPUBJS.View(section, this.viewSettings); -}; - -EPUBJS.Rendition.prototype.next = function(){ - - return this.q.enqueue(function(){ - - var next; - var view; - - if(!this.views.length) return; - - next = this.views[0].section.next(); - - if(next) { - view = this.createView(next); - return this.append(view); - } - - }); - -}; - -EPUBJS.Rendition.prototype.prev = function(){ - - return this.q.enqueue(function(){ - - var prev; - var view; - - if(!this.views.length) return; - - prev = this.views[0].section.prev(); - if(prev) { - view = this.createView(prev); - return this.append(view); - } - - }); - -}; - -//-- http://www.idpf.org/epub/fxl/ -EPUBJS.Rendition.prototype.parseLayoutProperties = function(_metadata){ - var metadata = _metadata || this.book.package.metadata; - var layout = (this.layoutOveride && this.layoutOveride.layout) || metadata.layout || "reflowable"; - var spread = (this.layoutOveride && this.layoutOveride.spread) || metadata.spread || "auto"; - var orientation = (this.layoutOveride && this.layoutOveride.orientation) || metadata.orientation || "auto"; - this.globalLayoutProperties = { - layout : layout, - spread : spread, - orientation : orientation - }; - return this.globalLayoutProperties; -}; - - -EPUBJS.Rendition.prototype.current = function(){ - var visible = this.visible(); - if(visible.length){ - // Current is the last visible view - return visible[visible.length-1]; - } - return null; -}; - -EPUBJS.Rendition.prototype.isVisible = function(view, offsetPrev, offsetNext, _container){ - var position = view.position(); - var container = _container || this.container.getBoundingClientRect(); - - if(this.settings.axis === "horizontal" && - (position.right > container.left - offsetPrev) && - !(position.left >= container.right + offsetNext)) { - - return true; - - } else if(this.settings.axis === "vertical" && - (position.bottom > container.top - offsetPrev) && - !(position.top >= container.bottom + offsetNext)) { - - return true; - } - - return false; - -}; - -EPUBJS.Rendition.prototype.visible = function(){ - var container = this.bounds(); - var visible = []; - var isVisible; - var view; - - for (var i = 0; i < this.views.length; i++) { - view = this.views[i]; - isVisible = this.isVisible(view, 0, 0, container); - - if(isVisible === true) { - visible.push(view); - } - - }; - - return visible; - -}; - -EPUBJS.Rendition.prototype.bounds = function(func) { - var bounds; - - if(!this.settings.height) { - bounds = EPUBJS.core.windowBounds(); - } else { - bounds = this.container.getBoundingClientRect(); - } - - return bounds; -}; - -EPUBJS.Rendition.prototype.displayed = function(){ - var displayed = []; - var view; - for (var i = 0; i < this.views.length; i++) { - view = this.views[i]; - if(view.displayed){ - displayed.push(view); - } - }; - return displayed; -}; - -EPUBJS.Rendition.prototype.show = function(){ - var view; - for (var i = 0; i < this.views.length; i++) { - view = this.views[i]; - if(view.displayed){ - view.show(); - } - }; - this.hidden = false; -}; - -EPUBJS.Rendition.prototype.hide = function(){ - var view; - for (var i = 0; i < this.views.length; i++) { - view = this.views[i]; - if(view.displayed){ - view.hide(); - } - }; - this.hidden = true; -}; - -EPUBJS.Rendition.prototype.destroy = function(){ - // Clear the queue - this.q.clear(); - - this.clear(); - - clearTimeout(this.trimTimeout); - if(this.settings.hidden) { - this.element.removeChild(this.wrapper); - } else { - this.element.removeChild(this.container); - } - -}; - -EPUBJS.Rendition.prototype.reportLocation = function(){ - return this.q.enqueue(function(){ - this.location = this.currentLocation(); - this.trigger("locationChanged", this.location); - }.bind(this)); -}; - -EPUBJS.Rendition.prototype.currentLocation = function(){ - var view; - var start, end; - - if(this.views.length) { - view = this.views[0]; - // start = container.left - view.position().left; - // end = start + this.layout.spread; - - return this.map.page(view); - } - -}; - -//-- Enable binding events to Renderer -RSVP.EventTarget.mixin(EPUBJS.Rendition.prototype); - -EPUBJS.Continuous = function(book, options) { - - EPUBJS.Rendition.apply(this, arguments); // call super constructor. - - this.settings = EPUBJS.core.extend(this.settings || {}, { - infinite: true, - overflow: "auto", - axis: "vertical", - offset: 500, - offsetDelta: 250 - }); - - EPUBJS.core.extend(this.settings, options); - - if(this.settings.hidden) { - this.wrapper = this.wrap(this.container); - } - - -}; - -// subclass extends superclass -EPUBJS.Continuous.prototype = Object.create(EPUBJS.Rendition.prototype); -EPUBJS.Continuous.prototype.constructor = EPUBJS.Continuous; - -EPUBJS.Continuous.prototype.attachListeners = function(){ - - // Listen to window for resize event if width or height is set to a percent - if(!EPUBJS.core.isNumber(this.settings.width) || - !EPUBJS.core.isNumber(this.settings.height) ) { - window.addEventListener("resize", this.onResized.bind(this), false); - } - - - if(this.settings.infinite) { - this.start(); - } - - -}; - -EPUBJS.Continuous.prototype._display = function(target){ - - var displaying = new RSVP.defer(); - var displayed = displaying.promise; - - var section; - var view; - var cfi, spinePos; - - if(this.epubcfi.isCfiString(target)) { - cfi = this.epubcfi.parse(target); - spinePos = cfi.spinePos; - section = this.book.spine.get(spinePos); - } else { - section = this.book.spine.get(target); - } - - this.displaying = true; - this.hide(); - - if(section){ - view = new EPUBJS.View(section, this.viewSettings); - - // This will clear all previous views - this.q.enqueue(this.fill, view).then(function(){ - - // Move to correct place within the section, if needed - this.q.enqueue(function(){ - - var offset = view.locationOf(target); - - return this.moveTo(offset); - - }); - - this.q.enqueue(this.check); - - this.q.enqueue(this.show); - - this.hooks.display.trigger(view); - - }.bind(this)); - - // view.displayed.then(function(){ - // this.trigger("displayed", section); - // this.displaying = false; - // displaying.resolve(this); - //}.bind(this)); - displaying.resolve(this); - - } else { - displaying.reject(new Error("No Section Found")); - } - - return displayed; -}; - - -EPUBJS.Continuous.prototype.moveTo = function(offset){ - var bounds = this.bounds(); - var dist = Math.floor(offset.top / bounds.height) * bounds.height; - - return this.check(0, dist+this.settings.offset).then(function(){ - - if(this.settings.axis === "vertical") { - this.scrollBy(0, dist); - } else { - this.scrollBy(dist, 0); - } - - }.bind(this)); -}; - -EPUBJS.Continuous.prototype.afterDisplayed = function(currView){ - var next = currView.section.next(); - var prev = currView.section.prev(); - var index = this.views.indexOf(currView); - - var prevView, nextView; - - if(index + 1 === this.views.length && next) { - nextView = new EPUBJS.View(next, this.viewSettings); - this.q.enqueue(this.append, nextView); - } - - if(index === 0 && prev) { - prevView = new EPUBJS.View(prev, this.viewSettings); - this.q.enqueue(this.prepend, prevView); - } - - // this.removeShownListeners(currView); - // currView.onShown = this.afterDisplayed.bind(this); - - this.trigger("displayed", currView.section); - -}; - - -// Remove Previous Listeners if present -EPUBJS.Continuous.prototype.removeShownListeners = function(view){ - - // view.off("shown", this.afterDisplayed); - // view.off("shown", this.afterDisplayedAbove); - view.onDisplayed = function(){}; - -}; - -EPUBJS.Continuous.prototype.append = function(view){ - this.views.push(view); - this.container.appendChild(view.element); - - // view.on("shown", this.afterDisplayed.bind(this)); - view.onDisplayed = this.afterDisplayed.bind(this); - - //this.q.enqueue(this.check); - return this.check(); -}; - -EPUBJS.Continuous.prototype.prepend = function(view){ - this.views.unshift(view); - this.container.insertBefore(view.element, this.container.firstChild); - - // view.on("shown", this.afterDisplayedAbove.bind(this)); - view.onDisplayed = this.afterDisplayed.bind(this); - - view.on("resized", this.counter.bind(this)); - - // this.q.enqueue(this.check); - return this.check(); -}; - -EPUBJS.Continuous.prototype.counter = function(bounds){ - - if(this.settings.axis === "vertical") { - this.scrollBy(0, bounds.heightDelta, true); - } else { - this.scrollBy(bounds.widthDelta, 0, true); - } - -}; - -EPUBJS.Continuous.prototype.fill = function(view){ - - if(this.views.length){ - this.clear(); - } - - this.views.push(view); - - this.container.appendChild(view.element); - - // view.on("shown", this.afterDisplayed.bind(this)); - view.onDisplayed = this.afterDisplayed.bind(this); - - return this.render(view) - .then(function(){ - return this.check(); - }.bind(this)); -}; - -EPUBJS.Continuous.prototype.insert = function(view, index) { - this.views.splice(index, 0, view); - - if(index < this.cotainer.children.length){ - this.container.insertBefore(view.element, this.container.children[index]); - } else { - this.container.appendChild(view.element); - } - - // this.q.enqueue(this.check); - return this.check(); -}; - -// // Remove the render element and clean up listeners -// EPUBJS.Continuous.prototype.remove = function(view) { -// var index = this.views.indexOf(view); -// if(index > -1) { -// this.views.splice(index, 1); -// } - -// this.container.removeChild(view.element); - -// view.off("resized"); - -// if(view.displayed){ -// view.destroy(); -// } - -// view = null; - -// }; - -EPUBJS.Continuous.prototype.first = function() { - return this.views[0]; -}; - -EPUBJS.Continuous.prototype.last = function() { - return this.views[this.views.length-1]; -}; - -EPUBJS.Continuous.prototype.each = function(func) { - return this.views.forEach(func); -}; - -EPUBJS.Continuous.prototype.check = function(_offset){ - var checking = new RSVP.defer(); - var container = this.bounds(); - var promises = []; - var offset = _offset || this.settings.offset; - - - this.views.forEach(function(view){ - var visible = this.isVisible(view, offset, offset, container); - - if(visible) { - - if(!view.displayed && !view.rendering) { - // console.log("render",view.section.index) - promises.push(this.render(view)); - } - - } else { - - if(view.displayed) { - // console.log("destroy", view.section.index) - this.q.enqueue(view.destroy.bind(view)); - // view.destroy(); - //this.q.enqueue(this.trim); - } - - } - - }.bind(this)); - - clearTimeout(this.trimTimeout); - this.trimTimeout = setTimeout(function(){ - this.q.enqueue(this.trim); - }.bind(this), 250); - - if(promises.length){ - - return RSVP.all(promises) - .then(function(posts) { - // Check to see if anything new is on screen after rendering - this.q.enqueue(this.check); - - }.bind(this)); - - } else { - checking.resolve(); - return checking.promise; - } - -}; - -// EPUBJS.Continuous.prototype.trim = function(){ -// var task = new RSVP.defer(); -// var above = true; - -// this.views.forEach(function(view, i){ -// // var view = this.views[i]; -// var prevShown = i > 0 ? this.views[i-1].displayed : false; -// var nextShown = (i+1 < this.views.length) ? this.views[i+1].displayed : false; -// if(!view.displayed && !prevShown && !nextShown) { -// // Remove -// this.erase(view, above); -// } -// if(nextShown) { -// above = false; -// } -// }.bind(this)); - -// task.resolve(); -// return task.promise; -// }; - -EPUBJS.Continuous.prototype.trim = function(){ - var task = new RSVP.defer(); - var displayed = this.displayed(); - var first = displayed[0]; - var last = displayed[displayed.length-1]; - var firstIndex = this.views.indexOf(first); - var lastIndex = this.views.indexOf(last); - var above = this.views.slice(0, firstIndex); - var below = this.views.slice(lastIndex+1); - - for (var i = 0; i < above.length-1; i++) { - this.erase(above[i], above); - }; - - for (var i = 1; i < below.length; i++) { - this.erase(below[i]); - }; - - task.resolve(); - return task.promise; -}; - -EPUBJS.Continuous.prototype.erase = function(view, above){ //Trim - - var prevTop; - var prevLeft; - - if(this.settings.height) { - prevTop = this.container.scrollTop; - prevLeft = this.container.scrollLeft; - } else { - prevTop = window.scrollY; - prevLeft = window.scrollX; - } - - var bounds = view.bounds(); - - this.remove(view); - - if(above) { - - if(this.settings.axis === "vertical") { - this.scrollTo(0, prevTop - bounds.height, true); - } else { - this.scrollTo(prevLeft - bounds.width, 0, true); - } - } - -}; - - -EPUBJS.Continuous.prototype.checkCurrent = function(position) { - var view, top; - var container = this.container.getBoundingClientRect(); - var length = this.views.length - 1; - - if(this.rendering) { - return; - } - - if(this.settings.axis === "horizontal") { - // TODO: Check for current horizontal - } else { - - for (var i = length; i >= 0; i--) { - view = this.views[i]; - top = view.bounds().top; - if(top < container.bottom) { - - if(this.current == view.section) { - break; - } - - this.current = view.section; - this.trigger("current", this.current); - break; - } - } - - } - -}; - -EPUBJS.Continuous.prototype.start = function() { - var scroller; - - this.tick = EPUBJS.core.requestAnimationFrame; - - if(this.settings.height) { - this.prevScrollTop = this.container.scrollTop; - this.prevScrollLeft = this.container.scrollLeft; - } else { - this.prevScrollTop = window.scrollY; - this.prevScrollLeft = window.scrollX; - } - - this.scrollDeltaVert = 0; - this.scrollDeltaHorz = 0; - - if(this.settings.height) { - scroller = this.container; - } else { - scroller = window; - } - - window.addEventListener("scroll", function(e){ - if(!this.ignore) { - this.scrolled = true; - } else { - this.ignore = false; - } - }.bind(this)); - - window.addEventListener('unload', function(e){ - this.ignore = true; - this.destroy(); - }.bind(this)); - - this.tick.call(window, this.onScroll.bind(this)); - - this.scrolled = false; - -}; - -EPUBJS.Continuous.prototype.onScroll = function(){ - - if(this.scrolled) { - - if(this.settings.height) { - scrollTop = this.container.scrollTop; - scrollLeft = this.container.scrollLeft; - } else { - scrollTop = window.scrollY; - scrollLeft = window.scrollX; - } - - if(!this.ignore) { - - // this.trigger("scroll", { - // top: scrollTop, - // left: scrollLeft - // }); - - if((this.scrollDeltaVert === 0 && - this.scrollDeltaHorz === 0) || - this.scrollDeltaVert > this.settings.offsetDelta || - this.scrollDeltaHorz > this.settings.offsetDelta) { - - this.q.enqueue(this.check); - - this.scrollDeltaVert = 0; - this.scrollDeltaHorz = 0; - - } - - } else { - this.ignore = false; - } - - this.scrollDeltaVert += Math.abs(scrollTop-this.prevScrollTop); - this.scrollDeltaHorz += Math.abs(scrollLeft-this.prevScrollLeft); - - if(this.settings.height) { - this.prevScrollTop = this.container.scrollTop; - this.prevScrollLeft = this.container.scrollLeft; - } else { - this.prevScrollTop = window.scrollY; - this.prevScrollLeft = window.scrollX; - } - - - clearTimeout(this.scrollTimeout); - this.scrollTimeout = setTimeout(function(){ - this.scrollDeltaVert = 0; - this.scrollDeltaHorz = 0; - }.bind(this), 150); - - - this.scrolled = false; - } - - this.tick.call(window, this.onScroll.bind(this)); - -}; - -EPUBJS.Continuous.prototype.scrollBy = function(x, y, silent){ - if(silent) { - this.ignore = true; - } - - if(this.settings.height) { - - if(x) this.container.scrollLeft += x; - if(y) this.container.scrollTop += y; - - } else { - window.scrollBy(x,y); - } - // console.log("scrollBy", x, y); - this.scrolled = true; -}; - -EPUBJS.Continuous.prototype.scrollTo = function(x, y, silent){ - if(silent) { - this.ignore = true; - } - - if(this.settings.height) { - this.container.scrollLeft = x; - this.container.scrollTop = y; - } else { - window.scrollTo(x,y); - } - // console.log("scrollTo", x, y); - this.scrolled = true; - // if(this.container.scrollLeft != x){ - // setTimeout(function() { - // this.scrollTo(x, y, silent); - // }.bind(this), 10); - // return; - // }; - }; - - EPUBJS.Continuous.prototype.resizeView = function(view) { - - if(this.settings.axis === "horizontal") { - view.lock("height", this.stage.width, this.stage.height); - } else { - view.lock("width", this.stage.width, this.stage.height); - } - -}; - -EPUBJS.Continuous.prototype.currentLocation = function(){ - var visible = this.visible(); - var startPage, endPage; - - var container = this.container.getBoundingClientRect() - - if(visible.length === 1) { - return this.map.page(visible[0]); - } - - if(visible.length > 1) { - - startPage = this.map.page(visible[0]); - endPage = this.map.page(visible[visible.length-1]); - - return { - start: startPage.start, - end: endPage.end - } - } - -}; - -/* -EPUBJS.Continuous.prototype.current = function(what){ - var view, top; - var container = this.container.getBoundingClientRect(); - var length = this.views.length - 1; - - if(this.settings.axis === "horizontal") { - - for (var i = length; i >= 0; i--) { - view = this.views[i]; - left = view.position().left; - - if(left < container.right) { - - if(this._current == view) { - break; - } - - this._current = view; - break; - } - } - - } else { - - for (var i = length; i >= 0; i--) { - view = this.views[i]; - top = view.bounds().top; - if(top < container.bottom) { - - if(this._current == view) { - break; - } - - this._current = view; - - break; - } - } - - } - - return this._current; -}; -*/ -EPUBJS.Paginate = function(book, options) { - - EPUBJS.Continuous.apply(this, arguments); - - this.settings = EPUBJS.core.extend(this.settings || {}, { - width: 600, - height: 400, - axis: "horizontal", - forceSingle: false, - minSpreadWidth: 800, //-- overridden by spread: none (never) / both (always) - gap: "auto", //-- "auto" or int - overflow: "hidden", - infinite: false - }); - - EPUBJS.core.extend(this.settings, options); - - this.isForcedSingle = false; - - this.viewSettings = { - axis: this.settings.axis - }; - - this.start(); -}; - -EPUBJS.Paginate.prototype = Object.create(EPUBJS.Continuous.prototype); -EPUBJS.Paginate.prototype.constructor = EPUBJS.Paginate; - - -EPUBJS.Paginate.prototype.determineSpreads = function(cutoff){ - if(this.isForcedSingle || !cutoff || this.bounds().width < cutoff) { - return 1; //-- Single Page - }else{ - return 2; //-- Double Page - } -}; - -EPUBJS.Paginate.prototype.forceSingle = function(bool){ - if(bool) { - this.isForcedSingle = true; - // this.spreads = false; - } else { - this.isForcedSingle = false; - // this.spreads = this.determineSpreads(this.minSpreadWidth); - } -}; - -/** -* Uses the settings to determine which Layout Method is needed -* Triggers events based on the method choosen -* Takes: Layout settings object -* Returns: String of appropriate for EPUBJS.Layout function -*/ -EPUBJS.Paginate.prototype.determineLayout = function(settings){ - // Default is layout: reflowable & spread: auto - var spreads = this.determineSpreads(this.settings.minSpreadWidth); - console.log("spreads", spreads, this.settings.minSpreadWidth) - var layoutMethod = spreads ? "ReflowableSpreads" : "Reflowable"; - var scroll = false; - - if(settings.layout === "pre-paginated") { - layoutMethod = "Fixed"; - scroll = true; - spreads = false; - } - - if(settings.layout === "reflowable" && settings.spread === "none") { - layoutMethod = "Reflowable"; - scroll = false; - spreads = false; - } - - if(settings.layout === "reflowable" && settings.spread === "both") { - layoutMethod = "ReflowableSpreads"; - scroll = false; - spreads = true; - } - - this.spreads = spreads; - - return layoutMethod; -}; - -EPUBJS.Paginate.prototype.start = function(){ - // On display - // this.layoutSettings = this.reconcileLayoutSettings(globalLayout, chapter.properties); - // this.layoutMethod = this.determineLayout(this.layoutSettings); - // this.layout = new EPUBJS.Layout[this.layoutMethod](); - //this.hooks.display.register(this.registerLayoutMethod.bind(this)); - this.hooks.display.register(this.reportLocation); - - this.currentPage = 0; - - window.addEventListener('unload', function(e){ - this.ignore = true; - this.destroy(); - }.bind(this)); - -}; - -// EPUBJS.Rendition.prototype.createView = function(section) { -// var view = new EPUBJS.View(section, this.viewSettings); - - -// return view; -// }; - -EPUBJS.Paginate.prototype.layoutMethod = function() { - //var task = new RSVP.defer(); - - // this.spreads = this.determineSpreads(this.settings.minSpreadWidth); - - this.layout = new EPUBJS.Layout.Reflowable(); - - this.layoutUpdate(); - - // Set the look ahead offset for what is visible - - this.map = new EPUBJS.Map(this.layout); - - // this.hooks.layout.register(this.layout.format.bind(this)); - - //task.resolve(); - //return task.promise; - // return layout; -}; - -EPUBJS.Paginate.prototype.layoutUpdate = function() { - - this.spreads = this.determineSpreads(this.settings.minSpreadWidth); - - this.layout.calculate( - this.stage.width, - this.stage.height, - this.settings.gap, - this.spreads - ); - - this.settings.offset = this.layout.delta; - -}; - -EPUBJS.Paginate.prototype.moveTo = function(offset){ - var dist = Math.floor(offset.left / this.layout.delta) * this.layout.delta; - return this.check(0, dist+this.settings.offset).then(function(){ - this.scrollBy(dist, 0); - }.bind(this)); -}; - -EPUBJS.Paginate.prototype.page = function(pg){ - - // this.currentPage = pg; - // this.renderer.infinite.scrollTo(this.currentPage * this.formated.pageWidth, 0); - //-- Return false if page is greater than the total - // return false; -}; - -EPUBJS.Paginate.prototype.next = function(){ - - return this.q.enqueue(function(){ - this.scrollBy(this.layout.delta, 0); - this.reportLocation(); - return this.check(); - }); - - // return this.page(this.currentPage + 1); -}; - -EPUBJS.Paginate.prototype.prev = function(){ - - return this.q.enqueue(function(){ - this.scrollBy(-this.layout.delta, 0); - this.reportLocation(); - return this.check(); - }); - // return this.page(this.currentPage - 1); -}; - -EPUBJS.Paginate.prototype.reportLocation = function(){ - return this.q.enqueue(function(){ - this.location = this.currentLocation(); - this.trigger("locationChanged", this.location); - }.bind(this)); -}; - -EPUBJS.Paginate.prototype.currentLocation = function(){ - var visible = this.visible(); - var startA, startB, endA, endB; - var pageLeft, pageRight; - var container = this.container.getBoundingClientRect() - - if(visible.length === 1) { - startA = container.left - visible[0].position().left; - endA = startA + this.layout.spread; - - return this.map.page(visible[0], startA, endA); - } - - if(visible.length > 1) { - - // Left Col - startA = container.left - visible[0].position().left; - endA = startA + this.layout.column; - - // Right Col - startB = container.left + this.layout.spread - visible[visible.length-1].position().left; - endB = startB + this.layout.column; - - pageLeft = this.map.page(visible[0], startA, endA); - pageRight = this.map.page(visible[visible.length-1], startB, endB); - - return { - start: pageLeft.start, - end: pageRight.end - } - } - -}; - -EPUBJS.Paginate.prototype.resize = function(width, height){ - // Clear the queue - this.q.clear(); - - this.stageSize(width, height); - - this.layoutUpdate(); - - this.display(this.location.start); - - this.trigger("resized", { - width: this.stage.width, - height: this.stage.height - }); - -}; - -EPUBJS.Paginate.prototype.onResized = function(e) { - - this.clear(); - - clearTimeout(this.resizeTimeout); - this.resizeTimeout = setTimeout(function(){ - this.resize(); - }.bind(this), 150); -}; - -// EPUBJS.Paginate.prototype.display = function(what){ -// return this.display(what); -// }; -EPUBJS.Map = function(layout){ - this.layout = layout; -}; - -EPUBJS.Map.prototype.section = function(view) { - var ranges = this.findRanges(view); - var map = this.rangeListToCfiList(view, ranges); - - return map; -}; - -EPUBJS.Map.prototype.page = function(view, start, end) { - var root = view.document.body; - return this.rangePairToCfiPair(view.section, { - start: this.findStart(root, start, end), - end: this.findEnd(root, start, end) - }); -}; - -EPUBJS.Map.prototype.walk = function(root, func) { - //var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT + NodeFilter.SHOW_TEXT, null, false); - var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, { - acceptNode: function (node) { - if ( node.data.trim().length > 0 ) { - return NodeFilter.FILTER_ACCEPT; - } else { - return NodeFilter.FILTER_REJECT; - } - } - }, false); - var node; - var result; - while ((node = treeWalker.nextNode())) { - result = func(node); - if(result) break; - } - - return result; -}; - -EPUBJS.Map.prototype.findRanges = function(view){ - var columns = []; - var count = this.layout.count(view); - var column = this.layout.column; - var gap = this.layout.gap; - var start, end; - - for (var i = 0; i < count.pages; i++) { - start = (column + gap) * i; - end = (column * (i+1)) + (gap * i); - columns.push({ - start: this.findStart(view.document.body, start, end), - end: this.findEnd(view.document.body, start, end) - }); - }; - - return columns; -}; - -EPUBJS.Map.prototype.findStart = function(root, start, end){ - var stack = [root]; - var $el; - var found; - var $prev = root; - while (stack.length) { - - $el = stack.shift(); - - found = this.walk($el, function(node){ - var left, right; - var elPos - var elRange; - - - if(node.nodeType == Node.TEXT_NODE){ - elRange = document.createRange(); - elRange.selectNodeContents(node); - elPos = elRange.getBoundingClientRect(); - } else { - elPos = node.getBoundingClientRect(); - } - - left = elPos.left; - right = elPos.right; - - if( left >= start && left <= end ) { - return node; - } else if (right > start) { - return node; - } else { - $prev = node; - stack.push(node); - } - - }); - - if(found) { - return this.findTextStartRange(found, start, end); - } - - } - - // Return last element - return this.findTextStartRange($prev, start, end); -}; - -EPUBJS.Map.prototype.findEnd = function(root, start, end){ - var stack = [root]; - var $el; - var $prev = root; - var found; - - while (stack.length) { - - $el = stack.shift(); - - found = this.walk($el, function(node){ - - var left, right; - var elPos - var elRange; - - - if(node.nodeType == Node.TEXT_NODE){ - elRange = document.createRange(); - elRange.selectNodeContents(node); - elPos = elRange.getBoundingClientRect(); - } else { - elPos = node.getBoundingClientRect(); - } - - left = elPos.left; - right = elPos.right; - - if(left > end && $prev) { - return $prev - } else if(right > end) { - return node; - } else { - $prev = node; - stack.push(node); - } - - }); - - - if(found){ - return this.findTextEndRange(found, start, end); - } - - } - - // end of chapter - return this.findTextEndRange($prev, start, end); -}; - - -EPUBJS.Map.prototype.findTextStartRange = function(node, start, end){ - var ranges = this.splitTextNodeIntoRanges(node); - var prev; - var range; - var pos; - - for (var i = 0; i < ranges.length; i++) { - range = ranges[i]; - - pos = range.getBoundingClientRect(); - - if( pos.left >= start ) { - return range; - } - - prev = range; - - }; - - return ranges[0]; -}; - -EPUBJS.Map.prototype.findTextEndRange = function(node, start, end){ - var ranges = this.splitTextNodeIntoRanges(node); - var prev; - var range; - var pos; - - for (var i = 0; i < ranges.length; i++) { - range = ranges[i]; - - pos = range.getBoundingClientRect(); - - if(pos.left > end && prev) { - return prev; - } else if(pos.right > end) { - return range; - } - - prev = range; - - }; - - // Ends before limit - return ranges[ranges.length-1]; - -}; - -EPUBJS.Map.prototype.splitTextNodeIntoRanges = function(node, _splitter){ - var ranges = []; - var textContent = node.textContent || ""; - var text = textContent.trim(); - var range; - var rect; - var list; - var doc = node.ownerDocument; - var splitter = _splitter || " "; - - pos = text.indexOf(splitter); - - if(pos === -1 || node.nodeType != Node.TEXT_NODE) { - range = doc.createRange(); - range.selectNodeContents(node); - return [range]; - } - - range = doc.createRange(); - range.setStart(node, 0); - range.setEnd(node, pos); - ranges.push(range); - range = false; - - while ( pos != -1 ) { - - pos = text.indexOf(splitter, pos + 1); - if(pos > 0) { - - if(range) { - range.setEnd(node, pos); - ranges.push(range); - } - - range = doc.createRange(); - range.setStart(node, pos+1); - } - } - - if(range) { - range.setEnd(node, text.length); - ranges.push(range); - } - - return ranges; -}; - - - -EPUBJS.Map.prototype.rangePairToCfiPair = function(section, rangePair){ - - var startRange = rangePair.start; - var endRange = rangePair.end; - - startRange.collapse(true); - endRange.collapse(true); - - startCfi = section.cfiFromRange(startRange); - endCfi = section.cfiFromRange(endRange); - - return { - start: startCfi, - end: endCfi - } - -}; - -EPUBJS.Map.prototype.rangeListToCfiList = function(view, columns){ - var map = []; - var rangePair, cifPair; - - for (var i = 0; i < columns.length; i++) { - cifPair = this.rangePairToCfiPair(view.section, columns[i]); - - map.push(cifPair); - - }; - - return map; -}; \ No newline at end of file +}(self)); \ No newline at end of file diff --git a/dist/epub.min.js b/dist/epub.min.js index 3d52630..f0ba2a7 100644 --- a/dist/epub.min.js +++ b/dist/epub.min.js @@ -1,3 +1 @@ -"undefined"==typeof EPUBJS&&(("undefined"!=typeof window?window:this).EPUBJS={}),EPUBJS.VERSION="0.3.0",EPUBJS.Render={},function(t){"use strict";var e=function(t){return new EPUBJS.Book(t)};e.Render={register:function(t,i){e.Render[t]=i}},"object"==typeof exports?(t.RSVP=require("rsvp"),module.exports=e):"function"==typeof define&&define.amd?define(e):t.ePub=e}(this),function(t){var e,i;!function(){var t={},n={};e=function(e,i,n){t[e]={deps:i,callback:n}},i=function(e){function r(t){if("."!==t.charAt(0))return t;for(var i=t.split("/"),n=e.split("/").slice(0,-1),r=0,o=i.length;o>r;r++){var s=i[r];if(".."===s)n.pop();else{if("."===s)continue;n.push(s)}}return n.join("/")}if(n[e])return n[e];if(n[e]={},!t[e])throw new Error("Could not find module "+e);for(var o,s=t[e],a=s.deps,h=s.callback,u=[],c=0,l=a.length;l>c;c++)u.push("exports"===a[c]?o={}:i(r(a[c])));var p=h.apply(this,u);return n[e]=o||p},i.entries=t}(),e("rsvp/-internal",["./utils","./instrument","./config","exports"],function(t,e,i,n){"use strict";function r(){}function o(t){try{return t.then}catch(e){return x.error=e,x}}function s(t,e,i,n){try{t.call(e,i,n)}catch(r){return r}}function a(t,e,i){w.async(function(t){var n=!1,r=s(i,e,function(i){n||(n=!0,e!==i?c(t,i):p(t,i))},function(e){n||(n=!0,d(t,e))},"Settle: "+(t._label||" unknown promise"));!n&&r&&(n=!0,d(t,r))},t)}function h(t,e){t._onerror=null,e._state===U?p(t,e._result):t._state===J?d(t,e._result):f(e,void 0,function(i){e!==i?c(t,i):p(t,i)},function(e){d(t,e)})}function u(t,e){if(e instanceof t.constructor)h(t,e);else{var i=o(e);i===x?d(t,x.error):void 0===i?p(t,e):P(i)?a(t,e,i):p(t,e)}}function c(t,e){t===e?p(t,e):E(e)?u(t,e):p(t,e)}function l(t){t._onerror&&t._onerror(t._result),g(t)}function p(t,e){t._state===b&&(t._result=e,t._state=U,0===t._subscribers.length?w.instrument&&B("fulfilled",t):w.async(g,t))}function d(t,e){t._state===b&&(t._state=J,t._result=e,w.async(l,t))}function f(t,e,i,n){var r=t._subscribers,o=r.length;t._onerror=null,r[o]=e,r[o+U]=i,r[o+J]=n,0===o&&t._state&&w.async(g,t)}function g(t){var e=t._subscribers,i=t._state;if(w.instrument&&B(i===U?"fulfilled":"rejected",t),0!==e.length){for(var n,r,o=t._result,s=0;st;t+=2){var e=l[t],i=l[t+1];e(i),l[t]=void 0,l[t+1]=void 0}s=0}var s=0;t["default"]=function(t,e){l[s]=t,l[s+1]=e,s+=2,2===s&&a()};var a,h="undefined"!=typeof window?window:{},u=h.MutationObserver||h.WebKitMutationObserver,c="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,l=new Array(1e3);a="undefined"!=typeof process&&"[object process]"==={}.toString.call(process)?e():u?i():c?n():r()}),e("rsvp/config",["./events","exports"],function(t,e){"use strict";function i(t,e){return"onerror"===t?void r.on("error",e):2!==arguments.length?r[t]:void(r[t]=e)}var n=t["default"],r={instrument:!1};n.mixin(r),e.config=r,e.configure=i}),e("rsvp/defer",["./promise","exports"],function(t,e){"use strict";var i=t["default"];e["default"]=function(t){var e={};return e.promise=new i(function(t,i){e.resolve=t,e.reject=i},t),e}}),e("rsvp/enumerator",["./utils","./-internal","exports"],function(t,e,i){"use strict";function n(t,e,i){return t===l?{state:"fulfilled",value:i}:{state:"rejected",reason:i}}function r(t,e,i,n){this._instanceConstructor=t,this.promise=new t(a,n),this._abortOnReject=i,this._validateInput(e)?(this._input=e,this.length=e.length,this._remaining=e.length,this._init(),0===this.length?u(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&u(this.promise,this._result))):h(this.promise,this._validationError())}var o=t.isArray,s=t.isMaybeThenable,a=e.noop,h=e.reject,u=e.fulfill,c=e.subscribe,l=e.FULFILLED,p=e.REJECTED,d=e.PENDING,f=!0;i.ABORT_ON_REJECTION=f,i.makeSettledResult=n,r.prototype._validateInput=function(t){return o(t)},r.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},r.prototype._init=function(){this._result=new Array(this.length)},i["default"]=r,r.prototype._enumerate=function(){for(var t=this.length,e=this.promise,i=this._input,n=0;e._state===d&&t>n;n++)this._eachEntry(i[n],n)},r.prototype._eachEntry=function(t,e){var i=this._instanceConstructor;s(t)?t.constructor===i&&t._state!==d?(t._onerror=null,this._settledAt(t._state,e,t._result)):this._willSettleAt(i.resolve(t),e):(this._remaining--,this._result[e]=this._makeResult(l,e,t))},r.prototype._settledAt=function(t,e,i){var n=this.promise;n._state===d&&(this._remaining--,this._abortOnReject&&t===p?h(n,i):this._result[e]=this._makeResult(t,e,i)),0===this._remaining&&u(n,this._result)},r.prototype._makeResult=function(t,e,i){return i},r.prototype._willSettleAt=function(t,e){var i=this;c(t,void 0,function(t){i._settledAt(l,e,t)},function(t){i._settledAt(p,e,t)})}}),e("rsvp/events",["exports"],function(t){"use strict";function e(t,e){for(var i=0,n=t.length;n>i;i++)if(t[i]===e)return i;return-1}function i(t){var e=t._promiseCallbacks;return e||(e=t._promiseCallbacks={}),e}t["default"]={mixin:function(t){return t.on=this.on,t.off=this.off,t.trigger=this.trigger,t._promiseCallbacks=void 0,t},on:function(t,n){var r,o=i(this);r=o[t],r||(r=o[t]=[]),-1===e(r,n)&&r.push(n)},off:function(t,n){var r,o,s=i(this);return n?(r=s[t],o=e(r,n),void(-1!==o&&r.splice(o,1))):void(s[t]=[])},trigger:function(t,e){var n,r,o=i(this);if(n=o[t])for(var s=0;sa;a++)s[a]=e(t[a]);return n.all(s,i).then(function(e){for(var i=new Array(o),n=0,r=0;o>r;r++)e[r]&&(i[n]=t[r],n++);return i.length=n,i})})}}),e("rsvp/hash-settled",["./promise","./enumerator","./promise-hash","./utils","exports"],function(t,e,i,n,r){"use strict";function o(t,e,i){this._superConstructor(t,e,!1,i)}var s=t["default"],a=e.makeSettledResult,h=i["default"],u=e["default"],c=n.o_create;o.prototype=c(h.prototype),o.prototype._superConstructor=u,o.prototype._makeResult=a,o.prototype._validationError=function(){return new Error("hashSettled must be called with an object")},r["default"]=function(t,e){return new o(s,t,e).promise}}),e("rsvp/hash",["./promise","./promise-hash","./enumerator","exports"],function(t,e,i,n){"use strict";{var r=t["default"],o=e["default"];i.ABORT_ON_REJECTION}n["default"]=function(t,e){return new o(r,t,e).promise}}),e("rsvp/instrument",["./config","./utils","exports"],function(t,e,i){"use strict";var n=t.config,r=e.now,o=[];i["default"]=function(t,e,i){1===o.push({name:t,payload:{guid:e._guidKey+e._id,eventName:t,detail:e._result,childGuid:i&&e._guidKey+i._id,label:e._label,timeStamp:r(),stack:new Error(e._label).stack}})&&setTimeout(function(){for(var t,e=0;ea;a++)s[a]=e(t[a]);return n.all(s,i)})}}),e("rsvp/node",["./promise","./utils","exports"],function(t,e,i){"use strict";var n=t["default"],r=e.isArray;i["default"]=function(t,e){function i(){for(var i=arguments.length,r=new Array(i),a=0;i>a;a++)r[a]=arguments[a];var h;return o||s||!e?h=this:("object"==typeof console&&console.warn('Deprecation: RSVP.denodeify() doesn\'t allow setting the "this" binding anymore. Use yourFunction.bind(yourThis) instead.'),h=e),n.all(r).then(function(i){function r(n,r){function a(){for(var t=arguments.length,i=new Array(t),a=0;t>a;a++)i[a]=arguments[a];var h=i[0],u=i[1];if(h)r(h);else if(o)n(i.slice(1));else if(s){var c,l,p={},d=i.slice(1);for(l=0;la;a++)o=i[a],this._eachEntry(o.entry,o.position)}}),e("rsvp/promise",["./config","./events","./instrument","./utils","./-internal","./promise/cast","./promise/all","./promise/race","./promise/resolve","./promise/reject","exports"],function(t,e,i,n,r,o,s,a,h,u,c){"use strict";function l(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function p(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function d(t,e){this._id=R++,this._label=e,this._subscribers=[],f.instrument&&g("created",this),v!==t&&(y(t)||l(),this instanceof d||p(),E(this,t))}var f=t.config,g=(e["default"],i["default"]),y=(n.objectOrFunction,n.isFunction),m=n.now,v=r.noop,S=(r.resolve,r.reject,r.fulfill,r.subscribe),E=r.initializePromise,P=r.invokeCallback,B=r.FULFILLED,w=o["default"],b=s["default"],U=a["default"],J=h["default"],x=u["default"],C="rsvp_"+m()+"-",R=0;c["default"]=d,d.cast=w,d.all=b,d.race=U,d.resolve=J,d.reject=x,d.prototype={constructor:d,_id:void 0,_guidKey:C,_label:void 0,_state:void 0,_result:void 0,_subscribers:void 0,_onerror:function(t){f.trigger("error",t)},then:function(t,e,i){var n=this;n._onerror=null;var r=new this.constructor(v,i),o=n._state,s=n._result;return f.instrument&&g("chained",n,r),o===B&&t?f.async(function(){P(o,r,t,s)}):S(n,r,t,e),r},"catch":function(t,e){return this.then(null,t,e)},"finally":function(t,e){var i=this.constructor;return this.then(function(e){return i.resolve(t()).then(function(){return e})},function(e){return i.resolve(t()).then(function(){throw e})},e)}}}),e("rsvp/promise/all",["../enumerator","exports"],function(t,e){"use strict";var i=t["default"];e["default"]=function(t,e){return new i(this,t,!0,e).promise}}),e("rsvp/promise/cast",["./resolve","exports"],function(t,e){"use strict";var i=t["default"];e["default"]=i}),e("rsvp/promise/race",["../utils","../-internal","exports"],function(t,e,i){"use strict";var n=t.isArray,r=(t.isFunction,t.isMaybeThenable,e.noop),o=e.resolve,s=e.reject,a=e.subscribe,h=e.PENDING;i["default"]=function(t,e){function i(t){o(l,t)}function u(t){s(l,t)}var c=this,l=new c(r,e);if(!n(t))return s(l,new TypeError("You must pass an array to race.")),l;for(var p=t.length,d=0;l._state===h&&p>d;d++)a(c.resolve(t[d]),void 0,i,u);return l}}),e("rsvp/promise/reject",["../-internal","exports"],function(t,e){"use strict";var i=t.noop,n=t.reject;e["default"]=function(t,e){var r=this,o=new r(i,e);return n(o,t),o}}),e("rsvp/promise/resolve",["../-internal","exports"],function(t,e){"use strict";var i=t.noop,n=t.resolve;e["default"]=function(t,e){var r=this;if(t&&"object"==typeof t&&t.constructor===r)return t;var o=new r(i,e);return n(o,t),o}}),e("rsvp/race",["./promise","exports"],function(t,e){"use strict";var i=t["default"];e["default"]=function(t,e){return i.race(t,e)}}),e("rsvp/reject",["./promise","exports"],function(t,e){"use strict";var i=t["default"];e["default"]=function(t,e){return i.reject(t,e)}}),e("rsvp/resolve",["./promise","exports"],function(t,e){"use strict";var i=t["default"];e["default"]=function(t,e){return i.resolve(t,e)}}),e("rsvp/rethrow",["exports"],function(t){"use strict";t["default"]=function(t){throw setTimeout(function(){throw t}),t}}),e("rsvp/utils",["exports"],function(t){"use strict";function e(t){return"function"==typeof t||"object"==typeof t&&null!==t}function i(t){return"function"==typeof t}function n(t){return"object"==typeof t&&null!==t}t.objectOrFunction=e,t.isFunction=i,t.isMaybeThenable=n;var r;r=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var o=r;t.isArray=o;var s=Date.now||function(){return(new Date).getTime()};t.now=s;var a=Object.create||function(t){var e=function(){};return e.prototype=t,e};t.o_create=a}),e("rsvp",["./rsvp/promise","./rsvp/events","./rsvp/node","./rsvp/all","./rsvp/all-settled","./rsvp/race","./rsvp/hash","./rsvp/hash-settled","./rsvp/rethrow","./rsvp/defer","./rsvp/config","./rsvp/map","./rsvp/resolve","./rsvp/reject","./rsvp/filter","./rsvp/asap","exports"],function(t,e,i,n,r,o,s,a,h,u,c,l,p,d,f,g,y){"use strict";function m(t,e){T.async(t,e)}function v(){T.on.apply(T,arguments)}function S(){T.off.apply(T,arguments)}var E=t["default"],P=e["default"],B=i["default"],w=n["default"],b=r["default"],U=o["default"],J=s["default"],x=a["default"],C=h["default"],R=u["default"],T=c.config,_=c.configure,k=l["default"],N=p["default"],F=d["default"],q=f["default"],L=g["default"];if(T.async=L,"undefined"!=typeof window&&"object"==typeof window.__PROMISE_INSTRUMENTATION__){var O=window.__PROMISE_INSTRUMENTATION__;_("instrument",!0);for(var I in O)O.hasOwnProperty(I)&&v(I,O[I])}y.Promise=E,y.EventTarget=P,y.all=w,y.allSettled=b,y.race=U,y.hash=J,y.hashSettled=x,y.rethrow=C,y.defer=R,y.denodeify=B,y.configure=_,y.on=v,y.off=S,y.resolve=N,y.reject=F,y.async=m,y.map=k,y.filter=q}),t.RSVP=i("rsvp")}(self),EPUBJS.core={},EPUBJS.core.request=function(t,e,i,n){function r(){if(this.readyState===this.DONE)if(200===this.status||this.responseXML){var t;t="xml"==e?this.responseXML?this.responseXML:(new DOMParser).parseFromString(this.response,"text/xml"):"json"==e?JSON.parse(this.response):"blob"==e?s?this.response:new Blob([this.response]):this.response,h.resolve(t)}else h.reject({status:this.status,message:this.response,stack:(new Error).stack})}var o,s=window.URL,a=s?"blob":"arraybuffer",h=new RSVP.defer,u=new XMLHttpRequest,c=XMLHttpRequest.prototype;"overrideMimeType"in c||Object.defineProperty(c,"overrideMimeType",{value:function(){}}),i&&(u.withCredentials=!0),u.open("GET",t,!0);for(o in n)u.setRequestHeader(o,n[o]);return u.onreadystatechange=r,"blob"==e&&(u.responseType=a),"json"==e&&u.setRequestHeader("Accept","application/json"),"xml"==e&&u.overrideMimeType("text/xml"),u.send(),h.promise},EPUBJS.core.uri=function(t){var e,i,n,r={protocol:"",host:"",path:"",origin:"",directory:"",base:"",filename:"",extension:"",fragment:"",href:t},o=t.indexOf("://"),s=t.indexOf("?"),a=t.indexOf("#");return-1!=a&&(r.fragment=t.slice(a+1),t=t.slice(0,a)),-1!=s&&(r.search=t.slice(s+1),t=t.slice(0,s),href=t),-1!=o?(r.protocol=t.slice(0,o),e=t.slice(o+3),n=e.indexOf("/"),-1===n?(r.host=r.path,r.path=""):(r.host=e.slice(0,n),r.path=e.slice(n)),r.origin=r.protocol+"://"+r.host,r.directory=EPUBJS.core.folder(r.path),r.base=r.origin+r.directory):(r.path=t,r.directory=EPUBJS.core.folder(t),r.base=r.directory),r.filename=t.replace(r.base,""),i=r.filename.lastIndexOf("."),-1!=i&&(r.extension=r.filename.slice(i+1)),r},EPUBJS.core.folder=function(t){var e=t.lastIndexOf("/");if(-1==e)var i="";return i=t.slice(0,e+1)},EPUBJS.core.queue=function(t){var e=[],i=t,n=function(t,i,n){return e.push({funcName:t,args:i,context:n}),e},r=function(){var t;e.length&&(t=e.shift(),i[t.funcName].apply(t.context||i,t.args))},o=function(){for(;e.length;)r()},s=function(){e=[]},a=function(){return e.length};return{enqueue:n,dequeue:r,flush:o,clear:s,length:a}},EPUBJS.core.isElement=function(t){return!(!t||1!=t.nodeType)},EPUBJS.core.uuid=function(){var t=(new Date).getTime(),e="xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){var i=(t+16*Math.random())%16|0;return t=Math.floor(t/16),("x"==e?i:7&i|8).toString(16)});return e},EPUBJS.core.values=function(t){for(var e=-1,i=Object.keys(t),n=i.length,r=Array(n);++er;r++)if("undefined"!=typeof document.body.style[e[r]+i])return e[r]+i;return t},EPUBJS.core.defaults=function(t){for(var e=1,i=arguments.length;i>e;e++){var n=arguments[e];for(var r in n)void 0===t[r]&&(t[r]=n[r])}return t},EPUBJS.core.extend=function(t){var e=[].slice.call(arguments,1);return e.forEach(function(e){e&&Object.getOwnPropertyNames(e).forEach(function(i){Object.defineProperty(t,i,Object.getOwnPropertyDescriptor(e,i))})}),t},EPUBJS.core.insert=function(t,e,i){var n=EPUBJS.core.locationOf(t,e,i);return e.splice(n,0,t),n},EPUBJS.core.locationOf=function(t,e,i,n,r){var o,s=n||0,a=r||e.length,h=parseInt(s+(a-s)/2);return i||(i=function(t,e){return t>e?1:e>t?-1:(t=e)?0:void 0}),0>=a-s?h:(o=i(e[h],t),a-s===1?o>0?h:h+1:0===o?h:-1===o?EPUBJS.core.locationOf(t,e,i,h,a):EPUBJS.core.locationOf(t,e,i,s,h))},EPUBJS.core.indexOfSorted=function(t,e,i,n,r){var o,s=n||0,a=r||e.length,h=parseInt(s+(a-s)/2);return i||(i=function(t,e){return t>e?1:e>t?-1:(t=e)?0:void 0}),0>=a-s?-1:(o=i(e[h],t),a-s===1?0===o?h:-1:0===o?h:-1===o?EPUBJS.core.indexOfSorted(t,e,i,h,a):EPUBJS.core.indexOfSorted(t,e,i,s,h))},EPUBJS.core.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame,EPUBJS.core.bounds=function(t){var e=window.getComputedStyle(t),i=["width","paddingRight","paddingLeft","marginRight","marginLeft","borderRightWidth","borderLeftWidth"],n=["height","paddingTop","paddingBottom","marginTop","marginBottom","borderTopWidth","borderBottomWidth"],r=0,o=0;return i.forEach(function(t){r+=parseFloat(e[t])||0}),n.forEach(function(t){o+=parseFloat(e[t])||0}),{height:o,width:r}},EPUBJS.core.borders=function(t){var e=window.getComputedStyle(t),i=["paddingRight","paddingLeft","marginRight","marginLeft","borderRightWidth","borderLeftWidth"],n=["paddingTop","paddingBottom","marginTop","marginBottom","borderTopWidth","borderBottomWidth"],r=0,o=0;return i.forEach(function(t){r+=parseFloat(e[t])||0}),n.forEach(function(t){o+=parseFloat(e[t])||0}),{height:o,width:r}},EPUBJS.core.windowBounds=function(){var t=window.innerWidth,e=window.innerHeight;return{top:0,left:0,right:t,bottom:e,width:t,height:e}},EPUBJS.core.cleanStringForXpath=function(t){var e=t.match(/[^'"]+|['"]/g);return e=e.map(function(t){return"'"===t?'"\'"':'"'===t?"'\"'":"'"+t+"'"}),"concat('',"+e.join(",")+")"},EPUBJS.core.indexOfTextNode=function(t){for(var e,i=t.parentNode,n=i.childNodes,r=-1,o=0;oi?this.hooks[i].apply(this.context,r):void 0}.bind(this))):(t=n.promise,n.resolve()),t},EPUBJS.Parser=function(){},EPUBJS.Parser.prototype.container=function(t){var e,i,n,r;return t?(e=t.querySelector("rootfile"))?(i=e.getAttribute("full-path"),n=EPUBJS.core.uri(i).directory,r=t.xmlEncoding,{packagePath:i,basePath:n,encoding:r}):void console.error("No RootFile Found"):void console.error("Container File Not Found")},EPUBJS.Parser.prototype.identifier=function(t){var e;return t?(e=t.querySelector("metadata"),e?this.getElementText(e,"identifier"):void console.error("No Metadata Found")):void console.error("Package File Not Found")},EPUBJS.Parser.prototype.packageContents=function(t){var e,i,n,r,o,s,a,h,u,c=this;return t?(e=t.querySelector("metadata"))?(i=t.querySelector("manifest"))?(n=t.querySelector("spine"))?(r=c.manifest(i),o=c.findNavPath(i),s=c.findNcxPath(i),a=c.findCoverPath(i),h=Array.prototype.indexOf.call(n.parentNode.childNodes,n),u=c.spine(n,r),{metadata:c.metadata(e),spine:u,manifest:r,navPath:o,ncxPath:s,coverPath:a,spineNodeIndex:h}):void console.error("No Spine Found"):void console.error("No Manifest Found"):void console.error("No Metadata Found"):void console.error("Package File Not Found")},EPUBJS.Parser.prototype.findNavPath=function(t){var e=t.querySelector("item[properties^='nav']");return e?e.getAttribute("href"):!1},EPUBJS.Parser.prototype.findNcxPath=function(t){var e=t.querySelector("item[media-type='application/x-dtbncx+xml']");return e?e.getAttribute("href"):!1},EPUBJS.Parser.prototype.findCoverPath=function(t){var e=t.querySelector("item[properties='cover-image']");return e?e.getAttribute("href"):!1},EPUBJS.Parser.prototype.metadata=function(t){var e={},i=this;return e.title=i.getElementText(t,"title"),e.creator=i.getElementText(t,"creator"),e.description=i.getElementText(t,"description"),e.pubdate=i.getElementText(t,"date"),e.publisher=i.getElementText(t,"publisher"),e.identifier=i.getElementText(t,"identifier"),e.language=i.getElementText(t,"language"),e.rights=i.getElementText(t,"rights"),e.modified_date=i.querySelectorText(t,"meta[property='dcterms:modified']"),e.layout=i.querySelectorText(t,"meta[property='rendition:layout']"),e.orientation=i.querySelectorText(t,"meta[property='rendition:orientation']"),e.spread=i.querySelectorText(t,"meta[property='rendition:spread']"),e},EPUBJS.Parser.prototype.getElementText=function(t,e){var i,n=t.getElementsByTagNameNS("http://purl.org/dc/elements/1.1/",e);return n&&0!==n.length?(i=n[0],i.childNodes.length?i.childNodes[0].nodeValue:""):""},EPUBJS.Parser.prototype.querySelectorText=function(t,e){var i=t.querySelector(e);return i&&i.childNodes.length?i.childNodes[0].nodeValue:""},EPUBJS.Parser.prototype.manifest=function(t){var e={},i=t.querySelectorAll("item"),n=Array.prototype.slice.call(i);return n.forEach(function(t){var i=t.getAttribute("id"),n=t.getAttribute("href")||"",r=t.getAttribute("media-type")||"",o=t.getAttribute("properties")||"";e[i]={href:n,type:r,properties:o.length?o.split(" "):[]}}),e},EPUBJS.Parser.prototype.spine=function(t){{var e=[],i=t.getElementsByTagName("itemref"),n=Array.prototype.slice.call(i);new EPUBJS.EpubCFI}return n.forEach(function(t,i){var n=t.getAttribute("idref"),r=t.getAttribute("properties")||"",o=r.length?r.split(" "):[],s={idref:n,linear:t.getAttribute("linear")||"",properties:o,index:i};e.push(s)}),e},EPUBJS.Parser.prototype.nav=function(t){function e(t){var e=[];return Array.prototype.slice.call(t.childNodes).forEach(function(t){"ol"==t.tagName&&Array.prototype.slice.call(t.childNodes).forEach(function(t){"li"==t.tagName&&e.push(t)})}),e}function i(t){var e=null;return Array.prototype.slice.call(t.childNodes).forEach(function(t){("a"==t.tagName||"span"==t.tagName)&&(e=t)}),e}function n(t){var r=[],o=e(t),s=Array.prototype.slice.call(o),a=s.length;return 0===a?!1:(s.forEach(function(e){var o=e.getAttribute("id")||!1,s=i(e),a=s.getAttribute("href")||"",h=s.textContent||"",u=a.split("#"),c=(u[0],n(e));r.push({id:o,href:a,label:h,subitems:c,parent:t?t.getAttribute("id"):null})}),r)}var r=t.querySelector('nav[*|type="toc"]');return r?n(r):[]},EPUBJS.Parser.prototype.ncx=function(t){function e(i){var n=[],r=t.evaluate("*[local-name()='navPoint']",i,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),o=r.snapshotLength;if(0===o)return[];for(var s=o-1;s>=0;s--){var a=r.snapshotItem(s),h=a.getAttribute("id")||!1,u=a.querySelector("content"),c=u.getAttribute("src"),l=a.querySelector("navLabel"),p=l.textContent?l.textContent:"",d=c.split("#"),f=(d[0],e(a));n.unshift({id:h,href:c,label:p,subitems:f,parent:i?i.getAttribute("id"):null})}return n}var i=t.querySelector("navMap");return i?e(i):[]},EPUBJS.EpubCFI=function(t){return t?this.parse(t):void 0},EPUBJS.EpubCFI.prototype.generateChapterComponent=function(t,e,i){var n=parseInt(e),r=t+1,o="/"+r+"/";return o+=2*(n+1),i&&(o+="["+i+"]"),o},EPUBJS.EpubCFI.prototype.generatePathComponent=function(t){var e=[];return t.forEach(function(t){var i="";i+=2*(t.index+1),t.id&&(i+="["+t.id+"]"),e.push(i)}),e.join("/")},EPUBJS.EpubCFI.prototype.generateCfiFromElement=function(t,e){var i=this.pathTo(t),n=this.generatePathComponent(i);return n.length?"epubcfi("+e+"!"+n+"/1:0)":"epubcfi("+e+"!/4/)"},EPUBJS.EpubCFI.prototype.pathTo=function(t){for(var e,i=[];t&&null!==t.parentNode&&9!=t.parentNode.nodeType;)e=t.parentNode.children,i.unshift({id:t.id,tagName:t.tagName,index:e?Array.prototype.indexOf.call(e,t):0}),t=t.parentNode;return i},EPUBJS.EpubCFI.prototype.getChapterComponent=function(t){var e=t.split("!");return e[0]},EPUBJS.EpubCFI.prototype.getPathComponent=function(t){var e=t.split("!"),i=e[1]?e[1].split(":"):"";return i[0]},EPUBJS.EpubCFI.prototype.getCharecterOffsetComponent=function(t){var e=t.split(":");return e[1]||""},EPUBJS.EpubCFI.prototype.parse=function(t){var e,i,n,r,o,s,a,h,u,c={},l=function(t){var e,i,n,r;return e="element",i=parseInt(t)/2-1,n=t.match(/\[(.*)\]/),n&&n[1]&&(r=n[1]),{type:e,index:i,id:r||!1}};return"string"!=typeof t?{spinePos:-1}:(c.str=t,0===t.indexOf("epubcfi(")&&")"===t[t.length-1]&&(t=t.slice(8,t.length-1)),i=this.getChapterComponent(t),n=this.getPathComponent(t)||"",r=this.getCharecterOffsetComponent(t),i&&(e=i.split("/")[2]||"")?(c.spinePos=parseInt(e)/2-1||0,s=e.match(/\[(.*)\]/),c.spineId=s?s[1]:!1,-1!=n.indexOf(",")&&console.warn("CFI Ranges are not supported"),a=n.split("/"),h=a.pop(),c.steps=[],a.forEach(function(t){var e;t&&(e=l(t),c.steps.push(e))}),u=parseInt(h),isNaN(u)||c.steps.push(u%2===0?l(h):{type:"text",index:(u-1)/2}),o=r.match(/\[(.*)\]/),o&&o[1]?(c.characterOffset=parseInt(r.split("[")[0]),c.textLocationAssertion=o[1]):c.characterOffset=parseInt(r),c):{spinePos:-1})},EPUBJS.EpubCFI.prototype.addMarker=function(t,e,i){var n,r,o,s,a=e||document,h=i||this.createMarker(a);return"string"==typeof t&&(t=this.parse(t)),r=t.steps[t.steps.length-1],-1===t.spinePos?!1:(n=this.findParent(t,a))?(r&&"text"===r.type?(o=n.childNodes[r.index],t.characterOffset?(s=o.splitText(t.characterOffset),h.classList.add("EPUBJS-CFI-SPLIT"),n.insertBefore(h,s)):n.insertBefore(h,o)):n.insertBefore(h,n.firstChild),h):!1},EPUBJS.EpubCFI.prototype.createMarker=function(t){var e=t||document,i=e.createElement("span");return i.id="EPUBJS-CFI-MARKER:"+EPUBJS.core.uuid(),i.classList.add("EPUBJS-CFI-MARKER"),i},EPUBJS.EpubCFI.prototype.removeMarker=function(t,e){t.classList.contains("EPUBJS-CFI-SPLIT")?(nextSib=t.nextSibling,prevSib=t.previousSibling,nextSib&&prevSib&&3===nextSib.nodeType&&3===prevSib.nodeType&&(prevSib.textContent+=nextSib.textContent,t.parentNode.removeChild(nextSib)),t.parentNode.removeChild(t)):t.classList.contains("EPUBJS-CFI-MARKER")&&t.parentNode.removeChild(t)},EPUBJS.EpubCFI.prototype.findParent=function(t,e){var i,n,r,o=e||document,s=o.getElementsByTagName("html")[0],a=Array.prototype.slice.call(s.children);if("string"==typeof t&&(t=this.parse(t)),n=t.steps.slice(0),!n.length)return o.getElementsByTagName("body")[0];for(;n&&n.length>0;){if(i=n.shift(),"text"===i.type?(r=s.childNodes[i.index],s=r.parentNode||s):s=i.id?o.getElementById(i.id):a[i.index],"undefined"==typeof s)return console.error("No Element For",i,t.str),!1;a=Array.prototype.slice.call(s.children)}return s},EPUBJS.EpubCFI.prototype.compare=function(t,e){if("string"==typeof t&&(t=new EPUBJS.EpubCFI(t)),"string"==typeof e&&(e=new EPUBJS.EpubCFI(e)),t.spinePos>e.spinePos)return 1;if(t.spinePose.steps[i].index)return 1;if(t.steps[i].indexe.characterOffset?1:t.characterOffset=0?(o=r.length,t.characterOffset-1?(delete this.spineByHref[t.href],delete this.spineById[t.idref],this.spineItems.splice(e,1)):void 0},EPUBJS.replace={},EPUBJS.replace.links=function(t,e){for(var i=new RSVP.defer,n=t.document.querySelectorAll("a[href]"),r=function(t){var i=t.getAttribute("href"),n=new EPUBJS.core.uri(i);n.protocol?t.setAttribute("target","_blank"):0===i.indexOf("#")||(t.onclick=function(){return e.display(i),!1})},o=0;o-1&&(this.observer=this.observe(this.document.body)),this.imageLoadListeners(),this.mediaQueryListeners()},EPUBJS.View.prototype.expand=function(){var t=this.lockedWidth,e=this.lockedHeight;t&&!e&&(e=this.document.documentElement.scrollHeight,this.resize(null,e)),e&&!t&&(t=this.document.body.scrollWidth,this.resize(t,null))},EPUBJS.View.prototype.mediaQueryListeners=function(){for(var t=this.document.styleSheets,e=function(t){t.matches&&this.expand()}.bind(this),i=0;i-1&&(id=t.substring(t.indexOf("#")),el=this.document.getElementById(id)))return el.getBoundingClientRect();return{left:0,top:0}}},RSVP.EventTarget.mixin(EPUBJS.View.prototype),EPUBJS.Layout=EPUBJS.Layout||{},EPUBJS.Layout.Reflowable=function(){},EPUBJS.Layout.Reflowable.prototype.calculate=function(t,e,i,n){var r,o,s,a=n||1,h=Math.floor(t),u=h%2===0?h:h-1,c=Math.floor(u/8),l=i>=0?i:c%2===0?c:c-1;r=a>1?Math.floor((u-l)/a):u,o=r*a,s=(r+l)*a,this.columnAxis=EPUBJS.core.prefixed("columnAxis"),this.columnGap=EPUBJS.core.prefixed("columnGap"),this.columnWidth=EPUBJS.core.prefixed("columnWidth"),this.columnFill=EPUBJS.core.prefixed("columnFill"),this.width=u,this.height=e,this.spread=o,this.delta=s,this.column=r,this.gap=l,this.divisor=a},EPUBJS.Layout.Reflowable.prototype.format=function(t){var e=t.document.documentElement,i=t.document.body;e.style.overflow="hidden",i.style.width=this.width+"px",i.style.height=this.height+"px",i.style[this.columnAxis]="horizontal",i.style[this.columnFill]="auto",i.style[this.columnGap]=this.gap+"px",i.style[this.columnWidth]=this.column+"px",t.iframe.style.marginRight=this.gap+"px"},EPUBJS.Layout.Reflowable.prototype.count=function(t){var e=t.root().scrollWidth,i=Math.ceil(e/this.spread);return{spreads:i,pages:i*this.divisor}},EPUBJS.Layout.Fixed=function(){},EPUBJS.Layout.Fixed.prototype.calculate=function(){},EPUBJS.Layout.Fixed.prototype.format=function(t){var e,i,n=t.document.documentElement,r=documentElement.querySelector("[name=viewport");r&&r.hasAttribute("content")&&(content=r.getAttribute("content"),contents=content.split(","),contents[0]&&(e=contents[0].replace("width=","")),contents[1]&&(i=contents[1].replace("height=",""))),t.resize(e,i),n.style.overflow="auto"},EPUBJS.Layout.Fixed.prototype.count=function(){return{spreads:1,pages:1}},EPUBJS.Layout.Scroll=function(){},EPUBJS.Layout.Scroll.prototype.calculate=function(t){this.spread=t,this.column=t,this.gap=0},EPUBJS.Layout.Scroll.prototype.format=function(t){var e=t.document.documentElement;e.style.width="auto",e.style.height="auto"},EPUBJS.Layout.Scroll.prototype.count=function(){return{spreads:1,pages:1}},EPUBJS.Rendition=function(t,e){this.settings=EPUBJS.core.extend(this.settings||{},{infinite:!0,hidden:!1,width:!1,height:null,layoutOveride:null,axis:"vertical"}),EPUBJS.core.extend(this.settings,e),this.viewSettings={},this.book=t,this.views=[],this.hooks={},this.hooks.display=new EPUBJS.Hook(this),this.hooks.layout=new EPUBJS.Hook(this),this.hooks.replacements=new EPUBJS.Hook(this),this.hooks.replacements.register(EPUBJS.replace.links.bind(this)),this.epubcfi=new EPUBJS.EpubCFI,this.q=new EPUBJS.Queue(this),this.q.enqueue(this.book.opened),this.q.enqueue(this.parseLayoutProperties)},EPUBJS.Rendition.prototype.initialize=function(t){{var e,i=t||{},n=i.height,r=i.width;i.hidden||!1}return i.height&&EPUBJS.core.isNumber(i.height)&&(n=i.height+"px"),i.width&&EPUBJS.core.isNumber(i.width)&&(r=i.width+"px"),e=document.createElement("div"),e.id="epubjs-container:"+EPUBJS.core.uuid(),e.classList.add("epub-container"),e.style.fontSize="0",e.style.wordSpacing="0",e.style.lineHeight="0",e.style.verticalAlign="top","horizontal"===this.settings.axis&&(e.style.whiteSpace="nowrap"),r&&(e.style.width=r),n&&(e.style.height=n),e.style.overflow=this.settings.overflow,e},EPUBJS.Rendition.wrap=function(t){var e=document.createElement("div");return e.style.visibility="hidden",e.style.overflow="hidden",e.style.width="0",e.style.height="0",e.appendChild(t),e},EPUBJS.Rendition.prototype.attachTo=function(t){return this.container=this.initialize({width:this.settings.width,height:this.settings.height}),EPUBJS.core.isElement(t)?this.element=t:"string"==typeof t&&(this.element=document.getElementById(t)),this.element?(this.settings.hidden?(this.wrapper=this.wrap(this.container),this.element.appendChild(this.wrapper)):this.element.appendChild(this.container),this.attachListeners(),this.stageSize(),this.layoutMethod(),void this.trigger("attached")):void console.error("Not an Element")},EPUBJS.Rendition.prototype.attachListeners=function(){EPUBJS.core.isNumber(this.settings.width)&&EPUBJS.core.isNumber(this.settings.height)||window.addEventListener("resize",this.onResized.bind(this),!1)},EPUBJS.Rendition.prototype.bounds=function(){return this.container.getBoundingClientRect()},EPUBJS.Rendition.prototype.display=function(t){return this.q.enqueue(this._display,t)},EPUBJS.Rendition.prototype._display=function(t){var e,i,n,r,o=new RSVP.defer,s=o.promise;return this.epubcfi.isCfiString(t)?(n=this.epubcfi.parse(t),r=n.spinePos,e=this.book.spine.get(r)):e=this.book.spine.get(t),this.displaying=!0,this.hide(),e?(i=this.createView(e),this.q.enqueue(this.append,i),this.show(),this.hooks.display.trigger(i),o.resolve(this)):o.reject(new Error("No Section Found")),s},EPUBJS.Rendition.prototype.moveTo=function(){},EPUBJS.Rendition.prototype.render=function(t,e){return t.create(),t.onLayout=this.layout.format.bind(this.layout),this.resizeView(t),t.render(this.book.request).then(function(){return this.hooks.replacements.trigger(t,this)}.bind(this)).then(function(){return this.hooks.layout.trigger(t)}.bind(this)).then(function(){return t.display()}.bind(this)).then(function(t){0!=e&&this.hidden===!1&&this.q.enqueue(function(t){t.show()},t),this.trigger("rendered",t.section)}.bind(this)).catch(function(t){this.trigger("loaderror",t)}.bind(this))},EPUBJS.Rendition.prototype.afterDisplayed=function(t){this.trigger("displayed",t.section)},EPUBJS.Rendition.prototype.append=function(t){return this.clear(),this.views.push(t),this.container.appendChild(t.element),t.onDisplayed=this.afterDisplayed.bind(this),this.render(t)},EPUBJS.Rendition.prototype.clear=function(){this.views.forEach(function(t){this._remove(t)}.bind(this)),this.views=[]},EPUBJS.Rendition.prototype.remove=function(t){var e=this.views.indexOf(t);e>-1&&this.views.splice(e,1),this._remove(t)},EPUBJS.Rendition.prototype._remove=function(t){t.off("resized"),t.displayed&&t.destroy(),this.container.removeChild(t.element),t=null},EPUBJS.Rendition.prototype.resizeView=function(t){"pre-paginated"===this.globalLayoutProperties.layout?t.lock("both",this.stage.width,this.stage.height):t.lock("width",this.stage.width,this.stage.height)},EPUBJS.Rendition.prototype.stageSize=function(t,e){var i,n=t||this.settings.width,r=e||this.settings.height;return n===!1&&(i=this.element.getBoundingClientRect(),i.width&&(n=i.width,this.container.style.width=i.width+"px")),r===!1&&(i=i||this.element.getBoundingClientRect(),i.height&&(r=i.height,this.container.style.height=i.height+"px")),n&&!EPUBJS.core.isNumber(n)&&(i=this.container.getBoundingClientRect(),n=i.width),r&&!EPUBJS.core.isNumber(r)&&(i=i||this.container.getBoundingClientRect(),r=i.height),this.containerStyles=window.getComputedStyle(this.container),this.containerPadding={left:parseFloat(this.containerStyles["padding-left"])||0,right:parseFloat(this.containerStyles["padding-right"])||0,top:parseFloat(this.containerStyles["padding-top"])||0,bottom:parseFloat(this.containerStyles["padding-bottom"])||0},this.stage={width:n-this.containerPadding.left-this.containerPadding.right,height:r-this.containerPadding.top-this.containerPadding.bottom},this.stage},EPUBJS.Rendition.prototype.layoutMethod=function(){this.layout=new EPUBJS.Layout.Scroll,this.layoutUpdate(),this.map=new EPUBJS.Map(this.layout)},EPUBJS.Rendition.prototype.layoutUpdate=function(){this.layout.calculate(this.stage.width,this.stage.height)},EPUBJS.Rendition.prototype.resize=function(t,e){this.stageSize(t,e),this.layoutUpdate(),this.views.forEach(this.resizeView.bind(this)),this.trigger("resized",{width:this.stage.width,height:this.stage.height})},EPUBJS.Rendition.prototype.onResized=function(){this.resize()},EPUBJS.Rendition.prototype.createView=function(t){return new EPUBJS.View(t,this.viewSettings)},EPUBJS.Rendition.prototype.next=function(){return this.q.enqueue(function(){var t,e;return this.views.length?(t=this.views[0].section.next(),t?(e=this.createView(t),this.append(e)):void 0):void 0})},EPUBJS.Rendition.prototype.prev=function(){return this.q.enqueue(function(){var t,e;return this.views.length?(t=this.views[0].section.prev(),t?(e=this.createView(t),this.append(e)):void 0):void 0})},EPUBJS.Rendition.prototype.parseLayoutProperties=function(t){var e=t||this.book.package.metadata,i=this.layoutOveride&&this.layoutOveride.layout||e.layout||"reflowable",n=this.layoutOveride&&this.layoutOveride.spread||e.spread||"auto",r=this.layoutOveride&&this.layoutOveride.orientation||e.orientation||"auto";return this.globalLayoutProperties={layout:i,spread:n,orientation:r},this.globalLayoutProperties},EPUBJS.Rendition.prototype.current=function(){var t=this.visible();return t.length?t[t.length-1]:null},EPUBJS.Rendition.prototype.isVisible=function(t,e,i,n){var r=t.position(),o=n||this.container.getBoundingClientRect();return"horizontal"===this.settings.axis&&r.right>o.left-e&&!(r.left>=o.right+i)?!0:"vertical"===this.settings.axis&&r.bottom>o.top-e&&!(r.top>=o.bottom+i)?!0:!1},EPUBJS.Rendition.prototype.visible=function(){for(var t,e,i=this.bounds(),n=[],r=0;r=0;r--)if(t=this.views[r],e=t.bounds().top,ethis.settings.offsetDelta||this.scrollDeltaHorz>this.settings.offsetDelta)&&(this.q.enqueue(this.check),this.scrollDeltaVert=0,this.scrollDeltaHorz=0),this.scrollDeltaVert+=Math.abs(scrollTop-this.prevScrollTop),this.scrollDeltaHorz+=Math.abs(scrollLeft-this.prevScrollLeft),this.settings.height?(this.prevScrollTop=this.container.scrollTop,this.prevScrollLeft=this.container.scrollLeft):(this.prevScrollTop=window.scrollY,this.prevScrollLeft=window.scrollX),clearTimeout(this.scrollTimeout),this.scrollTimeout=setTimeout(function(){this.scrollDeltaVert=0,this.scrollDeltaHorz=0 -}.bind(this),150),this.scrolled=!1),this.tick.call(window,this.onScroll.bind(this))},EPUBJS.Continuous.prototype.scrollBy=function(t,e,i){i&&(this.ignore=!0),this.settings.height?(t&&(this.container.scrollLeft+=t),e&&(this.container.scrollTop+=e)):window.scrollBy(t,e),this.scrolled=!0},EPUBJS.Continuous.prototype.scrollTo=function(t,e,i){i&&(this.ignore=!0),this.settings.height?(this.container.scrollLeft=t,this.container.scrollTop=e):window.scrollTo(t,e),this.scrolled=!0},EPUBJS.Continuous.prototype.resizeView=function(t){"horizontal"===this.settings.axis?t.lock("height",this.stage.width,this.stage.height):t.lock("width",this.stage.width,this.stage.height)},EPUBJS.Continuous.prototype.currentLocation=function(){{var t,e,i=this.visible();this.container.getBoundingClientRect()}return 1===i.length?this.map.page(i[0]):i.length>1?(t=this.map.page(i[0]),e=this.map.page(i[i.length-1]),{start:t.start,end:e.end}):void 0},EPUBJS.Paginate=function(t,e){EPUBJS.Continuous.apply(this,arguments),this.settings=EPUBJS.core.extend(this.settings||{},{width:600,height:400,axis:"horizontal",forceSingle:!1,minSpreadWidth:800,gap:"auto",overflow:"hidden",infinite:!1}),EPUBJS.core.extend(this.settings,e),this.isForcedSingle=!1,this.viewSettings={axis:this.settings.axis},this.start()},EPUBJS.Paginate.prototype=Object.create(EPUBJS.Continuous.prototype),EPUBJS.Paginate.prototype.constructor=EPUBJS.Paginate,EPUBJS.Paginate.prototype.determineSpreads=function(t){return this.isForcedSingle||!t||this.bounds().width1?(t=a.left-s[0].position().left,i=t+this.layout.column,e=a.left+this.layout.spread-s[s.length-1].position().left,n=e+this.layout.column,r=this.map.page(s[0],t,i),o=this.map.page(s[s.length-1],e,n),{start:r.start,end:o.end}):void 0},EPUBJS.Paginate.prototype.resize=function(t,e){this.q.clear(),this.stageSize(t,e),this.layoutUpdate(),this.display(this.location.start),this.trigger("resized",{width:this.stage.width,height:this.stage.height})},EPUBJS.Paginate.prototype.onResized=function(){this.clear(),clearTimeout(this.resizeTimeout),this.resizeTimeout=setTimeout(function(){this.resize()}.bind(this),150)},EPUBJS.Map=function(t){this.layout=t},EPUBJS.Map.prototype.section=function(t){var e=this.findRanges(t),i=this.rangeListToCfiList(t,e);return i},EPUBJS.Map.prototype.page=function(t,e,i){var n=t.document.body;return this.rangePairToCfiPair(t.section,{start:this.findStart(n,e,i),end:this.findEnd(n,e,i)})},EPUBJS.Map.prototype.walk=function(t,e){for(var i,n,r=document.createTreeWalker(t,NodeFilter.SHOW_TEXT,{acceptNode:function(t){return t.data.trim().length>0?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}},!1);(i=r.nextNode())&&!(n=e(i)););return n},EPUBJS.Map.prototype.findRanges=function(t){for(var e,i,n=[],r=this.layout.count(t),o=this.layout.column,s=this.layout.gap,a=0;a=e&&i>=n?t:r>e?t:(s=t,void o.push(t))}))return this.findTextStartRange(r,e,i);return this.findTextStartRange(s,e,i)},EPUBJS.Map.prototype.findEnd=function(t,e,i){for(var n,r,o=[t],s=t;o.length;)if(n=o.shift(),r=this.walk(n,function(t){var e,n,r,a;return t.nodeType==Node.TEXT_NODE?(a=document.createRange(),a.selectNodeContents(t),r=a.getBoundingClientRect()):r=t.getBoundingClientRect(),e=r.left,n=r.right,e>i&&s?s:n>i?t:(s=t,void o.push(t))}))return this.findTextEndRange(r,e,i);return this.findTextEndRange(s,e,i)},EPUBJS.Map.prototype.findTextStartRange=function(t,e){for(var i,n,r,o=this.splitTextNodeIntoRanges(t),s=0;s=e)return n;i=n}return o[0]},EPUBJS.Map.prototype.findTextEndRange=function(t,e,i){for(var n,r,o,s=this.splitTextNodeIntoRanges(t),a=0;ai&&n)return n;if(o.right>i)return r;n=r}return s[s.length-1]},EPUBJS.Map.prototype.splitTextNodeIntoRanges=function(t,e){var i,n=[],r=t.textContent||"",o=r.trim(),s=t.ownerDocument,a=e||" ";if(pos=o.indexOf(a),-1===pos||t.nodeType!=Node.TEXT_NODE)return i=s.createRange(),i.selectNodeContents(t),[i];for(i=s.createRange(),i.setStart(t,0),i.setEnd(t,pos),n.push(i),i=!1;-1!=pos;)pos=o.indexOf(a,pos+1),pos>0&&(i&&(i.setEnd(t,pos),n.push(i)),i=s.createRange(),i.setStart(t,pos+1));return i&&(i.setEnd(t,o.length),n.push(i)),n},EPUBJS.Map.prototype.rangePairToCfiPair=function(t,e){var i=e.start,n=e.end;return i.collapse(!0),n.collapse(!0),startCfi=t.cfiFromRange(i),endCfi=t.cfiFromRange(n),{start:startCfi,end:endCfi}},EPUBJS.Map.prototype.rangeListToCfiList=function(t,e){for(var i,n=[],r=0;ro;o++){var s=r[o];if(".."===s)n.pop();else{if("."===s)continue;n.push(s)}}return n.join("/")}if(n[e])return n[e];if(n[e]={},!t[e])throw new Error("Could not find module "+e);for(var i,s=t[e],u=s.deps,a=s.callback,c=[],l=0,f=u.length;f>l;l++)c.push("exports"===u[l]?i={}:r(o(u[l])));var p=a.apply(this,c);return n[e]=i||p},r.entries=t}(),e("rsvp/-internal",["./utils","./instrument","./config","exports"],function(t,e,r,n){"use strict";function o(){}function i(t){try{return t.then}catch(e){return R.error=e,R}}function s(t,e,r,n){try{t.call(e,r,n)}catch(o){return o}}function u(t,e,r){j.async(function(t){var n=!1,o=s(r,e,function(r){n||(n=!0,e!==r?l(t,r):p(t,r))},function(e){n||(n=!0,v(t,e))},"Settle: "+(t._label||" unknown promise"));!n&&o&&(n=!0,v(t,o))},t)}function a(t,e){t._onerror=null,e._state===A?p(t,e._result):t._state===T?v(t,e._result):h(e,void 0,function(r){e!==r?l(t,r):p(t,r)},function(e){v(t,e)})}function c(t,e){if(e instanceof t.constructor)a(t,e);else{var r=i(e);r===R?v(t,R.error):void 0===r?p(t,e):w(r)?u(t,e,r):p(t,e)}}function l(t,e){t===e?p(t,e):b(e)?c(t,e):p(t,e)}function f(t){t._onerror&&t._onerror(t._result),d(t)}function p(t,e){t._state===x&&(t._result=e,t._state=A,0===t._subscribers.length?j.instrument&&E("fulfilled",t):j.async(d,t))}function v(t,e){t._state===x&&(t._state=T,t._result=e,j.async(f,t))}function h(t,e,r,n){var o=t._subscribers,i=o.length;t._onerror=null,o[i]=e,o[i+A]=r,o[i+T]=n,0===i&&t._state&&j.async(d,t)}function d(t){var e=t._subscribers,r=t._state;if(j.instrument&&E(r===A?"fulfilled":"rejected",t),0!==e.length){for(var n,o,i=t._result,s=0;st;t+=2){var e=f[t],r=f[t+1];e(r),f[t]=void 0,f[t+1]=void 0}s=0}var s=0;t["default"]=function(t,e){f[s]=t,f[s+1]=e,s+=2,2===s&&u()};var u,a="undefined"!=typeof window?window:{},c=a.MutationObserver||a.WebKitMutationObserver,l="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel,f=new Array(1e3);u="undefined"!=typeof process&&"[object process]"==={}.toString.call(process)?e():c?r():l?n():o()}),e("rsvp/config",["./events","exports"],function(t,e){"use strict";function r(t,e){return"onerror"===t?void o.on("error",e):2!==arguments.length?o[t]:void(o[t]=e)}var n=t["default"],o={instrument:!1};n.mixin(o),e.config=o,e.configure=r}),e("rsvp/defer",["./promise","exports"],function(t,e){"use strict";var r=t["default"];e["default"]=function(t){var e={};return e.promise=new r(function(t,r){e.resolve=t,e.reject=r},t),e}}),e("rsvp/enumerator",["./utils","./-internal","exports"],function(t,e,r){"use strict";function n(t,e,r){return t===f?{state:"fulfilled",value:r}:{state:"rejected",reason:r}}function o(t,e,r,n){this._instanceConstructor=t,this.promise=new t(u,n),this._abortOnReject=r,this._validateInput(e)?(this._input=e,this.length=e.length,this._remaining=e.length,this._init(),0===this.length?c(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&c(this.promise,this._result))):a(this.promise,this._validationError())}var i=t.isArray,s=t.isMaybeThenable,u=e.noop,a=e.reject,c=e.fulfill,l=e.subscribe,f=e.FULFILLED,p=e.REJECTED,v=e.PENDING,h=!0;r.ABORT_ON_REJECTION=h,r.makeSettledResult=n,o.prototype._validateInput=function(t){return i(t)},o.prototype._validationError=function(){return new Error("Array Methods must be provided an Array")},o.prototype._init=function(){this._result=new Array(this.length)},r["default"]=o,o.prototype._enumerate=function(){for(var t=this.length,e=this.promise,r=this._input,n=0;e._state===v&&t>n;n++)this._eachEntry(r[n],n)},o.prototype._eachEntry=function(t,e){var r=this._instanceConstructor;s(t)?t.constructor===r&&t._state!==v?(t._onerror=null,this._settledAt(t._state,e,t._result)):this._willSettleAt(r.resolve(t),e):(this._remaining--,this._result[e]=this._makeResult(f,e,t))},o.prototype._settledAt=function(t,e,r){var n=this.promise;n._state===v&&(this._remaining--,this._abortOnReject&&t===p?a(n,r):this._result[e]=this._makeResult(t,e,r)),0===this._remaining&&c(n,this._result)},o.prototype._makeResult=function(t,e,r){return r},o.prototype._willSettleAt=function(t,e){var r=this;l(t,void 0,function(t){r._settledAt(f,e,t)},function(t){r._settledAt(p,e,t)})}}),e("rsvp/events",["exports"],function(t){"use strict";function e(t,e){for(var r=0,n=t.length;n>r;r++)if(t[r]===e)return r;return-1}function r(t){var e=t._promiseCallbacks;return e||(e=t._promiseCallbacks={}),e}t["default"]={mixin:function(t){return t.on=this.on,t.off=this.off,t.trigger=this.trigger,t._promiseCallbacks=void 0,t},on:function(t,n){var o,i=r(this);o=i[t],o||(o=i[t]=[]),-1===e(o,n)&&o.push(n)},off:function(t,n){var o,i,s=r(this);return n?(o=s[t],i=e(o,n),void(-1!==i&&o.splice(i,1))):void(s[t]=[])},trigger:function(t,e){var n,o,i=r(this);if(n=i[t])for(var s=0;su;u++)s[u]=e(t[u]);return n.all(s,r).then(function(e){for(var r=new Array(i),n=0,o=0;i>o;o++)e[o]&&(r[n]=t[o],n++);return r.length=n,r})})}}),e("rsvp/hash-settled",["./promise","./enumerator","./promise-hash","./utils","exports"],function(t,e,r,n,o){"use strict";function i(t,e,r){this._superConstructor(t,e,!1,r)}var s=t["default"],u=e.makeSettledResult,a=r["default"],c=e["default"],l=n.o_create;i.prototype=l(a.prototype),i.prototype._superConstructor=c,i.prototype._makeResult=u,i.prototype._validationError=function(){return new Error("hashSettled must be called with an object")},o["default"]=function(t,e){return new i(s,t,e).promise}}),e("rsvp/hash",["./promise","./promise-hash","./enumerator","exports"],function(t,e,r,n){"use strict";{var o=t["default"],i=e["default"];r.ABORT_ON_REJECTION}n["default"]=function(t,e){return new i(o,t,e).promise}}),e("rsvp/instrument",["./config","./utils","exports"],function(t,e,r){"use strict";var n=t.config,o=e.now,i=[];r["default"]=function(t,e,r){1===i.push({name:t,payload:{guid:e._guidKey+e._id,eventName:t,detail:e._result,childGuid:r&&e._guidKey+r._id,label:e._label,timeStamp:o(),stack:new Error(e._label).stack}})&&setTimeout(function(){for(var t,e=0;eu;u++)s[u]=e(t[u]);return n.all(s,r)})}}),e("rsvp/node",["./promise","./utils","exports"],function(t,e,r){"use strict";var n=t["default"],o=e.isArray;r["default"]=function(t,e){function r(){for(var r=arguments.length,o=new Array(r),u=0;r>u;u++)o[u]=arguments[u];var a;return i||s||!e?a=this:("object"==typeof console&&console.warn('Deprecation: RSVP.denodeify() doesn\'t allow setting the "this" binding anymore. Use yourFunction.bind(yourThis) instead.'),a=e),n.all(o).then(function(r){function o(n,o){function u(){for(var t=arguments.length,r=new Array(t),u=0;t>u;u++)r[u]=arguments[u];var a=r[0],c=r[1];if(a)o(a);else if(i)n(r.slice(1));else if(s){var l,f,p={},v=r.slice(1);for(f=0;fu;u++)i=r[u],this._eachEntry(i.entry,i.position)}}),e("rsvp/promise",["./config","./events","./instrument","./utils","./-internal","./promise/cast","./promise/all","./promise/race","./promise/resolve","./promise/reject","exports"],function(t,e,r,n,o,i,s,u,a,c,l){"use strict";function f(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}function p(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}function v(t,e){this._id=C++,this._label=e,this._subscribers=[],h.instrument&&d("created",this),y!==t&&(_(t)||f(),this instanceof v||p(),b(this,t))}var h=t.config,d=(e["default"],r["default"]),_=(n.objectOrFunction,n.isFunction),m=n.now,y=o.noop,g=(o.resolve,o.reject,o.fulfill,o.subscribe),b=o.initializePromise,w=o.invokeCallback,E=o.FULFILLED,j=i["default"],x=s["default"],A=u["default"],T=a["default"],R=c["default"],k="rsvp_"+m()+"-",C=0;l["default"]=v,v.cast=j,v.all=x,v.race=A,v.resolve=T,v.reject=R,v.prototype={constructor:v,_id:void 0,_guidKey:k,_label:void 0,_state:void 0,_result:void 0,_subscribers:void 0,_onerror:function(t){h.trigger("error",t)},then:function(t,e,r){var n=this;n._onerror=null;var o=new this.constructor(y,r),i=n._state,s=n._result;return h.instrument&&d("chained",n,o),i===E&&t?h.async(function(){w(i,o,t,s)}):g(n,o,t,e),o},"catch":function(t,e){return this.then(null,t,e)},"finally":function(t,e){var r=this.constructor;return this.then(function(e){return r.resolve(t()).then(function(){return e})},function(e){return r.resolve(t()).then(function(){throw e})},e)}}}),e("rsvp/promise/all",["../enumerator","exports"],function(t,e){"use strict";var r=t["default"];e["default"]=function(t,e){return new r(this,t,!0,e).promise}}),e("rsvp/promise/cast",["./resolve","exports"],function(t,e){"use strict";var r=t["default"];e["default"]=r}),e("rsvp/promise/race",["../utils","../-internal","exports"],function(t,e,r){"use strict";var n=t.isArray,o=(t.isFunction,t.isMaybeThenable,e.noop),i=e.resolve,s=e.reject,u=e.subscribe,a=e.PENDING;r["default"]=function(t,e){function r(t){i(f,t)}function c(t){s(f,t)}var l=this,f=new l(o,e);if(!n(t))return s(f,new TypeError("You must pass an array to race.")),f;for(var p=t.length,v=0;f._state===a&&p>v;v++)u(l.resolve(t[v]),void 0,r,c);return f}}),e("rsvp/promise/reject",["../-internal","exports"],function(t,e){"use strict";var r=t.noop,n=t.reject;e["default"]=function(t,e){var o=this,i=new o(r,e);return n(i,t),i}}),e("rsvp/promise/resolve",["../-internal","exports"],function(t,e){"use strict";var r=t.noop,n=t.resolve;e["default"]=function(t,e){var o=this;if(t&&"object"==typeof t&&t.constructor===o)return t;var i=new o(r,e);return n(i,t),i}}),e("rsvp/race",["./promise","exports"],function(t,e){"use strict";var r=t["default"];e["default"]=function(t,e){return r.race(t,e)}}),e("rsvp/reject",["./promise","exports"],function(t,e){"use strict";var r=t["default"];e["default"]=function(t,e){return r.reject(t,e)}}),e("rsvp/resolve",["./promise","exports"],function(t,e){"use strict";var r=t["default"];e["default"]=function(t,e){return r.resolve(t,e)}}),e("rsvp/rethrow",["exports"],function(t){"use strict";t["default"]=function(t){throw setTimeout(function(){throw t}),t}}),e("rsvp/utils",["exports"],function(t){"use strict";function e(t){return"function"==typeof t||"object"==typeof t&&null!==t}function r(t){return"function"==typeof t}function n(t){return"object"==typeof t&&null!==t}t.objectOrFunction=e,t.isFunction=r,t.isMaybeThenable=n;var o;o=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)};var i=o;t.isArray=i;var s=Date.now||function(){return(new Date).getTime()};t.now=s;var u=Object.create||function(t){var e=function(){};return e.prototype=t,e};t.o_create=u}),e("rsvp",["./rsvp/promise","./rsvp/events","./rsvp/node","./rsvp/all","./rsvp/all-settled","./rsvp/race","./rsvp/hash","./rsvp/hash-settled","./rsvp/rethrow","./rsvp/defer","./rsvp/config","./rsvp/map","./rsvp/resolve","./rsvp/reject","./rsvp/filter","./rsvp/asap","exports"],function(t,e,r,n,o,i,s,u,a,c,l,f,p,v,h,d,_){"use strict";function m(t,e){O.async(t,e)}function y(){O.on.apply(O,arguments)}function g(){O.off.apply(O,arguments)}var b=t["default"],w=e["default"],E=r["default"],j=n["default"],x=o["default"],A=i["default"],T=s["default"],R=u["default"],k=a["default"],C=c["default"],O=l.config,S=l.configure,F=f["default"],I=p["default"],N=v["default"],P=h["default"],M=d["default"];if(O.async=M,"undefined"!=typeof window&&"object"==typeof window.__PROMISE_INSTRUMENTATION__){var D=window.__PROMISE_INSTRUMENTATION__;S("instrument",!0);for(var L in D)D.hasOwnProperty(L)&&y(L,D[L])}_.Promise=b,_.EventTarget=w,_.all=j,_.allSettled=x,_.race=A,_.hash=T,_.hashSettled=R,_.rethrow=k,_.defer=C,_.denodeify=E,_.configure=S,_.on=y,_.off=g,_.resolve=I,_.reject=N,_.async=m,_.map=F,_.filter=P}),t.RSVP=r("rsvp")}(self); \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index 8b39a7c..3033942 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -12,30 +12,30 @@ var server = require("./tools/serve.js"); // Lint JS gulp.task('lint', function() { - return gulp.src('lib/*/*.js') + return gulp.src('src/*/*.js') .pipe(jshint()) .pipe(jshint.reporter('default')); }); // Concat & Minify JS gulp.task('minify', function(){ - return gulp.src(['lib/*.js', 'bower_components/rsvp/rsvp.js', - 'lib/epubjs/core.js', - 'lib/epubjs/queue.js', - 'lib/epubjs/hooks.js', - 'lib/epubjs/parser.js', - 'lib/epubjs/epubcfi.js', - 'lib/epubjs/navigation.js', - 'lib/epubjs/section.js', - 'lib/epubjs/spine.js', - 'lib/epubjs/replacements.js', - 'lib/epubjs/book.js', - 'lib/epubjs/view.js', - 'lib/epubjs/layout.js', - 'lib/epubjs/rendition.js', - 'lib/epubjs/continuous.js', - 'lib/epubjs/paginate.js', - 'lib/epubjs/map.js' + return gulp.src(['src/*.js', 'bower_components/rsvp/rsvp.js', + 'src/epubjs/core.js', + 'src/epubjs/queue.js', + 'src/epubjs/hooks.js', + 'src/epubjs/parser.js', + 'src/epubjs/epubcfi.js', + 'src/epubjs/navigation.js', + 'src/epubjs/section.js', + 'src/epubjs/spine.js', + 'src/epubjs/replacements.js', + 'src/epubjs/book.js', + 'src/epubjs/view.js', + 'src/epubjs/layout.js', + 'src/epubjs/rendition.js', + 'src/epubjs/continuous.js', + 'src/epubjs/paginate.js', + 'src/epubjs/map.js' ]) .pipe(plumber({ errorHandler: onError })) .pipe(concat('epub.js')) @@ -47,7 +47,7 @@ gulp.task('minify', function(){ // Watch Our Files gulp.task('watch', function() { - gulp.watch('lib/*/*.js', ['minify']); + gulp.watch('src/*/*.js', ['minify']); }); gulp.task('serve', ["watch"], function() {