@internetarchive/bookreader 5.0.0-10-alpha-1 → 5.0.0-100
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 +428 -1139
- 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 +163 -43
- 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
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { escapeHTML, escapeRegExp } from '../../BookReader/utils.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @param {string} match
|
|
5
|
+
* @param {string} preTag
|
|
6
|
+
* @param {string} postTag
|
|
7
|
+
* @returns {string}
|
|
8
|
+
*/
|
|
9
|
+
export function renderMatch(match, preTag, postTag) {
|
|
10
|
+
// Search results are returned as a text blob with the hits wrapped in
|
|
11
|
+
// triple mustaches. Hits occasionally include text beyond the search
|
|
12
|
+
// term, so everything within the staches is captured and wrapped.
|
|
13
|
+
const preTagRe = escapeRegExp(escapeHTML(preTag));
|
|
14
|
+
const postTagRe = escapeRegExp(escapeHTML(postTag));
|
|
15
|
+
// [^] matches any character, including line breaks
|
|
16
|
+
const regex = new RegExp(`${preTagRe}([^]+?)${postTagRe}`, 'g');
|
|
17
|
+
return escapeHTML(match)
|
|
18
|
+
.replace(regex, '<mark>$1</mark>')
|
|
19
|
+
// Fix trailing hyphens. This over-corrects but is net useful.
|
|
20
|
+
.replace(/(\b)- /g, '$1');
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Attach some fields to search inside results
|
|
25
|
+
* @param {SearchInsideResults} results
|
|
26
|
+
* @param {(pageNum: LeafNum) => PageNumString} displayPageNumberFn
|
|
27
|
+
* @param {string} preTag
|
|
28
|
+
* @param {string} postTag
|
|
29
|
+
*/
|
|
30
|
+
export function marshallSearchResults(results, displayPageNumberFn, preTag, postTag) {
|
|
31
|
+
// Attach matchIndex to a few things to make it easier to identify
|
|
32
|
+
// an active/selected match
|
|
33
|
+
for (const [index, match] of results.matches.entries()) {
|
|
34
|
+
match.matchIndex = index;
|
|
35
|
+
match.displayPageNumber = displayPageNumberFn(match.par[0].page);
|
|
36
|
+
match.html = renderMatch(match.text, preTag, postTag);
|
|
37
|
+
for (const par of match.par) {
|
|
38
|
+
for (const box of par.boxes) {
|
|
39
|
+
box.matchIndex = index;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -1,25 +1,27 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/** @typedef {import('@/src/BookReader.js').default} BookReader */
|
|
3
|
+
|
|
1
4
|
class SearchView {
|
|
2
5
|
/**
|
|
3
6
|
* @param {object} params
|
|
4
|
-
* @param {
|
|
5
|
-
* @param {function} params.
|
|
7
|
+
* @param {BookReader} params.br The BookReader instance
|
|
8
|
+
* @param {function} params.searchCancelledCallback callback when a user wants to cancel search
|
|
6
9
|
*
|
|
7
10
|
* @event BookReader:SearchResultsCleared - when the search results nav gets cleared
|
|
8
11
|
* @event BookReader:ToggleSearchMenu - when search results menu should toggle
|
|
9
12
|
*/
|
|
10
13
|
constructor({ br, searchCancelledCallback = () => {} }) {
|
|
14
|
+
/** @type {BookReader} */
|
|
11
15
|
this.br = br;
|
|
12
|
-
|
|
13
|
-
// Search results are returned as a text blob with the hits wrapped in
|
|
14
|
-
// triple mustaches. Hits occasionally include text beyond the search
|
|
15
|
-
// term, so everything within the staches is captured and wrapped.
|
|
16
|
-
this.matcher = new RegExp('{{{(.+?)}}}', 'g');
|
|
17
16
|
this.matches = [];
|
|
18
17
|
this.cacheDOMElements();
|
|
19
|
-
this.bindEvents();
|
|
20
18
|
this.cancelSearch = searchCancelledCallback;
|
|
21
19
|
}
|
|
22
20
|
|
|
21
|
+
init() {
|
|
22
|
+
this.bindEvents();
|
|
23
|
+
}
|
|
24
|
+
|
|
23
25
|
cacheDOMElements() {
|
|
24
26
|
this.dom = {};
|
|
25
27
|
// Search input within the top toolbar. Will be removed once the mobile menu is replaced.
|
|
@@ -42,7 +44,7 @@ class SearchView {
|
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
clearSearchFieldAndResults(dispatchEventWhenComplete = true) {
|
|
45
|
-
this.br.removeSearchResults();
|
|
47
|
+
this.br.plugins.search.removeSearchResults();
|
|
46
48
|
this.removeResultPins();
|
|
47
49
|
this.emptyMatches();
|
|
48
50
|
this.setQuery('');
|
|
@@ -149,10 +151,12 @@ class SearchView {
|
|
|
149
151
|
}
|
|
150
152
|
|
|
151
153
|
updateResultsPosition() {
|
|
154
|
+
if (!this.dom.searchNavigation) return;
|
|
152
155
|
this.dom.searchNavigation.find('[data-id=resultsCount]').text(this.resultsPosition());
|
|
153
156
|
}
|
|
154
157
|
|
|
155
158
|
updateSearchNavigationButtons() {
|
|
159
|
+
if (!this.dom.searchNavigation) return;
|
|
156
160
|
this.dom.searchNavigation.find('.prev').attr('disabled', !this.currentMatchIndex);
|
|
157
161
|
this.dom.searchNavigation.find('.next').attr('disabled', this.currentMatchIndex + 1 === this.matches.length);
|
|
158
162
|
}
|
|
@@ -214,7 +218,7 @@ class SearchView {
|
|
|
214
218
|
<form class="BRbooksearch desktop">
|
|
215
219
|
<input type="search" name="query" class="BRsearchInput" value="" placeholder="Search inside"/>
|
|
216
220
|
<button type="submit" class="BRsearchSubmit">
|
|
217
|
-
<img src="${this.br.imagesBaseURL}icon_search_button.svg" />
|
|
221
|
+
<img src="${this.br.options.imagesBaseURL}icon_search_button.svg" />
|
|
218
222
|
</button>
|
|
219
223
|
</form>
|
|
220
224
|
`;
|
|
@@ -226,25 +230,20 @@ class SearchView {
|
|
|
226
230
|
*/
|
|
227
231
|
renderPins(matches) {
|
|
228
232
|
matches.forEach((match) => {
|
|
229
|
-
const
|
|
230
|
-
const pageIndex = this.br.leafNumToIndex(match.par[0].page);
|
|
231
|
-
const pageNumber = this.br.getPageNum(pageIndex);
|
|
233
|
+
const pageIndex = this.br.book.leafNumToIndex(match.par[0].page);
|
|
232
234
|
const uiStringSearch = "Search result"; // i18n
|
|
233
|
-
const
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
.replace(this.matcher, '<b>$1</b>')
|
|
245
|
-
+ '...';
|
|
235
|
+
const percentThrough = this.br.constructor.util.cssPercentage(pageIndex, this.br.book.getNumLeafs() - 1);
|
|
236
|
+
|
|
237
|
+
let html = match.html;
|
|
238
|
+
if (html.length > 200) {
|
|
239
|
+
const start = Math.max(0, html.indexOf('<mark>') - 100);
|
|
240
|
+
if (start != 0) {
|
|
241
|
+
html = '…' + match.html
|
|
242
|
+
.substring(start)
|
|
243
|
+
// Make sure at word boundary though
|
|
244
|
+
.replace(/^\S+/, '');
|
|
245
|
+
}
|
|
246
246
|
}
|
|
247
|
-
|
|
248
247
|
// draw marker
|
|
249
248
|
$('<div>')
|
|
250
249
|
.addClass('BRsearch')
|
|
@@ -254,43 +253,35 @@ class SearchView {
|
|
|
254
253
|
.attr('title', uiStringSearch)
|
|
255
254
|
.append(`
|
|
256
255
|
<div class="BRquery">
|
|
257
|
-
<
|
|
258
|
-
<
|
|
256
|
+
<main>${html}</main>
|
|
257
|
+
<footer>Page ${match.displayPageNumber}</footer>
|
|
259
258
|
</div>
|
|
260
259
|
`)
|
|
261
|
-
.data({ pageIndex })
|
|
262
260
|
.appendTo(this.br.$('.BRnavline'))
|
|
263
|
-
.
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
.click(function (event) {
|
|
280
|
-
// closures are nested and deep, using an arrow function breaks references.
|
|
281
|
-
// Todo: update to arrow function & clean up closures
|
|
282
|
-
// to remove `bind` dependency
|
|
283
|
-
this.br._searchPluginGoToResult(+$(event.target).data('pageIndex'));
|
|
284
|
-
this.br.updateSearchHilites();
|
|
285
|
-
}.bind(this));
|
|
261
|
+
.on("mouseenter", (event) => {
|
|
262
|
+
// remove from other markers then turn on just for this
|
|
263
|
+
// XXX should be done when nav slider moves
|
|
264
|
+
const marker = event.currentTarget;
|
|
265
|
+
const tooltip = marker.querySelector('.BRquery');
|
|
266
|
+
const tooltipOffset = tooltip.getBoundingClientRect();
|
|
267
|
+
const targetOffset = marker.getBoundingClientRect();
|
|
268
|
+
const boxSizeAdjust = parseInt(getComputedStyle(tooltip).paddingLeft) * 2;
|
|
269
|
+
if (tooltipOffset.x - boxSizeAdjust < 0) {
|
|
270
|
+
tooltip.style.setProperty('transform', `translateX(-${targetOffset.left - boxSizeAdjust}px)`);
|
|
271
|
+
}
|
|
272
|
+
$('.BRsearch,.BRchapter').removeClass('front');
|
|
273
|
+
$(event.target).addClass('front');
|
|
274
|
+
})
|
|
275
|
+
.on("mouseleave", (event) => $(event.target).removeClass('front'))
|
|
276
|
+
.on("click", () => { this.br.plugins.search.jumpToMatch(match.matchIndex); });
|
|
286
277
|
});
|
|
287
278
|
}
|
|
288
279
|
|
|
289
280
|
/**
|
|
290
|
-
* @param {boolean}
|
|
281
|
+
* @param {boolean} show
|
|
291
282
|
*/
|
|
292
|
-
toggleSearchPending(
|
|
293
|
-
if (
|
|
283
|
+
toggleSearchPending(show = false) {
|
|
284
|
+
if (show) {
|
|
294
285
|
this.br.showProgressPopup("Search results will appear below...", () => this.progressPopupClosed());
|
|
295
286
|
}
|
|
296
287
|
else {
|
|
@@ -386,21 +377,13 @@ class SearchView {
|
|
|
386
377
|
}
|
|
387
378
|
}
|
|
388
379
|
|
|
389
|
-
/**
|
|
390
|
-
* @param {Event} e
|
|
391
|
-
*/
|
|
392
|
-
handleNavToggledCallback(e) {
|
|
393
|
-
const is_visible = this.br.navigationIsVisible();
|
|
394
|
-
this.togglePinsFor(is_visible);
|
|
395
|
-
}
|
|
396
|
-
|
|
397
380
|
handleSearchStarted() {
|
|
398
381
|
this.emptyMatches();
|
|
399
|
-
this.br.removeSearchHilites();
|
|
382
|
+
this.br.plugins.search.removeSearchHilites();
|
|
400
383
|
this.removeResultPins();
|
|
401
384
|
this.toggleSearchPending(true);
|
|
402
385
|
this.teardownSearchNavigation();
|
|
403
|
-
this.setQuery(this.br.searchTerm);
|
|
386
|
+
this.setQuery(this.br.plugins.search.searchTerm);
|
|
404
387
|
}
|
|
405
388
|
|
|
406
389
|
/**
|
|
@@ -428,7 +411,6 @@ class SearchView {
|
|
|
428
411
|
|
|
429
412
|
window.addEventListener(`${namespace}SearchCallbackError`, this.handleSearchCallbackError.bind(this));
|
|
430
413
|
$(document).on(`${namespace}SearchCallback`, this.handleSearchCallback.bind(this))
|
|
431
|
-
.on(`${namespace}navToggled`, this.handleNavToggledCallback.bind(this))
|
|
432
414
|
.on(`${namespace}SearchStarted`, this.handleSearchStarted.bind(this))
|
|
433
415
|
.on(`${namespace}SearchCallbackBookNotIndexed`, this.handleSearchCallbackBookNotIndexed.bind(this))
|
|
434
416
|
.on(`${namespace}SearchCallbackEmpty`, this.handleSearchCallbackEmpty.bind(this))
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { Cache } from '../../util/cache.js';
|
|
3
|
+
import { BatchTranslator } from '@internetarchive/bergamot-translator/translator.js';
|
|
4
|
+
import { toISO6391 } from '../tts/utils.js';
|
|
5
|
+
|
|
6
|
+
export class TranslationManager {
|
|
7
|
+
/** @type {Cache<{index: string, response: string}>} */
|
|
8
|
+
alreadyTranslated = new Cache(100);
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @typedef {Object} genericModelInfo
|
|
12
|
+
* @property {string} name
|
|
13
|
+
* @property {number} size
|
|
14
|
+
* @property {number} estimatedCompressedSize
|
|
15
|
+
* @property {any} [qualityModel]
|
|
16
|
+
* @property {string} [expectedSha256Hash]
|
|
17
|
+
* @property {string} [modelType]
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* @type { {[langPair: string] : {model: genericModelInfo, lex: genericModelInfo, vocab: genericModelInfo, quality?: genericModelInfo}} }
|
|
21
|
+
*/
|
|
22
|
+
modelRegistry = {};
|
|
23
|
+
|
|
24
|
+
/** @type {Record<key, {promise: Promise<string>, resolve: function, reject: function}>} */
|
|
25
|
+
currentlyTranslating = {}
|
|
26
|
+
|
|
27
|
+
/** @type {Record<string, string>[]} */
|
|
28
|
+
fromLanguages = [];
|
|
29
|
+
/** @type {Record<string, string>[]} */
|
|
30
|
+
toLanguages = [];
|
|
31
|
+
|
|
32
|
+
/** @type {boolean} */
|
|
33
|
+
active = false;
|
|
34
|
+
|
|
35
|
+
publicPath = '';
|
|
36
|
+
|
|
37
|
+
constructor() {
|
|
38
|
+
//TODO Should default to the book language as the first element
|
|
39
|
+
const enModel = {code: "en", name: "English", type: "prod"};
|
|
40
|
+
this.fromLanguages.push(enModel);
|
|
41
|
+
this.toLanguages.push(enModel);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
async initWorker() {
|
|
46
|
+
if (this.initPromise) return this.initPromise;
|
|
47
|
+
this.initPromise = new Promise((resolve, reject) => {
|
|
48
|
+
this._initResolve = resolve;
|
|
49
|
+
this._initReject = reject;
|
|
50
|
+
});
|
|
51
|
+
const registryUrl = "https://cors.archive.org/cors/mozilla-translate-models/firefox_models/";
|
|
52
|
+
const registryJson = await fetch(registryUrl + "registry.json").then(r => r.json());
|
|
53
|
+
for (const language of Object.values(registryJson)) {
|
|
54
|
+
for (const file of Object.values(language)) {
|
|
55
|
+
file.name = registryUrl + file.name;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** @type {BatchTranslator} */
|
|
60
|
+
// Arbitrary setting for number of workers, 1 is already quite fast
|
|
61
|
+
// batchSize from 8 -> 4 for improved performance
|
|
62
|
+
this.translator = new BatchTranslator({
|
|
63
|
+
registryUrl: `data:application/json,${encodeURIComponent(JSON.stringify(registryJson))}`,
|
|
64
|
+
workers: 2,
|
|
65
|
+
batchSize: 4,
|
|
66
|
+
workerUrl: this.publicPath + '/translator-worker.js',
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const modelType = await this.translator.backing.registry;
|
|
70
|
+
const arr = {}; // unsure if we need to keep track of the files
|
|
71
|
+
for (const obj of Object.values(modelType)) {
|
|
72
|
+
const firstLang = obj['from'];
|
|
73
|
+
const secondLang = obj['to'];
|
|
74
|
+
const fromModelType = obj['files'];
|
|
75
|
+
arr[`${firstLang}${secondLang}`] = fromModelType;
|
|
76
|
+
// Assuming that all of the languages loaded from the registryUrl inside @internetarchive/bergamot-translator/translator.js are prod
|
|
77
|
+
// List of dev models found here https://github.com/mozilla/firefox-translations-models/tree/main/models/base
|
|
78
|
+
// There are also differences between the model types in the repo above here: https://github.com/mozilla/firefox-translations-models?tab=readme-ov-file#firefox-translations-models
|
|
79
|
+
if (firstLang !== "en") {
|
|
80
|
+
this.fromLanguages.push({code: firstLang, name: toISO6391(firstLang, true), type: "prod"});
|
|
81
|
+
}
|
|
82
|
+
if (secondLang !== "en") {
|
|
83
|
+
this.toLanguages.push({code: secondLang, name: toISO6391(secondLang, true), type: "prod"});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
this._initResolve([this.modelRegistry]);
|
|
87
|
+
return this.initPromise;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Targets the page and paragraph of a text layer to create a translation from the "fromLang" to the "toLang". Tries to force order in translation by using the pageIndex (+1000 if the current page is not visible) and paragraphIndex
|
|
92
|
+
* @param {string} fromLang
|
|
93
|
+
* @param {string} toLang
|
|
94
|
+
* @param {string} pageIndex
|
|
95
|
+
* @param {number} paragraphIndex
|
|
96
|
+
* @param {string} text
|
|
97
|
+
* @param {number} priority
|
|
98
|
+
* @return {Promise<string>} translated text
|
|
99
|
+
*/
|
|
100
|
+
|
|
101
|
+
getTranslation = async (fromLang, toLang, pageIndex, paragraphIndex, text, priority) => {
|
|
102
|
+
this.active = true;
|
|
103
|
+
if (fromLang == toLang || !fromLang || !toLang) {
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const key = `${fromLang}${toLang}-${pageIndex}:${paragraphIndex}`;
|
|
107
|
+
const cachedEntry = this.alreadyTranslated.entries.find(x => x.index == key);
|
|
108
|
+
|
|
109
|
+
if (cachedEntry) {
|
|
110
|
+
return cachedEntry.response;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (key in this.currentlyTranslating) {
|
|
114
|
+
return this.currentlyTranslating[key].promise;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
let _resolve = null;
|
|
118
|
+
let _reject = null;
|
|
119
|
+
const promise = new Promise((res, rej) => {
|
|
120
|
+
_resolve = res;
|
|
121
|
+
_reject = rej;
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
this.currentlyTranslating[key] = {
|
|
125
|
+
promise,
|
|
126
|
+
resolve: _resolve,
|
|
127
|
+
reject: _reject,
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
if (!text) {
|
|
131
|
+
this.currentlyTranslating[key].reject("No text was provided");
|
|
132
|
+
return promise;
|
|
133
|
+
}
|
|
134
|
+
this.translator.translate({
|
|
135
|
+
to: toLang,
|
|
136
|
+
from: fromLang,
|
|
137
|
+
text: text,
|
|
138
|
+
html: false,
|
|
139
|
+
priority: priority,
|
|
140
|
+
}).then((resp) => {
|
|
141
|
+
const response = resp;
|
|
142
|
+
this.currentlyTranslating[key].resolve(response.target.text);
|
|
143
|
+
this.alreadyTranslated.add({index: key, response: response.target.text});
|
|
144
|
+
delete this.currentlyTranslating[key];
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
return promise;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Checks and updates the status of a model that is currently being retreived from IA
|
|
152
|
+
* @param {string} fromLanguage
|
|
153
|
+
* @param {string} toLanguage
|
|
154
|
+
* @returns {Promise<boolean>}
|
|
155
|
+
*/
|
|
156
|
+
getTranslationModel = async(fromLanguage, toLanguage) => {
|
|
157
|
+
return this.translator.backing.getTranslationModel({from: fromLanguage, to: toLanguage})
|
|
158
|
+
.catch((err) => {
|
|
159
|
+
console.error(`An error occurred while trying to retreive the ${fromLanguage}-${toLanguage} model`);
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|