@internetarchive/bookreader 5.0.0-12-fixsorting-7 → 5.0.0-120

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 (420) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +670 -1190
  4. package/BookReader/bergamot-translator-worker.js +2966 -0
  5. package/BookReader/bergamot-translator-worker.wasm +0 -0
  6. package/BookReader/hypothesis/LICENSE +50 -0
  7. package/BookReader/hypothesis/README.md +55 -0
  8. package/BookReader/hypothesis/build/boot-template.js +1 -0
  9. package/BookReader/hypothesis/build/boot.js +1 -0
  10. package/BookReader/hypothesis/build/manifest.json +20 -0
  11. package/BookReader/hypothesis/build/scripts/annotator.bundle.js +199 -0
  12. package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
  13. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +811 -0
  14. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
  15. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +437 -0
  16. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
  17. package/BookReader/hypothesis/build/styles/annotator.css +4 -0
  18. package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
  19. package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  20. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  21. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  22. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  23. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  24. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  25. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  26. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  27. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  28. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  29. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  30. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  31. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  32. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  33. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  34. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  35. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  36. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  37. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  38. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  39. package/BookReader/hypothesis/build/styles/highlights.css +2 -0
  40. package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
  41. package/BookReader/hypothesis/build/styles/katex.min.css +3 -0
  42. package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
  43. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +14 -0
  44. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
  45. package/BookReader/hypothesis/build/styles/sidebar.css +4 -0
  46. package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
  47. package/BookReader/hypothesis/build/styles/ui-playground.css +4 -0
  48. package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
  49. package/BookReader/hypothesis/package.json +126 -0
  50. package/BookReader/ia-bookreader.js +1886 -0
  51. package/BookReader/{BookReader.js.LICENSE.txt → ia-bookreader.js.LICENSE.txt} +26 -20
  52. package/BookReader/ia-bookreader.js.map +1 -0
  53. package/BookReader/icons/1up.svg +1 -12
  54. package/BookReader/icons/2up.svg +1 -15
  55. package/BookReader/icons/advance.svg +3 -26
  56. package/BookReader/icons/chevron-right.svg +1 -1
  57. package/BookReader/icons/close-circle-dark.svg +1 -1
  58. package/BookReader/icons/close-circle.svg +1 -1
  59. package/BookReader/icons/fullscreen.svg +1 -17
  60. package/BookReader/icons/fullscreen_exit.svg +1 -17
  61. package/BookReader/icons/hamburger.svg +1 -15
  62. package/BookReader/icons/left-arrow.svg +1 -12
  63. package/BookReader/icons/magnify-minus.svg +1 -16
  64. package/BookReader/icons/magnify-plus.svg +1 -17
  65. package/BookReader/icons/magnify.svg +1 -15
  66. package/BookReader/icons/pause.svg +1 -23
  67. package/BookReader/icons/play.svg +1 -22
  68. package/BookReader/icons/playback-speed.svg +1 -34
  69. package/BookReader/icons/read-aloud.svg +1 -22
  70. package/BookReader/icons/review.svg +3 -22
  71. package/BookReader/icons/slider-toggle.svg +1 -0
  72. package/BookReader/icons/thumbnails.svg +1 -17
  73. package/BookReader/icons/voice.svg +1 -0
  74. package/BookReader/icons/volume-full.svg +1 -22
  75. package/BookReader/images/BRicons.svg +5 -94
  76. package/BookReader/images/books_graphic.svg +1 -177
  77. package/BookReader/images/hypothesis.ico +0 -0
  78. package/BookReader/images/icon_book.svg +1 -12
  79. package/BookReader/images/icon_bookmark.svg +1 -12
  80. package/BookReader/images/icon_experiment.svg +1 -0
  81. package/BookReader/images/icon_gear.svg +1 -14
  82. package/BookReader/images/icon_hamburger.svg +1 -20
  83. package/BookReader/images/icon_home.svg +1 -21
  84. package/BookReader/images/icon_info.svg +1 -11
  85. package/BookReader/images/icon_one_page.svg +1 -8
  86. package/BookReader/images/icon_pause.svg +1 -1
  87. package/BookReader/images/icon_play.svg +1 -1
  88. package/BookReader/images/icon_playback-rate.svg +1 -15
  89. package/BookReader/images/icon_search_button.svg +1 -8
  90. package/BookReader/images/icon_share.svg +1 -9
  91. package/BookReader/images/icon_skip-ahead.svg +1 -6
  92. package/BookReader/images/icon_skip-back.svg +2 -13
  93. package/BookReader/images/icon_speaker.svg +1 -18
  94. package/BookReader/images/icon_speaker_open.svg +1 -10
  95. package/BookReader/images/icon_thumbnails.svg +1 -12
  96. package/BookReader/images/icon_toc.svg +1 -5
  97. package/BookReader/images/icon_two_pages.svg +1 -9
  98. package/BookReader/images/marker_chap-off.svg +1 -11
  99. package/BookReader/images/marker_chap-on.svg +1 -11
  100. package/BookReader/images/marker_srch-on.svg +1 -11
  101. package/BookReader/images/translate.svg +1 -0
  102. package/BookReader/images/unviewable_page.png +0 -0
  103. package/BookReader/jquery-3.js +2 -0
  104. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  105. package/BookReader/plugins/plugin.archive_analytics.js +1 -172
  106. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  107. package/BookReader/plugins/plugin.autoplay.js +1 -165
  108. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  109. package/BookReader/plugins/plugin.chapters.js +19 -301
  110. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  111. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  112. package/BookReader/plugins/plugin.experiments.js +3 -0
  113. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  114. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  115. package/BookReader/plugins/plugin.iframe.js +1 -74
  116. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  117. package/BookReader/plugins/plugin.iiif.js +2 -0
  118. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  119. package/BookReader/plugins/plugin.resume.js +1 -368
  120. package/BookReader/plugins/plugin.resume.js.map +1 -1
  121. package/BookReader/plugins/plugin.search.js +2 -1385
  122. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  123. package/BookReader/plugins/plugin.search.js.map +1 -1
  124. package/BookReader/plugins/plugin.text_selection.js +2 -1080
  125. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  126. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  127. package/BookReader/plugins/plugin.translate.js +3 -0
  128. package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
  129. package/BookReader/plugins/plugin.translate.js.map +1 -0
  130. package/BookReader/plugins/plugin.tts.js +2 -9193
  131. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  132. package/BookReader/plugins/plugin.tts.js.map +1 -1
  133. package/BookReader/plugins/plugin.url.js +1 -269
  134. package/BookReader/plugins/plugin.url.js.map +1 -1
  135. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
  136. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  137. package/BookReader/plugins/translator-worker.js +2 -0
  138. package/BookReader/plugins/translator-worker.js.map +1 -0
  139. package/BookReader/silence.mp3 +0 -0
  140. package/BookReader/translator-worker.js +475 -0
  141. package/BookReader/webcomponents-bundle.js +3 -0
  142. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  143. package/BookReader/webcomponents-bundle.js.map +1 -0
  144. package/README.md +17 -4
  145. package/dist/esm/ia-bookreader.js +3 -0
  146. package/dist/esm/ia-bookreader.js.LICENSE.txt +17 -0
  147. package/dist/esm/ia-bookreader.js.map +1 -0
  148. package/dist/esm/plugins/plugin.archive_analytics.js +2 -0
  149. package/dist/esm/plugins/plugin.archive_analytics.js.map +1 -0
  150. package/dist/esm/plugins/plugin.autoplay.js +2 -0
  151. package/dist/esm/plugins/plugin.autoplay.js.map +1 -0
  152. package/dist/esm/plugins/plugin.chapters.js +2 -0
  153. package/dist/esm/plugins/plugin.chapters.js.map +1 -0
  154. package/dist/esm/plugins/plugin.experiments.js +2 -0
  155. package/dist/esm/plugins/plugin.experiments.js.map +1 -0
  156. package/dist/esm/plugins/plugin.iframe.js +2 -0
  157. package/dist/esm/plugins/plugin.iframe.js.map +1 -0
  158. package/dist/esm/plugins/plugin.iiif.js +2 -0
  159. package/dist/esm/plugins/plugin.iiif.js.map +1 -0
  160. package/dist/esm/plugins/plugin.resume.js +2 -0
  161. package/dist/esm/plugins/plugin.resume.js.map +1 -0
  162. package/dist/esm/plugins/plugin.search.js +2 -0
  163. package/dist/esm/plugins/plugin.search.js.map +1 -0
  164. package/dist/esm/plugins/plugin.text_selection.js +2 -0
  165. package/dist/esm/plugins/plugin.text_selection.js.map +1 -0
  166. package/dist/esm/plugins/plugin.translate.js +2 -0
  167. package/dist/esm/plugins/plugin.translate.js.map +1 -0
  168. package/dist/esm/plugins/plugin.tts.js +2 -0
  169. package/dist/esm/plugins/plugin.tts.js.map +1 -0
  170. package/dist/esm/plugins/plugin.url.js +2 -0
  171. package/dist/esm/plugins/plugin.url.js.map +1 -0
  172. package/dist/esm/plugins/plugin.vendor-fullscreen.js +2 -0
  173. package/dist/esm/plugins/plugin.vendor-fullscreen.js.map +1 -0
  174. package/jsconfig.json +18 -0
  175. package/package.json +113 -71
  176. package/src/BookReader/BookModel.js +92 -46
  177. package/src/BookReader/DragScrollable.js +233 -0
  178. package/src/BookReader/ImageCache.js +49 -16
  179. package/src/BookReader/Mode1Up.js +66 -365
  180. package/src/BookReader/Mode1UpLit.js +392 -0
  181. package/src/BookReader/Mode2Up.js +87 -1315
  182. package/src/BookReader/Mode2UpLit.js +786 -0
  183. package/src/BookReader/ModeAbstract.js +43 -0
  184. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  185. package/src/BookReader/ModeSmoothZoom.js +312 -0
  186. package/src/BookReader/ModeThumb.js +29 -15
  187. package/src/BookReader/Navbar/Navbar.js +204 -84
  188. package/src/BookReader/PageContainer.js +120 -23
  189. package/src/BookReader/ReduceSet.js +2 -2
  190. package/src/BookReader/Toolbar/Toolbar.js +18 -40
  191. package/src/BookReader/events.js +3 -3
  192. package/src/BookReader/options.js +105 -18
  193. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  194. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  195. package/src/BookReader/utils/SelectionObserver.js +72 -0
  196. package/src/BookReader/utils/classes.js +1 -1
  197. package/src/BookReader/utils.js +136 -12
  198. package/src/BookReader.js +732 -1231
  199. package/src/BookReaderPlugin.js +52 -0
  200. package/src/assets/icons/magnify-minus.svg +3 -7
  201. package/src/assets/icons/magnify-plus.svg +3 -7
  202. package/src/assets/icons/slider-toggle.svg +1 -0
  203. package/src/assets/icons/voice.svg +1 -0
  204. package/src/assets/images/hypothesis.ico +0 -0
  205. package/src/assets/images/icon_experiment.svg +1 -0
  206. package/src/assets/images/translate.svg +1 -0
  207. package/src/assets/images/unviewable_page.png +0 -0
  208. package/src/assets/silence.mp3 +0 -0
  209. package/src/css/BookReader.scss +1 -5
  210. package/src/css/_BRBookmarks.scss +1 -1
  211. package/src/css/_BRComponent.scss +1 -1
  212. package/src/css/_BRicon.scss +8 -2
  213. package/src/css/_BRmain.scss +16 -3
  214. package/src/css/_BRnav.scss +74 -70
  215. package/src/css/_BRpages.scss +174 -42
  216. package/src/css/_BRsearch.scss +69 -30
  217. package/src/css/_BRtoolbar.scss +5 -5
  218. package/src/css/_TextSelection.scss +249 -25
  219. package/src/css/_colorbox.scss +2 -2
  220. package/src/css/_controls.scss +24 -7
  221. package/src/css/_icons.scss +8 -1
  222. package/src/{BookNavigator/assets → css}/button-base.js +2 -2
  223. package/src/css/icon_checkmark.js +9 -0
  224. package/src/css/sharedStyles.js +15 -0
  225. package/src/ia-bookreader/downloads/downloads-provider.js +81 -0
  226. package/src/{BookNavigator → ia-bookreader}/downloads/downloads.js +25 -5
  227. package/src/ia-bookreader/ia-bookreader.js +686 -0
  228. package/src/ia-bookreader/sharing.js +27 -0
  229. package/src/ia-bookreader/viewable-files.js +98 -0
  230. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments-provider.js +17 -17
  231. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments.js +75 -67
  232. package/src/{BookNavigator → plugins}/bookmarks/bookmark-button.js +4 -3
  233. package/src/{BookNavigator/assets → plugins/bookmarks}/bookmark-colors.js +1 -1
  234. package/src/{BookNavigator → plugins}/bookmarks/bookmark-edit.js +43 -31
  235. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-list.js +48 -49
  236. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-loginCTA.js +3 -3
  237. package/src/plugins/bookmarks/bookmarks-provider.js +63 -0
  238. package/src/{BookNavigator → plugins/bookmarks}/delete-modal-actions.js +1 -1
  239. package/src/{BookNavigator → plugins}/bookmarks/ia-bookmarks.js +117 -68
  240. package/src/plugins/plugin.archive_analytics.js +84 -78
  241. package/src/plugins/plugin.autoplay.js +99 -104
  242. package/src/plugins/plugin.chapters.js +323 -205
  243. package/src/plugins/plugin.experiments.js +375 -0
  244. package/src/plugins/plugin.iframe.js +36 -37
  245. package/src/plugins/plugin.iiif.js +147 -0
  246. package/src/plugins/plugin.resume.js +54 -51
  247. package/src/plugins/plugin.text_selection.js +464 -219
  248. package/src/plugins/plugin.vendor-fullscreen.js +5 -5
  249. package/src/plugins/search/plugin.search.js +347 -397
  250. package/src/{BookNavigator → plugins}/search/search-provider.js +59 -27
  251. package/src/{BookNavigator → plugins}/search/search-results.js +105 -76
  252. package/src/plugins/search/utils.js +50 -0
  253. package/src/plugins/search/view.js +51 -69
  254. package/src/plugins/translate/TranslationManager.js +164 -0
  255. package/src/plugins/translate/plugin.translate.js +559 -0
  256. package/src/plugins/tts/AbstractTTSEngine.js +78 -49
  257. package/src/plugins/tts/FestivalTTSEngine.js +20 -30
  258. package/src/plugins/tts/PageChunk.js +117 -23
  259. package/src/plugins/tts/PageChunkIterator.js +11 -17
  260. package/src/plugins/tts/WebTTSEngine.js +132 -92
  261. package/src/plugins/tts/plugin.tts.js +341 -351
  262. package/src/plugins/tts/utils.js +76 -67
  263. package/src/plugins/url/UrlPlugin.js +213 -0
  264. package/src/plugins/{plugin.url.js → url/plugin.url.js} +54 -18
  265. package/src/util/TextSelectionManager.js +1464 -0
  266. package/src/util/browserSniffing.js +42 -1
  267. package/src/util/cache.js +20 -0
  268. package/src/util/docCookies.js +21 -2
  269. package/src/util/dom.js +88 -0
  270. package/src/util/generators.js +89 -0
  271. package/src/util/lit.js +15 -0
  272. package/src/util/strings.js +11 -0
  273. package/.babelrc +0 -12
  274. package/.dependabot/config.yml +0 -6
  275. package/.eslintrc.js +0 -50
  276. package/.gitattributes +0 -2
  277. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  278. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  279. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  280. package/.github/workflows/node.js.yml +0 -37
  281. package/.github/workflows/npm-publish.yml +0 -47
  282. package/.testcaferc.json +0 -5
  283. package/BookReader/BookReader.js +0 -21613
  284. package/BookReader/BookReader.js.map +0 -1
  285. package/BookReader/bookreader-component-bundle.js +0 -14497
  286. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  287. package/BookReader/bookreader-component-bundle.js.map +0 -1
  288. package/BookReader/jquery-1.10.1.js +0 -108
  289. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  290. package/BookReader/plugins/plugin.menu_toggle.js +0 -369
  291. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  292. package/BookReader/plugins/plugin.mobile_nav.js +0 -335
  293. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  294. package/BookReaderDemo/BookReaderDemo.css +0 -41
  295. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  296. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  297. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  298. package/BookReaderDemo/IIIFBookReader.js +0 -207
  299. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  300. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  301. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  302. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  303. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  304. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  305. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  306. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  307. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  308. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  309. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  310. package/BookReaderDemo/demo-advanced.html +0 -33
  311. package/BookReaderDemo/demo-autoplay.html +0 -38
  312. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  313. package/BookReaderDemo/demo-embed.html +0 -26
  314. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  315. package/BookReaderDemo/demo-fullscreen.html +0 -33
  316. package/BookReaderDemo/demo-iiif.html +0 -34
  317. package/BookReaderDemo/demo-iiif.js +0 -26
  318. package/BookReaderDemo/demo-internetarchive.html +0 -74
  319. package/BookReaderDemo/demo-multiple.html +0 -43
  320. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  321. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  322. package/BookReaderDemo/demo-simple.html +0 -34
  323. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  324. package/BookReaderDemo/immersion-1up.html +0 -64
  325. package/BookReaderDemo/immersion-mode.html +0 -35
  326. package/BookReaderDemo/toggle_controls.html +0 -53
  327. package/BookReaderDemo/view_mode.html +0 -39
  328. package/BookReaderDemo/viewmode-cycle.html +0 -41
  329. package/CHANGELOG.md +0 -499
  330. package/CONTRIBUTING.md +0 -7
  331. package/codecov.yml +0 -17
  332. package/index.html +0 -31
  333. package/karma.conf.js +0 -23
  334. package/screenshot.png +0 -0
  335. package/scripts/postversion.js +0 -10
  336. package/scripts/preversion.js +0 -14
  337. package/scripts/version.js +0 -26
  338. package/src/BookNavigator/BookModel.js +0 -14
  339. package/src/BookNavigator/BookNavigator.js +0 -459
  340. package/src/BookNavigator/assets/book-loader.js +0 -27
  341. package/src/BookNavigator/assets/icon_checkmark.js +0 -6
  342. package/src/BookNavigator/assets/icon_close.js +0 -3
  343. package/src/BookNavigator/assets/icon_sort_ascending.js +0 -5
  344. package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
  345. package/src/BookNavigator/assets/icon_sort_neutral.js +0 -5
  346. package/src/BookNavigator/assets/icon_volumes.js +0 -11
  347. package/src/BookNavigator/bookmarks/bookmarks-provider.js +0 -53
  348. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  349. package/src/BookNavigator/downloads/downloads-provider.js +0 -66
  350. package/src/BookNavigator/search/a-search-result.js +0 -55
  351. package/src/BookNavigator/volumes/volumes-provider.js +0 -83
  352. package/src/BookNavigator/volumes/volumes.js +0 -178
  353. package/src/BookReader/DebugConsole.js +0 -54
  354. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  355. package/src/ItemNavigator/ItemNavigator.js +0 -376
  356. package/src/ItemNavigator/providers/sharing.js +0 -33
  357. package/src/css/_MobileNav.scss +0 -194
  358. package/src/dragscrollable-br.js +0 -261
  359. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  360. package/src/plugins/plugin.mobile_nav.js +0 -287
  361. package/tests/BookReader/BookModel.test.js +0 -312
  362. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  363. package/tests/BookReader/DebugConsole.test.js +0 -25
  364. package/tests/BookReader/ImageCache.test.js +0 -150
  365. package/tests/BookReader/Mode1Up.test.js +0 -164
  366. package/tests/BookReader/Mode2Up.test.js +0 -247
  367. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  368. package/tests/BookReader/PageContainer.test.js +0 -115
  369. package/tests/BookReader/ReduceSet.test.js +0 -38
  370. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  371. package/tests/BookReader/utils/classes.test.js +0 -88
  372. package/tests/BookReader/utils.test.js +0 -109
  373. package/tests/BookReader.options.test.js +0 -39
  374. package/tests/BookReader.test.js +0 -301
  375. package/tests/e2e/README.md +0 -75
  376. package/tests/e2e/autoplay.test.js +0 -13
  377. package/tests/e2e/base.test.js +0 -35
  378. package/tests/e2e/helpers/base.js +0 -263
  379. package/tests/e2e/helpers/debug.js +0 -13
  380. package/tests/e2e/helpers/desktopSearch.js +0 -72
  381. package/tests/e2e/helpers/mobileSearch.js +0 -85
  382. package/tests/e2e/helpers/mockSearch.js +0 -93
  383. package/tests/e2e/helpers/rightToLeft.js +0 -29
  384. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  385. package/tests/e2e/models/BookReader.js +0 -11
  386. package/tests/e2e/models/Navigation.js +0 -56
  387. package/tests/e2e/rightToLeft.test.js +0 -20
  388. package/tests/e2e/viewmode.test.js +0 -37
  389. package/tests/karma/BookNavigator/book-navigator.test.js +0 -139
  390. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  391. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  392. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  393. package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
  394. package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +0 -40
  395. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  396. package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +0 -141
  397. package/tests/karma/BookNavigator/volumes/volumes.test.js +0 -98
  398. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  399. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  400. package/tests/plugins/plugin.autoplay.test.js +0 -52
  401. package/tests/plugins/plugin.chapters.test.js +0 -130
  402. package/tests/plugins/plugin.iframe.test.js +0 -42
  403. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  404. package/tests/plugins/plugin.resume.test.js +0 -98
  405. package/tests/plugins/plugin.text_selection.test.js +0 -203
  406. package/tests/plugins/plugin.url.test.js +0 -129
  407. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  408. package/tests/plugins/search/plugin.search.test.js +0 -173
  409. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  410. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  411. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  412. package/tests/plugins/tts/PageChunk.test.js +0 -57
  413. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  414. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  415. package/tests/plugins/tts/utils.test.js +0 -133
  416. package/tests/util/browserSniffing.test.js +0 -56
  417. package/tests/util/docCookies.test.js +0 -15
  418. package/tests/util/strings.test.js +0 -63
  419. package/tests/utils.js +0 -42
  420. package/webpack.config.js +0 -86
