UNPKG

vue-files-preview-inno

Version:

A tool for previewing files such as doc, excel, pdf, image, markdown, txt, audio, and video and so on.

1 lines 44 kB
{"version":3,"file":"rendition.mjs","sources":["../../../../../node_modules/epubjs/src/rendition.js"],"sourcesContent":["import EventEmitter from \"event-emitter\";\nimport { extend, defer, isFloat } from \"./utils/core\";\nimport Hook from \"./utils/hook\";\nimport EpubCFI from \"./epubcfi\";\nimport Queue from \"./utils/queue\";\nimport Layout from \"./layout\";\n// import Mapping from \"./mapping\";\nimport Themes from \"./themes\";\nimport Contents from \"./contents\";\nimport Annotations from \"./annotations\";\nimport { EVENTS, DOM_EVENTS } from \"./utils/constants\";\n\n// Default Views\nimport IframeView from \"./managers/views/iframe\";\n\n// Default View Managers\nimport DefaultViewManager from \"./managers/default/index\";\nimport ContinuousViewManager from \"./managers/continuous/index\";\n\n/**\n * Displays an Epub as a series of Views for each Section.\n * Requires Manager and View class to handle specifics of rendering\n * the section content.\n * @class\n * @param {Book} book\n * @param {object} [options]\n * @param {number} [options.width]\n * @param {number} [options.height]\n * @param {string} [options.ignoreClass] class for the cfi parser to ignore\n * @param {string | function | object} [options.manager='default']\n * @param {string | function} [options.view='iframe']\n * @param {string} [options.layout] layout to force\n * @param {string} [options.spread] force spread value\n * @param {number} [options.minSpreadWidth] overridden by spread: none (never) / both (always)\n * @param {string} [options.stylesheet] url of stylesheet to be injected\n * @param {boolean} [options.resizeOnOrientationChange] false to disable orientation events\n * @param {string} [options.script] url of script to be injected\n * @param {boolean | object} [options.snap=false] use snap scrolling\n * @param {string} [options.defaultDirection='ltr'] default text direction\n * @param {boolean} [options.allowScriptedContent=false] enable running scripts in content\n * @param {boolean} [options.allowPopups=false] enable opening popup in content\n */\nclass Rendition {\n\tconstructor(book, options) {\n\n\t\tthis.settings = extend(this.settings || {}, {\n\t\t\twidth: null,\n\t\t\theight: null,\n\t\t\tignoreClass: \"\",\n\t\t\tmanager: \"default\",\n\t\t\tview: \"iframe\",\n\t\t\tflow: null,\n\t\t\tlayout: null,\n\t\t\tspread: null,\n\t\t\tminSpreadWidth: 800,\n\t\t\tstylesheet: null,\n\t\t\tresizeOnOrientationChange: true,\n\t\t\tscript: null,\n\t\t\tsnap: false,\n\t\t\tdefaultDirection: \"ltr\",\n\t\t\tallowScriptedContent: false,\n\t\t\tallowPopups: false\n\t\t});\n\n\t\textend(this.settings, options);\n\n\t\tif (typeof(this.settings.manager) === \"object\") {\n\t\t\tthis.manager = this.settings.manager;\n\t\t}\n\n\t\tthis.book = book;\n\n\t\t/**\n\t\t * Adds Hook methods to the Rendition prototype\n\t\t * @member {object} hooks\n\t\t * @property {Hook} hooks.content\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.hooks = {};\n\t\tthis.hooks.display = new Hook(this);\n\t\tthis.hooks.serialize = new Hook(this);\n\t\tthis.hooks.content = new Hook(this);\n\t\tthis.hooks.unloaded = new Hook(this);\n\t\tthis.hooks.layout = new Hook(this);\n\t\tthis.hooks.render = new Hook(this);\n\t\tthis.hooks.show = new Hook(this);\n\n\t\tthis.hooks.content.register(this.handleLinks.bind(this));\n\t\tthis.hooks.content.register(this.passEvents.bind(this));\n\t\tthis.hooks.content.register(this.adjustImages.bind(this));\n\n\t\tthis.book.spine.hooks.content.register(this.injectIdentifier.bind(this));\n\n\t\tif (this.settings.stylesheet) {\n\t\t\tthis.book.spine.hooks.content.register(this.injectStylesheet.bind(this));\n\t\t}\n\n\t\tif (this.settings.script) {\n\t\t\tthis.book.spine.hooks.content.register(this.injectScript.bind(this));\n\t\t}\n\n\t\t/**\n\t\t * @member {Themes} themes\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.themes = new Themes(this);\n\n\t\t/**\n\t\t * @member {Annotations} annotations\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.annotations = new Annotations(this);\n\n\t\tthis.epubcfi = new EpubCFI();\n\n\t\tthis.q = new Queue(this);\n\n\t\t/**\n\t\t * A Rendered Location Range\n\t\t * @typedef location\n\t\t * @type {Object}\n\t\t * @property {object} start\n\t\t * @property {string} start.index\n\t\t * @property {string} start.href\n\t\t * @property {object} start.displayed\n\t\t * @property {EpubCFI} start.cfi\n\t\t * @property {number} start.location\n\t\t * @property {number} start.percentage\n\t\t * @property {number} start.displayed.page\n\t\t * @property {number} start.displayed.total\n\t\t * @property {object} end\n\t\t * @property {string} end.index\n\t\t * @property {string} end.href\n\t\t * @property {object} end.displayed\n\t\t * @property {EpubCFI} end.cfi\n\t\t * @property {number} end.location\n\t\t * @property {number} end.percentage\n\t\t * @property {number} end.displayed.page\n\t\t * @property {number} end.displayed.total\n\t\t * @property {boolean} atStart\n\t\t * @property {boolean} atEnd\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.location = undefined;\n\n\t\t// Hold queue until book is opened\n\t\tthis.q.enqueue(this.book.opened);\n\n\t\tthis.starting = new defer();\n\t\t/**\n\t\t * @member {promise} started returns after the rendition has started\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.started = this.starting.promise;\n\n\t\t// Block the queue until rendering is started\n\t\tthis.q.enqueue(this.start);\n\t}\n\n\t/**\n\t * Set the manager function\n\t * @param {function} manager\n\t */\n\tsetManager(manager) {\n\t\tthis.manager = manager;\n\t}\n\n\t/**\n\t * Require the manager from passed string, or as a class function\n\t * @param {string|object} manager [description]\n\t * @return {method}\n\t */\n\trequireManager(manager) {\n\t\tvar viewManager;\n\n\t\t// If manager is a string, try to load from imported managers\n\t\tif (typeof manager === \"string\" && manager === \"default\") {\n\t\t\tviewManager = DefaultViewManager;\n\t\t} else if (typeof manager === \"string\" && manager === \"continuous\") {\n\t\t\tviewManager = ContinuousViewManager;\n\t\t} else {\n\t\t\t// otherwise, assume we were passed a class function\n\t\t\tviewManager = manager;\n\t\t}\n\n\t\treturn viewManager;\n\t}\n\n\t/**\n\t * Require the view from passed string, or as a class function\n\t * @param {string|object} view\n\t * @return {view}\n\t */\n\trequireView(view) {\n\t\tvar View;\n\n\t\t// If view is a string, try to load from imported views,\n\t\tif (typeof view == \"string\" && view === \"iframe\") {\n\t\t\tView = IframeView;\n\t\t} else {\n\t\t\t// otherwise, assume we were passed a class function\n\t\t\tView = view;\n\t\t}\n\n\t\treturn View;\n\t}\n\n\t/**\n\t * Start the rendering\n\t * @return {Promise} rendering has started\n\t */\n\tstart(){\n\t\tif (!this.settings.layout && (this.book.package.metadata.layout === \"pre-paginated\" || this.book.displayOptions.fixedLayout === \"true\")) {\n\t\t\tthis.settings.layout = \"pre-paginated\";\n\t\t}\n\t\tswitch(this.book.package.metadata.spread) {\n\t\t\tcase 'none':\n\t\t\t\tthis.settings.spread = 'none';\n\t\t\t\tbreak;\n\t\t\tcase 'both':\n\t\t\t\tthis.settings.spread = true;\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif(!this.manager) {\n\t\t\tthis.ViewManager = this.requireManager(this.settings.manager);\n\t\t\tthis.View = this.requireView(this.settings.view);\n\n\t\t\tthis.manager = new this.ViewManager({\n\t\t\t\tview: this.View,\n\t\t\t\tqueue: this.q,\n\t\t\t\trequest: this.book.load.bind(this.book),\n\t\t\t\tsettings: this.settings\n\t\t\t});\n\t\t}\n\n\t\tthis.direction(this.book.package.metadata.direction || this.settings.defaultDirection);\n\n\t\t// Parse metadata to get layout props\n\t\tthis.settings.globalLayoutProperties = this.determineLayoutProperties(this.book.package.metadata);\n\n\t\tthis.flow(this.settings.globalLayoutProperties.flow);\n\n\t\tthis.layout(this.settings.globalLayoutProperties);\n\n\t\t// Listen for displayed views\n\t\tthis.manager.on(EVENTS.MANAGERS.ADDED, this.afterDisplayed.bind(this));\n\t\tthis.manager.on(EVENTS.MANAGERS.REMOVED, this.afterRemoved.bind(this));\n\n\t\t// Listen for resizing\n\t\tthis.manager.on(EVENTS.MANAGERS.RESIZED, this.onResized.bind(this));\n\n\t\t// Listen for rotation\n\t\tthis.manager.on(EVENTS.MANAGERS.ORIENTATION_CHANGE, this.onOrientationChange.bind(this));\n\n\t\t// Listen for scroll changes\n\t\tthis.manager.on(EVENTS.MANAGERS.SCROLLED, this.reportLocation.bind(this));\n\n\t\t/**\n\t\t * Emit that rendering has started\n\t\t * @event started\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.emit(EVENTS.RENDITION.STARTED);\n\n\t\t// Start processing queue\n\t\tthis.starting.resolve();\n\t}\n\n\t/**\n\t * Call to attach the container to an element in the dom\n\t * Container must be attached before rendering can begin\n\t * @param {element} element to attach to\n\t * @return {Promise}\n\t */\n\tattachTo(element){\n\n\t\treturn this.q.enqueue(function () {\n\n\t\t\t// Start rendering\n\t\t\tthis.manager.render(element, {\n\t\t\t\t\"width\" : this.settings.width,\n\t\t\t\t\"height\" : this.settings.height\n\t\t\t});\n\n\t\t\t/**\n\t\t\t * Emit that rendering has attached to an element\n\t\t\t * @event attached\n\t\t\t * @memberof Rendition\n\t\t\t */\n\t\t\tthis.emit(EVENTS.RENDITION.ATTACHED);\n\n\t\t}.bind(this));\n\n\t}\n\n\t/**\n\t * Display a point in the book\n\t * The request will be added to the rendering Queue,\n\t * so it will wait until book is opened, rendering started\n\t * and all other rendering tasks have finished to be called.\n\t * @param {string} target Url or EpubCFI\n\t * @return {Promise}\n\t */\n\tdisplay(target){\n\t\tif (this.displaying) {\n\t\t\tthis.displaying.resolve();\n\t\t}\n\t\treturn this.q.enqueue(this._display, target);\n\t}\n\n\t/**\n\t * Tells the manager what to display immediately\n\t * @private\n\t * @param {string} target Url or EpubCFI\n\t * @return {Promise}\n\t */\n\t_display(target){\n\t\tif (!this.book) {\n\t\t\treturn;\n\t\t}\n\t\tvar isCfiString = this.epubcfi.isCfiString(target);\n\t\tvar displaying = new defer();\n\t\tvar displayed = displaying.promise;\n\t\tvar section;\n\t\tvar moveTo;\n\n\t\tthis.displaying = displaying;\n\n\t\t// Check if this is a book percentage\n\t\tif (this.book.locations.length() && isFloat(target)) {\n\t\t\ttarget = this.book.locations.cfiFromPercentage(parseFloat(target));\n\t\t}\n\n\t\tsection = this.book.spine.get(target);\n\n\t\tif(!section){\n\t\t\tdisplaying.reject(new Error(\"No Section Found\"));\n\t\t\treturn displayed;\n\t\t}\n\n\t\tthis.manager.display(section, target)\n\t\t\t.then(() => {\n\t\t\t\tdisplaying.resolve(section);\n\t\t\t\tthis.displaying = undefined;\n\n\t\t\t\t/**\n\t\t\t\t * Emit that a section has been displayed\n\t\t\t\t * @event displayed\n\t\t\t\t * @param {Section} section\n\t\t\t\t * @memberof Rendition\n\t\t\t\t */\n\t\t\t\tthis.emit(EVENTS.RENDITION.DISPLAYED, section);\n\t\t\t\tthis.reportLocation();\n\t\t\t}, (err) => {\n\t\t\t\t/**\n\t\t\t\t * Emit that has been an error displaying\n\t\t\t\t * @event displayError\n\t\t\t\t * @param {Section} section\n\t\t\t\t * @memberof Rendition\n\t\t\t\t */\n\t\t\t\tthis.emit(EVENTS.RENDITION.DISPLAY_ERROR, err);\n\t\t\t});\n\n\t\treturn displayed;\n\t}\n\n\t/*\n\trender(view, show) {\n\n\t\t// view.onLayout = this.layout.format.bind(this.layout);\n\t\tview.create();\n\n\t\t// Fit to size of the container, apply padding\n\t\tthis.manager.resizeView(view);\n\n\t\t// Render Chain\n\t\treturn view.section.render(this.book.request)\n\t\t\t.then(function(contents){\n\t\t\t\treturn view.load(contents);\n\t\t\t}.bind(this))\n\t\t\t.then(function(doc){\n\t\t\t\treturn this.hooks.content.trigger(view, this);\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\tthis.layout.format(view.contents);\n\t\t\t\treturn this.hooks.layout.trigger(view, this);\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\treturn view.display();\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\treturn this.hooks.render.trigger(view, this);\n\t\t\t}.bind(this))\n\t\t\t.then(function(){\n\t\t\t\tif(show !== false) {\n\t\t\t\t\tthis.q.enqueue(function(view){\n\t\t\t\t\t\tview.show();\n\t\t\t\t\t}, view);\n\t\t\t\t}\n\t\t\t\t// this.map = new Map(view, this.layout);\n\t\t\t\tthis.hooks.show.trigger(view, this);\n\t\t\t\tthis.trigger(\"rendered\", view.section);\n\n\t\t\t}.bind(this))\n\t\t\t.catch(function(e){\n\t\t\t\tthis.trigger(\"loaderror\", e);\n\t\t\t}.bind(this));\n\n\t}\n\t*/\n\n\t/**\n\t * Report what section has been displayed\n\t * @private\n\t * @param {*} view\n\t */\n\tafterDisplayed(view){\n\n\t\tview.on(EVENTS.VIEWS.MARK_CLICKED, (cfiRange, data) => this.triggerMarkEvent(cfiRange, data, view.contents));\n\n\t\tthis.hooks.render.trigger(view, this)\n\t\t\t.then(() => {\n\t\t\t\tif (view.contents) {\n\t\t\t\t\tthis.hooks.content.trigger(view.contents, this).then(() => {\n\t\t\t\t\t\t/**\n\t\t\t\t\t\t * Emit that a section has been rendered\n\t\t\t\t\t\t * @event rendered\n\t\t\t\t\t\t * @param {Section} section\n\t\t\t\t\t\t * @param {View} view\n\t\t\t\t\t\t * @memberof Rendition\n\t\t\t\t\t\t */\n\t\t\t\t\t\tthis.emit(EVENTS.RENDITION.RENDERED, view.section, view);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.emit(EVENTS.RENDITION.RENDERED, view.section, view);\n\t\t\t\t}\n\t\t\t});\n\n\t}\n\n\t/**\n\t * Report what has been removed\n\t * @private\n\t * @param {*} view\n\t */\n\tafterRemoved(view){\n\t\tthis.hooks.unloaded.trigger(view, this).then(() => {\n\t\t\t/**\n\t\t\t * Emit that a section has been removed\n\t\t\t * @event removed\n\t\t\t * @param {Section} section\n\t\t\t * @param {View} view\n\t\t\t * @memberof Rendition\n\t\t\t */\n\t\t\tthis.emit(EVENTS.RENDITION.REMOVED, view.section, view);\n\t\t});\n\t}\n\n\t/**\n\t * Report resize events and display the last seen location\n\t * @private\n\t */\n\tonResized(size, epubcfi){\n\n\t\t/**\n\t\t * Emit that the rendition has been resized\n\t\t * @event resized\n\t\t * @param {number} width\n\t\t * @param {height} height\n\t\t * @param {string} epubcfi (optional)\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.emit(EVENTS.RENDITION.RESIZED, {\n\t\t\twidth: size.width,\n\t\t\theight: size.height\n\t\t}, epubcfi);\n\n\t\tif (this.location && this.location.start) {\n\t\t\tthis.display(epubcfi || this.location.start.cfi);\n\t\t}\n\n\t}\n\n\t/**\n\t * Report orientation events and display the last seen location\n\t * @private\n\t */\n\tonOrientationChange(orientation){\n\t\t/**\n\t\t * Emit that the rendition has been rotated\n\t\t * @event orientationchange\n\t\t * @param {string} orientation\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.emit(EVENTS.RENDITION.ORIENTATION_CHANGE, orientation);\n\t}\n\n\t/**\n\t * Move the Rendition to a specific offset\n\t * Usually you would be better off calling display()\n\t * @param {object} offset\n\t */\n\tmoveTo(offset){\n\t\tthis.manager.moveTo(offset);\n\t}\n\n\t/**\n\t * Trigger a resize of the views\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t * @param {string} [epubcfi] (optional)\n\t */\n\tresize(width, height, epubcfi){\n\t\tif (width) {\n\t\t\tthis.settings.width = width;\n\t\t}\n\t\tif (height) {\n\t\t\tthis.settings.height = height;\n\t\t}\n\t\tthis.manager.resize(width, height, epubcfi);\n\t}\n\n\t/**\n\t * Clear all rendered views\n\t */\n\tclear(){\n\t\tthis.manager.clear();\n\t}\n\n\t/**\n\t * Go to the next \"page\" in the rendition\n\t * @return {Promise}\n\t */\n\tnext(){\n\t\treturn this.q.enqueue(this.manager.next.bind(this.manager))\n\t\t\t.then(this.reportLocation.bind(this));\n\t}\n\n\t/**\n\t * Go to the previous \"page\" in the rendition\n\t * @return {Promise}\n\t */\n\tprev(){\n\t\treturn this.q.enqueue(this.manager.prev.bind(this.manager))\n\t\t\t.then(this.reportLocation.bind(this));\n\t}\n\n\t//-- http://www.idpf.org/epub/301/spec/epub-publications.html#meta-properties-rendering\n\t/**\n\t * Determine the Layout properties from metadata and settings\n\t * @private\n\t * @param {object} metadata\n\t * @return {object} properties\n\t */\n\tdetermineLayoutProperties(metadata){\n\t\tvar properties;\n\t\tvar layout = this.settings.layout || metadata.layout || \"reflowable\";\n\t\tvar spread = this.settings.spread || metadata.spread || \"auto\";\n\t\tvar orientation = this.settings.orientation || metadata.orientation || \"auto\";\n\t\tvar flow = this.settings.flow || metadata.flow || \"auto\";\n\t\tvar viewport = metadata.viewport || \"\";\n\t\tvar minSpreadWidth = this.settings.minSpreadWidth || metadata.minSpreadWidth || 800;\n\t\tvar direction = this.settings.direction || metadata.direction || \"ltr\";\n\n\t\tif ((this.settings.width === 0 || this.settings.width > 0) &&\n\t\t\t\t(this.settings.height === 0 || this.settings.height > 0)) {\n\t\t\t// viewport = \"width=\"+this.settings.width+\", height=\"+this.settings.height+\"\";\n\t\t}\n\n\t\tproperties = {\n\t\t\tlayout : layout,\n\t\t\tspread : spread,\n\t\t\torientation : orientation,\n\t\t\tflow : flow,\n\t\t\tviewport : viewport,\n\t\t\tminSpreadWidth : minSpreadWidth,\n\t\t\tdirection: direction\n\t\t};\n\n\t\treturn properties;\n\t}\n\n\t/**\n\t * Adjust the flow of the rendition to paginated or scrolled\n\t * (scrolled-continuous vs scrolled-doc are handled by different view managers)\n\t * @param {string} flow\n\t */\n\tflow(flow){\n\t\tvar _flow = flow;\n\t\tif (flow === \"scrolled\" ||\n\t\t\t\tflow === \"scrolled-doc\" ||\n\t\t\t\tflow === \"scrolled-continuous\") {\n\t\t\t_flow = \"scrolled\";\n\t\t}\n\n\t\tif (flow === \"auto\" || flow === \"paginated\") {\n\t\t\t_flow = \"paginated\";\n\t\t}\n\n\t\tthis.settings.flow = flow;\n\n\t\tif (this._layout) {\n\t\t\tthis._layout.flow(_flow);\n\t\t}\n\n\t\tif (this.manager && this._layout) {\n\t\t\tthis.manager.applyLayout(this._layout);\n\t\t}\n\n\t\tif (this.manager) {\n\t\t\tthis.manager.updateFlow(_flow);\n\t\t}\n\n\t\tif (this.manager && this.manager.isRendered() && this.location) {\n\t\t\tthis.manager.clear();\n\t\t\tthis.display(this.location.start.cfi);\n\t\t}\n\t}\n\n\t/**\n\t * Adjust the layout of the rendition to reflowable or pre-paginated\n\t * @param {object} settings\n\t */\n\tlayout(settings){\n\t\tif (settings) {\n\t\t\tthis._layout = new Layout(settings);\n\t\t\tthis._layout.spread(settings.spread, this.settings.minSpreadWidth);\n\n\t\t\t// this.mapping = new Mapping(this._layout.props);\n\n\t\t\tthis._layout.on(EVENTS.LAYOUT.UPDATED, (props, changed) => {\n\t\t\t\tthis.emit(EVENTS.RENDITION.LAYOUT, props, changed);\n\t\t\t})\n\t\t}\n\n\t\tif (this.manager && this._layout) {\n\t\t\tthis.manager.applyLayout(this._layout);\n\t\t}\n\n\t\treturn this._layout;\n\t}\n\n\t/**\n\t * Adjust if the rendition uses spreads\n\t * @param {string} spread none | auto (TODO: implement landscape, portrait, both)\n\t * @param {int} [min] min width to use spreads at\n\t */\n\tspread(spread, min){\n\n\t\tthis.settings.spread = spread;\n\n\t\tif (min) {\n\t\t\tthis.settings.minSpreadWidth = min;\n\t\t}\n\n\t\tif (this._layout) {\n\t\t\tthis._layout.spread(spread, min);\n\t\t}\n\n\t\tif (this.manager && this.manager.isRendered()) {\n\t\t\tthis.manager.updateLayout();\n\t\t}\n\t}\n\n\t/**\n\t * Adjust the direction of the rendition\n\t * @param {string} dir\n\t */\n\tdirection(dir){\n\n\t\tthis.settings.direction = dir || \"ltr\";\n\n\t\tif (this.manager) {\n\t\t\tthis.manager.direction(this.settings.direction);\n\t\t}\n\n\t\tif (this.manager && this.manager.isRendered() && this.location) {\n\t\t\tthis.manager.clear();\n\t\t\tthis.display(this.location.start.cfi);\n\t\t}\n\t}\n\n\t/**\n\t * Report the current location\n\t * @fires relocated\n\t * @fires locationChanged\n\t */\n\treportLocation(){\n\t\treturn this.q.enqueue(function reportedLocation(){\n\t\t\trequestAnimationFrame(function reportedLocationAfterRAF() {\n\t\t\t\tvar location = this.manager.currentLocation();\n\t\t\t\tif (location && location.then && typeof location.then === \"function\") {\n\t\t\t\t\tlocation.then(function(result) {\n\t\t\t\t\t\tlet located = this.located(result);\n\n\t\t\t\t\t\tif (!located || !located.start || !located.end) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tthis.location = located;\n\n\t\t\t\t\t\tthis.emit(EVENTS.RENDITION.LOCATION_CHANGED, {\n\t\t\t\t\t\t\tindex: this.location.start.index,\n\t\t\t\t\t\t\thref: this.location.start.href,\n\t\t\t\t\t\t\tstart: this.location.start.cfi,\n\t\t\t\t\t\t\tend: this.location.end.cfi,\n\t\t\t\t\t\t\tpercentage: this.location.start.percentage\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tthis.emit(EVENTS.RENDITION.RELOCATED, this.location);\n\t\t\t\t\t}.bind(this));\n\t\t\t\t} else if (location) {\n\t\t\t\t\tlet located = this.located(location);\n\n\t\t\t\t\tif (!located || !located.start || !located.end) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.location = located;\n\n\t\t\t\t\t/**\n\t\t\t\t\t * @event locationChanged\n\t\t\t\t\t * @deprecated\n\t\t\t\t\t * @type {object}\n\t\t\t\t\t * @property {number} index\n\t\t\t\t\t * @property {string} href\n\t\t\t\t\t * @property {EpubCFI} start\n\t\t\t\t\t * @property {EpubCFI} end\n\t\t\t\t\t * @property {number} percentage\n\t\t\t\t\t * @memberof Rendition\n\t\t\t\t\t */\n\t\t\t\t\tthis.emit(EVENTS.RENDITION.LOCATION_CHANGED, {\n\t\t\t\t\t\tindex: this.location.start.index,\n\t\t\t\t\t\thref: this.location.start.href,\n\t\t\t\t\t\tstart: this.location.start.cfi,\n\t\t\t\t\t\tend: this.location.end.cfi,\n\t\t\t\t\t\tpercentage: this.location.start.percentage\n\t\t\t\t\t});\n\n\t\t\t\t\t/**\n\t\t\t\t\t * @event relocated\n\t\t\t\t\t * @type {displayedLocation}\n\t\t\t\t\t * @memberof Rendition\n\t\t\t\t\t */\n\t\t\t\t\tthis.emit(EVENTS.RENDITION.RELOCATED, this.location);\n\t\t\t\t}\n\t\t\t}.bind(this));\n\t\t}.bind(this));\n\t}\n\n\t/**\n\t * Get the Current Location object\n\t * @return {displayedLocation | promise} location (may be a promise)\n\t */\n\tcurrentLocation(){\n\t\tvar location = this.manager.currentLocation();\n\t\tif (location && location.then && typeof location.then === \"function\") {\n\t\t\tlocation.then(function(result) {\n\t\t\t\tlet located = this.located(result);\n\t\t\t\treturn located;\n\t\t\t}.bind(this));\n\t\t} else if (location) {\n\t\t\tlet located = this.located(location);\n\t\t\treturn located;\n\t\t}\n\t}\n\n\t/**\n\t * Creates a Rendition#locationRange from location\n\t * passed by the Manager\n\t * @returns {displayedLocation}\n\t * @private\n\t */\n\tlocated(location){\n\t\tif (!location.length) {\n\t\t\treturn {};\n\t\t}\n\t\tlet start = location[0];\n\t\tlet end = location[location.length-1];\n\n\t\tlet located = {\n\t\t\tstart: {\n\t\t\t\tindex: start.index,\n\t\t\t\thref: start.href,\n\t\t\t\tcfi: start.mapping.start,\n\t\t\t\tdisplayed: {\n\t\t\t\t\tpage: start.pages[0] || 1,\n\t\t\t\t\ttotal: start.totalPages\n\t\t\t\t}\n\t\t\t},\n\t\t\tend: {\n\t\t\t\tindex: end.index,\n\t\t\t\thref: end.href,\n\t\t\t\tcfi: end.mapping.end,\n\t\t\t\tdisplayed: {\n\t\t\t\t\tpage: end.pages[end.pages.length-1] || 1,\n\t\t\t\t\ttotal: end.totalPages\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\tlet locationStart = this.book.locations.locationFromCfi(start.mapping.start);\n\t\tlet locationEnd = this.book.locations.locationFromCfi(end.mapping.end);\n\n\t\tif (locationStart != null) {\n\t\t\tlocated.start.location = locationStart;\n\t\t\tlocated.start.percentage = this.book.locations.percentageFromLocation(locationStart);\n\t\t}\n\t\tif (locationEnd != null) {\n\t\t\tlocated.end.location = locationEnd;\n\t\t\tlocated.end.percentage = this.book.locations.percentageFromLocation(locationEnd);\n\t\t}\n\n\t\tlet pageStart = this.book.pageList.pageFromCfi(start.mapping.start);\n\t\tlet pageEnd = this.book.pageList.pageFromCfi(end.mapping.end);\n\n\t\tif (pageStart != -1) {\n\t\t\tlocated.start.page = pageStart;\n\t\t}\n\t\tif (pageEnd != -1) {\n\t\t\tlocated.end.page = pageEnd;\n\t\t}\n\n\t\tif (end.index === this.book.spine.last().index &&\n\t\t\t\tlocated.end.displayed.page >= located.end.displayed.total) {\n\t\t\tlocated.atEnd = true;\n\t\t}\n\n\t\tif (start.index === this.book.spine.first().index &&\n\t\t\t\tlocated.start.displayed.page === 1) {\n\t\t\tlocated.atStart = true;\n\t\t}\n\n\t\treturn located;\n\t}\n\n\t/**\n\t * Remove and Clean Up the Rendition\n\t */\n\tdestroy(){\n\t\t// Clear the queue\n\t\t// this.q.clear();\n\t\t// this.q = undefined;\n\n\t\tthis.manager && this.manager.destroy();\n\n\t\tthis.book = undefined;\n\n\t\t// this.views = null;\n\n\t\t// this.hooks.display.clear();\n\t\t// this.hooks.serialize.clear();\n\t\t// this.hooks.content.clear();\n\t\t// this.hooks.layout.clear();\n\t\t// this.hooks.render.clear();\n\t\t// this.hooks.show.clear();\n\t\t// this.hooks = {};\n\n\t\t// this.themes.destroy();\n\t\t// this.themes = undefined;\n\n\t\t// this.epubcfi = undefined;\n\n\t\t// this.starting = undefined;\n\t\t// this.started = undefined;\n\n\n\t}\n\n\t/**\n\t * Pass the events from a view's Contents\n\t * @private\n\t * @param {Contents} view contents\n\t */\n\tpassEvents(contents){\n\t\tDOM_EVENTS.forEach((e) => {\n\t\t\tcontents.on(e, (ev) => this.triggerViewEvent(ev, contents));\n\t\t});\n\n\t\tcontents.on(EVENTS.CONTENTS.SELECTED, (e) => this.triggerSelectedEvent(e, contents));\n\t}\n\n\t/**\n\t * Emit events passed by a view\n\t * @private\n\t * @param {event} e\n\t */\n\ttriggerViewEvent(e, contents){\n\t\tthis.emit(e.type, e, contents);\n\t}\n\n\t/**\n\t * Emit a selection event's CFI Range passed from a a view\n\t * @private\n\t * @param {string} cfirange\n\t */\n\ttriggerSelectedEvent(cfirange, contents){\n\t\t/**\n\t\t * Emit that a text selection has occurred\n\t\t * @event selected\n\t\t * @param {string} cfirange\n\t\t * @param {Contents} contents\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.emit(EVENTS.RENDITION.SELECTED, cfirange, contents);\n\t}\n\n\t/**\n\t * Emit a markClicked event with the cfiRange and data from a mark\n\t * @private\n\t * @param {EpubCFI} cfirange\n\t */\n\ttriggerMarkEvent(cfiRange, data, contents){\n\t\t/**\n\t\t * Emit that a mark was clicked\n\t\t * @event markClicked\n\t\t * @param {EpubCFI} cfirange\n\t\t * @param {object} data\n\t\t * @param {Contents} contents\n\t\t * @memberof Rendition\n\t\t */\n\t\tthis.emit(EVENTS.RENDITION.MARK_CLICKED, cfiRange, data, contents);\n\t}\n\n\t/**\n\t * Get a Range from a Visible CFI\n\t * @param {string} cfi EpubCfi String\n\t * @param {string} ignoreClass\n\t * @return {range}\n\t */\n\tgetRange(cfi, ignoreClass){\n\t\tvar _cfi = new EpubCFI(cfi);\n\t\tvar found = this.manager.visible().filter(function (view) {\n\t\t\tif(_cfi.spinePos === view.index) return true;\n\t\t});\n\n\t\t// Should only every return 1 item\n\t\tif (found.length) {\n\t\t\treturn found[0].contents.range(_cfi, ignoreClass);\n\t\t}\n\t}\n\n\t/**\n\t * Hook to adjust images to fit in columns\n\t * @param {Contents} contents\n\t * @private\n\t */\n\tadjustImages(contents) {\n\n\t\tif (this._layout.name === \"pre-paginated\") {\n\t\t\treturn new Promise(function(resolve){\n\t\t\t\tresolve();\n\t\t\t});\n\t\t}\n\n\t\tlet computed = contents.window.getComputedStyle(contents.content, null);\n\t\tlet height = (contents.content.offsetHeight - (parseFloat(computed.paddingTop) + parseFloat(computed.paddingBottom))) * .95;\n\t\tlet horizontalPadding = parseFloat(computed.paddingLeft) + parseFloat(computed.paddingRight);\n\n\t\tcontents.addStylesheetRules({\n\t\t\t\"img\" : {\n\t\t\t\t\"max-width\": (this._layout.columnWidth ? (this._layout.columnWidth - horizontalPadding) + \"px\" : \"100%\") + \"!important\",\n\t\t\t\t\"max-height\": height + \"px\" + \"!important\",\n\t\t\t\t\"object-fit\": \"contain\",\n\t\t\t\t\"page-break-inside\": \"avoid\",\n\t\t\t\t\"break-inside\": \"avoid\",\n\t\t\t\t\"box-sizing\": \"border-box\"\n\t\t\t},\n\t\t\t\"svg\" : {\n\t\t\t\t\"max-width\": (this._layout.columnWidth ? (this._layout.columnWidth - horizontalPadding) + \"px\" : \"100%\") + \"!important\",\n\t\t\t\t\"max-height\": height + \"px\" + \"!important\",\n\t\t\t\t\"page-break-inside\": \"avoid\",\n\t\t\t\t\"break-inside\": \"avoid\"\n\t\t\t}\n\t\t});\n\n\t\treturn new Promise(function(resolve, reject){\n\t\t\t// Wait to apply\n\t\t\tsetTimeout(function() {\n\t\t\t\tresolve();\n\t\t\t}, 1);\n\t\t});\n\t}\n\n\t/**\n\t * Get the Contents object of each rendered view\n\t * @returns {Contents[]}\n\t */\n\tgetContents () {\n\t\treturn this.manager ? this.manager.getContents() : [];\n\t}\n\n\t/**\n\t * Get the views member from the manager\n\t * @returns {Views}\n\t */\n\tviews () {\n\t\tlet views = this.manager ? this.manager.views : undefined;\n\t\treturn views || [];\n\t}\n\n\t/**\n\t * Hook to handle link clicks in rendered content\n\t * @param {Contents} contents\n\t * @private\n\t */\n\thandleLinks(contents) {\n\t\tif (contents) {\n\t\t\tcontents.on(EVENTS.CONTENTS.LINK_CLICKED, (href) => {\n\t\t\t\tlet relative = this.book.path.relative(href);\n\t\t\t\tthis.display(relative);\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Hook to handle injecting stylesheet before\n\t * a Section is serialized\n\t * @param {document} doc\n\t * @param {Section} section\n\t * @private\n\t */\n\tinjectStylesheet(doc, section) {\n\t\tlet style = doc.createElement(\"link\");\n\t\tstyle.setAttribute(\"type\", \"text/css\");\n\t\tstyle.setAttribute(\"rel\", \"stylesheet\");\n\t\tstyle.setAttribute(\"href\", this.settings.stylesheet);\n\t\tdoc.getElementsByTagName(\"head\")[0].appendChild(style);\n\t}\n\n\t/**\n\t * Hook to handle injecting scripts before\n\t * a Section is serialized\n\t * @param {document} doc\n\t * @param {Section} section\n\t * @private\n\t */\n\tinjectScript(doc, section) {\n\t\tlet script = doc.createElement(\"script\");\n\t\tscript.setAttribute(\"type\", \"text/javascript\");\n\t\tscript.setAttribute(\"src\", this.settings.script);\n\t\tscript.textContent = \" \"; // Needed to prevent self closing tag\n\t\tdoc.getElementsByTagName(\"head\")[0].appendChild(script);\n\t}\n\n\t/**\n\t * Hook to handle the document identifier before\n\t * a Section is serialized\n\t * @param {document} doc\n\t * @param {Section} section\n\t * @private\n\t */\n\tinjectIdentifier(doc, section) {\n\t\tlet ident = this.book.packaging.metadata.identifier;\n\t\tlet meta = doc.createElement(\"meta\");\n\t\tmeta.setAttribute(\"name\", \"dc.relation.ispartof\");\n\t\tif (ident) {\n\t\t\tmeta.setAttribute(\"content\", ident);\n\t\t}\n\t\tdoc.getElementsByTagName(\"head\")[0].appendChild(meta);\n\t}\n\n}\n\n//-- Enable binding events to Renderer\nEventEmitter(Rendition.prototype);\n\nexport default Rendition;\n"],"names":["Rendition","book","options","extend","Hook","Themes","Annotations","EpubCFI","Queue","defer","manager","viewManager","DefaultViewManager","ContinuousViewManager","view","View","IframeView","EVENTS","element","target","displaying","displayed","section","isFloat","err","cfiRange","data","size","epubcfi","orientation","offset","width","height","metadata","properties","layout","spread","flow","viewport","minSpreadWidth","direction","_flow","settings","Layout","props","changed","min","dir","location","result","located","start","end","locationStart","locationEnd","pageStart","pageEnd","contents","DOM_EVENTS","e","ev","cfirange","cfi","ignoreClass","_cfi","found","resolve","computed","horizontalPadding","reject","href","relative","doc","style","script","ident","meta","EventEmitter"],"mappings":"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","x_google_ignoreList":[0]}