@internetarchive/bookreader 5.0.0-9 → 5.0.0-90

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 (324) hide show
  1. package/.eslintrc.js +21 -19
  2. package/.github/workflows/node.js.yml +76 -11
  3. package/.github/workflows/npm-publish.yml +6 -20
  4. package/.testcaferc.js +10 -0
  5. package/BookReader/BookReader.css +404 -1125
  6. package/BookReader/BookReader.js +1 -1
  7. package/BookReader/BookReader.js.LICENSE.txt +20 -20
  8. package/BookReader/BookReader.js.map +1 -1
  9. package/BookReader/ia-bookreader-bundle.js +1782 -0
  10. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
  11. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  12. package/BookReader/icons/1up.svg +1 -1
  13. package/BookReader/icons/2up.svg +1 -1
  14. package/BookReader/icons/advance.svg +1 -1
  15. package/BookReader/icons/chevron-right.svg +1 -1
  16. package/BookReader/icons/close-circle-dark.svg +1 -1
  17. package/BookReader/icons/close-circle.svg +1 -1
  18. package/BookReader/icons/fullscreen.svg +1 -1
  19. package/BookReader/icons/fullscreen_exit.svg +1 -1
  20. package/BookReader/icons/hamburger.svg +1 -1
  21. package/BookReader/icons/left-arrow.svg +1 -1
  22. package/BookReader/icons/magnify-minus.svg +1 -1
  23. package/BookReader/icons/magnify-plus.svg +1 -1
  24. package/BookReader/icons/magnify.svg +1 -1
  25. package/BookReader/icons/pause.svg +1 -1
  26. package/BookReader/icons/play.svg +1 -1
  27. package/BookReader/icons/playback-speed.svg +1 -1
  28. package/BookReader/icons/read-aloud.svg +1 -1
  29. package/BookReader/icons/review.svg +1 -1
  30. package/BookReader/icons/thumbnails.svg +1 -1
  31. package/BookReader/icons/voice.svg +1 -0
  32. package/BookReader/icons/volume-full.svg +1 -1
  33. package/BookReader/images/BRicons.svg +3 -3
  34. package/BookReader/images/books_graphic.svg +1 -1
  35. package/BookReader/images/icon_book.svg +1 -1
  36. package/BookReader/images/icon_bookmark.svg +1 -1
  37. package/BookReader/images/icon_gear.svg +1 -1
  38. package/BookReader/images/icon_hamburger.svg +1 -1
  39. package/BookReader/images/icon_home.svg +1 -1
  40. package/BookReader/images/icon_info.svg +1 -1
  41. package/BookReader/images/icon_one_page.svg +1 -1
  42. package/BookReader/images/icon_pause.svg +1 -1
  43. package/BookReader/images/icon_play.svg +1 -1
  44. package/BookReader/images/icon_playback-rate.svg +1 -1
  45. package/BookReader/images/icon_search_button.svg +1 -1
  46. package/BookReader/images/icon_share.svg +1 -1
  47. package/BookReader/images/icon_skip-ahead.svg +1 -1
  48. package/BookReader/images/icon_skip-back.svg +1 -1
  49. package/BookReader/images/icon_speaker.svg +1 -1
  50. package/BookReader/images/icon_speaker_open.svg +1 -1
  51. package/BookReader/images/icon_thumbnails.svg +1 -1
  52. package/BookReader/images/icon_toc.svg +1 -1
  53. package/BookReader/images/icon_two_pages.svg +1 -1
  54. package/BookReader/images/marker_chap-off.svg +1 -1
  55. package/BookReader/images/marker_chap-on.svg +1 -1
  56. package/BookReader/images/marker_srch-on.svg +1 -1
  57. package/BookReader/images/unviewable_page.png +0 -0
  58. package/BookReader/jquery-3.js +2 -0
  59. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  60. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  61. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  62. package/BookReader/plugins/plugin.autoplay.js +1 -1
  63. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  64. package/BookReader/plugins/plugin.chapters.js +25 -1
  65. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  66. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  67. package/BookReader/plugins/plugin.iframe.js +1 -1
  68. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  69. package/BookReader/plugins/plugin.iiif.js +2 -0
  70. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  71. package/BookReader/plugins/plugin.resume.js +1 -1
  72. package/BookReader/plugins/plugin.resume.js.map +1 -1
  73. package/BookReader/plugins/plugin.search.js +2 -1
  74. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  75. package/BookReader/plugins/plugin.search.js.map +1 -1
  76. package/BookReader/plugins/plugin.text_selection.js +2 -1
  77. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  78. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  79. package/BookReader/plugins/plugin.tts.js +1 -1
  80. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  81. package/BookReader/plugins/plugin.tts.js.map +1 -1
  82. package/BookReader/plugins/plugin.url.js +1 -1
  83. package/BookReader/plugins/plugin.url.js.map +1 -1
  84. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  85. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  86. package/BookReader/webcomponents-bundle.js +3 -0
  87. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  88. package/BookReader/webcomponents-bundle.js.map +1 -0
  89. package/BookReaderDemo/BookReaderDemo.css +18 -19
  90. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -3
  91. package/BookReaderDemo/BookReaderJSSimple.js +1 -0
  92. package/BookReaderDemo/IADemoBr.js +144 -0
  93. package/BookReaderDemo/demo-advanced.html +2 -2
  94. package/BookReaderDemo/demo-embed-iframe-src.html +2 -1
  95. package/BookReaderDemo/demo-fullscreen-mobile.html +3 -5
  96. package/BookReaderDemo/demo-fullscreen.html +2 -4
  97. package/BookReaderDemo/demo-iiif.html +99 -12
  98. package/BookReaderDemo/demo-internetarchive.html +214 -18
  99. package/BookReaderDemo/demo-multiple.html +2 -1
  100. package/BookReaderDemo/demo-preview-pages.html +526 -525
  101. package/BookReaderDemo/demo-simple.html +2 -1
  102. package/BookReaderDemo/demo-vendor-fullscreen.html +2 -4
  103. package/BookReaderDemo/ia-multiple-volumes-manifest.js +170 -0
  104. package/BookReaderDemo/immersion-1up.html +2 -2
  105. package/BookReaderDemo/immersion-mode.html +2 -4
  106. package/BookReaderDemo/toggle_controls.html +3 -2
  107. package/BookReaderDemo/view_mode.html +2 -1
  108. package/BookReaderDemo/viewmode-cycle.html +2 -3
  109. package/CHANGELOG.md +584 -33
  110. package/README.md +14 -1
  111. package/babel.config.js +20 -0
  112. package/codecov.yml +6 -0
  113. package/index.html +5 -2
  114. package/jsconfig.json +19 -0
  115. package/netlify.toml +9 -0
  116. package/package.json +70 -62
  117. package/renovate.json +52 -0
  118. package/scripts/preversion.js +0 -1
  119. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  120. package/src/BookNavigator/assets/button-base.js +5 -2
  121. package/src/BookNavigator/assets/ia-logo.js +17 -0
  122. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  123. package/src/BookNavigator/assets/icon_close.js +1 -1
  124. package/src/BookNavigator/book-navigator.js +590 -0
  125. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  126. package/src/BookNavigator/bookmarks/bookmark-edit.js +3 -4
  127. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  128. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +4 -9
  129. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  130. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  131. package/src/BookNavigator/delete-modal-actions.js +1 -1
  132. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  133. package/src/BookNavigator/downloads/downloads.js +29 -25
  134. package/src/BookNavigator/search/search-provider.js +50 -28
  135. package/src/BookNavigator/search/search-results.js +24 -10
  136. package/src/BookNavigator/sharing.js +27 -0
  137. package/src/BookNavigator/viewable-files.js +95 -0
  138. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +13 -12
  139. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +7 -7
  140. package/src/BookReader/BookModel.js +76 -41
  141. package/src/BookReader/DragScrollable.js +233 -0
  142. package/src/BookReader/ImageCache.js +48 -15
  143. package/src/BookReader/Mode1Up.js +56 -351
  144. package/src/BookReader/Mode1UpLit.js +388 -0
  145. package/src/BookReader/Mode2Up.js +73 -1318
  146. package/src/BookReader/Mode2UpLit.js +777 -0
  147. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  148. package/src/BookReader/ModeSmoothZoom.js +312 -0
  149. package/src/BookReader/ModeThumb.js +19 -13
  150. package/src/BookReader/Navbar/Navbar.js +70 -54
  151. package/src/BookReader/PageContainer.js +116 -22
  152. package/src/BookReader/ReduceSet.js +3 -3
  153. package/src/BookReader/Toolbar/Toolbar.js +14 -41
  154. package/src/BookReader/events.js +2 -3
  155. package/src/BookReader/options.js +73 -15
  156. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  157. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  158. package/src/BookReader/utils/SelectionObserver.js +45 -0
  159. package/src/BookReader/utils/classes.js +1 -1
  160. package/src/BookReader/utils.js +128 -13
  161. package/src/BookReader.js +544 -1078
  162. package/src/BookReaderPlugin.js +44 -0
  163. package/src/assets/icons/magnify-minus.svg +3 -7
  164. package/src/assets/icons/magnify-plus.svg +3 -7
  165. package/src/assets/icons/voice.svg +1 -0
  166. package/src/assets/images/unviewable_page.png +0 -0
  167. package/src/css/BookReader.scss +1 -5
  168. package/src/css/_BRBookmarks.scss +1 -1
  169. package/src/css/_BRComponent.scss +1 -1
  170. package/src/css/_BRicon.scss +8 -2
  171. package/src/css/_BRmain.scss +16 -3
  172. package/src/css/_BRnav.scss +12 -42
  173. package/src/css/_BRpages.scss +170 -42
  174. package/src/css/_BRsearch.scss +68 -25
  175. package/src/css/_BRtoolbar.scss +5 -5
  176. package/src/css/_TextSelection.scss +87 -27
  177. package/src/css/_colorbox.scss +2 -2
  178. package/src/css/_controls.scss +24 -7
  179. package/src/css/_icons.scss +1 -1
  180. package/src/ia-bookreader/ia-bookreader.js +224 -0
  181. package/src/plugins/plugin.archive_analytics.js +84 -78
  182. package/src/plugins/plugin.autoplay.js +99 -104
  183. package/src/plugins/plugin.chapters.js +237 -191
  184. package/src/plugins/plugin.iframe.js +1 -1
  185. package/src/plugins/plugin.iiif.js +141 -0
  186. package/src/plugins/plugin.resume.js +53 -50
  187. package/src/plugins/plugin.text_selection.js +503 -175
  188. package/src/plugins/plugin.vendor-fullscreen.js +7 -7
  189. package/src/plugins/search/plugin.search.js +151 -127
  190. package/src/plugins/search/utils.js +43 -0
  191. package/src/plugins/search/view.js +37 -59
  192. package/src/plugins/tts/AbstractTTSEngine.js +75 -45
  193. package/src/plugins/tts/FestivalTTSEngine.js +21 -31
  194. package/src/plugins/tts/PageChunk.js +16 -23
  195. package/src/plugins/tts/PageChunkIterator.js +11 -17
  196. package/src/plugins/tts/WebTTSEngine.js +88 -72
  197. package/src/plugins/tts/plugin.tts.js +310 -350
  198. package/src/plugins/tts/utils.js +16 -26
  199. package/src/plugins/url/UrlPlugin.js +191 -0
  200. package/src/plugins/{plugin.url.js → url/plugin.url.js} +47 -18
  201. package/src/util/browserSniffing.js +22 -0
  202. package/src/util/docCookies.js +21 -2
  203. package/src/util/strings.js +1 -0
  204. package/tests/e2e/README.md +37 -0
  205. package/tests/e2e/autoplay.test.js +9 -6
  206. package/tests/e2e/base.test.js +8 -16
  207. package/tests/e2e/helpers/base.js +55 -50
  208. package/tests/e2e/helpers/debug.js +1 -1
  209. package/tests/e2e/helpers/mockSearch.js +19 -22
  210. package/tests/e2e/helpers/params.js +17 -0
  211. package/tests/e2e/helpers/rightToLeft.js +8 -14
  212. package/tests/e2e/helpers/search.js +73 -0
  213. package/tests/e2e/models/Navigation.js +20 -37
  214. package/tests/e2e/rightToLeft.test.js +4 -5
  215. package/tests/e2e/viewmode.test.js +40 -33
  216. package/tests/jest/BookNavigator/book-navigator.test.js +661 -0
  217. package/tests/jest/BookNavigator/bookmarks/bookmark-button.test.js +43 -0
  218. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmark-edit.test.js +25 -26
  219. package/tests/{karma → jest}/BookNavigator/bookmarks/bookmarks-list.test.js +41 -42
  220. package/tests/jest/BookNavigator/bookmarks/ia-bookmarks.test.js +45 -0
  221. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +67 -0
  222. package/tests/jest/BookNavigator/downloads/downloads.test.js +53 -0
  223. package/tests/jest/BookNavigator/search/search-provider.test.js +167 -0
  224. package/tests/{karma → jest}/BookNavigator/search/search-results.test.js +109 -60
  225. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +49 -0
  226. package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +80 -0
  227. package/tests/jest/BookNavigator/visual-adjustments.test.js +200 -0
  228. package/tests/{BookReader → jest/BookReader}/BookModel.test.js +74 -14
  229. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +193 -0
  230. package/tests/{BookReader → jest/BookReader}/ImageCache.test.js +4 -4
  231. package/tests/jest/BookReader/Mode1UpLit.test.js +73 -0
  232. package/tests/jest/BookReader/Mode2Up.test.js +98 -0
  233. package/tests/jest/BookReader/Mode2UpLit.test.js +190 -0
  234. package/tests/jest/BookReader/ModeCoordinateSpace.test.js +16 -0
  235. package/tests/jest/BookReader/ModeSmoothZoom.test.js +218 -0
  236. package/tests/jest/BookReader/ModeThumb.test.js +71 -0
  237. package/tests/{BookReader → jest/BookReader}/Navbar/Navbar.test.js +42 -29
  238. package/tests/jest/BookReader/PageContainer.test.js +238 -0
  239. package/tests/{BookReader → jest/BookReader}/ReduceSet.test.js +1 -1
  240. package/tests/{BookReader → jest/BookReader}/Toolbar/Toolbar.test.js +3 -3
  241. package/tests/jest/BookReader/utils/HTMLDimensionsCacher.test.js +59 -0
  242. package/tests/jest/BookReader/utils/ScrollClassAdder.test.js +49 -0
  243. package/tests/jest/BookReader/utils/SelectionObserver.test.js +57 -0
  244. package/tests/{BookReader → jest/BookReader}/utils/classes.test.js +1 -1
  245. package/tests/jest/BookReader/utils.test.js +250 -0
  246. package/tests/jest/BookReader.keyboard.test.js +190 -0
  247. package/tests/{BookReader.options.test.js → jest/BookReader.options.test.js} +10 -2
  248. package/tests/{BookReader.test.js → jest/BookReader.test.js} +43 -53
  249. package/tests/jest/plugins/plugin.archive_analytics.test.js +20 -0
  250. package/tests/jest/plugins/plugin.autoplay.test.js +35 -0
  251. package/tests/jest/plugins/plugin.chapters.test.js +195 -0
  252. package/tests/{plugins → jest/plugins}/plugin.iframe.test.js +4 -4
  253. package/tests/{plugins → jest/plugins}/plugin.resume.test.js +22 -35
  254. package/tests/jest/plugins/plugin.text_selection.test.js +316 -0
  255. package/tests/{plugins → jest/plugins}/plugin.vendor-fullscreen.test.js +2 -2
  256. package/tests/{plugins → jest/plugins}/search/plugin.search.test.js +19 -47
  257. package/tests/{plugins → jest/plugins}/search/plugin.search.view.test.js +42 -9
  258. package/tests/jest/plugins/search/utils.js +25 -0
  259. package/tests/jest/plugins/search/utils.test.js +29 -0
  260. package/tests/{plugins → jest/plugins}/tts/AbstractTTSEngine.test.js +30 -10
  261. package/tests/{plugins → jest/plugins}/tts/FestivalTTSEngine.test.js +4 -4
  262. package/tests/{plugins → jest/plugins}/tts/PageChunk.test.js +1 -1
  263. package/tests/{plugins → jest/plugins}/tts/PageChunkIterator.test.js +3 -3
  264. package/tests/{plugins → jest/plugins}/tts/WebTTSEngine.test.js +47 -1
  265. package/tests/{plugins → jest/plugins}/tts/utils.test.js +1 -60
  266. package/tests/jest/plugins/url/UrlPlugin.test.js +198 -0
  267. package/tests/{plugins → jest/plugins/url}/plugin.url.test.js +57 -18
  268. package/tests/jest/setup.js +3 -0
  269. package/tests/{util → jest/util}/browserSniffing.test.js +1 -1
  270. package/tests/jest/util/docCookies.test.js +24 -0
  271. package/tests/{util → jest/util}/strings.test.js +1 -1
  272. package/tests/{utils.js → jest/utils.js} +38 -0
  273. package/webpack.config.js +16 -10
  274. package/.babelrc +0 -12
  275. package/.dependabot/config.yml +0 -6
  276. package/.testcaferc.json +0 -5
  277. package/BookReader/bookreader-component-bundle.js +0 -1450
  278. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  279. package/BookReader/bookreader-component-bundle.js.map +0 -1
  280. package/BookReader/jquery-1.10.1.js +0 -2
  281. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  282. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  283. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  284. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  285. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  286. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  287. package/BookReaderDemo/IIIFBookReader.js +0 -207
  288. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  289. package/BookReaderDemo/demo-autoplay.html +0 -38
  290. package/BookReaderDemo/demo-iiif.js +0 -26
  291. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  292. package/karma.conf.js +0 -23
  293. package/src/BookNavigator/BookModel.js +0 -14
  294. package/src/BookNavigator/BookNavigator.js +0 -446
  295. package/src/BookNavigator/assets/book-loader.js +0 -27
  296. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  297. package/src/BookNavigator/search/a-search-result.js +0 -55
  298. package/src/BookReader/DebugConsole.js +0 -54
  299. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  300. package/src/ItemNavigator/ItemNavigator.js +0 -376
  301. package/src/ItemNavigator/providers/sharing.js +0 -29
  302. package/src/css/_MobileNav.scss +0 -194
  303. package/src/dragscrollable-br.js +0 -261
  304. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  305. package/src/plugins/plugin.mobile_nav.js +0 -287
  306. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  307. package/tests/BookReader/DebugConsole.test.js +0 -25
  308. package/tests/BookReader/Mode1Up.test.js +0 -164
  309. package/tests/BookReader/Mode2Up.test.js +0 -247
  310. package/tests/BookReader/PageContainer.test.js +0 -115
  311. package/tests/BookReader/utils.test.js +0 -109
  312. package/tests/e2e/helpers/desktopSearch.js +0 -72
  313. package/tests/e2e/helpers/mobileSearch.js +0 -85
  314. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  315. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  316. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  317. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  318. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  319. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  320. package/tests/plugins/plugin.autoplay.test.js +0 -52
  321. package/tests/plugins/plugin.chapters.test.js +0 -130
  322. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  323. package/tests/plugins/plugin.text_selection.test.js +0 -203
  324. package/tests/util/docCookies.test.js +0 -15
