@internetarchive/bookreader 5.0.0-10-alpha-3 → 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,282 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { SelectionObserver } from "../BookReader/utils/SelectionObserver.js";
|
|
3
|
+
|
|
4
|
+
export class TextSelectionManager {
|
|
5
|
+
options = {
|
|
6
|
+
// Current Translation plugin implementation does not have words, will limit to one BRlineElement for now
|
|
7
|
+
maxProtectedWords: 200,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @param {string} layer Selector for the text layer to manage
|
|
12
|
+
* @param {import('../BookReader.js').default} br
|
|
13
|
+
* @param {Object} options
|
|
14
|
+
* @param {string[]} options.selectionElement CSS selector for elements that count as "words" for selection limiting
|
|
15
|
+
* @param {number} [maxWords] Maximum number of words allowed to be selected
|
|
16
|
+
*/
|
|
17
|
+
constructor (layer, br, { selectionElement }, maxWords) {
|
|
18
|
+
/** @type {string} */
|
|
19
|
+
this.layer = layer;
|
|
20
|
+
/** @type {import('../BookReader.js').default} */
|
|
21
|
+
this.br = br;
|
|
22
|
+
/** @type {string[]} */
|
|
23
|
+
this.selectionElement = selectionElement;
|
|
24
|
+
this.selectionObserver = new SelectionObserver(this.layer, this._onSelectionChange);
|
|
25
|
+
this.options.maxProtectedWords = maxWords ? maxWords : 200;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
init() {
|
|
29
|
+
this.attach();
|
|
30
|
+
new SelectionObserver(this.layer, (selectEvent) => {
|
|
31
|
+
// Track how often selection is used
|
|
32
|
+
if (selectEvent == 'started') {
|
|
33
|
+
this.br.plugins.archiveAnalytics?.sendEvent('BookReader', 'SelectStart');
|
|
34
|
+
|
|
35
|
+
// Set a class on the page to avoid hiding it when zooming/etc
|
|
36
|
+
this.br.refs.$br.find('.BRpagecontainer--hasSelection').removeClass('BRpagecontainer--hasSelection');
|
|
37
|
+
$(window.getSelection().anchorNode).closest('.BRpagecontainer').addClass('BRpagecontainer--hasSelection');
|
|
38
|
+
}
|
|
39
|
+
}).attach();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Need attach + detach methods to toggle w/ Translation plugin
|
|
43
|
+
attach() {
|
|
44
|
+
this.selectionObserver.attach();
|
|
45
|
+
if (this.br.protected) {
|
|
46
|
+
document.addEventListener('selectionchange', this._limitSelection);
|
|
47
|
+
// Prevent right clicking when selected text
|
|
48
|
+
$(document.body).on('contextmenu dragstart copy', (e) => {
|
|
49
|
+
const selection = document.getSelection();
|
|
50
|
+
if (selection?.toString()) {
|
|
51
|
+
const intersectsTextLayer = $(this.layer)
|
|
52
|
+
.toArray()
|
|
53
|
+
.some(el => selection.containsNode(el, true));
|
|
54
|
+
if (intersectsTextLayer) {
|
|
55
|
+
e.preventDefault();
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
detach() {
|
|
64
|
+
this.selectionObserver.detach();
|
|
65
|
+
if (this.br.protected) {
|
|
66
|
+
document.removeEventListener('selectionchange', this._limitSelection);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* @param {'started' | 'cleared'} type
|
|
72
|
+
* @param {HTMLElement} target
|
|
73
|
+
*/
|
|
74
|
+
_onSelectionChange = (type, target) => {
|
|
75
|
+
if (type === 'started') {
|
|
76
|
+
this.textSelectingMode(target);
|
|
77
|
+
} else if (type === 'cleared') {
|
|
78
|
+
this.defaultMode(target);
|
|
79
|
+
} else {
|
|
80
|
+
throw new Error(`Unknown type ${type}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Intercept copied text to remove any styling applied to it
|
|
86
|
+
* @param {JQuery} $container
|
|
87
|
+
*/
|
|
88
|
+
interceptCopy ($container) {
|
|
89
|
+
$container[0].addEventListener('copy', (event) => {
|
|
90
|
+
const selection = document.getSelection();
|
|
91
|
+
event.clipboardData.setData('text/plain', selection.toString());
|
|
92
|
+
event.preventDefault();
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Initializes text selection modes if there is a text layer on the page
|
|
98
|
+
* @param {JQuery} $container
|
|
99
|
+
*/
|
|
100
|
+
stopPageFlip($container) {
|
|
101
|
+
/** @type {JQuery<HTMLElement>} */
|
|
102
|
+
const $textLayer = $container.find(this.layer);
|
|
103
|
+
if (!$textLayer.length) return;
|
|
104
|
+
$textLayer.each((i, s) => this.defaultMode(s));
|
|
105
|
+
if (!this.br.protected) {
|
|
106
|
+
this.interceptCopy($container);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Applies mouse events when in default mode
|
|
112
|
+
* @param {HTMLElement} textLayer
|
|
113
|
+
*/
|
|
114
|
+
defaultMode (textLayer) {
|
|
115
|
+
const $pageContainer = $(textLayer).closest('.BRpagecontainer');
|
|
116
|
+
textLayer.style.pointerEvents = "none";
|
|
117
|
+
$pageContainer.find("img").css("pointer-events", "auto");
|
|
118
|
+
|
|
119
|
+
$(textLayer).off(".textSelectPluginHandler");
|
|
120
|
+
const startedMouseDown = this.mouseIsDown;
|
|
121
|
+
let skipNextMouseup = this.mouseIsDown;
|
|
122
|
+
if (startedMouseDown) {
|
|
123
|
+
textLayer.style.pointerEvents = "auto";
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Need to stop propagation to prevent DragScrollable from
|
|
127
|
+
// blocking selection
|
|
128
|
+
$(textLayer).on("mousedown.textSelectPluginHandler", (event) => {
|
|
129
|
+
this.mouseIsDown = true;
|
|
130
|
+
if ($(event.target).is(this.selectionElement.join(", "))) {
|
|
131
|
+
event.stopPropagation();
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
$(textLayer).on("mouseup.textSelectPluginHandler", (event) => {
|
|
136
|
+
this.mouseIsDown = false;
|
|
137
|
+
textLayer.style.pointerEvents = "none";
|
|
138
|
+
if (skipNextMouseup) {
|
|
139
|
+
skipNextMouseup = false;
|
|
140
|
+
event.stopPropagation();
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* This mode is active while there is a selection on the given textLayer
|
|
147
|
+
* @param {HTMLElement} textLayer
|
|
148
|
+
*/
|
|
149
|
+
textSelectingMode(textLayer) {
|
|
150
|
+
const $pageContainer = $(textLayer).closest('.BRpagecontainer');
|
|
151
|
+
// Make text layer consume all events
|
|
152
|
+
textLayer.style.pointerEvents = "all";
|
|
153
|
+
// Block img from getting long-press to save while selecting
|
|
154
|
+
$pageContainer.find("img").css("pointer-events", "none");
|
|
155
|
+
|
|
156
|
+
$(textLayer).off(".textSelectPluginHandler");
|
|
157
|
+
|
|
158
|
+
$(textLayer).on("mousedown.textSelectPluginHandler", (event) => {
|
|
159
|
+
this.mouseIsDown = true;
|
|
160
|
+
event.stopPropagation();
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
// Prevent page flip on click
|
|
164
|
+
$(textLayer).on('mouseup.textSelectPluginHandler', (event) => {
|
|
165
|
+
this.mouseIsDown = false;
|
|
166
|
+
event.stopPropagation();
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
_limitSelection = () => {
|
|
172
|
+
const selection = window.getSelection();
|
|
173
|
+
if (!selection.rangeCount) return;
|
|
174
|
+
|
|
175
|
+
const range = selection.getRangeAt(0);
|
|
176
|
+
|
|
177
|
+
// Check if range.startContainer is inside the sub-tree of .BRContainer
|
|
178
|
+
const startInBr = !!range.startContainer.parentElement.closest('.BRcontainer');
|
|
179
|
+
const endInBr = !!range.endContainer.parentElement.closest('.BRcontainer');
|
|
180
|
+
if (!startInBr && !endInBr) return;
|
|
181
|
+
if (!startInBr || !endInBr) {
|
|
182
|
+
// weird case, just clear the selection
|
|
183
|
+
selection.removeAllRanges();
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Find the last allowed word in the selection
|
|
188
|
+
const lastAllowedWord = genAt(
|
|
189
|
+
genFilter(
|
|
190
|
+
walkBetweenNodes(range.startContainer, range.endContainer),
|
|
191
|
+
(node) => node.classList?.contains(
|
|
192
|
+
this.selectionElement[0].replace(".", ""),
|
|
193
|
+
),
|
|
194
|
+
),
|
|
195
|
+
this.options.maxProtectedWords - 1,
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
if (!lastAllowedWord || range.endContainer.parentNode == lastAllowedWord) return;
|
|
199
|
+
|
|
200
|
+
const newRange = document.createRange();
|
|
201
|
+
newRange.setStart(range.startContainer, range.startOffset);
|
|
202
|
+
newRange.setEnd(lastAllowedWord.firstChild, lastAllowedWord.textContent.length);
|
|
203
|
+
|
|
204
|
+
selection.removeAllRanges();
|
|
205
|
+
selection.addRange(newRange);
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* @template T
|
|
211
|
+
* Get the i-th element of an iterable
|
|
212
|
+
* @param {Iterable<T>} iterable
|
|
213
|
+
* @param {number} index
|
|
214
|
+
*/
|
|
215
|
+
export function genAt(iterable, index) {
|
|
216
|
+
let i = 0;
|
|
217
|
+
for (const x of iterable) {
|
|
218
|
+
if (i == index) {
|
|
219
|
+
return x;
|
|
220
|
+
}
|
|
221
|
+
i++;
|
|
222
|
+
}
|
|
223
|
+
return undefined;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* @template T
|
|
228
|
+
* Generator version of filter
|
|
229
|
+
* @param {Iterable<T>} iterable
|
|
230
|
+
* @param {function(T): boolean} fn
|
|
231
|
+
*/
|
|
232
|
+
export function* genFilter(iterable, fn) {
|
|
233
|
+
for (const x of iterable) {
|
|
234
|
+
if (fn(x)) yield x;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Depth traverse the DOM tree starting at `start`, and ending at `end`.
|
|
240
|
+
* @param {Node} start
|
|
241
|
+
* @param {Node} end
|
|
242
|
+
* @returns {Generator<Node>}
|
|
243
|
+
*/
|
|
244
|
+
export function* walkBetweenNodes(start, end) {
|
|
245
|
+
let done = false;
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* @param {Node} node
|
|
249
|
+
*/
|
|
250
|
+
function* walk(node, {children = true, parents = true, siblings = true} = {}) {
|
|
251
|
+
if (node === end) {
|
|
252
|
+
done = true;
|
|
253
|
+
yield node;
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
// yield self
|
|
258
|
+
yield node;
|
|
259
|
+
|
|
260
|
+
// First iterate children (depth-first traversal)
|
|
261
|
+
if (children && node.firstChild) {
|
|
262
|
+
yield* walk(node.firstChild, {children: true, parents: false, siblings: true});
|
|
263
|
+
if (done) return;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// Then iterate siblings
|
|
267
|
+
if (siblings) {
|
|
268
|
+
for (let sib = node.nextSibling; sib; sib = sib.nextSibling) {
|
|
269
|
+
yield* walk(sib, {children: true, parents: false, siblings: false});
|
|
270
|
+
if (done) return;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// Finally, move up the tree
|
|
275
|
+
if (parents && node.parentNode) {
|
|
276
|
+
yield* walk(node.parentNode, {children: false, parents: true, siblings: true});
|
|
277
|
+
if (done) return;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
yield* walk(start);
|
|
282
|
+
}
|
|
@@ -7,7 +7,17 @@
|
|
|
7
7
|
* @return {boolean}
|
|
8
8
|
*/
|
|
9
9
|
export function isChrome(userAgent = navigator.userAgent, vendor = navigator.vendor) {
|
|
10
|
-
return /chrome/i.test(userAgent) && /google inc/i.test(vendor);
|
|
10
|
+
return /chrome/i.test(userAgent) && /google inc/i.test(vendor) && !isEdge(userAgent);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Checks whether the current browser is a Edge browser
|
|
15
|
+
* See https://learn.microsoft.com/en-us/microsoft-edge/web-platform/user-agent-guidance
|
|
16
|
+
* @param {string} [userAgent]
|
|
17
|
+
* @return {boolean}
|
|
18
|
+
*/
|
|
19
|
+
export function isEdge(userAgent = navigator.userAgent) {
|
|
20
|
+
return /chrome/i.test(userAgent) && /\bEdg(e|A|iOS)?\b/i.test(userAgent);
|
|
11
21
|
}
|
|
12
22
|
|
|
13
23
|
/**
|
|
@@ -28,3 +38,25 @@ export function isFirefox(userAgent = navigator.userAgent) {
|
|
|
28
38
|
export function isSafari(userAgent = navigator.userAgent) {
|
|
29
39
|
return /safari/i.test(userAgent) && !/chrome|chromium/i.test(userAgent);
|
|
30
40
|
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Checks whether the current browser is iOS (and hence iOS webkit)
|
|
44
|
+
* @return {boolean}
|
|
45
|
+
*/
|
|
46
|
+
export function isIOS() {
|
|
47
|
+
// We can't just check the userAgent because as of iOS 13,
|
|
48
|
+
// the userAgent is the same as desktop Safari because
|
|
49
|
+
// they wanted iPad's to be served the same version of websites
|
|
50
|
+
// as desktops.
|
|
51
|
+
return 'ongesturestart' in window && navigator.maxTouchPoints > 0;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Checks whether the current browser is Samsung Internet
|
|
56
|
+
* https://stackoverflow.com/a/40684162/2317712
|
|
57
|
+
* @param {string} [userAgent]
|
|
58
|
+
* @return {boolean}
|
|
59
|
+
*/
|
|
60
|
+
export function isSamsungInternet(userAgent = navigator.userAgent) {
|
|
61
|
+
return /SamsungBrowser/i.test(userAgent);
|
|
62
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @template T
|
|
3
|
+
*/
|
|
4
|
+
export class Cache {
|
|
5
|
+
constructor(maxSize = 10) {
|
|
6
|
+
this.maxSize = maxSize;
|
|
7
|
+
/** @type {T[]} */
|
|
8
|
+
this.entries = [];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @param {T} entry
|
|
13
|
+
*/
|
|
14
|
+
add(entry) {
|
|
15
|
+
if (this.entries.length >= this.maxSize) {
|
|
16
|
+
this.entries.shift();
|
|
17
|
+
}
|
|
18
|
+
this.entries.push(entry);
|
|
19
|
+
}
|
|
20
|
+
}
|
package/src/util/docCookies.js
CHANGED
|
@@ -9,6 +9,22 @@
|
|
|
9
9
|
* http://www.gnu.org/licenses/gpl-3.0-standalone.html
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Check to see if the browser has cookies enabled.
|
|
14
|
+
* Accessing document.cookies errors if eg iframe with sandbox enabled.
|
|
15
|
+
* @returns {boolean}
|
|
16
|
+
*/
|
|
17
|
+
export function areCookiesBlocked(doc = document) {
|
|
18
|
+
try {
|
|
19
|
+
doc.cookie;
|
|
20
|
+
return false;
|
|
21
|
+
} catch (e) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const COOKIES_BLOCKED = areCookiesBlocked();
|
|
27
|
+
|
|
12
28
|
/**
|
|
13
29
|
* Get specific key's value stored in cookie
|
|
14
30
|
*
|
|
@@ -17,7 +33,7 @@
|
|
|
17
33
|
* @returns {string|null}
|
|
18
34
|
*/
|
|
19
35
|
export function getItem(sKey) {
|
|
20
|
-
if (!sKey) return null;
|
|
36
|
+
if (COOKIES_BLOCKED || !sKey) return null;
|
|
21
37
|
|
|
22
38
|
return decodeURIComponent(
|
|
23
39
|
// eslint-disable-next-line no-useless-escape
|
|
@@ -34,9 +50,11 @@ export function getItem(sKey) {
|
|
|
34
50
|
* @param {string} [sDomain] domain name
|
|
35
51
|
* @param {boolean} [bSecure]
|
|
36
52
|
*
|
|
37
|
-
* @returns {
|
|
53
|
+
* @returns {boolean}
|
|
38
54
|
*/
|
|
39
55
|
export function setItem(sKey, sValue, vEnd, sPath, sDomain, bSecure) {
|
|
56
|
+
if (COOKIES_BLOCKED) return false;
|
|
57
|
+
|
|
40
58
|
document.cookie = encodeURIComponent(sKey) + '=' + encodeURIComponent(sValue)
|
|
41
59
|
+ (vEnd ? `; expires=${vEnd.toUTCString()}` : '')
|
|
42
60
|
+ (sDomain ? `; domain=${sDomain}` : '')
|
|
@@ -56,6 +74,7 @@ export function setItem(sKey, sValue, vEnd, sPath, sDomain, bSecure) {
|
|
|
56
74
|
* @returns {boolean}
|
|
57
75
|
*/
|
|
58
76
|
export function removeItem(sKey, sPath, sDomain) {
|
|
77
|
+
if (COOKIES_BLOCKED) return false;
|
|
59
78
|
// eslint-disable-next-line
|
|
60
79
|
if (!hasItem(sKey)) return false;
|
|
61
80
|
|
package/src/util/strings.js
CHANGED
|
@@ -9,6 +9,7 @@
|
|
|
9
9
|
* @param {StringWithVars|String} template
|
|
10
10
|
* @param { {[varName: string]: { toString: () => string} } } vars
|
|
11
11
|
* @param { {[varName: string]: { toString: () => string} } } [overrides]
|
|
12
|
+
* @returns {StringWithVars|string}
|
|
12
13
|
*/
|
|
13
14
|
export function applyVariables(template, vars, overrides = {}, possibleFilters = APPLY_FILTERS) {
|
|
14
15
|
return template?.replace(/\{\{([^}]*?)\}\}/g, ($0, $1) => {
|
package/.babelrc
DELETED
package/.dependabot/config.yml
DELETED
package/.eslintrc.js
DELETED
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
"env": {
|
|
3
|
-
"browser": true,
|
|
4
|
-
"jquery": true,
|
|
5
|
-
"es6": true,
|
|
6
|
-
"node": true,
|
|
7
|
-
"jest": true
|
|
8
|
-
},
|
|
9
|
-
"plugins": [
|
|
10
|
-
"testcafe"
|
|
11
|
-
],
|
|
12
|
-
"extends": [
|
|
13
|
-
"eslint:recommended",
|
|
14
|
-
"plugin:testcafe/recommended"
|
|
15
|
-
],
|
|
16
|
-
"globals": {
|
|
17
|
-
// Browser API
|
|
18
|
-
"MediaMetadata": "readonly"
|
|
19
|
-
},
|
|
20
|
-
"parserOptions": {
|
|
21
|
-
"ecmaVersion": 2020,
|
|
22
|
-
"sourceType": "module"
|
|
23
|
-
},
|
|
24
|
-
"rules": {
|
|
25
|
-
"comma-dangle": ["error", "only-multiline"],
|
|
26
|
-
"semi": ["error", "always"],
|
|
27
|
-
"space-before-blocks": ["error"],
|
|
28
|
-
"keyword-spacing": [2, {"before": true, "after": true}],
|
|
29
|
-
"indent": ["error", 2],
|
|
30
|
-
"no-console": "off", // Used too often behind `debug` options; not dealing with this now
|
|
31
|
-
"no-empty": ["error", { "allowEmptyCatch": true }],
|
|
32
|
-
"no-trailing-spaces": ["error"],
|
|
33
|
-
"no-unused-vars": ["error", { "vars": "all", "args": "none", "ignoreRestSiblings": false }], // set args:none; this is generally more annoying than useful
|
|
34
|
-
"no-var": ["error"],
|
|
35
|
-
"prefer-const": ["error"],
|
|
36
|
-
"space-infix-ops": ["error", { "int32Hint": false }],
|
|
37
|
-
"eol-last": ["error", "always"]
|
|
38
|
-
},
|
|
39
|
-
"overrides": [
|
|
40
|
-
{ // TODO; these should be cleaned up as well
|
|
41
|
-
"files": [
|
|
42
|
-
"src/BookReader.js",
|
|
43
|
-
"src/dragscrollable-br.js"
|
|
44
|
-
],
|
|
45
|
-
"rules": {
|
|
46
|
-
"no-var": ["off"],
|
|
47
|
-
}
|
|
48
|
-
},
|
|
49
|
-
],
|
|
50
|
-
};
|
package/.gitattributes
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Bug
|
|
3
|
-
about: A general problem with website functionality
|
|
4
|
-
title: ''
|
|
5
|
-
labels: Bug
|
|
6
|
-
assignees: ''
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
**Description**
|
|
11
|
-
|
|
12
|
-
> What problem are we solving? What does the experience look like today? What are the symptoms? How can one reproduce the problem?
|
|
13
|
-
|
|
14
|
-
**Evidence / Screenshot (if possible)**
|
|
15
|
-
|
|
16
|
-
> Include evidence of the problem or provide a screenshot.
|
|
17
|
-
|
|
18
|
-
**Expectation**
|
|
19
|
-
|
|
20
|
-
> What should be happening? What will it look like / how will it behave when fixed?
|
|
21
|
-
|
|
22
|
-
**Context**
|
|
23
|
-
|
|
24
|
-
> What operating system? What browser type and version?
|
|
25
|
-
|
|
26
|
-
**Proposal & Constraints**
|
|
27
|
-
|
|
28
|
-
> What is the proposed solution / implementation? Is there a precedent of this approach succeeding elsewhere?
|
|
29
|
-
|
|
30
|
-
**Stakeholders**
|
|
31
|
-
|
|
32
|
-
> @-tag any stakeholders of this bug
|
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: Feature Request
|
|
3
|
-
about: A request for an entirely new feature
|
|
4
|
-
title: ''
|
|
5
|
-
labels: Feature Request
|
|
6
|
-
assignees: ''
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
**Context**
|
|
11
|
-
|
|
12
|
-
> Is your feature request related to a problem? What is the motivation for implementing this feature?
|
|
13
|
-
|
|
14
|
-
**Proposal & Constraints**
|
|
15
|
-
|
|
16
|
-
> What is the proposed solution / implementation? Is there a precedent for this approach succeeding elsewhere?
|
|
17
|
-
|
|
18
|
-
> Which suggestions or requirements should be considered for how this feature needs to appear or be implemented?
|
|
19
|
-
|
|
20
|
-
**Additional Resources**
|
|
21
|
-
|
|
22
|
-
> Add any other screenshots or assets related to the feature request.
|
|
23
|
-
|
|
24
|
-
**Success Metrics**
|
|
25
|
-
|
|
26
|
-
> How will you know if this change is successful? What specific metrics are relevant and how do you expect them to change?
|
|
27
|
-
|
|
28
|
-
**Stakeholders**
|
|
29
|
-
|
|
30
|
-
> @-tag stakeholders of this feature
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
**Description**
|
|
2
|
-
|
|
3
|
-
> What does this PR achieve? Is it a feature/bugfix/refactor? Does it close an Issue? If so, use `Closes #<issue number>`.
|
|
4
|
-
|
|
5
|
-
**Technical**
|
|
6
|
-
|
|
7
|
-
> What should be noted about the implementation?
|
|
8
|
-
|
|
9
|
-
**Testing**
|
|
10
|
-
|
|
11
|
-
> What steps should the reviewer take to verify this PR resolves the issue?
|
|
12
|
-
|
|
13
|
-
**Screenshots/Videos**
|
|
14
|
-
|
|
15
|
-
> Add a screenshot or video/GIF if the fix can be seen visually. This is helpful for reviewers to get context for the fix.
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
|
2
|
-
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
|
3
|
-
|
|
4
|
-
name: Node.js CI
|
|
5
|
-
|
|
6
|
-
on:
|
|
7
|
-
push:
|
|
8
|
-
branches: [ master ]
|
|
9
|
-
pull_request:
|
|
10
|
-
branches: [ master ]
|
|
11
|
-
|
|
12
|
-
jobs:
|
|
13
|
-
build:
|
|
14
|
-
runs-on: ubuntu-latest
|
|
15
|
-
|
|
16
|
-
steps:
|
|
17
|
-
- uses: actions/checkout@v2
|
|
18
|
-
- uses: actions/setup-node@v1
|
|
19
|
-
with:
|
|
20
|
-
node-version: 14.x
|
|
21
|
-
- uses: actions/cache@v2
|
|
22
|
-
with:
|
|
23
|
-
# Caching node_modules isn't recommended because it can break across
|
|
24
|
-
# Node versions and won't work with npm ci (See https://github.com/actions/cache/blob/main/examples.md#node---npm )
|
|
25
|
-
# But we pin the node version, and we don't update it that often anyways. And
|
|
26
|
-
# we don't use `npm ci` specifically to try to get faster CI flows. So caching
|
|
27
|
-
# `node_modules` directly.
|
|
28
|
-
path: 'node_modules'
|
|
29
|
-
key: ${{ runner.os }}-node-${{ hashFiles('package*.json') }}
|
|
30
|
-
- run: npm install
|
|
31
|
-
- run: npm run build
|
|
32
|
-
- run: npm run lint
|
|
33
|
-
- run: npm run test
|
|
34
|
-
- run: npm run codecov
|
|
35
|
-
# Travis machines usually have 2 cores (see https://docs.travis-ci.com/user/reference/overview/#virtualisation-environment-vs-operating-system )
|
|
36
|
-
# Quarantine mode (sigh) to catch unstable tests (see https://devexpress.github.io/testcafe/documentation/guides/basic-guides/run-tests.html#quarantine-mode )
|
|
37
|
-
- run: BASE_URL=http://127.0.0.1:8000/BookReaderDemo/ npx testcafe --concurrency 2 --quarantine-mode
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created
|
|
2
|
-
# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
|
|
3
|
-
|
|
4
|
-
name: Node.js Package
|
|
5
|
-
|
|
6
|
-
on:
|
|
7
|
-
release:
|
|
8
|
-
types: [created]
|
|
9
|
-
|
|
10
|
-
jobs:
|
|
11
|
-
build:
|
|
12
|
-
runs-on: ubuntu-latest
|
|
13
|
-
steps:
|
|
14
|
-
- uses: actions/checkout@v2
|
|
15
|
-
- uses: actions/setup-node@v2
|
|
16
|
-
with:
|
|
17
|
-
node-version: 14
|
|
18
|
-
- run: npm ci
|
|
19
|
-
- run: npm test
|
|
20
|
-
|
|
21
|
-
publish-npm:
|
|
22
|
-
needs: build
|
|
23
|
-
runs-on: ubuntu-latest
|
|
24
|
-
steps:
|
|
25
|
-
- uses: actions/checkout@v2
|
|
26
|
-
- uses: actions/setup-node@v2
|
|
27
|
-
with:
|
|
28
|
-
node-version: 14
|
|
29
|
-
registry-url: https://registry.npmjs.org/
|
|
30
|
-
- run: npm ci
|
|
31
|
-
- run: npm publish --tag next
|
|
32
|
-
env:
|
|
33
|
-
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
|
|
34
|
-
|
|
35
|
-
publish-gpr:
|
|
36
|
-
needs: build
|
|
37
|
-
runs-on: ubuntu-latest
|
|
38
|
-
steps:
|
|
39
|
-
- uses: actions/checkout@v2
|
|
40
|
-
- uses: actions/setup-node@v2
|
|
41
|
-
with:
|
|
42
|
-
node-version: 14
|
|
43
|
-
registry-url: https://npm.pkg.github.com/
|
|
44
|
-
- run: npm ci
|
|
45
|
-
- run: npm publish --tag next
|
|
46
|
-
env:
|
|
47
|
-
NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}}
|