@internetarchive/bookreader 5.0.0-10-alpha-1 → 5.0.0-100

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 (374) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +428 -1139
  4. package/BookReader/BookReader.js +1 -1
  5. package/BookReader/BookReader.js.LICENSE.txt +20 -20
  6. package/BookReader/BookReader.js.map +1 -1
  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 -1
  56. package/BookReader/icons/2up.svg +1 -1
  57. package/BookReader/icons/advance.svg +1 -1
  58. package/BookReader/icons/chevron-right.svg +1 -1
  59. package/BookReader/icons/close-circle-dark.svg +1 -1
  60. package/BookReader/icons/close-circle.svg +1 -1
  61. package/BookReader/icons/fullscreen.svg +1 -1
  62. package/BookReader/icons/fullscreen_exit.svg +1 -1
  63. package/BookReader/icons/hamburger.svg +1 -1
  64. package/BookReader/icons/left-arrow.svg +1 -1
  65. package/BookReader/icons/magnify-minus.svg +1 -1
  66. package/BookReader/icons/magnify-plus.svg +1 -1
  67. package/BookReader/icons/magnify.svg +1 -1
  68. package/BookReader/icons/pause.svg +1 -1
  69. package/BookReader/icons/play.svg +1 -1
  70. package/BookReader/icons/playback-speed.svg +1 -1
  71. package/BookReader/icons/read-aloud.svg +1 -1
  72. package/BookReader/icons/review.svg +1 -1
  73. package/BookReader/icons/thumbnails.svg +1 -1
  74. package/BookReader/icons/voice.svg +1 -0
  75. package/BookReader/icons/volume-full.svg +1 -1
  76. package/BookReader/images/BRicons.svg +3 -3
  77. package/BookReader/images/books_graphic.svg +1 -1
  78. package/BookReader/images/hypothesis.ico +0 -0
  79. package/BookReader/images/icon_book.svg +1 -1
  80. package/BookReader/images/icon_bookmark.svg +1 -1
  81. package/BookReader/images/icon_experiment.svg +1 -0
  82. package/BookReader/images/icon_gear.svg +1 -1
  83. package/BookReader/images/icon_hamburger.svg +1 -1
  84. package/BookReader/images/icon_home.svg +1 -1
  85. package/BookReader/images/icon_info.svg +1 -1
  86. package/BookReader/images/icon_one_page.svg +1 -1
  87. package/BookReader/images/icon_pause.svg +1 -1
  88. package/BookReader/images/icon_play.svg +1 -1
  89. package/BookReader/images/icon_playback-rate.svg +1 -1
  90. package/BookReader/images/icon_search_button.svg +1 -1
  91. package/BookReader/images/icon_share.svg +1 -1
  92. package/BookReader/images/icon_skip-ahead.svg +1 -1
  93. package/BookReader/images/icon_skip-back.svg +1 -1
  94. package/BookReader/images/icon_speaker.svg +1 -1
  95. package/BookReader/images/icon_speaker_open.svg +1 -1
  96. package/BookReader/images/icon_thumbnails.svg +1 -1
  97. package/BookReader/images/icon_toc.svg +1 -1
  98. package/BookReader/images/icon_two_pages.svg +1 -1
  99. package/BookReader/images/marker_chap-off.svg +1 -1
  100. package/BookReader/images/marker_chap-on.svg +1 -1
  101. package/BookReader/images/marker_srch-on.svg +1 -1
  102. package/BookReader/images/translate.svg +1 -0
  103. package/BookReader/images/unviewable_page.png +0 -0
  104. package/BookReader/jquery-3.js +2 -0
  105. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  106. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  107. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  108. package/BookReader/plugins/plugin.autoplay.js +1 -1
  109. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  110. package/BookReader/plugins/plugin.chapters.js +25 -1
  111. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  112. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  113. package/BookReader/plugins/plugin.experiments.js +3 -0
  114. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  115. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  116. package/BookReader/plugins/plugin.iframe.js +1 -1
  117. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  118. package/BookReader/plugins/plugin.iiif.js +2 -0
  119. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  120. package/BookReader/plugins/plugin.resume.js +1 -1
  121. package/BookReader/plugins/plugin.resume.js.map +1 -1
  122. package/BookReader/plugins/plugin.search.js +2 -1
  123. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  124. package/BookReader/plugins/plugin.search.js.map +1 -1
  125. package/BookReader/plugins/plugin.text_selection.js +2 -1
  126. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  127. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  128. package/BookReader/plugins/plugin.translate.js +137 -0
  129. package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
  130. package/BookReader/plugins/plugin.translate.js.map +1 -0
  131. package/BookReader/plugins/plugin.tts.js +1 -1
  132. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  133. package/BookReader/plugins/plugin.tts.js.map +1 -1
  134. package/BookReader/plugins/plugin.url.js +1 -1
  135. package/BookReader/plugins/plugin.url.js.map +1 -1
  136. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  137. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  138. package/BookReader/plugins/translator-worker.js +2 -0
  139. package/BookReader/plugins/translator-worker.js.map +1 -0
  140. package/BookReader/silence.mp3 +0 -0
  141. package/BookReader/translator-worker.js +475 -0
  142. package/BookReader/webcomponents-bundle.js +3 -0
  143. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  144. package/BookReader/webcomponents-bundle.js.map +1 -0
  145. package/README.md +14 -3
  146. package/jsconfig.json +19 -0
  147. package/package.json +84 -64
  148. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  149. package/src/BookNavigator/assets/button-base.js +2 -1
  150. package/src/BookNavigator/assets/ia-logo.js +17 -0
  151. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  152. package/src/BookNavigator/assets/icon_close.js +1 -1
  153. package/src/BookNavigator/book-navigator.js +620 -0
  154. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  155. package/src/BookNavigator/bookmarks/bookmark-edit.js +2 -3
  156. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  157. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +2 -2
  158. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  159. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  160. package/src/BookNavigator/delete-modal-actions.js +1 -1
  161. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  162. package/src/BookNavigator/downloads/downloads.js +24 -4
  163. package/src/BookNavigator/search/search-provider.js +55 -27
  164. package/src/BookNavigator/search/search-results.js +25 -11
  165. package/src/BookNavigator/sharing.js +27 -0
  166. package/src/BookNavigator/viewable-files.js +95 -0
  167. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +13 -12
  168. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +9 -9
  169. package/src/BookReader/BookModel.js +92 -46
  170. package/src/BookReader/DragScrollable.js +233 -0
  171. package/src/BookReader/ImageCache.js +49 -16
  172. package/src/BookReader/Mode1Up.js +58 -360
  173. package/src/BookReader/Mode1UpLit.js +393 -0
  174. package/src/BookReader/Mode2Up.js +75 -1318
  175. package/src/BookReader/Mode2UpLit.js +787 -0
  176. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  177. package/src/BookReader/ModeSmoothZoom.js +312 -0
  178. package/src/BookReader/ModeThumb.js +20 -12
  179. package/src/BookReader/Navbar/Navbar.js +130 -53
  180. package/src/BookReader/PageContainer.js +120 -23
  181. package/src/BookReader/ReduceSet.js +2 -2
  182. package/src/BookReader/Toolbar/Toolbar.js +18 -40
  183. package/src/BookReader/events.js +2 -3
  184. package/src/BookReader/options.js +87 -16
  185. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  186. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  187. package/src/BookReader/utils/SelectionObserver.js +45 -0
  188. package/src/BookReader/utils/classes.js +1 -1
  189. package/src/BookReader/utils.js +136 -12
  190. package/src/BookReader.js +641 -1192
  191. package/src/BookReaderPlugin.js +52 -0
  192. package/src/assets/icons/magnify-minus.svg +3 -7
  193. package/src/assets/icons/magnify-plus.svg +3 -7
  194. package/src/assets/icons/voice.svg +1 -0
  195. package/src/assets/images/hypothesis.ico +0 -0
  196. package/src/assets/images/icon_experiment.svg +1 -0
  197. package/src/assets/images/translate.svg +1 -0
  198. package/src/assets/images/unviewable_page.png +0 -0
  199. package/src/assets/silence.mp3 +0 -0
  200. package/src/css/BookReader.scss +1 -5
  201. package/src/css/_BRBookmarks.scss +1 -1
  202. package/src/css/_BRComponent.scss +1 -1
  203. package/src/css/_BRicon.scss +8 -2
  204. package/src/css/_BRmain.scss +16 -3
  205. package/src/css/_BRnav.scss +12 -66
  206. package/src/css/_BRpages.scss +163 -43
  207. package/src/css/_BRsearch.scss +69 -30
  208. package/src/css/_BRtoolbar.scss +5 -5
  209. package/src/css/_TextSelection.scss +129 -24
  210. package/src/css/_colorbox.scss +2 -2
  211. package/src/css/_controls.scss +24 -7
  212. package/src/css/_icons.scss +1 -1
  213. package/src/ia-bookreader/ia-bookreader.js +224 -0
  214. package/src/plugins/plugin.archive_analytics.js +84 -78
  215. package/src/plugins/plugin.autoplay.js +99 -104
  216. package/src/plugins/plugin.chapters.js +314 -205
  217. package/src/plugins/plugin.experiments.js +321 -0
  218. package/src/plugins/plugin.iframe.js +1 -1
  219. package/src/plugins/plugin.iiif.js +141 -0
  220. package/src/plugins/plugin.resume.js +54 -51
  221. package/src/plugins/plugin.text_selection.js +510 -219
  222. package/src/plugins/plugin.vendor-fullscreen.js +5 -5
  223. package/src/plugins/search/plugin.search.js +370 -392
  224. package/src/plugins/search/utils.js +43 -0
  225. package/src/plugins/search/view.js +49 -67
  226. package/src/plugins/translate/TranslationManager.js +162 -0
  227. package/src/plugins/translate/plugin.translate.js +523 -0
  228. package/src/plugins/tts/AbstractTTSEngine.js +78 -49
  229. package/src/plugins/tts/FestivalTTSEngine.js +20 -30
  230. package/src/plugins/tts/PageChunk.js +33 -21
  231. package/src/plugins/tts/PageChunkIterator.js +11 -17
  232. package/src/plugins/tts/WebTTSEngine.js +131 -91
  233. package/src/plugins/tts/plugin.tts.js +344 -350
  234. package/src/plugins/tts/utils.js +49 -47
  235. package/src/plugins/url/UrlPlugin.js +191 -0
  236. package/src/plugins/{plugin.url.js → url/plugin.url.js} +44 -15
  237. package/src/util/TextSelectionManager.js +282 -0
  238. package/src/util/browserSniffing.js +33 -1
  239. package/src/util/cache.js +20 -0
  240. package/src/util/docCookies.js +21 -2
  241. package/src/util/strings.js +1 -0
  242. package/.babelrc +0 -12
  243. package/.dependabot/config.yml +0 -6
  244. package/.eslintrc.js +0 -50
  245. package/.gitattributes +0 -2
  246. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  247. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  248. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  249. package/.github/workflows/node.js.yml +0 -37
  250. package/.github/workflows/npm-publish.yml +0 -47
  251. package/.testcaferc.json +0 -5
  252. package/BookReader/bookreader-component-bundle.js +0 -1450
  253. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  254. package/BookReader/bookreader-component-bundle.js.map +0 -1
  255. package/BookReader/jquery-1.10.1.js +0 -2
  256. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  257. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  258. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  259. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  260. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  261. package/BookReaderDemo/BookReaderDemo.css +0 -41
  262. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  263. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  264. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  265. package/BookReaderDemo/IIIFBookReader.js +0 -207
  266. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  267. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  268. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  269. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  270. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  271. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  272. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  273. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  274. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  275. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  276. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  277. package/BookReaderDemo/demo-advanced.html +0 -33
  278. package/BookReaderDemo/demo-autoplay.html +0 -38
  279. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  280. package/BookReaderDemo/demo-embed.html +0 -26
  281. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  282. package/BookReaderDemo/demo-fullscreen.html +0 -33
  283. package/BookReaderDemo/demo-iiif.html +0 -34
  284. package/BookReaderDemo/demo-iiif.js +0 -26
  285. package/BookReaderDemo/demo-internetarchive.html +0 -74
  286. package/BookReaderDemo/demo-multiple.html +0 -43
  287. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  288. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  289. package/BookReaderDemo/demo-simple.html +0 -34
  290. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  291. package/BookReaderDemo/immersion-1up.html +0 -64
  292. package/BookReaderDemo/immersion-mode.html +0 -35
  293. package/BookReaderDemo/toggle_controls.html +0 -53
  294. package/BookReaderDemo/view_mode.html +0 -39
  295. package/BookReaderDemo/viewmode-cycle.html +0 -41
  296. package/CHANGELOG.md +0 -493
  297. package/CONTRIBUTING.md +0 -7
  298. package/codecov.yml +0 -17
  299. package/index.html +0 -31
  300. package/karma.conf.js +0 -23
  301. package/screenshot.png +0 -0
  302. package/scripts/postversion.js +0 -10
  303. package/scripts/preversion.js +0 -14
  304. package/scripts/version.js +0 -26
  305. package/src/BookNavigator/BookModel.js +0 -14
  306. package/src/BookNavigator/BookNavigator.js +0 -446
  307. package/src/BookNavigator/assets/book-loader.js +0 -27
  308. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  309. package/src/BookNavigator/search/a-search-result.js +0 -55
  310. package/src/BookReader/DebugConsole.js +0 -54
  311. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  312. package/src/ItemNavigator/ItemNavigator.js +0 -376
  313. package/src/ItemNavigator/providers/sharing.js +0 -29
  314. package/src/css/_MobileNav.scss +0 -194
  315. package/src/dragscrollable-br.js +0 -261
  316. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  317. package/src/plugins/plugin.mobile_nav.js +0 -287
  318. package/tests/BookReader/BookModel.test.js +0 -312
  319. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  320. package/tests/BookReader/DebugConsole.test.js +0 -25
  321. package/tests/BookReader/ImageCache.test.js +0 -150
  322. package/tests/BookReader/Mode1Up.test.js +0 -164
  323. package/tests/BookReader/Mode2Up.test.js +0 -247
  324. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  325. package/tests/BookReader/PageContainer.test.js +0 -115
  326. package/tests/BookReader/ReduceSet.test.js +0 -38
  327. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  328. package/tests/BookReader/utils/classes.test.js +0 -88
  329. package/tests/BookReader/utils.test.js +0 -109
  330. package/tests/BookReader.options.test.js +0 -39
  331. package/tests/BookReader.test.js +0 -301
  332. package/tests/e2e/README.md +0 -75
  333. package/tests/e2e/autoplay.test.js +0 -13
  334. package/tests/e2e/base.test.js +0 -35
  335. package/tests/e2e/helpers/base.js +0 -263
  336. package/tests/e2e/helpers/debug.js +0 -13
  337. package/tests/e2e/helpers/desktopSearch.js +0 -72
  338. package/tests/e2e/helpers/mobileSearch.js +0 -85
  339. package/tests/e2e/helpers/mockSearch.js +0 -93
  340. package/tests/e2e/helpers/rightToLeft.js +0 -29
  341. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  342. package/tests/e2e/models/BookReader.js +0 -11
  343. package/tests/e2e/models/Navigation.js +0 -56
  344. package/tests/e2e/rightToLeft.test.js +0 -20
  345. package/tests/e2e/viewmode.test.js +0 -37
  346. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  347. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  348. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  349. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  350. package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
  351. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  352. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  353. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  354. package/tests/plugins/plugin.autoplay.test.js +0 -52
  355. package/tests/plugins/plugin.chapters.test.js +0 -130
  356. package/tests/plugins/plugin.iframe.test.js +0 -42
  357. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  358. package/tests/plugins/plugin.resume.test.js +0 -98
  359. package/tests/plugins/plugin.text_selection.test.js +0 -203
  360. package/tests/plugins/plugin.url.test.js +0 -129
  361. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  362. package/tests/plugins/search/plugin.search.test.js +0 -173
  363. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  364. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  365. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  366. package/tests/plugins/tts/PageChunk.test.js +0 -57
  367. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  368. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  369. package/tests/plugins/tts/utils.test.js +0 -133
  370. package/tests/util/browserSniffing.test.js +0 -56
  371. package/tests/util/docCookies.test.js +0 -15
  372. package/tests/util/strings.test.js +0 -63
  373. package/tests/utils.js +0 -42
  374. package/webpack.config.js +0 -86