@@ -1,86 +1,92 @@
1
- /* global BookReader, archive_analytics */
2
- /**
3
- * Plugin for Archive.org analytics
4
- */
5
- jQuery.extend(BookReader.defaultOptions, {
6
- enableArchiveAnalytics: true,
7
- /** Provide a means of debugging, cause otherwise it's impossible to test locally */
8
- debugArchiveAnaltyics: false,
9
- });
10
-
11
- BookReader.prototype.init = (function(super_) {
12
- return function() {
13
- super_.call(this);
14
-
15
- if (this.options.enableArchiveAnalytics) {
16
- this.bind(BookReader.eventNames.fragmentChange, () => this.archiveAnalyticsSendFragmentChange());
17
- }
18
- };
19
- })(BookReader.prototype.init);
1
+ // @ts-check
2
+ import { BookReaderPlugin } from "../BookReaderPlugin.js";
3
+
4
+ const BookReader = /** @type {typeof import('../BookReader').default} */(window.BookReader);
5
+
20
6
 
21
- /** @private */
22
- BookReader.prototype.archiveAnalyticsSendFragmentChange = function() {
23
- if (!window.archive_analytics) {
24
- return;
7
+ export class ArchiveAnalyticsPlugin extends BookReaderPlugin {
8
+ options = {
9
+ enabled: true,
10
+ /** Provide a means of debugging, cause otherwise it's impossible to test locally */
11
+ debug: false,
25
12
  }
26
13
 
27
- const prevFragment = this.archiveAnalyticsSendFragmentChange.prevFragment;
28
-
29
- const params = this.paramsFromCurrent();
30
- const newFragment = this.fragmentFromParams(params);
31
-
32
- if (prevFragment != newFragment) {
33
- const values = {
34
- bookreader: "user_changed_view",
35
- itemid: this.bookId,
36
- cache_bust: Math.random()
37
- };
38
- // EEK! offsite embedding and /details/ page books look the same in analytics, otherwise!
39
- values.offsite = 1;
40
- values.details = 0;
41
- try {
42
- values.offsite = window.top.location.hostname.match(/\.archive.org$/)
43
- ? 0
44
- : 1;
45
- values.details =
46
- !values.offsite && window.top.location.pathname.match(/^\/details\//)
47
- ? 1
48
- : 0;
49
- } catch (e) {}
50
- // avoids embed cross site exceptions -- but on (+) side, means it is and keeps marked offite!
51
-
52
- // Send bookreader ping
53
- archive_analytics.send_ping(values, null, "augment_for_ao_site");
54
-
55
- // Also send tracking event ping
56
- const additionalEventParams = this.options.lendingInfo && this.options.lendingInfo.loanId
57
- ? { loanId: this.options.lendingInfo.loanId }
58
- : {};
59
- archive_analytics.send_event('BookReader', 'UserChangedView', window.location.pathname, additionalEventParams);
60
-
61
- this.archiveAnalyticsSendFragmentChange.prevFragment = newFragment;
14
+ /** @type {string} */
15
+ _prevFragment = null;
16
+
17
+ /** @override */
18
+ init() {
19
+ if (this.options.enabled) {
20
+ this.br.bind(BookReader.eventNames.fragmentChange, () => this.sendFragmentChange());
21
+ }
62
22
  }
63
- };
64
-
65
- /**
66
- * Sends a tracking "Event". See https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#events
67
- * @param {string} category
68
- * @param {string} action
69
- * @param {number} [value] (must be an int)
70
- * @param {Object} [additionalEventParams]
71
- */
72
- BookReader.prototype.archiveAnalyticsSendEvent = function(category, action, value, additionalEventParams) {
73
- if (!this.options.enableArchiveAnalytics) return;
74
-
75
- if (this.options.debugArchiveAnaltyics) {
76
- console.log("archiveAnalyticsSendEvent", arguments, window.archive_analytics);
23
+
24
+ /** @private */
25
+ sendFragmentChange() {
26
+ if (!window.archive_analytics) {
27
+ return;
28
+ }
29
+
30
+ const prevFragment = this._prevFragment;
31
+
32
+ const params = this.br.paramsFromCurrent();
33
+ const newFragment = this.br.fragmentFromParams(params);
34
+
35
+ if (prevFragment != newFragment) {
36
+ const values = {
37
+ bookreader: "user_changed_view",
38
+ itemid: this.br.bookId,
39
+ cache_bust: Math.random(),
40
+ };
41
+ // EEK! offsite embedding and /details/ page books look the same in analytics, otherwise!
42
+ values.offsite = 1;
43
+ values.details = 0;
44
+ try {
45
+ values.offsite = window.top.location.hostname.match(/\.archive.org$/)
46
+ ? 0
47
+ : 1;
48
+ values.details =
49
+ !values.offsite && window.top.location.pathname.match(/^\/details\//)
50
+ ? 1
51
+ : 0;
52
+ } catch (e) { }
53
+ // avoids embed cross site exceptions -- but on (+) side, means it is and keeps marked offite!
54
+
55
+ // Send bookreader ping
56
+ window.archive_analytics.send_ping(values, null, "augment_for_ao_site");
57
+
58
+ // Also send tracking event ping
59
+ const additionalEventParams = this.br.options.lendingInfo?.loanId
60
+ ? { loanId: this.br.options.lendingInfo.loanId }
61
+ : {};
62
+ window.archive_analytics.send_event('BookReader', 'UserChangedView', window.location.pathname, additionalEventParams);
63
+
64
+ this._prevFragment = newFragment;
65
+ }
77
66
  }
78
67
 
79
- if (!window.archive_analytics) return;
68
+ /**
69
+ * Sends a tracking "Event". See https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters#events
70
+ * @param {string} category
71
+ * @param {string} action
72
+ * @param {number} [value] (must be an int)
73
+ * @param {Object} [additionalEventParams]
74
+ */
75
+ sendEvent(category, action, value, additionalEventParams) {
76
+ if (!this.options.enabled) return;
80
77
 
81
- additionalEventParams = additionalEventParams || {};
82
- if (typeof(value) == 'number') {
83
- additionalEventParams.ev = value;
78
+ if (this.options.debug) {
79
+ console.log("archiveAnalyticsSendEvent", arguments, window.archive_analytics);
80
+ }
81
+
82
+ if (!window.archive_analytics) return;
83
+
84
+ additionalEventParams = additionalEventParams || {};
85
+ if (typeof (value) == 'number') {
86
+ additionalEventParams.ev = value;
87
+ }
88
+ window.archive_analytics.send_event(category, action, null, additionalEventParams);
84
89
  }
85
- window.archive_analytics.send_event(category, action, null, additionalEventParams);
86
- };
90
+ }
91
+
92
+ BookReader?.registerPlugin('archiveAnalytics', ArchiveAnalyticsPlugin);
@@ -1,129 +1,124 @@
1
- /*global BookReader */
1
+ // @ts-check
2
+ import { EVENTS } from "../BookReader/events";
3
+ import { parseAnimationSpeed } from "../BookReader/utils";
4
+ import { BookReaderPlugin } from "../BookReaderPlugin";
2
5
 
3
6
  /**
4
7
  * Plugin which adds an autoplay feature. Useful for kiosk situations.
5
8
  */
6
- jQuery.extend(BookReader.defaultOptions, {
7
- enableAutoPlayPlugin: true
8
- });
9
+ export class AutoplayPlugin extends BookReaderPlugin {
10
+ options = {
11
+ enabled: true,
12
+ /**
13
+ * @type {number | 'fast' | 'slow'}
14
+ * How quickly the flip animation should run.
15
+ **/
16
+ flipSpeed: 1500,
17
+ /** How long to pause on each page between flips */
18
+ flipDelay: 5000,
19
+ /** Allow controlling the autoflip/speed/delay from the url */
20
+ urlParams: true,
21
+ }
9
22
 
10
- /**
11
- * @override BookReader.setup
12
- */
13
- BookReader.prototype.setup = (function(super_) {
14
- return function (options) {
15
- super_.call(this, options);
23
+ timer = null;
16
24
 
17
- this.auto = false;
18
- this.autoTimer = null;
19
- this.flipDelay = 5000;
20
- };
21
- })(BookReader.prototype.setup);
25
+ /** @override */
26
+ init() {
27
+ if (!this.options.enabled) return;
22
28
 
23
- /**
24
- * @override BookReader.init
25
- */
26
- BookReader.prototype.init = (function(super_) {
27
- return function (options) {
28
- super_.call(this, options);
29
-
30
- if (!this.options.enableAutoPlayPlugin) return;
31
- this.bind(BookReader.eventNames.stop, () => this.autoStop());
32
- };
33
- })(BookReader.prototype.init);
29
+ this.br.bind(EVENTS.stop, () => this.stop());
34
30
 
35
- /**
36
- * @override BookReader.bindNavigationHandlers
37
- */
38
- BookReader.prototype.bindNavigationHandlers = (function(super_) {
39
- return function() {
40
- super_.call(this);
31
+ if (this.options.urlParams) {
32
+ const urlParams = new URLSearchParams(window.location.search);
33
+ if (urlParams.get('flipSpeed')) {
34
+ this.options.flipSpeed = parseAnimationSpeed(urlParams.get('flipSpeed')) || this.options.flipSpeed;
35
+ }
36
+ if (urlParams.get('flipDelay')) {
37
+ this.options.flipDelay = parseAnimationSpeed(urlParams.get('flipDelay')) || this.options.flipDelay;
38
+ }
39
+ if (urlParams.get('autoflip') === '1') {
40
+ this.toggle();
41
+ }
42
+ }
43
+ }
41
44
 
42
- if (!this.options.enableAutoPlayPlugin) return;
45
+ /** @override */
46
+ _bindNavigationHandlers() {
47
+ if (!this.options.enabled) return;
43
48
 
44
- // Note the mobile plugin attaches itself to body, so we need to select outside
45
- const jIcons = this.$('.BRicon').add('.BRmobileMenu .BRicon');
49
+ const jIcons = this.br.$('.BRicon');
46
50
 
47
- jIcons.filter('.play').click(() => {
48
- this.autoToggle();
51
+ jIcons.filter('.play').on('click', () => {
52
+ this.toggle();
49
53
  return false;
50
54
  });
51
55
 
52
- jIcons.filter('.pause').click(() => {
53
- this.autoToggle();
56
+ jIcons.filter('.pause').on('click', () => {
57
+ this.toggle();
54
58
  return false;
55
59
  });
56
- };
57
- })(BookReader.prototype.bindNavigationHandlers);
58
-
59
- /**
60
- * Starts autoplay mode
61
- * @param {object} overrides
62
- * @param {number} overrides.flipSpeed
63
- * @param {number} overrides.flipDelay
64
- */
65
- BookReader.prototype.autoToggle = function(overrides) {
66
- if (!this.options.enableAutoPlayPlugin) return;
67
-
68
- const options = $.extend({
69
- flipSpeed: this.flipSpeed,
70
- flipDelay: this.flipDelay
71
- }, overrides);
72
-
73
- this.flipSpeed = typeof options.flipSpeed === "number" ? options.flipSpeed : this.flipSpeed;
74
- this.flipDelay = typeof options.flipDelay === "number" ? options.flipDelay : this.flipDelay;
75
- this.trigger(BookReader.eventNames.stop);
76
-
77
- let bComingFrom1up = false;
78
- if (this.constMode2up != this.mode) {
79
- bComingFrom1up = true;
80
- this.switchMode(this.constMode2up);
81
- }
82
-
83
- // Change to autofit if book is too large
84
- if (this.reduce < this.twoPageGetAutofitReduce()) {
85
- this.zoom('auto');
86
60
  }
87
61
 
88
- if (null == this.autoTimer) {
89
- // $$$ Draw events currently cause layout problems when they occur during animation.
90
- // There is a specific problem when changing from 1-up immediately to autoplay in RTL so
91
- // we workaround for now by not triggering immediate animation in that case.
92
- // See https://bugs.launchpad.net/gnubook/+bug/328327
93
- if (('rl' == this.pageProgression) && bComingFrom1up) {
94
- // don't flip immediately -- wait until timer fires
95
- } else {
96
- // flip immediately
97
- this.flipFwdToIndex();
62
+ /**
63
+ * Starts autoplay mode
64
+ * @param {object} overrides
65
+ * @param {number} overrides.flipSpeed
66
+ * @param {number} overrides.flipDelay
67
+ */
68
+ toggle(overrides = null) {
69
+ if (!this.options.enabled) return;
70
+
71
+ Object.assign(this.options, overrides);
72
+ this.br.trigger(EVENTS.stop);
73
+
74
+ let bComingFrom1up = false;
75
+ if (this.br.constMode2up != this.br.mode) {
76
+ bComingFrom1up = true;
77
+ this.br.switchMode(this.br.constMode2up);
98
78
  }
99
79
 
100
- this.$('.play').hide();
101
- this.$('.pause').show();
102
- this.autoTimer = setInterval(() => {
103
- if (this.animating) return;
104
-
105
- if (Math.max(this.twoPage.currentIndexL, this.twoPage.currentIndexR) >= this.lastDisplayableIndex()) {
106
- this.flipBackToIndex(1); // $$$ really what we want?
80
+ if (null == this.timer) {
81
+ // $$$ Draw events currently cause layout problems when they occur during animation.
82
+ // There is a specific problem when changing from 1-up immediately to autoplay in RTL so
83
+ // we workaround for now by not triggering immediate animation in that case.
84
+ // See https://bugs.launchpad.net/gnubook/+bug/328327
85
+ if (('rl' == this.br.pageProgression) && bComingFrom1up) {
86
+ // don't flip immediately -- wait until timer fires
107
87
  } else {
108
- this.flipFwdToIndex();
88
+ // flip immediately
89
+ this.br.next({ triggerStop: false, flipSpeed: this.options.flipSpeed });
109
90
  }
110
- }, this.flipDelay);
111
- } else {
112
- this.autoStop();
91
+
92
+ this.br.$('.play').hide();
93
+ this.br.$('.pause').show();
94
+ this.timer = setInterval(() => {
95
+ if (this.br.animating) return;
96
+
97
+ if (Math.max(this.br.twoPage.currentIndexL, this.br.twoPage.currentIndexR) >= this.br.book.getNumLeafs() - 1) {
98
+ this.br.prev({ triggerStop: false, flipSpeed: this.options.flipSpeed }); // $$$ really what we want?
99
+ } else {
100
+ this.br.next({ triggerStop: false, flipSpeed: this.options.flipSpeed });
101
+ }
102
+ }, parseAnimationSpeed(this.options.flipDelay));
103
+ } else {
104
+ this.stop();
105
+ }
113
106
  }
114
- };
115
107
 
116
- /**
117
- * Stop autoplay mode, allowing animations to finish
118
- */
119
- BookReader.prototype.autoStop = function() {
120
- if (!this.options.enableAutoPlayPlugin) return;
121
-
122
- if (null != this.autoTimer) {
123
- clearInterval(this.autoTimer);
124
- this.flipSpeed = 'fast';
125
- this.$('.pause').hide();
126
- this.$('.play').show();
127
- this.autoTimer = null;
108
+ /**
109
+ * Stop autoplay mode, allowing animations to finish
110
+ */
111
+ stop() {
112
+ if (!this.options.enabled) return;
113
+
114
+ if (null != this.timer) {
115
+ clearInterval(this.timer);
116
+ this.br.$('.pause').hide();
117
+ this.br.$('.play').show();
118
+ this.timer = null;
119
+ }
128
120
  }
129
- };
121
+ }
122
+
123
+ const BookReader = /** @type {typeof import('../BookReader').default} */(window.BookReader);
124
+ BookReader?.registerPlugin('autoplay', AutoplayPlugin);