@internetarchive/bookreader 5.0.0-24-sortingstate-2 → 5.0.0-24-sortingstate-6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/BookReader/BookReader.js +1 -1
  2. package/BookReader/icons/1up.svg +12 -1
  3. package/BookReader/icons/2up.svg +15 -1
  4. package/BookReader/icons/advance.svg +26 -3
  5. package/BookReader/icons/chevron-right.svg +1 -1
  6. package/BookReader/icons/close-circle-dark.svg +1 -1
  7. package/BookReader/icons/close-circle.svg +1 -1
  8. package/BookReader/icons/fullscreen.svg +17 -1
  9. package/BookReader/icons/fullscreen_exit.svg +17 -1
  10. package/BookReader/icons/hamburger.svg +15 -1
  11. package/BookReader/icons/left-arrow.svg +12 -1
  12. package/BookReader/icons/magnify-minus.svg +16 -1
  13. package/BookReader/icons/magnify-plus.svg +17 -1
  14. package/BookReader/icons/magnify.svg +15 -1
  15. package/BookReader/icons/pause.svg +23 -1
  16. package/BookReader/icons/play.svg +22 -1
  17. package/BookReader/icons/playback-speed.svg +34 -1
  18. package/BookReader/icons/read-aloud.svg +22 -1
  19. package/BookReader/icons/review.svg +22 -3
  20. package/BookReader/icons/thumbnails.svg +17 -1
  21. package/BookReader/icons/voice.svg +1 -1
  22. package/BookReader/icons/volume-full.svg +22 -1
  23. package/BookReader/images/BRicons.svg +94 -5
  24. package/BookReader/images/books_graphic.svg +177 -1
  25. package/BookReader/images/icon_book.svg +12 -1
  26. package/BookReader/images/icon_bookmark.svg +12 -1
  27. package/BookReader/images/icon_gear.svg +14 -1
  28. package/BookReader/images/icon_hamburger.svg +20 -1
  29. package/BookReader/images/icon_home.svg +21 -1
  30. package/BookReader/images/icon_info.svg +11 -1
  31. package/BookReader/images/icon_one_page.svg +8 -1
  32. package/BookReader/images/icon_pause.svg +1 -1
  33. package/BookReader/images/icon_play.svg +1 -1
  34. package/BookReader/images/icon_playback-rate.svg +15 -1
  35. package/BookReader/images/icon_search_button.svg +8 -1
  36. package/BookReader/images/icon_share.svg +9 -1
  37. package/BookReader/images/icon_skip-ahead.svg +6 -1
  38. package/BookReader/images/icon_skip-back.svg +13 -2
  39. package/BookReader/images/icon_speaker.svg +18 -1
  40. package/BookReader/images/icon_speaker_open.svg +10 -1
  41. package/BookReader/images/icon_thumbnails.svg +12 -1
  42. package/BookReader/images/icon_toc.svg +5 -1
  43. package/BookReader/images/icon_two_pages.svg +9 -1
  44. package/BookReader/images/marker_chap-off.svg +11 -1
  45. package/BookReader/images/marker_chap-on.svg +11 -1
  46. package/BookReader/images/marker_srch-on.svg +11 -1
  47. package/BookReader/jquery-1.10.1.js +108 -2
  48. package/BookReader/plugins/plugin.archive_analytics.js +170 -1
  49. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  50. package/BookReader/plugins/plugin.autoplay.js +163 -1
  51. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  52. package/BookReader/plugins/plugin.chapters.js +333 -1
  53. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  54. package/BookReader/plugins/plugin.iframe.js +72 -1
  55. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  56. package/BookReader/plugins/plugin.mobile_nav.js +332 -1
  57. package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
  58. package/BookReader/plugins/plugin.resume.js +241 -1
  59. package/BookReader/plugins/plugin.resume.js.map +1 -1
  60. package/BookReader/plugins/plugin.search.js +1263 -1
  61. package/BookReader/plugins/plugin.search.js.map +1 -1
  62. package/BookReader/plugins/plugin.text_selection.js +839 -1
  63. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  64. package/BookReader/plugins/plugin.tts.js +9114 -2
  65. package/BookReader/plugins/plugin.tts.js.map +1 -1
  66. package/BookReader/plugins/plugin.url.js +17 -15
  67. package/BookReader/plugins/plugin.url.js.map +1 -1
  68. package/BookReader/plugins/plugin.vendor-fullscreen.js +326 -1
  69. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  70. package/BookReader/webcomponents-bundle.js +411 -2
  71. package/BookReader/webcomponents-bundle.js.map +1 -1
  72. package/package.json +1 -1
  73. package/src/plugins/plugin.url.js +9 -9
  74. package/tests/jest/plugins/plugin.url.test.js +11 -20