@@ -0,0 +1,321 @@
1
+ // @ts-check
2
+ import { css, html, LitElement } from 'lit';
3
+ import { BookReaderPlugin } from '../BookReaderPlugin.js';
4
+ import { customElement, property, state } from 'lit/decorators.js';
5
+ import { sleep } from '../BookReader/utils.js';
6
+
7
+ // @ts-ignore
8
+ const BookReader = /** @type {typeof import('@/src/BookReader.js').default} */(window.BookReader);
9
+
10
+ class ExperimentModel {
11
+ /** @type {string} test */
12
+ name;
13
+ /** @type {string} */
14
+ title;
15
+ /** @type {string} */
16
+ description;
17
+ /** @type {string} */
18
+ icon;
19
+ /** @type {boolean} */
20
+ enabled;
21
+ /** @type {string} */
22
+ learnMore;
23
+
24
+ /** @type {import("@/src/BookReader.js").default} */
25
+ br;
26
+
27
+ assetRoot = '/BookReader/';
28
+
29
+ enabledLoading = false;
30
+
31
+ /**
32
+ * @param {string} path
33
+ */
34
+ buildAssetPath(path) {
35
+ return `${this.assetRoot}${path}`;
36
+ }
37
+
38
+ /**
39
+ * @param {object} param0
40
+ * @param {boolean} param0.manual Whether the experiment was enabled manually
41
+ */
42
+ async enable({ manual }) { }
43
+ async disable() { }
44
+ }
45
+
46
+ export class ExperimentsPlugin extends BookReaderPlugin {
47
+ options = {
48
+ enabled: true,
49
+
50
+ /** Where the state of this plugin is saved in localStorage */
51
+ localStorageKey: 'BrExperiments',
52
+
53
+ /** The experiments that should be shown in the experiments panel */
54
+ enabledExperiments: ['translate'],
55
+ }
56
+
57
+ /** @type {ExperimentModel[]} */
58
+ allExperiments = [
59
+ new class extends ExperimentModel {
60
+ name = 'translate';
61
+ title = 'Translate Plugin';
62
+ description = "Translate books directly in your browser.";
63
+ learnMore = 'https://mozilla.github.io/translations/';
64
+ icon = 'images/translate.svg';
65
+ enabled = false;
66
+ async enable({ manual = false}) {
67
+ if (BookReader.PLUGINS.translate) return;
68
+
69
+ await importAsScript(this.buildAssetPath('plugins/plugin.translate.js'));
70
+ this.br.initializePlugin('translate');
71
+ }
72
+ async disable() {
73
+ // need to reload to remove translate plugin script
74
+ // Sleep so that the event loop can finish processing before the reload
75
+ sleep(0).then(() => {
76
+ window.location.reload();
77
+ });
78
+ }
79
+ }(),
80
+ new class extends ExperimentModel {
81
+ name = 'hypothesis';
82
+ title = 'Hypothes.is';
83
+ description = 'Create public, collaborative, or fully private annotations on books and the web.';
84
+ learnMore = 'https://web.hypothes.is/about/';
85
+ icon = 'images/hypothesis.ico';
86
+ enabled = false;
87
+
88
+ async enable({ manual = false }) {
89
+ // Hypothesis configs ; see https://h.readthedocs.io/projects/client/en/latest/publishers/config.html
90
+ const configScript = document.createElement('script');
91
+ configScript.type = 'application/json';
92
+ configScript.className = 'js-hypothesis-config';
93
+ configScript.textContent = JSON.stringify({
94
+ // Open the sidebar if this is the first time enabling
95
+ openSidebar: manual,
96
+ assetRoot: this.buildAssetPath('hypothesis/'),
97
+ });
98
+
99
+ document.head.appendChild(configScript);
100
+ return importAsScript(this.buildAssetPath('hypothesis/build/boot.js'));
101
+ // For testing
102
+ // return importAsScript('http://localhost:3001/hypothesis');
103
+ }
104
+
105
+ async disable() {
106
+ // need to reload to remove the Hypothesis script
107
+ // Sleep so that the event loop can finish processing before the reload
108
+ sleep(0).then(() => {
109
+ window.location.reload();
110
+ });
111
+ }
112
+ }(),
113
+ ]
114
+
115
+ /** @type {BrExperimentsPanel} */
116
+ _panel;
117
+
118
+ async init() {
119
+ if (!this.options.enabled) {
120
+ return;
121
+ }
122
+
123
+ for (const experiment of this.allExperiments) {
124
+ // TODO: imagesBaseURL should be replaced with assetRoot everywhere
125
+ experiment.assetRoot = this.br.options.imagesBaseURL.replace(/images\/$/, '');
126
+ experiment.icon = experiment.buildAssetPath(experiment.icon);
127
+ experiment.br = this.br;
128
+ }
129
+
130
+ this._loadExperimentStates();
131
+ await Promise.resolve();
132
+ this._render();
133
+ }
134
+
135
+ _loadExperimentStates() {
136
+ const savedStates = JSON.parse(localStorage.getItem(this.options.localStorageKey) || '{}');
137
+ this.allExperiments.forEach(experiment => {
138
+ if (savedStates[experiment.name] !== undefined) {
139
+ experiment.enabled = savedStates[experiment.name];
140
+ if (experiment.enabled) {
141
+ experiment.enable({ manual: false });
142
+ }
143
+ }
144
+ });
145
+ }
146
+
147
+ _saveExperimentStates() {
148
+ const states = Object.fromEntries(
149
+ this.allExperiments.map(experiment => [experiment.name, experiment.enabled]),
150
+ );
151
+ localStorage.setItem(this.options.localStorageKey, JSON.stringify(states));
152
+ }
153
+
154
+ /**
155
+ * @param {ExperimentModel} experiment
156
+ * @param {boolean} enabled
157
+ */
158
+ async _toggleExperiment(experiment, enabled) {
159
+ experiment.enabledLoading = true;
160
+ this.br.plugins.archiveAnalytics?.sendEvent(`BRExperiment-${experiment.name}`, enabled ? 'Enable' : 'Disable');
161
+ this._panel.requestUpdate();
162
+
163
+ if (enabled) {
164
+ await experiment.enable({ manual: true });
165
+ } else {
166
+ await experiment.disable();
167
+ }
168
+ experiment.enabledLoading = false;
169
+ experiment.enabled = enabled;
170
+ this._panel.requestUpdate();
171
+ }
172
+
173
+ _render() {
174
+ this.br.shell.menuProviders['experiments'] = {
175
+ id: 'experiments',
176
+ icon: html`
177
+ <img src="${this.br.options.imagesBaseURL}/icon_experiment.svg" width="26"/>
178
+ `,
179
+ label: 'Experiments',
180
+ component: html`<br-experiments-panel
181
+ .experiments="${this.allExperiments.filter(experiment => this.options.enabledExperiments.includes(experiment.name))}"
182
+ @connected="${e => this._panel = e.target}"
183
+ @toggle="${async e => {
184
+ await this._toggleExperiment(e.detail.experiment, e.detail.enabled);
185
+ this._saveExperimentStates();
186
+ }}"
187
+ />`,
188
+ };
189
+ this.br.shell.updateMenuContents();
190
+ }
191
+ }
192
+ BookReader?.registerPlugin('experiments', ExperimentsPlugin);
193
+
194
+ @customElement('br-experiments-panel')
195
+ export class BrExperimentsPanel extends LitElement {
196
+
197
+ /** @type {ExperimentModel[]} */
198
+ @property({ type: Array }) experiments = [];
199
+
200
+ render() {
201
+ return html`
202
+ <div style="padding: 10px">
203
+ ${this.experiments.map(
204
+ experiment => html`
205
+ <br-experiment-toggle
206
+ .icon="${experiment.icon}"
207
+ .title="${experiment.title}"
208
+ .description="${experiment.description}"
209
+ .enabled="${experiment.enabled}"
210
+ .loading="${experiment.enabledLoading}"
211
+ .learnMore="${experiment.learnMore}"
212
+ @toggle="${e => this._dispatchToggle(experiment, e.detail.enabled)}"
213
+ ></br-experiment-toggle>
214
+ `,
215
+ )}
216
+ </div>
217
+ `;
218
+ }
219
+
220
+ /**
221
+ * @param {ExperimentModel} experiment
222
+ * @param {boolean} enabled
223
+ */
224
+ async _dispatchToggle(experiment, enabled) {
225
+ this.dispatchEvent(new CustomEvent('toggle', {
226
+ detail: { experiment, enabled },
227
+ }));
228
+ }
229
+
230
+ connectedCallback() {
231
+ super.connectedCallback();
232
+ this.dispatchEvent(new CustomEvent('connected'));
233
+ }
234
+ }
235
+
236
+ @customElement('br-experiment-toggle')
237
+ export class BrExperimentToggle extends LitElement {
238
+ @property({ type: String }) icon = '';
239
+ @property({ type: String }) title = '';
240
+ @property({ type: String }) description = '';
241
+ @property({ type: Boolean }) enabled = false;
242
+ @property({ type: Boolean }) loading = false;
243
+ @property({ type: String }) learnMore = '';
244
+
245
+ /**
246
+ * We want to disable the button immediately if loading, but only display
247
+ * the loading indicator after 200ms.
248
+ */
249
+ @state() _longLoading = false;
250
+
251
+ /** @override */
252
+ update(changedProperties) {
253
+ super.update(changedProperties);
254
+ if (changedProperties.has('loading')) {
255
+ if (this.loading) {
256
+ sleep(500).then(() => {
257
+ if (this.loading) {
258
+ this._longLoading = true;
259
+ this.requestUpdate();
260
+ }
261
+ });
262
+ } else {
263
+ this._longLoading = false;
264
+ }
265
+ }
266
+ }
267
+
268
+ render() {
269
+ return html`
270
+ <div class="experiment-card" style="margin-bottom: 10px;">
271
+ <div style="display: flex; align-items: center; gap: 10px;">
272
+ <img src="${this.icon}" style="width: 20px; height: 20px;" alt="" />
273
+ <div style="flex-grow: 1; font-weight: bold;">${this.title}</div>
274
+ </div>
275
+ <p style="opacity: 0.9">
276
+ ${this.description}
277
+ ${this.learnMore ? html`<a href="${this.learnMore}" target="_blank">Learn more</a>.` : ''}
278
+ </p>
279
+ <div style="display: flex">
280
+ <div style="flex-grow: 1;"></div>
281
+ <button @click="${this._dispatchToggle}" .disabled="${this.loading}">
282
+ ${this._longLoading ? 'Loading…' : this.enabled ? 'Disable' : 'Enable'}
283
+ </button>
284
+ </div>
285
+ </div>
286
+ `;
287
+ }
288
+
289
+ static get styles() {
290
+ return css`
291
+ .experiment-card {
292
+ border-radius: 8px;
293
+ background-color: #fff2;
294
+ padding: 10px;
295
+ display: flex;
296
+ flex-direction: column;
297
+ }
298
+
299
+ .experiment-card p {
300
+ margin: 6px 0;
301
+ }
302
+ `;
303
+ }
304
+
305
+ _dispatchToggle() {
306
+ this.dispatchEvent(new CustomEvent('toggle', { detail: { enabled: !this.enabled } }));
307
+ }
308
+ }
309
+
310
+ /**
311
+ * @param {string} url
312
+ */
313
+ async function importAsScript(url) {
314
+ return new Promise((resolve, reject) => {
315
+ const script = document.createElement('script');
316
+ script.src = url;
317
+ script.onload = () => resolve();
318
+ script.onerror = () => reject(new Error(`Failed to load script: ${url}`));
319
+ document.head.appendChild(script);
320
+ });
321
+ }
@@ -33,7 +33,7 @@ export function _attachEventListeners(br, parent = window.parent) {
33
33
 
34
34
  parent.postMessage(
35
35
  { type: MESSAGE_TYPE_FRAGMENT_CHANGE, fragment },
36
- '*'
36
+ '*',
37
37
  );
38
38
  });