package/package.json CHANGED
@@ -1,7 +1,14 @@
1
1
  {
2
2
  "name": "@internetarchive/bookreader",
3
- "version": "5.0.0-12-fixsorting-7",
3
+ "version": "5.0.0-120",
4
4
  "description": "The Internet Archive BookReader.",
5
+ "type": "module",
6
+ "files": [
7
+ "BookReader/",
8
+ "dist/",
9
+ "src/",
10
+ "jsconfig.json"
11
+ ],
5
12
  "repository": {
6
13
  "type": "git",
7
14
  "url": "git+https://github.com/internetarchive/bookreader.git"
@@ -9,7 +16,12 @@
9
16
  "publishConfig": {
10
17
  "access": "public"
11
18
  },
12
- "module": "src/BookNavigator/BookNavigator.js",
19
+ "module": "dist/esm/ia-bookreader.js",
20
+ "exports": {
21
+ ".": "./dist/esm/ia-bookreader.js",
22
+ "./esm/*": "./dist/esm/*",
23
+ "./*": "./*"
24
+ },
13
25
  "keywords": [
14
26
  "online",
15
27
  "bookreader",
@@ -25,92 +37,122 @@
25
37
  "homepage": "https://github.com/internetarchive/bookreader#readme",
26
38
  "private": false,
27
39
  "dependencies": {
28
- "@internetarchive/ia-activity-indicator": "^0.0.1",
29
- "@internetarchive/ia-icons": "^1.2.2",
30
- "@internetarchive/ia-menu-slider": "^1.1.0",
31
- "@internetarchive/ia-sharing-options": "^0.1.2",
32
- "@internetarchive/icon-bookmark": "^1.1.3",
33
- "@internetarchive/icon-collapse-sidebar": "^1.1.0",
34
- "@internetarchive/icon-edit-pencil": "1.1.5",
35
- "@internetarchive/icon-magnify-minus": "^1.2.3",
36
- "@internetarchive/icon-magnify-plus": "^1.2.3",
37
- "@internetarchive/icon-search": "^1.2.3",
38
- "@internetarchive/modal-manager": "^0.1.0",
39
- "lit-element": "^2.4.0",
40
- "lit-html": "^1.3.0"
41
- },
42
- "devDependencies": {
43
- "@babel/core": "7.13.16",
44
- "@babel/preset-env": "7.13.15",
45
- "@open-wc/testing": "^2.5.33",
46
- "@open-wc/testing-karma": "^4.0.9",
47
- "@types/jest": "26.0.23",
48
- "babel-loader": "8.2.2",
49
- "codecov": "3.8.1",
50
- "concurrently": "6.0.2",
51
- "core-js": "3.11.0",
52
- "cpx2": "3.0.0",
53
- "eslint": "7.25.0",
54
- "eslint-plugin-testcafe": "0.2.1",
55
- "http-server": "0.12.3",
56
- "iso-language-codes": "1.0.8",
57
- "jest": "26.6.3",
58
- "jquery": "1.11.3",
40
+ "@internetarchive/bergamot-translator": "^0.4.9-ia.1",
41
+ "@internetarchive/ia-activity-indicator": "^1.0.0",
42
+ "@internetarchive/ia-item-navigator": "^2.2.3",
43
+ "@internetarchive/icon-bookmark": "^1.4.1",
44
+ "@internetarchive/icon-close": "^1.4.1",
45
+ "@internetarchive/icon-dl": "^1.4.1",
46
+ "@internetarchive/icon-edit-pencil": "^1.4.1",
47
+ "@internetarchive/icon-ellipses": "^1.4.1",
48
+ "@internetarchive/icon-ia-logo": "^1.4.1",
49
+ "@internetarchive/icon-magnify-minus": "^1.4.1",
50
+ "@internetarchive/icon-magnify-plus": "^1.4.1",
51
+ "@internetarchive/icon-search": "^1.4.1",
52
+ "@internetarchive/icon-share": "^1.4.1",
53
+ "@internetarchive/icon-toc": "^1.4.1",
54
+ "@internetarchive/icon-visual-adjustment": "^1.4.1",
55
+ "@internetarchive/modal-manager": "^2.0.6",
56
+ "@internetarchive/shared-resize-observer": "^0.2.0",
57
+ "interactjs": "1.10.18",
58
+ "iso-language-codes": "2.0.0",
59
+ "jquery": "3.6.1",
59
60
  "jquery-colorbox": "1.6.4",
60
61
  "jquery-ui": "1.12.1",
61
62
  "jquery-ui-touch-punch": "0.2.3",
62
63
  "jquery.browser": "0.1.0",
63
- "jquery.mmenu": "5.6.5",
64
- "karma-coverage": "^2.0.3",
65
- "live-server": "1.2.1",
66
- "node-fetch": "2.6.1",
67
- "regenerator-runtime": "0.13.7",
68
- "sass": "1.32.11",
69
- "sinon": "10.0.0",
70
- "soundmanager2": "2.97.20170602",
71
- "svgo": "2.3.0",
72
- "testcafe": "1.14.0",
73
- "webpack": "5.35.0",
74
- "webpack-cli": "4.6.0"
64
+ "lit": "2.8.0",
65
+ "soundmanager2": "2.97.20170602"
66
+ },
67
+ "devDependencies": {
68
+ "@babel/core": "7.29.7",
69
+ "@babel/eslint-parser": "7.29.9",
70
+ "@babel/plugin-proposal-class-properties": "7.18.6",
71
+ "@babel/plugin-proposal-decorators": "7.29.7",
72
+ "@babel/preset-env": "7.29.7",
73
+ "@iiif/presentation-2": "1.0.4",
74
+ "@iiif/presentation-3": "2.2.4",
75
+ "@open-wc/testing-helpers": "3.0.1",
76
+ "@types/jest": "30.0.0",
77
+ "@webcomponents/webcomponentsjs": "2.6.0",
78
+ "babel-loader": "10.1.1",
79
+ "concurrently": "10.0.5",
80
+ "core-js": "3.50.0",
81
+ "cpx2": "9.0.3",
82
+ "css-loader": "7.1.5",
83
+ "eslint": "7.32.0",
84
+ "eslint-plugin-no-jquery": "2.7.0",
85
+ "eslint-plugin-testcafe": "0.2.1",
86
+ "http-server": "14.1.1",
87
+ "hypothesis": "1.1766.0",
88
+ "jest": "30.5.2",
89
+ "jest-environment-jsdom": "30.5.2",
90
+ "live-server": "1.2.2",
91
+ "regenerator-runtime": "0.14.1",
92
+ "sass": "1.105.1",
93
+ "sass-loader": "17.0.1",
94
+ "sinon": "22.1.0",
95
+ "svgo": "4.1.0",
96
+ "testcafe": "3.7.6",
97
+ "testcafe-browser-provider-browserstack": "1.15.2",
98
+ "webpack": "5.111.1",
99
+ "webpack-cli": "7.2.3"
75
100
  },
76
101
  "jest": {
102
+ "testEnvironment": "jsdom",
103
+ "transformIgnorePatterns": [
104
+ "node_modules/(?!(sinon|lit-html|lit-element|lit|@lit|@lit-labs|@internetarchive|@open-wc)/)"
105
+ ],
106
+ "moduleNameMapper": {
107
+ "@/(.*)$": "<rootDir>/$1",
108
+ "\\.scss$": "<rootDir>/tests/jest/styleMock.js"
109
+ },
77
110
  "setupFiles": [
78
- "./src/jquery-wrapper.js"
111
+ "./src/jquery-wrapper.js",
112
+ "./tests/jest/setup.js"
79
113
  ],
80
114
  "roots": [
81
115
  "<rootDir>/src/",
82
- "<rootDir>/tests/"
83
- ],
84
- "testPathIgnorePatterns": [
85
- "<rootDir>/tests/e2e/",
86
- "<rootDir>/tests/karma/"
87
- ],
88
- "coverageDirectory": "<rootDir>/coverage-jest"
116
+ "<rootDir>/tests/jest/"
117
+ ]
89
118
  },
90
119
  "scripts": {
91
- "preversion": "npm run test && node scripts/preversion.js",
120
+ "preversion": "node scripts/preversion.js",
92
121
  "version": "node scripts/version.js",
93
122
  "postversion": "node scripts/postversion.js",
94
- "build": "npm run clean && npm run build-js && npm run build-css && npm run build-assets",
123
+ "build": "npm run clean && npx concurrently --group npm:build-js npm:build-css npm:build-assets npm:build-hypothesis npm:build-bergamot",
95
124
  "build-assets": "npx cpx \"src/assets/**/*\" BookReader && npx svgo -f BookReader/icons && npx svgo -f BookReader/images",
96
125
  "build-assets:watch": "npx cpx --watch --verbose \"src/assets/**/*\" BookReader",
126
+ "build-bergamot": "npx cpx \"node_modules/@internetarchive/bergamot-translator/worker/*\" BookReader/",
127
+ "build-bergamot:watch": "npx cpx --watch \"node_modules/@internetarchive/bergamot-translator/worker/*\" BookReader/",
128
+ "build-hypothesis": "npx cpx \"node_modules/hypothesis/**/*\" BookReader/hypothesis",
129
+ "build-hypothesis:watch": "npx cpx --watch --verbose \"node_modules/hypothesis/**/*\" BookReader/hypothesis",
97
130
  "build-js": "npx webpack",
98
131
  "build-js:watch": "npx webpack --mode=development --watch",
99
- "build-css": "npx sass --no-source-map ./src/css/BookReader.scss ./BookReader/BookReader.css",
100
- "build-css:watch": "npx sass --watch --no-source-map ./src/css/BookReader.scss ./BookReader/BookReader.css",
101
- "clean": "rm -r BookReader/ || true",
102
- "lint": "npx eslint src/ tests/ *.js",
103
- "lint:fix": "npx eslint --fix src/ tests/ *.js",
104
- "serve": "npx http-server . --port 8000",
105
- "serve-live": "npx live-server . --port 8000 --watch=index.html,BookReader,BookReaderDemo",
106
- "serve-dev": "npm run build-css && npx concurrently --kill-others npm:serve-live npm:build-*:watch",
107
- "test": "npm run test-jest && npm run test-karma",
108
- "test:e2e": "npm run build && env BASE_URL=http://127.0.0.1:8000/BookReaderDemo/ npx testcafe",
109
- "test:e2e:dev": "env BASE_URL=http://127.0.0.1:8000/BookReaderDemo/ npx testcafe --live --dev",
110
- "test-jest:watch": "npx jest --watch",
111
- "test-jest": "npx jest --coverage --colors",
112
- "test-karma": "npx karma start --coverage",
113
- "test-karma:watch": "npx karma start --auto-watch=true --single-run=false",
114
- "codecov": "npx codecov"
132
+ "build-css": "npx sass --silence-deprecation=import --no-source-map ./src/css/BookReader.scss ./BookReader/BookReader.css",
133
+ "build-css:watch": "npx sass --silence-deprecation=import --watch --no-source-map ./src/css/BookReader.scss ./BookReader/BookReader.css",
134
+ "clean": "rm -rf BookReader/ dist/",
135
+ "lint": "npx eslint src/ tests/ *.js *.cjs",
136
+ "lint:fix": "npx eslint --fix src/ tests/ *.js *.cjs",
137
+ "serve": "npx http-server . --port=8000",
138
+ "serve-live": "node scripts/live-server.js",
139
+ "serve-dev": "env NODE_ENV='development' npm run build-css && env NODE_ENV='development' npx concurrently --kill-others npm:serve-live npm:build-*:watch",
140
+ "test": "npx jest --coverage --colors",
141
+ "test:watch": "npx jest --watch",
142
+ "test:e2e": "npm run build && npx testcafe",
143
+ "test:e2e:dev": "npx testcafe --live --dev",
144
+ "DOCS:update:test-deps": "If CI succeeds, these should be good to update",
145
+ "update:test-deps": "npm i @babel/eslint-parser@latest @open-wc/testing-helpers@latest @types/jest@latest eslint@7 eslint-plugin-no-jquery@latest eslint-plugin-testcafe@latest jest@latest jest-environment-jsdom@latest sinon@latest testcafe@latest",
146
+ "update:test-deps:test": "npm run lint && npm run test && npm run test:e2e",
147
+ "DOCS:update:build-deps": "These can cause strange changes, so do an npm run build + check file size (git diff --stat), and check the site is as expected",
148
+ "update:build-deps": "npm i @babel/core@latest @babel/preset-env@latest @babel/plugin-proposal-class-properties@latest @babel/plugin-proposal-decorators@latest babel-loader@latest core-js@latest css-loader@latest regenerator-runtime@latest sass@latest sass-loader@latest svgo@latest webpack@latest webpack-cli@latest",
149
+ "update:build-deps:test": "npm run build",
150
+ "DOCS:update:dev-deps": "Packages used for development",
151
+ "update:dev-deps": "npm i @iiif/presentation-2@latest @iiif/presentation-3@latest concurrently@latest cpx2@latest http-server@latest hypothesis@latest live-server@latest testcafe-browser-provider-browserstack@latest",
152
+ "DOCS:update:runtime-deps": "Core runtime dependencies; do an npm run build + visual check after updating",
153
+ "update:runtime-deps": "npm i @webcomponents/webcomponentsjs@latest interactjs@latest iso-language-codes@latest jquery@latest jquery-colorbox@latest jquery-ui@latest jquery-ui-touch-punch@latest jquery.browser@latest lit@latest soundmanager2@latest",
154
+ "update:runtime-deps:test": "npm run build",
155
+ "DOCS:update:ia-deps": "Packages by @internetarchive",
156
+ "update:ia-deps": "npm i @internetarchive/bergamot-translator@latest @internetarchive/ia-activity-indicator@latest @internetarchive/ia-item-navigator@latest @internetarchive/icon-bookmark@latest @internetarchive/icon-close@latest @internetarchive/icon-dl@latest @internetarchive/icon-edit-pencil@latest @internetarchive/icon-ellipses@latest @internetarchive/icon-ia-logo@latest @internetarchive/icon-magnify-minus@latest @internetarchive/icon-magnify-plus@latest @internetarchive/icon-search@latest @internetarchive/icon-share@latest @internetarchive/icon-toc@latest @internetarchive/icon-visual-adjustment@latest @internetarchive/modal-manager@latest @internetarchive/shared-resize-observer@latest"
115
157
  }
116
158
  }
@@ -4,11 +4,6 @@ import { clamp } from './utils.js';
4
4
  /** @typedef {import('./options.js').PageData} PageData */
5
5
  /** @typedef {import('../BookReader.js').default} BookReader */
6
6
 
7
- // URI to display when a page is not viewable.
8
- // TODO Render configurable html for the user instead.
9
- // FIXME Don't reference files on archive.org
10
- const UNVIEWABLE_PAGE_URI = '/bookreader/static/preview-default.png';
11
-
12
7
  /**
13
8
  * Contains information about the Book/Document independent of the way it is
14
9
  * being rendering. Nothing here should reference e.g. the mode, zoom, etc.
@@ -23,42 +18,15 @@ export class BookModel {
23
18
  this.br = br;
24
19
  this.reduceSet = br.reduceSet;
25
20
  this.ppi = br.options?.ppi ?? DEFAULT_OPTIONS.ppi;
21
+ /** @type {'lr' | 'rl'} Page progression */
22
+ this.pageProgression = br.options?.pageProgression ?? DEFAULT_OPTIONS.pageProgression;
26
23
 
27
24
  /** @type {{width: number, height: number}} memoize storage */
28
25
  this._medianPageSize = null;
29
- /** @deprecated @type {{width: number, height: number}} memoize storage */
30
- this._medianPageSizePixels = null;
31
26
  /** @type {[PageData[], number]} */
32
27
  this._getDataFlattenedCached = null;
33
28
  }
