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 52.8 kB
{"version":3,"file":"contents.mjs","sources":["../../../../../node_modules/epubjs/src/contents.js"],"sourcesContent":["import EventEmitter from \"event-emitter\";\nimport {isNumber, prefixed, borders, defaults} from \"./utils/core\";\nimport EpubCFI from \"./epubcfi\";\nimport Mapping from \"./mapping\";\nimport {replaceLinks} from \"./utils/replacements\";\nimport { EPUBJS_VERSION, EVENTS, DOM_EVENTS } from \"./utils/constants\";\n\nconst hasNavigator = typeof (navigator) !== \"undefined\";\n\nconst isChrome = hasNavigator && /Chrome/.test(navigator.userAgent);\nconst isWebkit = hasNavigator && !isChrome && /AppleWebKit/.test(navigator.userAgent);\n\nconst ELEMENT_NODE = 1;\nconst TEXT_NODE = 3;\n\n/**\n\t* Handles DOM manipulation, queries and events for View contents\n\t* @class\n\t* @param {document} doc Document\n\t* @param {element} content Parent Element (typically Body)\n\t* @param {string} cfiBase Section component of CFIs\n\t* @param {number} sectionIndex Index in Spine of Conntent's Section\n\t*/\nclass Contents {\n\tconstructor(doc, content, cfiBase, sectionIndex) {\n\t\t// Blank Cfi for Parsing\n\t\tthis.epubcfi = new EpubCFI();\n\n\t\tthis.document = doc;\n\t\tthis.documentElement =  this.document.documentElement;\n\t\tthis.content = content || this.document.body;\n\t\tthis.window = this.document.defaultView;\n\n\t\tthis._size = {\n\t\t\twidth: 0,\n\t\t\theight: 0\n\t\t};\n\n\t\tthis.sectionIndex = sectionIndex || 0;\n\t\tthis.cfiBase = cfiBase || \"\";\n\n\t\tthis.epubReadingSystem(\"epub.js\", EPUBJS_VERSION);\n\t\tthis.called = 0;\n\t\tthis.active = true;\n\t\tthis.listeners();\n\t}\n\n\t/**\n\t\t* Get DOM events that are listened for and passed along\n\t\t*/\n\tstatic get listenedEvents() {\n\t\treturn DOM_EVENTS;\n\t}\n\n\t/**\n\t\t* Get or Set width\n\t\t* @param {number} [w]\n\t\t* @returns {number} width\n\t\t*/\n\twidth(w) {\n\t\t// var frame = this.documentElement;\n\t\tvar frame = this.content;\n\n\t\tif (w && isNumber(w)) {\n\t\t\tw = w + \"px\";\n\t\t}\n\n\t\tif (w) {\n\t\t\tframe.style.width = w;\n\t\t\t// this.content.style.width = w;\n\t\t}\n\n\t\treturn parseInt(this.window.getComputedStyle(frame)[\"width\"]);\n\n\n\t}\n\n\t/**\n\t\t* Get or Set height\n\t\t* @param {number} [h]\n\t\t* @returns {number} height\n\t\t*/\n\theight(h) {\n\t\t// var frame = this.documentElement;\n\t\tvar frame = this.content;\n\n\t\tif (h && isNumber(h)) {\n\t\t\th = h + \"px\";\n\t\t}\n\n\t\tif (h) {\n\t\t\tframe.style.height = h;\n\t\t\t// this.content.style.height = h;\n\t\t}\n\n\t\treturn parseInt(this.window.getComputedStyle(frame)[\"height\"]);\n\n\t}\n\n\t/**\n\t\t* Get or Set width of the contents\n\t\t* @param {number} [w]\n\t\t* @returns {number} width\n\t\t*/\n\tcontentWidth(w) {\n\n\t\tvar content = this.content || this.document.body;\n\n\t\tif (w && isNumber(w)) {\n\t\t\tw = w + \"px\";\n\t\t}\n\n\t\tif (w) {\n\t\t\tcontent.style.width = w;\n\t\t}\n\n\t\treturn parseInt(this.window.getComputedStyle(content)[\"width\"]);\n\n\n\t}\n\n\t/**\n\t\t* Get or Set height of the contents\n\t\t* @param {number} [h]\n\t\t* @returns {number} height\n\t\t*/\n\tcontentHeight(h) {\n\n\t\tvar content = this.content || this.document.body;\n\n\t\tif (h && isNumber(h)) {\n\t\t\th = h + \"px\";\n\t\t}\n\n\t\tif (h) {\n\t\t\tcontent.style.height = h;\n\t\t}\n\n\t\treturn parseInt(this.window.getComputedStyle(content)[\"height\"]);\n\n\t}\n\n\t/**\n\t\t* Get the width of the text using Range\n\t\t* @returns {number} width\n\t\t*/\n\ttextWidth() {\n\t\tlet rect;\n\t\tlet width;\n\t\tlet range = this.document.createRange();\n\t\tlet content = this.content || this.document.body;\n\t\tlet border = borders(content);\n\n\t\t// Select the contents of frame\n\t\trange.selectNodeContents(content);\n\n\t\t// get the width of the text content\n\t\trect = range.getBoundingClientRect();\n\t\twidth = rect.width;\n\n\t\tif (border && border.width) {\n\t\t\twidth += border.width;\n\t\t}\n\n\t\treturn Math.round(width);\n\t}\n\n\t/**\n\t\t* Get the height of the text using Range\n\t\t* @returns {number} height\n\t\t*/\n\ttextHeight() {\n\t\tlet rect;\n\t\tlet height;\n\t\tlet range = this.document.createRange();\n\t\tlet content = this.content || this.document.body;\n\n\t\trange.selectNodeContents(content);\n\n\t\trect = range.getBoundingClientRect();\n\t\theight = rect.bottom;\n\n\t\treturn Math.round(height);\n\t}\n\n\t/**\n\t\t* Get documentElement scrollWidth\n\t\t* @returns {number} width\n\t\t*/\n\tscrollWidth() {\n\t\tvar width = this.documentElement.scrollWidth;\n\n\t\treturn width;\n\t}\n\n\t/**\n\t\t* Get documentElement scrollHeight\n\t\t* @returns {number} height\n\t\t*/\n\tscrollHeight() {\n\t\tvar height = this.documentElement.scrollHeight;\n\n\t\treturn height;\n\t}\n\n\t/**\n\t\t* Set overflow css style of the contents\n\t\t* @param {string} [overflow]\n\t\t*/\n\toverflow(overflow) {\n\n\t\tif (overflow) {\n\t\t\tthis.documentElement.style.overflow = overflow;\n\t\t}\n\n\t\treturn this.window.getComputedStyle(this.documentElement)[\"overflow\"];\n\t}\n\n\t/**\n\t\t* Set overflowX css style of the documentElement\n\t\t* @param {string} [overflow]\n\t\t*/\n\toverflowX(overflow) {\n\n\t\tif (overflow) {\n\t\t\tthis.documentElement.style.overflowX = overflow;\n\t\t}\n\n\t\treturn this.window.getComputedStyle(this.documentElement)[\"overflowX\"];\n\t}\n\n\t/**\n\t\t* Set overflowY css style of the documentElement\n\t\t* @param {string} [overflow]\n\t\t*/\n\toverflowY(overflow) {\n\n\t\tif (overflow) {\n\t\t\tthis.documentElement.style.overflowY = overflow;\n\t\t}\n\n\t\treturn this.window.getComputedStyle(this.documentElement)[\"overflowY\"];\n\t}\n\n\t/**\n\t\t* Set Css styles on the contents element (typically Body)\n\t\t* @param {string} property\n\t\t* @param {string} value\n\t\t* @param {boolean} [priority] set as \"important\"\n\t\t*/\n\tcss(property, value, priority) {\n\t\tvar content = this.content || this.document.body;\n\n\t\tif (value) {\n\t\t\tcontent.style.setProperty(property, value, priority ? \"important\" : \"\");\n\t\t} else {\n\t\t\tcontent.style.removeProperty(property);\n\t\t}\n\n\t\treturn this.window.getComputedStyle(content)[property];\n\t}\n\n\t/**\n\t\t* Get or Set the viewport element\n\t\t* @param {object} [options]\n\t\t* @param {string} [options.width]\n\t\t* @param {string} [options.height]\n\t\t* @param {string} [options.scale]\n\t\t* @param {string} [options.minimum]\n\t\t* @param {string} [options.maximum]\n\t\t* @param {string} [options.scalable]\n\t\t*/\n\tviewport(options) {\n\t\tvar _width, _height, _scale, _minimum, _maximum, _scalable;\n\t\t// var width, height, scale, minimum, maximum, scalable;\n\t\tvar $viewport = this.document.querySelector(\"meta[name='viewport']\");\n\t\tvar parsed = {\n\t\t\t\"width\": undefined,\n\t\t\t\"height\": undefined,\n\t\t\t\"scale\": undefined,\n\t\t\t\"minimum\": undefined,\n\t\t\t\"maximum\": undefined,\n\t\t\t\"scalable\": undefined\n\t\t};\n\t\tvar newContent = [];\n\t\tvar settings = {};\n\n\t\t/*\n\t\t* check for the viewport size\n\t\t* <meta name=\"viewport\" content=\"width=1024,height=697\" />\n\t\t*/\n\t\tif($viewport && $viewport.hasAttribute(\"content\")) {\n\t\t\tlet content = $viewport.getAttribute(\"content\");\n\t\t\tlet _width = content.match(/width\\s*=\\s*([^,]*)/);\n\t\t\tlet _height = content.match(/height\\s*=\\s*([^,]*)/);\n\t\t\tlet _scale = content.match(/initial-scale\\s*=\\s*([^,]*)/);\n\t\t\tlet _minimum = content.match(/minimum-scale\\s*=\\s*([^,]*)/);\n\t\t\tlet _maximum = content.match(/maximum-scale\\s*=\\s*([^,]*)/);\n\t\t\tlet _scalable = content.match(/user-scalable\\s*=\\s*([^,]*)/);\n\n\t\t\tif(_width && _width.length && typeof _width[1] !== \"undefined\"){\n\t\t\t\tparsed.width = _width[1];\n\t\t\t}\n\t\t\tif(_height && _height.length && typeof _height[1] !== \"undefined\"){\n\t\t\t\tparsed.height = _height[1];\n\t\t\t}\n\t\t\tif(_scale && _scale.length && typeof _scale[1] !== \"undefined\"){\n\t\t\t\tparsed.scale = _scale[1];\n\t\t\t}\n\t\t\tif(_minimum && _minimum.length && typeof _minimum[1] !== \"undefined\"){\n\t\t\t\tparsed.minimum = _minimum[1];\n\t\t\t}\n\t\t\tif(_maximum && _maximum.length && typeof _maximum[1] !== \"undefined\"){\n\t\t\t\tparsed.maximum = _maximum[1];\n\t\t\t}\n\t\t\tif(_scalable && _scalable.length && typeof _scalable[1] !== \"undefined\"){\n\t\t\t\tparsed.scalable = _scalable[1];\n\t\t\t}\n\t\t}\n\n\t\tsettings = defaults(options || {}, parsed);\n\n\t\tif (options) {\n\t\t\tif (settings.width) {\n\t\t\t\tnewContent.push(\"width=\" + settings.width);\n\t\t\t}\n\n\t\t\tif (settings.height) {\n\t\t\t\tnewContent.push(\"height=\" + settings.height);\n\t\t\t}\n\n\t\t\tif (settings.scale) {\n\t\t\t\tnewContent.push(\"initial-scale=\" + settings.scale);\n\t\t\t}\n\n\t\t\tif (settings.scalable === \"no\") {\n\t\t\t\tnewContent.push(\"minimum-scale=\" + settings.scale);\n\t\t\t\tnewContent.push(\"maximum-scale=\" + settings.scale);\n\t\t\t\tnewContent.push(\"user-scalable=\" + settings.scalable);\n\t\t\t} else {\n\n\t\t\t\tif (settings.scalable) {\n\t\t\t\t\tnewContent.push(\"user-scalable=\" + settings.scalable);\n\t\t\t\t}\n\n\t\t\t\tif (settings.minimum) {\n\t\t\t\t\tnewContent.push(\"minimum-scale=\" + settings.minimum);\n\t\t\t\t}\n\n\t\t\t\tif (settings.maximum) {\n\t\t\t\t\tnewContent.push(\"minimum-scale=\" + settings.maximum);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (!$viewport) {\n\t\t\t\t$viewport = this.document.createElement(\"meta\");\n\t\t\t\t$viewport.setAttribute(\"name\", \"viewport\");\n\t\t\t\tthis.document.querySelector(\"head\").appendChild($viewport);\n\t\t\t}\n\n\t\t\t$viewport.setAttribute(\"content\", newContent.join(\", \"));\n\n\t\t\tthis.window.scrollTo(0, 0);\n\t\t}\n\n\n\t\treturn settings;\n\t}\n\n\t/**\n\t * Event emitter for when the contents has expanded\n\t * @private\n\t */\n\texpand() {\n\t\tthis.emit(EVENTS.CONTENTS.EXPAND);\n\t}\n\n\t/**\n\t * Add DOM listeners\n\t * @private\n\t */\n\tlisteners() {\n\t\tthis.imageLoadListeners();\n\n\t\tthis.mediaQueryListeners();\n\n\t\t// this.fontLoadListeners();\n\n\t\tthis.addEventListeners();\n\n\t\tthis.addSelectionListeners();\n\n\t\t// this.transitionListeners();\n\n\t\tif (typeof ResizeObserver === \"undefined\") {\n\t\t\tthis.resizeListeners();\n\t\t\tthis.visibilityListeners();\n\t\t} else {\n\t\t\tthis.resizeObservers();\n\t\t}\n\n\t\t// this.mutationObservers();\n\n\t\tthis.linksHandler();\n\t}\n\n\t/**\n\t * Remove DOM listeners\n\t * @private\n\t */\n\tremoveListeners() {\n\n\t\tthis.removeEventListeners();\n\n\t\tthis.removeSelectionListeners();\n\n\t\tif (this.observer) {\n\t\t\tthis.observer.disconnect();\n\t\t}\n\n\t\tclearTimeout(this.expanding);\n\t}\n\n\t/**\n\t * Check if size of contents has changed and\n\t * emit 'resize' event if it has.\n\t * @private\n\t */\n\tresizeCheck() {\n\t\tlet width = this.textWidth();\n\t\tlet height = this.textHeight();\n\n\t\tif (width != this._size.width || height != this._size.height) {\n\n\t\t\tthis._size = {\n\t\t\t\twidth: width,\n\t\t\t\theight: height\n\t\t\t};\n\n\t\t\tthis.onResize && this.onResize(this._size);\n\t\t\tthis.emit(EVENTS.CONTENTS.RESIZE, this._size);\n\t\t}\n\t}\n\n\t/**\n\t * Poll for resize detection\n\t * @private\n\t */\n\tresizeListeners() {\n\t\tvar width, height;\n\t\t// Test size again\n\t\tclearTimeout(this.expanding);\n\t\trequestAnimationFrame(this.resizeCheck.bind(this));\n\t\tthis.expanding = setTimeout(this.resizeListeners.bind(this), 350);\n\t}\n\n\t/**\n\t * Listen for visibility of tab to change\n\t * @private\n\t */\n\tvisibilityListeners() {\n\t\tdocument.addEventListener(\"visibilitychange\", () => {\n\t\t\tif (document.visibilityState === \"visible\" && this.active === false) {\n\t\t\t\tthis.active = true;\n\t\t\t\tthis.resizeListeners();\n\t\t\t} else {\n\t\t\t\tthis.active = false;\n\t\t\t\tclearTimeout(this.expanding);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Use css transitions to detect resize\n\t * @private\n\t */\n\ttransitionListeners() {\n\t\tlet body = this.content;\n\n\t\tbody.style['transitionProperty'] = \"font, font-size, font-size-adjust, font-stretch, font-variation-settings, font-weight, width, height\";\n\t\tbody.style['transitionDuration'] = \"0.001ms\";\n\t\tbody.style['transitionTimingFunction'] = \"linear\";\n\t\tbody.style['transitionDelay'] = \"0\";\n\n\t\tthis._resizeCheck = this.resizeCheck.bind(this);\n\t\tthis.document.addEventListener('transitionend', this._resizeCheck);\n\t}\n\n\t/**\n\t * Listen for media query changes and emit 'expand' event\n\t * Adapted from: https://github.com/tylergaw/media-query-events/blob/master/js/mq-events.js\n\t * @private\n\t */\n\tmediaQueryListeners() {\n\t\tvar sheets = this.document.styleSheets;\n\t\tvar mediaChangeHandler = function(m){\n\t\t\tif(m.matches && !this._expanding) {\n\t\t\t\tsetTimeout(this.expand.bind(this), 1);\n\t\t\t}\n\t\t}.bind(this);\n\n\t\tfor (var i = 0; i < sheets.length; i += 1) {\n\t\t\tvar rules;\n\t\t\t// Firefox errors if we access cssRules cross-domain\n\t\t\ttry {\n\t\t\t\trules = sheets[i].cssRules;\n\t\t\t} catch (e) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(!rules) return; // Stylesheets changed\n\t\t\tfor (var j = 0; j < rules.length; j += 1) {\n\t\t\t\t//if (rules[j].constructor === CSSMediaRule) {\n\t\t\t\tif(rules[j].media){\n\t\t\t\t\tvar mql = this.window.matchMedia(rules[j].media.mediaText);\n\t\t\t\t\tmql.addListener(mediaChangeHandler);\n\t\t\t\t\t//mql.onchange = mediaChangeHandler;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Use ResizeObserver to listen for changes in the DOM and check for resize\n\t * @private\n\t */\n\tresizeObservers() {\n\t\t// create an observer instance\n\t\tthis.observer = new ResizeObserver((e) => {\n\t\t\trequestAnimationFrame(this.resizeCheck.bind(this));\n\t\t});\n\n\t\t// pass in the target node\n\t\tthis.observer.observe(this.document.documentElement);\n\t}\n\n\t/**\n\t * Use MutationObserver to listen for changes in the DOM and check for resize\n\t * @private\n\t */\n\tmutationObservers() {\n\t\t// create an observer instance\n\t\tthis.observer = new MutationObserver((mutations) => {\n\t\t\tthis.resizeCheck();\n\t\t});\n\n\t\t// configuration of the observer:\n\t\tlet config = { attributes: true, childList: true, characterData: true, subtree: true };\n\n\t\t// pass in the target node, as well as the observer options\n\t\tthis.observer.observe(this.document, config);\n\t}\n\n\t/**\n\t * Test if images are loaded or add listener for when they load\n\t * @private\n\t */\n\timageLoadListeners() {\n\t\tvar images = this.document.querySelectorAll(\"img\");\n\t\tvar img;\n\t\tfor (var i = 0; i < images.length; i++) {\n\t\t\timg = images[i];\n\n\t\t\tif (typeof img.naturalWidth !== \"undefined\" &&\n\t\t\t\t\timg.naturalWidth === 0) {\n\t\t\t\timg.onload = this.expand.bind(this);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Listen for font load and check for resize when loaded\n\t * @private\n\t */\n\tfontLoadListeners() {\n\t\tif (!this.document || !this.document.fonts) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.document.fonts.ready.then(function () {\n\t\t\tthis.resizeCheck();\n\t\t}.bind(this));\n\n\t}\n\n\t/**\n\t * Get the documentElement\n\t * @returns {element} documentElement\n\t */\n\troot() {\n\t\tif(!this.document) return null;\n\t\treturn this.document.documentElement;\n\t}\n\n\t/**\n\t * Get the location offset of a EpubCFI or an #id\n\t * @param {string | EpubCFI} target\n\t * @param {string} [ignoreClass] for the cfi\n\t * @returns { {left: Number, top: Number }\n\t */\n\tlocationOf(target, ignoreClass) {\n\t\tvar position;\n\t\tvar targetPos = {\"left\": 0, \"top\": 0};\n\n\t\tif(!this.document) return targetPos;\n\n\t\tif(this.epubcfi.isCfiString(target)) {\n\t\t\tlet range = new EpubCFI(target).toRange(this.document, ignoreClass);\n\n\t\t\tif(range) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!range.endContainer ||\n\t\t\t\t\t\t(range.startContainer == range.endContainer\n\t\t\t\t\t\t&& range.startOffset == range.endOffset)) {\n\t\t\t\t\t\t// If the end for the range is not set, it results in collapsed becoming\n\t\t\t\t\t\t// true. This in turn leads to inconsistent behaviour when calling\n\t\t\t\t\t\t// getBoundingRect. Wrong bounds lead to the wrong page being displayed.\n\t\t\t\t\t\t// https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/15684911/\n\t\t\t\t\t\tlet pos = range.startContainer.textContent.indexOf(\" \", range.startOffset);\n\t\t\t\t\t\tif (pos == -1) {\n\t\t\t\t\t\t\tpos = range.startContainer.textContent.length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trange.setEnd(range.startContainer, pos);\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {\n\t\t\t\t\tconsole.error(\"setting end offset to start container length failed\", e);\n\t\t\t\t}\n\n\t\t\t\tif (range.startContainer.nodeType === Node.ELEMENT_NODE) {\n\t\t\t\t\tposition = range.startContainer.getBoundingClientRect();\n\t\t\t\t\ttargetPos.left = position.left;\n\t\t\t\t\ttargetPos.top = position.top;\n\t\t\t\t} else {\n\t\t\t\t\t// Webkit does not handle collapsed range bounds correctly\n\t\t\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=138949\n\n\t\t\t\t\t// Construct a new non-collapsed range\n\t\t\t\t\tif (isWebkit) {\n\t\t\t\t\t\tlet container = range.startContainer;\n\t\t\t\t\t\tlet newRange = new Range();\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tif (container.nodeType === ELEMENT_NODE) {\n\t\t\t\t\t\t\t\tposition = container.getBoundingClientRect();\n\t\t\t\t\t\t\t} else if (range.startOffset + 2 < container.length) {\n\t\t\t\t\t\t\t\tnewRange.setStart(container, range.startOffset);\n\t\t\t\t\t\t\t\tnewRange.setEnd(container, range.startOffset + 2);\n\t\t\t\t\t\t\t\tposition = newRange.getBoundingClientRect();\n\t\t\t\t\t\t\t} else if (range.startOffset - 2 > 0) {\n\t\t\t\t\t\t\t\tnewRange.setStart(container, range.startOffset - 2);\n\t\t\t\t\t\t\t\tnewRange.setEnd(container, range.startOffset);\n\t\t\t\t\t\t\t\tposition = newRange.getBoundingClientRect();\n\t\t\t\t\t\t\t} else { // empty, return the parent element\n\t\t\t\t\t\t\t\tposition = container.parentNode.getBoundingClientRect();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.error(e, e.stack);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tposition = range.getBoundingClientRect();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else if(typeof target === \"string\" &&\n\t\t\ttarget.indexOf(\"#\") > -1) {\n\n\t\t\tlet id = target.substring(target.indexOf(\"#\")+1);\n\t\t\tlet el = this.document.getElementById(id);\n\t\t\tif(el) {\n\t\t\t\tif (isWebkit) {\n\t\t\t\t\t// Webkit reports incorrect bounding rects in Columns\n\t\t\t\t\tlet newRange = new Range();\n\t\t\t\t\tnewRange.selectNode(el);\n\t\t\t\t\tposition = newRange.getBoundingClientRect();\n\t\t\t\t} else {\n\t\t\t\t\tposition = el.getBoundingClientRect();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (position) {\n\t\t\ttargetPos.left = position.left;\n\t\t\ttargetPos.top = position.top;\n\t\t}\n\n\t\treturn targetPos;\n\t}\n\n\t/**\n\t * Append a stylesheet link to the document head\n\t * @param {string} src url\n\t */\n\taddStylesheet(src) {\n\t\treturn new Promise(function(resolve, reject){\n\t\t\tvar $stylesheet;\n\t\t\tvar ready = false;\n\n\t\t\tif(!this.document) {\n\t\t\t\tresolve(false);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Check if link already exists\n\t\t\t$stylesheet = this.document.querySelector(\"link[href='\"+src+\"']\");\n\t\t\tif ($stylesheet) {\n\t\t\t\tresolve(true);\n\t\t\t\treturn; // already present\n\t\t\t}\n\n\t\t\t$stylesheet = this.document.createElement(\"link\");\n\t\t\t$stylesheet.type = \"text/css\";\n\t\t\t$stylesheet.rel = \"stylesheet\";\n\t\t\t$stylesheet.href = src;\n\t\t\t$stylesheet.onload = $stylesheet.onreadystatechange = function() {\n\t\t\t\tif ( !ready && (!this.readyState || this.readyState == \"complete\") ) {\n\t\t\t\t\tready = true;\n\t\t\t\t\t// Let apply\n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}, 1);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.document.head.appendChild($stylesheet);\n\n\t\t}.bind(this));\n\t}\n\n\t_getStylesheetNode(key) {\n\t\tvar styleEl;\n\t\tkey = \"epubjs-inserted-css-\" + (key || '');\n\n\t\tif(!this.document) return false;\n\n\t\t// Check if link already exists\n\t\tstyleEl = this.document.getElementById(key);\n\t\tif (!styleEl) {\n\t\t\tstyleEl = this.document.createElement(\"style\");\n\t\t\tstyleEl.id = key;\n\t\t\t// Append style element to head\n\t\t\tthis.document.head.appendChild(styleEl);\n\t\t}\n\t\treturn styleEl;\n\t}\n\n\t/**\n\t * Append stylesheet css\n\t * @param {string} serializedCss\n\t * @param {string} key If the key is the same, the CSS will be replaced instead of inserted\n\t */\n\taddStylesheetCss(serializedCss, key) {\n\t\tif(!this.document || !serializedCss) return false;\n\n\t\tvar styleEl;\n\t\tstyleEl = this._getStylesheetNode(key);\n\t\tstyleEl.innerHTML = serializedCss;\n\n\t\treturn true;\n\t}\n\n\t/**\n\t * Append stylesheet rules to a generate stylesheet\n\t * Array: https://developer.mozilla.org/en-US/docs/Web/API/CSSStyleSheet/insertRule\n\t * Object: https://github.com/desirable-objects/json-to-css\n\t * @param {array | object} rules\n\t * @param {string} key If the key is the same, the CSS will be replaced instead of inserted\n\t */\n\taddStylesheetRules(rules, key) {\n\t\tvar styleSheet;\n\n\t\tif(!this.document || !rules || rules.length === 0) return;\n\n\t\t// Grab style sheet\n\t\tstyleSheet = this._getStylesheetNode(key).sheet;\n\n\t\tif (Object.prototype.toString.call(rules) === \"[object Array]\") {\n\t\t\tfor (var i = 0, rl = rules.length; i < rl; i++) {\n\t\t\t\tvar j = 1, rule = rules[i], selector = rules[i][0], propStr = \"\";\n\t\t\t\t// If the second argument of a rule is an array of arrays, correct our variables.\n\t\t\t\tif (Object.prototype.toString.call(rule[1][0]) === \"[object Array]\") {\n\t\t\t\t\trule = rule[1];\n\t\t\t\t\tj = 0;\n\t\t\t\t}\n\n\t\t\t\tfor (var pl = rule.length; j < pl; j++) {\n\t\t\t\t\tvar prop = rule[j];\n\t\t\t\t\tpropStr += prop[0] + \":\" + prop[1] + (prop[2] ? \" !important\" : \"\") + \";\\n\";\n\t\t\t\t}\n\n\t\t\t\t// Insert CSS Rule\n\t\t\t\tstyleSheet.insertRule(selector + \"{\" + propStr + \"}\", styleSheet.cssRules.length);\n\t\t\t}\n\t\t} else {\n\t\t\tconst selectors = Object.keys(rules);\n\t\t\tselectors.forEach((selector) => {\n\t\t\t\tconst definition = rules[selector];\n\t\t\t\tif (Array.isArray(definition)) {\n\t\t\t\t\tdefinition.forEach((item) => {\n\t\t\t\t\t\tconst _rules = Object.keys(item);\n\t\t\t\t\t\tconst result = _rules.map((rule) => {\n\t\t\t\t\t\t\treturn `${rule}:${item[rule]}`;\n\t\t\t\t\t\t}).join(';');\n\t\t\t\t\t\tstyleSheet.insertRule(`${selector}{${result}}`, styleSheet.cssRules.length);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst _rules = Object.keys(definition);\n\t\t\t\t\tconst result = _rules.map((rule) => {\n\t\t\t\t\t\treturn `${rule}:${definition[rule]}`;\n\t\t\t\t\t}).join(';');\n\t\t\t\t\tstyleSheet.insertRule(`${selector}{${result}}`, styleSheet.cssRules.length);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t/**\n\t * Append a script tag to the document head\n\t * @param {string} src url\n\t * @returns {Promise} loaded\n\t */\n\taddScript(src) {\n\n\t\treturn new Promise(function(resolve, reject){\n\t\t\tvar $script;\n\t\t\tvar ready = false;\n\n\t\t\tif(!this.document) {\n\t\t\t\tresolve(false);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$script = this.document.createElement(\"script\");\n\t\t\t$script.type = \"text/javascript\";\n\t\t\t$script.async = true;\n\t\t\t$script.src = src;\n\t\t\t$script.onload = $script.onreadystatechange = function() {\n\t\t\t\tif ( !ready && (!this.readyState || this.readyState == \"complete\") ) {\n\t\t\t\t\tready = true;\n\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\tresolve(true);\n\t\t\t\t\t}, 1);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tthis.document.head.appendChild($script);\n\n\t\t}.bind(this));\n\t}\n\n\t/**\n\t * Add a class to the contents container\n\t * @param {string} className\n\t */\n\taddClass(className) {\n\t\tvar content;\n\n\t\tif(!this.document) return;\n\n\t\tcontent = this.content || this.document.body;\n\n\t\tif (content) {\n\t\t\tcontent.classList.add(className);\n\t\t}\n\n\t}\n\n\t/**\n\t * Remove a class from the contents container\n\t * @param {string} removeClass\n\t */\n\tremoveClass(className) {\n\t\tvar content;\n\n\t\tif(!this.document) return;\n\n\t\tcontent = this.content || this.document.body;\n\n\t\tif (content) {\n\t\t\tcontent.classList.remove(className);\n\t\t}\n\n\t}\n\n\t/**\n\t * Add DOM event listeners\n\t * @private\n\t */\n\taddEventListeners(){\n\t\tif(!this.document) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._triggerEvent = this.triggerEvent.bind(this);\n\n\t\tDOM_EVENTS.forEach(function(eventName){\n\t\t\tthis.document.addEventListener(eventName, this._triggerEvent, { passive: true });\n\t\t}, this);\n\n\t}\n\n\t/**\n\t * Remove DOM event listeners\n\t * @private\n\t */\n\tremoveEventListeners(){\n\t\tif(!this.document) {\n\t\t\treturn;\n\t\t}\n\t\tDOM_EVENTS.forEach(function(eventName){\n\t\t\tthis.document.removeEventListener(eventName, this._triggerEvent, { passive: true });\n\t\t}, this);\n\t\tthis._triggerEvent = undefined;\n\t}\n\n\t/**\n\t * Emit passed browser events\n\t * @private\n\t */\n\ttriggerEvent(e){\n\t\tthis.emit(e.type, e);\n\t}\n\n\t/**\n\t * Add listener for text selection\n\t * @private\n\t */\n\taddSelectionListeners(){\n\t\tif(!this.document) {\n\t\t\treturn;\n\t\t}\n\t\tthis._onSelectionChange = this.onSelectionChange.bind(this);\n\t\tthis.document.addEventListener(\"selectionchange\", this._onSelectionChange, { passive: true });\n\t}\n\n\t/**\n\t * Remove listener for text selection\n\t * @private\n\t */\n\tremoveSelectionListeners(){\n\t\tif(!this.document) {\n\t\t\treturn;\n\t\t}\n\t\tthis.document.removeEventListener(\"selectionchange\", this._onSelectionChange, { passive: true });\n\t\tthis._onSelectionChange = undefined;\n\t}\n\n\t/**\n\t * Handle getting text on selection\n\t * @private\n\t */\n\tonSelectionChange(e){\n\t\tif (this.selectionEndTimeout) {\n\t\t\tclearTimeout(this.selectionEndTimeout);\n\t\t}\n\t\tthis.selectionEndTimeout = setTimeout(function() {\n\t\t\tvar selection = this.window.getSelection();\n\t\t\tthis.triggerSelectedEvent(selection);\n\t\t}.bind(this), 250);\n\t}\n\n\t/**\n\t * Emit event on text selection\n\t * @private\n\t */\n\ttriggerSelectedEvent(selection){\n\t\tvar range, cfirange;\n\n\t\tif (selection && selection.rangeCount > 0) {\n\t\t\trange = selection.getRangeAt(0);\n\t\t\tif(!range.collapsed) {\n\t\t\t\t// cfirange = this.section.cfiFromRange(range);\n\t\t\t\tcfirange = new EpubCFI(range, this.cfiBase).toString();\n\t\t\t\tthis.emit(EVENTS.CONTENTS.SELECTED, cfirange);\n\t\t\t\tthis.emit(EVENTS.CONTENTS.SELECTED_RANGE, range);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Get a Dom Range from EpubCFI\n\t * @param {EpubCFI} _cfi\n\t * @param {string} [ignoreClass]\n\t * @returns {Range} range\n\t */\n\trange(_cfi, ignoreClass){\n\t\tvar cfi = new EpubCFI(_cfi);\n\t\treturn cfi.toRange(this.document, ignoreClass);\n\t}\n\n\t/**\n\t * Get an EpubCFI from a Dom Range\n\t * @param {Range} range\n\t * @param {string} [ignoreClass]\n\t * @returns {EpubCFI} cfi\n\t */\n\tcfiFromRange(range, ignoreClass){\n\t\treturn new EpubCFI(range, this.cfiBase, ignoreClass).toString();\n\t}\n\n\t/**\n\t * Get an EpubCFI from a Dom node\n\t * @param {node} node\n\t * @param {string} [ignoreClass]\n\t * @returns {EpubCFI} cfi\n\t */\n\tcfiFromNode(node, ignoreClass){\n\t\treturn new EpubCFI(node, this.cfiBase, ignoreClass).toString();\n\t}\n\n\t// TODO: find where this is used - remove?\n\tmap(layout){\n\t\tvar map = new Mapping(layout);\n\t\treturn map.section();\n\t}\n\n\t/**\n\t * Size the contents to a given width and height\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n\tsize(width, height){\n\t\tvar viewport = { scale: 1.0, scalable: \"no\" };\n\n\t\tthis.layoutStyle(\"scrolling\");\n\n\t\tif (width >= 0) {\n\t\t\tthis.width(width);\n\t\t\tviewport.width = width;\n\t\t\tthis.css(\"padding\", \"0 \"+(width/12)+\"px\");\n\t\t}\n\n\t\tif (height >= 0) {\n\t\t\tthis.height(height);\n\t\t\tviewport.height = height;\n\t\t}\n\n\t\tthis.css(\"margin\", \"0\");\n\t\tthis.css(\"box-sizing\", \"border-box\");\n\n\n\t\tthis.viewport(viewport);\n\t}\n\n\t/**\n\t * Apply columns to the contents for pagination\n\t * @param {number} width\n\t * @param {number} height\n\t * @param {number} columnWidth\n\t * @param {number} gap\n\t */\n\tcolumns(width, height, columnWidth, gap, dir){\n\t\tlet COLUMN_AXIS = prefixed(\"column-axis\");\n\t\tlet COLUMN_GAP = prefixed(\"column-gap\");\n\t\tlet COLUMN_WIDTH = prefixed(\"column-width\");\n\t\tlet COLUMN_FILL = prefixed(\"column-fill\");\n\n\t\tlet writingMode = this.writingMode();\n\t\tlet axis = (writingMode.indexOf(\"vertical\") === 0) ? \"vertical\" : \"horizontal\";\n\n\t\tthis.layoutStyle(\"paginated\");\n\n\t\tif (dir === \"rtl\" && axis === \"horizontal\") {\n\t\t\tthis.direction(dir);\n\t\t}\n\n\t\tthis.width(width);\n\t\tthis.height(height);\n\n\t\t// Deal with Mobile trying to scale to viewport\n\t\tthis.viewport({ width: width, height: height, scale: 1.0, scalable: \"no\" });\n\n\t\t// TODO: inline-block needs more testing\n\t\t// Fixes Safari column cut offs, but causes RTL issues\n\t\t// this.css(\"display\", \"inline-block\");\n\n\t\tthis.css(\"overflow-y\", \"hidden\");\n\t\tthis.css(\"margin\", \"0\", true);\n\n\t\tif (axis === \"vertical\") {\n\t\t\tthis.css(\"padding-top\", (gap / 2) + \"px\", true);\n\t\t\tthis.css(\"padding-bottom\", (gap / 2) + \"px\", true);\n\t\t\tthis.css(\"padding-left\", \"20px\");\n\t\t\tthis.css(\"padding-right\", \"20px\");\n\t\t\tthis.css(COLUMN_AXIS, \"vertical\");\n\t\t} else {\n\t\t\tthis.css(\"padding-top\", \"20px\");\n\t\t\tthis.css(\"padding-bottom\", \"20px\");\n\t\t\tthis.css(\"padding-left\", (gap / 2) + \"px\", true);\n\t\t\tthis.css(\"padding-right\", (gap / 2) + \"px\", true);\n\t\t\tthis.css(COLUMN_AXIS, \"horizontal\");\n\t\t}\n\n\t\tthis.css(\"box-sizing\", \"border-box\");\n\t\tthis.css(\"max-width\", \"inherit\");\n\n\t\tthis.css(COLUMN_FILL, \"auto\");\n\n\t\tthis.css(COLUMN_GAP, gap+\"px\");\n\t\tthis.css(COLUMN_WIDTH, columnWidth+\"px\");\n\n\t\t// Fix glyph clipping in WebKit\n\t\t// https://github.com/futurepress/epub.js/issues/983\n\t\tthis.css(\"-webkit-line-box-contain\", \"block glyphs replaced\");\n\t}\n\n\t/**\n\t * Scale contents from center\n\t * @param {number} scale\n\t * @param {number} offsetX\n\t * @param {number} offsetY\n\t */\n\tscaler(scale, offsetX, offsetY){\n\t\tvar scaleStr = \"scale(\" + scale + \")\";\n\t\tvar translateStr = \"\";\n\t\t// this.css(\"position\", \"absolute\"));\n\t\tthis.css(\"transform-origin\", \"top left\");\n\n\t\tif (offsetX >= 0 || offsetY >= 0) {\n\t\t\ttranslateStr = \" translate(\" + (offsetX || 0 )+ \"px, \" + (offsetY || 0 )+ \"px )\";\n\t\t}\n\n\t\tthis.css(\"transform\", scaleStr + translateStr);\n\t}\n\n\t/**\n\t * Fit contents into a fixed width and height\n\t * @param {number} width\n\t * @param {number} height\n\t */\n\tfit(width, height, section){\n\t\tvar viewport = this.viewport();\n\t\tvar viewportWidth = parseInt(viewport.width);\n\t\tvar viewportHeight = parseInt(viewport.height);\n\t\tvar widthScale = width / viewportWidth;\n\t\tvar heightScale = height / viewportHeight;\n\t\tvar scale = widthScale < heightScale ? widthScale : heightScale;\n\n\t\t// the translate does not work as intended, elements can end up unaligned\n\t\t// var offsetY = (height - (viewportHeight * scale)) / 2;\n\t\t// var offsetX = 0;\n\t\t// if (this.sectionIndex % 2 === 1) {\n\t\t// \toffsetX = width - (viewportWidth * scale);\n\t\t// }\n\n\t\tthis.layoutStyle(\"paginated\");\n\n\t\t// scale needs width and height to be set\n\t\tthis.width(viewportWidth);\n\t\tthis.height(viewportHeight);\n\t\tthis.overflow(\"hidden\");\n\n\t\t// Scale to the correct size\n\t\tthis.scaler(scale, 0, 0);\n\t\t// this.scaler(scale, offsetX > 0 ? offsetX : 0, offsetY);\n\n\t\t// background images are not scaled by transform\n\t\tthis.css(\"background-size\", viewportWidth * scale + \"px \" + viewportHeight * scale + \"px\");\n\n\t\tthis.css(\"background-color\", \"transparent\");\n\t\tif (section && section.properties.includes(\"page-spread-left\")) {\n\t\t\t// set margin since scale is weird\n\t\t\tvar marginLeft = width - (viewportWidth * scale);\n\t\t\tthis.css(\"margin-left\", marginLeft + \"px\");\n\t\t}\n\t}\n\n\t/**\n\t * Set the direction of the text\n\t * @param {string} [dir=\"ltr\"] \"rtl\" | \"ltr\"\n\t */\n\tdirection(dir) {\n\t\tif (this.documentElement) {\n\t\t\tthis.documentElement.style[\"direction\"] = dir;\n\t\t}\n\t}\n\n\tmapPage(cfiBase, layout, start, end, dev) {\n\t\tvar mapping = new Mapping(layout, dev);\n\n\t\treturn mapping.page(this, cfiBase, start, end);\n\t}\n\n\t/**\n\t * Emit event when link in content is clicked\n\t * @private\n\t */\n\tlinksHandler() {\n\t\treplaceLinks(this.content, (href) => {\n\t\t\tthis.emit(EVENTS.CONTENTS.LINK_CLICKED, href);\n\t\t});\n\t}\n\n\t/**\n\t * Set the writingMode of the text\n\t * @param {string} [mode=\"horizontal-tb\"] \"horizontal-tb\" | \"vertical-rl\" | \"vertical-lr\"\n\t */\n\twritingMode(mode) {\n\t\tlet WRITING_MODE = prefixed(\"writing-mode\");\n\n\t\tif (mode && this.documentElement) {\n\t\t\tthis.documentElement.style[WRITING_MODE] = mode;\n\t\t}\n\n\t\treturn this.window.getComputedStyle(this.documentElement)[WRITING_MODE] || '';\n\t}\n\n\t/**\n\t * Set the layoutStyle of the content\n\t * @param {string} [style=\"paginated\"] \"scrolling\" | \"paginated\"\n\t * @private\n\t */\n\tlayoutStyle(style) {\n\n\t\tif (style) {\n\t\t\tthis._layoutStyle = style;\n\t\t\tnavigator.epubReadingSystem.layoutStyle = this._layoutStyle;\n\t\t}\n\n\t\treturn this._layoutStyle || \"paginated\";\n\t}\n\n\t/**\n\t * Add the epubReadingSystem object to the navigator\n\t * @param {string} name\n\t * @param {string} version\n\t * @private\n\t */\n\tepubReadingSystem(name, version) {\n\t\tnavigator.epubReadingSystem = {\n\t\t\tname: name,\n\t\t\tversion: version,\n\t\t\tlayoutStyle: this.layoutStyle(),\n\t\t\thasFeature: function (feature) {\n\t\t\t\tswitch (feature) {\n\t\t\t\t\tcase \"dom-manipulation\":\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tcase \"layout-changes\":\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tcase \"touch-events\":\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tcase \"mouse-events\":\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tcase \"keyboard-events\":\n\t\t\t\t\t\treturn true;\n\t\t\t\t\tcase \"spine-scripting\":\n\t\t\t\t\t\treturn false;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\treturn navigator.epubReadingSystem;\n\t}\n\n\tdestroy() {\n\t\t// this.document.removeEventListener('transitionend', this._resizeCheck);\n\n\t\tthis.removeListeners();\n\n\t}\n}\n\nEventEmitter(Contents.prototype);\n\nexport default Contents;\n"],"names":["hasNavigator","isChrome","isWebkit","ELEMENT_NODE","Contents","doc","content","cfiBase","sectionIndex","EpubCFI","EPUBJS_VERSION","DOM_EVENTS","w","frame","isNumber","h","rect","width","range","border","borders","height","overflow","property","value","priority","options","$viewport","parsed","newContent","settings","_width","_height","_scale","_minimum","_maximum","_scalable","defaults","EVENTS","body","sheets","mediaChangeHandler","m","rules","j","mql","e","mutations","config","images","img","target","ignoreClass","position","targetPos","pos","container","newRange","id","el","src","resolve","reject","$stylesheet","ready","key","styleEl","serializedCss","styleSheet","i","rl","rule","selector","propStr","pl","prop","definition","item","result","$script","className","eventName","selection","cfirange","_cfi","cfi","node","layout","map","Mapping","viewport","columnWidth","gap","dir","COLUMN_AXIS","prefixed","COLUMN_GAP","COLUMN_WIDTH","COLUMN_FILL","axis","scale","offsetX","offsetY","scaleStr","translateStr","section","viewportWidth","viewportHeight","widthScale","heightScale","marginLeft","start","end","dev","mapping","replaceLinks","href","mode","WRITING_MODE","style","name","version","feature","EventEmitter"],"mappings":"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","x_google_ignoreList":[0]}