@internetarchive/bookreader 5.0.0-95 → 5.0.0-97

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 (330) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +2257 -0
  4. package/BookReader/BookReader.js +3 -0
  5. package/BookReader/BookReader.js.LICENSE.txt +72 -0
  6. package/BookReader/BookReader.js.map +1 -0
  7. package/BookReader/bergamot-translator-worker.js +2966 -0
  8. package/BookReader/bergamot-translator-worker.wasm +0 -0
  9. package/BookReader/hypothesis/LICENSE +50 -0
  10. package/BookReader/hypothesis/README.md +55 -0
  11. package/BookReader/hypothesis/build/boot.js +1 -0
  12. package/BookReader/hypothesis/build/manifest.json +20 -0
  13. package/BookReader/hypothesis/build/scripts/annotator.bundle.js +184 -0
  14. package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
  15. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +798 -0
  16. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
  17. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +711 -0
  18. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
  19. package/BookReader/hypothesis/build/styles/annotator.css +2235 -0
  20. package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
  21. package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  22. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  23. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  24. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  25. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  26. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  27. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  28. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  29. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  30. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  31. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  32. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  33. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  34. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  35. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  36. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  37. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  38. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  39. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  40. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  41. package/BookReader/hypothesis/build/styles/highlights.css +2 -0
  42. package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
  43. package/BookReader/hypothesis/build/styles/katex.min.css +2 -0
  44. package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
  45. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +2 -0
  46. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
  47. package/BookReader/hypothesis/build/styles/sidebar.css +2731 -0
  48. package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
  49. package/BookReader/hypothesis/build/styles/ui-playground.css +2659 -0
  50. package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
  51. package/BookReader/hypothesis/package.json +126 -0
  52. package/BookReader/ia-bookreader-bundle.js +1782 -0
  53. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
  54. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  55. package/BookReader/icons/1up.svg +1 -0
  56. package/BookReader/icons/2up.svg +1 -0
  57. package/BookReader/icons/advance.svg +3 -0
  58. package/BookReader/icons/chevron-right.svg +1 -0
  59. package/BookReader/icons/close-circle-dark.svg +1 -0
  60. package/BookReader/icons/close-circle.svg +1 -0
  61. package/BookReader/icons/fullscreen.svg +1 -0
  62. package/BookReader/icons/fullscreen_exit.svg +1 -0
  63. package/BookReader/icons/hamburger.svg +1 -0
  64. package/BookReader/icons/left-arrow.svg +1 -0
  65. package/BookReader/icons/magnify-minus.svg +1 -0
  66. package/BookReader/icons/magnify-plus.svg +1 -0
  67. package/BookReader/icons/magnify.svg +1 -0
  68. package/BookReader/icons/pause.svg +1 -0
  69. package/BookReader/icons/play.svg +1 -0
  70. package/BookReader/icons/playback-speed.svg +1 -0
  71. package/BookReader/icons/read-aloud.svg +1 -0
  72. package/BookReader/icons/review.svg +3 -0
  73. package/BookReader/icons/thumbnails.svg +1 -0
  74. package/BookReader/icons/voice.svg +1 -0
  75. package/BookReader/icons/volume-full.svg +1 -0
  76. package/BookReader/images/BRicons.png +0 -0
  77. package/BookReader/images/BRicons.svg +5 -0
  78. package/BookReader/images/BRicons_ia.png +0 -0
  79. package/BookReader/images/back_pages.png +0 -0
  80. package/BookReader/images/book_bottom_icon.png +0 -0
  81. package/BookReader/images/book_down_icon.png +0 -0
  82. package/BookReader/images/book_left_icon.png +0 -0
  83. package/BookReader/images/book_leftmost_icon.png +0 -0
  84. package/BookReader/images/book_right_icon.png +0 -0
  85. package/BookReader/images/book_rightmost_icon.png +0 -0
  86. package/BookReader/images/book_top_icon.png +0 -0
  87. package/BookReader/images/book_up_icon.png +0 -0
  88. package/BookReader/images/books_graphic.svg +1 -0
  89. package/BookReader/images/booksplit.png +0 -0
  90. package/BookReader/images/control_pause_icon.png +0 -0
  91. package/BookReader/images/control_play_icon.png +0 -0
  92. package/BookReader/images/embed_icon.png +0 -0
  93. package/BookReader/images/hypothesis.ico +0 -0
  94. package/BookReader/images/icon-home-ia.png +0 -0
  95. package/BookReader/images/icon_OL-logo-xs.png +0 -0
  96. package/BookReader/images/icon_alert-xs.png +0 -0
  97. package/BookReader/images/icon_book.svg +1 -0
  98. package/BookReader/images/icon_bookmark.svg +1 -0
  99. package/BookReader/images/icon_close-pop.png +0 -0
  100. package/BookReader/images/icon_download.png +0 -0
  101. package/BookReader/images/icon_experiment.svg +1 -0
  102. package/BookReader/images/icon_gear.svg +1 -0
  103. package/BookReader/images/icon_hamburger.svg +1 -0
  104. package/BookReader/images/icon_home.png +0 -0
  105. package/BookReader/images/icon_home.svg +1 -0
  106. package/BookReader/images/icon_home_ia.png +0 -0
  107. package/BookReader/images/icon_indicator.png +0 -0
  108. package/BookReader/images/icon_info.svg +1 -0
  109. package/BookReader/images/icon_one_page.svg +1 -0
  110. package/BookReader/images/icon_pause.svg +1 -0
  111. package/BookReader/images/icon_play.svg +1 -0
  112. package/BookReader/images/icon_playback-rate.svg +1 -0
  113. package/BookReader/images/icon_return.png +0 -0
  114. package/BookReader/images/icon_search_button.svg +1 -0
  115. package/BookReader/images/icon_share.svg +1 -0
  116. package/BookReader/images/icon_skip-ahead.svg +1 -0
  117. package/BookReader/images/icon_skip-back.svg +2 -0
  118. package/BookReader/images/icon_speaker.svg +1 -0
  119. package/BookReader/images/icon_speaker_open.svg +1 -0
  120. package/BookReader/images/icon_thumbnails.svg +1 -0
  121. package/BookReader/images/icon_toc.svg +1 -0
  122. package/BookReader/images/icon_two_pages.svg +1 -0
  123. package/BookReader/images/icon_zoomer.png +0 -0
  124. package/BookReader/images/loading.gif +0 -0
  125. package/BookReader/images/logo_icon.png +0 -0
  126. package/BookReader/images/marker_chap-off.png +0 -0
  127. package/BookReader/images/marker_chap-off.svg +1 -0
  128. package/BookReader/images/marker_chap-off_ia.png +0 -0
  129. package/BookReader/images/marker_chap-on.png +0 -0
  130. package/BookReader/images/marker_chap-on.svg +1 -0
  131. package/BookReader/images/marker_srch-on.svg +1 -0
  132. package/BookReader/images/marker_srchchap-off.png +0 -0
  133. package/BookReader/images/marker_srchchap-on.png +0 -0
  134. package/BookReader/images/nav_control-dn.png +0 -0
  135. package/BookReader/images/nav_control-dn_ia.png +0 -0
  136. package/BookReader/images/nav_control-up.png +0 -0
  137. package/BookReader/images/nav_control-up_ia.png +0 -0
  138. package/BookReader/images/nav_control.png +0 -0
  139. package/BookReader/images/one_page_mode_icon.png +0 -0
  140. package/BookReader/images/paper-badge.png +0 -0
  141. package/BookReader/images/print_icon.png +0 -0
  142. package/BookReader/images/progressbar.gif +0 -0
  143. package/BookReader/images/right_edges.png +0 -0
  144. package/BookReader/images/slider.png +0 -0
  145. package/BookReader/images/slider_ia.png +0 -0
  146. package/BookReader/images/thumbnail_mode_icon.png +0 -0
  147. package/BookReader/images/translate.svg +1 -0
  148. package/BookReader/images/transparent.png +0 -0
  149. package/BookReader/images/two_page_mode_icon.png +0 -0
  150. package/BookReader/images/unviewable_page.png +0 -0
  151. package/BookReader/images/zoom_in_icon.png +0 -0
  152. package/BookReader/images/zoom_out_icon.png +0 -0
  153. package/BookReader/jquery-3.js +2 -0
  154. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  155. package/BookReader/plugins/plugin.archive_analytics.js +2 -0
  156. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -0
  157. package/BookReader/plugins/plugin.autoplay.js +2 -0
  158. package/BookReader/plugins/plugin.autoplay.js.map +1 -0
  159. package/BookReader/plugins/plugin.chapters.js +26 -0
  160. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  161. package/BookReader/plugins/plugin.chapters.js.map +1 -0
  162. package/BookReader/plugins/plugin.experiments.js +3 -0
  163. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  164. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  165. package/BookReader/plugins/plugin.iframe.js +2 -0
  166. package/BookReader/plugins/plugin.iframe.js.map +1 -0
  167. package/BookReader/plugins/plugin.iiif.js +2 -0
  168. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  169. package/BookReader/plugins/plugin.resume.js +2 -0
  170. package/BookReader/plugins/plugin.resume.js.map +1 -0
  171. package/BookReader/plugins/plugin.search.js +3 -0
  172. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  173. package/BookReader/plugins/plugin.search.js.map +1 -0
  174. package/BookReader/plugins/plugin.text_selection.js +3 -0
  175. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  176. package/BookReader/plugins/plugin.text_selection.js.map +1 -0
  177. package/BookReader/plugins/plugin.translate.js +3 -0
  178. package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
  179. package/BookReader/plugins/plugin.translate.js.map +1 -0
  180. package/BookReader/plugins/plugin.tts.js +3 -0
  181. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +29 -0
  182. package/BookReader/plugins/plugin.tts.js.map +1 -0
  183. package/BookReader/plugins/plugin.url.js +2 -0
  184. package/BookReader/plugins/plugin.url.js.map +1 -0
  185. package/BookReader/plugins/plugin.vendor-fullscreen.js +2 -0
  186. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -0
  187. package/BookReader/plugins/translator-worker.js +2 -0
  188. package/BookReader/plugins/translator-worker.js.map +1 -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/package.json +11 -3
  194. package/src/BookNavigator/book-navigator.js +1 -0
  195. package/src/BookReader/BookModel.js +564 -0
  196. package/src/BookReader/DragScrollable.js +233 -0
  197. package/src/BookReader/ImageCache.js +149 -0
  198. package/src/BookReader/Mode1Up.js +110 -0
  199. package/src/BookReader/Mode1UpLit.js +393 -0
  200. package/src/BookReader/Mode2Up.js +107 -0
  201. package/src/BookReader/Mode2UpLit.js +787 -0
  202. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  203. package/src/BookReader/ModeSmoothZoom.js +312 -0
  204. package/src/BookReader/ModeThumb.js +344 -0
  205. package/src/BookReader/Navbar/Navbar.js +416 -0
  206. package/src/BookReader/PageContainer.js +172 -0
  207. package/src/BookReader/ReduceSet.js +26 -0
  208. package/src/BookReader/Toolbar/Toolbar.js +362 -0
  209. package/src/BookReader/events.js +19 -0
  210. package/src/BookReader/options.js +387 -0
  211. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  212. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  213. package/src/BookReader/utils/SelectionObserver.js +45 -0
  214. package/src/BookReader/utils/classes.js +36 -0
  215. package/src/BookReader/utils.js +313 -0
  216. package/src/BookReader.js +22 -139
  217. package/src/assets/images/icon_experiment.svg +1 -0
  218. package/src/assets/images/translate.svg +1 -0
  219. package/src/css/_BRnav.scss +0 -24
  220. package/src/css/_BRsearch.scss +0 -5
  221. package/src/css/_TextSelection.scss +32 -1
  222. package/src/plugins/plugin.experiments.js +34 -9
  223. package/src/plugins/plugin.text_selection.js +8 -20
  224. package/src/plugins/translate/TranslationManager.js +167 -0
  225. package/src/plugins/translate/plugin.translate.js +414 -0
  226. package/src/plugins/tts/utils.js +9 -20
  227. package/src/util/cache.js +20 -0
  228. package/.eslintrc.cjs +0 -51
  229. package/.gitattributes +0 -2
  230. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  231. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  232. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  233. package/.github/workflows/node.js.yml +0 -102
  234. package/.github/workflows/npm-publish.yml +0 -23
  235. package/.testcaferc.cjs +0 -10
  236. package/BookReaderDemo/BookReaderDemo.css +0 -40
  237. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -112
  238. package/BookReaderDemo/BookReaderJSSimple.js +0 -56
  239. package/BookReaderDemo/IADemoBr.js +0 -149
  240. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  241. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  242. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  243. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  244. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  245. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  246. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  247. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  248. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  249. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  250. package/BookReaderDemo/demo-advanced.html +0 -33
  251. package/BookReaderDemo/demo-embed-iframe-src.html +0 -85
  252. package/BookReaderDemo/demo-embed.html +0 -26
  253. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -34
  254. package/BookReaderDemo/demo-fullscreen.html +0 -31
  255. package/BookReaderDemo/demo-iiif.html +0 -121
  256. package/BookReaderDemo/demo-internetarchive.html +0 -271
  257. package/BookReaderDemo/demo-multiple.html +0 -44
  258. package/BookReaderDemo/demo-preview-pages.html +0 -1093
  259. package/BookReaderDemo/demo-simple.html +0 -35
  260. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -34
  261. package/BookReaderDemo/ia-multiple-volumes-manifest.js +0 -169
  262. package/BookReaderDemo/immersion-1up.html +0 -64
  263. package/BookReaderDemo/immersion-mode.html +0 -33
  264. package/BookReaderDemo/toggle_controls.html +0 -54
  265. package/BookReaderDemo/view_mode.html +0 -40
  266. package/BookReaderDemo/viewmode-cycle.html +0 -40
  267. package/CHANGELOG.md +0 -1087
  268. package/CONTRIBUTING.md +0 -7
  269. package/babel.config.cjs +0 -20
  270. package/codecov.yml +0 -23
  271. package/index.html +0 -34
  272. package/netlify.toml +0 -9
  273. package/renovate.json +0 -52
  274. package/screenshot.png +0 -0
  275. package/scripts/postversion.js +0 -11
  276. package/scripts/preversion.js +0 -15
  277. package/scripts/version.js +0 -24
  278. package/tests/e2e/README.md +0 -112
  279. package/tests/e2e/autoplay.test.js +0 -16
  280. package/tests/e2e/base.test.js +0 -27
  281. package/tests/e2e/helpers/base.js +0 -263
  282. package/tests/e2e/helpers/debug.js +0 -13
  283. package/tests/e2e/helpers/mockSearch.js +0 -90
  284. package/tests/e2e/helpers/params.js +0 -17
  285. package/tests/e2e/helpers/rightToLeft.js +0 -23
  286. package/tests/e2e/helpers/search.js +0 -73
  287. package/tests/e2e/models/BookReader.js +0 -11
  288. package/tests/e2e/models/Navigation.js +0 -39
  289. package/tests/e2e/rightToLeft.test.js +0 -19
  290. package/tests/e2e/viewmode.test.js +0 -44
  291. package/tests/jest/BookNavigator/book-navigator.test.js +0 -653
  292. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +0 -43
  293. package/tests/jest/BookNavigator/bookmarks/bookmark-edit.test.js +0 -132
  294. package/tests/jest/BookNavigator/bookmarks/bookmarks-list.test.js +0 -221
  295. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +0 -45
  296. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +0 -67
  297. package/tests/jest/BookNavigator/downloads/downloads.test.js +0 -53
  298. package/tests/jest/BookNavigator/search/search-provider.test.js +0 -179
  299. package/tests/jest/BookNavigator/search/search-results.test.js +0 -289
  300. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +0 -49
  301. package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +0 -80
  302. package/tests/jest/BookNavigator/visual-adjustments.test.js +0 -200
  303. package/tests/jest/BookReader.keyboard.test.js +0 -190
  304. package/tests/jest/BookReader.options.test.js +0 -47
  305. package/tests/jest/BookReader.test.js +0 -316
  306. package/tests/jest/plugins/plugin.archive_analytics.test.js +0 -20
  307. package/tests/jest/plugins/plugin.autoplay.test.js +0 -35
  308. package/tests/jest/plugins/plugin.chapters.test.js +0 -193
  309. package/tests/jest/plugins/plugin.iframe.test.js +0 -42
  310. package/tests/jest/plugins/plugin.resume.test.js +0 -85
  311. package/tests/jest/plugins/plugin.text_selection.test.js +0 -447
  312. package/tests/jest/plugins/plugin.vendor-fullscreen.test.js +0 -65
  313. package/tests/jest/plugins/search/plugin.search.test.js +0 -120
  314. package/tests/jest/plugins/search/plugin.search.view.test.js +0 -131
  315. package/tests/jest/plugins/search/utils.js +0 -25
  316. package/tests/jest/plugins/search/utils.test.js +0 -29
  317. package/tests/jest/plugins/tts/AbstractTTSEngine.test.js +0 -173
  318. package/tests/jest/plugins/tts/FestivalTTSEngine.test.js +0 -59
  319. package/tests/jest/plugins/tts/PageChunk.test.js +0 -57
  320. package/tests/jest/plugins/tts/PageChunkIterator.test.js +0 -179
  321. package/tests/jest/plugins/tts/WebTTSEngine.test.js +0 -178
  322. package/tests/jest/plugins/tts/utils.test.js +0 -74
  323. package/tests/jest/plugins/url/UrlPlugin.test.js +0 -198
  324. package/tests/jest/plugins/url/plugin.url.test.js +0 -168
  325. package/tests/jest/setup.js +0 -3
  326. package/tests/jest/util/browserSniffing.test.js +0 -62
  327. package/tests/jest/util/docCookies.test.js +0 -24
  328. package/tests/jest/util/strings.test.js +0 -63
  329. package/tests/jest/utils.js +0 -83
  330. package/webpack.config.js +0 -97
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugins/plugin.translate.js","mappings":"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","sources":["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/./src/util/cache.js"],"sourcesContent":["// @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 return {\n from: key.substring(0, 2),\n to: key.substring(2, 4),\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';\n\nexport const langs = /** @type {{[lang: string]: string}} */ {\n \"bg\": \"Bulgarian\",\n \"ca\": \"Catalan\",\n \"cs\": \"Czech\",\n \"nl\": \"Dutch\",\n \"en\": \"English\",\n \"et\": \"Estonian\",\n \"de\": \"German\",\n \"fr\": \"French\",\n \"is\": \"Icelandic\",\n \"it\": \"Italian\",\n \"nb\": \"Norwegian Bokmål\",\n \"nn\": \"Norwegian Nynorsk\",\n \"fa\": \"Persian\",\n \"pl\": \"Polish\",\n \"pt\": \"Portuguese\",\n \"ru\": \"Russian\",\n \"es\": \"Spanish\",\n \"uk\": \"Ukrainian\",\n};\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\", 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/\";\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 this.fromLanguages.push({code: firstLang, name:langs[firstLang], type: \"prod\"});\n }\n if (secondLang !== \"en\") {\n this.toLanguages.push({code: secondLang, name:langs[secondLang], 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 });\n\n return promise;\n }\n}\n","// @ts-check\nimport { html, LitElement } from 'lit';\nimport { BookReaderPlugin } from '../../BookReaderPlugin.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport { langs, TranslationManager } from \"./TranslationManager.js\";\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 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\n * @type {!string}\n */\n langFromCode = \"en\";\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 async init() {\n if (!this.options.enabled) {\n return;\n }\n\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._render();\n\n this.langToCode = this.translationManager.toLanguages[0].code;\n\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 if (this.br.mode == this.br.constModeThumb) {\n return;\n }\n\n const pageIndex = page.dataset.index;\n\n let pageTranslationLayer;\n if (!page.querySelector('.BRPageLayer.BRtranslateLayer')) {\n pageTranslationLayer = document.createElement('div');\n pageTranslationLayer.classList.add('BRPageLayer', 'BRtranslateLayer');\n pageTranslationLayer.setAttribute('lang', `${this.langToCode}`);\n page.prepend(pageTranslationLayer);\n } else {\n pageTranslationLayer = page.querySelector('.BRPageLayer.BRtranslateLayer');\n }\n\n const textLayerElement = page.querySelector('.BRtextLayer');\n textLayerElement.classList.add('showingTranslation');\n $(pageTranslationLayer).css({\n \"width\": $(textLayerElement).css(\"width\"),\n \"height\": $(textLayerElement).css(\"height\"),\n \"transform\": $(textLayerElement).css(\"transform\"),\n \"pointer-events\": $(textLayerElement).css(\"pointer-events\"),\n \"z-index\": 3,\n });\n const paragraphs = this.getParagraphsOnPage(page);\n\n paragraphs.forEach(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 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\n // Note: We'll likely want to switch to using the same logic as\n // TextSelectionPlugin's selection, which allows for e.g. click-to-flip\n // to work simultaneously with text selection.\n translatedParagraph.addEventListener('mousedown', (e) => {\n e.stopPropagation();\n e.stopImmediatePropagation();\n });\n\n translatedParagraph.addEventListener('mouseup', (e) => {\n e.stopPropagation();\n e.stopImmediatePropagation();\n });\n\n translatedParagraph.addEventListener('dragstart', (e) =>{\n e.preventDefault();\n });\n pageTranslationLayer.append(translatedParagraph);\n }\n\n if (paragraph.textContent.length !== 0) {\n const pagePriority = parseFloat(pageIndex) + priority + pidx;\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\n clearAllTranslations() {\n document.querySelectorAll('.BRtranslateLayer').forEach(el => el.remove());\n }\n\n /**\n * @param {Element} paragEl\n */\n fitVisiblePage(paragEl) {\n // For some reason, Chrome does not detect the transform property for the translation + text layers\n // Could not get it to fetch the transform value using $().css method\n // Oddly enough the value is retrieved if using .style.transform instead?\n const translateLayerEl = paragEl.parentElement;\n if ($(translateLayerEl).css('transform') == 'none') {\n const pageNumber = paragEl.getAttribute('data-translate-index').split('-')[0];\n /** @type {HTMLElement} selectionTransform */\n const textLayerEl = document.querySelector(`[data-index='${pageNumber}'] .BRtextLayer`);\n $(translateLayerEl).css({'transform': textLayerEl.style.transform});\n }\n\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\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({ code: selectedLangFrom, name: langs[selectedLangFrom] });\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 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.translateActivePageContainerElements();\n }\n\n\n /**\n * Update the table of contents based on array of TOC entries.\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 }\n }\"\n @langFromChanged=\"${this.handleFromLangChange}\"\n @langToChanged=\"${this.handleToLangChange}\"\n .fromLanguages=\"${this.translationManager.fromLanguages}\"\n .toLanguages=\"${this.translationManager.toLanguages}\"\n .disclaimerMessage=\"${this.options.panelDisclaimerText}\"\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\n /** @override */\n createRenderRoot() {\n // Disable shadow DOM; that would require a huge rejiggering of CSS\n return this;\n }\n\n connectedCallback() {\n super.connectedCallback();\n this.dispatchEvent(new CustomEvent('connected'));\n }\n\n render() {\n const showPrevLangButton =\n this.prevSelectedLang &&\n (this.prevSelectedLang !== this._getSelectedLang('to') || this._getSelectedLang('from') === this._getSelectedLang('to'));\n\n return html`<div class=\"app\">\n <div class=\"panel panel--from\">\n <label>\n From\n <select id=\"lang-from\" name=\"from\" class=\"lang-select\" @change=\"${this._onLangFromChange}\">\n ${this.fromLanguages.map(\n lang => html`<option value=\"${lang.code}\">${lang.name}</option>`,\n )}\n </select>\n </label>\n </div>\n <div class=\"panel panel--to\">\n <label>\n To\n <select id=\"lang-to\" name=\"to\" class=\"lang-select\" @change=\"${this._onLangToChange}\">\n ${this.toLanguages.map(\n lang => html`<option value=\"${lang.code}\">${lang.name}</option>`,\n )}\n </select>\n </label>\n ${showPrevLangButton\n ? html`<button class=\"prev-lang-btn\" @click=\"${this._onPrevLangClick}\">\n ${this._getLangName(this.prevSelectedLang)}\n </button>`\n : ''}\n </div>\n <div class=\"footer\" id=\"status\"></div>\n <br/>\n <div class=\"disclaimer\" id=\"disclaimerMessage\"> ${this.disclaimerMessage} </div>\n </div>`;\n }\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 }\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 }\n\n _onPrevLangClick() {\n const prevLang = this.prevSelectedLang;\n if (prevLang == this._getSelectedLang('from')) {\n console.log(\"_onPrevLangClick: will not change since prevLang is the same as the current 'To' language code\");\n return;\n }\n this.prevSelectedLang = this._getSelectedLang('to'); // Update prevSelectedLang to current \"To\" value\n const langToChangedEvent = new CustomEvent('langToChanged', {\n detail: { value: prevLang },\n bubbles: true,\n composed: true,\n });\n this.dispatchEvent(langToChangedEvent);\n\n // Update the \"To\" dropdown to the previous language\n const toDropdown = this.querySelector('#lang-to');\n if (toDropdown) {\n toDropdown.value = prevLang;\n }\n }\n\n _getSelectedLang(type) {\n const dropdown = this.querySelector(`#lang-${type}`);\n return dropdown ? dropdown.value : '';\n }\n\n _getLangName(code) {\n const lang = [...this.fromLanguages, ...this.toLanguages].find(lang => lang.code === code);\n return lang ? lang.name : '';\n }\n}\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"],"names":["BookReaderPlugin","br","_classCallCheck","this","options","key","value","Object","assign","pageContainer","$toolbarElement","$navBar","window","Worker","globalThis","constructor","url","Promise","async","accept","import","addEventListener","eventName","callback","then","worker","on","data","postMessage","message","terminate","CancelledError","Error","TranslatorBacking","registryUrl","downloadTimeout","parseInt","registry","loadModelRegistery","buffers","Map","pivotLanguage","models","onerror","err","console","error","loadWorker","workerUrl","URL","serial","pending","call","name","args","reject","id","set","callsite","map","arg","String","join","stack","result","has","debug","arguments","get","delete","undefined","bind","exports","Proxy","target","receiver","response","fetch","credentials","json","Array","from","entries","files","substring","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","match","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","b","hasTranslationModel","responses","texts","text","html","qualityScores","toString","i","_regeneratorRuntime","t","r","prototype","n","hasOwnProperty","o","defineProperty","Symbol","iterator","c","asyncIterator","u","toStringTag","define","enumerable","configurable","writable","wrap","Generator","create","Context","makeInvokeMethod","tryCatch","type","h","l","f","s","y","GeneratorFunction","GeneratorFunctionPrototype","p","d","getPrototypeOf","v","values","g","defineIteratorMethods","_invoke","AsyncIterator","invoke","_typeof","__await","callInvokeWithMethodAndArg","done","method","delegate","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","return","TypeError","resultName","next","nextLoc","pushTryEntry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","isNaN","displayName","isGeneratorFunction","setPrototypeOf","__proto__","awrap","reverse","pop","prev","charAt","slice","stop","rval","handle","complete","finish","delegateYield","asyncGeneratorStep","_asyncToGenerator","apply","_next","_throw","_defineProperties","_toPropertyKey","_defineProperty","toPrimitive","_toPrimitive","langs","TranslationManager","_this","Cache","_ref","_callee","fromLang","toLang","pageIndex","paragraphIndex","cachedEntry","_resolve","_reject","_context","active","concat","alreadyTranslated","x","index","currentlyTranslating","res","rej","translator","resp","_x","_x2","_x3","_x4","_x5","_x6","enModel","code","fromLanguages","toLanguages","_initWorker","_callee2","registryJson","_i","_Object$values","language","_i2","_Object$values2","modelType","arr","_i3","_Object$values3","obj","firstLang","secondLang","fromModelType","_this2","_context2","initPromise","_initResolve","_initReject","encodeURIComponent","publicPath","modelRegistry","_createClass","_callSuper","_getPrototypeOf","ReferenceError","_assertThisInitialized","_possibleConstructorReturn","_isNativeReflectConstruct","Reflect","construct","Boolean","valueOf","_inherits","_setPrototypeOf","_initialize","BrTranslatePanel","BookReader","TranslatePlugin","_BookReaderPlugin","_len","_key","enabled","panelDisclaimerText","page","querySelectorAll","selectedLangFrom","clearAllTranslations","detail","langFromCode","translationManager","some","lang","_panel","log","langToCode","translateActivePageContainerElements","_ref2","_init","_callee4","_context4","imagesBaseURL","replace","_ref4","_callee3","_","_ref3","pageElement","_context3","$container","translateRenderedLayer","_ref5","pageContainerEl","_step","_iterator","_createForOfIteratorHelper","paragraphEl","textContent","fitVisiblePage","initWorker","_render","_step2","currentlyActiveContainers","getActivePageContainerElements","visiblePageContainers","element","classList","contains","hiddenPageContainers","_iterator2","_step3","_iterator3","loadingPage","_translateRenderedLayer","_callee6","pageTranslationLayer","textLayerElement","paragraphs","_this3","_context6","mode","constModeThumb","dataset","querySelector","document","createElement","add","setAttribute","prepend","$","css","getParagraphsOnPage","_ref6","_callee5","paragraph","pidx","translatedParagraph","originalParagraphStyle","fontSize","_translatedParagraph$","_paragraphs$pidx","pagePriority","translatedText","firstWordSpacing","createSpan","_context5","className","stopPropagation","stopImmediatePropagation","preventDefault","append","parseFloat","getTranslation","firstElementChild","firstChild","appendChild","_x7","_x8","el","paragEl","translateLayerEl","parentElement","pageNumber","getAttribute","split","textLayerEl","style","transform","adjustedFontSize","clientHeight","scrollHeight","textHeight","newLineHeight","_this4","shell","menuProviders","icon","_templateObject","_taggedTemplateLiteral","label","component","_templateObject2","handleFromLangChange","handleToLangChange","updateMenuContents","registerPlugin","customElement","LitElement","_LitElement2","_this5","_len2","_key2","F","kind","decorators","property","dispatchEvent","CustomEvent","showPrevLangButton","prevSelectedLang","_getSelectedLang","_templateObject3","_onLangFromChange","_templateObject4","_onLangToChange","_templateObject5","_templateObject6","_onPrevLangClick","_getLangName","disclaimerMessage","event","langFromChangedEvent","bubbles","composed","langToChangedEvent","prevLang","toDropdown","dropdown","_toConsumableArray","maxSize","entry"],"sourceRoot":""}