34
29
 
35
- /**
36
- * @deprecated Use getMedianPageSizeInches
37
- * Memoized
38
- * @return {{width: number, height: number}}
39
- */
40
- getMedianPageSize() {
41
- if (this._medianPageSizePixels) {
42
- return this._medianPageSizePixels;
43
- }
44
-
45
- // A little expensive but we just do it once
46
- const widths = [];
47
- const heights = [];
48
- for (let i = 0; i < this.getNumLeafs(); i++) {
49
- widths.push(this.getPageWidth(i));
50
- heights.push(this.getPageHeight(i));
51
- }
52
-
53
- widths.sort();
54
- heights.sort();
55
- this._medianPageSizePixels = {
56
- width: widths[Math.floor(widths.length / 2)],
57
- height: heights[Math.floor(heights.length / 2)]
58
- };
59
- return this._medianPageSizePixels;
60
- }
61
-
62
30
  /** Get median width/height of page in inches. Memoized for performance. */
63
31
  getMedianPageSizeInches() {
64
32
  if (this._medianPageSize) {
@@ -72,12 +40,12 @@ export class BookModel {
72
40
  heights.push(page.heightInches);
73
41
  }
74
42
 
75
- widths.sort();
76
- heights.sort();
43
+ widths.sort((a, b) => a - b);
44
+ heights.sort((a, b) => a - b);
77
45
 
78
46
  this._medianPageSize = {
79
47
  width: widths[Math.floor(widths.length / 2)],
80
- height: heights[Math.floor(heights.length / 2)]
48
+ height: heights[Math.floor(heights.length / 2)],
81
49
  };
82
50
  return this._medianPageSize;
83
51
  }
@@ -187,7 +155,17 @@ export class BookModel {
187
155
  */
188
156
  // eslint-disable-next-line no-unused-vars
189
157
  getPageURI(index, reduce, rotate) {
190
- return !this.getPageProp(index, 'viewable', true) ? UNVIEWABLE_PAGE_URI : this.getPageProp(index, 'uri');
158
+ if (!this.getPageProp(index, 'viewable', true)) {
159
+ const uri = this.br.options.unviewablePageURI;
160
+ if (uri.startsWith('.')) {
161
+ // It's a relative path, so make it relative to the images path
162
+ return this.br.options.imagesBaseURL + uri;
163
+ } else {
164
+ return uri;
165
+ }
166
+ } else {
167
+ return this.getPageProp(index, 'uri');
168
+ }
191
169
  }
192
170
 
193
171
  /**
@@ -226,7 +204,7 @@ export class BookModel {
226
204
  * @return {[PageIndex, PageIndex]} eg [0, 1]
227
205
  */
228
206
  getSpreadIndices(pindex) {
229
- if (this.br.pageProgression == 'rl') {
207
+ if (this.pageProgression == 'rl') {
230
208
  return this.getPageSide(pindex) == 'R' ? [pindex + 1, pindex] : [pindex, pindex - 1];
231
209
  } else {
232
210
  return this.getPageSide(pindex) == 'L' ? [pindex, pindex + 1] : [pindex - 1, pindex];
@@ -296,6 +274,7 @@ export class BookModel {
296
274
  * @param {number} [arg0.end] exclusive
297
275
  * @param {boolean} [arg0.combineConsecutiveUnviewables] Yield only first unviewable
298
276
  * of a chunk of unviewable pages instead of each page
277
+ * @return {Generator<PageModel>}
299
278
  */
300
279
  * pagesIterator({ start = 0, end = Infinity, combineConsecutiveUnviewables = false } = {}) {
301
280
  start = Math.max(0, start);
@@ -379,8 +358,9 @@ export class PageModel {
379
358
  * @param {PageIndex} index
380
359
  */
381
360
  constructor(book, index) {
382
- // TODO: Get default from config
383
- this.ppi = book._getDataProp(index, 'ppi', book.ppi);
361
+ // Values less than 10 cause the UI to not work correctly
362
+ const pagePPI = book._getDataProp(index, 'ppi', book.ppi);
363
+ this.ppi = Math.max(pagePPI < 10 ? book.ppi : pagePPI, 10);
384
364
  this.book = book;
385
365
  this.index = index;
386
366
  this.width = book.getPageWidth(index);
@@ -437,6 +417,42 @@ export class PageModel {
437
417
  return this.findNext();
438
418
  }
439
419
 
420
+ /** @type {PageModel | null} */
421
+ get left() {
422
+ return this.book.pageProgression === 'lr' ? this.prev : this.next;
423
+ }
424
+
425
+ /** @type {PageModel | null} */
426
+ get right() {
427
+ return this.book.pageProgression === 'lr' ? this.next : this.prev;
428
+ }
429
+
430
+ /**
431
+ * @type {{left: PageModel | null, right: PageModel | null}}
432
+ */
433
+ get spread() {
434
+ return {
435
+ left: this.pageSide === 'L' ? this : this.left,
436
+ right: this.pageSide === 'R' ? this : this.right,
437
+ };
438
+ }
439
+
440
+ /**
441
+ * @param {number} pages
442
+ */
443
+ goLeft(pages) {
444
+ const newIndex = this.book.pageProgression === 'lr' ? this.index - pages : this.index + pages;
445
+ return this.book.getPage(newIndex);
446
+ }
447
+
448
+ /**
449
+ * @param {number} pages
450
+ */
451
+ goRight(pages) {
452
+ const newIndex = this.book.pageProgression === 'lr' ? this.index + pages : this.index - pages;
453
+ return this.book.getPage(newIndex);
454
+ }
455
+
440
456
  /**
441
457
  * @param {number} reduce
442
458
  * @param {number} rotate
@@ -445,6 +461,15 @@ export class PageModel {
445
461
  return this.book.getPageURI(this.index, reduce, rotate);
446
462
  }
447
463
 
464
+ /**
465
+ * Return the asserted page number for this page, or, if one is not
466
+ * present, the n-prefixed page index.
467
+ * @returns {PageNumString}
468
+ */
469
+ getPageNum() {
470
+ return this.book.getPageNum(this.index);
471
+ }
472
+
448
473
  /**
449
474
  * Returns the srcset with correct URIs or void string if out of range
450
475
  * @param {number} reduce
@@ -468,7 +493,7 @@ export class PageModel {
468
493
  * @param {object} [arg0]
469
494
  * @param {boolean} [arg0.combineConsecutiveUnviewables] Whether to only yield the first page
470
495
  * of a series of unviewable pages instead of each page
471
- * @return {PageModel|void}
496
+ * @return {PageModel|undefined}
472
497
  */
473
498
  findNext({ combineConsecutiveUnviewables = false } = {}) {
474
499
  return this.book
@@ -480,7 +505,7 @@ export class PageModel {
480
505
  * @param {object} [arg0]
481
506
  * @param {boolean} [arg0.combineConsecutiveUnviewables] Whether to only yield the first page
482
507
  * of a series of unviewable pages instead of each page
483
- * @return {PageModel|void}
508
+ * @return {PageModel|undefined}
484
509
  */
485
510
  findPrev({ combineConsecutiveUnviewables = false } = {}) {
486
511
  if (this.index == 0) return undefined;
@@ -498,17 +523,38 @@ export class PageModel {
498
523
  return new PageModel(this.book, this.index - 1);
499
524
  }
500
525
  }
526
+
527
+ /**
528
+ * @param {object} [arg0]
529
+ * @param {boolean} [arg0.combineConsecutiveUnviewables] Whether to only yield the first page
530
+ * of a series of unviewable pages instead of each page
531
+ * @return {PageModel|undefined}
532
+ */
533
+ findLeft({ combineConsecutiveUnviewables = false } = {}) {
534
+ return this.book.pageProgression === 'lr' ? this.findPrev({ combineConsecutiveUnviewables }) : this.findNext({ combineConsecutiveUnviewables });
535
+ }
536
+
537
+ /**
538
+ * @param {object} [arg0]
539
+ * @param {boolean} [arg0.combineConsecutiveUnviewables] Whether to only yield the first page
540
+ * of a series of unviewable pages instead of each page
541
+ * @return {PageModel|undefined}
542
+ */
543
+ findRight({ combineConsecutiveUnviewables = false } = {}) {
544
+ return this.book.pageProgression === 'lr' ? this.findNext({ combineConsecutiveUnviewables }) : this.findPrev({ combineConsecutiveUnviewables });
545
+ }
501
546
  }
502
547
 
503
548
  // There are a few main ways we can reference a specific page in a book:
504
549
  /**
505
550
  * @typedef {string} PageNumString
506
- * Possible values: /^n?\d+$/. Example: 'n7', '18'
507
- * Not necessarily unique
551
+ * The way page numbers are usually displayed in the UI. Either
552
+ * an asserted page number if the book has one (e.g. '18', or 'A-1'),
553
+ * or the n-prefixed 0-based index (e.g. 'n7')
508
554
  */
509
555
  /**
510
556
  * @typedef {number} LeafNum
511
- * No clue if 0 or 1 indexed or consecutive; generally from IA book info.
557
+ * Internal number to IA scans. Can be 0 or 1 indexed. Unclear it it's consecutive.
512
558
  */
513
559
  /**
514
560
  * @typedef {string} PageString