@@ -1 +1 @@
1
- {"version":3,"file":"plugins/plugin.text_selection.js","mappings":"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","sources":["webpack://@internetarchive/bookreader/./src/util/strings.js","webpack://@internetarchive/bookreader/./src/plugins/plugin.text_selection.js","webpack://@internetarchive/bookreader/./src/util/browserSniffing.js","webpack://@internetarchive/bookreader/./node_modules/core-js/internals/string-trim-forced.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.string.trim.js"],"sourcesContent":["/**\n * @typedef {String} StringWithVars\n * A template string with {{foo}} style variables\n * Also supports filters, like {{bookPath|urlencode}} (See APPLY_FILTERS for the\n * supported list of filters)\n **/\n\n/**\n * @param {StringWithVars|String} template\n * @param { {[varName: string]: { toString: () => string} } } vars\n * @param { {[varName: string]: { toString: () => string} } } [overrides]\n */\nexport function applyVariables(template, vars, overrides = {}, possibleFilters = APPLY_FILTERS) {\n return template?.replace(/\\{\\{([^}]*?)\\}\\}/g, ($0, $1) => {\n if (!$1) return $0;\n /** @type {string} */\n const expression = $1;\n const [varName, ...filterNames] = expression.split('|').map(x => x.trim());\n const defined = varName in overrides || varName in vars;\n\n // If it's not defined, don't expand it at all\n if (!defined) return $0;\n\n const value = varName in overrides ? overrides[varName]\n : varName in vars ? vars[varName] : null;\n const filters = filterNames.map(n => possibleFilters[n]);\n return filters.reduce((acc, cur) => cur(acc), value && value.toString());\n });\n}\n\n/** @type { {[filterName: String]:( string => string)} } */\nexport const APPLY_FILTERS = {\n urlencode: encodeURIComponent,\n};\n","//@ts-check\nimport { createSVGPageLayer } from '../BookReader/PageContainer.js';\nimport { isFirefox, isSafari } from '../util/browserSniffing.js';\nimport { applyVariables } from '../util/strings.js';\n/** @typedef {import('../util/strings.js').StringWithVars} StringWithVars */\n/** @typedef {import('../BookReader/PageContainer.js').PageContainer} PageContainer */\n\nconst BookReader = /** @type {typeof import('../BookReader').default} */(window.BookReader);\n\nexport const DEFAULT_OPTIONS = {\n enabled: true,\n /** @type {StringWithVars} The URL to fetch the entire DJVU xml. Supports options.vars */\n fullDjvuXmlUrl: null,\n /** @type {StringWithVars} The URL to fetch a single page of the DJVU xml. Supports options.vars. Also has {{pageIndex}} */\n singlePageDjvuXmlUrl: null,\n};\n/** @typedef {typeof DEFAULT_OPTIONS} TextSelectionPluginOptions */\n\n/**\n * @template T\n */\nexport class Cache {\n constructor(maxSize = 10) {\n this.maxSize = maxSize;\n /** @type {T[]} */\n this.entries = [];\n }\n\n /**\n * @param {T} entry\n */\n add(entry) {\n if (this.entries.length >= this.maxSize) {\n this.entries.shift();\n }\n this.entries.push(entry);\n }\n}\n\nexport class TextSelectionPlugin {\n\n constructor(options = DEFAULT_OPTIONS, optionVariables, avoidTspans = isFirefox(), pointerEventsOnParagraph = isSafari()) {\n this.options = options;\n this.optionVariables = optionVariables;\n /**@type {PromiseLike<JQuery<HTMLElement>|undefined>} */\n this.djvuPagesPromise = null;\n // Using text elements instead of tspans for words because Firefox does not allow svg tspan stretch.\n // Tspans are necessary on Chrome because they prevent newline character after every word when copying\n this.svgParagraphElement = \"text\";\n this.svgWordElement = \"tspan\";\n this.insertNewlines = avoidTspans;\n // Safari has a bug where `pointer-events` doesn't work on `<tspans>`. So\n // there we will set `pointer-events: all` on the paragraph element. We don't\n // do this everywhere, because it's a worse experience. Thanks Safari :/\n this.pointerEventsOnParagraph = pointerEventsOnParagraph;\n if (avoidTspans) {\n this.svgParagraphElement = \"g\";\n this.svgWordElement = \"text\";\n }\n\n /** @type {Cache<{index: number, response: any}>} */\n this.pageTextCache = new Cache();\n\n /**\n * Sometimes there are too many words on a page, and the browser becomes near\n * unusable. For now don't render text layer for pages with too many words.\n */\n this.maxWordRendered = 2500;\n }\n\n init() {\n // Only fetch the full djvu xml if the single page url isn't there\n if (this.options.singlePageDjvuXmlUrl) return;\n this.djvuPagesPromise = $.ajax({\n type: \"GET\",\n url: applyVariables(this.options.fullDjvuXmlUrl, this.optionVariables),\n dataType: \"html\",\n error: (e) => undefined\n }).then((res) => {\n try {\n const xmlMap = $.parseXML(res);\n return xmlMap && $(xmlMap).find(\"OBJECT\");\n } catch (e) {\n return undefined;\n }\n });\n }\n\n /**\n * @param {number} index\n * @returns {Promise<HTMLElement|undefined>}\n */\n async getPageText(index) {\n if (this.options.singlePageDjvuXmlUrl) {\n const cachedEntry = this.pageTextCache.entries.find(x => x.index == index);\n if (cachedEntry) {\n return cachedEntry.response;\n }\n return $.ajax({\n type: \"GET\",\n url: applyVariables(this.options.singlePageDjvuXmlUrl, this.optionVariables, { pageIndex: index }),\n dataType: \"html\",\n error: (e) => undefined,\n }).then((res) => {\n try {\n const xmlDoc = $.parseXML(res);\n const result = xmlDoc && $(xmlDoc).find(\"OBJECT\")[0];\n this.pageTextCache.add({ index, response: result });\n return result;\n } catch (e) {\n return undefined;\n }\n });\n } else {\n const XMLpagesArr = await this.djvuPagesPromise;\n if (XMLpagesArr) return XMLpagesArr[index];\n }\n }\n\n /**\n * Intercept copied text to remove any styling applied to it\n * @param {JQuery} $container\n */\n interceptCopy($container) {\n $container[0].addEventListener('copy', (event) => {\n const selection = document.getSelection();\n event.clipboardData.setData('text/plain', selection.toString());\n event.preventDefault();\n });\n }\n\n /**\n * Applies mouse events when in default mode\n * @param {SVGElement} svg\n */\n defaultMode(svg) {\n svg.classList.remove(\"selectingSVG\");\n $(svg).on(\"mousedown.textSelectPluginHandler\", (event) => {\n if (!$(event.target).is(\".BRwordElement\")) return;\n event.stopPropagation();\n svg.classList.add(\"selectingSVG\");\n $(svg).one(\"mouseup.textSelectPluginHandler\", (event) => {\n if (window.getSelection().toString() != \"\") {\n event.stopPropagation();\n $(svg).off(\".textSelectPluginHandler\");\n this.textSelectingMode(svg);\n }\n else svg.classList.remove(\"selectingSVG\");\n });\n });\n }\n\n /**\n * Applies mouse events when in textSelecting mode\n * @param {SVGElement} svg\n */\n textSelectingMode(svg) {\n $(svg).on('mousedown.textSelectPluginHandler', (event) => {\n if (!$(event.target).is(\".BRwordElement\")) {\n if (window.getSelection().toString() != \"\") window.getSelection().removeAllRanges();\n }\n event.stopPropagation();\n });\n $(svg).on('mouseup.textSelectPluginHandler', (event) => {\n event.stopPropagation();\n if (window.getSelection().toString() == \"\") {\n $(svg).off(\".textSelectPluginHandler\");\n this.defaultMode(svg); }\n });\n }\n\n /**\n * Initializes text selection modes if there is an svg on the page\n * @param {JQuery} $container\n */\n stopPageFlip($container) {\n /** @type {JQuery<SVGElement>} */\n const $svg = $container.find('svg.textSelectionSVG');\n if (!$svg.length) return;\n $svg.each((i, s) => this.defaultMode(s));\n this.interceptCopy($container);\n }\n\n /**\n * @param {PageContainer} pageContainer\n */\n async createTextLayer(pageContainer) {\n const pageIndex = pageContainer.page.index;\n const $container = pageContainer.$container;\n const $svgLayers = $container.find('.textSelectionSVG');\n if ($svgLayers.length) return;\n const XMLpage = await this.getPageText(pageIndex);\n if (!XMLpage) return;\n\n const totalWords = $(XMLpage).find(\"WORD\").length;\n if (totalWords > this.maxWordRendered) {\n console.log(`Page ${pageIndex} has too many words (${totalWords} > ${this.maxWordRendered}). Not rendering text layer.`);\n return;\n }\n\n const svg = createSVGPageLayer(pageContainer.page, 'textSelectionSVG');\n $container.append(svg);\n\n $(XMLpage).find(\"PARAGRAPH\").each((i, paragraph) => {\n // Adding text element for each paragraph in the page\n const words = $(paragraph).find(\"WORD\");\n if (!words.length) return;\n const paragSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", this.svgParagraphElement);\n paragSvg.setAttribute(\"class\", \"BRparagElement\");\n if (this.pointerEventsOnParagraph) {\n paragSvg.style.pointerEvents = \"all\";\n }\n\n const wordHeightArr = [];\n\n for (let i = 0; i < words.length; i++) {\n // Adding tspan for each word in paragraph\n const currWord = words[i];\n // eslint-disable-next-line no-unused-vars\n const [left, bottom, right, top] = $(currWord).attr(\"coords\").split(',').map(parseFloat);\n const wordHeight = bottom - top;\n wordHeightArr.push(wordHeight);\n\n const wordTspan = document.createElementNS(\"http://www.w3.org/2000/svg\", this.svgWordElement);\n wordTspan.setAttribute(\"class\", \"BRwordElement\");\n wordTspan.setAttribute(\"x\", left.toString());\n wordTspan.setAttribute(\"y\", bottom.toString());\n wordTspan.setAttribute(\"textLength\", (right - left).toString());\n wordTspan.setAttribute(\"lengthAdjust\", \"spacingAndGlyphs\");\n wordTspan.textContent = currWord.textContent;\n paragSvg.appendChild(wordTspan);\n\n // Adding spaces after words except at the end of the paragraph\n // TODO: assumes left-to-right text\n if (i < words.length - 1) {\n const nextWord = words[i + 1];\n // eslint-disable-next-line no-unused-vars\n const [leftNext, bottomNext, rightNext, topNext] = $(nextWord).attr(\"coords\").split(',').map(parseFloat);\n const spaceTspan = document.createElementNS(\"http://www.w3.org/2000/svg\", this.svgWordElement);\n spaceTspan.setAttribute(\"class\", \"BRwordElement\");\n spaceTspan.setAttribute(\"x\", right.toString());\n spaceTspan.setAttribute(\"y\", bottom.toString());\n if ((leftNext - right) > 0) spaceTspan.setAttribute(\"textLength\", (leftNext - right).toString());\n spaceTspan.setAttribute(\"lengthAdjust\", \"spacingAndGlyphs\");\n spaceTspan.textContent = \" \";\n paragSvg.appendChild(spaceTspan);\n }\n\n // Adds newline at the end of paragraph on Firefox\n if ((i == words.length - 1 && (this.insertNewlines))) {\n paragSvg.appendChild(document.createTextNode(\"\\n\"));\n }\n }\n\n wordHeightArr.sort();\n const paragWordHeight = wordHeightArr[Math.floor(wordHeightArr.length * 0.85)];\n paragSvg.setAttribute(\"font-size\", paragWordHeight.toString());\n svg.appendChild(paragSvg);\n });\n this.stopPageFlip($container);\n }\n}\n\nexport class BookreaderWithTextSelection extends BookReader {\n init() {\n const options = Object.assign({}, DEFAULT_OPTIONS, this.options.plugins.textSelection);\n if (options.enabled) {\n this.textSelectionPlugin = new TextSelectionPlugin(options, this.options.vars);\n // Write this back; this way the plugin is the source of truth, and BR just\n // contains a reference to it.\n this.options.plugins.textSelection = options;\n this.textSelectionPlugin.init();\n }\n super.init();\n }\n\n /**\n * @param {number} index\n */\n _createPageContainer(index) {\n const pageContainer = super._createPageContainer(index);\n // Disable if thumb mode; it's too janky\n // .page can be null for \"pre-cover\" region\n if (this.mode !== this.constModeThumb && pageContainer.page) {\n this.textSelectionPlugin?.createTextLayer(pageContainer);\n }\n return pageContainer;\n }\n}\nwindow.BookReader = BookreaderWithTextSelection;\nexport default BookreaderWithTextSelection;\n","\n/**\n * Checks whether the current browser is a Chrome/Chromium browser\n * Code from https://stackoverflow.com/a/4565120/2317712\n * @param {string} [userAgent]\n * @param {string} [vendor]\n * @return {boolean}\n */\nexport function isChrome(userAgent = navigator.userAgent, vendor = navigator.vendor) {\n return /chrome/i.test(userAgent) && /google inc/i.test(vendor);\n}\n\n/**\n * Checks whether the current browser is firefox\n * @param {string} [userAgent]\n * @return {boolean}\n */\nexport function isFirefox(userAgent = navigator.userAgent) {\n return /firefox/i.test(userAgent);\n}\n\n/**\n * Checks whether the current browser is safari\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent#Browser_Name\n * @param {string} [userAgent]\n * @return {boolean}\n */\nexport function isSafari(userAgent = navigator.userAgent) {\n return /safari/i.test(userAgent) && !/chrome|chromium/i.test(userAgent);\n}\n","var fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.es/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n"],"names":["applyVariables","template","vars","overrides","possibleFilters","APPLY_FILTERS","replace","$0","$1","split","map","x","trim","varName","filterNames","value","n","reduce","acc","cur","toString","urlencode","encodeURIComponent","BookReader","window","DEFAULT_OPTIONS","enabled","fullDjvuXmlUrl","singlePageDjvuXmlUrl","Cache","maxSize","this","entries","entry","length","shift","push","TextSelectionPlugin","options","optionVariables","avoidTspans","isFirefox","pointerEventsOnParagraph","isSafari","djvuPagesPromise","svgParagraphElement","svgWordElement","insertNewlines","pageTextCache","maxWordRendered","$","ajax","type","url","dataType","error","e","then","res","xmlMap","parseXML","find","index","cachedEntry","response","pageIndex","xmlDoc","result","add","XMLpagesArr","$container","addEventListener","event","selection","document","getSelection","clipboardData","setData","preventDefault","svg","classList","remove","on","target","is","stopPropagation","one","off","textSelectingMode","removeAllRanges","defaultMode","$svg","each","i","s","interceptCopy","pageContainer","page","getPageText","XMLpage","totalWords","console","log","createSVGPageLayer","append","paragraph","words","paragSvg","createElementNS","setAttribute","style","pointerEvents","wordHeightArr","currWord","attr","parseFloat","left","bottom","right","wordHeight","wordTspan","textContent","appendChild","nextWord","leftNext","spaceTspan","createTextNode","sort","paragWordHeight","Math","floor","stopPageFlip","BookreaderWithTextSelection","Object","assign","plugins","textSelection","textSelectionPlugin","init","mode","constModeThumb","createTextLayer","isChrome","userAgent","navigator","vendor","test","fails","whitespaces","module","exports","METHOD_NAME","name","$trim","proto","forced","forcedStringTrimMethod"],"sourceRoot":""}
1
+ {"version":3,"file":"plugins/plugin.text_selection.js","mappings":"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","sources":["webpack://@internetarchive/bookreader/./src/plugins/plugin.text_selection.js","webpack://@internetarchive/bookreader/./src/util/browserSniffing.js","webpack://@internetarchive/bookreader/./src/util/strings.js","webpack://@internetarchive/bookreader/./node_modules/core-js/internals/string-trim-forced.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.string.trim.js"],"sourcesContent":["//@ts-check\nimport { createSVGPageLayer } from '../BookReader/PageContainer.js';\nimport { isFirefox, isSafari } from '../util/browserSniffing.js';\nimport { applyVariables } from '../util/strings.js';\n/** @typedef {import('../util/strings.js').StringWithVars} StringWithVars */\n/** @typedef {import('../BookReader/PageContainer.js').PageContainer} PageContainer */\n\nconst BookReader = /** @type {typeof import('../BookReader').default} */(window.BookReader);\n\nexport const DEFAULT_OPTIONS = {\n enabled: true,\n /** @type {StringWithVars} The URL to fetch the entire DJVU xml. Supports options.vars */\n fullDjvuXmlUrl: null,\n /** @type {StringWithVars} The URL to fetch a single page of the DJVU xml. Supports options.vars. Also has {{pageIndex}} */\n singlePageDjvuXmlUrl: null,\n};\n/** @typedef {typeof DEFAULT_OPTIONS} TextSelectionPluginOptions */\n\n/**\n * @template T\n */\nexport class Cache {\n constructor(maxSize = 10) {\n this.maxSize = maxSize;\n /** @type {T[]} */\n this.entries = [];\n }\n\n /**\n * @param {T} entry\n */\n add(entry) {\n if (this.entries.length >= this.maxSize) {\n this.entries.shift();\n }\n this.entries.push(entry);\n }\n}\n\nexport class TextSelectionPlugin {\n\n constructor(options = DEFAULT_OPTIONS, optionVariables, avoidTspans = isFirefox(), pointerEventsOnParagraph = isSafari()) {\n this.options = options;\n this.optionVariables = optionVariables;\n /**@type {PromiseLike<JQuery<HTMLElement>|undefined>} */\n this.djvuPagesPromise = null;\n // Using text elements instead of tspans for words because Firefox does not allow svg tspan stretch.\n // Tspans are necessary on Chrome because they prevent newline character after every word when copying\n this.svgParagraphElement = \"text\";\n this.svgWordElement = \"tspan\";\n this.insertNewlines = avoidTspans;\n // Safari has a bug where `pointer-events` doesn't work on `<tspans>`. So\n // there we will set `pointer-events: all` on the paragraph element. We don't\n // do this everywhere, because it's a worse experience. Thanks Safari :/\n this.pointerEventsOnParagraph = pointerEventsOnParagraph;\n if (avoidTspans) {\n this.svgParagraphElement = \"g\";\n this.svgWordElement = \"text\";\n }\n\n /** @type {Cache<{index: number, response: any}>} */\n this.pageTextCache = new Cache();\n\n /**\n * Sometimes there are too many words on a page, and the browser becomes near\n * unusable. For now don't render text layer for pages with too many words.\n */\n this.maxWordRendered = 2500;\n }\n\n init() {\n // Only fetch the full djvu xml if the single page url isn't there\n if (this.options.singlePageDjvuXmlUrl) return;\n this.djvuPagesPromise = $.ajax({\n type: \"GET\",\n url: applyVariables(this.options.fullDjvuXmlUrl, this.optionVariables),\n dataType: \"html\",\n error: (e) => undefined\n }).then((res) => {\n try {\n const xmlMap = $.parseXML(res);\n return xmlMap && $(xmlMap).find(\"OBJECT\");\n } catch (e) {\n return undefined;\n }\n });\n }\n\n /**\n * @param {number} index\n * @returns {Promise<HTMLElement|undefined>}\n */\n async getPageText(index) {\n if (this.options.singlePageDjvuXmlUrl) {\n const cachedEntry = this.pageTextCache.entries.find(x => x.index == index);\n if (cachedEntry) {\n return cachedEntry.response;\n }\n return $.ajax({\n type: \"GET\",\n url: applyVariables(this.options.singlePageDjvuXmlUrl, this.optionVariables, { pageIndex: index }),\n dataType: \"html\",\n error: (e) => undefined,\n }).then((res) => {\n try {\n const xmlDoc = $.parseXML(res);\n const result = xmlDoc && $(xmlDoc).find(\"OBJECT\")[0];\n this.pageTextCache.add({ index, response: result });\n return result;\n } catch (e) {\n return undefined;\n }\n });\n } else {\n const XMLpagesArr = await this.djvuPagesPromise;\n if (XMLpagesArr) return XMLpagesArr[index];\n }\n }\n\n /**\n * Intercept copied text to remove any styling applied to it\n * @param {JQuery} $container\n */\n interceptCopy($container) {\n $container[0].addEventListener('copy', (event) => {\n const selection = document.getSelection();\n event.clipboardData.setData('text/plain', selection.toString());\n event.preventDefault();\n });\n }\n\n /**\n * Applies mouse events when in default mode\n * @param {SVGElement} svg\n */\n defaultMode(svg) {\n svg.classList.remove(\"selectingSVG\");\n $(svg).on(\"mousedown.textSelectPluginHandler\", (event) => {\n if (!$(event.target).is(\".BRwordElement\")) return;\n event.stopPropagation();\n svg.classList.add(\"selectingSVG\");\n $(svg).one(\"mouseup.textSelectPluginHandler\", (event) => {\n if (window.getSelection().toString() != \"\") {\n event.stopPropagation();\n $(svg).off(\".textSelectPluginHandler\");\n this.textSelectingMode(svg);\n }\n else svg.classList.remove(\"selectingSVG\");\n });\n });\n }\n\n /**\n * Applies mouse events when in textSelecting mode\n * @param {SVGElement} svg\n */\n textSelectingMode(svg) {\n $(svg).on('mousedown.textSelectPluginHandler', (event) => {\n if (!$(event.target).is(\".BRwordElement\")) {\n if (window.getSelection().toString() != \"\") window.getSelection().removeAllRanges();\n }\n event.stopPropagation();\n });\n $(svg).on('mouseup.textSelectPluginHandler', (event) => {\n event.stopPropagation();\n if (window.getSelection().toString() == \"\") {\n $(svg).off(\".textSelectPluginHandler\");\n this.defaultMode(svg); }\n });\n }\n\n /**\n * Initializes text selection modes if there is an svg on the page\n * @param {JQuery} $container\n */\n stopPageFlip($container) {\n /** @type {JQuery<SVGElement>} */\n const $svg = $container.find('svg.textSelectionSVG');\n if (!$svg.length) return;\n $svg.each((i, s) => this.defaultMode(s));\n this.interceptCopy($container);\n }\n\n /**\n * @param {PageContainer} pageContainer\n */\n async createTextLayer(pageContainer) {\n const pageIndex = pageContainer.page.index;\n const $container = pageContainer.$container;\n const $svgLayers = $container.find('.textSelectionSVG');\n if ($svgLayers.length) return;\n const XMLpage = await this.getPageText(pageIndex);\n if (!XMLpage) return;\n\n const totalWords = $(XMLpage).find(\"WORD\").length;\n if (totalWords > this.maxWordRendered) {\n console.log(`Page ${pageIndex} has too many words (${totalWords} > ${this.maxWordRendered}). Not rendering text layer.`);\n return;\n }\n\n const svg = createSVGPageLayer(pageContainer.page, 'textSelectionSVG');\n $container.append(svg);\n\n $(XMLpage).find(\"PARAGRAPH\").each((i, paragraph) => {\n // Adding text element for each paragraph in the page\n const words = $(paragraph).find(\"WORD\");\n if (!words.length) return;\n const paragSvg = document.createElementNS(\"http://www.w3.org/2000/svg\", this.svgParagraphElement);\n paragSvg.setAttribute(\"class\", \"BRparagElement\");\n if (this.pointerEventsOnParagraph) {\n paragSvg.style.pointerEvents = \"all\";\n }\n\n const wordHeightArr = [];\n\n for (let i = 0; i < words.length; i++) {\n // Adding tspan for each word in paragraph\n const currWord = words[i];\n // eslint-disable-next-line no-unused-vars\n const [left, bottom, right, top] = $(currWord).attr(\"coords\").split(',').map(parseFloat);\n const wordHeight = bottom - top;\n wordHeightArr.push(wordHeight);\n\n const wordTspan = document.createElementNS(\"http://www.w3.org/2000/svg\", this.svgWordElement);\n wordTspan.setAttribute(\"class\", \"BRwordElement\");\n wordTspan.setAttribute(\"x\", left.toString());\n wordTspan.setAttribute(\"y\", bottom.toString());\n wordTspan.setAttribute(\"textLength\", (right - left).toString());\n wordTspan.setAttribute(\"lengthAdjust\", \"spacingAndGlyphs\");\n wordTspan.textContent = currWord.textContent;\n paragSvg.appendChild(wordTspan);\n\n // Adding spaces after words except at the end of the paragraph\n // TODO: assumes left-to-right text\n if (i < words.length - 1) {\n const nextWord = words[i + 1];\n // eslint-disable-next-line no-unused-vars\n const [leftNext, bottomNext, rightNext, topNext] = $(nextWord).attr(\"coords\").split(',').map(parseFloat);\n const spaceTspan = document.createElementNS(\"http://www.w3.org/2000/svg\", this.svgWordElement);\n spaceTspan.setAttribute(\"class\", \"BRwordElement\");\n spaceTspan.setAttribute(\"x\", right.toString());\n spaceTspan.setAttribute(\"y\", bottom.toString());\n if ((leftNext - right) > 0) spaceTspan.setAttribute(\"textLength\", (leftNext - right).toString());\n spaceTspan.setAttribute(\"lengthAdjust\", \"spacingAndGlyphs\");\n spaceTspan.textContent = \" \";\n paragSvg.appendChild(spaceTspan);\n }\n\n // Adds newline at the end of paragraph on Firefox\n if ((i == words.length - 1 && (this.insertNewlines))) {\n paragSvg.appendChild(document.createTextNode(\"\\n\"));\n }\n }\n\n wordHeightArr.sort();\n const paragWordHeight = wordHeightArr[Math.floor(wordHeightArr.length * 0.85)];\n paragSvg.setAttribute(\"font-size\", paragWordHeight.toString());\n svg.appendChild(paragSvg);\n });\n this.stopPageFlip($container);\n }\n}\n\nexport class BookreaderWithTextSelection extends BookReader {\n init() {\n const options = Object.assign({}, DEFAULT_OPTIONS, this.options.plugins.textSelection);\n if (options.enabled) {\n this.textSelectionPlugin = new TextSelectionPlugin(options, this.options.vars);\n // Write this back; this way the plugin is the source of truth, and BR just\n // contains a reference to it.\n this.options.plugins.textSelection = options;\n this.textSelectionPlugin.init();\n }\n super.init();\n }\n\n /**\n * @param {number} index\n */\n _createPageContainer(index) {\n const pageContainer = super._createPageContainer(index);\n // Disable if thumb mode; it's too janky\n // .page can be null for \"pre-cover\" region\n if (this.mode !== this.constModeThumb && pageContainer.page) {\n this.textSelectionPlugin?.createTextLayer(pageContainer);\n }\n return pageContainer;\n }\n}\nwindow.BookReader = BookreaderWithTextSelection;\nexport default BookreaderWithTextSelection;\n","\n/**\n * Checks whether the current browser is a Chrome/Chromium browser\n * Code from https://stackoverflow.com/a/4565120/2317712\n * @param {string} [userAgent]\n * @param {string} [vendor]\n * @return {boolean}\n */\nexport function isChrome(userAgent = navigator.userAgent, vendor = navigator.vendor) {\n return /chrome/i.test(userAgent) && /google inc/i.test(vendor);\n}\n\n/**\n * Checks whether the current browser is firefox\n * @param {string} [userAgent]\n * @return {boolean}\n */\nexport function isFirefox(userAgent = navigator.userAgent) {\n return /firefox/i.test(userAgent);\n}\n\n/**\n * Checks whether the current browser is safari\n * https://developer.mozilla.org/en-US/docs/Web/HTTP/Browser_detection_using_the_user_agent#Browser_Name\n * @param {string} [userAgent]\n * @return {boolean}\n */\nexport function isSafari(userAgent = navigator.userAgent) {\n return /safari/i.test(userAgent) && !/chrome|chromium/i.test(userAgent);\n}\n","/**\n * @typedef {String} StringWithVars\n * A template string with {{foo}} style variables\n * Also supports filters, like {{bookPath|urlencode}} (See APPLY_FILTERS for the\n * supported list of filters)\n **/\n\n/**\n * @param {StringWithVars|String} template\n * @param { {[varName: string]: { toString: () => string} } } vars\n * @param { {[varName: string]: { toString: () => string} } } [overrides]\n */\nexport function applyVariables(template, vars, overrides = {}, possibleFilters = APPLY_FILTERS) {\n return template?.replace(/\\{\\{([^}]*?)\\}\\}/g, ($0, $1) => {\n if (!$1) return $0;\n /** @type {string} */\n const expression = $1;\n const [varName, ...filterNames] = expression.split('|').map(x => x.trim());\n const defined = varName in overrides || varName in vars;\n\n // If it's not defined, don't expand it at all\n if (!defined) return $0;\n\n const value = varName in overrides ? overrides[varName]\n : varName in vars ? vars[varName] : null;\n const filters = filterNames.map(n => possibleFilters[n]);\n return filters.reduce((acc, cur) => cur(acc), value && value.toString());\n });\n}\n\n/** @type { {[filterName: String]:( string => string)} } */\nexport const APPLY_FILTERS = {\n urlencode: encodeURIComponent,\n};\n","var fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.es/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n"],"names":["createSVGPageLayer","isFirefox","isSafari","applyVariables","BookReader","window","DEFAULT_OPTIONS","enabled","fullDjvuXmlUrl","singlePageDjvuXmlUrl","Cache","maxSize","entries","entry","length","shift","push","TextSelectionPlugin","options","optionVariables","avoidTspans","pointerEventsOnParagraph","djvuPagesPromise","svgParagraphElement","svgWordElement","insertNewlines","pageTextCache","maxWordRendered","$","ajax","type","url","dataType","error","e","undefined","then","res","xmlMap","parseXML","find","index","cachedEntry","x","response","pageIndex","xmlDoc","result","add","XMLpagesArr","$container","addEventListener","event","selection","document","getSelection","clipboardData","setData","toString","preventDefault","svg","classList","remove","on","target","is","stopPropagation","one","off","textSelectingMode","removeAllRanges","defaultMode","$svg","each","i","s","interceptCopy","pageContainer","page","$svgLayers","getPageText","XMLpage","totalWords","console","log","append","paragraph","words","paragSvg","createElementNS","setAttribute","style","pointerEvents","wordHeightArr","currWord","attr","split","map","parseFloat","left","bottom","right","top","wordHeight","wordTspan","textContent","appendChild","nextWord","leftNext","bottomNext","rightNext","topNext","spaceTspan","createTextNode","sort","paragWordHeight","Math","floor","stopPageFlip","BookreaderWithTextSelection","Object","assign","plugins","textSelection","textSelectionPlugin","vars","init","mode","constModeThumb","createTextLayer","isChrome","userAgent","navigator","vendor","test","template","overrides","possibleFilters","APPLY_FILTERS","replace","$0","$1","expression","trim","varName","filterNames","defined","value","filters","n","reduce","acc","cur","urlencode","encodeURIComponent"],"sourceRoot":""}