@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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
// @ts-check
|
|
1
2
|
/** @typedef {import('./BookModel.js').PageNumString} PageNumString */
|
|
2
3
|
/** @typedef {import('./BookModel.js').LeafNum} LeafNum */
|
|
3
4
|
|
|
@@ -25,9 +26,13 @@ export const DEFAULT_OPTIONS = {
|
|
|
25
26
|
thumbMaxLoading: 4,
|
|
26
27
|
/** spacing between thumbnails */
|
|
27
28
|
thumbPadding: 10,
|
|
29
|
+
/** min zoom in columns */
|
|
30
|
+
thumbMinZoomColumns: 2,
|
|
31
|
+
/** max zoom out columns */
|
|
32
|
+
thumbMaxZoomColumns: 8,
|
|
28
33
|
|
|
29
34
|
/** @type {number | 'fast' | 'slow'} speed for flip animation */
|
|
30
|
-
flipSpeed:
|
|
35
|
+
flipSpeed: 400,
|
|
31
36
|
|
|
32
37
|
showToolbar: true,
|
|
33
38
|
showNavbar: true,
|
|
@@ -61,7 +66,7 @@ export const DEFAULT_OPTIONS = {
|
|
|
61
66
|
{reduce: 2, autofit: null},
|
|
62
67
|
{reduce: 3, autofit: null},
|
|
63
68
|
{reduce: 4, autofit: null},
|
|
64
|
-
{reduce: 6, autofit: null}
|
|
69
|
+
{reduce: 6, autofit: null},
|
|
65
70
|
],
|
|
66
71
|
|
|
67
72
|
/** Object to hold parameters related to 1up mode */
|
|
@@ -79,7 +84,7 @@ export const DEFAULT_OPTIONS = {
|
|
|
79
84
|
/** Width of book spine $$$ consider sizing based on book length */
|
|
80
85
|
bookSpineDivWidth: 64,
|
|
81
86
|
/** @type {AutoFitValues} */
|
|
82
|
-
autofit: 'auto'
|
|
87
|
+
autofit: 'auto',
|
|
83
88
|
},
|
|
84
89
|
|
|
85
90
|
onePageMinBreakpoint: 800,
|
|
@@ -92,6 +97,11 @@ export const DEFAULT_OPTIONS = {
|
|
|
92
97
|
/** @type {string} */
|
|
93
98
|
bookUrlTitle: null,
|
|
94
99
|
enableBookTitleLink: true,
|
|
100
|
+
/**
|
|
101
|
+
* @type {string} A globally unique URI for the book. This is used to
|
|
102
|
+
* save data like annotations the user makes to the book.
|
|
103
|
+
*/
|
|
104
|
+
bookUri: null,
|
|
95
105
|
/**
|
|
96
106
|
* @type {string} language in ISO 639-1 (PRIVATE: Will also
|
|
97
107
|
* handle language name in English, native name, 639-2/T, or 639-2/B . (archive.org books
|
|
@@ -136,8 +146,26 @@ export const DEFAULT_OPTIONS = {
|
|
|
136
146
|
* but going forward we'll keep them here.
|
|
137
147
|
**/
|
|
138
148
|
plugins: {
|
|
139
|
-
/** @type {import('../plugins/plugin.
|
|
140
|
-
|
|
149
|
+
/** @type {Partial<import('../plugins/plugin.archive_analytics.js').ArchiveAnalyticsPlugin['options'>]}*/
|
|
150
|
+
archiveAnalytics: {},
|
|
151
|
+
/** @type {Partial<import('../plugins/plugin.autoplay.js').AutoplayPlugin['options'>]}*/
|
|
152
|
+
autoplay: {},
|
|
153
|
+
/** @type {Partial<import('../plugins/plugin.chapters.js').ChaptersPlugin['options']>} */
|
|
154
|
+
chapters: {},
|
|
155
|
+
/** @type {Partial<import('../plugins/plugin.experiments.js').ExperimentsPlugin['options']>} */
|
|
156
|
+
experiments: {},
|
|
157
|
+
/** @type {Partial<import('../plugins/plugin.iiif.js').IiifPlugin['options']>} */
|
|
158
|
+
iiif: {},
|
|
159
|
+
/** @type {Partial<import('../plugins/plugin.resume.js').ResumePlugin['options']>} */
|
|
160
|
+
resume: {},
|
|
161
|
+
/** @type {Partial<import('../plugins/search/plugin.search.js').SearchPlugin['options']>} */
|
|
162
|
+
search: {},
|
|
163
|
+
/** @type {Partial<import('../plugins/plugin.text_selection.js').TextSelectionPlugin['options']>} */
|
|
164
|
+
textSelection: {},
|
|
165
|
+
/** @type {Partial<import('../plugins/translate/plugin.translate.js').TranslatePlugin['options']>} */
|
|
166
|
+
translate: {},
|
|
167
|
+
/** @type {Partial<import('../plugins/tts/plugin.tts.js').TtsPlugin['options']>} */
|
|
168
|
+
tts: {},
|
|
141
169
|
},
|
|
142
170
|
|
|
143
171
|
/**
|
|
@@ -176,16 +204,32 @@ export const DEFAULT_OPTIONS = {
|
|
|
176
204
|
*/
|
|
177
205
|
data: [],
|
|
178
206
|
|
|
179
|
-
/**
|
|
207
|
+
/** @type {import('../plugins/plugin.chapters.js').TocEntry[]} */
|
|
208
|
+
table_of_contents: null,
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* Advanced methods for page rendering.
|
|
212
|
+
* All option functions have their `this` object set to the BookReader instance.
|
|
213
|
+
**/
|
|
214
|
+
|
|
180
215
|
/** @type {() => number} */
|
|
181
216
|
getNumLeafs: null,
|
|
182
217
|
/** @type {(index: number) => number} */
|
|
183
218
|
getPageWidth: null,
|
|
184
219
|
/** @type {(index: number) => number} */
|
|
185
220
|
getPageHeight: null,
|
|
186
|
-
/** @type {(index: number, reduce: number, rotate: number) =>
|
|
221
|
+
/** @type {(index: number, reduce: number, rotate: number) => string} */
|
|
187
222
|
getPageURI: null,
|
|
188
223
|
|
|
224
|
+
/**
|
|
225
|
+
* @type {(img: HTMLImageElement, uri: string) => Promise<void>}
|
|
226
|
+
* Render the page URI into the image element. Perform any necessary preloading,
|
|
227
|
+
* authentication, etc.
|
|
228
|
+
*/
|
|
229
|
+
renderPageURI(img, uri) {
|
|
230
|
+
img.src = uri;
|
|
231
|
+
},
|
|
232
|
+
|
|
189
233
|
/**
|
|
190
234
|
* @type {(index: number) => 'L' | 'R'}
|
|
191
235
|
* Return which side, left or right, that a given page should be displayed on
|
|
@@ -218,31 +262,31 @@ export const DEFAULT_OPTIONS = {
|
|
|
218
262
|
visible: true,
|
|
219
263
|
label: 'Flip left',
|
|
220
264
|
className: 'book_left',
|
|
221
|
-
iconClassName: 'left-arrow'
|
|
265
|
+
iconClassName: 'left-arrow',
|
|
222
266
|
},
|
|
223
267
|
bookRight: {
|
|
224
268
|
visible: true,
|
|
225
269
|
label: 'Flip right',
|
|
226
270
|
className: 'book_right',
|
|
227
|
-
iconClassName: 'left-arrow hflip'
|
|
271
|
+
iconClassName: 'left-arrow hflip',
|
|
228
272
|
},
|
|
229
273
|
onePage: {
|
|
230
274
|
visible: true,
|
|
231
275
|
label: 'One-page view',
|
|
232
276
|
className: 'onepg',
|
|
233
|
-
iconClassName: 'onepg'
|
|
277
|
+
iconClassName: 'onepg',
|
|
234
278
|
},
|
|
235
279
|
twoPage: {
|
|
236
280
|
visible: true,
|
|
237
281
|
label: 'Two-page view',
|
|
238
282
|
className: 'twopg',
|
|
239
|
-
iconClassName: 'twopg'
|
|
283
|
+
iconClassName: 'twopg',
|
|
240
284
|
},
|
|
241
285
|
thumbnail: {
|
|
242
286
|
visible: true,
|
|
243
287
|
label: 'Thumbnail view',
|
|
244
288
|
className: 'thumb',
|
|
245
|
-
iconClassName: 'thumb'
|
|
289
|
+
iconClassName: 'thumb',
|
|
246
290
|
},
|
|
247
291
|
viewmode: {
|
|
248
292
|
visible: true,
|
|
@@ -253,19 +297,19 @@ export const DEFAULT_OPTIONS = {
|
|
|
253
297
|
visible: true,
|
|
254
298
|
label: 'Zoom out',
|
|
255
299
|
className: 'zoom_out',
|
|
256
|
-
iconClassName: 'magnify'
|
|
300
|
+
iconClassName: 'magnify',
|
|
257
301
|
},
|
|
258
302
|
zoomIn: {
|
|
259
303
|
visible: true,
|
|
260
304
|
label: 'Zoom in',
|
|
261
305
|
className: 'zoom_in',
|
|
262
|
-
iconClassName: 'magnify plus'
|
|
306
|
+
iconClassName: 'magnify plus',
|
|
263
307
|
},
|
|
264
308
|
fullScreen: {
|
|
265
309
|
visible: true,
|
|
266
310
|
label: 'Toggle fullscreen',
|
|
267
311
|
className: 'full',
|
|
268
|
-
iconClassName: 'fullscreen'
|
|
312
|
+
iconClassName: 'fullscreen',
|
|
269
313
|
},
|
|
270
314
|
},
|
|
271
315
|
|
|
@@ -275,6 +319,12 @@ export const DEFAULT_OPTIONS = {
|
|
|
275
319
|
*/
|
|
276
320
|
startFullscreen: false,
|
|
277
321
|
|
|
322
|
+
/**
|
|
323
|
+
* @type {Boolean}
|
|
324
|
+
* will show logo at fullscreen mode
|
|
325
|
+
*/
|
|
326
|
+
enableFSLogoShortcut: false,
|
|
327
|
+
|
|
278
328
|
/**
|
|
279
329
|
* @type {Boolean}
|
|
280
330
|
* On init, by default, we want to handle resizing bookreader
|
|
@@ -288,9 +338,24 @@ export const DEFAULT_OPTIONS = {
|
|
|
288
338
|
* On init, by default, we want to use srcSet for images
|
|
289
339
|
*/
|
|
290
340
|
useSrcSet: false,
|
|
341
|
+
|
|
342
|
+
/**
|
|
343
|
+
* @type {string}
|
|
344
|
+
* Path to the image to display when a page is unviewable (i.e. when
|
|
345
|
+
* displaying a preview of a book).
|
|
346
|
+
*
|
|
347
|
+
* Relative to the imagesBaseURL if a relative path is specified.
|
|
348
|
+
*/
|
|
349
|
+
unviewablePageURI: './unviewable_page.png',
|
|
291
350
|
};
|
|
292
351
|
|
|
293
|
-
/**
|
|
352
|
+
/**
|
|
353
|
+
* @typedef {'width' | 'height' | 'auto' | 'none'} AutoFitValues
|
|
354
|
+
* - width: fill the width of the container
|
|
355
|
+
* - height: fill the height of the container
|
|
356
|
+
* - auto: fill the width or height of the container, whichever is smaller
|
|
357
|
+
* - none: do not autofit
|
|
358
|
+
**/
|
|
294
359
|
|
|
295
360
|
/**
|
|
296
361
|
* @typedef {object} ReductionFactor
|
|
@@ -318,3 +383,9 @@ export const DEFAULT_OPTIONS = {
|
|
|
318
383
|
|
|
319
384
|
/** @typedef {typeof DEFAULT_OPTIONS} BookReaderOptions */
|
|
320
385
|
|
|
386
|
+
/**
|
|
387
|
+
* Thrown when an error occurs while parsing options.
|
|
388
|
+
* Potentially recoverable and non-halting.
|
|
389
|
+
*/
|
|
390
|
+
export class OptionsParseError extends Error {
|
|
391
|
+
}
|
|
@@ -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,45 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
export class SelectionObserver {
|
|
3
|
+
selecting = false;
|
|
4
|
+
startedInSelector = false;
|
|
5
|
+
/** @type {HTMLElement} */
|
|
6
|
+
target = null;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* @param {string} selector
|
|
10
|
+
* @param {function('started' | 'cleared', HTMLElement): any} handler
|
|
11
|
+
*/
|
|
12
|
+
constructor(selector, handler) {
|
|
13
|
+
this.selector = selector;
|
|
14
|
+
this.handler = handler;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
attach() {
|
|
18
|
+
// We can't just use selectstart, because safari on iOS just
|
|
19
|
+
// randomly decides when to fire it 😤
|
|
20
|
+
// document.addEventListener("selectstart", this._onSelectStart);
|
|
21
|
+
// This has to be on document :/
|
|
22
|
+
document.addEventListener("selectionchange", this._onSelectionChange);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
detach() {
|
|
26
|
+
document.removeEventListener("selectionchange", this._onSelectionChange);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
_onSelectionChange = () => {
|
|
30
|
+
const sel = window.getSelection();
|
|
31
|
+
|
|
32
|
+
if (!this.selecting && sel.toString()) {
|
|
33
|
+
const target = $(sel.anchorNode).closest(this.selector)[0];
|
|
34
|
+
if (!target) return;
|
|
35
|
+
this.target = target;
|
|
36
|
+
this.selecting = true;
|
|
37
|
+
this.handler('started', this.target);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (this.selecting && (sel.isCollapsed || !sel.toString() || !$(sel.anchorNode).closest(this.selector)[0])) {
|
|
41
|
+
this.selecting = false;
|
|
42
|
+
this.handler('cleared', this.target);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
package/src/BookReader/utils.js
CHANGED
|
@@ -40,6 +40,24 @@ export function notInArray(value, array) {
|
|
|
40
40
|
return !array.includes(value);
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
/**
|
|
44
|
+
* Determines the active element, going into shadow doms.
|
|
45
|
+
* @return {Element}
|
|
46
|
+
*/
|
|
47
|
+
export function getActiveElement(doc = document, recurseShadowDom = true) {
|
|
48
|
+
const activeElement = doc.activeElement;
|
|
49
|
+
if (recurseShadowDom && activeElement?.shadowRoot) {
|
|
50
|
+
return getActiveElement(activeElement.shadowRoot, true);
|
|
51
|
+
}
|
|
52
|
+
return activeElement;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Check if an input field/textarea is active. Also checks shadow DOMs. */
|
|
56
|
+
export function isInputActive(doc = document) {
|
|
57
|
+
const activeEl = getActiveElement(doc);
|
|
58
|
+
return activeEl?.tagName == "INPUT" || activeEl?.tagName == "TEXTAREA";
|
|
59
|
+
}
|
|
60
|
+
|
|
43
61
|
/**
|
|
44
62
|
* @param {HTMLIFrameElement} iframe
|
|
45
63
|
* @return {Document}
|
|
@@ -80,16 +98,17 @@ export function encodeURIComponentPlus(value) {
|
|
|
80
98
|
}
|
|
81
99
|
|
|
82
100
|
/**
|
|
101
|
+
* @template {Function} T
|
|
83
102
|
* Returns a function, that, as long as it continues to be invoked, will not
|
|
84
103
|
* be triggered. The function will be called after it stops being called for
|
|
85
104
|
* N milliseconds. If `immediate` is passed, trigger the function on the
|
|
86
105
|
* leading edge, instead of the trailing.
|
|
87
106
|
* @see https://davidwalsh.name/javascript-debounce-function
|
|
88
107
|
*
|
|
89
|
-
* @param {
|
|
108
|
+
* @param {T} func
|
|
90
109
|
* @param {number} wait
|
|
91
110
|
* @param {boolean} immediate
|
|
92
|
-
* @return {
|
|
111
|
+
* @return {T}
|
|
93
112
|
*/
|
|
94
113
|
export function debounce(func, wait, immediate) {
|
|
95
114
|
let timeout;
|
|
@@ -108,12 +127,13 @@ export function debounce(func, wait, immediate) {
|
|
|
108
127
|
}
|
|
109
128
|
|
|
110
129
|
/**
|
|
130
|
+
* @template T
|
|
111
131
|
* Throttle function
|
|
112
132
|
* @see https://remysharp.com/2010/07/21/throttling-function-calls
|
|
113
|
-
* @param {
|
|
133
|
+
* @param {T} fn
|
|
114
134
|
* @param {number} threshold
|
|
115
135
|
* @param {boolean} delay
|
|
116
|
-
* @return {
|
|
136
|
+
* @return {T}
|
|
117
137
|
*/
|
|
118
138
|
export function throttle(fn, threshold, delay) {
|
|
119
139
|
threshold || (threshold = 250);
|
|
@@ -160,14 +180,6 @@ export function PolyfilledCustomEvent(eventName, {bubbles = false, cancelable =
|
|
|
160
180
|
return event;
|
|
161
181
|
}
|
|
162
182
|
|
|
163
|
-
/**
|
|
164
|
-
* Promise based sleep - resolves at default 500ms
|
|
165
|
-
* @param {Number} wait time in milliseconds
|
|
166
|
-
*/
|
|
167
|
-
export function sleep(ms = 500) {
|
|
168
|
-
return new Promise(res => setTimeout(res(true), ms));
|
|
169
|
-
}
|
|
170
|
-
|
|
171
183
|
/*
|
|
172
184
|
* Returns the number pixels something should be rendered at to be ~1n on the users
|
|
173
185
|
* screen when measured with a ruler.
|
|
@@ -187,3 +199,115 @@ export function calcScreenDPI() {
|
|
|
187
199
|
// This will return 0 in testing; never want it to be 0!
|
|
188
200
|
return screenDPI == 0 ? 100 : screenDPI;
|
|
189
201
|
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* @param {number[]} nums
|
|
205
|
+
* @returns {number}
|
|
206
|
+
*/
|
|
207
|
+
export function sum(nums) {
|
|
208
|
+
return nums.reduce((cur, acc) => cur + acc, 0);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* @template T
|
|
213
|
+
* @param {Generator<T>} gen
|
|
214
|
+
* @returns {T[]}
|
|
215
|
+
*/
|
|
216
|
+
export function genToArray(gen) {
|
|
217
|
+
const result = [];
|
|
218
|
+
for (const item of gen) {
|
|
219
|
+
result.push(item);
|
|
220
|
+
}
|
|
221
|
+
return result;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Check if arrays contain the same elements. Does reference comparison.
|
|
226
|
+
* @param {Array} arr1
|
|
227
|
+
* @param {Array} arr2
|
|
228
|
+
*/
|
|
229
|
+
export function arrEquals(arr1, arr2) {
|
|
230
|
+
return arr1.length == arr2.length && arr1.every((x, i) => x == arr2[i]);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Check if array has changed; namely to be used with lit's property.hasChanged
|
|
235
|
+
* @param {Array} [arr1]
|
|
236
|
+
* @param {Array} [arr2]
|
|
237
|
+
*/
|
|
238
|
+
export function arrChanged(arr1, arr2) {
|
|
239
|
+
return arr1 && arr2 && !arrEquals(arr1, arr2);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Waits the provided number of ms and then resolves with a promise
|
|
244
|
+
* @param {number} ms
|
|
245
|
+
**/
|
|
246
|
+
export async function sleep(ms) {
|
|
247
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* @template T
|
|
252
|
+
* @param {function(): T} fn
|
|
253
|
+
* @param {Object} options
|
|
254
|
+
* @param {function(T): boolean} [options.until]
|
|
255
|
+
* @return {T | undefined}
|
|
256
|
+
*/
|
|
257
|
+
export async function poll(fn, { step = 50, timeout = 500, until = val => Boolean(val), _sleep = sleep } = {}) {
|
|
258
|
+
const startTime = Date.now();
|
|
259
|
+
while (Date.now() - startTime < timeout) {
|
|
260
|
+
const result = fn();
|
|
261
|
+
if (until(result)) return result;
|
|
262
|
+
await _sleep(step);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Convert a EventTarget style event into a promise
|
|
268
|
+
* @param {EventTarget} target
|
|
269
|
+
* @param {string} eventType
|
|
270
|
+
* @return {Promise<Event>}
|
|
271
|
+
*/
|
|
272
|
+
export function promisifyEvent(target, eventType) {
|
|
273
|
+
return new Promise(res => {
|
|
274
|
+
const resolver = ev => {
|
|
275
|
+
target.removeEventListener(eventType, resolver);
|
|
276
|
+
res(ev);
|
|
277
|
+
};
|
|
278
|
+
target.addEventListener(eventType, resolver);
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Escapes regex special characters in a string. Allows for safe usage in regexes.
|
|
284
|
+
* Src: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_expressions
|
|
285
|
+
* @param {string} string
|
|
286
|
+
* @returns {string}
|
|
287
|
+
*/
|
|
288
|
+
export function escapeRegExp(string) {
|
|
289
|
+
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* @param {number | 'fast' | 'slow' | string} speed
|
|
294
|
+
* Parsing of the jquery animation speed; see https://api.jquery.com/animate/
|
|
295
|
+
*/
|
|
296
|
+
export function parseAnimationSpeed(speed) {
|
|
297
|
+
if (speed === 'slow') return 600;
|
|
298
|
+
if (speed === 'fast') return 200;
|
|
299
|
+
return parseInt(speed, 10);
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/**
|
|
303
|
+
* @template T
|
|
304
|
+
* @param {T[]} array
|
|
305
|
+
* @param {function(T): number} [valueFn]
|
|
306
|
+
*/
|
|
307
|
+
export function sortBy(array, valueFn) {
|
|
308
|
+
return array.sort((a, b) => {
|
|
309
|
+
const aValue = valueFn ? valueFn(a) : a;
|
|
310
|
+
const bValue = valueFn ? valueFn(b) : b;
|
|
311
|
+
return aValue < bValue ? -1 : aValue > bValue ? 1 : 0;
|
|
312
|
+
});
|
|
313
|
+
}
|