@internetarchive/bookreader 5.0.0-11 → 5.0.0-110

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 (380) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +604 -1239
  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 +1907 -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 +2 -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 +137 -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 +1 -1
  136. package/BookReader/plugins/plugin.url.js.map +1 -1
  137. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  138. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  139. package/BookReader/plugins/translator-worker.js +2 -0
  140. package/BookReader/plugins/translator-worker.js.map +1 -0
  141. package/BookReader/silence.mp3 +0 -0
  142. package/BookReader/translator-worker.js +475 -0
  143. package/BookReader/webcomponents-bundle.js +3 -0
  144. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  145. package/BookReader/webcomponents-bundle.js.map +1 -0
  146. package/README.md +14 -3
  147. package/jsconfig.json +19 -0
  148. package/package.json +92 -70
  149. package/src/BookReader/BookModel.js +92 -46
  150. package/src/BookReader/DragScrollable.js +233 -0
  151. package/src/BookReader/ImageCache.js +49 -16
  152. package/src/BookReader/Mode1Up.js +66 -365
  153. package/src/BookReader/Mode1UpLit.js +392 -0
  154. package/src/BookReader/Mode2Up.js +87 -1315
  155. package/src/BookReader/Mode2UpLit.js +788 -0
  156. package/src/BookReader/ModeAbstract.js +43 -0
  157. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  158. package/src/BookReader/ModeSmoothZoom.js +312 -0
  159. package/src/BookReader/ModeThumb.js +29 -15
  160. package/src/BookReader/Navbar/Navbar.js +201 -76
  161. package/src/BookReader/PageContainer.js +120 -23
  162. package/src/BookReader/ReduceSet.js +2 -2
  163. package/src/BookReader/Toolbar/Toolbar.js +18 -40
  164. package/src/BookReader/events.js +3 -3
  165. package/src/BookReader/options.js +94 -17
  166. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  167. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  168. package/src/BookReader/utils/SelectionObserver.js +45 -0
  169. package/src/BookReader/utils/classes.js +1 -1
  170. package/src/BookReader/utils.js +136 -12
  171. package/src/BookReader.js +678 -1226
  172. package/src/BookReaderPlugin.js +52 -0
  173. package/src/assets/icons/magnify-minus.svg +3 -7
  174. package/src/assets/icons/magnify-plus.svg +3 -7
  175. package/src/assets/icons/slider-toggle.svg +1 -0
  176. package/src/assets/icons/voice.svg +1 -0
  177. package/src/assets/images/hypothesis.ico +0 -0
  178. package/src/assets/images/icon_experiment.svg +1 -0
  179. package/src/assets/images/translate.svg +1 -0
  180. package/src/assets/images/unviewable_page.png +0 -0
  181. package/src/assets/silence.mp3 +0 -0
  182. package/src/css/BookReader.scss +1 -5
  183. package/src/css/_BRBookmarks.scss +1 -1
  184. package/src/css/_BRComponent.scss +1 -1
  185. package/src/css/_BRicon.scss +8 -2
  186. package/src/css/_BRmain.scss +16 -3
  187. package/src/css/_BRnav.scss +74 -70
  188. package/src/css/_BRpages.scss +171 -42
  189. package/src/css/_BRsearch.scss +69 -30
  190. package/src/css/_BRtoolbar.scss +5 -5
  191. package/src/css/_TextSelection.scss +129 -24
  192. package/src/css/_colorbox.scss +2 -2
  193. package/src/css/_controls.scss +24 -7
  194. package/src/css/_icons.scss +8 -1
  195. package/src/{BookNavigator/assets → css}/button-base.js +2 -2
  196. package/src/css/icon_checkmark.js +9 -0
  197. package/src/css/sharedStyles.js +15 -0
  198. package/src/ia-bookreader/downloads/downloads-provider.js +81 -0
  199. package/src/{BookNavigator → ia-bookreader}/downloads/downloads.js +25 -5
  200. package/src/ia-bookreader/ia-bookreader.js +666 -0
  201. package/src/ia-bookreader/sharing.js +27 -0
  202. package/src/ia-bookreader/viewable-files.js +98 -0
  203. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments-provider.js +17 -17
  204. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments.js +75 -67
  205. package/src/{BookNavigator → plugins}/bookmarks/bookmark-button.js +4 -3
  206. package/src/{BookNavigator/assets → plugins/bookmarks}/bookmark-colors.js +1 -1
  207. package/src/{BookNavigator → plugins}/bookmarks/bookmark-edit.js +43 -31
  208. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-list.js +48 -49
  209. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-loginCTA.js +3 -3
  210. package/src/plugins/bookmarks/bookmarks-provider.js +63 -0
  211. package/src/{BookNavigator → plugins/bookmarks}/delete-modal-actions.js +1 -1
  212. package/src/{BookNavigator → plugins}/bookmarks/ia-bookmarks.js +117 -68
  213. package/src/plugins/plugin.archive_analytics.js +84 -78
  214. package/src/plugins/plugin.autoplay.js +99 -104
  215. package/src/plugins/plugin.chapters.js +314 -205
  216. package/src/plugins/plugin.experiments.js +321 -0
  217. package/src/plugins/plugin.iframe.js +1 -1
  218. package/src/plugins/plugin.iiif.js +141 -0
  219. package/src/plugins/plugin.resume.js +54 -51
  220. package/src/plugins/plugin.text_selection.js +522 -219
  221. package/src/plugins/plugin.vendor-fullscreen.js +5 -5
  222. package/src/plugins/search/plugin.search.js +374 -392
  223. package/src/{BookNavigator → plugins}/search/search-provider.js +59 -27
  224. package/src/{BookNavigator → plugins}/search/search-results.js +105 -76
  225. package/src/plugins/search/utils.js +50 -0
  226. package/src/plugins/search/view.js +50 -68
  227. package/src/plugins/translate/TranslationManager.js +164 -0
  228. package/src/plugins/translate/plugin.translate.js +512 -0
  229. package/src/plugins/tts/AbstractTTSEngine.js +78 -49
  230. package/src/plugins/tts/FestivalTTSEngine.js +20 -30
  231. package/src/plugins/tts/PageChunk.js +33 -21
  232. package/src/plugins/tts/PageChunkIterator.js +11 -17
  233. package/src/plugins/tts/WebTTSEngine.js +131 -91
  234. package/src/plugins/tts/plugin.tts.js +345 -350
  235. package/src/plugins/tts/utils.js +77 -49
  236. package/src/plugins/url/UrlPlugin.js +191 -0
  237. package/src/plugins/{plugin.url.js → url/plugin.url.js} +44 -15
  238. package/src/util/TextSelectionManager.js +282 -0
  239. package/src/util/browserSniffing.js +33 -1
  240. package/src/util/cache.js +20 -0
  241. package/src/util/docCookies.js +21 -2
  242. package/src/util/lit.js +15 -0
  243. package/src/util/strings.js +1 -0
  244. package/.babelrc +0 -12
  245. package/.dependabot/config.yml +0 -6
  246. package/.eslintrc.js +0 -50
  247. package/.gitattributes +0 -2
  248. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  249. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  250. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  251. package/.github/workflows/node.js.yml +0 -37
  252. package/.github/workflows/npm-publish.yml +0 -47
  253. package/.testcaferc.json +0 -5
  254. package/BookReader/bookreader-component-bundle.js +0 -1450
  255. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  256. package/BookReader/bookreader-component-bundle.js.map +0 -1
  257. package/BookReader/jquery-1.10.1.js +0 -2
  258. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  259. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  260. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  261. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  262. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  263. package/BookReaderDemo/BookReaderDemo.css +0 -41
  264. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  265. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  266. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  267. package/BookReaderDemo/IIIFBookReader.js +0 -207
  268. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  269. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  270. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  271. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  272. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  273. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  274. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  275. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  276. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  277. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  278. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  279. package/BookReaderDemo/demo-advanced.html +0 -33
  280. package/BookReaderDemo/demo-autoplay.html +0 -38
  281. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  282. package/BookReaderDemo/demo-embed.html +0 -26
  283. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  284. package/BookReaderDemo/demo-fullscreen.html +0 -33
  285. package/BookReaderDemo/demo-iiif.html +0 -34
  286. package/BookReaderDemo/demo-iiif.js +0 -26
  287. package/BookReaderDemo/demo-internetarchive.html +0 -74
  288. package/BookReaderDemo/demo-multiple.html +0 -43
  289. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  290. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  291. package/BookReaderDemo/demo-simple.html +0 -34
  292. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  293. package/BookReaderDemo/immersion-1up.html +0 -64
  294. package/BookReaderDemo/immersion-mode.html +0 -35
  295. package/BookReaderDemo/toggle_controls.html +0 -53
  296. package/BookReaderDemo/view_mode.html +0 -39
  297. package/BookReaderDemo/viewmode-cycle.html +0 -41
  298. package/CHANGELOG.md +0 -495
  299. package/CONTRIBUTING.md +0 -7
  300. package/codecov.yml +0 -17
  301. package/index.html +0 -31
  302. package/karma.conf.js +0 -23
  303. package/screenshot.png +0 -0
  304. package/scripts/postversion.js +0 -10
  305. package/scripts/preversion.js +0 -14
  306. package/scripts/version.js +0 -26
  307. package/src/BookNavigator/BookModel.js +0 -14
  308. package/src/BookNavigator/BookNavigator.js +0 -446
  309. package/src/BookNavigator/assets/book-loader.js +0 -27
  310. package/src/BookNavigator/assets/icon_checkmark.js +0 -6
  311. package/src/BookNavigator/assets/icon_close.js +0 -3
  312. package/src/BookNavigator/bookmarks/bookmarks-provider.js +0 -53
  313. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  314. package/src/BookNavigator/downloads/downloads-provider.js +0 -66
  315. package/src/BookNavigator/search/a-search-result.js +0 -55
  316. package/src/BookReader/DebugConsole.js +0 -54
  317. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  318. package/src/ItemNavigator/ItemNavigator.js +0 -376
  319. package/src/ItemNavigator/providers/sharing.js +0 -29
  320. package/src/css/_MobileNav.scss +0 -194
  321. package/src/dragscrollable-br.js +0 -261
  322. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  323. package/src/plugins/plugin.mobile_nav.js +0 -287
  324. package/tests/BookReader/BookModel.test.js +0 -312
  325. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  326. package/tests/BookReader/DebugConsole.test.js +0 -25
  327. package/tests/BookReader/ImageCache.test.js +0 -150
  328. package/tests/BookReader/Mode1Up.test.js +0 -164
  329. package/tests/BookReader/Mode2Up.test.js +0 -247
  330. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  331. package/tests/BookReader/PageContainer.test.js +0 -115
  332. package/tests/BookReader/ReduceSet.test.js +0 -38
  333. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  334. package/tests/BookReader/utils/classes.test.js +0 -88
  335. package/tests/BookReader/utils.test.js +0 -109
  336. package/tests/BookReader.options.test.js +0 -39
  337. package/tests/BookReader.test.js +0 -301
  338. package/tests/e2e/README.md +0 -75
  339. package/tests/e2e/autoplay.test.js +0 -13
  340. package/tests/e2e/base.test.js +0 -35
  341. package/tests/e2e/helpers/base.js +0 -263
  342. package/tests/e2e/helpers/debug.js +0 -13
  343. package/tests/e2e/helpers/desktopSearch.js +0 -72
  344. package/tests/e2e/helpers/mobileSearch.js +0 -85
  345. package/tests/e2e/helpers/mockSearch.js +0 -93
  346. package/tests/e2e/helpers/rightToLeft.js +0 -29
  347. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  348. package/tests/e2e/models/BookReader.js +0 -11
  349. package/tests/e2e/models/Navigation.js +0 -56
  350. package/tests/e2e/rightToLeft.test.js +0 -20
  351. package/tests/e2e/viewmode.test.js +0 -37
  352. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  353. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  354. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  355. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  356. package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
  357. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  358. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  359. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  360. package/tests/plugins/plugin.autoplay.test.js +0 -52
  361. package/tests/plugins/plugin.chapters.test.js +0 -130
  362. package/tests/plugins/plugin.iframe.test.js +0 -42
  363. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  364. package/tests/plugins/plugin.resume.test.js +0 -98
  365. package/tests/plugins/plugin.text_selection.test.js +0 -203
  366. package/tests/plugins/plugin.url.test.js +0 -129
  367. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  368. package/tests/plugins/search/plugin.search.test.js +0 -173
  369. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  370. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  371. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  372. package/tests/plugins/tts/PageChunk.test.js +0 -57
  373. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  374. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  375. package/tests/plugins/tts/utils.test.js +0 -133
  376. package/tests/util/browserSniffing.test.js +0 -56
  377. package/tests/util/docCookies.test.js +0 -15
  378. package/tests/util/strings.test.js +0 -63
  379. package/tests/utils.js +0 -42
  380. 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" alt="" 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);