@internetarchive/bookreader 5.0.0-118-alpha2 → 5.0.0-119

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 (232) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +2451 -0
  4. package/BookReader/bergamot-translator-worker.js +2966 -0
  5. package/BookReader/bergamot-translator-worker.wasm +0 -0
  6. package/BookReader/hypothesis/LICENSE +50 -0
  7. package/BookReader/hypothesis/README.md +55 -0
  8. package/BookReader/hypothesis/build/boot-template.js +1 -0
  9. package/BookReader/hypothesis/build/boot.js +1 -0
  10. package/BookReader/hypothesis/build/manifest.json +20 -0
  11. package/BookReader/hypothesis/build/scripts/annotator.bundle.js +199 -0
  12. package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
  13. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +811 -0
  14. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
  15. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +437 -0
  16. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
  17. package/BookReader/hypothesis/build/styles/annotator.css +4 -0
  18. package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
  19. package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  20. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  21. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  22. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  23. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  24. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  25. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  26. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  27. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  28. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  29. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  30. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  31. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  32. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  33. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  34. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  35. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  36. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  37. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  38. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  39. package/BookReader/hypothesis/build/styles/highlights.css +2 -0
  40. package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
  41. package/BookReader/hypothesis/build/styles/katex.min.css +3 -0
  42. package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
  43. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +14 -0
  44. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
  45. package/BookReader/hypothesis/build/styles/sidebar.css +4 -0
  46. package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
  47. package/BookReader/hypothesis/build/styles/ui-playground.css +4 -0
  48. package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
  49. package/BookReader/hypothesis/package.json +126 -0
  50. package/BookReader/ia-bookreader.js +1886 -0
  51. package/BookReader/ia-bookreader.js.LICENSE.txt +78 -0
  52. package/BookReader/ia-bookreader.js.map +1 -0
  53. package/BookReader/icons/1up.svg +1 -0
  54. package/BookReader/icons/2up.svg +1 -0
  55. package/BookReader/icons/advance.svg +3 -0
  56. package/BookReader/icons/chevron-right.svg +1 -0
  57. package/BookReader/icons/close-circle-dark.svg +1 -0
  58. package/BookReader/icons/close-circle.svg +1 -0
  59. package/BookReader/icons/fullscreen.svg +1 -0
  60. package/BookReader/icons/fullscreen_exit.svg +1 -0
  61. package/BookReader/icons/hamburger.svg +1 -0
  62. package/BookReader/icons/left-arrow.svg +1 -0
  63. package/BookReader/icons/magnify-minus.svg +1 -0
  64. package/BookReader/icons/magnify-plus.svg +1 -0
  65. package/BookReader/icons/magnify.svg +1 -0
  66. package/BookReader/icons/pause.svg +1 -0
  67. package/BookReader/icons/play.svg +1 -0
  68. package/BookReader/icons/playback-speed.svg +1 -0
  69. package/BookReader/icons/read-aloud.svg +1 -0
  70. package/BookReader/icons/review.svg +3 -0
  71. package/BookReader/icons/slider-toggle.svg +1 -0
  72. package/BookReader/icons/thumbnails.svg +1 -0
  73. package/BookReader/icons/voice.svg +1 -0
  74. package/BookReader/icons/volume-full.svg +1 -0
  75. package/BookReader/images/BRicons.png +0 -0
  76. package/BookReader/images/BRicons.svg +5 -0
  77. package/BookReader/images/BRicons_ia.png +0 -0
  78. package/BookReader/images/back_pages.png +0 -0
  79. package/BookReader/images/book_bottom_icon.png +0 -0
  80. package/BookReader/images/book_down_icon.png +0 -0
  81. package/BookReader/images/book_left_icon.png +0 -0
  82. package/BookReader/images/book_leftmost_icon.png +0 -0
  83. package/BookReader/images/book_right_icon.png +0 -0
  84. package/BookReader/images/book_rightmost_icon.png +0 -0
  85. package/BookReader/images/book_top_icon.png +0 -0
  86. package/BookReader/images/book_up_icon.png +0 -0
  87. package/BookReader/images/books_graphic.svg +1 -0
  88. package/BookReader/images/booksplit.png +0 -0
  89. package/BookReader/images/control_pause_icon.png +0 -0
  90. package/BookReader/images/control_play_icon.png +0 -0
  91. package/BookReader/images/embed_icon.png +0 -0
  92. package/BookReader/images/hypothesis.ico +0 -0
  93. package/BookReader/images/icon-home-ia.png +0 -0
  94. package/BookReader/images/icon_OL-logo-xs.png +0 -0
  95. package/BookReader/images/icon_alert-xs.png +0 -0
  96. package/BookReader/images/icon_book.svg +1 -0
  97. package/BookReader/images/icon_bookmark.svg +1 -0
  98. package/BookReader/images/icon_close-pop.png +0 -0
  99. package/BookReader/images/icon_download.png +0 -0
  100. package/BookReader/images/icon_experiment.svg +1 -0
  101. package/BookReader/images/icon_gear.svg +1 -0
  102. package/BookReader/images/icon_hamburger.svg +1 -0
  103. package/BookReader/images/icon_home.png +0 -0
  104. package/BookReader/images/icon_home.svg +1 -0
  105. package/BookReader/images/icon_home_ia.png +0 -0
  106. package/BookReader/images/icon_indicator.png +0 -0
  107. package/BookReader/images/icon_info.svg +1 -0
  108. package/BookReader/images/icon_one_page.svg +1 -0
  109. package/BookReader/images/icon_pause.svg +1 -0
  110. package/BookReader/images/icon_play.svg +1 -0
  111. package/BookReader/images/icon_playback-rate.svg +1 -0
  112. package/BookReader/images/icon_return.png +0 -0
  113. package/BookReader/images/icon_search_button.svg +1 -0
  114. package/BookReader/images/icon_share.svg +1 -0
  115. package/BookReader/images/icon_skip-ahead.svg +1 -0
  116. package/BookReader/images/icon_skip-back.svg +2 -0
  117. package/BookReader/images/icon_speaker.svg +1 -0
  118. package/BookReader/images/icon_speaker_open.svg +1 -0
  119. package/BookReader/images/icon_thumbnails.svg +1 -0
  120. package/BookReader/images/icon_toc.svg +1 -0
  121. package/BookReader/images/icon_two_pages.svg +1 -0
  122. package/BookReader/images/icon_zoomer.png +0 -0
  123. package/BookReader/images/loading.gif +0 -0
  124. package/BookReader/images/logo_icon.png +0 -0
  125. package/BookReader/images/marker_chap-off.png +0 -0
  126. package/BookReader/images/marker_chap-off.svg +1 -0
  127. package/BookReader/images/marker_chap-off_ia.png +0 -0
  128. package/BookReader/images/marker_chap-on.png +0 -0
  129. package/BookReader/images/marker_chap-on.svg +1 -0
  130. package/BookReader/images/marker_srch-on.svg +1 -0
  131. package/BookReader/images/marker_srchchap-off.png +0 -0
  132. package/BookReader/images/marker_srchchap-on.png +0 -0
  133. package/BookReader/images/nav_control-dn.png +0 -0
  134. package/BookReader/images/nav_control-dn_ia.png +0 -0
  135. package/BookReader/images/nav_control-up.png +0 -0
  136. package/BookReader/images/nav_control-up_ia.png +0 -0
  137. package/BookReader/images/nav_control.png +0 -0
  138. package/BookReader/images/one_page_mode_icon.png +0 -0
  139. package/BookReader/images/paper-badge.png +0 -0
  140. package/BookReader/images/print_icon.png +0 -0
  141. package/BookReader/images/progressbar.gif +0 -0
  142. package/BookReader/images/right_edges.png +0 -0
  143. package/BookReader/images/slider.png +0 -0
  144. package/BookReader/images/slider_ia.png +0 -0
  145. package/BookReader/images/thumbnail_mode_icon.png +0 -0
  146. package/BookReader/images/translate.svg +1 -0
  147. package/BookReader/images/transparent.png +0 -0
  148. package/BookReader/images/two_page_mode_icon.png +0 -0
  149. package/BookReader/images/unviewable_page.png +0 -0
  150. package/BookReader/images/zoom_in_icon.png +0 -0
  151. package/BookReader/images/zoom_out_icon.png +0 -0
  152. package/BookReader/jquery-3.js +2 -0
  153. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  154. package/BookReader/plugins/plugin.archive_analytics.js +2 -0
  155. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -0
  156. package/BookReader/plugins/plugin.autoplay.js +2 -0
  157. package/BookReader/plugins/plugin.autoplay.js.map +1 -0
  158. package/BookReader/plugins/plugin.chapters.js +23 -0
  159. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  160. package/BookReader/plugins/plugin.chapters.js.map +1 -0
  161. package/BookReader/plugins/plugin.experiments.js +3 -0
  162. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  163. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  164. package/BookReader/plugins/plugin.iframe.js +2 -0
  165. package/BookReader/plugins/plugin.iframe.js.map +1 -0
  166. package/BookReader/plugins/plugin.iiif.js +2 -0
  167. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  168. package/BookReader/plugins/plugin.resume.js +2 -0
  169. package/BookReader/plugins/plugin.resume.js.map +1 -0
  170. package/BookReader/plugins/plugin.search.js +3 -0
  171. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  172. package/BookReader/plugins/plugin.search.js.map +1 -0
  173. package/BookReader/plugins/plugin.text_selection.js +3 -0
  174. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  175. package/BookReader/plugins/plugin.text_selection.js.map +1 -0
  176. package/BookReader/plugins/plugin.translate.js +3 -0
  177. package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
  178. package/BookReader/plugins/plugin.translate.js.map +1 -0
  179. package/BookReader/plugins/plugin.tts.js +3 -0
  180. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +29 -0
  181. package/BookReader/plugins/plugin.tts.js.map +1 -0
  182. package/BookReader/plugins/plugin.url.js +2 -0
  183. package/BookReader/plugins/plugin.url.js.map +1 -0
  184. package/BookReader/plugins/plugin.vendor-fullscreen.js +2 -0
  185. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -0
  186. package/BookReader/plugins/translator-worker.js +2 -0
  187. package/BookReader/plugins/translator-worker.js.map +1 -0
  188. package/BookReader/silence.mp3 +0 -0
  189. package/BookReader/translator-worker.js +475 -0
  190. package/BookReader/webcomponents-bundle.js +3 -0
  191. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  192. package/BookReader/webcomponents-bundle.js.map +1 -0
  193. package/dist/esm/ia-bookreader.js +3 -0
  194. package/dist/esm/ia-bookreader.js.LICENSE.txt +17 -0
  195. package/dist/esm/ia-bookreader.js.map +1 -0
  196. package/dist/esm/plugins/plugin.archive_analytics.js +2 -0
  197. package/dist/esm/plugins/plugin.archive_analytics.js.map +1 -0
  198. package/dist/esm/plugins/plugin.autoplay.js +2 -0
  199. package/dist/esm/plugins/plugin.autoplay.js.map +1 -0
  200. package/dist/esm/plugins/plugin.chapters.js +2 -0
  201. package/dist/esm/plugins/plugin.chapters.js.map +1 -0
  202. package/dist/esm/plugins/plugin.experiments.js +2 -0
  203. package/dist/esm/plugins/plugin.experiments.js.map +1 -0
  204. package/dist/esm/plugins/plugin.iframe.js +2 -0
  205. package/dist/esm/plugins/plugin.iframe.js.map +1 -0
  206. package/dist/esm/plugins/plugin.iiif.js +2 -0
  207. package/dist/esm/plugins/plugin.iiif.js.map +1 -0
  208. package/dist/esm/plugins/plugin.resume.js +2 -0
  209. package/dist/esm/plugins/plugin.resume.js.map +1 -0
  210. package/dist/esm/plugins/plugin.search.js +2 -0
  211. package/dist/esm/plugins/plugin.search.js.map +1 -0
  212. package/dist/esm/plugins/plugin.text_selection.js +2 -0
  213. package/dist/esm/plugins/plugin.text_selection.js.map +1 -0
  214. package/dist/esm/plugins/plugin.translate.js +2 -0
  215. package/dist/esm/plugins/plugin.translate.js.map +1 -0
  216. package/dist/esm/plugins/plugin.tts.js +2 -0
  217. package/dist/esm/plugins/plugin.tts.js.map +1 -0
  218. package/dist/esm/plugins/plugin.url.js +2 -0
  219. package/dist/esm/plugins/plugin.url.js.map +1 -0
  220. package/dist/esm/plugins/plugin.vendor-fullscreen.js +2 -0
  221. package/dist/esm/plugins/plugin.vendor-fullscreen.js.map +1 -0
  222. package/package.json +19 -13
  223. package/src/BookReader/Navbar/Navbar.js +8 -12
  224. package/src/BookReader/options.js +1 -1
  225. package/src/BookReader/utils/SelectionObserver.js +19 -2
  226. package/src/ia-bookreader/ia-bookreader.js +12 -3
  227. package/src/plugins/search/view.js +1 -1
  228. package/src/plugins/translate/plugin.translate.js +3 -2
  229. package/src/plugins/tts/PageChunk.js +92 -10
  230. package/src/plugins/tts/plugin.tts.js +0 -24
  231. package/src/plugins/url/UrlPlugin.js +4 -1
  232. package/src/plugins/url/plugin.url.js +4 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins/plugin.translate.js","mappings":"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A,mCACA,2CACA,oCACA,0CACA,wCACA,0CACA,4CACA,+CACA,kDACA,8CACA,wCACA,gDACA,qCACA,2DACA,wCACA,4CACA,mEACA,2CACA,wCACA,oDACA,+CACA,kDACA,oCACA,yDACA,yDACA,uCACA,uCACA,kCACA,wCACA,4CACA,mDACA,yDACA,uCACA,wCACA,sCACA,+CACA,wCACA,8DACA,4CACA,yCACA,2CACA,2CACA,wCACA,qCACA,uCACA,0CACA,wCACA,2CACA,gDACA,+EACA,qCACA,gDACA,yCACA,6CACA,gDACA,6DACA,kCACA,mDACA,mEACA,qCACA,iEACA,uCACA,mCACA,iDACA,0CACA,mDACA,wCACA,qCACA,gDACA,kDACA,qCACA,qCACA,mDACA,oDACA,+CACA,wDACA,4CACA,kDACA,uCACA,kDACA,qDACA,gDACA,4CACA,wDACA,sCACA,gDACA,0DACA,sDACA,8CACA,kDACA,4CACA,uCACA,mCACA,qCACA,oDACA,gCACA,qCACA,gDACA,uCACA,yDACA,sCACA,uCACA,oDACA,0DACA,4CACA,iCACA,uCACA,6CACA,qCACA,qCACA,oCACA,sCACA,qCACA,qCAQA7X,QAAA8X,IACA,IAAAtQ,EAAA,CACAxQ,KAAA8gB,EAAA,GACAC,WAAAD,EAAA,GACAE,SAAAF,EAAA,GACAG,UAAAH,EAAA,GACAI,UAAAJ,EAAA,IAEAH,EAAAG,EAAA,IAAAF,EAAAE,EAAA,IAAAD,EAAAC,EAAA,IAAAtQ,EACAkQ,EAAAzX,KAAAuH,KAEA,IAAA2Q,EAAAT,EC3MA,SAAAhK,EAAArL,EAAApB,GAAA,IAAAmB,EAAA,oBAAAE,QAAAD,EAAAC,OAAAE,WAAAH,EAAA,kBAAAD,EAAA,IAAA7F,MAAA6b,QAAA/V,KAAAD,EAAA,SAAAC,EAAA5C,GAAA,GAAA4C,EAAA,qBAAAA,EAAA,OAAAgW,EAAAhW,EAAA5C,GAAA,IAAA2C,EAAA,GAAAF,SAAApH,KAAAuH,GAAAiW,MAAA,uBAAAlW,GAAAC,EAAA7J,cAAA4J,EAAAC,EAAA7J,YAAAxB,MAAA,QAAAoL,GAAA,QA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","sources":["webpack://@internetarchive/bookreader/./node_modules/core-js/internals/string-trim-forced.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.string.trim.js","webpack://@internetarchive/bookreader/./src/BookReaderPlugin.js","webpack://@internetarchive/bookreader/./node_modules/@internetarchive/bergamot-translator/translator.js","webpack://@internetarchive/bookreader/./src/plugins/translate/TranslationManager.js","webpack://@internetarchive/bookreader/./src/plugins/translate/plugin.translate.js","webpack://@internetarchive/bookreader/./node_modules/iso-language-codes/dist/index.mjs","webpack://@internetarchive/bookreader/./src/plugins/tts/utils.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.regexp.flags.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.string.match-all.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.string.raw.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/esnext.string.match-all.js","webpack://@internetarchive/bookreader/./src/BookReader/utils/SelectionObserver.js","webpack://@internetarchive/bookreader/./src/util/TextSelectionManager.js","webpack://@internetarchive/bookreader/./src/util/cache.js","webpack://@internetarchive/bookreader/./src/util/generators.js","webpack://@internetarchive/bookreader/./src/util/strings.js"],"sourcesContent":["'use strict';\nvar PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;\nvar 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]()\n || non[METHOD_NAME]() !== non\n || (PROPER_FUNCTION_NAME && 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","// @ts-check\n/** @typedef {import(\"./BookReader.js\").default} BookReader */\n\n/**\n * @template TOptions\n */\nexport class BookReaderPlugin {\n /**\n * @param {BookReader} br\n */\n constructor(br) {\n /** @type {BookReader} */\n this.br = br;\n /** @type {TOptions} */\n this.options;\n }\n\n /**\n * @abstract\n * @param {TOptions} options\n **/\n setup(options) {\n this.options = Object.assign({}, this.options, options);\n }\n\n /** @abstract */\n init() {}\n\n /**\n * @abstract\n * @protected\n * @param {import (\"./BookReader/PageContainer.js\").PageContainer} pageContainer\n */\n _configurePageContainer(pageContainer) {\n }\n\n /**\n * @abstract\n * @protected\n * @param {JQuery<HTMLElement>} $toolbarElement\n */\n _configureToolbar($toolbarElement) {\n }\n\n /** @abstract @protected */\n _bindNavigationHandlers() {}\n\n /**\n * @param {JQuery<HTMLElement>} $navBar\n */\n extendNavBar($navBar) {}\n}\n","/**\n * @typedef {Object} TranslationRequest\n * @property {String} from\n * @property {String} to\n * @property {String} text\n * @property {Boolean} html\n * @property {Integer?} priority\n */\n\n/**\n * @typedef {Object} TranslationResponse\n * @property {TranslationRequest} request\n * @property {{text: string}} target\n */\n\n/**\n * NodeJS compatibility, a thin WebWorker layer around node:worker_threads.\n */\nif (!(typeof window !== 'undefined' && window.Worker)) {\n globalThis.Worker = class {\n #worker;\n\n constructor(url) {\n this.#worker = new Promise(async (accept) => {\n const {Worker} = await import(/* webpackIgnore: true */ 'node:worker_threads');\n accept(new Worker(url));\n });\n }\n\n addEventListener(eventName, callback) {\n this.#worker.then(worker => worker.on(eventName, (data) => callback({data})));\n }\n\n postMessage(message) {\n this.#worker.then(worker => worker.postMessage(message));\n }\n\n terminate() {\n this.#worker.then(worker => worker.terminate());\n }\n }\n}\n\n/**\n * Thrown when a pending translation is replaced by another newer pending\n * translation.\n */\nexport class SupersededError extends Error {}\n\n\n/**\n * Thrown when a translation was removed from the queue.\n */\nexport class CancelledError extends Error {}\n\n\n/**\n * Wrapper around bergamot-translator loading and model management.\n */\n export class TranslatorBacking {\n \n /**\n * @param {{\n * cacheSize?: number,\n * useNativeIntGemm?: boolean,\n * downloadTimeout?: number,\n * registryUrl?: string\n * pivotLanguage?: string?\n * onerror?: (err: Error)\n * }} options\n */\n constructor(options) {\n this.options = options || {};\n\n this.registryUrl = this.options.registryUrl || 'https://bergamot.s3.amazonaws.com/models/index.json';\n\n this.downloadTimeout = 'downloadTimeout' in this.options ? parseInt(this.options.downloadTimeout) : 60000;\n\n /**\n * registry of all available models and their urls\n * @type {Promise<Model[]>}\n */\n this.registry = this.loadModelRegistery();\n\n /**\n * Map of downloaded model data files as buffers per model.\n * @type {Map<{from:string,to:string}, Promise<Map<string,ArrayBuffer>>>}\n */\n this.buffers = new Map();\n\n /**\n * @type {string?}\n */\n this.pivotLanguage = 'pivotLanguage' in this.options ? options.pivotLanguage : 'en';\n \n /**\n * A map of language-pairs to a list of models you need for it.\n * @type {Map<{from:string,to:string}, Promise<{from:string,to:string}[]>>}\n */\n this.models = new Map();\n\n /**\n * Error handler for all errors that are async, not tied to a specific\n * call and that are unrecoverable.\n * @type {(error: Error)}\n */\n this.onerror = this.options.onerror || (err => console.error('WASM Translation Worker error:', err));\n }\n\n /**\n * Loads a worker thread, and wraps it in a message passing proxy. I.e. it\n * exposes the entire interface of TranslationWorker here, and all calls\n * to it are async. Do note that you can only pass arguments that survive\n * being copied into a message. \n * @return {Promise<{worker:Worker, exports:Proxy<TranslationWorker>}>}\n */\n async loadWorker() {\n const worker = (\n this.options.workerUrl ? new Worker(this.options.workerUrl) :\n new Worker(new URL('./worker/translator-worker.js', import.meta.url))\n );\n\n /**\n * Incremental counter to derive request/response ids from.\n */\n let serial = 0;\n\n /**\n * Map of pending requests\n * @type {Map<number,{accept:(any), reject:(Error)}>}\n */\n const pending = new Map();\n\n // Function to send requests\n const call = (name, ...args) => new Promise((accept, reject) => {\n const id = ++serial;\n pending.set(id, {\n accept,\n reject,\n callsite: { // for debugging which call caused the error\n message: `${name}(${args.map(arg => String(arg)).join(', ')})`,\n stack: new Error().stack\n }\n });\n worker.postMessage({id, name, args});\n });\n\n // … receive responses\n worker.addEventListener('message', function({data: {id, result, error}}) {\n if (!pending.has(id)) {\n console.debug('Received message with unknown id:', arguments[0]);\n throw new Error(`BergamotTranslator received response from worker to unknown call '${id}'`);\n }\n\n const {accept, reject, callsite} = pending.get(id);\n pending.delete(id);\n\n if (error !== undefined)\n reject(Object.assign(new Error(), error, {\n message: error.message + ` (response to ${callsite.message})`,\n stack: error.stack ? `${error.stack}\\n${callsite.stack}` : callsite.stack\n }));\n else\n accept(result);\n });\n\n // … and general errors\n worker.addEventListener('error', this.onerror.bind(this));\n\n // Await initialisation. This will also nicely error out if the WASM\n // runtime fails to load.\n await call('initialize', this.options);\n\n /**\n * Little wrapper around the message passing api of Worker to make it\n * easy to await a response to a sent message. This wraps the worker in\n * a Proxy so you can treat it as if it is an instance of the\n * TranslationWorker class that lives inside the worker. All function\n * calls to it are transparently passed through the message passing\n * channel.\n */\n return {\n worker,\n exports: new Proxy({}, {\n get(target, name, receiver) {\n // Prevent this object from being marked \"then-able\"\n if (name !== 'then')\n return (...args) => call(name, ...args);\n }\n })\n };\n }\n\n /**\n * Loads the model registry. Uses the registry shipped with this extension,\n * but formatted a bit easier to use, and future-proofed to be swapped out\n * with a TranslateLocally type registry.\n * @return {Promise<{\n * from: string,\n * to: string,\n * files: {\n * [part:string]: {\n * name: string,\n * size: number,\n * expectedSha256Hash: string\n * }\n * }[]\n * }>}\n */\n async loadModelRegistery() {\n const response = await fetch(this.registryUrl, {credentials: 'omit'});\n const registry = await response.json();\n\n // Add 'from' and 'to' keys for each model.\n return Array.from(Object.entries(registry), ([key, files]) => {\n const languages = key.match(/^([a-z]{2}(-[a-z]+)?)([a-z]{2}(-[a-z]+)?)/i);\n return {\n from: languages[1],\n to: languages[3],\n files\n }\n });\n }\n\n /**\n * Gets or loads translation model data. Caching wrapper around\n * `loadTranslationModel()`.\n * @param {{from:string, to:string}}\n * @return {Promise<{\n * model: ArrayBuffer,\n * vocab: ArrayBuffer,\n * shortlist: ArrayBuffer,\n * qualityModel: ArrayBuffer?\n * }>}\n */\n getTranslationModel({from, to}, options) {\n const key = JSON.stringify({from, to});\n\n if (!this.buffers.has(key)) {\n const promise = this.loadTranslationModel({from, to}, options);\n\n // set the promise so we return the same promise when its still pending\n this.buffers.set(key, promise);\n\n // But if loading fails, remove the promise again so we can try again later\n promise.catch(err => this.buffers.delete(key))\n }\n\n return this.buffers.get(key);\n }\n\n /**\n * Downloads a translation model and returns a set of\n * ArrayBuffers. These can then be passed to a TranslationWorker thread\n * to instantiate a TranslationModel inside the WASM vm.\n * @param {{from:string, to:string}}\n * @param {{signal:AbortSignal?}?}\n * @return {Promise<{\n * model: ArrayBuffer,\n * vocab: ArrayBuffer,\n * shortlist: ArrayBuffer,\n * qualityModel: ArrayBuffer?\n * config: string?\n * }>}\n */\n async loadTranslationModel({from, to}, options) {\n performance.mark(`loadTranslationModule.${JSON.stringify({from, to})}`);\n\n // Find that model in the registry which will tell us about its files\n const entries = (await this.registry).filter(model => model.from == from && model.to == to);\n\n if (!entries)\n throw new Error(`No model for '${from}' -> '${to}'`);\n\n const files = entries[0].files;\n\n const abort = () => reject(new CancelledError('abort signal'));\n\n // Promise that resolves (or rejects really) when the abort signal hits\n const escape = new Promise((accept, reject) => {\n if (options?.signal)\n options.signal.addEventListener('abort', abort);\n });\n\n // Download all files mentioned in the registry entry. Race the promise\n // of all fetch requests, and a promise that rejects on the abort signal\n const buffers = Object.fromEntries(await Promise.race([\n Promise.all(Object.entries(files).map(async ([part, file]) => {\n // Special case where qualityModel is not part of the model, and this\n // should also catch the `config` case.\n if (file === undefined || file.name === undefined)\n return [part, null];\n\n try {\n return [part, await this.fetch(file.name, file.expectedSha256Hash, options)];\n } catch (cause) {\n throw new Error(`Could not fetch ${file.name} for ${from}->${to} model`, {cause});\n }\n })),\n escape\n ]));\n\n // Nothing to abort now, clean up abort promise\n if (options?.signal)\n options.signal.removeEventListener('abort', abort);\n\n performance.measure('loadTranslationModel', `loadTranslationModule.${JSON.stringify({from, to})}`);\n\n let vocabs = [];\n\n if (buffers.vocab)\n vocabs = [buffers.vocab]\n else if (buffers.trgvocab && buffers.srcvocab)\n vocabs = [buffers.srcvocab, buffers.trgvocab]\n else\n throw new Error(`Could not identify vocab files for ${from}->${to} model among: ${Array.from(Object.keys(files)).join(' ')}`);\n\n let config = {};\n\n // For the Ukrainian models we need to override the gemm-precision\n if (files.model.name.endsWith('intgemm8.bin'))\n config['gemm-precision'] = 'int8shiftAll';\n\n // If quality estimation is used, we need to turn off skip-cost. Turning\n // this off causes quite the slowdown.\n if (files.qualityModel)\n config['skip-cost'] = false;\n\n // Allow the registry to also specify marian configuration parameters\n if (files.config)\n Object.assign(config, files.config);\n\n // Translate to generic bergamot-translator format that also supports\n // separate vocabularies for input & output language, and calls 'lex'\n // a more descriptive 'shortlist'.\n return {\n model: buffers.model,\n shortlist: buffers.lex,\n vocabs,\n qualityModel: buffers.qualityModel,\n config\n };\n }\n\n /**\n * Helper to download file from the web. Verifies the checksum.\n * @param {string} url\n * @param {string?} checksum sha256 checksum as hexadecimal string\n * @param {{signal:AbortSignal}?} extra fetch options\n * @returns {Promise<ArrayBuffer>}\n */\n async fetch(url, checksum, extra) {\n // Rig up a timeout cancel signal for our fetch\n const controller = new AbortController();\n const abort = () => controller.abort();\n\n const timeout = this.downloadTimeout ? setTimeout(abort, this.downloadTimeout) : null;\n\n try {\n // Also maintain the original abort signal\n if (extra?.signal)\n extra.signal.addEventListener('abort', abort);\n\n const options = {\n credentials: 'omit',\n signal: controller.signal,\n };\n\n if (checksum)\n options['integrity'] = `sha256-${this.hexToBase64(checksum)}`;\n\n // Disable the integrity check for NodeJS because of\n // https://github.com/nodejs/undici/issues/1594\n if (typeof window === 'undefined')\n delete options['integrity'];\n\n // Start downloading the url, using the hex checksum to ask\n // `fetch()` to verify the download using subresource integrity \n const response = await fetch(url, options);\n\n // Finish downloading (or crash due to timeout)\n return await response.arrayBuffer();\n\n } finally {\n if (timeout)\n clearTimeout(timeout);\n\n if (extra?.signal)\n extra.signal.removeEventListener('abort', abort);\n }\n }\n\n /**\n * Converts the hexadecimal hashes from the registry to something we can use with\n * the fetch() method.\n */\n hexToBase64(hexstring) {\n return btoa(hexstring.match(/\\w{2}/g).map(function(a) {\n return String.fromCharCode(parseInt(a, 16));\n }).join(\"\"));\n }\n\n /**\n * Crappy named method that gives you a list of models to translate from\n * one language into the other. Generally this will be the same as you\n * just put in if there is a direct model, but it could return a list of\n * two models if you need to pivot through a third language.\n * Returns just [{from:str,to:str}...]. To be used something like this:\n * ```\n * const models = await this.getModels(from, to);\n * models.forEach(({from, to}) => {\n * const buffers = await this.loadTranslationModel({from,to});\n * [TranslationWorker].loadTranslationModel({from,to}, buffers)\n * });\n * ```\n * @returns {Promise<TranslationModel[]>}\n */\n getModels({from, to}) {\n const key = JSON.stringify({from, to});\n\n // Note that the `this.models` map stores Promises. This so that\n // multiple calls to `getModels` that ask for the same model will\n // return the same promise, and the actual lookup is only done once.\n // The lookup is async because we need to await `this.registry`\n if (!this.models.has(key))\n this.models.set(key, this.findModels(from, to));\n\n return this.models.get(key);\n }\n\n /**\n * Find model (or model pair) to translate from `from` to `to`.\n * @param {string} from\n * @param {string} to\n * @returns {Promise<TranslationModel[]>}\n */\n async findModels(from, to) {\n const registry = await this.registry;\n\n let direct = [], outbound = [], inbound = [];\n\n registry.forEach(model => {\n if (model.from === from && model.to === to)\n direct.push(model);\n else if (model.from === from && model.to === this.pivotLanguage)\n outbound.push(model);\n else if (model.to === to && model.from === this.pivotLanguage)\n inbound.push(model);\n });\n\n if (direct.length)\n return [direct[0]];\n\n if (outbound.length && inbound.length)\n return [outbound[0], inbound[0]];\n\n throw new Error(`No model available to translate from '${from}' to '${to}'`);\n }\n}\n\n/**\n * Translator balancing between throughput and latency. Can use multiple worker\n * threads.\n */\nexport class BatchTranslator {\n /**\n * @param {{\n * cacheSize?: number,\n * useNativeIntGemm?: boolean,\n * workers?: number,\n * batchSize?: number,\n * downloadTimeout?: number,\n * workerUrl?: string | URL,\n * registryUrl?: string\n * pivotLanguage?: string?\n * }} options\n */\n constructor(options, backing) {\n if (!backing)\n backing = new TranslatorBacking(options);\n\n this.backing = backing;\n\n /**\n * @type {Array<{idle:Boolean, worker:Proxy}>} List of active workers\n * (and a flag to mark them idle or not)\n */\n this.workers = [];\n\n /**\n * Maximum number of workers\n * @type {number} \n */\n this.workerLimit = Math.max(options?.workers || 0, 1);\n\n /**\n * List of batches we push() to & shift() from using `enqueue`.\n * @type {{\n * id: number,\n * key: string,\n * priority: number,\n * models: TranslationModel[],\n * requests: Array<{\n * request: TranslationRequest,\n * resolve: (response: TranslationResponse),\n * reject: (error: Error)\n * }>\n * }}\n */\n this.queue = [];\n\n /**\n * batch serial to help keep track of batches when debugging\n * @type {Number}\n */\n this.batchSerial = 0;\n\n /**\n * Number of requests in a batch before it is ready to be translated in\n * a single call. Bigger is better for throughput (better matrix packing)\n * but worse for latency since you'll have to wait for the entire batch\n * to be translated.\n * @type {Number}\n */\n this.batchSize = Math.max(options?.batchSize || 8, 1);\n\n this.onerror = options?.onerror || (err => console.error('WASM Translation Worker error:', err));\n }\n \n /**\n * Destructor that stops and cleans up.\n */\n async delete() {\n // Empty the queue\n this.remove(() => true);\n\n // Terminate the workers\n this.workers.forEach(({worker}) => worker.terminate());\n }\n\n /**\n * Makes sure queued work gets send to a worker. Will delay it till `idle`\n * to make sure the batches have been filled to some degree. Will keep\n * calling itself as long as there is work in the queue, but it does not\n * hurt to call it multiple times. This function always returns immediately.\n */\n notify() {\n setTimeout(async () => {\n // Is there work to be done?\n if (!this.queue.length)\n return;\n\n // Find an idle worker\n let worker = this.workers.find(worker => worker.idle);\n\n // No worker free, but space for more?\n if (!worker && this.workers.length < this.workerLimit) {\n try {\n // Claim a place in the workers array (but mark it busy so\n // it doesn't get used by any other `notify()` calls).\n const placeholder = {idle: false};\n this.workers.push(placeholder);\n\n // adds `worker` and `exports` props\n Object.assign(placeholder, await this.backing.loadWorker());\n\n // At this point we know our new worker will be usable.\n worker = placeholder;\n } catch (e) {\n this.onerror(new Error(`Could not initialise translation worker: ${e.message}`));\n }\n }\n\n // If no worker, that's the end of it.\n if (!worker)\n return;\n\n // Up to this point, this function has not used await, so no\n // chance that another call stole our batch since we did the check\n // at the beginning of this function and JavaScript is only\n // cooperatively parallel.\n const batch = this.queue.shift();\n\n // Put this worker to work, marking as busy\n worker.idle = false;\n try {\n await this.consumeBatch(batch, worker.exports);\n } catch (e) {\n batch.requests.forEach(({reject}) => reject(e));\n }\n worker.idle = true;\n\n // Is there more work to be done? Do another idleRequest\n if (this.queue.length)\n this.notify();\n });\n }\n\n /**\n * The only real public call you need!\n * ```\n * const {target: {text:string}} = await this.translate({\n * from: 'de',\n * to: 'en',\n * text: 'Hallo Welt!',\n * html: false, // optional\n * priority: 0 // optional, like `nice` lower numbers are translated first\n * })\n * ```\n * @param {TranslationRequest} request\n * @returns {Promise<TranslationResponse>}\n */\n translate(request) {\n const {from, to, priority} = request;\n\n return new Promise(async (resolve, reject) => {\n try {\n // Batching key: only requests with the same key can be batched\n // together. Think same translation model, same options.\n const key = JSON.stringify({from, to});\n\n // (Fetching models first because if we would do it between looking\n // for a batch and making a new one, we end up with a race condition.)\n const models = await this.backing.getModels(request);\n \n // Put the request and its callbacks into a fitting batch\n this.enqueue({key, models, request, resolve, reject, priority});\n\n // Tell a worker to pick up the work at some point.\n this.notify();\n } catch (e) {\n reject(e);\n }\n });\n }\n\n /**\n * Prune pending requests by testing each one of them to whether they're\n * still relevant. Used to prune translation requests from tabs that got\n * closed.\n * @param {(request:TranslationRequest) => boolean} filter evaluates to true if request should be removed\n */\n remove(filter) {\n const queue = this.queue;\n\n this.queue = [];\n\n queue.forEach(batch => {\n batch.requests.forEach(({request, resolve, reject}) => {\n if (filter(request)) {\n // Add error.request property to match response.request for\n // a resolve() callback. Pretty useful if you don't want to\n // do all kinds of Funcion.bind() dances.\n reject(Object.assign(new CancelledError('removed by filter'), {request}));\n return;\n }\n\n this.enqueue({\n key: batch.key,\n priority: batch.priority,\n models: batch.models,\n request,\n resolve,\n reject\n });\n });\n });\n }\n\n /**\n * Internal function used to put a request in a batch that still has space.\n * Also responsible for keeping the batches in order of priority. Called by\n * `translate()` but also used when filtering pending requests.\n * @param {{request:TranslateRequest, models:TranslationModel[], key:String, priority:Number?, resolve:(TranslateResponse)=>any, reject:(Error)=>any}}\n */\n enqueue({key, models, request, resolve, reject, priority}) {\n if (priority === undefined)\n priority = 0;\n // Find a batch in the queue that we can add to\n // (TODO: can we search backwards? that would speed things up)\n let batch = this.queue.find(batch => {\n return batch.key === key\n && batch.priority === priority\n && batch.requests.length < this.batchSize\n });\n\n // No batch or full batch? Queue up a new one\n if (!batch) {\n batch = {id: ++this.batchSerial, key, priority, models, requests: []};\n this.queue.push(batch);\n this.queue.sort((a, b) => a.priority - b.priority);\n }\n\n batch.requests.push({request, resolve, reject});\n }\n\n /**\n * Internal method that uses a worker thread to process a batch. You can\n * wait for the batch to be done by awaiting this call. You should only\n * then reuse the worker otherwise you'll just clog up its message queue.\n */\n async consumeBatch(batch, worker) {\n performance.mark('BergamotBatchTranslator.start');\n\n // Make sure the worker has all necessary models loaded. If not, tell it\n // first to load them.\n await Promise.all(batch.models.map(async ({from, to}) => {\n if (!await worker.hasTranslationModel({from, to})) {\n const buffers = await this.backing.getTranslationModel({from, to});\n await worker.loadTranslationModel({from, to}, buffers);\n }\n }));\n\n // Call the worker to translate. Only sending the actually necessary\n // parts of the batch to avoid trying to send things that don't survive\n // the message passing API between this thread and the worker thread.\n const responses = await worker.translate({\n models: batch.models.map(({from, to}) => ({from, to})),\n texts: batch.requests.map(({request: {text, html, qualityScores}}) => ({\n text: text.toString(),\n html: !!html,\n qualityScores: !!qualityScores\n }))\n });\n\n // Responses are in! Connect them back to their requests and call their\n // callbacks.\n batch.requests.forEach(({request, resolve, reject}, i) => {\n // TODO: look at response.ok and reject() if it is false\n resolve({\n request, // Include request for easy reference? Will allow you\n // to specify custom properties and use that to link\n // request & response back to each other.\n ...responses[i] // {target: {text: String}}\n });\n });\n \n performance.measure('BergamotBatchTranslator', 'BergamotBatchTranslator.start');\n }\n}\n\n\n/**\n * Translator optimised for interactive use.\n */\nexport class LatencyOptimisedTranslator {\n /**\n * @type {TranslatorBacking}\n */\n backing;\n\n /**\n * @type {Promise<{idle:boolean, worker:Worker, exports:Proxy<TranslationWorker>}>}\n */\n worker;\n\n /**\n * @type {{request: TranslationRequest, accept:(TranslationResponse), reject:(Error)} | null}\n */\n pending;\n\n /**\n * @param {{\n * cacheSize?: number,\n * useNativeIntGemm?: boolean,\n * downloadTimeout?: number,\n * workerUrl?: string | URL,\n * registryUrl?: string\n * pivotLanguage?: string?\n * }} options\n */\n constructor(options, backing) {\n if (!backing)\n backing = new TranslatorBacking(options);\n\n this.backing = backing;\n\n // Exposing the this.loadWorker() returned promise through this.worker\n // so that you can use that to catch any errors that happened during\n // loading.\n this.worker = this.backing.loadWorker().then(worker => ({...worker, idle:true}));\n }\n\n /**\n * Destructor that stops and cleans up.\n */\n async delete() {\n // Cancel pending translation\n if (this.pending) {\n this.pending.reject(new CancelledError('translator got deleted'));\n this.pending = null;\n }\n\n // Terminate the worker (I don't care if this fails)\n try {\n const {worker} = await this.worker;\n worker.terminate();\n } finally {\n this.worker = null;\n }\n }\n \n /**\n * Sets `request` as the next translation to process. If there was already\n * a translation waiting to be processed, their promise is rejected with a\n * SupersededError.\n * @param {TranslationRequest} request\n * @return {Promise<TranslationResponse>}\n */\n translate(request, options) {\n if (this.pending)\n this.pending.reject(new SupersededError());\n \n return new Promise((accept, reject) => {\n const pending = {request, accept, reject, options};\n\n if (options?.signal) {\n options.signal.addEventListener('abort', e => {\n reject(new CancelledError('abort signal'));\n if (this.pending === pending)\n this.pending = null;\n });\n }\n\n this.pending = pending;\n this.notify();\n });\n }\n \n notify() {\n setTimeout(async () => {\n if (!this.pending)\n return;\n\n // Catch errors such as the worker not working\n try {\n // Possibly wait for the worker to finish loading. After it loaded\n // these calls are pretty much instantaneous.\n const worker = await this.worker;\n\n // Is another notify() call hogging the worker? Then stop.\n if (!worker.idle)\n return;\n\n // Claim the pending translation request.\n const {request, accept, reject, options} = this.pending;\n this.pending = null;\n\n // Mark the worker as occupied\n worker.idle = false;\n \n try {\n const models = await this.backing.getModels(request)\n\n await Promise.all(models.map(async ({from, to}) => {\n if (!await worker.exports.hasTranslationModel({from, to})) {\n const buffers = await this.backing.getTranslationModel({from, to}, {signal: options?.signal});\n await worker.exports.loadTranslationModel({from, to}, buffers);\n }\n }));\n\n const {text, html, qualityScores} = request;\n const responses = await worker.exports.translate({\n models: models.map(({from,to}) => ({from, to})),\n texts: [{text, html, qualityScores}]\n });\n\n accept({request, ...responses[0]});\n } catch (e) {\n reject(e);\n }\n\n worker.idle = true;\n\n // Is there more work to be done? Do another idleRequest\n if (this.pending)\n this.notify();\n } catch (e) {\n this.backing.onerror(e);\n }\n });\n }\n}\n","// @ts-check\nimport { Cache } from '../../util/cache.js';\nimport { BatchTranslator } from '@internetarchive/bergamot-translator/translator.js';\nimport { toISO6391, toNativeName } from '../tts/utils.js';\n\nexport class TranslationManager {\n /** @type {Cache<{index: string, response: string}>} */\n alreadyTranslated = new Cache(100);\n\n /**\n * @typedef {Object} genericModelInfo\n * @property {string} name\n * @property {number} size\n * @property {number} estimatedCompressedSize\n * @property {any} [qualityModel]\n * @property {string} [expectedSha256Hash]\n * @property {string} [modelType]\n */\n /**\n * @type { {[langPair: string] : {model: genericModelInfo, lex: genericModelInfo, vocab: genericModelInfo, quality?: genericModelInfo}} }\n */\n modelRegistry = {};\n\n /** @type {Record<key, {promise: Promise<string>, resolve: function, reject: function}>} */\n currentlyTranslating = {}\n\n /** @type {Record<string, string>[]} */\n fromLanguages = [];\n /** @type {Record<string, string>[]} */\n toLanguages = [];\n\n /** @type {boolean} */\n active = false;\n\n publicPath = '';\n\n constructor() {\n //TODO Should default to the book language as the first element\n const enModel = {code: \"en\", name: \"English (en)\", type: \"prod\"};\n this.fromLanguages.push(enModel);\n this.toLanguages.push(enModel);\n }\n\n\n async initWorker() {\n if (this.initPromise) return this.initPromise;\n this.initPromise = new Promise((resolve, reject) => {\n this._initResolve = resolve;\n this._initReject = reject;\n });\n const registryUrl = \"https://cors.archive.org/cors/mozilla-translate-models/firefox_models/\";\n const registryJson = await fetch(registryUrl + \"registry.json\").then(r => r.json());\n for (const language of Object.values(registryJson)) {\n for (const file of Object.values(language)) {\n file.name = registryUrl + file.name;\n }\n }\n\n /** @type {BatchTranslator} */\n // Arbitrary setting for number of workers, 1 is already quite fast\n // batchSize from 8 -> 4 for improved performance\n this.translator = new BatchTranslator({\n registryUrl: `data:application/json,${encodeURIComponent(JSON.stringify(registryJson))}`,\n workers: 2,\n batchSize: 4,\n workerUrl: this.publicPath + '/translator-worker.js',\n });\n\n const modelType = await this.translator.backing.registry;\n const arr = {}; // unsure if we need to keep track of the files\n for (const obj of Object.values(modelType)) {\n const firstLang = obj['from'];\n const secondLang = obj['to'];\n const fromModelType = obj['files'];\n arr[`${firstLang}${secondLang}`] = fromModelType;\n // Assuming that all of the languages loaded from the registryUrl inside @internetarchive/bergamot-translator/translator.js are prod\n // List of dev models found here https://github.com/mozilla/firefox-translations-models/tree/main/models/base\n // There are also differences between the model types in the repo above here: https://github.com/mozilla/firefox-translations-models?tab=readme-ov-file#firefox-translations-models\n if (firstLang !== \"en\") {\n const name = `${toNativeName(firstLang)} (${toISO6391(firstLang)})`;\n this.fromLanguages.push({code: firstLang, name: name, type: \"prod\"});\n }\n if (secondLang !== \"en\") {\n const name = `${toNativeName(secondLang)} (${toISO6391(secondLang)})`;\n this.toLanguages.push({code: secondLang, name: name, type: \"prod\"});\n }\n }\n this._initResolve([this.modelRegistry]);\n return this.initPromise;\n }\n\n /**\n * Targets the page and paragraph of a text layer to create a translation from the \"fromLang\" to the \"toLang\". Tries to force order in translation by using the pageIndex (+1000 if the current page is not visible) and paragraphIndex\n * @param {string} fromLang\n * @param {string} toLang\n * @param {string} pageIndex\n * @param {number} paragraphIndex\n * @param {string} text\n * @param {number} priority\n * @return {Promise<string>} translated text\n */\n\n getTranslation = async (fromLang, toLang, pageIndex, paragraphIndex, text, priority) => {\n this.active = true;\n if (fromLang == toLang || !fromLang || !toLang) {\n return;\n }\n const key = `${fromLang}${toLang}-${pageIndex}:${paragraphIndex}`;\n const cachedEntry = this.alreadyTranslated.entries.find(x => x.index == key);\n\n if (cachedEntry) {\n return cachedEntry.response;\n }\n\n if (key in this.currentlyTranslating) {\n return this.currentlyTranslating[key].promise;\n }\n\n let _resolve = null;\n let _reject = null;\n const promise = new Promise((res, rej) => {\n _resolve = res;\n _reject = rej;\n });\n\n this.currentlyTranslating[key] = {\n promise,\n resolve: _resolve,\n reject: _reject,\n };\n\n if (!text) {\n this.currentlyTranslating[key].reject(\"No text was provided\");\n return promise;\n }\n this.translator.translate({\n to: toLang,\n from: fromLang,\n text: text,\n html: false,\n priority: priority,\n }).then((resp) => {\n const response = resp;\n this.currentlyTranslating[key].resolve(response.target.text);\n this.alreadyTranslated.add({index: key, response: response.target.text});\n delete this.currentlyTranslating[key];\n });\n\n return promise;\n }\n\n /**\n * Checks and updates the status of a model that is currently being retreived from IA\n * @param {string} fromLanguage\n * @param {string} toLanguage\n * @returns {Promise<boolean>}\n */\n getTranslationModel = async(fromLanguage, toLanguage) => {\n return this.translator.backing.getTranslationModel({from: fromLanguage, to: toLanguage})\n .catch((err) => {\n console.error(`An error occurred while trying to retreive the ${fromLanguage}-${toLanguage} model`);\n });\n }\n}\n","// @ts-check\nimport { css, html, LitElement } from 'lit';\nimport { BookReaderPlugin } from '../../BookReaderPlugin.js';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { TranslationManager } from \"./TranslationManager.js\";\nimport { toISO6391, toNativeName } from '../tts/utils.js';\nimport { sortBy } from '../../../src/BookReader/utils.js';\nimport { TextSelectionManager } from '../../../src/util/TextSelectionManager.js';\nimport '@internetarchive/ia-activity-indicator';\n\n// @ts-ignore\nconst BookReader = /** @type {typeof import('@/src/BookReader.js').default} */(window.BookReader);\n\nexport class TranslatePlugin extends BookReaderPlugin {\n\n options = {\n enabled: true,\n\n /** @type {string | import('lit').TemplateResult} */\n panelDisclaimerText: \"Translations are in alpha\",\n }\n\n /** @type {TranslationManager} */\n translationManager = new TranslationManager();\n\n /** @type {Worker}*/\n worker;\n\n /**\n * Contains the list of languages available to translate to\n * @type {string[]}\n */\n toLanguages = [];\n\n /**\n * Current language code that is being translated From. Defaults to EN currently\n * @type {!string}\n */\n langFromCode;\n\n /**\n * Current language code that is being translated To\n * @type {!string}\n */\n langToCode;\n /**\n * @type {BrTranslatePanel} _panel - Represents a panel used in the plugin.\n * The specific type and purpose of this panel should be defined based on its usage.\n */\n _panel;\n\n /**\n * @type {boolean} userToggleTranslate - Checks if user has initiated translation\n * Should synchronize with the state of TranslationManager's active state\n */\n userToggleTranslate;\n\n /**\n * @type {boolean} loadingModel - Shows loading animation while downloading lang model\n */\n loadingModel = true;\n\n textSelectionManager = new TextSelectionManager('.BRtranslateLayer', this.br, {selectionElement: [\".BRlineElement\"]}, 1);\n\n async init() {\n if (!this.options.enabled) return;\n\n const bookLanguage = this.br.options.bookLanguage || '';\n const currentLanguage = toISO6391(bookLanguage);\n this.langFromCode = currentLanguage ?? \"en\";\n this.textSelectionManager.init();\n this.translationManager.publicPath = this.br.options.imagesBaseURL.replace(/\\/+$/, '') + '/..';\n\n /**\n * @param {*} ev\n * @param {object} eventProps\n */\n this.br.on('textLayerRendered', async (_, {pageIndex, pageContainer}) => {\n // Stops invalid models from running, also prevents translation on page load\n // TODO check if model has finished loading or if it exists\n if (!this.translationManager) {\n return;\n }\n if (this.translationManager.active) {\n const pageElement = pageContainer.$container[0];\n this.translateRenderedLayer(pageElement);\n }\n });\n\n /**\n * @param {*} ev\n * @param {object} eventProps\n */\n this.br.on('pageVisible', (_, {pageContainerEl}) => {\n if (!this.translationManager.active) {\n return;\n }\n for (const paragraphEl of pageContainerEl.querySelectorAll('.BRtranslateLayer > .BRparagraphElement')) {\n if (paragraphEl.textContent) {\n this.fitVisiblePage(paragraphEl);\n }\n }\n });\n\n await this.translationManager.initWorker();\n // Note await above lets _render function properly, since it gives the browser\n // time to render the rest of bookreader, which _render depends on\n this.langToCode = this.translationManager.toLanguages[0].code;\n this._render();\n }\n\n /** @param {HTMLElement} page*/\n getParagraphsOnPage = (page) => {\n return page ? Array.from(page.querySelectorAll(\".BRtextLayer > .BRparagraphElement\")) : [];\n }\n\n translateActivePageContainerElements() {\n const currentlyActiveContainers = this.br.getActivePageContainerElements();\n const visiblePageContainers = currentlyActiveContainers.filter((element) => {\n return element.classList.contains('BRpage-visible');\n });\n const hiddenPageContainers = currentlyActiveContainers.filter((element) => {\n return !element.classList.contains('BRpage-visible');\n });\n\n for (const page of visiblePageContainers) {\n this.translateRenderedLayer(page, 0);\n }\n for (const loadingPage of hiddenPageContainers) {\n this.translateRenderedLayer(loadingPage, 1000);\n }\n }\n\n /** @param {HTMLElement} page */\n async translateRenderedLayer(page, priority) {\n // Do not run translation if in thumbnail mode or if user did not initiate transations\n if (this.br.mode == this.br.constModeThumb || !this.userToggleTranslate || this.langFromCode == this.langToCode) {\n return;\n }\n\n const pageIndex = page.dataset.index;\n let pageTranslationLayer;\n if (!page.querySelector('.BRPageLayer.BRtranslateLayer')) {\n pageTranslationLayer = document.createElement('div');\n pageTranslationLayer.classList.add('BRPageLayer', 'BRtranslateLayer', 'BRtranslateLayerLoading');\n pageTranslationLayer.setAttribute('lang', `${this.langToCode}`);\n page.prepend(pageTranslationLayer);\n } else {\n pageTranslationLayer = page.querySelector('.BRPageLayer.BRtranslateLayer');\n }\n /** @type {HTMLElement} textLayerElement */\n const textLayerElement = page.querySelector('.BRtextLayer');\n // Should use native DOM element.style method instead of $().css method, specific issue with rendering / style calculation in Chrome\n $(pageTranslationLayer).css({\n \"width\": textLayerElement.style.width,\n \"height\": textLayerElement.style.height,\n \"transform\": textLayerElement.style.transform,\n \"pointer-events\": textLayerElement.style.pointerEvents,\n \"z-index\": 3,\n });\n textLayerElement.classList.add('showingTranslation');\n const paragraphs = this.getParagraphsOnPage(page);\n\n const paragraphTranslationPromises = paragraphs.map(async (paragraph, pidx) => {\n let translatedParagraph = page.querySelector(`[data-translate-index='${pageIndex}-${pidx}']`);\n if (!translatedParagraph) {\n translatedParagraph = document.createElement('p');\n // set data-translate-index on the placeholder\n translatedParagraph.setAttribute('data-translate-index', `${pageIndex}-${pidx}`);\n translatedParagraph.className = 'BRparagraphElement';\n const originalParagraphStyle = paragraphs[pidx];\n // check text selection paragraphs for header/footer roles\n if (paragraph.classList.contains('ocr-role-header-footer')) {\n translatedParagraph.ariaHidden = \"true\";\n translatedParagraph.classList.add('ocr-role-header-footer');\n }\n const fontSize = `${parseInt($(originalParagraphStyle).css(\"font-size\"))}px`;\n\n $(translatedParagraph).css({\n \"margin-left\": $(originalParagraphStyle).css(\"margin-left\"),\n \"margin-top\": $(originalParagraphStyle).css(\"margin-top\"),\n \"top\": $(originalParagraphStyle).css(\"top\"),\n \"height\": $(originalParagraphStyle).css(\"height\"),\n \"width\": $(originalParagraphStyle).css(\"width\"),\n \"font-size\": fontSize,\n });\n pageTranslationLayer.append(translatedParagraph);\n }\n\n if (paragraph.textContent.length !== 0) {\n const pagePriority = parseFloat(pageIndex) + priority + pidx;\n this.translationManager.getTranslationModel(this.langFromCode, this.langToCode).then(() => {\n this._panel.loadingModel = false;\n this.loadingModel = false;\n });\n const translatedText = await this.translationManager.getTranslation(this.langFromCode, this.langToCode, pageIndex, pidx, paragraph.textContent, pagePriority);\n // prevent duplicate spans from appearing if exists\n translatedParagraph.firstElementChild?.remove();\n\n const firstWordSpacing = paragraphs[pidx]?.firstChild?.firstChild;\n const createSpan = document.createElement('span');\n createSpan.className = 'BRlineElement';\n createSpan.textContent = translatedText;\n translatedParagraph.appendChild(createSpan);\n\n $(createSpan).css({\n \"text-indent\": $(firstWordSpacing).css('padding-left'),\n });\n if (page.classList.contains('BRpage-visible')) {\n this.fitVisiblePage(translatedParagraph);\n }\n }\n });\n\n this.textSelectionManager?.stopPageFlip(this.br.refs.$brContainer);\n await Promise.all(paragraphTranslationPromises);\n this.br.trigger('translateLayerRendered', {\n leafIndex: pageIndex,\n translateLayer: pageTranslationLayer,\n });\n }\n\n /**\n * Get the translation layers for a specific leaf index.\n * @param {number} leafIndex\n * @returns {Promise<HTMLElement[]>}\n */\n async getTranslateLayers(leafIndex) {\n const pageContainerElements = this.br.getActivePageContainerElementsForIndex(leafIndex);\n const translateLayer = $(pageContainerElements).filter(`[data-index='${leafIndex}']`).find('.BRtranslateLayer');\n if (translateLayer.length) return translateLayer.toArray();\n\n return new Promise((res, rej) => {\n const handler = async (_, extraParams) => {\n if (extraParams.leafIndex == leafIndex) {\n this.br.off('translateLayerRendered', handler); // remember to detach translateLayer\n res([extraParams.translateLayer]);\n }\n };\n this.br.on('translateLayerRendered', handler);\n });\n }\n\n clearAllTranslations() {\n const brEl = this.br.refs.$br[0];\n brEl.querySelectorAll('.BRtranslateLayer').forEach(el => el.remove());\n brEl.querySelectorAll('.showingTranslation').forEach(el => el.classList.remove('showingTranslation'));\n }\n\n /**\n * @param {Element} paragEl\n */\n fitVisiblePage(paragEl) {\n const originalFontSize = parseInt($(paragEl).css(\"font-size\"));\n let adjustedFontSize = originalFontSize;\n while (paragEl.clientHeight < paragEl.scrollHeight && adjustedFontSize > 0) {\n adjustedFontSize--;\n $(paragEl).css({ \"font-size\": `${adjustedFontSize}px` });\n }\n\n const textHeight = paragEl.firstElementChild.clientHeight;\n const scrollHeight = paragEl.scrollHeight;\n const fits = textHeight < scrollHeight;\n if (fits) {\n const lines = textHeight / adjustedFontSize;\n // Line heights for smaller paragraphs occasionally need a minor adjustment\n const newLineHeight = scrollHeight / lines;\n $(paragEl).css({\n \"line-height\" : `${newLineHeight}px`,\n \"overflow\": \"visible\",\n });\n }\n }\n\n handleFromLangChange = async (e) => {\n this.clearAllTranslations();\n const selectedLangFrom = e.detail.value;\n\n // Update the from language\n this.langFromCode = selectedLangFrom;\n this._panel.requestUpdate();\n\n // Add 'From' language to 'To' list if not already present\n if (!this.translationManager.toLanguages.some(lang => lang.code === selectedLangFrom)) {\n this.translationManager.toLanguages.push({\n code: selectedLangFrom,\n name: this.translationManager.fromLanguages.find((entry) => entry.code == selectedLangFrom).name,\n });\n }\n\n // Update the 'To' languages list and set the correct 'To' language\n this._panel.toLanguages = this.translationManager.toLanguages;\n\n console.log(this.langFromCode, this.langToCode);\n this._render();\n if (this.langFromCode !== this.langToCode) {\n this.translateActivePageContainerElements();\n }\n }\n\n handleToLangChange = async (e) => {\n this.clearAllTranslations();\n this.langToCode = e.detail.value;\n this._render();\n this.translateActivePageContainerElements();\n }\n\n handleToggleTranslation = async () => {\n const shouldEnableTranslation = !this.userToggleTranslate;\n if (shouldEnableTranslation && !this.isSourceLanguageSupported()) {\n this.userToggleTranslate = false;\n this.translationManager.active = false;\n this._render();\n return;\n }\n\n this.userToggleTranslate = !this.userToggleTranslate;\n this.translationManager.active = this.userToggleTranslate;\n\n this._render();\n if (!this.userToggleTranslate) {\n this.clearAllTranslations();\n this.br.trigger('translationDisabled', { });\n this.textSelectionManager.detach();\n } else {\n this.br.trigger('translationEnabled', { });\n this.translateActivePageContainerElements();\n this.textSelectionManager.attach();\n }\n }\n\n /**\n * Update translation side menu\n */\n isSourceLanguageSupported() {\n return this.translationManager.fromLanguages.some((lang) => lang.code == this.langFromCode);\n }\n\n _render() {\n this.br.shell.menuProviders['translate'] = {\n id: 'translate',\n icon: html`<img src='${this.br.options.imagesBaseURL}/translate.svg' width=\"26\"/>`,\n label: 'Translate',\n component: html`<br-translate-panel\n @connected=\"${e => {\n this._panel = e.target;\n this._panel.fromLanguages = this.translationManager.fromLanguages;\n this._panel.toLanguages = this.translationManager.toLanguages;\n this._panel.userTranslationActive = this.userToggleTranslate;\n this._panel.detectedToLang = this.langToCode;\n this._panel.detectedFromLang = this.langFromCode;\n this._panel.loadingModel = this.loadingModel;\n this._panel.sourceLanguageSupported = this.isSourceLanguageSupported();\n }\n }\"\n @langFromChanged=\"${this.handleFromLangChange}\"\n @langToChanged=\"${this.handleToLangChange}\"\n @toggleTranslation=\"${this.handleToggleTranslation}\"\n .fromLanguages=\"${this.translationManager.fromLanguages}\"\n .toLanguages=\"${this.translationManager.toLanguages}\"\n .disclaimerMessage=\"${this.options.panelDisclaimerText}\"\n .userTranslationActive=${this.userToggleTranslate}\n .detectedFromLang=${this.langFromCode}\n .detectedToLang=${this.langToCode}\n .loadingModel=${this.loadingModel}\n .sourceLanguageSupported=${this.isSourceLanguageSupported()}\n class=\"translate-panel\"\n />`,\n };\n this.br.shell.updateMenuContents();\n }\n}\nBookReader?.registerPlugin('translate', TranslatePlugin);\n\n@customElement('br-translate-panel')\nexport class BrTranslatePanel extends LitElement {\n @property({ type: Array }) fromLanguages = []; // List of obj {code, name}\n @property({ type: Array }) toLanguages = []; // List of obj {code, name}\n @property({ type: String }) prevSelectedLang = ''; // Tracks the previous selected language for the \"To\" dropdown\n @property({ type: String }) disclaimerMessage = '';\n @property({ type: Boolean }) userTranslationActive = false;\n @property({ type: String }) detectedFromLang = '';\n @property({ type: String }) detectedToLang = '';\n @property({ type: Boolean }) loadingModel;\n @property({ type: Boolean }) sourceLanguageSupported = true;\n\n @query('#lang-from') langFromDropdown;\n @query('#lang-to') langToDropdown;\n\n static styles = css`\n .disclaimer {\n padding: 10px;\n border-radius: 8px;\n font-size: 12px;\n margin: 0 0 10px;\n background-color: rgba(255, 255, 255, 0.1);\n color: rgba(255, 255, 255, 0.9);\n }\n\n .disclaimer--warning {\n margin: 10px 0;\n background-color: rgba(255, 186, 8, 0.18);\n color: #ffe7a3;\n }\n `;\n\n connectedCallback() {\n super.connectedCallback();\n this.dispatchEvent(new CustomEvent('connected'));\n }\n\n render() {\n const statusWarning = this._statusWarning();\n\n return html`<div class=\"app\" style=\"margin-top: 5%;padding-right: 5px;\">\n <div\n class=\"disclaimer\"\n id=\"disclaimerMessage\"\n >${this.disclaimerMessage}</div>\n\n <div class=\"panel panel--to\" style=\"padding: 0 10px;\">\n <label>\n <span style=\"font-size: 12px;color: #ccc;\">Translate To</span>\n <select id=\"lang-to\" name=\"to\" class=\"lang-select\" style=\"display:block; width:100%;\" @change=\"${this._onLangToChange}\">\n ${sortBy(this.toLanguages, ((lang) => lang.name.toLowerCase()\n )).map((lang) => {\n return html`<option value=\"${lang.code}\" \n ?selected=${lang.code == this.detectedToLang}\n > ${lang.name ? lang.name : lang.code} </option>`;\n })\n }\n </select>\n </label>\n </div>\n\n <div class=\"panel panel--start\" style=\"text-align: right;padding: 0 10px;/*! font-size: 18px; */margin-top: 10px;\">\n <button class=\"start-translation-brn\" @click=\"${this._toggleTranslation}\" ?disabled=${!this.sourceLanguageSupported}>\n ${this.userTranslationActive ? \"Stop Translating\" : \"Translate\"}\n </button>\n </div>\n\n <div class=\"panel panel--from\" style=\"font-size: 12px;color: #ccc;text-align: center;padding: 8px 10px;\">\n <details style=\"display: contents\">\n <summary style=\"text-decoration: underline white; cursor:pointer; display:inline-block\"> \n <i>\n Source: ${this._getLangName(this.detectedFromLang)} ${this.prevSelectedLang ? \"\" : \"(detected)\"} \n </i> Change \n </summary>\n <select id=\"lang-from\" name=\"from\" class=\"lang-select\" value=${this.detectedFromLang} @change=\"${this._onLangFromChange}\" style=\"width:65%; margin-top: 3%; margin-bottom: 3%\">\n ${sortBy(this.fromLanguages, ((lang) => lang.name.toLowerCase()\n )).map((lang) => {\n return html`<option value=\"${lang.code}\"\n ?selected=${lang.code == this.detectedFromLang}\n >${lang.name ? lang.name : lang.code} </option>`;\n })\n }\n </select>\n </details>\n </div>\n <div class=\"footer\" id=\"status\" style=\"margin-top:5%\">\n ${\n statusWarning ? html`\n <div class=\"disclaimer disclaimer--warning\">${statusWarning}</div>\n ` : ''\n }\n </div>\n\n <div class=\"lang-models-loading\"> \n ${this._languageModelStatus()}\n </div>\n </div>`;\n }\n _onLangFromChange(event) {\n const langFromChangedEvent = new CustomEvent('langFromChanged', {\n detail: { value: event.target.value },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(langFromChangedEvent);\n\n // Update the prevSelectedLang if \"To\" is different from \"From\"\n if (this._getSelectedLang('to') !== this._getSelectedLang('from')) {\n this.prevSelectedLang = this._getSelectedLang('from');\n }\n this.loadingModel = true;\n this.detectedFromLang = event.target.value;\n }\n\n _onLangToChange(event) {\n const langToChangedEvent = new CustomEvent('langToChanged', {\n detail: { value: event.target.value },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(langToChangedEvent);\n\n // Update the prevSelectedLang if \"To\" is different from \"From\"\n if (this._getSelectedLang('from') !== event.target.value) {\n this.prevSelectedLang = this._getSelectedLang('from');\n }\n this.loadingModel = true;\n this.detectedToLang = event.target.value;\n }\n\n _getSelectedLang(type) {\n const dropdown = type === 'from' ? this.langFromDropdown : this.langToDropdown;\n return dropdown ? dropdown.value : '';\n }\n\n /**\n * Resolves a human-readable language name for a language code.\n * Prefers names from loaded translation language lists, then falls back to\n * ISO language metadata via toNativeName.\n * @param {string} code\n * @returns {string}\n */\n _getLangName(code) {\n const lang = [...this.fromLanguages, ...this.toLanguages]\n .find(lang => lang.code === code);\n return lang?.name || toNativeName(code) || code;\n }\n\n _toggleTranslation(event) {\n if (!this.sourceLanguageSupported) {\n return;\n }\n const toggleTranslateEvent = new CustomEvent('toggleTranslation', {\n detail: {value: event.target.value},\n bubbles: true,\n composed:true,\n });\n this.userTranslationActive = !this.userTranslationActive;\n this.dispatchEvent(toggleTranslateEvent);\n }\n\n // TODO: Hardcoded warning message for now but should add more statuses\n _statusWarning() {\n if (!this.sourceLanguageSupported) {\n return `Translating from ${this._getLangName(this.detectedFromLang)} is not supported`;\n }\n if (this.detectedFromLang == this.detectedToLang) {\n return \"Translate To language is the same as the Source language\";\n }\n return \"\";\n }\n\n _languageModelStatus() {\n if (this.userTranslationActive) {\n if (this.loadingModel) {\n return html`\n <ia-activity-indicator mode=\"processing\" style=\"display:block; width: 40px; height: 40px; margin: 0 auto;\"></ia-activity-indicator>\n <p>Downloading language model</p>\n `;\n }\n return html`<p>Language model loaded</p>`;\n }\n return \"\";\n }\n}\n","// src/data.ts\nvar data_default = [\n [\"Serbian\", \"\\u0441\\u0440\\u043F\\u0441\\u043A\\u0438 \\u0458\\u0435\\u0437\\u0438\\u043A\", \"sr\", \"srp\", \"srp\"],\n [\"Romanian, Moldavian, Moldovan\", \"Rom\\xE2n\\u0103\", \"ro\", \"ron\", \"rum\"],\n [\"Sichuan Yi, Nuosu\", \"\\uA188\\uA320\\uA4BF Nuosuhxop\", \"ii\", \"iii\", \"iii\"],\n [\"Tahitian\", \"Reo Tahiti\", \"ty\", \"tah\", \"tah\"],\n [\"Tagalog\", \"Wikang Tagalog\", \"tl\", \"tgl\", \"tgl\"],\n [\"Yiddish\", \"\\u05D9\\u05D9\\u05B4\\u05D3\\u05D9\\u05E9\", \"yi\", \"yid\", \"yid\"],\n [\"Akan\", \"Akan\", \"ak\", \"aka\", \"aka\"],\n [\"Malay\", \"Bahasa Melayu, \\u0628\\u0647\\u0627\\u0633 \\u0645\\u0644\\u0627\\u064A\\u0648\", \"ms\", \"msa\", \"may\"],\n [\"Arabic\", \"\\u0627\\u0644\\u0639\\u0631\\u0628\\u064A\\u0629\", \"ar\", \"ara\", \"ara\"],\n [\"Norwegian\", \"Norsk\", \"no\", \"nor\", \"nor\"],\n [\"Ojibwa\", \"\\u140A\\u14C2\\u1511\\u14C8\\u142F\\u14A7\\u140E\\u14D0\", \"oj\", \"oji\", \"oji\"],\n [\"Fulah\", \"Fulfulde, Pulaar, Pular\", \"ff\", \"ful\", \"ful\"],\n [\"Persian\", \"\\u0641\\u0627\\u0631\\u0633\\u06CC\", \"fa\", \"fas\", \"per\"],\n [\"Albanian\", \"Shqip\", \"sq\", \"sqi\", \"alb\"],\n [\"Aymara\", \"aymar aru\", \"ay\", \"aym\", \"aym\"],\n [\"Azerbaijani\", \"az\\u0259rbaycan dili\", \"az\", \"aze\", \"aze\"],\n [\"Chinese\", \"\\u4E2D\\u6587 (Zh\\u014Dngw\\xE9n), \\u6C49\\u8BED, \\u6F22\\u8A9E\", \"zh\", \"zho\", \"chi\"],\n [\"Cree\", \"\\u14C0\\u1426\\u1403\\u152D\\u140D\\u140F\\u1423\", \"cr\", \"cre\", \"cre\"],\n [\"Estonian\", \"eesti, eesti keel\", \"et\", \"est\", \"est\"],\n [\"Guaran\\xED\", \"Ava\\xF1e'\\u1EBD\", \"gn\", \"grn\", \"grn\"],\n [\"Inupiaq\", \"I\\xF1upiaq, I\\xF1upiatun\", \"ik\", \"ipk\", \"ipk\"],\n [\"Inuktitut\", \"\\u1403\\u14C4\\u1483\\u144E\\u1450\\u1466\", \"iu\", \"iku\", \"iku\"],\n [\"Kanuri\", \"Kanuri\", \"kr\", \"kau\", \"kau\"],\n [\"Komi\", \"\\u043A\\u043E\\u043C\\u0438 \\u043A\\u044B\\u0432\", \"kv\", \"kom\", \"kom\"],\n [\"Kongo\", \"Kikongo\", \"kg\", \"kon\", \"kon\"],\n [\"Kurdish\", \"Kurd\\xEE, \\u0623\\u06C7\\u0632\\u0628\\u06D0\\u0643\", \"ku\", \"kur\", \"kur\"],\n [\"Latvian\", \"latvie\\u0161u valoda\", \"lv\", \"lav\", \"lav\"],\n [\"Malagasy\", \"fiteny malagasy\", \"mg\", \"mlg\", \"mlg\"],\n [\"Mongolian\", \"\\u041C\\u043E\\u043D\\u0433\\u043E\\u043B \\u0445\\u044D\\u043B\", \"mn\", \"mon\", \"mon\"],\n [\"Oromo\", \"Afaan Oromoo\", \"om\", \"orm\", \"orm\"],\n [\"Pashto, Pushto\", \"\\u067E\\u069A\\u062A\\u0648\", \"ps\", \"pus\", \"pus\"],\n [\"Quechua\", \"Runa Simi, Kichwa\", \"qu\", \"que\", \"que\"],\n [\"Sardinian\", \"sardu\", \"sc\", \"srd\", \"srd\"],\n [\"Swahili\", \"Kiswahili\", \"sw\", \"swa\", \"swa\"],\n [\"Uzbek\", \"O\\u02BBzbek, \\u040E\\u0437\\u0431\\u0435\\u043A, \", \"uz\", \"uzb\", \"uzb\"],\n [\"Zhuang, Chuang\", \"Sa\\u026F cue\\u014B\\u0185, Saw cuengh\", \"za\", \"zha\", \"zha\"],\n [\"Bislama\", \"Bislama\", \"bi\", \"bis\", \"bis\"],\n [\"Norwegian Bokm\\xE5l\", \"Norsk Bokm\\xE5l\", \"nb\", \"nob\", \"nob\"],\n [\"Norwegian Nynorsk\", \"Norsk Nynorsk\", \"nn\", \"nno\", \"nno\"],\n [\"Indonesian\", \"Bahasa Indonesia\", \"id\", \"ind\", \"ind\"],\n [\"Twi\", \"Twi\", \"tw\", \"twi\", \"twi\"],\n [\"Esperanto\", \"Esperanto\", \"eo\", \"epo\", \"epo\"],\n [\"Interlingua\", \"Interlingua\", \"ia\", \"ina\", \"ina\"],\n [\"Interlingue\", \"Originally called Occidental; then Interlingue after WWII\", \"ie\", \"ile\", \"ile\"],\n [\"Ido\", \"Ido\", \"io\", \"ido\", \"ido\"],\n [\"Volap\\xFCk\", \"Volap\\xFCk\", \"vo\", \"vol\", \"vol\"],\n [\"Bihari languages\", \"\\u092D\\u094B\\u091C\\u092A\\u0941\\u0930\\u0940\", \"bh\", \"bih\", \"bih\"],\n [\"Hebrew (modern)\", \"\\u05E2\\u05D1\\u05E8\\u05D9\\u05EA\", \"he\", \"heb\", \"heb\"],\n [\"Sanskrit\", \"\\u0938\\u0902\\u0938\\u094D\\u0915\\u0943\\u0924\\u092E\\u094D\", \"sa\", \"san\", \"san\"],\n [\"Church Slavic, Church Slavonic, Old Church Slavonic, Old Slavonic, Old Bulgarian\", \"\\u0469\\u0437\\u044B\\u043A\\u044A \\u0441\\u043B\\u043E\\u0432\\u0463\\u043D\\u044C\\u0441\\u043A\\u044A\", \"cu\", \"chu\", \"chu\"],\n [\"Pali\", \"\\u092A\\u093E\\u0934\\u093F\", \"pi\", \"pli\", \"pli\"],\n [\"Avestan\", \"avesta\", \"ae\", \"ave\", \"ave\"],\n [\"Latin\", \"latine, lingua latina\", \"la\", \"lat\", \"lat\"],\n [\"Armenian\", \"\\u0540\\u0561\\u0575\\u0565\\u0580\\u0565\\u0576\", \"hy\", \"hye\", \"arm\"],\n [\"Swati\", \"SiSwati\", \"ss\", \"ssw\", \"ssw\"],\n [\"Tibetan\", \"\\u0F56\\u0F7C\\u0F51\\u0F0B\\u0F61\\u0F72\\u0F42\", \"bo\", \"bod\", \"tib\"],\n [\"South Ndebele\", \"isiNdebele\", \"nr\", \"nbl\", \"nbl\"],\n [\"Slovene\", \"Slovenski Jezik, Sloven\\u0161\\u010Dina\", \"sl\", \"slv\", \"slv\"],\n [\"Oriya\", \"\\u0B13\\u0B21\\u0B3C\\u0B3F\\u0B06\", \"or\", \"ori\", \"ori\"],\n [\"North Ndebele\", \"isiNdebele\", \"nd\", \"nde\", \"nde\"],\n [\"Nauru\", \"Dorerin Naoero\", \"na\", \"nau\", \"nau\"],\n [\"Maori\", \"te reo M\\u0101ori\", \"mi\", \"mri\", \"mao\"],\n [\"Marathi\", \"\\u092E\\u0930\\u093E\\u0920\\u0940\", \"mr\", \"mar\", \"mar\"],\n [\"Luba-Katanga\", \"Kiluba\", \"lu\", \"lub\", \"lub\"],\n [\"Rundi\", \"Ikirundi\", \"rn\", \"run\", \"run\"],\n [\"Central Khmer\", \"\\u1781\\u17D2\\u1798\\u17C2\\u179A, \\u1781\\u17C1\\u1798\\u179A\\u1797\\u17B6\\u179F\\u17B6, \\u1797\\u17B6\\u179F\\u17B6\\u1781\\u17D2\\u1798\\u17C2\\u179A\", \"km\", \"khm\", \"khm\"],\n [\"Western Frisian\", \"Frysk\", \"fy\", \"fry\", \"fry\"],\n [\"Bengali\", \"\\u09AC\\u09BE\\u0982\\u09B2\\u09BE\", \"bn\", \"ben\", \"ben\"],\n [\"Avaric\", \"\\u0430\\u0432\\u0430\\u0440 \\u043C\\u0430\\u0446\\u04C0, \\u043C\\u0430\\u0433\\u04C0\\u0430\\u0440\\u0443\\u043B \\u043C\\u0430\\u0446\\u04C0\", \"av\", \"ava\", \"ava\"],\n [\"Abkhazian\", \"\\u0430\\u04A7\\u0441\\u0443\\u0430 \\u0431\\u044B\\u0437\\u0448\\u04D9\\u0430, \\u0430\\u04A7\\u0441\\u0448\\u04D9\\u0430\", \"ab\", \"abk\", \"abk\"],\n [\"Afar\", \"Afaraf\", \"aa\", \"aar\", \"aar\"],\n [\"Afrikaans\", \"Afrikaans\", \"af\", \"afr\", \"afr\"],\n [\"Amharic\", \"\\u12A0\\u121B\\u122D\\u129B\", \"am\", \"amh\", \"amh\"],\n [\"Aragonese\", \"aragon\\xE9s\", \"an\", \"arg\", \"arg\"],\n [\"Assamese\", \"\\u0985\\u09B8\\u09AE\\u09C0\\u09AF\\u09BC\\u09BE\", \"as\", \"asm\", \"asm\"],\n [\"Bambara\", \"bamanankan\", \"bm\", \"bam\", \"bam\"],\n [\"Bashkir\", \"\\u0431\\u0430\\u0448\\u04A1\\u043E\\u0440\\u0442 \\u0442\\u0435\\u043B\\u0435\", \"ba\", \"bak\", \"bak\"],\n [\"Basque\", \"euskara, euskera\", \"eu\", \"eus\", \"baq\"],\n [\"Belarusian\", \"\\u0431\\u0435\\u043B\\u0430\\u0440\\u0443\\u0441\\u043A\\u0430\\u044F \\u043C\\u043E\\u0432\\u0430\", \"be\", \"bel\", \"bel\"],\n [\"Bosnian\", \"bosanski jezik\", \"bs\", \"bos\", \"bos\"],\n [\"Breton\", \"brezhoneg\", \"br\", \"bre\", \"bre\"],\n [\"Bulgarian\", \"\\u0431\\u044A\\u043B\\u0433\\u0430\\u0440\\u0441\\u043A\\u0438 \\u0435\\u0437\\u0438\\u043A\", \"bg\", \"bul\", \"bul\"],\n [\"Burmese\", \"\\u1017\\u1019\\u102C\\u1005\\u102C\", \"my\", \"mya\", \"bur\"],\n [\"Catalan, Valencian\", \"catal\\xE0, valenci\\xE0\", \"ca\", \"cat\", \"cat\"],\n [\"Chamorro\", \"Chamoru\", \"ch\", \"cha\", \"cha\"],\n [\"Chechen\", \"\\u043D\\u043E\\u0445\\u0447\\u0438\\u0439\\u043D \\u043C\\u043E\\u0442\\u0442\", \"ce\", \"che\", \"che\"],\n [\"Chichewa, Chewa, Nyanja\", \"chiChe\\u0175a, chinyanja\", \"ny\", \"nya\", \"nya\"],\n [\"Chuvash\", \"\\u0447\\u04D1\\u0432\\u0430\\u0448 \\u0447\\u04D7\\u043B\\u0445\\u0438\", \"cv\", \"chv\", \"chv\"],\n [\"Cornish\", \"Kernewek\", \"kw\", \"cor\", \"cor\"],\n [\"Corsican\", \"corsu, lingua corsa\", \"co\", \"cos\", \"cos\"],\n [\"Croatian\", \"hrvatski jezik\", \"hr\", \"hrv\", \"hrv\"],\n [\"Czech\", \"\\u010De\\u0161tina, \\u010Desk\\xFD jazyk\", \"cs\", \"ces\", \"cze\"],\n [\"Danish\", \"dansk\", \"da\", \"dan\", \"dan\"],\n [\"Divehi, Dhivehi, Maldivian\", \"\\u078B\\u07A8\\u0788\\u07AC\\u0780\\u07A8\", \"dv\", \"div\", \"div\"],\n [\"Dutch, Flemish\", \"Nederlands, Vlaams\", \"nl\", \"nld\", \"dut\"],\n [\"Dzongkha\", \"\\u0F62\\u0FAB\\u0F7C\\u0F44\\u0F0B\\u0F41\", \"dz\", \"dzo\", \"dzo\"],\n [\"English\", \"English\", \"en\", \"eng\", \"eng\"],\n [\"Ewe\", \"E\\u028Begbe\", \"ee\", \"ewe\", \"ewe\"],\n [\"Faroese\", \"f\\xF8royskt\", \"fo\", \"fao\", \"fao\"],\n [\"Fijian\", \"vosa Vakaviti\", \"fj\", \"fij\", \"fij\"],\n [\"Finnish\", \"suomi, suomen kieli\", \"fi\", \"fin\", \"fin\"],\n [\"French\", \"fran\\xE7ais, langue fran\\xE7aise\", \"fr\", \"fra\", \"fre\"],\n [\"Galician\", \"Galego\", \"gl\", \"glg\", \"glg\"],\n [\"Georgian\", \"\\u10E5\\u10D0\\u10E0\\u10D7\\u10E3\\u10DA\\u10D8\", \"ka\", \"kat\", \"geo\"],\n [\"German\", \"Deutsch\", \"de\", \"deu\", \"ger\"],\n [\"Greek (modern)\", \"\\u03B5\\u03BB\\u03BB\\u03B7\\u03BD\\u03B9\\u03BA\\u03AC\", \"el\", \"ell\", \"gre\"],\n [\"Gujarati\", \"\\u0A97\\u0AC1\\u0A9C\\u0AB0\\u0ABE\\u0AA4\\u0AC0\", \"gu\", \"guj\", \"guj\"],\n [\"Haitian, Haitian Creole\", \"Krey\\xF2l ayisyen\", \"ht\", \"hat\", \"hat\"],\n [\"Hausa\", \"(Hausa) \\u0647\\u064E\\u0648\\u064F\\u0633\\u064E\", \"ha\", \"hau\", \"hau\"],\n [\"Herero\", \"Otjiherero\", \"hz\", \"her\", \"her\"],\n [\"Hindi\", \"\\u0939\\u093F\\u0928\\u094D\\u0926\\u0940, \\u0939\\u093F\\u0902\\u0926\\u0940\", \"hi\", \"hin\", \"hin\"],\n [\"Hiri Motu\", \"Hiri Motu\", \"ho\", \"hmo\", \"hmo\"],\n [\"Hungarian\", \"magyar\", \"hu\", \"hun\", \"hun\"],\n [\"Irish\", \"Gaeilge\", \"ga\", \"gle\", \"gle\"],\n [\"Igbo\", \"As\\u1EE5s\\u1EE5 Igbo\", \"ig\", \"ibo\", \"ibo\"],\n [\"Icelandic\", \"\\xCDslenska\", \"is\", \"isl\", \"ice\"],\n [\"Italian\", \"Italiano\", \"it\", \"ita\", \"ita\"],\n [\"Japanese\", \"\\u65E5\\u672C\\u8A9E (\\u306B\\u307B\\u3093\\u3054)\", \"ja\", \"jpn\", \"jpn\"],\n [\"Javanese\", \"\\uA9A7\\uA9B1\\uA997\\uA9AE, Basa Jawa\", \"jv\", \"jav\", \"jav\"],\n [\"Kalaallisut, Greenlandic\", \"kalaallisut, kalaallit oqaasii\", \"kl\", \"kal\", \"kal\"],\n [\"Kannada\", \"\\u0C95\\u0CA8\\u0CCD\\u0CA8\\u0CA1\", \"kn\", \"kan\", \"kan\"],\n [\"Kashmiri\", \"\\u0915\\u0936\\u094D\\u092E\\u0940\\u0930\\u0940, \\u0643\\u0634\\u0645\\u064A\\u0631\\u064A\", \"ks\", \"kas\", \"kas\"],\n [\"Kazakh\", \"\\u049B\\u0430\\u0437\\u0430\\u049B \\u0442\\u0456\\u043B\\u0456\", \"kk\", \"kaz\", \"kaz\"],\n [\"Kikuyu, Gikuyu\", \"G\\u0129k\\u0169y\\u0169\", \"ki\", \"kik\", \"kik\"],\n [\"Kinyarwanda\", \"Ikinyarwanda\", \"rw\", \"kin\", \"kin\"],\n [\"Kirghiz, Kyrgyz\", \"\\u041A\\u044B\\u0440\\u0433\\u044B\\u0437\\u0447\\u0430, \\u041A\\u044B\\u0440\\u0433\\u044B\\u0437 \\u0442\\u0438\\u043B\\u0438\", \"ky\", \"kir\", \"kir\"],\n [\"Korean\", \"\\uD55C\\uAD6D\\uC5B4\", \"ko\", \"kor\", \"kor\"],\n [\"Kuanyama, Kwanyama\", \"Kuanyama\", \"kj\", \"kua\", \"kua\"],\n [\"Luxembourgish, Letzeburgesch\", \"L\\xEBtzebuergesch\", \"lb\", \"ltz\", \"ltz\"],\n [\"Ganda\", \"Luganda\", \"lg\", \"lug\", \"lug\"],\n [\"Limburgan, Limburger, Limburgish\", \"Limburgs\", \"li\", \"lim\", \"lim\"],\n [\"Lingala\", \"Ling\\xE1la\", \"ln\", \"lin\", \"lin\"],\n [\"Lao\", \"\\u0E9E\\u0EB2\\u0EAA\\u0EB2\\u0EA5\\u0EB2\\u0EA7\", \"lo\", \"lao\", \"lao\"],\n [\"Lithuanian\", \"lietuvi\\u0173 kalba\", \"lt\", \"lit\", \"lit\"],\n [\"Manx\", \"Gaelg, Gailck\", \"gv\", \"glv\", \"glv\"],\n [\"Macedonian\", \"\\u043C\\u0430\\u043A\\u0435\\u0434\\u043E\\u043D\\u0441\\u043A\\u0438 \\u0458\\u0430\\u0437\\u0438\\u043A\", \"mk\", \"mkd\", \"mac\"],\n [\"Malayalam\", \"\\u0D2E\\u0D32\\u0D2F\\u0D3E\\u0D33\\u0D02\", \"ml\", \"mal\", \"mal\"],\n [\"Maltese\", \"Malti\", \"mt\", \"mlt\", \"mlt\"],\n [\"Marshallese\", \"Kajin M\\u0327aje\\u013C\", \"mh\", \"mah\", \"mah\"],\n [\"Navajo, Navaho\", \"Din\\xE9 bizaad\", \"nv\", \"nav\", \"nav\"],\n [\"Nepali\", \"\\u0928\\u0947\\u092A\\u093E\\u0932\\u0940\", \"ne\", \"nep\", \"nep\"],\n [\"Ndonga\", \"Owambo\", \"ng\", \"ndo\", \"ndo\"],\n [\"Occitan\", \"occitan, lenga d'\\xF2c\", \"oc\", \"oci\", \"oci\"],\n [\"Ossetian, Ossetic\", \"\\u0438\\u0440\\u043E\\u043D \\xE6\\u0432\\u0437\\u0430\\u0433\", \"os\", \"oss\", \"oss\"],\n [\"Panjabi, Punjabi\", \"\\u0A2A\\u0A70\\u0A1C\\u0A3E\\u0A2C\\u0A40\", \"pa\", \"pan\", \"pan\"],\n [\"Polish\", \"j\\u0119zyk polski, polszczyzna\", \"pl\", \"pol\", \"pol\"],\n [\"Portuguese\", \"Portugu\\xEAs\", \"pt\", \"por\", \"por\"],\n [\"Romansh\", \"Rumantsch Grischun\", \"rm\", \"roh\", \"roh\"],\n [\"Russian\", \"\\u0440\\u0443\\u0441\\u0441\\u043A\\u0438\\u0439\", \"ru\", \"rus\", \"rus\"],\n [\"Sindhi\", \"\\u0938\\u093F\\u0928\\u094D\\u0927\\u0940, \\u0633\\u0646\\u068C\\u064A\\u060C \\u0633\\u0646\\u062F\\u06BE\\u06CC\", \"sd\", \"snd\", \"snd\"],\n [\"Northern Sami\", \"Davvis\\xE1megiella\", \"se\", \"sme\", \"sme\"],\n [\"Samoan\", \"gagana fa'a Samoa\", \"sm\", \"smo\", \"smo\"],\n [\"Sango\", \"y\\xE2ng\\xE2 t\\xEE s\\xE4ng\\xF6\", \"sg\", \"sag\", \"sag\"],\n [\"Gaelic, Scottish Gaelic\", \"G\\xE0idhlig\", \"gd\", \"gla\", \"gla\"],\n [\"Shona\", \"chiShona\", \"sn\", \"sna\", \"sna\"],\n [\"Sinhala, Sinhalese\", \"\\u0DC3\\u0DD2\\u0D82\\u0DC4\\u0DBD\", \"si\", \"sin\", \"sin\"],\n [\"Slovak\", \"Sloven\\u010Dina, Slovensk\\xFD Jazyk\", \"sk\", \"slk\", \"slo\"],\n [\"Somali\", \"Soomaaliga, af Soomaali\", \"so\", \"som\", \"som\"],\n [\"Southern Sotho\", \"Sesotho\", \"st\", \"sot\", \"sot\"],\n [\"Spanish, Castilian\", \"Espa\\xF1ol\", \"es\", \"spa\", \"spa\"],\n [\"Sundanese\", \"Basa Sunda\", \"su\", \"sun\", \"sun\"],\n [\"Swedish\", \"Svenska\", \"sv\", \"swe\", \"swe\"],\n [\"Tamil\", \"\\u0BA4\\u0BAE\\u0BBF\\u0BB4\\u0BCD\", \"ta\", \"tam\", \"tam\"],\n [\"Telugu\", \"\\u0C24\\u0C46\\u0C32\\u0C41\\u0C17\\u0C41\", \"te\", \"tel\", \"tel\"],\n [\"Tajik\", \"\\u0442\\u043E\\u04B7\\u0438\\u043A\\u04E3, to\\xE7ik\\u012B, \\u062A\\u0627\\u062C\\u06CC\\u06A9\\u06CC\", \"tg\", \"tgk\", \"tgk\"],\n [\"Thai\", \"\\u0E44\\u0E17\\u0E22\", \"th\", \"tha\", \"tha\"],\n [\"Tigrinya\", \"\\u1275\\u130D\\u122D\\u129B\", \"ti\", \"tir\", \"tir\"],\n [\"Turkmen\", \"T\\xFCrkmen, \\u0422\\u04AF\\u0440\\u043A\\u043C\\u0435\\u043D\", \"tk\", \"tuk\", \"tuk\"],\n [\"Tswana\", \"Setswana\", \"tn\", \"tsn\", \"tsn\"],\n [\"Tongan (Tonga Islands)\", \"Faka Tonga\", \"to\", \"ton\", \"ton\"],\n [\"Turkish\", \"T\\xFCrk\\xE7e\", \"tr\", \"tur\", \"tur\"],\n [\"Tsonga\", \"Xitsonga\", \"ts\", \"tso\", \"tso\"],\n [\"Tatar\", \"\\u0442\\u0430\\u0442\\u0430\\u0440 \\u0442\\u0435\\u043B\\u0435, tatar tele\", \"tt\", \"tat\", \"tat\"],\n [\"Uighur, Uyghur\", \"\\u0626\\u06C7\\u064A\\u063A\\u06C7\\u0631\\u0686\\u06D5, Uyghurche\", \"ug\", \"uig\", \"uig\"],\n [\"Ukrainian\", \"\\u0423\\u043A\\u0440\\u0430\\u0457\\u043D\\u0441\\u044C\\u043A\\u0430\", \"uk\", \"ukr\", \"ukr\"],\n [\"Urdu\", \"\\u0627\\u0631\\u062F\\u0648\", \"ur\", \"urd\", \"urd\"],\n [\"Venda\", \"Tshiven\\u1E13a\", \"ve\", \"ven\", \"ven\"],\n [\"Vietnamese\", \"Ti\\u1EBFng Vi\\u1EC7t\", \"vi\", \"vie\", \"vie\"],\n [\"Walloon\", \"Walon\", \"wa\", \"wln\", \"wln\"],\n [\"Welsh\", \"Cymraeg\", \"cy\", \"cym\", \"wel\"],\n [\"Wolof\", \"Wollof\", \"wo\", \"wol\", \"wol\"],\n [\"Xhosa\", \"isiXhosa\", \"xh\", \"xho\", \"xho\"],\n [\"Yoruba\", \"Yor\\xF9b\\xE1\", \"yo\", \"yor\", \"yor\"],\n [\"Zulu\", \"isiZulu\", \"zu\", \"zul\", \"zul\"]\n];\n\n// src/index.ts\nvar codes = [];\nvar by639_1 = {};\nvar by639_2T = {};\nvar by639_2B = {};\ndata_default.forEach((row) => {\n var code = {\n name: row[0],\n nativeName: row[1],\n iso639_1: row[2],\n iso639_2T: row[3],\n iso639_2B: row[4]\n };\n by639_1[row[2]] = by639_2T[row[3]] = by639_2B[row[4]] = code;\n codes.push(code);\n});\nvar src_default = codes;\nexport {\n by639_1,\n by639_2B,\n by639_2T,\n codes,\n src_default as default\n};\n//# sourceMappingURL=index.mjs.map","// @ts-check\nimport langs from 'iso-language-codes';\n\n/** @type {{[lang: string]: string}} */\n// Handle odd one-off language pairs that might show up over time\nconst specialLangs = {\n \"zh-hans\": \"中文 (Zhōngwén)\",\n};\n\n/**\n * @typedef {string} ISO6391\n * Language code in ISO 639-1 format. e.g. en, fr, zh\n **/\n\n/**\n * @param {string} language in some format\n * @return {ISO6391?}\n */\nexport function toISO6391(language) {\n if (!language) return null;\n language = language.toLocaleLowerCase();\n if (specialLangs[language]) {\n return language;\n }\n const codeObj = (\n findLanguage(language, ['iso639_1']) ||\n findLanguage(language, ['iso639_2T']) ||\n findLanguage(language, ['iso639_2B', 'name', 'nativeName'])\n );\n if (codeObj) return codeObj.iso639_1;\n return null;\n}\n\n/**\n *\n * @param {string} language\n * @returns {string | null}\n */\nexport function toNativeName(language) {\n if (!language) return null;\n language = language.toLocaleLowerCase();\n if (specialLangs[language]) {\n return specialLangs[language];\n }\n const codeObj = (\n findLanguage(language, ['iso639_1']) ||\n findLanguage(language, ['iso639_2T']) ||\n findLanguage(language, ['iso639_2B', 'name', 'nativeName'])\n );\n if (codeObj?.nativeName) return codeObj.nativeName.split(\", \")[0];\n return null;\n}\n\n/** @typedef {import('iso-language-codes').Code} Code */\n\n/**\n * @param {string} language\n * @param {Array<'iso639_1' | 'iso639_2T' | 'iso639_2B' | 'nativeName' | 'name'>} fields\n * @returns {Code | null}\n */\nfunction findLanguage(language, fields) {\n if (!language) return null;\n language = language.toLowerCase();\n for (const lang of langs) {\n for (const codeType of fields) {\n if (lang[codeType]?.toLowerCase().split(\", \").includes(language)) {\n return lang;\n }\n }\n }\n return null;\n}\n\n/**\n * Checks whether the current browser supports localStorage or\n * if the current context has access to it.\n * @return {boolean}\n */\nexport function hasLocalStorage() {\n try {\n return !!window.localStorage;\n } catch (e) {\n // Will throw in sandboxed iframe\n // DOMException: Window.localStorage getter: Forbidden in a sandboxed document without the 'allow-same-origin' flag.\n return false;\n }\n}\n\nexport const DEBUG_READ_ALOUD = location.toString().indexOf('_debugReadAloud=true') != -1;\n\nexport async function checkIfFiresPause() {\n // Pick some random text so that if it accidentally speaks, it's not too annoying\n const u = new SpeechSynthesisUtterance(\"Loading\");\n let calledPause = false;\n u.addEventListener('pause', () => calledPause = true);\n speechSynthesis.speak(u);\n await new Promise(res => setTimeout(res, 10));\n speechSynthesis.pause();\n return calledPause;\n}\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar defineBuiltInAccessor = require('../internals/define-built-in-accessor');\nvar regExpFlagsDetection = require('../internals/regexp-flags-detection');\nvar regExpFlagsGetterImplementation = require('../internals/regexp-flags');\n\n// `RegExp.prototype.flags` getter\n// https://tc39.es/ecma262/#sec-get-regexp.prototype.flags\nif (DESCRIPTORS && !regExpFlagsDetection.correct) {\n defineBuiltInAccessor(RegExp.prototype, 'flags', {\n configurable: true,\n get: regExpFlagsGetterImplementation\n });\n\n regExpFlagsDetection.correct = true;\n}\n","'use strict';\n/* eslint-disable es/no-string-prototype-matchall -- safe */\nvar $ = require('../internals/export');\nvar call = require('../internals/function-call');\nvar uncurryThis = require('../internals/function-uncurry-this-clause');\nvar createIteratorConstructor = require('../internals/iterator-create-constructor');\nvar createIterResultObject = require('../internals/create-iter-result-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toLength = require('../internals/to-length');\nvar toString = require('../internals/to-string');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar isRegExp = require('../internals/is-regexp');\nvar getRegExpFlags = require('../internals/regexp-get-flags');\nvar getMethod = require('../internals/get-method');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\nvar InternalStateModule = require('../internals/internal-state');\nvar IS_PURE = require('../internals/is-pure');\n\nvar MATCH_ALL = wellKnownSymbol('matchAll');\nvar REGEXP_STRING = 'RegExp String';\nvar REGEXP_STRING_ITERATOR = REGEXP_STRING + ' Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(REGEXP_STRING_ITERATOR);\nvar RegExpPrototype = RegExp.prototype;\nvar $TypeError = TypeError;\nvar stringIndexOf = uncurryThis(''.indexOf);\nvar nativeMatchAll = uncurryThis(''.matchAll);\n\nvar WORKS_WITH_NON_GLOBAL_REGEX = !!nativeMatchAll && !fails(function () {\n nativeMatchAll('a', /./);\n});\n\nvar $RegExpStringIterator = createIteratorConstructor(function RegExpStringIterator(regexp, string, $global, fullUnicode) {\n setInternalState(this, {\n type: REGEXP_STRING_ITERATOR,\n regexp: regexp,\n string: string,\n global: $global,\n unicode: fullUnicode,\n done: false\n });\n}, REGEXP_STRING, function next() {\n var state = getInternalState(this);\n if (state.done) return createIterResultObject(undefined, true);\n var R = state.regexp;\n var S = state.string;\n var match = regExpExec(R, S);\n if (match === null) {\n state.done = true;\n return createIterResultObject(undefined, true);\n }\n if (state.global) {\n if (toString(match[0]) === '') R.lastIndex = advanceStringIndex(S, toLength(R.lastIndex), state.unicode);\n return createIterResultObject(match, false);\n }\n state.done = true;\n return createIterResultObject(match, false);\n});\n\nvar $matchAll = function (string) {\n var R = anObject(this);\n var S = toString(string);\n var C = speciesConstructor(R, RegExp);\n var flags = toString(getRegExpFlags(R));\n var matcher, $global, fullUnicode;\n matcher = new C(C === RegExp ? R.source : R, flags);\n $global = !!~stringIndexOf(flags, 'g');\n fullUnicode = !!~stringIndexOf(flags, 'u') || !!~stringIndexOf(flags, 'v');\n matcher.lastIndex = toLength(R.lastIndex);\n return new $RegExpStringIterator(matcher, S, $global, fullUnicode);\n};\n\n// `String.prototype.matchAll` method\n// https://tc39.es/ecma262/#sec-string.prototype.matchall\n$({ target: 'String', proto: true, forced: WORKS_WITH_NON_GLOBAL_REGEX }, {\n matchAll: function matchAll(regexp) {\n var O = requireObjectCoercible(this);\n var flags, S, matcher, rx;\n if (isObject(regexp)) {\n if (isRegExp(regexp)) {\n flags = toString(requireObjectCoercible(getRegExpFlags(regexp)));\n if (!~stringIndexOf(flags, 'g')) throw new $TypeError('`.matchAll` does not allow non-global regexes');\n }\n if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll(O, regexp);\n matcher = getMethod(regexp, MATCH_ALL);\n if (matcher === undefined && IS_PURE && classof(regexp) === 'RegExp') matcher = $matchAll;\n if (matcher) return call(matcher, regexp, O);\n } else if (WORKS_WITH_NON_GLOBAL_REGEX) return nativeMatchAll(O, regexp);\n S = toString(O);\n rx = new RegExp(regexp, 'g');\n return IS_PURE ? call($matchAll, rx, S) : rx[MATCH_ALL](S);\n }\n});\n\nIS_PURE || MATCH_ALL in RegExpPrototype || defineBuiltIn(RegExpPrototype, MATCH_ALL, $matchAll);\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toObject = require('../internals/to-object');\nvar toString = require('../internals/to-string');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\nvar push = uncurryThis([].push);\nvar join = uncurryThis([].join);\n\n// `String.raw` method\n// https://tc39.es/ecma262/#sec-string.raw\n$({ target: 'String', stat: true }, {\n raw: function raw(template) {\n var rawTemplate = toIndexedObject(toObject(template).raw);\n var literalSegments = lengthOfArrayLike(rawTemplate);\n if (!literalSegments) return '';\n var argumentsLength = arguments.length;\n var elements = [];\n var i = 0;\n while (true) {\n push(elements, toString(rawTemplate[i++]));\n if (i === literalSegments) return join(elements, '');\n if (i < argumentsLength) push(elements, toString(arguments[i]));\n }\n }\n});\n","'use strict';\n// TODO: Remove from `core-js@4`\nrequire('../modules/es.string.match-all');\n","// @ts-check\n/**\n * Like `Selection.isCollapsed`, but checks the ranges too. WebKit reports\n * `isCollapsed` as true for any selection inside a shadow root, even when\n * it has text.\n * https://bugs.webkit.org/show_bug.cgi?id=281587\n * @param {Selection} selection\n * @returns {boolean}\n */\nexport function isSelectionCollapsed(selection) {\n if (!selection.isCollapsed) return false;\n for (let i = 0; i < selection.rangeCount; i++) {\n if (!selection.getRangeAt(i).collapsed) return false;\n }\n return true;\n}\n\nexport class SelectionObserver {\n selecting = false;\n startedInSelector = false;\n /** @type {HTMLElement} */\n target = null;\n /** @type {Node | null} */\n lastKnownFocusNode = null;\n\n /**\n * @param {string} selector\n * @param {function('started' | 'cleared' | 'changed', HTMLElement): any} handler\n */\n constructor(selector, handler) {\n this.selector = selector;\n this.handler = handler;\n }\n\n attach() {\n // We can't just use selectstart, because safari on iOS just\n // randomly decides when to fire it 😤\n // document.addEventListener(\"selectstart\", this._onSelectStart);\n // This has to be on document :/\n document.addEventListener(\"selectionchange\", this._onSelectionChange);\n }\n\n detach() {\n document.removeEventListener(\"selectionchange\", this._onSelectionChange);\n }\n\n _onSelectionChange = () => {\n const sel = window.getSelection();\n if (!sel) return;\n const isCollapsed = isSelectionCollapsed(sel);\n\n if (!this.selecting && sel.toString()) {\n const target = $(sel.anchorNode).closest(this.selector)[0];\n if (!target) return;\n this.target = target;\n this.selecting = true;\n this.lastKnownFocusNode = sel.focusNode;\n this.handler('started', this.target);\n }\n\n if (this.selecting && this.lastKnownFocusNode != sel.focusNode && sel.toString() && !isCollapsed) {\n this.lastKnownFocusNode = sel.focusNode;\n this.handler('changed', this.target);\n }\n\n if (this.selecting && (isCollapsed || !sel.toString() || !$(sel.anchorNode).closest(this.selector)[0])) {\n this.selecting = false;\n this.lastKnownFocusNode = null;\n this.handler('cleared', this.target);\n }\n };\n}\n","// @ts-check\nimport { countWords } from './strings.js';\nimport { SelectionObserver } from \"../BookReader/utils/SelectionObserver.js\";\nimport { clamp } from \"../BookReader/utils.js\";\nimport { html, LitElement } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport '@internetarchive/icon-share';\nimport '@internetarchive/icon-edit-pencil/icon-edit-pencil.js';\nimport '@internetarchive/icon-ellipses';\nimport { isIOS, isAndroid } from './browserSniffing.js';\nimport { genAt, genFilter } from './generators.js';\n\nconst BR_HIGHLIGHTS_LOCAL_STORAGE_KEY = \"BRhighlightStorage\";\nconst MAX_FULL_QUOTE_URL_CHARS = 80;\nconst TRUNCATED_QUOTE_WORD_COUNT = 3;\n\nexport class TextSelectionManager {\n options = {\n // Current Translation plugin implementation does not have words, will limit to one BRlineElement for now\n maxProtectedWords: 200,\n }\n\n /** @type {BRSelectMenu} */\n selectMenu;\n\n get selectMenuEnabled() {\n return this.br.plugins.experiments?.isEnabled('copyLinkToHighlight') || this.br.plugins.experiments?.isEnabled('annotateHighlight');\n }\n\n /**\n * @param {string} layer Selector for the text layer to manage\n * @param {import('../BookReader.js').default} br\n * @param {Object} options\n * @param {string[]} options.selectionElement CSS selector for elements that count as \"words\" for selection limiting\n * @param {number} [maxWords] Maximum number of words allowed to be selected\n */\n constructor (layer, br, { selectionElement }, maxWords) {\n /** @type {string} */\n this.layer = layer;\n /** @type {import('../BookReader.js').default} */\n this.br = br;\n /** @type {string[]} */\n this.selectionElement = selectionElement;\n this.selectionObserver = new SelectionObserver(this.layer, this._onSelectionChange);\n this.options.maxProtectedWords = maxWords ? maxWords : 200;\n\n this.selectMenu = new BRSelectMenu(br);\n this.selectMenu.className = \"br-select-menu__root\";\n }\n\n init() {\n this.attach();\n new SelectionObserver(this.layer, (selectEvent) => {\n // Track how often selection is used\n if (selectEvent == 'started') {\n this.br.plugins.archiveAnalytics?.sendEvent('BookReader', 'SelectStart');\n\n // Set a class on the page to avoid hiding it when zooming/etc\n this.br.refs.$br.find('.BRpagecontainer--hasSelection').removeClass('BRpagecontainer--hasSelection');\n $(window.getSelection().anchorNode).closest('.BRpagecontainer').addClass('BRpagecontainer--hasSelection');\n // Don't show while still doing selection\n if (!this.mouseIsDown) this.showSelectMenu();\n }\n\n if (selectEvent == 'changed') {\n if (!this.mouseIsDown && window.getSelection()?.toString()) {\n this.showSelectMenu();\n }\n }\n\n if (selectEvent == 'cleared') {\n this.hideSelectMenu();\n }\n }).attach();\n }\n\n // Need attach + detach methods to toggle w/ Translation plugin\n attach() {\n this.selectionObserver.attach();\n\n if (this.br.protected) {\n document.addEventListener('selectionchange', this._limitSelection);\n // Prevent right clicking when selected text\n $(document.body).on('contextmenu dragstart copy', (e) => {\n const selection = document.getSelection();\n if (selection?.toString()) {\n const intersectsTextLayer = $(this.layer)\n .toArray()\n .some(el => selection.containsNode(el, true));\n if (intersectsTextLayer) {\n e.preventDefault();\n return false;\n }\n }\n });\n }\n }\n\n detach() {\n this.selectionObserver.detach();\n if (this.br.protected) {\n document.removeEventListener('selectionchange', this._limitSelection);\n }\n }\n\n /**\n * @param {'started' | 'cleared' | 'changed'} type\n * @param {HTMLElement} target\n */\n _onSelectionChange = (type, target) => {\n if (type === 'started') {\n this.textSelectingMode(target);\n } else if (type === 'cleared') {\n this.defaultMode(target);\n } else if (type === 'changed') {\n // do nothing, just wait for the mouseup to trigger the styling change\n } else {\n throw new Error(`Unknown type ${type}`);\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 * Initializes text selection modes if there is a text layer on the page\n * @param {JQuery} $container\n */\n stopPageFlip($container) {\n /** @type {JQuery<HTMLElement>} */\n const $textLayer = $container.find(this.layer);\n if (!$textLayer.length) return;\n $textLayer.each((i, s) => this.defaultMode(s));\n if (!this.br.protected) {\n this.interceptCopy($container);\n }\n }\n\n /**\n * Applies mouse events when in default mode\n * @param {HTMLElement} textLayer\n */\n defaultMode (textLayer) {\n const $pageContainer = $(textLayer).closest('.BRpagecontainer');\n textLayer.style.pointerEvents = \"none\";\n $pageContainer.find(\"img\").css(\"pointer-events\", \"auto\");\n\n $(textLayer).off(\".textSelectPluginHandler\");\n const startedMouseDown = this.mouseIsDown;\n let skipNextMouseup = this.mouseIsDown;\n if (startedMouseDown) {\n textLayer.style.pointerEvents = \"auto\";\n }\n\n // Need to stop propagation to prevent DragScrollable from\n // blocking selection\n $(textLayer).on(\"mousedown.textSelectPluginHandler\", (event) => {\n this.mouseIsDown = true;\n if ($(event.target).is(this.selectionElement.join(\", \"))) {\n event.stopPropagation();\n }\n });\n\n $(textLayer).on(\"mouseup.textSelectPluginHandler\", (event) => {\n this.mouseIsDown = false;\n textLayer.style.pointerEvents = \"none\";\n if (skipNextMouseup) {\n skipNextMouseup = false;\n event.stopPropagation();\n }\n });\n }\n\n /**\n * This mode is active while there is a selection on the given textLayer\n * @param {HTMLElement} textLayer\n */\n textSelectingMode(textLayer) {\n const $pageContainer = $(textLayer).closest('.BRpagecontainer');\n // Make text layer consume all events\n textLayer.style.pointerEvents = \"all\";\n // Block img from getting long-press to save while selecting\n $pageContainer.find(\"img\").css(\"pointer-events\", \"none\");\n\n $(textLayer).off(\".textSelectPluginHandler\");\n\n $(textLayer).on(\"mousedown.textSelectPluginHandler\", (event) => {\n if (event.which != 1) return;\n this.mouseIsDown = true;\n event.stopPropagation();\n });\n\n // Prevent page flip on click\n $(textLayer).on('mouseup.textSelectPluginHandler', (event) => {\n this.mouseIsDown = false;\n if (event.which != 1) return;\n event.stopPropagation();\n this.showSelectMenu();\n });\n }\n\n showSelectMenu() {\n if (!this.selectMenuEnabled) return;\n\n this.selectMenu.copyLinkToHighlightEnabled = this.br.plugins.experiments.isEnabled('copyLinkToHighlight');\n this.selectMenu.highlightAnnotationEnabled = this.br.plugins.experiments.isEnabled('annotateHighlight');\n\n if (!this.selectMenu.isConnected) {\n document.body.append(this.selectMenu);\n }\n\n if (this.selectMenu.open) {\n this.selectMenu.repositionToSelection();\n } else {\n this.selectMenu.show();\n }\n }\n\n hideSelectMenu() {\n this.selectMenu.hide();\n }\n\n _limitSelection = () => {\n const selection = window.getSelection();\n if (!selection.rangeCount) return;\n\n const range = selection.getRangeAt(0);\n\n // Check if range.startContainer is inside the sub-tree of .BRContainer\n const startInBr = !!range.startContainer.parentElement.closest('.BRcontainer');\n const endInBr = !!range.endContainer.parentElement.closest('.BRcontainer');\n if (!startInBr && !endInBr) return;\n if (!startInBr || !endInBr) {\n // weird case, just clear the selection\n selection.removeAllRanges();\n return;\n }\n\n // Find the last allowed word in the selection\n const lastAllowedWord = genAt(\n genFilter(\n treeWalkRange(range, 'element'),\n (node) => node.classList.contains(\n this.selectionElement[0].replace(\".\", \"\"),\n ),\n ),\n this.options.maxProtectedWords - 1,\n );\n\n if (!lastAllowedWord || range.endContainer.parentNode == lastAllowedWord) return;\n\n const newRange = document.createRange();\n newRange.setStart(range.startContainer, range.startOffset);\n newRange.setEnd(lastAllowedWord.firstChild, lastAllowedWord.textContent.length);\n\n selection.removeAllRanges();\n selection.addRange(newRange);\n };\n}\n\n/**\n * @overload\n * @param {Range} range\n * @param {'text'} filter\n * @returns {Generator<Text>}\n */\n/**\n * @overload\n * @param {Range} range\n * @param {'element'} filter\n * @returns {Generator<Element>}\n */\n/**\n * @overload\n * @param {Range} range\n * @param {'text+element'} [filter]\n * @returns {Generator<Text | Element>}\n */\n/**\n * Depth traverse the DOM tree starting at `start`, and ending at `end`.\n * @param {Range} range\n * @param {'text' | 'element' | 'text+element'} [filter]\n * @returns {Generator<Node>}\n */\nexport function* treeWalkRange(range, filter = 'text+element') {\n const start = range.startContainer;\n const end = range.endContainer;\n let done = false;\n\n /**\n * @param {Node} node\n */\n const passesFilter = node => {\n return (\n (filter === 'text' && node.nodeType === Node.TEXT_NODE) ||\n (filter === 'element' && node.nodeType === Node.ELEMENT_NODE) ||\n (filter === 'text+element')\n );\n };\n\n /**\n * @param {Node} node\n * @returns {Generator<Node>}\n */\n function* walk(node, {children = true, parents = true, siblings = true} = {}) {\n if (node === end) {\n done = true;\n if (passesFilter(node)) yield node;\n return;\n }\n\n // yield self\n if (passesFilter(node)) yield node;\n\n // First iterate children (depth-first traversal)\n if (children && node.firstChild) {\n yield* walk(node.firstChild, {children: true, parents: false, siblings: true});\n if (done) return;\n }\n\n // Then iterate siblings\n if (siblings) {\n for (let sib = node.nextSibling; sib; sib = sib.nextSibling) {\n yield* walk(sib, {children: true, parents: false, siblings: false});\n if (done) return;\n }\n }\n\n // Finally, move up the tree\n if (parents && node.parentNode) {\n yield* walk(node.parentNode, {children: false, parents: true, siblings: true});\n if (done) return;\n }\n }\n\n yield* walk(start);\n}\n\n@customElement('br-menu-option')\nexport class BRSelectMenuOption extends LitElement {\n @property({type: String})\n icon = '';\n\n @property({type: String})\n label = '';\n\n /** @type {string | null} */\n temporaryText = null;\n\n @property({type: Number, attribute: 'temporary-text-duration'})\n temporaryTextDuration = 1200;\n\n @property({type: String, attribute: 'aria-label'})\n ariaLabel = '';\n\n @property({type: Boolean, attribute: 'live-label'})\n liveLabel = false;\n\n @property({type: Boolean})\n temporaryTextVisible = false;\n\n /** @type {number | null} */\n temporaryTextTimeoutId = null;\n\n /** @override */\n createRenderRoot() {\n // Keep styles from existing stylesheet by opting out of shadow DOM\n return this;\n }\n\n /** @override */\n disconnectedCallback() {\n if (this.temporaryTextTimeoutId != null) {\n window.clearTimeout(this.temporaryTextTimeoutId);\n this.temporaryTextTimeoutId = null;\n }\n super.disconnectedCallback();\n }\n\n /**\n * @param {string} text\n */\n showTemporaryText(text) {\n if (!text?.trim()) return;\n\n this.temporaryText = text;\n\n this.temporaryTextVisible = true;\n if (this.temporaryTextTimeoutId != null) {\n window.clearTimeout(this.temporaryTextTimeoutId);\n }\n this.temporaryTextTimeoutId = window.setTimeout(() => {\n this.temporaryTextVisible = false;\n this.temporaryText = null;\n this.temporaryTextTimeoutId = null;\n }, this.temporaryTextDuration);\n }\n\n renderIcon() {\n if (this.icon === 'share') {\n return html`<ia-icon-share class=\"br-select-menu__icon\" aria-hidden=\"true\"></ia-icon-share>`;\n }\n if (this.icon === 'edit-pencil') {\n return html`<ia-icon-edit-pencil class=\"br-select-menu__icon\" aria-hidden=\"true\"></ia-icon-edit-pencil>`;\n }\n if (this.icon === 'ellipses') {\n return html`<ia-icon-ellipses class=\"br-select-menu__icon\" aria-hidden=\"true\"></ia-icon-ellipses>`;\n }\n return '';\n }\n\n render() {\n const baseLabel = this.label ?? '';\n const hasTemporaryText = !!this.temporaryText;\n const temporaryLabel = hasTemporaryText ? this.temporaryText : baseLabel;\n const showTemporaryLabel = hasTemporaryText && this.temporaryTextVisible;\n const visibleLabel = showTemporaryLabel ? temporaryLabel : baseLabel;\n const providedAriaLabel = this.ariaLabel?.trim();\n const accessibleLabel = providedAriaLabel && providedAriaLabel !== visibleLabel.trim() ? providedAriaLabel : undefined;\n const sizingLabel = baseLabel.length >= temporaryLabel.length ? baseLabel : temporaryLabel;\n\n return html`\n <button\n type=\"button\"\n class=\"br-select-menu__option\"\n role=\"menuitem\"\n aria-label=${ifDefined(accessibleLabel)}\n >\n ${this.renderIcon()}\n ${\n !hasTemporaryText && !baseLabel ? '' :\n hasTemporaryText ? html`\n <span class=\"br-select-menu__label-wrap\" style=\"display: inline-flex; position: relative; align-items: center;\">\n <span\n class=\"br-select-menu__label\"\n style=\"visibility: hidden;\"\n aria-hidden=\"true\"\n >${sizingLabel}</span>\n <span\n class=\"br-select-menu__label\"\n style=\"position: absolute; inset: 0; display: inline-flex; align-items: center;\"\n aria-live=${this.liveLabel ? 'polite' : 'off'}\n >${showTemporaryLabel ? temporaryLabel : baseLabel}</span>\n </span>\n ` : html`\n <span class=\"br-select-menu__label\" aria-live=${this.liveLabel ? 'polite' : 'off'}>${baseLabel}</span>\n `}\n </button>\n `;\n }\n}\n\n@customElement('br-select-menu')\nclass BRSelectMenu extends LitElement {\n /** @type {import('../BookReader.js').default} */\n br;\n\n /** @type {boolean} */\n @property({type: Boolean, reflect: true})\n showExtended = false;\n\n /** @type {BRSelectMenuOption | null} */\n @query('#br-select-copy-link-option')\n copyLinkOption;\n\n @property({type: Boolean, reflect: true})\n open = false;\n\n @property({type: Boolean})\n copyLinkToHighlightEnabled = true;\n\n @property({type: Boolean})\n highlightAnnotationEnabled = true;\n\n /**\n * @param {import('../BookReader.js').default} br\n */\n constructor(br) {\n super();\n this.br = br;\n }\n\n /** @override */\n createRenderRoot() {\n // Disable shadow DOM; that would require a huge rejiggering of CSS\n return this;\n }\n\n /** @type {number | null} */\n _scrollTimeoutId = null;\n\n _onScroll = () => {\n this.classList.add('br-select-menu__root--scrolling');\n if (this._scrollTimeoutId != null) clearTimeout(this._scrollTimeoutId);\n this._scrollTimeoutId = window.setTimeout(() => {\n this._scrollTimeoutId = null;\n this.repositionToSelection();\n this.classList.remove('br-select-menu__root--scrolling');\n }, 150);\n };\n\n /** @override */\n connectedCallback() {\n super.connectedCallback();\n this.setAttribute('role', 'menu');\n this.setAttribute('aria-label', 'Text selection actions');\n this.setAttribute('aria-orientation', 'vertical');\n }\n\n /** @override */\n disconnectedCallback() {\n super.disconnectedCallback();\n window.removeEventListener('scroll', this._onScroll, { capture: true });\n if (this._scrollTimeoutId != null) {\n clearTimeout(this._scrollTimeoutId);\n this._scrollTimeoutId = null;\n }\n }\n\n renderCopyLinkToHighlightOption() {\n // Mousedown needed to prevent selection from being cleared on iOS\n return html`\n <br-menu-option\n id=\"br-select-copy-link-option\"\n @mousedown=${/** @param {MouseEvent} e */ (e) => e.preventDefault()}\n @click=${this.handleCopyLinkToHighlight}\n icon=\"share\"\n label=\"Copy Link to Highlight\"\n live-label\n ></br-menu-option>\n `;\n }\n\n renderRemoveOption() {\n return html`\n <br-menu-option\n @click=${this.handleDeleteHighlight}\n icon=\"share\"\n label=\"Delete Highlight and Annotation\"\n ></br-menu-option>\n `;\n }\n\n renderAddAnnotationOption() {\n return html`\n <br-menu-option\n @click=${this.handleAddAnnotation}\n icon=\"edit-pencil\"\n label=\"Annotate\"\n ></br-menu-option>\n `;\n }\n\n renderHighlightOption() {\n return html`\n <br-menu-option\n @click=${this.handleHighlightSave}\n icon=\"edit-pencil\"\n label=\"Highlight Selection\"\n ></br-menu-option>\n `;\n }\n\n renderShowMoreOption() {\n return html`\n <br-menu-option\n id=\"br-select-more\"\n @mousedown=${/** @param {MouseEvent} e */ (e) => e.preventDefault()}\n @click=${this.toggleExtendedMenu}\n icon=\"ellipses\"\n aria-label=\"Show more options\"\n ></br-menu-option>\n `;\n }\n\n renderLocalStorageOptions() {\n return html`\n <br-menu-option\n @click=${this.renderSavedHighlights}\n icon=\"share\"\n label=\"Load Highlights\"\n ></br-menu-option>\n <br-menu-option\n @click=${() => {window.localStorage.removeItem(BR_HIGHLIGHTS_LOCAL_STORAGE_KEY);}}\n icon=\"share\"\n label=\"Remove Stored Highlights\"\n ></br-menu-option>`;\n }\n\n renderDefaultOptions() {\n return html`\n ${this.copyLinkToHighlightEnabled ? this.renderCopyLinkToHighlightOption() : ''}\n ${this.highlightAnnotationEnabled && !this.nodesForRemoval ? this.renderHighlightOption() : ''}\n ${this.nodesForRemoval ? this.renderRemoveOption() : ''}\n `;\n }\n\n renderExtendedOptions() {\n return html`\n ${this.renderDefaultOptions()}\n ${this.renderLocalStorageOptions()}\n `;\n }\n\n render() {\n const hasMoreOptions = this.br.plugins.experiments?.isEnabled('annotateHighlight');\n // TODO change the second button to use a different icon\n return html`\n ${this.showExtended ? this.renderExtendedOptions() : this.renderDefaultOptions()}\n ${!this.showExtended && hasMoreOptions ? this.renderShowMoreOption() : \"\"}\n `;\n }\n\n /**\n * @param {MouseEvent} e\n */\n async handleCopyLinkToHighlight(e) {\n e.preventDefault();\n const currentSelection = /** @type {Selection} */ (window.getSelection());\n const range = currentSelection.getRangeAt(0);\n const textLayer = this.getNodeTextLayer(range.startContainer);\n if (!textLayer) {\n console.warn(\"No text layer found for selection\");\n return;\n }\n const textFragment = BookReaderTextFragment.fromSelection(currentSelection, [textLayer]);\n\n const currentParams = new URLSearchParams(this.br.readQueryString());\n if (currentParams.has('text')) currentParams.delete('text');\n\n let linkToHighlightParams = currentParams.toString();\n // Use custom toUrlString, which decodes the delimiters for better readability\n linkToHighlightParams += (linkToHighlightParams ? '&' : '') + `text=${textFragment.toUrlString()}`;\n\n const currentUrl = window.location;\n const pageNum = textFragment.pageNumber || `n${textFragment.pageIndex}`;\n const adjustedUrlPageNumPath = currentUrl.pathname.replace(/((?:^|[#/])page)\\/[^/]+/, `$1/${pageNum}`);\n const hash = currentUrl.hash ? currentUrl.hash.replace(/((?:^|[#/])page)\\/[^/]+/, `$1/${pageNum}`) : '';\n const linkToHighlight = `${currentUrl.origin}${adjustedUrlPageNumPath}?${linkToHighlightParams}${hash}`;\n\n await navigator.clipboard.writeText(linkToHighlight);\n this.copyLinkOption?.showTemporaryText('Copied!');\n }\n\n /**\n * @param {MouseEvent} e\n */\n toggleExtendedMenu(e) {\n e.preventDefault();\n this.showExtended = !this.showExtended;\n }\n\n /**\n * Returns the closest BRtextLayer element on the page that contains the target node\n * @param {Node} node\n * @returns {Element | null}\n */\n getNodeTextLayer(node) {\n if (!node) return null;\n const element = node instanceof Element ? node : node.parentElement;\n return element?.closest('.BRtextLayer') ?? null;\n }\n\n /**\n * Retrieves the current selected text on the page and serializes the quote contents + context\n * The selection is also changed in the DOM to highlight the words\n */\n handleHighlightSave() {\n const currentSelection = window.getSelection();\n const start = currentSelection.direction === 'backward' ? currentSelection.focusNode.parentElement : currentSelection.anchorNode.parentElement;\n const textLayer = this.getNodeTextLayer(start);\n const highlight = BookReaderTextFragment.fromSelection(currentSelection, [textLayer.parentElement]);\n highlight.uuid = `id-${crypto.randomUUID().split(\"-\")[4]}`;\n const highlights = this.loadHighlightsFromLocalStorage();\n highlights.push(highlight);\n this.saveToLocalStorage(highlights);\n this.renderSavedHighlights();\n }\n\n handleAddAnnotation(e) {\n // TODO\n }\n\n handleDeleteHighlight() {\n if (this.nodesForRemoval) {\n const uuid = retrieveUUID(this.nodesForRemoval[0]);\n for (const ele of this.nodesForRemoval) {\n const tempText = ele.textContent;\n const parent = ele.parentElement;\n if (parent.classList.contains('BRwordElement') || parent.classList.contains('BRspace')) {\n ele.remove();\n parent.textContent = tempText;\n } else {\n console.log(\"This element did not match removal criteria:\", parent, ele);\n }\n }\n this.deleteHighlight(uuid);\n this.clearNodesForRemoval();\n } else {\n console.log(\"there is nothing to remove\");\n }\n }\n\n /**\n * @param {string} uuid\n */\n deleteHighlight(uuid) {\n const highlights = this.loadHighlightsFromLocalStorage();\n for (let idx = 0; idx < highlights.length; idx++) {\n if (highlights[idx].uuid === uuid) {\n highlights.splice(idx, 1);\n this.saveToLocalStorage(highlights);\n return;\n }\n }\n }\n\n /**\n * Saves all the highlights in an array to localStorage\n * @param {BookReaderSavedHighlight[]} highlights\n */\n saveToLocalStorage(highlights) {\n window.localStorage.setItem(BR_HIGHLIGHTS_LOCAL_STORAGE_KEY, JSON.stringify(highlights.map(hl => hl.toJSON())));\n }\n\n /**\n * @returns {BookReaderSavedHighlight[]}\n */\n loadHighlightsFromLocalStorage() {\n return JSON.parse(window.localStorage.getItem(BR_HIGHLIGHTS_LOCAL_STORAGE_KEY) || \"[]\")\n .map(item => BookReaderTextFragment.fromJSON(item));\n }\n\n renderSavedHighlights() {\n for (const hl of this.loadHighlightsFromLocalStorage()) {\n const textLayer = /** @type {HTMLElement} */ (this.br.$(`.pagediv${hl.pageIndex} .BRtextLayer`)[0]);\n if (!textLayer) continue;\n renderHighlight(textLayer, hl);\n // Attach click behaviour here? Only need one handler per text layer\n $(textLayer)\n .off('mouseup.BRHighlightClick')\n .on('mouseup.BRHighlightClick', (e) => {\n if (!e.target.classList.contains(\"BRhighlight\")) return;\n e.stopPropagation();\n this.handleHighlightClick(e.target);\n });\n }\n }\n\n /**\n * @param {HTMLElement} target\n */\n handleHighlightClick(target) {\n const textLayer = this.getNodeTextLayer(target);\n const identifier = retrieveUUID(target);\n const selectedQuoteNodes = textLayer.querySelectorAll(`.${identifier}`);\n\n const firstNode = selectedQuoteNodes[0];\n const lastNode = selectedQuoteNodes[selectedQuoteNodes.length - 1];\n\n const highlightRange = document.createRange();\n highlightRange.setStart(firstNode, 0);\n highlightRange.setEnd(lastNode, 1);\n\n const currentSelection = window.getSelection();\n currentSelection.removeAllRanges();\n currentSelection.addRange(highlightRange);\n this.show();\n }\n\n repositionToSelection() {\n const SCREEN_MARGIN = 10;\n const currentSelection = /** @type {Selection} */ (window.getSelection());\n const range = currentSelection.getRangeAt(0);\n const selectionRect = range.getBoundingClientRect();\n\n const isMobile = isIOS() || isAndroid();\n // Leave room for mobile teardrop selection handles\n const SELECTION_PADDING = isAndroid() ? 25 : isIOS() ? 15 : 10;\n // On mobile, avoid the native OS text-selection bar which appears near the top of the screen\n const OS_BAR_H = isMobile ? 60 : 0;\n const idealTop = (selectionRect.top < OS_BAR_H\n ? selectionRect.bottom + OS_BAR_H\n : selectionRect.bottom) + SELECTION_PADDING;\n const top = Math.max(SCREEN_MARGIN, idealTop) + window.scrollY;\n\n const menuWidth = this.getBoundingClientRect().width;\n // Excludes scrollbars\n const windowWidth = document.documentElement.clientWidth;\n const idealLeft = menuWidth > selectionRect.width\n ? selectionRect.left + selectionRect.width / 2 - menuWidth / 2\n : selectionRect.left;\n const left = clamp(idealLeft, SCREEN_MARGIN, windowWidth - menuWidth - SCREEN_MARGIN) + window.scrollX;\n\n this.style.top = `${top}px`;\n this.style.left = `${left}px`;\n }\n\n // Will always show the simplified menu when rendered after hiding\n async show() {\n if (this.br.plugins.translate?.userToggleTranslate) return;\n\n this.style.zIndex = '1';\n this.style.position = 'absolute';\n this.open = true;\n this.classList.remove('br-select-menu__root--scrolling');\n window.removeEventListener('scroll', this._onScroll, { capture: true });\n window.addEventListener('scroll', this._onScroll, { capture: true, passive: true });\n await this.updateComplete; // ensure Lit has rendered so getBoundingClientRect() returns real width\n this.repositionToSelection();\n this.clearNodesForRemoval();\n }\n\n hide() {\n if (!this.open) return;\n this.showExtended = false;\n this.open = false;\n window.removeEventListener('scroll', this._onScroll, { capture: true });\n this.clearNodesForRemoval();\n return;\n }\n\n /**\n * Remove temporary storage for the currently selected highlight and updates selection menu options\n */\n clearNodesForRemoval = () => {\n this.nodesForRemoval = null;\n this.requestUpdate();\n }\n}\n\n/**\n * @param {number} numWords\n * @param {string} text\n * @return {string}\n */\nexport function getFirstWords(numWords, text) {\n text = text.trim();\n const re = new RegExp(String.raw`^(\\S+(\\s+|$)){1,${numWords}}`);\n const m = text.match(re);\n return m ? m[0].trim() : \"\";\n}\n\n/**\n * @param {number} numWords\n * @param {string} text\n * @return {string}\n */\nexport function getLastWords(numWords, text) {\n text = text.trim();\n const re = new RegExp(String.raw`((^|\\s+)\\S+){1,${numWords}}\\s*?$`);\n const m = text.match(re);\n return m ? m[0].trim() : \"\";\n}\n\n/**\n * @param {Node} parent\n * @returns {Node}\n */\nexport function getFirstMostNode(parent) {\n while (parent.firstChild) {\n parent = parent.firstChild;\n }\n return parent;\n}\n\n/**\n * @param {Node} parent\n * @returns {Node}\n */\nexport function getLastMostNode(parent) {\n while (parent.lastChild) {\n parent = parent.lastChild;\n }\n return parent;\n}\n\n/**\n * Normalizes text fragment whitespace and removes special delimiter characters\n * to allow for reliable url encoding/decoding\n *\n * Note: It's very important this *does not* change the length of the string to\n * ensure matching works smoothly later.\n *\n * @param {String} string\n */\nexport function replaceTextFragmentDelimiters(string) {\n return string.replace(/(:|-,|,-|,|\\n)/g, s => s.length === 1 ? ' ' : ' ');\n}\n\n/**\n * @param {String} s\n */\nexport function collapseWhitespace(s) {\n return s.replace(/\\s+/g, ' ').trim();\n}\n\n/**\n * Finds all regex matches within a range and returns their ranges.\n * @param {RegExp} regex\n * @param {Range} range - the range to search in\n * @param {Node[]} textNodes - visible text nodes within the range\n * @param {{ normalize?: function(string): string }} [options]\n * @returns {Range[] | undefined} Range for each match, or undefined if no matches are found\n */\nexport function findRangeForRegExp(regex, range, textNodes, { normalize = (s) => s } = {}) {\n if (!textNodes.length) return undefined;\n\n const startOffset = textNodes[0] === range.startContainer ?\n range.startOffset :\n 0;\n const normalizedWholePageString = normalize(textLayerRangeToString(range));\n const normalizedStartOffset = normalize(textNodes[0].textContent.slice(0, startOffset)).length;\n const matchRegex = new RegExp(regex.source, regex.flags.includes('g') ? regex.flags : `${regex.flags}g`);\n\n const matches = Array.from(normalizedWholePageString.matchAll(matchRegex));\n const resultRanges = matches.map((match) => {\n const start = getBoundaryPointAtIndex(\n normalizedStartOffset + match.index,\n textNodes,\n false,\n { normalize },\n );\n const end = getBoundaryPointAtIndex(\n normalizedStartOffset + match.index + match[0].length,\n textNodes,\n true,\n { normalize },\n );\n\n if (!start || !end) {\n console.warn(\"Could not find boundary points for regex match, skipping this match\", {match, start, end});\n return undefined;\n }\n\n const foundRange = new Range();\n foundRange.setStart(start.node, start.offset);\n foundRange.setEnd(end.node, end.offset);\n return foundRange;\n });\n\n const definedRanges = resultRanges.filter((matchRange) => !!matchRange);\n if (!definedRanges?.length) return undefined;\n return definedRanges;\n}\n\n/**\n * Maps an index from \"normalized-space\" (concatenated and normalized text) to a \"node-space\" index (node + offset).\n * @param {Number} index\n * @param {Node[]} nodes\n * @param {boolean} isEnd\n * @param {{ normalize?: function(string): string }} [options]\n */\nexport function getBoundaryPointAtIndex(index, nodes, isEnd, { normalize = (s) => s } = {}) {\n // Rename to have consistent wording\n const normalizedTargetIndex = index;\n /** Characters in node-space counted so far */\n let normalizedI = 0;\n\n for (const node of nodes) {\n const nodeText = node.textContent || '';\n const normalizedText = normalize(nodeText);\n const nodeNormalizedStart = normalizedI;\n const nodeNormalizedEnd = nodeNormalizedStart + normalizedText.length + (isEnd ? 1 : 0);\n\n if (nodeNormalizedEnd > normalizedTargetIndex) {\n // We have found the node that contains the normalizedTargetIndex we are looking for!\n const normalizedOffset = normalizedTargetIndex - nodeNormalizedStart;\n\n // But the normalized text could be a shorter length than the node text,\n // so we try to continually increase the nodeOffset\n let nodeOffset = Math.min(normalizedOffset, nodeText.length);\n\n const normalizedSubstring = isEnd ?\n normalizedText.substring(0, normalizedOffset) :\n normalizedText.substring(normalizedOffset);\n\n let nodeSubstring = isEnd ?\n normalize(nodeText.substring(0, normalizedOffset)) :\n normalize(nodeText.substring(normalizedOffset));\n\n const direction = (isEnd ? -1 : 1) * (normalizedSubstring.length > nodeSubstring.length ? -1 : 1);\n while (nodeOffset >= 0 && nodeOffset <= nodeText.length) {\n if (nodeSubstring.length === normalizedSubstring.length) {\n return {node, offset: nodeOffset};\n }\n nodeOffset += direction;\n\n nodeSubstring = isEnd ?\n normalize(nodeText.substring(0, nodeOffset)) :\n normalize(nodeText.substring(nodeOffset));\n }\n }\n normalizedI += normalizedText.length;\n }\n return undefined;\n}\n\n/**\n * @param {Range} range\n */\nexport function textLayerRangeToString(range) {\n const textNodes = Array.from(genFilter(treeWalkRange(range, 'text'), isBRVisibleTextNode));\n let result = textNodes.map(node => node.textContent).join('');\n const firstTextNode = textNodes[0];\n const lastTextNode = textNodes[textNodes.length - 1];\n if (range.startContainer === firstTextNode) {\n result = result.substring(range.startOffset);\n }\n if (range.endContainer === lastTextNode) {\n result = result.substring(0, result.length - (lastTextNode.textContent.length - range.endOffset));\n }\n return result;\n}\n\n/**\n * Takes a text quote object and a container element, and wraps the quote\n * within the container element in a span to apply highlight-like styling\n *\n * Iterate through the range and determine the \"start\" and \"end\" nodes\n * Example of how this is done via polyfill\n * https://github.com/GoogleChromeLabs/text-fragments-polyfill/blob/main/src/text-fragment-utils.js#L743\n *\n * @param {HTMLElement} textLayer\n * @param {BookReaderTextFragment} textFragment\n * @param {string | null} cssClassName optional css class to add to the highlight span element\n * @return {Element[]} the elements that were created to highlight the text\n */\nexport function renderHighlight(textLayer, textFragment, cssClassName = null) {\n // Create a range that encompasses the entire text content\n const firstPageNode = getFirstMostNode(textLayer);\n const lastPageNode = getLastMostNode(textLayer);\n const wholePageRange = new Range();\n wholePageRange.setStart(firstPageNode, 0);\n wholePageRange.setEnd(lastPageNode, lastPageNode.textContent.length);\n\n const pageWordNodes = Array.from(genFilter(treeWalkRange(wholePageRange, 'text'), isBRVisibleTextNode));\n\n const broadRanges = findRangeForRegExp(\n textFragment.toRegExp({ context: true }),\n wholePageRange,\n pageWordNodes,\n { normalize: replaceTextFragmentDelimiters },\n );\n if (!broadRanges) {\n console.warn(\"Could not find quote with context in page\");\n return;\n }\n\n const broadRangeWordNodes = Array.from(genFilter(treeWalkRange(broadRanges[0], 'text'), isBRVisibleTextNode));\n\n // At which point the quote should now be unambiguous!\n // FIXME: Alas no, it is ambiguous ; need to likely extract prefix and suffix separately?\n const exactRanges = findRangeForRegExp(\n textFragment.toRegExp({ context: false }),\n broadRanges[0],\n broadRangeWordNodes,\n { normalize: replaceTextFragmentDelimiters },\n );\n if (!exactRanges) {\n throw new Error(\"Could not find quote in page\");\n }\n const startTextNode = getFirstMostNode(exactRanges[0].startContainer);\n const endTextNode = getFirstMostNode(exactRanges[0].endContainer);\n\n // markRange requires the range to start and end within text nodes\n const exactRangeTextNodes = new Range();\n exactRangeTextNodes.setStart(startTextNode, 0);\n exactRangeTextNodes.setEnd(endTextNode, endTextNode.textContent.length);\n\n // Don't mark if already marked\n if (startTextNode.parentElement.classList.contains(\"BRhighlight\") ||\n endTextNode.parentElement.classList.contains(\"BRhighlight\")) {\n return;\n }\n\n return markRange(exactRangeTextNodes, () => {\n const mark = document.createElement(\"mark\");\n mark.classList.add(\"BRhighlight\");\n if (cssClassName) mark.classList.add(cssClassName);\n if (textFragment.uuid) mark.classList.add(textFragment.uuid);\n return mark;\n });\n}\n\n/**\n * @param {Text} node\n */\nexport function isBRVisibleTextNode(node) {\n // Exclude the duplicated spaces between words for MS Edge\n return !node.previousElementSibling?.classList.contains(\"BRspace\");\n}\n\n/**\n * Given a Range, wraps its text contents in one or more <mark> elements.\n * <mark> elements can't cross block boundaries, so this function walks the\n * tree to find all the relevant text nodes and wraps them.\n * @param {Range} range - the range to mark. Must start and end inside of\n * text nodes.\n * @param {function(): Element} createWrappingElement - a function that creates\n * the element to wrap text nodes in. This is called once per text node.\n * @return {Element[]} The <mark> nodes that were created.\n *\n * Lightly adapted from https://github.com/GoogleChromeLabs/text-fragments-polyfill/blob/abc6ed408b3f20e91d9cbda9977748459f5e3877/src/text-fragment-utils.js#L456\n */\nfunction markRange(\n range,\n createWrappingElement = () => document.createElement(\"mark\"),\n) {\n if (range.startContainer.nodeType != Node.TEXT_NODE ||\n range.endContainer.nodeType != Node.TEXT_NODE)\n return [];\n\n // If the range is entirely within a single node, just surround it.\n if (range.startContainer === range.endContainer) {\n const trivialMark = createWrappingElement();\n range.surroundContents(trivialMark);\n return [trivialMark];\n }\n\n // Start node -- special case\n const startNode = range.startContainer;\n const startNodeSubrange = range.cloneRange();\n startNodeSubrange.setEndAfter(startNode);\n\n // End node -- special case\n const endNode = range.endContainer;\n const endNodeSubrange = range.cloneRange();\n endNodeSubrange.setStartBefore(endNode);\n\n // In between nodes\n const marks = [];\n range.setStartAfter(startNode);\n range.setEndBefore(endNode);\n const walker = document.createTreeWalker(\n range.commonAncestorContainer,\n NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_TEXT,\n {\n acceptNode: function(node) {\n if (!range.intersectsNode(node)) return NodeFilter.FILTER_REJECT;\n\n if (node.nodeType === Node.TEXT_NODE)\n return NodeFilter.FILTER_ACCEPT;\n return NodeFilter.FILTER_SKIP;\n },\n },\n );\n let node = walker.nextNode();\n while (node) {\n if (node.nodeType === Node.TEXT_NODE) {\n const mark = createWrappingElement();\n node.parentNode.insertBefore(mark, node);\n mark.appendChild(node);\n marks.push(mark);\n }\n node = walker.nextNode();\n }\n\n const startMark = createWrappingElement();\n startNodeSubrange.surroundContents(startMark);\n const endMark = createWrappingElement();\n endNodeSubrange.surroundContents(endMark);\n\n return [startMark, ...marks, endMark];\n}\n\n/**\n * Get UUID assigned to the highlight element from class list\n * @param {HTMLElement} ele\n * @returns\n */\nfunction retrieveUUID(ele) {\n if (!ele) return null;\n const findUUID = Array.from(ele?.classList).filter((name) => {\n if (name.slice(0, 2).includes('id')) {\n return name;\n }\n });\n if (findUUID.length) {\n return findUUID[0];\n }\n return null;\n}\n\n/**\n * An extension of the fields defined by the browser-native TextFragment;\n * See https://developer.mozilla.org/en-US/docs/Web/URI/Reference/Fragment/Text_fragments\n *\n * Text fragment string format: `pageNumber:prefix-,quote,-suffix`\n * Or for long quotes: `pageNumber:prefix-,quoteStart,quoteEnd,-suffix`\n * Note the ':' and ',' separators must not be encoded, but\n * the pageNumber, prefix, quote/quoteStart/quoteEnd, and suffix text can be encoded.\n */\nexport class BookReaderTextFragment {\n /**\n * @param {object} params\n * @param {string | null}params.prefix\n * @param {string | null} [params.quote]\n * @param {string | null} [params.quoteStart]\n * @param {string | null} [params.quoteEnd]\n * @param {string | null} params.suffix\n * @param {string | null} params.pageNumber Page number; e.g. asserted page number or the n-prefixed page index\n * @param {number} params.pageIndex Page index; e.g. zero-based index of the page\n * @param {string | null} [params.uuid] UUID for the text fragment if it has one\n */\n constructor({ prefix, quote, quoteStart, quoteEnd, suffix, pageNumber, pageIndex, uuid }) {\n /** @type {string|null} */\n this.prefix = prefix;\n /** @type {string | null} */\n this.quote = quote ?? null;\n /** @type {string | null} */\n this.quoteStart = quoteStart ?? null;\n /** @type {string | null} */\n this.quoteEnd = quoteEnd ?? null;\n /** @type {string|null} */\n this.suffix = suffix;\n /** @type {string|null} Page number; e.g. asserted page number or the n-prefixed page index */\n this.pageNumber = pageNumber;\n /** @type {number} Page index; e.g. zero-based index of the page */\n this.pageIndex = pageIndex;\n /** @type {string | null} UUID for the text fragment if it has one */\n this.uuid = uuid ?? null;\n }\n\n /**\n * Parse a text fragment from its string value (the part after `text=`).\n * Expected format: `pageNumber:prefix-,quote,-suffix`\n * @param {string} str\n * @param {import('@/src/BookReader/BookModel.js').BookModel} book\n * @param {number} fallbackPageIndex A fallback page index to use if the text\n * fragment does not specify a page number or page index.\n * @returns {BookReaderTextFragment}\n */\n static fromString(str, book, fallbackPageIndex) {\n // Basically matches:\n // (stuff):(stuff)-,(stuff),-(stuff)\n const match = str.match(/^(?:(.*?):)?(?:(.*?)-,)?(.*?)(?:,-(.*))?$/);\n if (!match) {\n throw new Error(`Invalid text fragment format: ${str}`);\n }\n const pageNumber = match[1] ? decodeURIComponent(match[1]) : null;\n const prefix = match[2] ? decodeURIComponent(match[2]) : null;\n const quoteRegion = match[3] || '';\n const quoteParts = quoteRegion.split(',');\n let quote = null;\n let quoteStart = null;\n let quoteEnd = null;\n\n if (quoteParts.length === 1) {\n quote = decodeURIComponent(quoteParts[0]);\n } else if (quoteParts.length === 2) {\n quoteStart = decodeURIComponent(quoteParts[0]);\n quoteEnd = decodeURIComponent(quoteParts[1]);\n } else {\n throw new Error(`Invalid text fragment quote format: ${str}`);\n }\n\n const suffix = match[4] ? decodeURIComponent(match[4]) : null;\n const pageIndex = pageNumber ? book.getPageIndex(pageNumber) : fallbackPageIndex;\n if (typeof pageIndex !== 'number') {\n throw new Error(`Could not determine page index for text fragment with page number ${pageNumber}`);\n }\n\n if (!quote && (!quoteStart || !quoteEnd)) {\n throw new Error(`Invalid text fragment quote format: ${str}`);\n }\n\n return new BookReaderTextFragment({\n prefix,\n quote,\n quoteStart,\n quoteEnd,\n suffix,\n pageNumber,\n pageIndex,\n });\n }\n\n\n /**\n * Outputs a url-safe string serialization of the text fragment, that's a variation of the standard\n * browser TextFragment format to include page information: `pageNumber:prefix-,quote,-suffix`\n *\n * If quote text is long enough, it is serialized as `quoteStart,quoteEnd`.\n * Note the ':' and ',' separators must not and are not encoded, but\n * the pageNumber, prefix, quote/quoteStart/quoteEnd, and suffix text are encoded.\n *\n * @returns {string}\n */\n toUrlString() {\n // When constructing to url, we can collapse the whitespace since the corresponding\n // toRegExp method is resilient to multiple whitespace characters.\n /** @param {string} s */\n const normalize = s => collapseWhitespace(replaceTextFragmentDelimiters(s).trim());\n\n // First the page number or index\n let str = this.pageNumber ? this.pageNumber : `n${this.pageIndex}`;\n str += ':';\n\n if (this.prefix) {\n str += normalize(this.prefix);\n str += '-,';\n }\n\n const quote = this.quote ? normalize(this.quote) : null;\n let shortenedQuoteParts = null;\n if (quote && quote.length > MAX_FULL_QUOTE_URL_CHARS) {\n const words = quote.match(/\\S+/g) || [];\n if (words.length >= TRUNCATED_QUOTE_WORD_COUNT * 2) {\n const quoteStart = getFirstWords(TRUNCATED_QUOTE_WORD_COUNT, quote);\n const quoteEnd = getLastWords(TRUNCATED_QUOTE_WORD_COUNT, quote);\n if (quoteStart && quoteEnd) {\n shortenedQuoteParts = { quoteStart, quoteEnd };\n }\n }\n }\n\n if (quote && !shortenedQuoteParts) {\n str += quote;\n } else if (shortenedQuoteParts) {\n str += `${shortenedQuoteParts.quoteStart},${shortenedQuoteParts.quoteEnd}`;\n } else if (this.quoteStart && this.quoteEnd) {\n str += `${this.quoteStart},${this.quoteEnd}`;\n } else {\n throw new Error('Text fragment requires either a quote or quoteStart/quoteEnd');\n }\n\n if (this.suffix) {\n str += ',-';\n str += normalize(this.suffix);\n }\n\n return encodeURIComponent(str)\n // Bring back the delimiters so it's easier to read, but note not necessary.\n // Note hyphens are not encoded by encodeURIComponent, so no need to replace them\n .replace(/%2C/g, ',')\n .replace(/%3A/g, ':');\n }\n\n /**\n * Build a regex that matches this quote payload.\n * @param {{ context?: boolean }} [options]\n * @returns {RegExp}\n */\n toRegExp({ context = false } = {}) {\n /** @type {[String] | [String, String]} */\n const quotes = this.quote ? [this.quote] : [this.quoteStart, this.quoteEnd];\n\n if (context) {\n if (this.prefix) quotes[0] = this.prefix + ' ' + quotes[0];\n if (this.suffix) quotes[quotes.length - 1] = quotes[quotes.length - 1] + ' ' + this.suffix;\n }\n\n // Make it resilient to extra whitespace\n /** @param {String} quote */\n const quoteToRegExpString = (quote) => RegExp.escape(replaceTextFragmentDelimiters(quote)).replace(/(\\\\x20)+/g, '\\\\s+');\n\n if (quotes.length === 1) {\n return new RegExp(quoteToRegExpString(quotes[0]), 'gi');\n } else {\n return new RegExp(\n quoteToRegExpString(quotes[0]) + '[\\\\s\\\\S]*?' + quoteToRegExpString(quotes[1]),\n 'gi',\n );\n }\n }\n\n toJSON() {\n return {\n prefix: this.prefix,\n quote: this.quote,\n quoteStart: this.quoteStart,\n quoteEnd: this.quoteEnd,\n suffix: this.suffix,\n pageNumber: this.pageNumber,\n pageIndex: this.pageIndex,\n uuid: this.uuid,\n };\n }\n\n /**\n * Create a BookReaderTextFragment instance from a JSON object.\n * @param {object} json\n * @returns {BookReaderTextFragment}\n */\n static fromJSON(json) {\n return new BookReaderTextFragment(json);\n }\n\n /**\n * Builds a TextFragment string from a given text selection.\n * @param {Selection} selection currently selected text, eg `document.getSelection()`\n * @param {Element[]} contextElements elements providing context for the selection\n * @returns {BookReaderTextFragment}\n */\n static fromSelection(selection, contextElements) {\n const range = selection.getRangeAt(0);\n\n // Partially selected words need to be captured completely\n const fullQuoteRange = new Range();\n const startTextNode = getLastMostNode(range.startContainer);\n const endTextNode = getFirstMostNode(range.endContainer);\n fullQuoteRange.setStart(startTextNode, 0);\n fullQuoteRange.setEnd(endTextNode, range.endOffset == 0 ? 0 : (endTextNode.textContent?.length ?? 0));\n\n const preStartRange = document.createRange();\n preStartRange.setStart(getFirstMostNode(contextElements[0]), 0);\n preStartRange.setEnd(startTextNode, 0);\n\n const postEndRange = document.createRange();\n postEndRange.setStart(endTextNode, fullQuoteRange.endOffset);\n const lastWordOfPageEl = getLastMostNode(contextElements[contextElements.length - 1]);\n postEndRange.setEnd(lastWordOfPageEl, Math.max(0, lastWordOfPageEl.textContent.length - 1));\n\n const CONTEXT_WORD_COUNT = 3;\n\n const preStartText = textLayerRangeToString(preStartRange);\n let prefix = getLastWords(CONTEXT_WORD_COUNT, preStartText);\n let prefixWords = countWords(prefix);\n\n const postEndText = textLayerRangeToString(postEndRange);\n let suffix = getFirstWords(CONTEXT_WORD_COUNT, postEndText);\n let suffixWords = countWords(suffix);\n\n if (prefixWords < CONTEXT_WORD_COUNT) {\n // Ran out of words! To reduce the risk of ambiguity, try extending suffix\n suffix = getFirstWords(2 * CONTEXT_WORD_COUNT - prefixWords, postEndText);\n suffixWords = countWords(suffix);\n }\n\n if (suffixWords < CONTEXT_WORD_COUNT) {\n // Ran out of words on the suffix side as well, try extending prefix\n prefix = getLastWords(2 * CONTEXT_WORD_COUNT - suffixWords, preStartText);\n prefixWords = countWords(prefix);\n }\n\n const quote = textLayerRangeToString(fullQuoteRange);\n const pageContainerEl = startTextNode.parentElement.closest(\".BRpagecontainer\");\n\n return new BookReaderTextFragment({\n quote,\n prefix,\n suffix,\n pageNumber: pageContainerEl.getAttribute(\"data-page-num\"),\n pageIndex: parseFloat(pageContainerEl.getAttribute(\"data-index\")),\n });\n }\n}\n\n/**\n * @typedef {BookReaderTextFragment & { uuid: string }} BookReaderSavedHighlight\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","// @ts-check\n\n/**\n * @template T\n * Get the i-th element of an iterable\n * @param {Iterable<T>} iterable\n * @param {number} index\n */\nexport function genAt(iterable, index) {\n let i = 0;\n for (const x of iterable) {\n if (i == index) return x;\n i++;\n }\n return undefined;\n}\n\n/**\n * @template T\n * Generator version of filter\n * @param {Iterable<T>} iterable\n * @param {function(T): boolean} fn\n */\nexport function* genFilter(iterable, fn) {\n for (const x of iterable) {\n if (fn(x)) yield x;\n }\n}\n\n/**\n * @template TFrom, TTo\n * Generator version of map\n * @param {Iterable<TFrom>} gen\n * @param {function(TFrom): TTo} fn\n * @returns {Iterable<TTo>}\n */\nexport function* genMap(gen, fn) {\n for (const x of gen) yield fn(x);\n}\n\n/**\n * @template T\n * Generator that provides a sliding window of 3 elements,\n * prev, current, and next.\n * @param {Iterable<T>} gen\n * @returns {Iterable<[T | undefined, T, T | undefined]>}\n */\nexport function* lookAroundWindow(gen) {\n let prev = undefined;\n let cur = undefined;\n let next = undefined;\n for (const x of gen) {\n if (typeof cur !== 'undefined') {\n next = x;\n yield [prev, cur, next];\n }\n prev = cur;\n cur = x;\n next = undefined;\n }\n\n if (typeof cur !== 'undefined') {\n yield [prev, cur, next];\n }\n}\n\n/**\n * @template T1, T2\n * Lazy zip implementation to avoid importing lodash\n * Expects iterators to be of the same length\n * @param {Iterable<T1>} gen1\n * @param {Iterable<T2>} gen2\n * @returns {Iterable<[T1, T2]>}\n */\nexport function* zip(gen1, gen2) {\n const it1 = gen1[Symbol.iterator]();\n const it2 = gen2[Symbol.iterator]();\n while (true) {\n const r1 = it1.next();\n const r2 = it2.next();\n if (r1.done && r2.done) {\n return;\n }\n if (r1.done || r2.done) {\n throw new Error('zip: one of the iterators is done');\n }\n yield [r1.value, r2.value];\n }\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 * Count whitespace-delimited words in a string.\n * @param {string} text\n * @return {number}\n */\nexport function countWords(text) {\n const matches = text.match(/\\S+/g);\n return matches ? matches.length : 0;\n}\n\n/**\n * @param {StringWithVars|String} template\n * @param { {[varName: string]: { toString: () => string} } } vars\n * @param { {[varName: string]: { toString: () => string} } } [overrides]\n * @returns {StringWithVars|string}\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"],"names":["PROPER_FUNCTION_NAME","__webpack_require__","fails","whitespaces","module","exports","METHOD_NAME","name","$","$trim","target","proto","forced","forcedStringTrimMethod","trim","this","BookReaderPlugin","br","_classCallCheck","options","key","value","Object","assign","pageContainer","$toolbarElement","$navBar","window","Worker","globalThis","worker","constructor","url","Promise","async","accept","addEventListener","eventName","callback","then","on","data","postMessage","message","terminate","CancelledError","Error","TranslatorBacking","registryUrl","downloadTimeout","parseInt","registry","loadModelRegistery","buffers","Map","pivotLanguage","models","onerror","err","console","error","loadWorker","workerUrl","URL","p","u","b","serial","pending","call","args","reject","id","set","callsite","map","arg","String","join","stack","result","has","debug","arguments","get","delete","undefined","bind","Proxy","receiver","response","fetch","credentials","json","Array","from","entries","files","languages","match","to","getTranslationModel","JSON","stringify","promise","loadTranslationModel","catch","performance","mark","filter","model","abort","escape","signal","fromEntries","race","all","part","file","expectedSha256Hash","cause","removeEventListener","measure","vocabs","vocab","trgvocab","srcvocab","keys","config","endsWith","qualityModel","shortlist","lex","checksum","extra","controller","AbortController","timeout","setTimeout","hexToBase64","arrayBuffer","clearTimeout","hexstring","btoa","a","fromCharCode","getModels","findModels","direct","outbound","inbound","forEach","push","length","BatchTranslator","backing","workers","workerLimit","Math","max","queue","batchSerial","batchSize","remove","notify","find","idle","placeholder","e","batch","shift","consumeBatch","requests","translate","request","priority","resolve","enqueue","sort","hasTranslationModel","responses","texts","text","html","qualityScores","toString","i","t","r","Symbol","n","iterator","o","toStringTag","c","prototype","Generator","create","_regeneratorDefine2","f","y","G","v","d","l","TypeError","done","return","GeneratorFunction","GeneratorFunctionPrototype","getPrototypeOf","setPrototypeOf","__proto__","displayName","_regenerator","w","m","defineProperty","_invoke","enumerable","configurable","writable","asyncGeneratorStep","_asyncToGenerator","apply","_next","_throw","_defineProperties","_toPropertyKey","_defineProperty","_typeof","toPrimitive","_toPrimitive","TranslationManager","_this","Cache","_ref","_callee","fromLang","toLang","pageIndex","paragraphIndex","cachedEntry","_resolve","_reject","_context","active","concat","alreadyTranslated","x","index","currentlyTranslating","res","rej","translator","resp","add","_x","_x2","_x3","_x4","_x5","_x6","_ref2","_callee2","fromLanguage","toLanguage","_context2","_x7","_x8","enModel","code","type","fromLanguages","toLanguages","_initWorker","_callee3","registryJson","_i","_Object$values","language","_i2","_Object$values2","modelType","arr","_i3","_Object$values3","obj","firstLang","secondLang","fromModelType","_name","_this2","_context3","initPromise","_initResolve","_initReject","values","encodeURIComponent","publicPath","toNativeName","toISO6391","modelRegistry","_createClass","_callSuper","_getPrototypeOf","ReferenceError","_assertThisInitialized","_possibleConstructorReturn","_isNativeReflectConstruct","Reflect","construct","Boolean","valueOf","_inherits","_setPrototypeOf","_initialize","BrTranslatePanel","BookReader","TranslatePlugin","_BookReaderPlugin","_len","_key","enabled","panelDisclaimerText","TextSelectionManager","selectionElement","page","querySelectorAll","selectedLangFrom","clearAllTranslations","detail","langFromCode","_panel","requestUpdate","translationManager","some","lang","entry","log","langToCode","_render","translateActivePageContainerElements","userToggleTranslate","isSourceLanguageSupported","trigger","textSelectionManager","attach","detach","_init","_callee5","bookLanguage","currentLanguage","_context5","init","imagesBaseURL","replace","_ref5","_callee4","_","_ref4","pageElement","_context4","$container","translateRenderedLayer","_ref6","pageContainerEl","_step","_iterator","_createForOfIteratorHelper","s","paragraphEl","textContent","fitVisiblePage","initWorker","_step2","currentlyActiveContainers","getActivePageContainerElements","visiblePageContainers","element","classList","contains","hiddenPageContainers","_iterator2","_step3","_iterator3","loadingPage","_translateRenderedLayer","_callee7","_this$textSelectionMa","pageTranslationLayer","textLayerElement","paragraphs","paragraphTranslationPromises","_this3","_context7","mode","constModeThumb","dataset","querySelector","document","createElement","setAttribute","prepend","css","width","style","height","transform","pointerEvents","getParagraphsOnPage","_ref7","_callee6","paragraph","pidx","translatedParagraph","originalParagraphStyle","fontSize","_translatedParagraph$","_paragraphs$pidx","pagePriority","translatedText","firstWordSpacing","createSpan","_context6","className","ariaHidden","top","append","parseFloat","loadingModel","getTranslation","firstElementChild","firstChild","appendChild","stopPageFlip","refs","$brContainer","leafIndex","translateLayer","_getTranslateLayers","_callee9","pageContainerElements","_this4","_context9","getActivePageContainerElementsForIndex","toArray","handler","_ref8","_callee8","extraParams","_context8","off","_x0","_x1","_x9","brEl","$br","el","paragEl","adjustedFontSize","clientHeight","scrollHeight","textHeight","newLineHeight","overflow","_this5","_this6","shell","menuProviders","icon","_templateObject","_taggedTemplateLiteral","label","component","_templateObject2","userTranslationActive","detectedToLang","detectedFromLang","sourceLanguageSupported","handleFromLangChange","handleToLangChange","handleToggleTranslation","updateMenuContents","registerPlugin","customElement","LitElement","_LitElement2","_this7","_len2","_key2","F","kind","decorators","property","query","static","_templateObject3","dispatchEvent","CustomEvent","_this8","statusWarning","_statusWarning","_templateObject4","disclaimerMessage","_onLangToChange","sortBy","toLowerCase","_templateObject5","_toggleTranslation","_getLangName","prevSelectedLang","_onLangFromChange","_templateObject6","_templateObject7","_languageModelStatus","event","langFromChangedEvent","bubbles","composed","_getSelectedLang","langToChangedEvent","dropdown","langFromDropdown","langToDropdown","_toConsumableArray","toggleTranslateEvent","_templateObject8","_templateObject9","codes","by639_1","by639_2T","by639_2B","row","nativeName","iso639_1","iso639_2T","iso639_2B","src_default","isArray","_arrayLikeToArray","slice","test","_unsupportedIterableToArray","_n","next","specialLangs","toLocaleLowerCase","codeObj","findLanguage","split","fields","langs","_lang$codeType","includes","hasLocalStorage","localStorage","DEBUG_READ_ALOUD","location","indexOf","DESCRIPTORS","defineBuiltInAccessor","regExpFlagsDetection","regExpFlagsGetterImplementation","correct","RegExp","export_namespaceFn","uncurryThis","createIteratorConstructor","createIterResultObject","requireObjectCoercible","toLength","to_string_namespaceFn","anObject","isObject","classof","isRegExp","getRegExpFlags","getMethod","defineBuiltIn","wellKnownSymbol","speciesConstructor","advanceStringIndex","regExpExec","InternalStateModule","IS_PURE","MATCH_ALL","REGEXP_STRING","REGEXP_STRING_ITERATOR","setInternalState","getInternalState","getterFor","RegExpPrototype","$TypeError","stringIndexOf","nativeMatchAll","matchAll","WORKS_WITH_NON_GLOBAL_REGEX","$RegExpStringIterator","regexp","string","$global","fullUnicode","global","unicode","state","R","S","lastIndex","$matchAll","matcher","C","flags","source","rx","O","toIndexedObject","toObject","lengthOfArrayLike","stat","raw","template","rawTemplate","literalSegments","argumentsLength","elements","es_string_match_all_namespaceFn","SelectionObserver","selector","sel","getSelection","isCollapsed","selection","rangeCount","getRangeAt","collapsed","isSelectionCollapsed","selecting","anchorNode","closest","lastKnownFocusNode","focusNode","_onSelectionChange","BR_HIGHLIGHTS_LOCAL_STORAGE_KEY","layer","maxWords","maxProtectedWords","textSelectingMode","defaultMode","range","startInBr","startContainer","parentElement","endInBr","endContainer","lastAllowedWord","genAt","genFilter","treeWalkRange","node","parentNode","newRange","createRange","setStart","startOffset","setEnd","removeAllRanges","addRange","selectionObserver","selectMenu","BRSelectMenu","_this$br$plugins$expe","_this$br$plugins$expe2","plugins","experiments","isEnabled","selectEvent","_this2$br$plugins$arc","_window$getSelection","archiveAnalytics","sendEvent","removeClass","addClass","mouseIsDown","showSelectMenu","hideSelectMenu","protected","_limitSelection","body","containsNode","preventDefault","clipboardData","setData","$textLayer","each","interceptCopy","textLayer","$pageContainer","startedMouseDown","skipNextMouseup","is","stopPropagation","which","selectMenuEnabled","copyLinkToHighlightEnabled","highlightAnnotationEnabled","isConnected","open","repositionToSelection","show","hide","start","end","passesFilter","walk","_ref2$children","children","_ref2$parents","parents","_ref2$siblings","siblings","sib","_regeneratorValues","nextSibling","nodeType","Node","TEXT_NODE","ELEMENT_NODE","_decorate","_LitElement","BRSelectMenuOption","Number","attribute","temporaryTextTimeoutId","_superPropGet","temporaryText","temporaryTextVisible","temporaryTextDuration","_this$label","_this$ariaLabel","baseLabel","hasTemporaryText","temporaryLabel","showTemporaryLabel","visibleLabel","providedAriaLabel","ariaLabel","accessibleLabel","sizingLabel","ifDefined","renderIcon","liveLabel","_initialize2","_LitElement3","_show","_handleCopyLinkToHighlight","_LitElement4","_this9","reflect","_this0","_scrollTimeoutId","_onScroll","capture","handleCopyLinkToHighlight","handleDeleteHighlight","handleAddAnnotation","_templateObject0","handleHighlightSave","_templateObject1","toggleExtendedMenu","_templateObject10","renderSavedHighlights","removeItem","_templateObject11","renderCopyLinkToHighlightOption","nodesForRemoval","renderHighlightOption","renderRemoveOption","_templateObject12","renderDefaultOptions","renderLocalStorageOptions","_this$br$plugins$expe3","hasMoreOptions","_templateObject13","showExtended","renderExtendedOptions","renderShowMoreOption","_this$copyLinkOption","currentSelection","textFragment","currentParams","linkToHighlightParams","currentUrl","pageNum","adjustedUrlPageNumPath","hash","linkToHighlight","getNodeTextLayer","warn","BookReaderTextFragment","fromSelection","URLSearchParams","readQueryString","toUrlString","pageNumber","pathname","origin","navigator","clipboard","writeText","copyLinkOption","showTemporaryText","_element$closest","Element","direction","highlight","uuid","crypto","randomUUID","highlights","loadHighlightsFromLocalStorage","saveToLocalStorage","retrieveUUID","ele","tempText","parent","deleteHighlight","clearNodesForRemoval","idx","splice","setItem","hl","toJSON","parse","getItem","item","fromJSON","_this1","renderHighlight","handleHighlightClick","identifier","selectedQuoteNodes","firstNode","lastNode","highlightRange","selectionRect","getBoundingClientRect","isMobile","isIOS","isAndroid","SELECTION_PADDING","OS_BAR_H","idealTop","bottom","scrollY","menuWidth","windowWidth","documentElement","clientWidth","idealLeft","left","clamp","scrollX","_this$br$plugins$tran","zIndex","position","passive","updateComplete","_this10","getFirstWords","numWords","re","_templateObject14","getLastWords","_templateObject15","getFirstMostNode","getLastMostNode","lastChild","replaceTextFragmentDelimiters","findRangeForRegExp","regex","textNodes","_ref3$normalize","normalize","normalizedWholePageString","textLayerRangeToString","normalizedStartOffset","matchRegex","definedRanges","getBoundaryPointAtIndex","foundRange","Range","offset","matchRange","nodes","isEnd","_ref4$normalize","normalizedTargetIndex","normalizedI","nodeText","normalizedText","nodeNormalizedStart","normalizedOffset","nodeOffset","min","normalizedSubstring","substring","nodeSubstring","isBRVisibleTextNode","firstTextNode","lastTextNode","endOffset","cssClassName","firstPageNode","lastPageNode","wholePageRange","pageWordNodes","broadRanges","toRegExp","context","broadRangeWordNodes","exactRanges","startTextNode","endTextNode","exactRangeTextNodes","createWrappingElement","trivialMark","surroundContents","startNode","startNodeSubrange","cloneRange","setEndAfter","endNode","endNodeSubrange","setStartBefore","marks","setStartAfter","setEndBefore","walker","createTreeWalker","commonAncestorContainer","NodeFilter","SHOW_ELEMENT","SHOW_TEXT","acceptNode","intersectsNode","FILTER_ACCEPT","FILTER_SKIP","FILTER_REJECT","nextNode","insertBefore","startMark","endMark","markRange","_node$previousElement","previousElementSibling","findUUID","prefix","quote","quoteStart","quoteEnd","suffix","collapseWhitespace","str","shortenedQuoteParts","TRUNCATED_QUOTE_WORD_COUNT","_ref6$context","quotes","quoteToRegExpString","book","fallbackPageIndex","decodeURIComponent","quoteParts","getPageIndex","contextElements","_endTextNode$textCont","_endTextNode$textCont2","fullQuoteRange","preStartRange","postEndRange","lastWordOfPageEl","preStartText","prefixWords","countWords","postEndText","suffixWords","getAttribute","maxSize","_marked","_marked2","genMap","_marked3","lookAroundWindow","_marked4","zip","iterable","fn","_t","gen","_t2","prev","cur","_iterator4","_step4","_t3","gen1","gen2","it1","it2","r1","r2","matches","applyVariables","vars","overrides","possibleFilters","APPLY_FILTERS","$0","$1","_expression$split$map2","varName","filterNames","reduce","acc","urlencode"],"sourceRoot":""}