39
39
 
@@ -0,0 +1,141 @@
1
+ // @ts-check
2
+ import { BookReaderPlugin } from '../BookReaderPlugin.js';
3
+
4
+ const BookReader = /** @type {typeof import('../BookReader').default} */(window.BookReader);
5
+
6
+ export class IiifPlugin extends BookReaderPlugin {
7
+ options = {
8
+ enabled: true,
9
+ /** @type {import('@iiif/presentation-3').Manifest | import('@iiif/presentation-2').Manifest} */
10
+ manifest: null,
11
+ }
12
+
13
+ setup(options) {
14
+ super.setup(options);
15
+ this.manifest = this.options.manifest;
16
+
17
+ if (this.options.enabled) {
18
+ Object.assign(this.br.options, this.load());
19
+ }
20
+ }
21
+
22
+ load() {
23
+ if (this.manifest["@context"] == "http://iiif.io/api/presentation/2/context.json") {
24
+ const manifest = /** @type {import('@iiif/presentation-2').Manifest} */(this.manifest);
25
+ return this.manifestToBookReaderV2(manifest);
26
+ } else if (this.manifest["@context"] == "http://iiif.io/api/presentation/3/context.json") {
27
+ const manifest = /** @type {import('@iiif/presentation-3').Manifest} */(this.manifest);
28
+ return this.manifestToBookReaderV3(manifest);
29
+ } else {
30
+ throw new Error("Unsupported IIIF context " + this.manifest["@context"]);
31
+ }
32
+ }
33
+
34
+ /**
35
+ * @param {import('@iiif/presentation-3').Manifest} manifest
36
+ */
37
+ manifestToBookReaderV3(manifest) {
38
+ /** @type {import('../BookReader/options.js').BookReaderOptions} */
39
+ const book = {
40
+ bookTitle: resolveInternationalString(manifest.label),
41
+ pageProgression: manifest.viewingDirection == "right-to-left" ? "rl" : "lr",
42
+ // numLeafs: manifest.items.length,
43
+ metadata: (manifest.metadata || []).map((metadata) => {
44
+ return {
45
+ label: resolveInternationalString(metadata.label),
46
+ value: resolveInternationalString(metadata.value),
47
+ };
48
+ }),
49
+ data: [],
50
+ /**
51
+ * @this {import('../BookReader.js').default}
52
+ */
53
+ getPageURI(pageIndex, reduce, rotate) {
54
+ const percent = Math.floor(100 * 1 / reduce);
55
+ const bodyArr = manifest.items[pageIndex].items[0].items[0].body;
56
+ const body = bodyArr instanceof Array ? bodyArr[0] : bodyArr;
57
+ const uri = body.service[0].id;
58
+ return `${uri}/full/pct:${percent}/0/default.jpg`;
59
+ },
60
+ };
61
+
62
+ if (manifest.viewingDirection == "top-to-bottom" || manifest.viewingDirection == "bottom-to-top") {
63
+ console.warn("Unsupported viewingDirection", manifest.viewingDirection);
64
+ }
65
+
66
+ let spread = [];
67
+ manifest.items.forEach((item, index) => {
68
+ const bodyArr = manifest.items[index].items[0].items[0].body;
69
+ const body = bodyArr instanceof Array ? bodyArr[0] : bodyArr;
70
+ const uri = body.service[0].id;
71
+ /** @type {import('../BookReader/options.js').PageData} */
72
+ const pageData = {
73
+ uri,
74
+ width: item.width,
75
+ height: item.height,
76
+ pageNum: resolveInternationalString(item.label),
77
+ };
78
+ spread.push(pageData);
79
+ if (index % 2 == 0) {
80
+ book.data.push(spread);
81
+ spread = [];
82
+ }
83
+ });
84
+ if (spread.length > 0) {
85
+ book.data.push(spread);
86
+ }
87
+ return book;
88
+ }
89
+
90
+ /**
91
+ * @param {import('@iiif/presentation-2').Manifest} manifest
92
+ */
93
+ manifestToBookReaderV2(manifest) {
94
+ /** @type {import('../BookReader/options.js').BookReaderOptions} */
95
+ const book = {
96
+ bookTitle: manifest.label,
97
+ metadata: manifest.metadata,
98
+ thumbnail: manifest.thumbnail?.['@id'],
99
+ // numLeafs: manifest.sequences[0].canvases.length,
100
+ data: [],
101
+ /**
102
+ * @this {import('../BookReader.js').default}
103
+ */
104
+ getPageURI(pageIndex, reduce, rotate) {
105
+ const percent = Math.floor(100 * 1 / reduce);
106
+ const uri = manifest.sequences[0].canvases[pageIndex].images[0].resource.service['@id'];
107
+ return `${uri}/full/pct:${percent}/0/default.jpg`;
108
+ },
109
+ };
110
+
111
+ let spread = [];
112
+ manifest.sequences[0].canvases.forEach((canvas, index) => {
113
+ /** @type {import('../BookReader/options.js').PageData} */
114
+ const pageData = {
115
+ uri: canvas.images[0].resource.service['@id'],
116
+ width: canvas.width,
117
+ height: canvas.height,
118
+ pageNum: canvas.label,
119
+ };
120
+ spread.push(pageData);
121
+ if (index % 2 == 0) {
122
+ book.data.push(spread);
123
+ spread = [];
124
+ }
125
+ });
126
+ if (spread.length > 0) {
127
+ book.data.push(spread);
128
+ }
129
+ return book;
130
+ }
131
+ }
132
+
133
+ /**
134
+ * @param {import('@iiif/presentation-3').InternationalString} internationalString
135
+ */
136
+ function resolveInternationalString(internationalString) {
137
+ const anyLang = Object.keys(internationalString)[0];
138
+ return (internationalString[navigator.language] || internationalString[anyLang])[0];
139
+ }
140
+
141
+ BookReader?.registerPlugin('iiif', IiifPlugin);
@@ -1,3 +1,5 @@
1
+ import { EVENTS } from '../BookReader/events.js';
2
+ import { BookReaderPlugin } from '../BookReaderPlugin.js';
1
3
  import * as docCookies from '../util/docCookies.js';
