@internetarchive/bookreader 5.0.0-24-sortingstate-11 → 5.0.0-26

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. package/BookReader/BookReader.css +4 -0
  2. package/BookReader/BookReader.js +2 -32145
  3. package/BookReader/BookReader.js.map +1 -1
  4. package/BookReader/bookreader-component-bundle.js +1286 -11256
  5. package/BookReader/bookreader-component-bundle.js.map +1 -1
  6. package/BookReader/icons/1up.svg +1 -12
  7. package/BookReader/icons/2up.svg +1 -15
  8. package/BookReader/icons/advance.svg +3 -26
  9. package/BookReader/icons/chevron-right.svg +1 -1
  10. package/BookReader/icons/close-circle-dark.svg +1 -1
  11. package/BookReader/icons/close-circle.svg +1 -1
  12. package/BookReader/icons/fullscreen.svg +1 -17
  13. package/BookReader/icons/fullscreen_exit.svg +1 -17
  14. package/BookReader/icons/hamburger.svg +1 -15
  15. package/BookReader/icons/left-arrow.svg +1 -12
  16. package/BookReader/icons/magnify-minus.svg +1 -16
  17. package/BookReader/icons/magnify-plus.svg +1 -17
  18. package/BookReader/icons/magnify.svg +1 -15
  19. package/BookReader/icons/pause.svg +1 -23
  20. package/BookReader/icons/play.svg +1 -22
  21. package/BookReader/icons/playback-speed.svg +1 -34
  22. package/BookReader/icons/read-aloud.svg +1 -22
  23. package/BookReader/icons/review.svg +3 -22
  24. package/BookReader/icons/thumbnails.svg +1 -17
  25. package/BookReader/icons/voice.svg +1 -1
  26. package/BookReader/icons/volume-full.svg +1 -22
  27. package/BookReader/images/BRicons.svg +5 -94
  28. package/BookReader/images/books_graphic.svg +1 -177
  29. package/BookReader/images/icon_book.svg +1 -12
  30. package/BookReader/images/icon_bookmark.svg +1 -12
  31. package/BookReader/images/icon_gear.svg +1 -14
  32. package/BookReader/images/icon_hamburger.svg +1 -20
  33. package/BookReader/images/icon_home.svg +1 -21
  34. package/BookReader/images/icon_info.svg +1 -11
  35. package/BookReader/images/icon_one_page.svg +1 -8
  36. package/BookReader/images/icon_pause.svg +1 -1
  37. package/BookReader/images/icon_play.svg +1 -1
  38. package/BookReader/images/icon_playback-rate.svg +1 -15
  39. package/BookReader/images/icon_search_button.svg +1 -8
  40. package/BookReader/images/icon_share.svg +1 -9
  41. package/BookReader/images/icon_skip-ahead.svg +1 -6
  42. package/BookReader/images/icon_skip-back.svg +2 -13
  43. package/BookReader/images/icon_speaker.svg +1 -18
  44. package/BookReader/images/icon_speaker_open.svg +1 -10
  45. package/BookReader/images/icon_thumbnails.svg +1 -12
  46. package/BookReader/images/icon_toc.svg +1 -5
  47. package/BookReader/images/icon_two_pages.svg +1 -9
  48. package/BookReader/images/marker_chap-off.svg +1 -11
  49. package/BookReader/images/marker_chap-on.svg +1 -11
  50. package/BookReader/images/marker_srch-on.svg +1 -11
  51. package/BookReader/jquery-1.10.1.js +2 -108
  52. package/BookReader/plugins/plugin.archive_analytics.js +1 -170
  53. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  54. package/BookReader/plugins/plugin.autoplay.js +1 -163
  55. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  56. package/BookReader/plugins/plugin.chapters.js +1 -333
  57. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  58. package/BookReader/plugins/plugin.iframe.js +1 -72
  59. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  60. package/BookReader/plugins/plugin.mobile_nav.js +1 -332
  61. package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
  62. package/BookReader/plugins/plugin.resume.js +1 -241
  63. package/BookReader/plugins/plugin.resume.js.map +1 -1
  64. package/BookReader/plugins/plugin.search.js +1 -1263
  65. package/BookReader/plugins/plugin.search.js.map +1 -1
  66. package/BookReader/plugins/plugin.text_selection.js +1 -839
  67. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  68. package/BookReader/plugins/plugin.tts.js +2 -9114
  69. package/BookReader/plugins/plugin.tts.js.map +1 -1
  70. package/BookReader/plugins/plugin.url.js +1 -768
  71. package/BookReader/plugins/plugin.url.js.map +1 -1
  72. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -326
  73. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  74. package/BookReader/webcomponents-bundle.js +2 -411
  75. package/BookReader/webcomponents-bundle.js.map +1 -1
  76. package/BookReaderDemo/demo-internetarchive.html +86 -4
  77. package/CHANGELOG.md +5 -0
  78. package/package.json +1 -1
  79. package/src/BookNavigator/bookmarks/ia-bookmarks.js +1 -0
  80. package/src/BookNavigator/volumes/volumes-provider.js +9 -40
  81. package/src/BookReader.js +102 -64
  82. package/src/css/_controls.scss +4 -0
  83. package/src/plugins/plugin.url.js +2 -218
  84. package/tests/jest/BookReader.keyboard.test.js +190 -0
  85. package/tests/jest/plugins/plugin.url.test.js +1 -151
  86. package/.nvmrc +0 -1
@@ -1 +1 @@
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":""}
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":""}