@internetarchive/bookreader 5.0.0-11 → 5.0.0-111

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