@internetarchive/bookreader 5.0.0-10-alpha-3 → 5.0.0-101
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.
- package/BookReader/474.js +2 -0
- package/BookReader/474.js.map +1 -0
- package/BookReader/BookReader.css +431 -1134
- package/BookReader/BookReader.js +1 -1
- package/BookReader/BookReader.js.LICENSE.txt +20 -20
- package/BookReader/BookReader.js.map +1 -1
- package/BookReader/bergamot-translator-worker.js +2966 -0
- package/BookReader/bergamot-translator-worker.wasm +0 -0
- package/BookReader/hypothesis/LICENSE +50 -0
- package/BookReader/hypothesis/README.md +55 -0
- package/BookReader/hypothesis/build/boot.js +1 -0
- package/BookReader/hypothesis/build/manifest.json +20 -0
- package/BookReader/hypothesis/build/scripts/annotator.bundle.js +184 -0
- package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +798 -0
- package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +711 -0
- package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/styles/annotator.css +2235 -0
- package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/highlights.css +2 -0
- package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
- package/BookReader/hypothesis/build/styles/katex.min.css +2 -0
- package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
- package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +2 -0
- package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
- package/BookReader/hypothesis/build/styles/sidebar.css +2731 -0
- package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
- package/BookReader/hypothesis/build/styles/ui-playground.css +2659 -0
- package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
- package/BookReader/hypothesis/package.json +126 -0
- package/BookReader/ia-bookreader-bundle.js +1782 -0
- package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
- package/BookReader/ia-bookreader-bundle.js.map +1 -0
- package/BookReader/icons/1up.svg +1 -1
- package/BookReader/icons/2up.svg +1 -1
- package/BookReader/icons/advance.svg +1 -1
- package/BookReader/icons/chevron-right.svg +1 -1
- package/BookReader/icons/close-circle-dark.svg +1 -1
- package/BookReader/icons/close-circle.svg +1 -1
- package/BookReader/icons/fullscreen.svg +1 -1
- package/BookReader/icons/fullscreen_exit.svg +1 -1
- package/BookReader/icons/hamburger.svg +1 -1
- package/BookReader/icons/left-arrow.svg +1 -1
- package/BookReader/icons/magnify-minus.svg +1 -1
- package/BookReader/icons/magnify-plus.svg +1 -1
- package/BookReader/icons/magnify.svg +1 -1
- package/BookReader/icons/pause.svg +1 -1
- package/BookReader/icons/play.svg +1 -1
- package/BookReader/icons/playback-speed.svg +1 -1
- package/BookReader/icons/read-aloud.svg +1 -1
- package/BookReader/icons/review.svg +1 -1
- package/BookReader/icons/thumbnails.svg +1 -1
- package/BookReader/icons/voice.svg +1 -0
- package/BookReader/icons/volume-full.svg +1 -1
- package/BookReader/images/BRicons.svg +3 -3
- package/BookReader/images/books_graphic.svg +1 -1
- package/BookReader/images/hypothesis.ico +0 -0
- package/BookReader/images/icon_book.svg +1 -1
- package/BookReader/images/icon_bookmark.svg +1 -1
- package/BookReader/images/icon_experiment.svg +1 -0
- package/BookReader/images/icon_gear.svg +1 -1
- package/BookReader/images/icon_hamburger.svg +1 -1
- package/BookReader/images/icon_home.svg +1 -1
- package/BookReader/images/icon_info.svg +1 -1
- package/BookReader/images/icon_one_page.svg +1 -1
- package/BookReader/images/icon_pause.svg +1 -1
- package/BookReader/images/icon_play.svg +1 -1
- package/BookReader/images/icon_playback-rate.svg +1 -1
- package/BookReader/images/icon_search_button.svg +1 -1
- package/BookReader/images/icon_share.svg +1 -1
- package/BookReader/images/icon_skip-ahead.svg +1 -1
- package/BookReader/images/icon_skip-back.svg +1 -1
- package/BookReader/images/icon_speaker.svg +1 -1
- package/BookReader/images/icon_speaker_open.svg +1 -1
- package/BookReader/images/icon_thumbnails.svg +1 -1
- package/BookReader/images/icon_toc.svg +1 -1
- package/BookReader/images/icon_two_pages.svg +1 -1
- package/BookReader/images/marker_chap-off.svg +1 -1
- package/BookReader/images/marker_chap-on.svg +1 -1
- package/BookReader/images/marker_srch-on.svg +1 -1
- package/BookReader/images/translate.svg +1 -0
- package/BookReader/images/unviewable_page.png +0 -0
- package/BookReader/jquery-3.js +2 -0
- package/BookReader/jquery-3.js.LICENSE.txt +24 -0
- package/BookReader/plugins/plugin.archive_analytics.js +1 -1
- package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
- package/BookReader/plugins/plugin.autoplay.js +1 -1
- package/BookReader/plugins/plugin.autoplay.js.map +1 -1
- package/BookReader/plugins/plugin.chapters.js +25 -1
- package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.chapters.js.map +1 -1
- package/BookReader/plugins/plugin.experiments.js +3 -0
- package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.experiments.js.map +1 -0
- package/BookReader/plugins/plugin.iframe.js +1 -1
- package/BookReader/plugins/plugin.iframe.js.map +1 -1
- package/BookReader/plugins/plugin.iiif.js +2 -0
- package/BookReader/plugins/plugin.iiif.js.map +1 -0
- package/BookReader/plugins/plugin.resume.js +1 -1
- package/BookReader/plugins/plugin.resume.js.map +1 -1
- package/BookReader/plugins/plugin.search.js +2 -1
- package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.search.js.map +1 -1
- package/BookReader/plugins/plugin.text_selection.js +2 -1
- package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.text_selection.js.map +1 -1
- package/BookReader/plugins/plugin.translate.js +137 -0
- package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.translate.js.map +1 -0
- package/BookReader/plugins/plugin.tts.js +1 -1
- package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
- package/BookReader/plugins/plugin.tts.js.map +1 -1
- package/BookReader/plugins/plugin.url.js +1 -1
- package/BookReader/plugins/plugin.url.js.map +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
- package/BookReader/plugins/translator-worker.js +2 -0
- package/BookReader/plugins/translator-worker.js.map +1 -0
- package/BookReader/silence.mp3 +0 -0
- package/BookReader/translator-worker.js +475 -0
- package/BookReader/webcomponents-bundle.js +3 -0
- package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
- package/BookReader/webcomponents-bundle.js.map +1 -0
- package/README.md +14 -3
- package/jsconfig.json +19 -0
- package/package.json +84 -64
- package/src/BookNavigator/assets/bookmark-colors.js +1 -1
- package/src/BookNavigator/assets/button-base.js +2 -1
- package/src/BookNavigator/assets/ia-logo.js +17 -0
- package/src/BookNavigator/assets/icon_checkmark.js +1 -1
- package/src/BookNavigator/assets/icon_close.js +1 -1
- package/src/BookNavigator/book-navigator.js +620 -0
- package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
- package/src/BookNavigator/bookmarks/bookmark-edit.js +2 -3
- package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
- package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +2 -2
- package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
- package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
- package/src/BookNavigator/delete-modal-actions.js +1 -1
- package/src/BookNavigator/downloads/downloads-provider.js +36 -21
- package/src/BookNavigator/downloads/downloads.js +24 -4
- package/src/BookNavigator/search/search-provider.js +55 -27
- package/src/BookNavigator/search/search-results.js +25 -11
- package/src/BookNavigator/sharing.js +27 -0
- package/src/BookNavigator/viewable-files.js +95 -0
- package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +13 -12
- package/src/BookNavigator/visual-adjustments/visual-adjustments.js +9 -9
- package/src/BookReader/BookModel.js +92 -46
- package/src/BookReader/DragScrollable.js +233 -0
- package/src/BookReader/ImageCache.js +49 -16
- package/src/BookReader/Mode1Up.js +58 -360
- package/src/BookReader/Mode1UpLit.js +393 -0
- package/src/BookReader/Mode2Up.js +75 -1318
- package/src/BookReader/Mode2UpLit.js +787 -0
- package/src/BookReader/ModeCoordinateSpace.js +29 -0
- package/src/BookReader/ModeSmoothZoom.js +312 -0
- package/src/BookReader/ModeThumb.js +20 -12
- package/src/BookReader/Navbar/Navbar.js +130 -53
- package/src/BookReader/PageContainer.js +120 -23
- package/src/BookReader/ReduceSet.js +2 -2
- package/src/BookReader/Toolbar/Toolbar.js +18 -40
- package/src/BookReader/events.js +2 -3
- package/src/BookReader/options.js +87 -16
- package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
- package/src/BookReader/utils/ScrollClassAdder.js +31 -0
- package/src/BookReader/utils/SelectionObserver.js +45 -0
- package/src/BookReader/utils/classes.js +1 -1
- package/src/BookReader/utils.js +136 -12
- package/src/BookReader.js +641 -1192
- package/src/BookReaderPlugin.js +52 -0
- package/src/assets/icons/magnify-minus.svg +3 -7
- package/src/assets/icons/magnify-plus.svg +3 -7
- package/src/assets/icons/voice.svg +1 -0
- package/src/assets/images/hypothesis.ico +0 -0
- package/src/assets/images/icon_experiment.svg +1 -0
- package/src/assets/images/translate.svg +1 -0
- package/src/assets/images/unviewable_page.png +0 -0
- package/src/assets/silence.mp3 +0 -0
- package/src/css/BookReader.scss +1 -5
- package/src/css/_BRBookmarks.scss +1 -1
- package/src/css/_BRComponent.scss +1 -1
- package/src/css/_BRicon.scss +8 -2
- package/src/css/_BRmain.scss +16 -3
- package/src/css/_BRnav.scss +12 -66
- package/src/css/_BRpages.scss +171 -42
- package/src/css/_BRsearch.scss +69 -30
- package/src/css/_BRtoolbar.scss +5 -5
- package/src/css/_TextSelection.scss +129 -24
- package/src/css/_colorbox.scss +2 -2
- package/src/css/_controls.scss +24 -7
- package/src/css/_icons.scss +1 -1
- package/src/ia-bookreader/ia-bookreader.js +224 -0
- package/src/plugins/plugin.archive_analytics.js +84 -78
- package/src/plugins/plugin.autoplay.js +99 -104
- package/src/plugins/plugin.chapters.js +314 -205
- package/src/plugins/plugin.experiments.js +321 -0
- package/src/plugins/plugin.iframe.js +1 -1
- package/src/plugins/plugin.iiif.js +141 -0
- package/src/plugins/plugin.resume.js +54 -51
- package/src/plugins/plugin.text_selection.js +510 -219
- package/src/plugins/plugin.vendor-fullscreen.js +5 -5
- package/src/plugins/search/plugin.search.js +370 -392
- package/src/plugins/search/utils.js +43 -0
- package/src/plugins/search/view.js +49 -67
- package/src/plugins/translate/TranslationManager.js +162 -0
- package/src/plugins/translate/plugin.translate.js +523 -0
- package/src/plugins/tts/AbstractTTSEngine.js +78 -49
- package/src/plugins/tts/FestivalTTSEngine.js +20 -30
- package/src/plugins/tts/PageChunk.js +33 -21
- package/src/plugins/tts/PageChunkIterator.js +11 -17
- package/src/plugins/tts/WebTTSEngine.js +131 -91
- package/src/plugins/tts/plugin.tts.js +344 -350
- package/src/plugins/tts/utils.js +49 -47
- package/src/plugins/url/UrlPlugin.js +191 -0
- package/src/plugins/{plugin.url.js → url/plugin.url.js} +44 -15
- package/src/util/TextSelectionManager.js +282 -0
- package/src/util/browserSniffing.js +33 -1
- package/src/util/cache.js +20 -0
- package/src/util/docCookies.js +21 -2
- package/src/util/strings.js +1 -0
- package/.babelrc +0 -12
- package/.dependabot/config.yml +0 -6
- package/.eslintrc.js +0 -50
- package/.gitattributes +0 -2
- package/.github/ISSUE_TEMPLATE/bug.md +0 -32
- package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
- package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
- package/.github/workflows/node.js.yml +0 -37
- package/.github/workflows/npm-publish.yml +0 -47
- package/.testcaferc.json +0 -5
- package/BookReader/bookreader-component-bundle.js +0 -1450
- package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
- package/BookReader/bookreader-component-bundle.js.map +0 -1
- package/BookReader/jquery-1.10.1.js +0 -2
- package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
- package/BookReader/plugins/plugin.menu_toggle.js +0 -2
- package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
- package/BookReader/plugins/plugin.mobile_nav.js +0 -2
- package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
- package/BookReaderDemo/BookReaderDemo.css +0 -41
- package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
- package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
- package/BookReaderDemo/BookReaderJSSimple.js +0 -55
- package/BookReaderDemo/IIIFBookReader.js +0 -207
- package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
- package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
- package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
- package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
- package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
- package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
- package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
- package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
- package/BookReaderDemo/demo-advanced.html +0 -33
- package/BookReaderDemo/demo-autoplay.html +0 -38
- package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
- package/BookReaderDemo/demo-embed.html +0 -26
- package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
- package/BookReaderDemo/demo-fullscreen.html +0 -33
- package/BookReaderDemo/demo-iiif.html +0 -34
- package/BookReaderDemo/demo-iiif.js +0 -26
- package/BookReaderDemo/demo-internetarchive.html +0 -74
- package/BookReaderDemo/demo-multiple.html +0 -43
- package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
- package/BookReaderDemo/demo-preview-pages.html +0 -1092
- package/BookReaderDemo/demo-simple.html +0 -34
- package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
- package/BookReaderDemo/immersion-1up.html +0 -64
- package/BookReaderDemo/immersion-mode.html +0 -35
- package/BookReaderDemo/toggle_controls.html +0 -53
- package/BookReaderDemo/view_mode.html +0 -39
- package/BookReaderDemo/viewmode-cycle.html +0 -41
- package/CHANGELOG.md +0 -493
- package/CONTRIBUTING.md +0 -7
- package/codecov.yml +0 -17
- package/index.html +0 -31
- package/karma.conf.js +0 -23
- package/screenshot.png +0 -0
- package/scripts/postversion.js +0 -10
- package/scripts/preversion.js +0 -14
- package/scripts/version.js +0 -26
- package/src/BookNavigator/BookModel.js +0 -14
- package/src/BookNavigator/BookNavigator.js +0 -446
- package/src/BookNavigator/assets/book-loader.js +0 -27
- package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
- package/src/BookNavigator/search/a-search-result.js +0 -55
- package/src/BookReader/DebugConsole.js +0 -54
- package/src/BookReaderComponent/BookReaderComponent.js +0 -112
- package/src/ItemNavigator/ItemNavigator.js +0 -376
- package/src/ItemNavigator/providers/sharing.js +0 -29
- package/src/css/_MobileNav.scss +0 -194
- package/src/dragscrollable-br.js +0 -261
- package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
- package/src/plugins/plugin.mobile_nav.js +0 -287
- package/tests/BookReader/BookModel.test.js +0 -312
- package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
- package/tests/BookReader/DebugConsole.test.js +0 -25
- package/tests/BookReader/ImageCache.test.js +0 -150
- package/tests/BookReader/Mode1Up.test.js +0 -164
- package/tests/BookReader/Mode2Up.test.js +0 -247
- package/tests/BookReader/Navbar/Navbar.test.js +0 -169
- package/tests/BookReader/PageContainer.test.js +0 -115
- package/tests/BookReader/ReduceSet.test.js +0 -38
- package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
- package/tests/BookReader/utils/classes.test.js +0 -88
- package/tests/BookReader/utils.test.js +0 -109
- package/tests/BookReader.options.test.js +0 -39
- package/tests/BookReader.test.js +0 -301
- package/tests/e2e/README.md +0 -75
- package/tests/e2e/autoplay.test.js +0 -13
- package/tests/e2e/base.test.js +0 -35
- package/tests/e2e/helpers/base.js +0 -263
- package/tests/e2e/helpers/debug.js +0 -13
- package/tests/e2e/helpers/desktopSearch.js +0 -72
- package/tests/e2e/helpers/mobileSearch.js +0 -85
- package/tests/e2e/helpers/mockSearch.js +0 -93
- package/tests/e2e/helpers/rightToLeft.js +0 -29
- package/tests/e2e/ia-production/ia-prod-base.js +0 -17
- package/tests/e2e/models/BookReader.js +0 -11
- package/tests/e2e/models/Navigation.js +0 -56
- package/tests/e2e/rightToLeft.test.js +0 -20
- package/tests/e2e/viewmode.test.js +0 -37
- package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
- package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
- package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
- package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
- package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
- package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
- package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
- package/tests/plugins/plugin.archive_analytics.test.js +0 -23
- package/tests/plugins/plugin.autoplay.test.js +0 -52
- package/tests/plugins/plugin.chapters.test.js +0 -130
- package/tests/plugins/plugin.iframe.test.js +0 -42
- package/tests/plugins/plugin.mobile_nav.test.js +0 -66
- package/tests/plugins/plugin.resume.test.js +0 -98
- package/tests/plugins/plugin.text_selection.test.js +0 -203
- package/tests/plugins/plugin.url.test.js +0 -129
- package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
- package/tests/plugins/search/plugin.search.test.js +0 -173
- package/tests/plugins/search/plugin.search.view.test.js +0 -106
- package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
- package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
- package/tests/plugins/tts/PageChunk.test.js +0 -57
- package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
- package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
- package/tests/plugins/tts/utils.test.js +0 -133
- package/tests/util/browserSniffing.test.js +0 -56
- package/tests/util/docCookies.test.js +0 -15
- package/tests/util/strings.test.js +0 -63
- package/tests/utils.js +0 -42
- package/webpack.config.js +0 -86
|
@@ -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
|
-
|
|
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.
|
|
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
|
-
//
|
|
383
|
-
|
|
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|
|
|
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|
|
|
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
|
-
*
|
|
507
|
-
*
|
|
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
|
-
*
|
|
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
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/*
|
|
3
|
+
* jQuery dragscrollable Plugin
|
|
4
|
+
* Based off version: 1.0 (25-Jun-2009)
|
|
5
|
+
* Copyright (c) 2009 Miquel Herrera
|
|
6
|
+
*
|
|
7
|
+
* Portions Copyright (c) 2010 Reg Braithwaite
|
|
8
|
+
* Copyright (c) 2010 Internet Archive / Michael Ang
|
|
9
|
+
* Copyright (c) 2016 Internet Archive / Richard Caceres
|
|
10
|
+
*
|
|
11
|
+
* Dual licensed under the MIT and GPL licenses:
|
|
12
|
+
* http://www.opensource.org/licenses/mit-license.php
|
|
13
|
+
* http://www.gnu.org/licenses/gpl.html
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* @param {string} string_of_events
|
|
18
|
+
* @param {string} ns
|
|
19
|
+
* @returns
|
|
20
|
+
*/
|
|
21
|
+
function append_namespace(string_of_events, ns) {
|
|
22
|
+
return string_of_events
|
|
23
|
+
.split(' ')
|
|
24
|
+
.map(event_name => event_name + ns)
|
|
25
|
+
.join(' ');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function left_top(event) {
|
|
29
|
+
/** @type {number} */
|
|
30
|
+
let x;
|
|
31
|
+
/** @type {number} */
|
|
32
|
+
let y;
|
|
33
|
+
if (typeof(event.clientX) != 'undefined') {
|
|
34
|
+
x = event.clientX;
|
|
35
|
+
y = event.clientY;
|
|
36
|
+
}
|
|
37
|
+
else if (typeof(event.screenX) != 'undefined') {
|
|
38
|
+
x = event.screenX;
|
|
39
|
+
y = event.screenY;
|
|
40
|
+
}
|
|
41
|
+
else if (typeof(event.targetTouches) != 'undefined') {
|
|
42
|
+
x = event.targetTouches[0].pageX;
|
|
43
|
+
y = event.targetTouches[0].pageY;
|
|
44
|
+
}
|
|
45
|
+
else if (typeof(event.originalEvent) == 'undefined') {
|
|
46
|
+
console.error("don't understand x and y for " + event.type, event);
|
|
47
|
+
}
|
|
48
|
+
else if (typeof(event.originalEvent.clientX) != 'undefined') {
|
|
49
|
+
x = event.originalEvent.clientX;
|
|
50
|
+
y = event.originalEvent.clientY;
|
|
51
|
+
}
|
|
52
|
+
else if (typeof(event.originalEvent.screenX) != 'undefined') {
|
|
53
|
+
x = event.originalEvent.screenX;
|
|
54
|
+
y = event.originalEvent.screenY;
|
|
55
|
+
}
|
|
56
|
+
else if (typeof(event.originalEvent.targetTouches) != 'undefined') {
|
|
57
|
+
x = event.originalEvent.targetTouches[0].pageX;
|
|
58
|
+
y = event.originalEvent.targetTouches[0].pageY;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return { left: x, top: y };
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
const DEFAULT_OPTIONS = {
|
|
65
|
+
/**
|
|
66
|
+
* @type {String|HTMLElement} jQuery selector to apply to each wrapped element to
|
|
67
|
+
* find which will be the dragging elements. Defaults to the first child of scrollable
|
|
68
|
+
* element
|
|
69
|
+
*/
|
|
70
|
+
dragSelector: '>:first',
|
|
71
|
+
|
|
72
|
+
/** Will the dragging element accept propagated events? default is yes, a propagated
|
|
73
|
+
* mouse event on a inner element will be accepted and processed. If set to false,
|
|
74
|
+
* only events originated on the draggable elements will be processed. */
|
|
75
|
+
acceptPropagatedEvent: true,
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Prevents the event to propagate further effectively disabling other default actions
|
|
79
|
+
*/
|
|
80
|
+
preventDefault: true,
|
|
81
|
+
|
|
82
|
+
dragstart: 'mousedown touchstart',
|
|
83
|
+
dragcontinue: 'mousemove touchmove',
|
|
84
|
+
dragend: 'mouseup touchend', // mouseleave
|
|
85
|
+
dragMinDistance: 5,
|
|
86
|
+
namespace: '.ds',
|
|
87
|
+
|
|
88
|
+
/** Scroll the window rather than the element */
|
|
89
|
+
scrollWindow: false,
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Adds the ability to manage elements scroll by dragging
|
|
94
|
+
* one or more of its descendant elements. Options parameter
|
|
95
|
+
* allow to specifically select which inner elements will
|
|
96
|
+
* respond to the drag events.
|
|
97
|
+
* usage examples:
|
|
98
|
+
*
|
|
99
|
+
* To add the scroll by drag to the element id=viewport when dragging its
|
|
100
|
+
* first child accepting any propagated events
|
|
101
|
+
* `new DragScrollable($('#viewport')[0]);`
|
|
102
|
+
*
|
|
103
|
+
* To add the scroll by drag ability to any element div of class viewport
|
|
104
|
+
* when dragging its first descendant of class dragMe responding only to
|
|
105
|
+
* evcents originated on the '.dragMe' elements.
|
|
106
|
+
* ```js
|
|
107
|
+
* new DragScrollable($('div.viewport')[0], {
|
|
108
|
+
* dragSelector: '.dragMe:first',
|
|
109
|
+
* acceptPropagatedEvent: false
|
|
110
|
+
* });
|
|
111
|
+
* ```
|
|
112
|
+
*
|
|
113
|
+
* Notice that some 'viewports' could be nested within others but events
|
|
114
|
+
* would not interfere as acceptPropagatedEvent is set to false.
|
|
115
|
+
*/
|
|
116
|
+
export class DragScrollable {
|
|
117
|
+
/**
|
|
118
|
+
* @param {HTMLElement} element
|
|
119
|
+
* @param {Partial<DEFAULT_OPTIONS>} options
|
|
120
|
+
*/
|
|
121
|
+
constructor(element, options = {}) {
|
|
122
|
+
this.handling_element = $(element);
|
|
123
|
+
/** @type {typeof DEFAULT_OPTIONS} */
|
|
124
|
+
this.settings = $.extend({}, DEFAULT_OPTIONS, options || {});
|
|
125
|
+
this.firstCoord = { left: 0, top: 0 };
|
|
126
|
+
this.lastCoord = { left: 0, top: 0 };
|
|
127
|
+
|
|
128
|
+
this.settings.dragstart = append_namespace(this.settings.dragstart, this.settings.namespace);
|
|
129
|
+
this.settings.dragcontinue = append_namespace(this.settings.dragcontinue, this.settings.namespace);
|
|
130
|
+
//settings.dragend = append_namespace(settings.dragend, settings.namespace);
|
|
131
|
+
|
|
132
|
+
// Set mouse initiating event on the desired descendant
|
|
133
|
+
this.handling_element.find(this.settings.dragSelector)
|
|
134
|
+
.on(this.settings.dragstart, this._dragStartHandler);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
_shouldAbort() {
|
|
138
|
+
const isTouchDevice = !!('ontouchstart' in window) || !!('msmaxtouchpoints' in window.navigator);
|
|
139
|
+
return isTouchDevice;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/** @param {MouseEvent} event */
|
|
143
|
+
_dragStartHandler = (event) => {
|
|
144
|
+
if (this._shouldAbort()) { return true; }
|
|
145
|
+
|
|
146
|
+
// mousedown, left click, check propagation
|
|
147
|
+
if (event.which > 1 ||
|
|
148
|
+
(!this.settings.acceptPropagatedEvent && event.target != this.handling_element[0])) {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Initial coordinates will be the last when dragging
|
|
153
|
+
this.lastCoord = this.firstCoord = left_top(event);
|
|
154
|
+
|
|
155
|
+
this.handling_element
|
|
156
|
+
.on(this.settings.dragcontinue, this._dragContinueHandler)
|
|
157
|
+
//.on(this.settings.dragend, this._dragEndHandler)
|
|
158
|
+
;
|
|
159
|
+
|
|
160
|
+
// Note, we bind using addEventListener so we can use "capture" binding
|
|
161
|
+
// instead of "bubble" binding
|
|
162
|
+
this.settings.dragend.split(' ').forEach(event_name => {
|
|
163
|
+
this.handling_element[0].addEventListener(event_name, this._dragEndHandler, true);
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
if (this.settings.preventDefault) {
|
|
167
|
+
event.preventDefault();
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/** @param {MouseEvent} event */
|
|
173
|
+
_dragContinueHandler = (event) => { // User is dragging
|
|
174
|
+
// console.log('drag continue');
|
|
175
|
+
if (this._shouldAbort()) { return true; }
|
|
176
|
+
|
|
177
|
+
const lt = left_top(event);
|
|
178
|
+
|
|
179
|
+
// How much did the mouse move?
|
|
180
|
+
const delta = {
|
|
181
|
+
left: (lt.left - this.lastCoord.left),
|
|
182
|
+
top: (lt.top - this.lastCoord.top),
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
const scrollTarget = this.settings.scrollWindow ? $(window) : this.handling_element;
|
|
186
|
+
|
|
187
|
+
// Set the scroll position relative to what ever the scroll is now
|
|
188
|
+
scrollTarget.scrollLeft( scrollTarget.scrollLeft() - delta.left );
|
|
189
|
+
scrollTarget.scrollTop( scrollTarget.scrollTop() - delta.top );
|
|
190
|
+
|
|
191
|
+
// Save where the cursor is
|
|
192
|
+
this.lastCoord = lt;
|
|
193
|
+
|
|
194
|
+
if (this.settings.preventDefault) {
|
|
195
|
+
event.preventDefault();
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/** @param {MouseEvent} event */
|
|
201
|
+
_dragEndHandler = (event) => { // Stop scrolling
|
|
202
|
+
//console.log('dragEndHandler');
|
|
203
|
+
|
|
204
|
+
if (this._shouldAbort()) { return true; }
|
|
205
|
+
|
|
206
|
+
this.handling_element
|
|
207
|
+
.off(this.settings.dragcontinue)
|
|
208
|
+
// Note, for some reason, even though I removeEventListener below,
|
|
209
|
+
// this call to unbind is still necessary. I don't know why.
|
|
210
|
+
.off(this.settings.dragend);
|
|
211
|
+
|
|
212
|
+
// Note, we bind using addEventListener so we can use "capture" binding
|
|
213
|
+
// instead of "bubble" binding
|
|
214
|
+
this.settings.dragend.split(' ').forEach(event_name => {
|
|
215
|
+
this.handling_element[0].removeEventListener(event_name, this._dragEndHandler, true);
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
// How much did the mouse move total?
|
|
219
|
+
const delta = {
|
|
220
|
+
left: Math.abs(this.lastCoord.left - this.firstCoord.left),
|
|
221
|
+
top: Math.abs(this.lastCoord.top - this.firstCoord.top),
|
|
222
|
+
};
|
|
223
|
+
const distance = Math.max(delta.left, delta.top);
|
|
224
|
+
|
|
225
|
+
// Allow event to propagate if min distance was not achieved
|
|
226
|
+
if (this.settings.preventDefault && distance > this.settings.dragMinDistance) {
|
|
227
|
+
event.preventDefault();
|
|
228
|
+
event.stopImmediatePropagation();
|
|
229
|
+
event.stopPropagation();
|
|
230
|
+
return false;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -7,8 +7,10 @@
|
|
|
7
7
|
/** @typedef {import("./BookModel").BookModel} BookModel */
|
|
8
8
|
/** @typedef {import("./BookModel").PageIndex} PageIndex */
|
|
9
9
|
/** @typedef {import("./ReduceSet").ReduceSet} ReduceSet */
|
|
10
|
+
/** @typedef {import("./options").BookReaderOptions} BookReaderOptions */
|
|
10
11
|
|
|
11
|
-
import { Pow2ReduceSet } from "./ReduceSet";
|
|
12
|
+
import { Pow2ReduceSet } from "./ReduceSet.js";
|
|
13
|
+
import { DEFAULT_OPTIONS } from "./options.js";
|
|
12
14
|
|
|
13
15
|
export class ImageCache {
|
|
14
16
|
/**
|
|
@@ -16,11 +18,25 @@ export class ImageCache {
|
|
|
16
18
|
* @param {object} opts
|
|
17
19
|
* @param {boolean} [opts.useSrcSet]
|
|
18
20
|
* @param {ReduceSet} [opts.reduceSet]
|
|
21
|
+
* @param {BookReaderOptions['renderPageURI']} [opts.renderPageURI]
|
|
19
22
|
*/
|
|
20
|
-
constructor(
|
|
23
|
+
constructor(
|
|
24
|
+
book,
|
|
25
|
+
{
|
|
26
|
+
useSrcSet = false,
|
|
27
|
+
reduceSet = Pow2ReduceSet,
|
|
28
|
+
renderPageURI = DEFAULT_OPTIONS.renderPageURI,
|
|
29
|
+
} = {},
|
|
30
|
+
) {
|
|
31
|
+
/** @type {BookModel} */
|
|
21
32
|
this.book = book;
|
|
33
|
+
/** @type {boolean} */
|
|
22
34
|
this.useSrcSet = useSrcSet;
|
|
35
|
+
/** @type {ReduceSet} */
|
|
23
36
|
this.reduceSet = reduceSet;
|
|
37
|
+
/** @type {BookReaderOptions['renderPageURI']} */
|
|
38
|
+
this.renderPageURI = renderPageURI;
|
|
39
|
+
|
|
24
40
|
/** @type {{ [index: number]: { reduce: number, loaded: boolean }[] }} */
|
|
25
41
|
this.cache = {};
|
|
26
42
|
this.defaultScale = 8;
|
|
@@ -33,19 +49,35 @@ export class ImageCache {
|
|
|
33
49
|
*
|
|
34
50
|
* @param {PageIndex} index
|
|
35
51
|
* @param {Number} reduce
|
|
52
|
+
* @param {HTMLImageElement?} [img]
|
|
36
53
|
*/
|
|
37
|
-
image(index, reduce) {
|
|
54
|
+
image(index, reduce, img = null) {
|
|
55
|
+
const finalReduce = this.getFinalReduce(index, reduce);
|
|
56
|
+
return this._serveImageElement(index, finalReduce, img);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Get the final reduce factor to use for the given index
|
|
61
|
+
*
|
|
62
|
+
* @param {PageIndex} index
|
|
63
|
+
* @param {Number} reduce
|
|
64
|
+
*/
|
|
65
|
+
getFinalReduce(index, reduce) {
|
|
38
66
|
const cachedImages = this.cache[index] || [];
|
|
39
67
|
const sufficientImages = cachedImages
|
|
40
68
|
.filter(x => x.loaded && x.reduce <= reduce);
|
|
69
|
+
|
|
41
70
|
if (sufficientImages.length) {
|
|
42
71
|
// Choose the largest reduction factor that meets our needs
|
|
43
72
|
const bestReduce = Math.max(...sufficientImages.map(e => e.reduce));
|
|
44
|
-
|
|
73
|
+
// Don't need to floor here, since we know the image is in the cache
|
|
74
|
+
// and hence was already floor'd by the below `else` clause before
|
|
75
|
+
// it was added
|
|
76
|
+
return bestReduce;
|
|
45
77
|
} else {
|
|
46
78
|
// Don't use a cache entry; i.e. a fresh fetch will be made
|
|
47
79
|
// for this reduce
|
|
48
|
-
return this.
|
|
80
|
+
return this.reduceSet.floor(reduce);
|
|
49
81
|
}
|
|
50
82
|
}
|
|
51
83
|
|
|
@@ -87,26 +119,27 @@ export class ImageCache {
|
|
|
87
119
|
*
|
|
88
120
|
* @param {PageIndex} index
|
|
89
121
|
* @param {number} reduce
|
|
122
|
+
* @param {HTMLImageElement?} [img]
|
|
90
123
|
* @returns {JQuery<HTMLImageElement>} with base image classes
|
|
91
124
|
*/
|
|
92
|
-
_serveImageElement(index, reduce) {
|
|
93
|
-
|
|
94
|
-
let cacheEntry = this.cache[index]?.find(e => e.reduce == validReduce);
|
|
125
|
+
_serveImageElement(index, reduce, img = null) {
|
|
126
|
+
let cacheEntry = this.cache[index]?.find(e => e.reduce == reduce);
|
|
95
127
|
if (!cacheEntry) {
|
|
96
|
-
cacheEntry = { reduce
|
|
128
|
+
cacheEntry = { reduce, loaded: false };
|
|
97
129
|
const entries = this.cache[index] || (this.cache[index] = []);
|
|
98
130
|
entries.push(cacheEntry);
|
|
99
131
|
}
|
|
100
132
|
const page = this.book.getPage(index);
|
|
101
133
|
|
|
102
|
-
const
|
|
103
|
-
|
|
104
|
-
'
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
.data('
|
|
134
|
+
const uri = page.getURI(reduce, 0);
|
|
135
|
+
const $img = $(img || document.createElement('img'))
|
|
136
|
+
.addClass('BRpageimage')
|
|
137
|
+
.attr('alt', 'Book page image')
|
|
138
|
+
.data('reduce', reduce)
|
|
139
|
+
.data('src', uri);
|
|
140
|
+
this.renderPageURI($img[0], uri);
|
|
108
141
|
if (this.useSrcSet) {
|
|
109
|
-
$img.attr('srcset', page.getURISrcSet(
|
|
142
|
+
$img.attr('srcset', page.getURISrcSet(reduce));
|
|
110
143
|
}
|
|
111
144
|
if (!cacheEntry.loaded) {
|
|
112
145
|
$img.one('load', () => cacheEntry.loaded = true);
|