2
4
 
3
5
  /* global BookReader */
@@ -8,61 +10,62 @@ BookReader.docCookies = docCookies;
8
10
  /**
9
11
  * Plugin to remember the current page number in a cookie
10
12
  */
11
- jQuery.extend(BookReader.defaultOptions, {
12
- enablePageResume: true,
13
- /** @type {string|null} eg '/', '/details/id' */
14
- resumeCookiePath: null,
15
- });
13
+ export class ResumePlugin extends BookReaderPlugin {
14
+ options = {
15
+ enabled: true,
16
+ /** @type {string|null} eg '/', '/details/id' */
17
+ cookiePath: null,
18
+ }
16
19
 
17
- /** @override */
18
- BookReader.prototype.init = (function(super_) {
19
- return function() {
20
- super_.call(this);
21
- if (this.options.enablePageResume) {
22
- this.bind(BookReader.eventNames.fragmentChange, () => {
23
- const params = this.paramsFromCurrent();
20
+ /** @override */
21
+ init() {
22
+ if (this.options.enabled) {
23
+ this.br.bind(EVENTS.fragmentChange, () => {
24
+ const params = this.br.paramsFromCurrent();
24
25
  this.updateResumeValue(params.index);
25
26
  });
26
27
  }
27
- };
28
- })(BookReader.prototype.init);
28
+ }
29
29
 
30
- /**
31
- * Gets page resume value, for remembering reader's page
32
- * Can be overridden for different implementation
33
- *
34
- * @return {number|null}
35
- */
36
- BookReader.prototype.getResumeValue = function() {
37
- const val = BookReader.docCookies.getItem('br-resume');
38
- if (val !== null) return parseInt(val);
39
- else return null;
40
- };
30
+ /**
31
+ * Gets page resume value, for remembering reader's page
32
+ * Can be overridden for different implementation
33
+ *
34
+ * @return {number|null}
35
+ */
36
+ getResumeValue() {
37
+ const val = BookReader.docCookies.getItem('br-resume');
38
+ if (val !== null) return parseInt(val);
39
+ else return null;
40
+ }
41
41
 
42
- /**
43
- * Return cookie path using pathname up to /page/... or /mode/...
44
- * using window.location.pathname for urlPathPart:
45
- * - matches encoding
46
- * - ignores querystring part
47
- * - ignores fragment part (after #)
48
- * @param {string} urlPathPart - window.location.pathname
49
- */
50
- BookReader.prototype.getCookiePath = function(urlPathPart) {
51
- return urlPathPart.match('.+?(?=/page/|/mode/|$)')[0];
52
- };
42
+ /**
43
+ * Return cookie path using pathname up to /page/... or /mode/...
44
+ * using window.location.pathname for urlPathPart:
45
+ * - matches encoding
46
+ * - ignores querystring part
47
+ * - ignores fragment part (after #)
48
+ * @param {string} urlPathPart - window.location.pathname
49
+ */
50
+ getCookiePath(urlPathPart) {
51
+ return urlPathPart.match('.+?(?=/page/|/mode/|$)')[0];
52
+ }
53
53
 
54
- /**
55
- * Sets page resume value, for remembering reader's page
56
- * Can be overridden for different implementation
57
- *
58
- * @param {Number} index leaf index
59
- * @param {string} [cookieName]
60
- */
61
- BookReader.prototype.updateResumeValue = function(index, cookieName) {
62
- const ttl = new Date(+new Date + 12096e5); // 2 weeks
63
- // For multiple files in item, leave resumeCookiePath blank
64
- // It's likely we can remove resumeCookiePath using getCookiePath()
65
- const path = this.options.resumeCookiePath
66
- || this.getCookiePath(window.location.pathname);
67
- BookReader.docCookies.setItem(cookieName || 'br-resume', index, ttl, path, null, false);
68
- };
54
+ /**
55
+ * Sets page resume value, for remembering reader's page
56
+ * Can be overridden for different implementation
57
+ *
58
+ * @param {Number} index leaf index
59
+ * @param {string} [cookieName]
60
+ */
61
+ updateResumeValue(index, cookieName) {
62
+ const ttl = new Date(+new Date + 12096e5); // 2 weeks
63
+ // For multiple files in item, leave cookiePath blank
64
+ // It's likely we can remove cookiePath using getCookiePath()
65
+ const path = this.options.cookiePath
66
+ || this.getCookiePath(window.location.pathname);
67
+ BookReader.docCookies.setItem(cookieName || 'br-resume', index, ttl, path, null, false);
68
+ }
69
+ }
70
+
71
+ BookReader?.registerPlugin('resume', ResumePlugin);