@internetarchive/bookreader 5.0.0-12-fixsorting-8 → 5.0.0-121
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 +670 -1190
- 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-template.js +1 -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 +199 -0
- package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +811 -0
- package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +437 -0
- package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/styles/annotator.css +4 -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 +3 -0
- package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
- package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +14 -0
- package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
- package/BookReader/hypothesis/build/styles/sidebar.css +4 -0
- package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
- package/BookReader/hypothesis/build/styles/ui-playground.css +4 -0
- package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
- package/BookReader/hypothesis/package.json +126 -0
- package/BookReader/ia-bookreader.js +1886 -0
- package/BookReader/{BookReader.js.LICENSE.txt → ia-bookreader.js.LICENSE.txt} +26 -20
- package/BookReader/ia-bookreader.js.map +1 -0
- package/BookReader/icons/1up.svg +1 -12
- package/BookReader/icons/2up.svg +1 -15
- package/BookReader/icons/advance.svg +3 -26
- 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 -17
- package/BookReader/icons/fullscreen_exit.svg +1 -17
- package/BookReader/icons/hamburger.svg +1 -15
- package/BookReader/icons/left-arrow.svg +1 -12
- package/BookReader/icons/magnify-minus.svg +1 -16
- package/BookReader/icons/magnify-plus.svg +1 -17
- package/BookReader/icons/magnify.svg +1 -15
- package/BookReader/icons/pause.svg +1 -23
- package/BookReader/icons/play.svg +1 -22
- package/BookReader/icons/playback-speed.svg +1 -34
- package/BookReader/icons/read-aloud.svg +1 -22
- package/BookReader/icons/review.svg +3 -22
- package/BookReader/icons/slider-toggle.svg +1 -0
- package/BookReader/icons/thumbnails.svg +1 -17
- package/BookReader/icons/voice.svg +1 -0
- package/BookReader/icons/volume-full.svg +1 -22
- package/BookReader/images/BRicons.svg +5 -94
- package/BookReader/images/books_graphic.svg +1 -177
- package/BookReader/images/hypothesis.ico +0 -0
- package/BookReader/images/icon_book.svg +1 -12
- package/BookReader/images/icon_bookmark.svg +1 -12
- package/BookReader/images/icon_experiment.svg +1 -0
- package/BookReader/images/icon_gear.svg +1 -14
- package/BookReader/images/icon_hamburger.svg +1 -20
- package/BookReader/images/icon_home.svg +1 -21
- package/BookReader/images/icon_info.svg +1 -11
- package/BookReader/images/icon_one_page.svg +1 -8
- package/BookReader/images/icon_pause.svg +1 -1
- package/BookReader/images/icon_play.svg +1 -1
- package/BookReader/images/icon_playback-rate.svg +1 -15
- package/BookReader/images/icon_search_button.svg +1 -8
- package/BookReader/images/icon_share.svg +1 -9
- package/BookReader/images/icon_skip-ahead.svg +1 -6
- package/BookReader/images/icon_skip-back.svg +2 -13
- package/BookReader/images/icon_speaker.svg +1 -18
- package/BookReader/images/icon_speaker_open.svg +1 -10
- package/BookReader/images/icon_thumbnails.svg +1 -12
- package/BookReader/images/icon_toc.svg +1 -5
- package/BookReader/images/icon_two_pages.svg +1 -9
- package/BookReader/images/marker_chap-off.svg +1 -11
- package/BookReader/images/marker_chap-on.svg +1 -11
- package/BookReader/images/marker_srch-on.svg +1 -11
- 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 -172
- package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
- package/BookReader/plugins/plugin.autoplay.js +1 -165
- package/BookReader/plugins/plugin.autoplay.js.map +1 -1
- package/BookReader/plugins/plugin.chapters.js +19 -301
- 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 -74
- 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 -368
- package/BookReader/plugins/plugin.resume.js.map +1 -1
- package/BookReader/plugins/plugin.search.js +2 -1385
- 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 -1080
- 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 +3 -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 +2 -9193
- 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 -269
- package/BookReader/plugins/plugin.url.js.map +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
- 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 +17 -4
- package/dist/esm/ia-bookreader.js +3 -0
- package/dist/esm/ia-bookreader.js.LICENSE.txt +17 -0
- package/dist/esm/ia-bookreader.js.map +1 -0
- package/dist/esm/plugins/plugin.archive_analytics.js +2 -0
- package/dist/esm/plugins/plugin.archive_analytics.js.map +1 -0
- package/dist/esm/plugins/plugin.autoplay.js +2 -0
- package/dist/esm/plugins/plugin.autoplay.js.map +1 -0
- package/dist/esm/plugins/plugin.chapters.js +2 -0
- package/dist/esm/plugins/plugin.chapters.js.map +1 -0
- package/dist/esm/plugins/plugin.experiments.js +2 -0
- package/dist/esm/plugins/plugin.experiments.js.map +1 -0
- package/dist/esm/plugins/plugin.iframe.js +2 -0
- package/dist/esm/plugins/plugin.iframe.js.map +1 -0
- package/dist/esm/plugins/plugin.iiif.js +2 -0
- package/dist/esm/plugins/plugin.iiif.js.map +1 -0
- package/dist/esm/plugins/plugin.resume.js +2 -0
- package/dist/esm/plugins/plugin.resume.js.map +1 -0
- package/dist/esm/plugins/plugin.search.js +2 -0
- package/dist/esm/plugins/plugin.search.js.map +1 -0
- package/dist/esm/plugins/plugin.text_selection.js +2 -0
- package/dist/esm/plugins/plugin.text_selection.js.map +1 -0
- package/dist/esm/plugins/plugin.translate.js +2 -0
- package/dist/esm/plugins/plugin.translate.js.map +1 -0
- package/dist/esm/plugins/plugin.tts.js +2 -0
- package/dist/esm/plugins/plugin.tts.js.map +1 -0
- package/dist/esm/plugins/plugin.url.js +2 -0
- package/dist/esm/plugins/plugin.url.js.map +1 -0
- package/dist/esm/plugins/plugin.vendor-fullscreen.js +2 -0
- package/dist/esm/plugins/plugin.vendor-fullscreen.js.map +1 -0
- package/jsconfig.json +18 -0
- package/package.json +113 -71
- 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 +66 -365
- package/src/BookReader/Mode1UpLit.js +392 -0
- package/src/BookReader/Mode2Up.js +87 -1315
- package/src/BookReader/Mode2UpLit.js +786 -0
- package/src/BookReader/ModeAbstract.js +43 -0
- package/src/BookReader/ModeCoordinateSpace.js +29 -0
- package/src/BookReader/ModeSmoothZoom.js +312 -0
- package/src/BookReader/ModeThumb.js +29 -15
- package/src/BookReader/Navbar/Navbar.js +204 -84
- 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 +3 -3
- package/src/BookReader/options.js +105 -18
- package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
- package/src/BookReader/utils/ScrollClassAdder.js +31 -0
- package/src/BookReader/utils/SelectionObserver.js +72 -0
- package/src/BookReader/utils/classes.js +1 -1
- package/src/BookReader/utils.js +136 -12
- package/src/BookReader.js +732 -1231
- 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/slider-toggle.svg +1 -0
- 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 +74 -70
- package/src/css/_BRpages.scss +174 -42
- package/src/css/_BRsearch.scss +69 -30
- package/src/css/_BRtoolbar.scss +5 -5
- package/src/css/_TextSelection.scss +249 -25
- package/src/css/_colorbox.scss +2 -2
- package/src/css/_controls.scss +24 -7
- package/src/css/_icons.scss +8 -1
- package/src/{BookNavigator/assets → css}/button-base.js +2 -2
- package/src/css/icon_checkmark.js +9 -0
- package/src/css/sharedStyles.js +15 -0
- package/src/ia-bookreader/downloads/downloads-provider.js +81 -0
- package/src/{BookNavigator → ia-bookreader}/downloads/downloads.js +25 -5
- package/src/ia-bookreader/ia-bookreader.js +686 -0
- package/src/ia-bookreader/sharing.js +27 -0
- package/src/ia-bookreader/viewable-files.js +98 -0
- package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments-provider.js +17 -17
- package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments.js +75 -67
- package/src/{BookNavigator → plugins}/bookmarks/bookmark-button.js +4 -3
- package/src/{BookNavigator/assets → plugins/bookmarks}/bookmark-colors.js +1 -1
- package/src/{BookNavigator → plugins}/bookmarks/bookmark-edit.js +43 -31
- package/src/{BookNavigator → plugins}/bookmarks/bookmarks-list.js +48 -49
- package/src/{BookNavigator → plugins}/bookmarks/bookmarks-loginCTA.js +3 -3
- package/src/plugins/bookmarks/bookmarks-provider.js +63 -0
- package/src/{BookNavigator → plugins/bookmarks}/delete-modal-actions.js +1 -1
- package/src/{BookNavigator → plugins}/bookmarks/ia-bookmarks.js +117 -68
- package/src/plugins/plugin.archive_analytics.js +84 -78
- package/src/plugins/plugin.autoplay.js +99 -104
- package/src/plugins/plugin.chapters.js +323 -205
- package/src/plugins/plugin.experiments.js +375 -0
- package/src/plugins/plugin.iframe.js +36 -37
- package/src/plugins/plugin.iiif.js +147 -0
- package/src/plugins/plugin.resume.js +54 -51
- package/src/plugins/plugin.text_selection.js +464 -219
- package/src/plugins/plugin.vendor-fullscreen.js +5 -5
- package/src/plugins/search/plugin.search.js +347 -397
- package/src/{BookNavigator → plugins}/search/search-provider.js +59 -27
- package/src/{BookNavigator → plugins}/search/search-results.js +105 -76
- package/src/plugins/search/utils.js +50 -0
- package/src/plugins/search/view.js +51 -69
- package/src/plugins/translate/TranslationManager.js +164 -0
- package/src/plugins/translate/plugin.translate.js +559 -0
- package/src/plugins/tts/AbstractTTSEngine.js +78 -49
- package/src/plugins/tts/FestivalTTSEngine.js +20 -30
- package/src/plugins/tts/PageChunk.js +117 -23
- package/src/plugins/tts/PageChunkIterator.js +11 -17
- package/src/plugins/tts/WebTTSEngine.js +132 -92
- package/src/plugins/tts/plugin.tts.js +341 -351
- package/src/plugins/tts/utils.js +76 -67
- package/src/plugins/url/UrlPlugin.js +213 -0
- package/src/plugins/{plugin.url.js → url/plugin.url.js} +54 -18
- package/src/util/TextSelectionManager.js +1471 -0
- package/src/util/browserSniffing.js +42 -1
- package/src/util/cache.js +20 -0
- package/src/util/docCookies.js +21 -2
- package/src/util/dom.js +88 -0
- package/src/util/generators.js +89 -0
- package/src/util/lit.js +15 -0
- package/src/util/strings.js +11 -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.js +0 -21613
- package/BookReader/BookReader.js.map +0 -1
- package/BookReader/bookreader-component-bundle.js +0 -14497
- 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 -108
- package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
- package/BookReader/plugins/plugin.menu_toggle.js +0 -369
- package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
- package/BookReader/plugins/plugin.mobile_nav.js +0 -335
- 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 -499
- 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 -459
- package/src/BookNavigator/assets/book-loader.js +0 -27
- package/src/BookNavigator/assets/icon_checkmark.js +0 -6
- package/src/BookNavigator/assets/icon_close.js +0 -3
- package/src/BookNavigator/assets/icon_sort_ascending.js +0 -5
- package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
- package/src/BookNavigator/assets/icon_sort_neutral.js +0 -5
- package/src/BookNavigator/assets/icon_volumes.js +0 -11
- package/src/BookNavigator/bookmarks/bookmarks-provider.js +0 -53
- package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
- package/src/BookNavigator/downloads/downloads-provider.js +0 -66
- package/src/BookNavigator/search/a-search-result.js +0 -55
- package/src/BookNavigator/volumes/volumes-provider.js +0 -83
- package/src/BookNavigator/volumes/volumes.js +0 -178
- 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 -33
- 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 -139
- 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/sharing/sharing-provider.test.js +0 -40
- package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
- package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +0 -141
- package/tests/karma/BookNavigator/volumes/volumes.test.js +0 -98
- 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
|
@@ -53,12 +53,17 @@ export class Toolbar {
|
|
|
53
53
|
$('<a>')
|
|
54
54
|
.attr({href: br.bookUrl, title: br.bookUrlTitle})
|
|
55
55
|
.addClass('BRreturn')
|
|
56
|
-
.html(br.bookUrlText || br.bookTitle)
|
|
56
|
+
.html(br.bookUrlText || br.bookTitle),
|
|
57
57
|
);
|
|
58
58
|
} else if (br.bookTitle) {
|
|
59
59
|
$titleSectionEl.append(br.bookUrlText || br.bookTitle);
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
// Call _bindNavigationHandlers on the plugins
|
|
63
|
+
for (const plugin of Object.values(br.plugins)) {
|
|
64
|
+
plugin._configureToolbar(br.refs.$BRtoolbar);
|
|
65
|
+
}
|
|
66
|
+
|
|
62
67
|
// const $hamburger = br.refs.$BRtoolbar.find('BRtoolbarHamburger');
|
|
63
68
|
return br.refs.$BRtoolbar;
|
|
64
69
|
}
|
|
@@ -75,8 +80,6 @@ export class Toolbar {
|
|
|
75
80
|
br.$('.BRnavCntl').addClass('BRup');
|
|
76
81
|
br.$('.pause').hide();
|
|
77
82
|
|
|
78
|
-
this.updateToolbarZoom(br.reduce); // Pretty format
|
|
79
|
-
|
|
80
83
|
// We build in mode 2
|
|
81
84
|
br.refs.$BRtoolbar.append();
|
|
82
85
|
|
|
@@ -115,7 +118,7 @@ export class Toolbar {
|
|
|
115
118
|
onLoad: () => {
|
|
116
119
|
br.trigger(EVENTS.stop);
|
|
117
120
|
br.$('.BRpageviewValue').val(window.location.href);
|
|
118
|
-
}
|
|
121
|
+
},
|
|
119
122
|
});
|
|
120
123
|
br.$('.info').colorbox({
|
|
121
124
|
inline: true,
|
|
@@ -123,35 +126,10 @@ export class Toolbar {
|
|
|
123
126
|
href: br.$('.BRinfo'),
|
|
124
127
|
onLoad: () => {
|
|
125
128
|
br.trigger(EVENTS.stop);
|
|
126
|
-
}
|
|
129
|
+
},
|
|
127
130
|
});
|
|
128
131
|
}
|
|
129
132
|
|
|
130
|
-
/**
|
|
131
|
-
* @deprecated
|
|
132
|
-
* @todo .BRzoom doesn't exist anywhere, so this is likely dead code
|
|
133
|
-
* Update the displayed zoom factor based on reduction factor
|
|
134
|
-
* @param {number} reduce
|
|
135
|
-
*/
|
|
136
|
-
updateToolbarZoom(reduce) {
|
|
137
|
-
const { br } = this;
|
|
138
|
-
// $$$ TODO preserve zoom/fit for each mode
|
|
139
|
-
const autofit = br.mode == br.constMode2up ? br.twoPage.autofit : br.onePage.autofit;
|
|
140
|
-
/** @type {string} */
|
|
141
|
-
let value;
|
|
142
|
-
if (autofit) {
|
|
143
|
-
value = autofit.slice(0,1).toUpperCase() + autofit.slice(1);
|
|
144
|
-
} else {
|
|
145
|
-
value = (100 / reduce)
|
|
146
|
-
.toFixed(2)
|
|
147
|
-
// Strip trailing zeroes and decimal if all zeroes
|
|
148
|
-
.replace(/0+$/,'')
|
|
149
|
-
.replace(/\.$/,'')
|
|
150
|
-
+ '%';
|
|
151
|
-
}
|
|
152
|
-
br.$('.BRzoom').text(value);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
133
|
/**
|
|
156
134
|
* @param {JQuery} $shareDiv
|
|
157
135
|
*/
|
|
@@ -212,11 +190,11 @@ export class Toolbar {
|
|
|
212
190
|
$form.appendTo($shareDiv);
|
|
213
191
|
|
|
214
192
|
$form.find('.fieldset-embed input').on('change', event => {
|
|
215
|
-
const form = $(event.target).parents('form
|
|
193
|
+
const form = $(event.target).parents('form').first();
|
|
216
194
|
const params = {};
|
|
217
195
|
params.mode = $(form.find('.fieldset-embed input[name=pages]:checked')).val();
|
|
218
196
|
if (form.find('.fieldset-embed input[name=thispage]').prop('checked')) {
|
|
219
|
-
params.page = br.getPageNum(br.currentIndex());
|
|
197
|
+
params.page = br.book.getPageNum(br.currentIndex());
|
|
220
198
|
}
|
|
221
199
|
|
|
222
200
|
if (br.getEmbedCode) {
|
|
@@ -232,20 +210,20 @@ export class Toolbar {
|
|
|
232
210
|
// Bind share buttons
|
|
233
211
|
|
|
234
212
|
// Use url without hashes
|
|
235
|
-
$form.find('.facebook-share-button').click(
|
|
213
|
+
$form.find('.facebook-share-button').on("click", () => {
|
|
236
214
|
const params = $.param({ u: this._getSocialShareUrl() });
|
|
237
215
|
const url = 'https://www.facebook.com/sharer.php?' + params;
|
|
238
216
|
createPopup(url, 600, 400, 'Share');
|
|
239
217
|
});
|
|
240
|
-
$form.find('.twitter-share-button').click(
|
|
218
|
+
$form.find('.twitter-share-button').on("click", () => {
|
|
241
219
|
const params = $.param({
|
|
242
220
|
url: this._getSocialShareUrl(),
|
|
243
|
-
text: br.bookTitle
|
|
221
|
+
text: br.bookTitle,
|
|
244
222
|
});
|
|
245
223
|
const url = 'https://twitter.com/intent/tweet?' + params;
|
|
246
224
|
createPopup(url, 600, 400, 'Share');
|
|
247
225
|
});
|
|
248
|
-
$form.find('.email-share-button').click(
|
|
226
|
+
$form.find('.email-share-button').on("click", () => {
|
|
249
227
|
const body = `${br.bookTitle}\n\n${this._getSocialShareUrl()}`;
|
|
250
228
|
window.location.href = `mailto:?subject=${encodeURI(br.bookTitle)}&body=${encodeURI(body)}`;
|
|
251
229
|
});
|
|
@@ -331,11 +309,11 @@ export class Toolbar {
|
|
|
331
309
|
}
|
|
332
310
|
}
|
|
333
311
|
|
|
334
|
-
|
|
312
|
+
function blankInfoDiv() {
|
|
335
313
|
return $(`
|
|
336
314
|
<div class="BRfloat BRinfo">
|
|
337
315
|
<div class="BRfloatHead">About this book
|
|
338
|
-
<button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="shift">Close</span></button>
|
|
316
|
+
<button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="br-colorbox-shift">Close</span></button>
|
|
339
317
|
</div>
|
|
340
318
|
<div class="BRfloatBody">
|
|
341
319
|
<div class="BRfloatCover"></div>
|
|
@@ -351,12 +329,12 @@ export function blankInfoDiv() {
|
|
|
351
329
|
</div>`);
|
|
352
330
|
}
|
|
353
331
|
|
|
354
|
-
|
|
332
|
+
function blankShareDiv() {
|
|
355
333
|
return $(`
|
|
356
334
|
<div class="BRfloat BRshare">
|
|
357
335
|
<div class="BRfloatHead">
|
|
358
336
|
Share
|
|
359
|
-
<button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="shift">Close</span></button>
|
|
337
|
+
<button class="floatShut" href="javascript:;" onclick="$.fn.colorbox.close();"><span class="br-colorbox-shift">Close</span></button>
|
|
360
338
|
</div>
|
|
361
339
|
</div>`);
|
|
362
340
|
}
|
package/src/BookReader/events.js
CHANGED
|
@@ -3,11 +3,12 @@ export const EVENTS = {
|
|
|
3
3
|
/** Indicates that the fragment (a serialization of the reader
|
|
4
4
|
* state) has changed. */
|
|
5
5
|
fragmentChange: 'fragmentChange',
|
|
6
|
+
pageChanged: 'pageChanged',
|
|
7
|
+
beforePageChanged: 'beforePageChanged',
|
|
6
8
|
PostInit: 'PostInit',
|
|
7
9
|
stop: 'stop',
|
|
8
10
|
resize: 'resize',
|
|
9
|
-
//
|
|
10
|
-
navToggled: 'navToggled',
|
|
11
|
+
userAction: 'userAction', // event to know if user is actively reading
|
|
11
12
|
// menu click events
|
|
12
13
|
fullscreenToggled: 'fullscreenToggled',
|
|
13
14
|
zoomOut: 'zoomOut',
|
|
@@ -16,5 +17,4 @@ export const EVENTS = {
|
|
|
16
17
|
'2PageViewSelected': '2PageViewSelected',
|
|
17
18
|
/* currently 3 represents thumbnail view */
|
|
18
19
|
'3PageViewSelected': '3PageViewSelected',
|
|
19
|
-
mobileNavOpen: 'mobileNavOpen',
|
|
20
20
|
};
|
|
@@ -1,5 +1,8 @@
|
|
|
1
|
+
// @ts-check
|
|
1
2
|
/** @typedef {import('./BookModel.js').PageNumString} PageNumString */
|
|
2
3
|
/** @typedef {import('./BookModel.js').LeafNum} LeafNum */
|
|
4
|
+
/** @typedef {import('./BookModel.js').PageModel} PageModel */
|
|
5
|
+
/** @typedef {import('./BookModel.js').PageIndex} PageIndex */
|
|
3
6
|
|
|
4
7
|
export const DEFAULT_OPTIONS = {
|
|
5
8
|
/**
|
|
@@ -25,9 +28,13 @@ export const DEFAULT_OPTIONS = {
|
|
|
25
28
|
thumbMaxLoading: 4,
|
|
26
29
|
/** spacing between thumbnails */
|
|
27
30
|
thumbPadding: 10,
|
|
31
|
+
/** min zoom in columns */
|
|
32
|
+
thumbMinZoomColumns: 2,
|
|
33
|
+
/** max zoom out columns */
|
|
34
|
+
thumbMaxZoomColumns: 8,
|
|
28
35
|
|
|
29
36
|
/** @type {number | 'fast' | 'slow'} speed for flip animation */
|
|
30
|
-
flipSpeed:
|
|
37
|
+
flipSpeed: 400,
|
|
31
38
|
|
|
32
39
|
showToolbar: true,
|
|
33
40
|
showNavbar: true,
|
|
@@ -61,7 +68,7 @@ export const DEFAULT_OPTIONS = {
|
|
|
61
68
|
{reduce: 2, autofit: null},
|
|
62
69
|
{reduce: 3, autofit: null},
|
|
63
70
|
{reduce: 4, autofit: null},
|
|
64
|
-
{reduce: 6, autofit: null}
|
|
71
|
+
{reduce: 6, autofit: null},
|
|
65
72
|
],
|
|
66
73
|
|
|
67
74
|
/** Object to hold parameters related to 1up mode */
|
|
@@ -79,7 +86,7 @@ export const DEFAULT_OPTIONS = {
|
|
|
79
86
|
/** Width of book spine $$$ consider sizing based on book length */
|
|
80
87
|
bookSpineDivWidth: 64,
|
|
81
88
|
/** @type {AutoFitValues} */
|
|
82
|
-
autofit: 'auto'
|
|
89
|
+
autofit: 'auto',
|
|
83
90
|
},
|
|
84
91
|
|
|
85
92
|
onePageMinBreakpoint: 800,
|
|
@@ -92,6 +99,11 @@ export const DEFAULT_OPTIONS = {
|
|
|
92
99
|
/** @type {string} */
|
|
93
100
|
bookUrlTitle: null,
|
|
94
101
|
enableBookTitleLink: true,
|
|
102
|
+
/**
|
|
103
|
+
* @type {string} A globally unique URI for the book. This is used to
|
|
104
|
+
* save data like annotations the user makes to the book.
|
|
105
|
+
*/
|
|
106
|
+
bookUri: null,
|
|
95
107
|
/**
|
|
96
108
|
* @type {string} language in ISO 639-1 (PRIVATE: Will also
|
|
97
109
|
* handle language name in English, native name, 639-2/T, or 639-2/B . (archive.org books
|
|
@@ -118,7 +130,7 @@ export const DEFAULT_OPTIONS = {
|
|
|
118
130
|
enableExperimentalControls: false,
|
|
119
131
|
|
|
120
132
|
/** CSS selectors */
|
|
121
|
-
/** Where BookReader mounts to */
|
|
133
|
+
/** @type {string | HTMLElement} Where BookReader mounts to; a CSS selector or an element */
|
|
122
134
|
el: '#BookReader',
|
|
123
135
|
|
|
124
136
|
/** @type {'lr' | 'rl'} Page progression */
|
|
@@ -136,8 +148,26 @@ export const DEFAULT_OPTIONS = {
|
|
|
136
148
|
* but going forward we'll keep them here.
|
|
137
149
|
**/
|
|
138
150
|
plugins: {
|
|
139
|
-
/** @type {import('../plugins/plugin.
|
|
140
|
-
|
|
151
|
+
/** @type {Partial<import('../plugins/plugin.archive_analytics.js').ArchiveAnalyticsPlugin['options'>]}*/
|
|
152
|
+
archiveAnalytics: {},
|
|
153
|
+
/** @type {Partial<import('../plugins/plugin.autoplay.js').AutoplayPlugin['options'>]}*/
|
|
154
|
+
autoplay: {},
|
|
155
|
+
/** @type {Partial<import('../plugins/plugin.chapters.js').ChaptersPlugin['options']>} */
|
|
156
|
+
chapters: {},
|
|
157
|
+
/** @type {Partial<import('../plugins/plugin.experiments.js').ExperimentsPlugin['options']>} */
|
|
158
|
+
experiments: {},
|
|
159
|
+
/** @type {Partial<import('../plugins/plugin.iiif.js').IiifPlugin['options']>} */
|
|
160
|
+
iiif: {},
|
|
161
|
+
/** @type {Partial<import('../plugins/plugin.resume.js').ResumePlugin['options']>} */
|
|
162
|
+
resume: {},
|
|
163
|
+
/** @type {Partial<import('../plugins/search/plugin.search.js').SearchPlugin['options']>} */
|
|
164
|
+
search: {},
|
|
165
|
+
/** @type {Partial<import('../plugins/plugin.text_selection.js').TextSelectionPlugin['options']>} */
|
|
166
|
+
textSelection: {},
|
|
167
|
+
/** @type {Partial<import('../plugins/translate/plugin.translate.js').TranslatePlugin['options']>} */
|
|
168
|
+
translate: {},
|
|
169
|
+
/** @type {Partial<import('../plugins/tts/plugin.tts.js').TtsPlugin['options']>} */
|
|
170
|
+
tts: {},
|
|
141
171
|
},
|
|
142
172
|
|
|
143
173
|
/**
|
|
@@ -176,15 +206,39 @@ export const DEFAULT_OPTIONS = {
|
|
|
176
206
|
*/
|
|
177
207
|
data: [],
|
|
178
208
|
|
|
179
|
-
/**
|
|
209
|
+
/** @type {import('../plugins/plugin.chapters.js').TocEntry[]} */
|
|
210
|
+
table_of_contents: null,
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Advanced methods for page rendering.
|
|
214
|
+
* All option functions have their `this` object set to the BookReader instance.
|
|
215
|
+
**/
|
|
216
|
+
|
|
180
217
|
/** @type {() => number} */
|
|
181
218
|
getNumLeafs: null,
|
|
182
219
|
/** @type {(index: number) => number} */
|
|
183
220
|
getPageWidth: null,
|
|
184
221
|
/** @type {(index: number) => number} */
|
|
185
222
|
getPageHeight: null,
|
|
186
|
-
/** @type {(index: number, reduce: number, rotate: number) =>
|
|
223
|
+
/** @type {(index: number, reduce: number, rotate: number) => string} */
|
|
187
224
|
getPageURI: null,
|
|
225
|
+
/** @type {(page: PageModel) => Promise<PageIndex[]> | PageIndex[]} */
|
|
226
|
+
requestPage(page) {
|
|
227
|
+
return [];
|
|
228
|
+
},
|
|
229
|
+
/** @type {(textFragment: import('../util/TextSelectionManager.js').BookReaderTextFragment) => Promise<boolean> | boolean} */
|
|
230
|
+
verifyTextFragment(textFragment) {
|
|
231
|
+
return true;
|
|
232
|
+
},
|
|
233
|
+
|
|
234
|
+
/**
|
|
235
|
+
* @type {(img: HTMLImageElement, uri: string) => Promise<void> | void}
|
|
236
|
+
* Render the page URI into the image element. Perform any necessary preloading,
|
|
237
|
+
* authentication, etc.
|
|
238
|
+
*/
|
|
239
|
+
renderPageURI(img, uri) {
|
|
240
|
+
img.src = uri;
|
|
241
|
+
},
|
|
188
242
|
|
|
189
243
|
/**
|
|
190
244
|
* @type {(index: number) => 'L' | 'R'}
|
|
@@ -214,35 +268,41 @@ export const DEFAULT_OPTIONS = {
|
|
|
214
268
|
getEmbedCode: null,
|
|
215
269
|
|
|
216
270
|
controls: {
|
|
271
|
+
toggleSlider: {
|
|
272
|
+
visible: true,
|
|
273
|
+
label: 'Toggle page controls',
|
|
274
|
+
className: 'toggle_slider',
|
|
275
|
+
iconClassName: 'toggle-slider',
|
|
276
|
+
},
|
|
217
277
|
bookLeft: {
|
|
218
278
|
visible: true,
|
|
219
279
|
label: 'Flip left',
|
|
220
280
|
className: 'book_left',
|
|
221
|
-
iconClassName: 'left-arrow'
|
|
281
|
+
iconClassName: 'left-arrow',
|
|
222
282
|
},
|
|
223
283
|
bookRight: {
|
|
224
284
|
visible: true,
|
|
225
285
|
label: 'Flip right',
|
|
226
286
|
className: 'book_right',
|
|
227
|
-
iconClassName: 'left-arrow hflip'
|
|
287
|
+
iconClassName: 'left-arrow hflip',
|
|
228
288
|
},
|
|
229
289
|
onePage: {
|
|
230
290
|
visible: true,
|
|
231
291
|
label: 'One-page view',
|
|
232
292
|
className: 'onepg',
|
|
233
|
-
iconClassName: 'onepg'
|
|
293
|
+
iconClassName: 'onepg',
|
|
234
294
|
},
|
|
235
295
|
twoPage: {
|
|
236
296
|
visible: true,
|
|
237
297
|
label: 'Two-page view',
|
|
238
298
|
className: 'twopg',
|
|
239
|
-
iconClassName: 'twopg'
|
|
299
|
+
iconClassName: 'twopg',
|
|
240
300
|
},
|
|
241
301
|
thumbnail: {
|
|
242
302
|
visible: true,
|
|
243
303
|
label: 'Thumbnail view',
|
|
244
304
|
className: 'thumb',
|
|
245
|
-
iconClassName: 'thumb'
|
|
305
|
+
iconClassName: 'thumb',
|
|
246
306
|
},
|
|
247
307
|
viewmode: {
|
|
248
308
|
visible: true,
|
|
@@ -253,19 +313,19 @@ export const DEFAULT_OPTIONS = {
|
|
|
253
313
|
visible: true,
|
|
254
314
|
label: 'Zoom out',
|
|
255
315
|
className: 'zoom_out',
|
|
256
|
-
iconClassName: 'magnify'
|
|
316
|
+
iconClassName: 'magnify',
|
|
257
317
|
},
|
|
258
318
|
zoomIn: {
|
|
259
319
|
visible: true,
|
|
260
320
|
label: 'Zoom in',
|
|
261
321
|
className: 'zoom_in',
|
|
262
|
-
iconClassName: 'magnify plus'
|
|
322
|
+
iconClassName: 'magnify plus',
|
|
263
323
|
},
|
|
264
324
|
fullScreen: {
|
|
265
325
|
visible: true,
|
|
266
|
-
label: '
|
|
326
|
+
label: 'Go fullscreen',
|
|
267
327
|
className: 'full',
|
|
268
|
-
iconClassName: 'fullscreen'
|
|
328
|
+
iconClassName: 'fullscreen',
|
|
269
329
|
},
|
|
270
330
|
},
|
|
271
331
|
|
|
@@ -275,6 +335,12 @@ export const DEFAULT_OPTIONS = {
|
|
|
275
335
|
*/
|
|
276
336
|
startFullscreen: false,
|
|
277
337
|
|
|
338
|
+
/**
|
|
339
|
+
* @type {Boolean}
|
|
340
|
+
* will show logo at fullscreen mode
|
|
341
|
+
*/
|
|
342
|
+
enableFSLogoShortcut: false,
|
|
343
|
+
|
|
278
344
|
/**
|
|
279
345
|
* @type {Boolean}
|
|
280
346
|
* On init, by default, we want to handle resizing bookreader
|
|
@@ -288,9 +354,24 @@ export const DEFAULT_OPTIONS = {
|
|
|
288
354
|
* On init, by default, we want to use srcSet for images
|
|
289
355
|
*/
|
|
290
356
|
useSrcSet: false,
|
|
357
|
+
|
|
358
|
+
/**
|
|
359
|
+
* @type {string}
|
|
360
|
+
* Path to the image to display when a page is unviewable (i.e. when
|
|
361
|
+
* displaying a preview of a book).
|
|
362
|
+
*
|
|
363
|
+
* Relative to the imagesBaseURL if a relative path is specified.
|
|
364
|
+
*/
|
|
365
|
+
unviewablePageURI: './unviewable_page.png',
|
|
291
366
|
};
|
|
292
367
|
|
|
293
|
-
/**
|
|
368
|
+
/**
|
|
369
|
+
* @typedef {'width' | 'height' | 'auto' | 'none'} AutoFitValues
|
|
370
|
+
* - width: fill the width of the container
|
|
371
|
+
* - height: fill the height of the container
|
|
372
|
+
* - auto: fill the width or height of the container, whichever is smaller
|
|
373
|
+
* - none: do not autofit
|
|
374
|
+
**/
|
|
294
375
|
|
|
295
376
|
/**
|
|
296
377
|
* @typedef {object} ReductionFactor
|
|
@@ -318,3 +399,9 @@ export const DEFAULT_OPTIONS = {
|
|
|
318
399
|
|
|
319
400
|
/** @typedef {typeof DEFAULT_OPTIONS} BookReaderOptions */
|
|
320
401
|
|
|
402
|
+
/**
|
|
403
|
+
* Thrown when an error occurs while parsing options.
|
|
404
|
+
* Potentially recoverable and non-halting.
|
|
405
|
+
*/
|
|
406
|
+
export class OptionsParseError extends Error {
|
|
407
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { debounce } from '../utils.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Computing these things repeatedly is expensive (the browser needs to
|
|
6
|
+
* do a lot of computations/redrawing to make sure these are correct),
|
|
7
|
+
* so we store them here, and only recompute them when necessary:
|
|
8
|
+
* - window resize could have cause the container to change size
|
|
9
|
+
* - zoom could have cause scrollbars to appear/disappear, changing
|
|
10
|
+
* the client size.
|
|
11
|
+
*/
|
|
12
|
+
export class HTMLDimensionsCacher {
|
|
13
|
+
clientWidth = 100;
|
|
14
|
+
clientHeight = 100;
|
|
15
|
+
|
|
16
|
+
boundingClientRect = { top: 0, left: 0 };
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* @param {HTMLElement} element
|
|
20
|
+
*/
|
|
21
|
+
constructor(element) {
|
|
22
|
+
/** @type {HTMLElement} */
|
|
23
|
+
this.element = element;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
updateClientSizes = () => {
|
|
27
|
+
const bc = this.element.getBoundingClientRect();
|
|
28
|
+
this.clientWidth = this.element.clientWidth;
|
|
29
|
+
this.clientHeight = this.element.clientHeight;
|
|
30
|
+
this.boundingClientRect.top = bc.top;
|
|
31
|
+
this.boundingClientRect.left = bc.left;
|
|
32
|
+
}
|
|
33
|
+
debouncedUpdateClientSizes = debounce(this.updateClientSizes, 150, false);
|
|
34
|
+
|
|
35
|
+
/** @param {EventTarget} win */
|
|
36
|
+
attachResizeListener(win = window) {
|
|
37
|
+
win.addEventListener('resize', this.debouncedUpdateClientSizes);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** @param {EventTarget} win */
|
|
41
|
+
detachResizeListener(win = window) {
|
|
42
|
+
win.removeEventListener('resize', this.debouncedUpdateClientSizes);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/** Adds a class while the given element is experiencing scrolling */
|
|
2
|
+
export class ScrollClassAdder {
|
|
3
|
+
/**
|
|
4
|
+
* @param {HTMLElement} element
|
|
5
|
+
* @param {string} className
|
|
6
|
+
*/
|
|
7
|
+
constructor(element, className) {
|
|
8
|
+
/** @type {HTMLElement} */
|
|
9
|
+
this.element = element;
|
|
10
|
+
/** @type {string} */
|
|
11
|
+
this.className = className;
|
|
12
|
+
this.timeout = null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
attach() {
|
|
16
|
+
this.element.addEventListener('scroll', this.onScroll);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
detach() {
|
|
20
|
+
this.element.removeEventListener('scroll', this.onScroll);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
onScroll = () => {
|
|
24
|
+
this.element.classList.add(this.className);
|
|
25
|
+
clearTimeout(this.timeout);
|
|
26
|
+
// TODO: Also remove class on mousemove, touch, click, etc.
|
|
27
|
+
this.timeout = setTimeout(() => {
|
|
28
|
+
this.element.classList.remove(this.className);
|
|
29
|
+
}, 600);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/**
|
|
3
|
+
* Like `Selection.isCollapsed`, but checks the ranges too. WebKit reports
|
|
4
|
+
* `isCollapsed` as true for any selection inside a shadow root, even when
|
|
5
|
+
* it has text.
|
|
6
|
+
* https://bugs.webkit.org/show_bug.cgi?id=281587
|
|
7
|
+
* @param {Selection} selection
|
|
8
|
+
* @returns {boolean}
|
|
9
|
+
*/
|
|
10
|
+
export function isSelectionCollapsed(selection) {
|
|
11
|
+
if (!selection.isCollapsed) return false;
|
|
12
|
+
for (let i = 0; i < selection.rangeCount; i++) {
|
|
13
|
+
if (!selection.getRangeAt(i).collapsed) return false;
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export class SelectionObserver {
|
|
19
|
+
selecting = false;
|
|
20
|
+
startedInSelector = false;
|
|
21
|
+
/** @type {HTMLElement} */
|
|
22
|
+
target = null;
|
|
23
|
+
/** @type {Node | null} */
|
|
24
|
+
lastKnownFocusNode = null;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @param {string} selector
|
|
28
|
+
* @param {function('started' | 'cleared' | 'changed', HTMLElement): any} handler
|
|
29
|
+
*/
|
|
30
|
+
constructor(selector, handler) {
|
|
31
|
+
this.selector = selector;
|
|
32
|
+
this.handler = handler;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
attach() {
|
|
36
|
+
// We can't just use selectstart, because safari on iOS just
|
|
37
|
+
// randomly decides when to fire it 😤
|
|
38
|
+
// document.addEventListener("selectstart", this._onSelectStart);
|
|
39
|
+
// This has to be on document :/
|
|
40
|
+
document.addEventListener("selectionchange", this._onSelectionChange);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
detach() {
|
|
44
|
+
document.removeEventListener("selectionchange", this._onSelectionChange);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
_onSelectionChange = () => {
|
|
48
|
+
const sel = window.getSelection();
|
|
49
|
+
if (!sel) return;
|
|
50
|
+
const isCollapsed = isSelectionCollapsed(sel);
|
|
51
|
+
|
|
52
|
+
if (!this.selecting && sel.toString()) {
|
|
53
|
+
const target = $(sel.anchorNode).closest(this.selector)[0];
|
|
54
|
+
if (!target) return;
|
|
55
|
+
this.target = target;
|
|
56
|
+
this.selecting = true;
|
|
57
|
+
this.lastKnownFocusNode = sel.focusNode;
|
|
58
|
+
this.handler('started', this.target);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (this.selecting && this.lastKnownFocusNode != sel.focusNode && sel.toString() && !isCollapsed) {
|
|
62
|
+
this.lastKnownFocusNode = sel.focusNode;
|
|
63
|
+
this.handler('changed', this.target);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
if (this.selecting && (isCollapsed || !sel.toString() || !$(sel.anchorNode).closest(this.selector)[0])) {
|
|
67
|
+
this.selecting = false;
|
|
68
|
+
this.lastKnownFocusNode = null;
|
|
69
|
+
this.handler('cleared', this.target);
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
}
|