@internetarchive/bookreader 5.0.0-12-fixsorting-8 → 5.0.0-121
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BookReader/474.js +2 -0
- package/BookReader/474.js.map +1 -0
- package/BookReader/BookReader.css +670 -1190
- package/BookReader/bergamot-translator-worker.js +2966 -0
- package/BookReader/bergamot-translator-worker.wasm +0 -0
- package/BookReader/hypothesis/LICENSE +50 -0
- package/BookReader/hypothesis/README.md +55 -0
- package/BookReader/hypothesis/build/boot-template.js +1 -0
- package/BookReader/hypothesis/build/boot.js +1 -0
- package/BookReader/hypothesis/build/manifest.json +20 -0
- package/BookReader/hypothesis/build/scripts/annotator.bundle.js +199 -0
- package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +811 -0
- package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +437 -0
- package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
- package/BookReader/hypothesis/build/styles/annotator.css +4 -0
- package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
- package/BookReader/hypothesis/build/styles/highlights.css +2 -0
- package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
- package/BookReader/hypothesis/build/styles/katex.min.css +3 -0
- package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
- package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +14 -0
- package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
- package/BookReader/hypothesis/build/styles/sidebar.css +4 -0
- package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
- package/BookReader/hypothesis/build/styles/ui-playground.css +4 -0
- package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
- package/BookReader/hypothesis/package.json +126 -0
- package/BookReader/ia-bookreader.js +1886 -0
- package/BookReader/{BookReader.js.LICENSE.txt → ia-bookreader.js.LICENSE.txt} +26 -20
- package/BookReader/ia-bookreader.js.map +1 -0
- package/BookReader/icons/1up.svg +1 -12
- package/BookReader/icons/2up.svg +1 -15
- package/BookReader/icons/advance.svg +3 -26
- package/BookReader/icons/chevron-right.svg +1 -1
- package/BookReader/icons/close-circle-dark.svg +1 -1
- package/BookReader/icons/close-circle.svg +1 -1
- package/BookReader/icons/fullscreen.svg +1 -17
- package/BookReader/icons/fullscreen_exit.svg +1 -17
- package/BookReader/icons/hamburger.svg +1 -15
- package/BookReader/icons/left-arrow.svg +1 -12
- package/BookReader/icons/magnify-minus.svg +1 -16
- package/BookReader/icons/magnify-plus.svg +1 -17
- package/BookReader/icons/magnify.svg +1 -15
- package/BookReader/icons/pause.svg +1 -23
- package/BookReader/icons/play.svg +1 -22
- package/BookReader/icons/playback-speed.svg +1 -34
- package/BookReader/icons/read-aloud.svg +1 -22
- package/BookReader/icons/review.svg +3 -22
- package/BookReader/icons/slider-toggle.svg +1 -0
- package/BookReader/icons/thumbnails.svg +1 -17
- package/BookReader/icons/voice.svg +1 -0
- package/BookReader/icons/volume-full.svg +1 -22
- package/BookReader/images/BRicons.svg +5 -94
- package/BookReader/images/books_graphic.svg +1 -177
- package/BookReader/images/hypothesis.ico +0 -0
- package/BookReader/images/icon_book.svg +1 -12
- package/BookReader/images/icon_bookmark.svg +1 -12
- package/BookReader/images/icon_experiment.svg +1 -0
- package/BookReader/images/icon_gear.svg +1 -14
- package/BookReader/images/icon_hamburger.svg +1 -20
- package/BookReader/images/icon_home.svg +1 -21
- package/BookReader/images/icon_info.svg +1 -11
- package/BookReader/images/icon_one_page.svg +1 -8
- package/BookReader/images/icon_pause.svg +1 -1
- package/BookReader/images/icon_play.svg +1 -1
- package/BookReader/images/icon_playback-rate.svg +1 -15
- package/BookReader/images/icon_search_button.svg +1 -8
- package/BookReader/images/icon_share.svg +1 -9
- package/BookReader/images/icon_skip-ahead.svg +1 -6
- package/BookReader/images/icon_skip-back.svg +2 -13
- package/BookReader/images/icon_speaker.svg +1 -18
- package/BookReader/images/icon_speaker_open.svg +1 -10
- package/BookReader/images/icon_thumbnails.svg +1 -12
- package/BookReader/images/icon_toc.svg +1 -5
- package/BookReader/images/icon_two_pages.svg +1 -9
- package/BookReader/images/marker_chap-off.svg +1 -11
- package/BookReader/images/marker_chap-on.svg +1 -11
- package/BookReader/images/marker_srch-on.svg +1 -11
- package/BookReader/images/translate.svg +1 -0
- package/BookReader/images/unviewable_page.png +0 -0
- package/BookReader/jquery-3.js +2 -0
- package/BookReader/jquery-3.js.LICENSE.txt +24 -0
- package/BookReader/plugins/plugin.archive_analytics.js +1 -172
- package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
- package/BookReader/plugins/plugin.autoplay.js +1 -165
- package/BookReader/plugins/plugin.autoplay.js.map +1 -1
- package/BookReader/plugins/plugin.chapters.js +19 -301
- package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.chapters.js.map +1 -1
- package/BookReader/plugins/plugin.experiments.js +3 -0
- package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.experiments.js.map +1 -0
- package/BookReader/plugins/plugin.iframe.js +1 -74
- package/BookReader/plugins/plugin.iframe.js.map +1 -1
- package/BookReader/plugins/plugin.iiif.js +2 -0
- package/BookReader/plugins/plugin.iiif.js.map +1 -0
- package/BookReader/plugins/plugin.resume.js +1 -368
- package/BookReader/plugins/plugin.resume.js.map +1 -1
- package/BookReader/plugins/plugin.search.js +2 -1385
- package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.search.js.map +1 -1
- package/BookReader/plugins/plugin.text_selection.js +2 -1080
- package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.text_selection.js.map +1 -1
- package/BookReader/plugins/plugin.translate.js +3 -0
- package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.translate.js.map +1 -0
- package/BookReader/plugins/plugin.tts.js +2 -9193
- package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
- package/BookReader/plugins/plugin.tts.js.map +1 -1
- package/BookReader/plugins/plugin.url.js +1 -269
- package/BookReader/plugins/plugin.url.js.map +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -379
- package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
- package/BookReader/plugins/translator-worker.js +2 -0
- package/BookReader/plugins/translator-worker.js.map +1 -0
- package/BookReader/silence.mp3 +0 -0
- package/BookReader/translator-worker.js +475 -0
- package/BookReader/webcomponents-bundle.js +3 -0
- package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
- package/BookReader/webcomponents-bundle.js.map +1 -0
- package/README.md +17 -4
- package/dist/esm/ia-bookreader.js +3 -0
- package/dist/esm/ia-bookreader.js.LICENSE.txt +17 -0
- package/dist/esm/ia-bookreader.js.map +1 -0
- package/dist/esm/plugins/plugin.archive_analytics.js +2 -0
- package/dist/esm/plugins/plugin.archive_analytics.js.map +1 -0
- package/dist/esm/plugins/plugin.autoplay.js +2 -0
- package/dist/esm/plugins/plugin.autoplay.js.map +1 -0
- package/dist/esm/plugins/plugin.chapters.js +2 -0
- package/dist/esm/plugins/plugin.chapters.js.map +1 -0
- package/dist/esm/plugins/plugin.experiments.js +2 -0
- package/dist/esm/plugins/plugin.experiments.js.map +1 -0
- package/dist/esm/plugins/plugin.iframe.js +2 -0
- package/dist/esm/plugins/plugin.iframe.js.map +1 -0
- package/dist/esm/plugins/plugin.iiif.js +2 -0
- package/dist/esm/plugins/plugin.iiif.js.map +1 -0
- package/dist/esm/plugins/plugin.resume.js +2 -0
- package/dist/esm/plugins/plugin.resume.js.map +1 -0
- package/dist/esm/plugins/plugin.search.js +2 -0
- package/dist/esm/plugins/plugin.search.js.map +1 -0
- package/dist/esm/plugins/plugin.text_selection.js +2 -0
- package/dist/esm/plugins/plugin.text_selection.js.map +1 -0
- package/dist/esm/plugins/plugin.translate.js +2 -0
- package/dist/esm/plugins/plugin.translate.js.map +1 -0
- package/dist/esm/plugins/plugin.tts.js +2 -0
- package/dist/esm/plugins/plugin.tts.js.map +1 -0
- package/dist/esm/plugins/plugin.url.js +2 -0
- package/dist/esm/plugins/plugin.url.js.map +1 -0
- package/dist/esm/plugins/plugin.vendor-fullscreen.js +2 -0
- package/dist/esm/plugins/plugin.vendor-fullscreen.js.map +1 -0
- package/jsconfig.json +18 -0
- package/package.json +113 -71
- package/src/BookReader/BookModel.js +92 -46
- package/src/BookReader/DragScrollable.js +233 -0
- package/src/BookReader/ImageCache.js +49 -16
- package/src/BookReader/Mode1Up.js +66 -365
- package/src/BookReader/Mode1UpLit.js +392 -0
- package/src/BookReader/Mode2Up.js +87 -1315
- package/src/BookReader/Mode2UpLit.js +786 -0
- package/src/BookReader/ModeAbstract.js +43 -0
- package/src/BookReader/ModeCoordinateSpace.js +29 -0
- package/src/BookReader/ModeSmoothZoom.js +312 -0
- package/src/BookReader/ModeThumb.js +29 -15
- package/src/BookReader/Navbar/Navbar.js +204 -84
- package/src/BookReader/PageContainer.js +120 -23
- package/src/BookReader/ReduceSet.js +2 -2
- package/src/BookReader/Toolbar/Toolbar.js +18 -40
- package/src/BookReader/events.js +3 -3
- package/src/BookReader/options.js +105 -18
- package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
- package/src/BookReader/utils/ScrollClassAdder.js +31 -0
- package/src/BookReader/utils/SelectionObserver.js +72 -0
- package/src/BookReader/utils/classes.js +1 -1
- package/src/BookReader/utils.js +136 -12
- package/src/BookReader.js +732 -1231
- package/src/BookReaderPlugin.js +52 -0
- package/src/assets/icons/magnify-minus.svg +3 -7
- package/src/assets/icons/magnify-plus.svg +3 -7
- package/src/assets/icons/slider-toggle.svg +1 -0
- package/src/assets/icons/voice.svg +1 -0
- package/src/assets/images/hypothesis.ico +0 -0
- package/src/assets/images/icon_experiment.svg +1 -0
- package/src/assets/images/translate.svg +1 -0
- package/src/assets/images/unviewable_page.png +0 -0
- package/src/assets/silence.mp3 +0 -0
- package/src/css/BookReader.scss +1 -5
- package/src/css/_BRBookmarks.scss +1 -1
- package/src/css/_BRComponent.scss +1 -1
- package/src/css/_BRicon.scss +8 -2
- package/src/css/_BRmain.scss +16 -3
- package/src/css/_BRnav.scss +74 -70
- package/src/css/_BRpages.scss +174 -42
- package/src/css/_BRsearch.scss +69 -30
- package/src/css/_BRtoolbar.scss +5 -5
- package/src/css/_TextSelection.scss +249 -25
- package/src/css/_colorbox.scss +2 -2
- package/src/css/_controls.scss +24 -7
- package/src/css/_icons.scss +8 -1
- package/src/{BookNavigator/assets → css}/button-base.js +2 -2
- package/src/css/icon_checkmark.js +9 -0
- package/src/css/sharedStyles.js +15 -0
- package/src/ia-bookreader/downloads/downloads-provider.js +81 -0
- package/src/{BookNavigator → ia-bookreader}/downloads/downloads.js +25 -5
- package/src/ia-bookreader/ia-bookreader.js +686 -0
- package/src/ia-bookreader/sharing.js +27 -0
- package/src/ia-bookreader/viewable-files.js +98 -0
- package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments-provider.js +17 -17
- package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments.js +75 -67
- package/src/{BookNavigator → plugins}/bookmarks/bookmark-button.js +4 -3
- package/src/{BookNavigator/assets → plugins/bookmarks}/bookmark-colors.js +1 -1
- package/src/{BookNavigator → plugins}/bookmarks/bookmark-edit.js +43 -31
- package/src/{BookNavigator → plugins}/bookmarks/bookmarks-list.js +48 -49
- package/src/{BookNavigator → plugins}/bookmarks/bookmarks-loginCTA.js +3 -3
- package/src/plugins/bookmarks/bookmarks-provider.js +63 -0
- package/src/{BookNavigator → plugins/bookmarks}/delete-modal-actions.js +1 -1
- package/src/{BookNavigator → plugins}/bookmarks/ia-bookmarks.js +117 -68
- package/src/plugins/plugin.archive_analytics.js +84 -78
- package/src/plugins/plugin.autoplay.js +99 -104
- package/src/plugins/plugin.chapters.js +323 -205
- package/src/plugins/plugin.experiments.js +375 -0
- package/src/plugins/plugin.iframe.js +36 -37
- package/src/plugins/plugin.iiif.js +147 -0
- package/src/plugins/plugin.resume.js +54 -51
- package/src/plugins/plugin.text_selection.js +464 -219
- package/src/plugins/plugin.vendor-fullscreen.js +5 -5
- package/src/plugins/search/plugin.search.js +347 -397
- package/src/{BookNavigator → plugins}/search/search-provider.js +59 -27
- package/src/{BookNavigator → plugins}/search/search-results.js +105 -76
- package/src/plugins/search/utils.js +50 -0
- package/src/plugins/search/view.js +51 -69
- package/src/plugins/translate/TranslationManager.js +164 -0
- package/src/plugins/translate/plugin.translate.js +559 -0
- package/src/plugins/tts/AbstractTTSEngine.js +78 -49
- package/src/plugins/tts/FestivalTTSEngine.js +20 -30
- package/src/plugins/tts/PageChunk.js +117 -23
- package/src/plugins/tts/PageChunkIterator.js +11 -17
- package/src/plugins/tts/WebTTSEngine.js +132 -92
- package/src/plugins/tts/plugin.tts.js +341 -351
- package/src/plugins/tts/utils.js +76 -67
- package/src/plugins/url/UrlPlugin.js +213 -0
- package/src/plugins/{plugin.url.js → url/plugin.url.js} +54 -18
- package/src/util/TextSelectionManager.js +1471 -0
- package/src/util/browserSniffing.js +42 -1
- package/src/util/cache.js +20 -0
- package/src/util/docCookies.js +21 -2
- package/src/util/dom.js +88 -0
- package/src/util/generators.js +89 -0
- package/src/util/lit.js +15 -0
- package/src/util/strings.js +11 -0
- package/.babelrc +0 -12
- package/.dependabot/config.yml +0 -6
- package/.eslintrc.js +0 -50
- package/.gitattributes +0 -2
- package/.github/ISSUE_TEMPLATE/bug.md +0 -32
- package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
- package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
- package/.github/workflows/node.js.yml +0 -37
- package/.github/workflows/npm-publish.yml +0 -47
- package/.testcaferc.json +0 -5
- package/BookReader/BookReader.js +0 -21613
- package/BookReader/BookReader.js.map +0 -1
- package/BookReader/bookreader-component-bundle.js +0 -14497
- package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
- package/BookReader/bookreader-component-bundle.js.map +0 -1
- package/BookReader/jquery-1.10.1.js +0 -108
- package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
- package/BookReader/plugins/plugin.menu_toggle.js +0 -369
- package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
- package/BookReader/plugins/plugin.mobile_nav.js +0 -335
- package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
- package/BookReaderDemo/BookReaderDemo.css +0 -41
- package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
- package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
- package/BookReaderDemo/BookReaderJSSimple.js +0 -55
- package/BookReaderDemo/IIIFBookReader.js +0 -207
- package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
- package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
- package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
- package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
- package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
- package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
- package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
- package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
- package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
- package/BookReaderDemo/demo-advanced.html +0 -33
- package/BookReaderDemo/demo-autoplay.html +0 -38
- package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
- package/BookReaderDemo/demo-embed.html +0 -26
- package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
- package/BookReaderDemo/demo-fullscreen.html +0 -33
- package/BookReaderDemo/demo-iiif.html +0 -34
- package/BookReaderDemo/demo-iiif.js +0 -26
- package/BookReaderDemo/demo-internetarchive.html +0 -74
- package/BookReaderDemo/demo-multiple.html +0 -43
- package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
- package/BookReaderDemo/demo-preview-pages.html +0 -1092
- package/BookReaderDemo/demo-simple.html +0 -34
- package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
- package/BookReaderDemo/immersion-1up.html +0 -64
- package/BookReaderDemo/immersion-mode.html +0 -35
- package/BookReaderDemo/toggle_controls.html +0 -53
- package/BookReaderDemo/view_mode.html +0 -39
- package/BookReaderDemo/viewmode-cycle.html +0 -41
- package/CHANGELOG.md +0 -499
- package/CONTRIBUTING.md +0 -7
- package/codecov.yml +0 -17
- package/index.html +0 -31
- package/karma.conf.js +0 -23
- package/screenshot.png +0 -0
- package/scripts/postversion.js +0 -10
- package/scripts/preversion.js +0 -14
- package/scripts/version.js +0 -26
- package/src/BookNavigator/BookModel.js +0 -14
- package/src/BookNavigator/BookNavigator.js +0 -459
- package/src/BookNavigator/assets/book-loader.js +0 -27
- package/src/BookNavigator/assets/icon_checkmark.js +0 -6
- package/src/BookNavigator/assets/icon_close.js +0 -3
- package/src/BookNavigator/assets/icon_sort_ascending.js +0 -5
- package/src/BookNavigator/assets/icon_sort_descending.js +0 -5
- package/src/BookNavigator/assets/icon_sort_neutral.js +0 -5
- package/src/BookNavigator/assets/icon_volumes.js +0 -11
- package/src/BookNavigator/bookmarks/bookmarks-provider.js +0 -53
- package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
- package/src/BookNavigator/downloads/downloads-provider.js +0 -66
- package/src/BookNavigator/search/a-search-result.js +0 -55
- package/src/BookNavigator/volumes/volumes-provider.js +0 -83
- package/src/BookNavigator/volumes/volumes.js +0 -178
- package/src/BookReader/DebugConsole.js +0 -54
- package/src/BookReaderComponent/BookReaderComponent.js +0 -112
- package/src/ItemNavigator/ItemNavigator.js +0 -376
- package/src/ItemNavigator/providers/sharing.js +0 -33
- package/src/css/_MobileNav.scss +0 -194
- package/src/dragscrollable-br.js +0 -261
- package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
- package/src/plugins/plugin.mobile_nav.js +0 -287
- package/tests/BookReader/BookModel.test.js +0 -312
- package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
- package/tests/BookReader/DebugConsole.test.js +0 -25
- package/tests/BookReader/ImageCache.test.js +0 -150
- package/tests/BookReader/Mode1Up.test.js +0 -164
- package/tests/BookReader/Mode2Up.test.js +0 -247
- package/tests/BookReader/Navbar/Navbar.test.js +0 -169
- package/tests/BookReader/PageContainer.test.js +0 -115
- package/tests/BookReader/ReduceSet.test.js +0 -38
- package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
- package/tests/BookReader/utils/classes.test.js +0 -88
- package/tests/BookReader/utils.test.js +0 -109
- package/tests/BookReader.options.test.js +0 -39
- package/tests/BookReader.test.js +0 -301
- package/tests/e2e/README.md +0 -75
- package/tests/e2e/autoplay.test.js +0 -13
- package/tests/e2e/base.test.js +0 -35
- package/tests/e2e/helpers/base.js +0 -263
- package/tests/e2e/helpers/debug.js +0 -13
- package/tests/e2e/helpers/desktopSearch.js +0 -72
- package/tests/e2e/helpers/mobileSearch.js +0 -85
- package/tests/e2e/helpers/mockSearch.js +0 -93
- package/tests/e2e/helpers/rightToLeft.js +0 -29
- package/tests/e2e/ia-production/ia-prod-base.js +0 -17
- package/tests/e2e/models/BookReader.js +0 -11
- package/tests/e2e/models/Navigation.js +0 -56
- package/tests/e2e/rightToLeft.test.js +0 -20
- package/tests/e2e/viewmode.test.js +0 -37
- package/tests/karma/BookNavigator/book-navigator.test.js +0 -139
- package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
- package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
- package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
- package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
- package/tests/karma/BookNavigator/sharing/sharing-provider.test.js +0 -40
- package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
- package/tests/karma/BookNavigator/volumes/volumes-provider.test.js +0 -141
- package/tests/karma/BookNavigator/volumes/volumes.test.js +0 -98
- package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
- package/tests/plugins/plugin.archive_analytics.test.js +0 -23
- package/tests/plugins/plugin.autoplay.test.js +0 -52
- package/tests/plugins/plugin.chapters.test.js +0 -130
- package/tests/plugins/plugin.iframe.test.js +0 -42
- package/tests/plugins/plugin.mobile_nav.test.js +0 -66
- package/tests/plugins/plugin.resume.test.js +0 -98
- package/tests/plugins/plugin.text_selection.test.js +0 -203
- package/tests/plugins/plugin.url.test.js +0 -129
- package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
- package/tests/plugins/search/plugin.search.test.js +0 -173
- package/tests/plugins/search/plugin.search.view.test.js +0 -106
- package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
- package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
- package/tests/plugins/tts/PageChunk.test.js +0 -57
- package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
- package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
- package/tests/plugins/tts/utils.test.js +0 -133
- package/tests/util/browserSniffing.test.js +0 -56
- package/tests/util/docCookies.test.js +0 -15
- package/tests/util/strings.test.js +0 -63
- package/tests/utils.js +0 -42
- package/webpack.config.js +0 -86
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugins/plugin.search.js","mappings":"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","sources":["webpack://@internetarchive/bookreader/./node_modules/core-js/internals/string-trim-forced.js","webpack://@internetarchive/bookreader/./node_modules/core-js/internals/string-trim.js","webpack://@internetarchive/bookreader/./node_modules/core-js/internals/whitespaces.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.string.trim.js","webpack://@internetarchive/bookreader/./src/BookReaderPlugin.js","webpack://@internetarchive/bookreader/./src/plugins/search/view.js","webpack://@internetarchive/bookreader/./src/plugins/search/utils.js","webpack://@internetarchive/bookreader/./src/plugins/search/plugin.search.js","webpack://@internetarchive/bookreader/./src/plugins/tts/utils.js","webpack://@internetarchive/bookreader/./src/util/strings.js"],"sourcesContent":["'use strict';\nvar PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;\nvar fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]()\n || non[METHOD_NAME]() !== non\n || (PROPER_FUNCTION_NAME && whitespaces[METHOD_NAME].name !== METHOD_NAME);\n });\n};\n","'use strict';\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar toString = require('../internals/to-string');\nvar whitespaces = require('../internals/whitespaces');\n\nvar replace = uncurryThis(''.replace);\nvar ltrim = RegExp('^[' + whitespaces + ']+');\nvar rtrim = RegExp('(^|[^' + whitespaces + '])[' + whitespaces + ']+$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = toString(requireObjectCoercible($this));\n if (TYPE & 1) string = replace(string, ltrim, '');\n if (TYPE & 2) string = replace(string, rtrim, '$1');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.es/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.es/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","'use strict';\n// a string of all valid unicode whitespaces\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002' +\n '\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.es/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n","// @ts-check\n/** @typedef {import(\"./BookReader.js\").default} BookReader */\n\n/**\n * @template TOptions\n */\nexport class BookReaderPlugin {\n /**\n * @param {BookReader} br\n */\n constructor(br) {\n /** @type {BookReader} */\n this.br = br;\n /** @type {TOptions} */\n this.options;\n }\n\n /**\n * @abstract\n * @param {TOptions} options\n **/\n setup(options) {\n this.options = Object.assign({}, this.options, options);\n }\n\n /** @abstract */\n init() {}\n\n /**\n * @abstract\n * @protected\n * @param {import (\"./BookReader/PageContainer.js\").PageContainer} pageContainer\n */\n _configurePageContainer(pageContainer) {\n }\n\n /**\n * @abstract\n * @protected\n * @param {JQuery<HTMLElement>} $toolbarElement\n */\n _configureToolbar($toolbarElement) {\n }\n\n /** @abstract @protected */\n _bindNavigationHandlers() {}\n\n /**\n * @param {JQuery<HTMLElement>} $navBar\n */\n extendNavBar($navBar) {}\n}\n","// @ts-check\n/** @typedef {import('@/src/BookReader.js').default} BookReader */\n\nclass SearchView {\n /**\n * @param {object} params\n * @param {BookReader} params.br The BookReader instance\n * @param {function} params.searchCancelledCallback callback when a user wants to cancel search\n *\n * @event BookReader:SearchResultsCleared - when the search results nav gets cleared\n * @event BookReader:ToggleSearchMenu - when search results menu should toggle\n */\n constructor({ br, searchCancelledCallback = () => {} }) {\n /** @type {BookReader} */\n this.br = br;\n this.matches = [];\n this.cacheDOMElements();\n this.cancelSearch = searchCancelledCallback;\n }\n\n init() {\n this.bindEvents();\n }\n\n cacheDOMElements() {\n this.dom = {};\n // Search input within the top toolbar. Will be removed once the mobile menu is replaced.\n this.dom.toolbarSearch = this.buildToolbarSearch();\n }\n\n /**\n * @param {string} query\n */\n setQuery(query) {\n this.br.$('[name=\"query\"]').val(query);\n }\n\n emptyMatches() {\n this.matches = [];\n }\n\n removeResultPins() {\n this.br.$('.BRnavpos .BRsearch').remove();\n }\n\n clearSearchFieldAndResults(dispatchEventWhenComplete = true) {\n this.br.plugins.search.removeSearchResults();\n this.removeResultPins();\n this.emptyMatches();\n this.setQuery('');\n this.teardownSearchNavigation();\n if (dispatchEventWhenComplete) {\n this.br.trigger('SearchResultsCleared');\n }\n }\n\n toggleSidebar() {\n this.br.trigger('ToggleSearchMenu');\n }\n\n renderSearchNavigation() {\n const selector = 'BRsearch-navigation';\n $('.BRnav.BRnavMain').before(`\n <div class=\"${selector}\">\n <button class=\"toggle-sidebar\">\n <h4>\n <span class=\"icon icon-search\"></span> Results\n </h4>\n </button>\n <div class=\"pagination\">\n <button class=\"prev\" title=\"Previous result\"><span class=\"icon icon-chevron hflip\"></span></button>\n <span data-id=\"resultsCount\">${this.resultsPosition()}</span>\n <button class=\"next\" title=\"Next result\"><span class=\"icon icon-chevron\"></button>\n </div>\n <button class=\"clear\" title=\"Clear search results\">\n <span class=\"icon icon-close\"></span>\n </button>\n </div>\n `);\n this.dom.searchNavigation = $(`.${selector}`);\n }\n\n resultsPosition() {\n let positionMessage = `${this.matches.length} result${this.matches.length === 1 ? '' : 's'}`;\n if (~this.currentMatchIndex) {\n positionMessage = `${this.currentMatchIndex + 1} / ${this.matches.length}`;\n }\n return positionMessage;\n }\n\n bindSearchNavigationEvents() {\n if (!this.dom.searchNavigation) { return; }\n const namespace = 'searchNavigation';\n\n this.dom.searchNavigation\n .on(`click.${namespace}`, '.clear', this.clearSearchFieldAndResults.bind(this))\n .on(`click.${namespace}`, '.prev', this.showPrevResult.bind(this))\n .on(`click.${namespace}`, '.next', this.showNextResult.bind(this))\n .on(`click.${namespace}`, '.toggle-sidebar', this.toggleSidebar.bind(this))\n .on(`click.${namespace}`, false);\n }\n\n showPrevResult() {\n if (this.currentMatchIndex === 0) { return; }\n if (this.br.mode === this.br.constModeThumb) { this.br.switchMode(this.br.constMode1up); }\n if (!~this.currentMatchIndex) {\n this.currentMatchIndex = this.getClosestMatchIndex((start, end, comparator) => end[0] > comparator) + 1;\n }\n this.br.$('.BRnavline .BRsearch').eq(--this.currentMatchIndex).click();\n this.updateResultsPosition();\n this.updateSearchNavigationButtons();\n }\n\n showNextResult() {\n if (this.currentMatchIndex + 1 === this.matches.length) { return; }\n if (this.br.mode === this.br.constModeThumb) { this.br.switchMode(this.br.constMode1up); }\n if (!~this.currentMatchIndex) {\n this.currentMatchIndex = this.getClosestMatchIndex((start, end, comparator) => start[start.length - 1] > comparator) - 1;\n }\n this.br.$('.BRnavline .BRsearch').eq(++this.currentMatchIndex).click();\n this.updateResultsPosition();\n this.updateSearchNavigationButtons();\n }\n\n /**\n * Obtains closest match based on the logical comparison function passed in.\n * When the comparison function returns true, the starting (left) half of the\n * matches array is used in the binary split, else the ending (right) half is\n * used. A recursive call is made to perform the same split and comparison\n * on the winning half of the matches. This is traditionally known as binary\n * search (https://en.wikipedia.org/wiki/Binary_search_algorithm), and in\n * most cases (medium to large search result arrays) should outperform\n * traversing the array from start to finish. In the case of small arrays,\n * the speed difference is negligible.\n *\n * @param {function} comparisonFn\n * @return {number} matchIndex\n */\n getClosestMatchIndex(comparisonFn) {\n const matchPages = this.matches.map((m) => m.par[0].page);\n const currentPage = this.br.currentIndex() + 1;\n const closestTo = (pool, comparator) => {\n if (pool.length === 1) { return pool[0]; }\n const start = pool.slice(0, pool.length / 2);\n const end = pool.slice(pool.length / 2);\n return closestTo((comparisonFn(start, end, comparator) ? start : end), comparator);\n };\n\n const closestPage = closestTo(matchPages, currentPage);\n return this.matches.indexOf(this.matches.find((m) => m.par[0].page === closestPage));\n }\n\n updateResultsPosition() {\n if (!this.dom.searchNavigation) return;\n this.dom.searchNavigation.find('[data-id=resultsCount]').text(this.resultsPosition());\n }\n\n updateSearchNavigationButtons() {\n if (!this.dom.searchNavigation) return;\n this.dom.searchNavigation.find('.prev').attr('disabled', !this.currentMatchIndex);\n this.dom.searchNavigation.find('.next').attr('disabled', this.currentMatchIndex + 1 === this.matches.length);\n }\n\n teardownSearchNavigation() {\n if (!this.dom.searchNavigation) {\n this.dom.searchNavigation = $('.BRsearch-navigation');\n }\n if (!this.dom.searchNavigation.length) { return; }\n\n this.dom.searchNavigation.off('.searchNavigation').remove();\n this.dom.searchNavigation = null;\n this.br.resize();\n }\n\n setCurrentMatchIndex() {\n let matchingSearchResult;\n if (this.br.mode === this.br.constModeThumb) {\n this.currentMatchIndex = -1;\n return;\n }\n if (this.br.mode === this.br.constMode2up) {\n matchingSearchResult = this.find2upMatchingSearchResult();\n }\n else {\n matchingSearchResult = this.find1upMatchingSearchResult();\n }\n this.currentMatchIndex = this.matches.indexOf(matchingSearchResult);\n }\n\n find1upMatchingSearchResult() {\n return this.matches.find((m) => this.br.currentIndex() === m.par[0].page - 1);\n }\n\n find2upMatchingSearchResult() {\n return this.matches.find((m) => this.br._isIndexDisplayed(m.par[0].page - 1));\n }\n\n updateSearchNavigation() {\n if (!this.matches.length) { return; }\n\n this.setCurrentMatchIndex();\n this.updateResultsPosition();\n this.updateSearchNavigationButtons();\n }\n\n /**\n * @param {boolean} bool\n */\n togglePinsFor(bool) {\n const pinsVisibleState = bool ? 'visible' : 'hidden';\n this.br.refs.$BRfooter.find('.BRsearch').css({ visibility: pinsVisibleState });\n }\n\n buildToolbarSearch() {\n const toolbarSearch = document.createElement('span');\n toolbarSearch.classList.add('BRtoolbarSection', 'BRtoolbarSectionSearch');\n toolbarSearch.innerHTML = `\n <form class=\"BRbooksearch desktop\">\n <input type=\"search\" name=\"query\" class=\"BRsearchInput\" value=\"\" placeholder=\"Search inside\"/>\n <button type=\"submit\" class=\"BRsearchSubmit\">\n <img src=\"${this.br.options.imagesBaseURL}icon_search_button.svg\" />\n </button>\n </form>\n `;\n return toolbarSearch;\n }\n\n /**\n * @param {array} matches\n */\n renderPins(matches) {\n matches.forEach((match) => {\n const pageIndex = this.br.book.leafNumToIndex(match.par[0].page);\n const uiStringSearch = \"Search result\"; // i18n\n const percentThrough = this.br.constructor.util.cssPercentage(pageIndex, this.br.book.getNumLeafs() - 1);\n\n let html = match.html;\n if (html.length > 200) {\n const start = Math.max(0, html.indexOf('<mark>') - 100);\n if (start != 0) {\n html = '…' + match.html\n .substring(start)\n // Make sure at word boundary though\n .replace(/^\\S+/, '');\n }\n }\n // draw marker\n $('<div>')\n .addClass('BRsearch')\n .css({\n left: percentThrough,\n })\n .attr('title', uiStringSearch)\n .append(`\n <div class=\"BRquery\">\n <main>${html}</main>\n <footer>Page ${match.displayPageNumber}</footer>\n </div>\n `)\n .appendTo(this.br.$('.BRnavline'))\n .on(\"mouseenter\", (event) => {\n // remove from other markers then turn on just for this\n // XXX should be done when nav slider moves\n const marker = event.currentTarget;\n const tooltip = marker.querySelector('.BRquery');\n const tooltipOffset = tooltip.getBoundingClientRect();\n const targetOffset = marker.getBoundingClientRect();\n const boxSizeAdjust = parseInt(getComputedStyle(tooltip).paddingLeft) * 2;\n if (tooltipOffset.x - boxSizeAdjust < 0) {\n tooltip.style.setProperty('transform', `translateX(-${targetOffset.left - boxSizeAdjust}px)`);\n }\n $('.BRsearch,.BRchapter').removeClass('front');\n $(event.target).addClass('front');\n })\n .on(\"mouseleave\", (event) => $(event.target).removeClass('front'))\n .on(\"click\", () => { this.br.plugins.search.jumpToMatch(match.matchIndex); });\n });\n }\n\n /**\n * @param {boolean} show\n */\n toggleSearchPending(show = false) {\n if (show) {\n this.br.showProgressPopup(\"Search results will appear below...\", () => this.progressPopupClosed());\n }\n else {\n this.br.removeProgressPopup();\n }\n }\n\n /**\n * Primary callback when user cancels search popup\n */\n progressPopupClosed() {\n this.toggleSearchPending();\n this.cancelSearch();\n }\n\n renderErrorModal(textIsProcessing = false) {\n const errorDetails = `${!textIsProcessing ? 'The text may still be processing. ' : ''}Please try again.`;\n this.renderModalMessage(`\n Sorry, there was an error with your search.\n <br />\n ${errorDetails}\n `);\n this.delayModalRemovalFor(4000);\n }\n\n renderBookNotIndexedModal() {\n this.renderModalMessage(`\n <p>\n This book hasn't been indexed for searching yet.\n We've just started indexing it, so search should be available soon.\n <br />\n Please try again later. Thanks!\n </p>\n `);\n this.delayModalRemovalFor(5000);\n }\n\n renderResultsEmptyModal() {\n this.renderModalMessage('No matches were found.');\n this.delayModalRemovalFor(2000);\n }\n\n /**\n * @param {string} messageHTML The innerHTML string used to popupate the modal contents\n */\n renderModalMessage(messageHTML) {\n const modal = document.createElement('div');\n modal.classList.add('BRprogresspopup', 'search_modal');\n modal.innerHTML = messageHTML;\n this.br.refs.$br[0].append(modal);\n }\n\n /**\n * @param {number} timeoutMS\n */\n delayModalRemovalFor(timeoutMS) {\n setTimeout(this.br.removeProgressPopup.bind(this.br), timeoutMS);\n }\n\n /**\n * @param {Event} e\n */\n submitHandler(e) {\n e.preventDefault();\n const query = e.target.querySelector('[name=\"query\"]').value;\n if (!query.length) { return false; }\n this.br.search(query);\n this.emptyMatches();\n this.toggleSearchPending(true);\n return false;\n }\n\n /**\n * @param {Event} e\n * @param {object} properties\n * @param {object} properties.results\n * @param {object} properties.options\n */\n handleSearchCallback(e, { results, options }) {\n this.matches = results.matches;\n this.setCurrentMatchIndex();\n this.teardownSearchNavigation();\n this.renderSearchNavigation();\n this.bindSearchNavigationEvents();\n this.renderPins(results.matches);\n this.toggleSearchPending(false);\n if (options.goToFirstResult) {\n $(document).one('BookReader:pageChanged', () => {\n this.br.resize();\n });\n } else {\n this.br.resize();\n }\n }\n\n handleSearchStarted() {\n this.emptyMatches();\n this.br.plugins.search.removeSearchHilites();\n this.removeResultPins();\n this.toggleSearchPending(true);\n this.teardownSearchNavigation();\n this.setQuery(this.br.plugins.search.searchTerm);\n }\n\n /**\n * Event listener for: `BookReader:SearchCallbackError`\n * @param {CustomEvent} event\n */\n handleSearchCallbackError(event = {}) {\n this.toggleSearchPending(false);\n const isIndexed = event?.detail?.props?.results?.indexed;\n this.renderErrorModal(isIndexed);\n }\n\n handleSearchCallbackBookNotIndexed() {\n this.toggleSearchPending(false);\n this.renderBookNotIndexedModal();\n }\n\n handleSearchCallbackEmpty() {\n this.toggleSearchPending(false);\n this.renderResultsEmptyModal();\n }\n\n bindEvents() {\n const namespace = 'BookReader:';\n\n window.addEventListener(`${namespace}SearchCallbackError`, this.handleSearchCallbackError.bind(this));\n $(document).on(`${namespace}SearchCallback`, this.handleSearchCallback.bind(this))\n .on(`${namespace}SearchStarted`, this.handleSearchStarted.bind(this))\n .on(`${namespace}SearchCallbackBookNotIndexed`, this.handleSearchCallbackBookNotIndexed.bind(this))\n .on(`${namespace}SearchCallbackEmpty`, this.handleSearchCallbackEmpty.bind(this))\n .on(`${namespace}pageChanged`, this.updateSearchNavigation.bind(this));\n\n this.dom.toolbarSearch.querySelector('form').addEventListener('submit', this.submitHandler.bind(this));\n }\n}\n\nexport default SearchView;\n","// @ts-check\nimport { escapeHTML, escapeRegExp } from '../../BookReader/utils.js';\n/** @typedef {import('@/src/plugins/search/plugin.search.js').SearchInsideResults} SearchInsideResults */\n/** @typedef {import('@/src/plugins/search/plugin.search.js').LeafNum} LeafNum */\n/** @typedef {import('@/src/plugins/search/plugin.search.js').PageNumString} PageNumString */\n\n/**\n * @param {string} match\n * @param {string} preTag\n * @param {string} postTag\n * @returns {string}\n */\nexport function renderMatch(match, preTag, postTag) {\n // Search results are returned as a text blob with the hits wrapped in\n // triple mustaches. Hits occasionally include text beyond the search\n // term, so everything within the staches is captured and wrapped.\n const preTagRe = escapeRegExp(escapeHTML(preTag));\n const postTagRe = escapeRegExp(escapeHTML(postTag));\n // [^] matches any character, including line breaks\n const regex = new RegExp(`${preTagRe}([^]+?)${postTagRe}`, 'g');\n return escapeHTML(match)\n .replace(regex, '<mark>$1</mark>')\n // Fix trailing hyphens. This over-corrects but is net useful.\n .replace(/(\\b)- /g, '$1');\n}\n\n/**\n * Attach some fields to search inside results\n * @param {SearchInsideResults} results\n * @param {(pageNum: LeafNum) => PageNumString} displayPageNumberFn\n * @param {string} preTag\n * @param {string} postTag\n * @param {string | null} bookLanguage The ISO 639-1 language code of the book\n */\nexport function marshallSearchResults(results, displayPageNumberFn, preTag, postTag, bookLanguage) {\n // Attach matchIndex to a few things to make it easier to identify\n // an active/selected match\n\n for (const [index, match] of results.matches.entries()) {\n match.matchIndex = index;\n match.displayPageNumber = displayPageNumberFn(match.par[0].page);\n match.html = renderMatch(match.text, preTag, postTag);\n match.lang = bookLanguage;\n for (const par of match.par) {\n for (const box of par.boxes) {\n box.matchIndex = index;\n }\n }\n }\n}\n","// @ts-check\n/**\n * Plugin for Archive.org book search\n * Events fired at various points throughout search processing are published\n * on the document DOM element. These can be subscribed to using jQuery's event\n * binding method `$.fn.on`. All of the events are prefixed with a BookReader\n * namespace. The events are:\n *\n * @event BookReader:SearchStarted - When a search form is submitted, immediately\n * before an AJAX call is made to request search results\n * @event BookReader:SearchCallback - When the search AJAX call is returned and at\n * least one result is returned. The event callback receives an object\n * with the `results`, plugin `options`, and the BookReader `instance`\n * @event BookReader:SearchCallbackError - When the AJAX request returns an error.\n * Receives the `results` and `instance`\n * @event BookReader:SearchCallbackNotIndexed - When a message is received that\n * the book has not had OCR text indexed yet. Receives `instance`\n * @event BookReader:SearchCallbackEmpty - When no results found. Receives\n * `instance`\n * @event BookReader:SearchCanceled - When no results found. Receives\n * `instance`\n */\nimport { poll } from '../../BookReader/utils.js';\nimport { renderBoxesInPageContainerLayer } from '../../BookReader/PageContainer.js';\nimport SearchView from './view.js';\nimport { marshallSearchResults } from './utils.js';\nimport { BookReaderPlugin } from '../../BookReaderPlugin.js';\nimport { applyVariables } from '../../util/strings.js';\nimport { toISO6391 } from '../tts/utils.js';\n/** @typedef {import('../../BookReader/PageContainer').PageContainer} PageContainer */\n/** @typedef {import('../../BookReader/BookModel').PageIndex} PageIndex */\n/** @typedef {import('../../BookReader/BookModel').PageModel} PageModel */\n/** @typedef {import('../../BookReader/BookModel').LeafNum} LeafNum */\n/** @typedef {import('../../BookReader/BookModel').PageNumString} PageNumString */\n\n// @ts-ignore\nconst BookReader = /** @type {typeof import('@/src/BookReader.js').default} */(window.BookReader);\n\nexport class SearchPlugin extends BookReaderPlugin {\n options = {\n enabled: true,\n preTag: '{{{',\n postTag: '}}}',\n /**\n * @type {import('@/src/util/strings.js').StringWithVars}\n * Provides the variables: `query`, `preTag`, and `postTag` (from these options)\n */\n searchInsideUrl: '/fulltext/inside.php?' + [\n 'q={{query|urlencode}}',\n 'pre_tag={{preTag|urlencode}}',\n 'post_tag={{postTag|urlencode}}',\n ].join('&'),\n /** @type {string} */\n initialSearchTerm: null,\n goToFirstResult: false,\n }\n\n /**\n * @override\n * @param {Partial<SearchPlugin['options']>} options\n **/\n setup(options) {\n super.setup(options);\n\n this.searchTerm = '';\n /** @type {SearchInsideResults | null} */\n this.searchResults = null;\n this.searchInsideUrl = this.options.searchInsideUrl;\n this.enabled = this.options.enabled;\n this.searchXHR = null;\n\n /** @type { {[pageIndex: number]: SearchInsideMatchBox[]} } */\n this._searchBoxesByIndex = {};\n\n if (this.enabled) {\n this.searchView = new SearchView({\n br: this.br,\n searchCancelledCallback: () => {\n this._cancelSearch();\n this.br.trigger('SearchCanceled', { term: this.searchTerm, instance: this.br });\n },\n });\n } else {\n this.searchView = null;\n }\n }\n\n /** @override */\n init() {\n super.init();\n\n if (!this.enabled) return;\n\n this.searchView.init();\n if (this.options.initialSearchTerm) {\n /**\n * this.search() take two parameter\n * 1. this.options.initialSearchTerm - search term\n * 2. {\n * goToFirstResult: this.options.goToFirstResult,\n * suppressFragmentChange: false // always want to change fragment in URL\n * }\n */\n this.search(\n this.options.initialSearchTerm,\n { goToFirstResult: this.options.goToFirstResult, suppressFragmentChange: false },\n );\n } else if (this.br.urlPlugin?.getUrlParam('focus') === 'search') {\n this.searchView.toggleSidebar();\n }\n }\n\n /**\n * @override\n * @protected\n * @param {JQuery<HTMLElement>} $toolbarElement\n */\n _configureToolbar($toolbarElement) {\n if (!this.enabled) { return; }\n if (this.searchView.dom.toolbarSearch) {\n $toolbarElement.find('.BRtoolbarSectionInfo').after(this.searchView.dom.toolbarSearch);\n }\n return $toolbarElement;\n }\n\n /**\n * @override\n * @param {import (\"@/src/BookReader/PageContainer.js\").PageContainer} pageContainer\n */\n _configurePageContainer(pageContainer) {\n if (this.enabled && pageContainer.page && pageContainer.page.index in this._searchBoxesByIndex) {\n const pageIndex = pageContainer.page.index;\n const boxes = this._searchBoxesByIndex[pageIndex];\n renderBoxesInPageContainerLayer(\n 'searchHiliteLayer',\n boxes,\n pageContainer.page,\n pageContainer.$container[0],\n boxes.map(b => `match-index-${b.matchIndex}`),\n );\n }\n return pageContainer;\n }\n\n /**\n * Submits search request\n *\n * @param {string} term\n * @param {Partial<SearchOptions>} overrides\n */\n async search(term = '', overrides = {}) {\n /** @type {SearchOptions} */\n const defaultOptions = {\n goToFirstResult: false, /* jump to the first result (default=false) */\n disablePopup: false, /* don't show the modal progress (default=false) */\n suppressFragmentChange: false, /* don't change the URL on initial load */\n error: null, /* optional error handler (default=null) */\n success: null, /* optional success handler (default=null) */\n\n };\n const options = jQuery.extend({}, defaultOptions, overrides);\n this.suppressFragmentChange = options.suppressFragmentChange;\n this.searchCancelled = false;\n\n // strip slashes, since this goes in the url\n this.searchTerm = term.replace(/\\//g, ' ');\n\n if (!options.suppressFragmentChange) {\n this.br.trigger(BookReader.eventNames.fragmentChange);\n }\n\n // Add quotes to the term. This is to compenstate for the backends default OR query\n // term = term.replace(/['\"]+/g, '');\n // term = '\"' + term + '\"';\n\n const url = applyVariables(this.options.searchInsideUrl, this.br.options.vars, {\n query: term,\n preTag: this.options.preTag,\n postTag: this.options.postTag,\n });\n\n const callSearchResultsCallback = (searchInsideResults) => {\n if (this.searchCancelled) {\n return;\n }\n const responseHasError = searchInsideResults.error || !searchInsideResults.matches.length;\n const hasCustomError = typeof options.error === 'function';\n const hasCustomSuccess = typeof options.success === 'function';\n\n if (responseHasError) {\n console.error('Search Inside Response Error', searchInsideResults.error || 'matches.length == 0');\n hasCustomError\n ? options.error.call(this, searchInsideResults, options)\n : this.BRSearchCallbackError(searchInsideResults);\n } else {\n hasCustomSuccess\n ? options.success.call(this, searchInsideResults, options)\n : this.BRSearchCallback(searchInsideResults, options);\n }\n };\n\n this.br.trigger('SearchStarted', { term: this.searchTerm, instance: this.br });\n callSearchResultsCallback(await $.ajax({\n url: url,\n cache: true,\n xhrFields: {\n withCredentials: this.br.protected,\n },\n beforeSend: xhr => { this.searchXHR = xhr; },\n }));\n }\n\n /**\n * cancels AJAX Call\n * emits custom event\n */\n _cancelSearch() {\n this.searchXHR?.abort();\n this.searchView.clearSearchFieldAndResults(false);\n this.searchTerm = '';\n this.searchXHR = null;\n this.searchCancelled = true;\n this.searchResults = null;\n }\n\n /**\n * External function to cancel search\n * checks for term & xhr in flight before running\n */\n cancelSearchRequest() {\n this.searchCancelled = true;\n if (this.searchXHR !== null) {\n this._cancelSearch();\n this.searchView.toggleSearchPending();\n this.br.trigger('SearchCanceled', { term: this.searchTerm, instance: this.br });\n }\n }\n\n /**\n * Search Results return handler\n * @param {SearchInsideResults} results\n * @param {object} options\n * @param {boolean} options.goToFirstResult\n */\n BRSearchCallback(results, options) {\n const bookLangCode = toISO6391(this.br.options.bookLanguage);\n marshallSearchResults(\n results,\n pageNum => this.br.book.getPageNum(this.br.book.leafNumToIndex(pageNum)),\n this.options.preTag,\n this.options.postTag,\n bookLangCode,\n );\n this.searchResults = results || null;\n\n this.updateSearchHilites();\n this.br.removeProgressPopup();\n if (options.goToFirstResult) {\n this.jumpToMatch(0);\n }\n this.br.trigger('SearchCallback', { results, options, instance: this.br });\n }\n\n /**\n * Main search results error handler\n * @param {SearchInsideResults} results\n */\n BRSearchCallbackError(results) {\n this._BRSearchCallbackError(results);\n }\n\n /**\n * @private draws search results error\n * @param {SearchInsideResults} results\n */\n _BRSearchCallbackError(results) {\n this.searchResults = results;\n const payload = {\n term: this.searchTerm,\n results,\n instance: this.br,\n };\n if (results.error) {\n this.br.trigger('SearchCallbackError', payload);\n } else if (0 == results.matches.length) {\n if (false === results.indexed) {\n this.br.trigger('SearchCallbackBookNotIndexed', payload);\n return;\n }\n this.br.trigger('SearchCallbackEmpty', payload);\n }\n }\n\n /**\n * updates search on-page highlights controller\n */\n updateSearchHilites() {\n /** @type {SearchInsideMatch[]} */\n const matches = this.searchResults?.matches || [];\n /** @type { {[pageIndex: number]: SearchInsideMatchBox[]} } */\n const boxesByIndex = {};\n\n // Clear any existing svg layers\n this.removeSearchHilites();\n\n // Group by pageIndex\n for (const match of matches) {\n for (const box of match.par[0].boxes) {\n const pageIndex = this.br.book.leafNumToIndex(box.page);\n const pageBoxes = boxesByIndex[pageIndex] || (boxesByIndex[pageIndex] = []);\n pageBoxes.push(box);\n }\n }\n\n // update any already created pages\n for (const [pageIndexString, boxes] of Object.entries(boxesByIndex)) {\n const pageIndex = parseFloat(pageIndexString);\n const page = this.br.book.getPage(pageIndex);\n const pageContainers = this.br.getActivePageContainerElementsForIndex(pageIndex);\n for (const container of pageContainers) {\n renderBoxesInPageContainerLayer('searchHiliteLayer', boxes, page, container, boxes.map(b => `match-index-${b.matchIndex}`));\n }\n }\n\n this._searchBoxesByIndex = boxesByIndex;\n }\n\n /**\n * remove search highlights\n */\n removeSearchHilites() {\n $(this.br.getActivePageContainerElements()).find('.searchHiliteLayer').remove();\n }\n\n /**\n * Goes to the page specified. If the page is not viewable, tries to load the page\n * FIXME Most of this logic is IA specific, and should be less integrated into here\n * or at least more configurable.\n * @param {number} matchIndex\n */\n async jumpToMatch(matchIndex) {\n const match = this.searchResults?.matches[matchIndex];\n const book = this.br.book;\n const pageIndex = book.leafNumToIndex(match.par[0].page);\n const page = /** @type {PageModel} */(book.getPage(pageIndex));\n const onNearbyPage = Math.abs(this.br.currentIndex() - pageIndex) < 3;\n await this.br.requestPage(page);\n /* this updates the URL */\n if (!this.br._isIndexDisplayed(pageIndex)) {\n this.suppressFragmentChange = false;\n this.br.jumpToIndex(pageIndex, { ariaLive: true, allowUnviewable: true });\n }\n\n // Scroll/flash in the ui\n const $boxes = await poll(() => $(`rect.match-index-${match.matchIndex}`), { until: result => result.length > 0 });\n if ($boxes.length) {\n $boxes.css('animation', 'none');\n this.br.scrollIntoView($boxes[0], {\n block: 'center',\n inline: 'center',\n behavior: onNearbyPage ? 'smooth' : 'auto',\n });\n // wait for animation to start\n await new Promise(resolve => setTimeout(resolve, 100));\n $boxes.removeAttr(\"style\");\n }\n }\n\n /**\n * Removes all search pins\n */\n removeSearchResults(suppressFragmentChange = false) {\n this.removeSearchHilites(); //be sure to set all box.divs to null\n this.searchTerm = null;\n this.searchResults = null;\n if (!suppressFragmentChange) {\n this.br.trigger(BookReader.eventNames.fragmentChange);\n }\n }\n}\nBookReader?.registerPlugin('search', SearchPlugin);\n\n/**\n * @typedef {object} SearchOptions\n * @property {boolean} goToFirstResult\n * @property {boolean} disablePopup\n * @property {boolean} suppressFragmentChange\n * @property {(null|function)} error (deprecated)\n * @property {(null|function)} success (deprecated)\n */\n\n/**\n * @typedef {object} SearchInsideMatchBox\n * @property {number} page\n * @property {number} r\n * @property {number} l\n * @property {number} b\n * @property {number} t\n * @property {HTMLDivElement} [div]\n * @property {number} matchIndex This is a fake field! not part of the API response. The index of the match that contains this box in total search results matches.\n */\n\n/**\n * @typedef {object} SearchInsideMatch\n * @property {number} matchIndex This is a fake field! Not part of the API response. It is added by the JS.\n * @property {string} displayPageNumber (fake field) The page number as it should be displayed in the UI.\n * @property {string} html (computed field) The html-escaped raw html to display in the UI.\n * @property {string} text\n * @property {string} lang (fake field) The ISO 639-1 language code of the book\n * @property {Array<{ page: number, boxes: SearchInsideMatchBox[] }>} par\n */\n\n/**\n * @typedef {object} SearchInsideResults\n * @property {string} q\n * @property {string} error\n * @property {SearchInsideMatch[]} matches\n * @property {boolean} indexed\n */\n","// @ts-check\nimport langs from 'iso-language-codes';\n\n/** @type {{[lang: string]: string}} */\n// Handle odd one-off language pairs that might show up over time\nconst specialLangs = {\n \"zh-hans\": \"中文 (Zhōngwén)\",\n};\n\n/**\n * @typedef {string} ISO6391\n * Language code in ISO 639-1 format. e.g. en, fr, zh\n **/\n\n/**\n * @param {string} language in some format\n * @return {ISO6391?}\n */\nexport function toISO6391(language) {\n if (!language) return null;\n language = language.toLocaleLowerCase();\n if (specialLangs[language]) {\n return language;\n }\n const codeObj = (\n findLanguage(language, ['iso639_1']) ||\n findLanguage(language, ['iso639_2T']) ||\n findLanguage(language, ['iso639_2B', 'name', 'nativeName'])\n );\n if (codeObj) return codeObj.iso639_1;\n return null;\n}\n\n/**\n *\n * @param {string} language\n * @returns {string | null}\n */\nexport function toNativeName(language) {\n if (!language) return null;\n language = language.toLocaleLowerCase();\n if (specialLangs[language]) {\n return specialLangs[language];\n }\n const codeObj = (\n findLanguage(language, ['iso639_1']) ||\n findLanguage(language, ['iso639_2T']) ||\n findLanguage(language, ['iso639_2B', 'name', 'nativeName'])\n );\n if (codeObj?.nativeName) return codeObj.nativeName.split(\", \")[0];\n return null;\n}\n\n/** @typedef {import('iso-language-codes').Code} Code */\n\n/**\n * @param {string} language\n * @param {Array<'iso639_1' | 'iso639_2T' | 'iso639_2B' | 'nativeName' | 'name'>} fields\n * @returns {Code | null}\n */\nfunction findLanguage(language, fields) {\n if (!language) return null;\n language = language.toLowerCase();\n for (const lang of langs) {\n for (const codeType of fields) {\n if (lang[codeType]?.toLowerCase().split(\", \").includes(language)) {\n return lang;\n }\n }\n }\n return null;\n}\n\n/**\n * Checks whether the current browser supports localStorage or\n * if the current context has access to it.\n * @return {boolean}\n */\nexport function hasLocalStorage() {\n try {\n return !!window.localStorage;\n } catch (e) {\n // Will throw in sandboxed iframe\n // DOMException: Window.localStorage getter: Forbidden in a sandboxed document without the 'allow-same-origin' flag.\n return false;\n }\n}\n\nexport const DEBUG_READ_ALOUD = location.toString().indexOf('_debugReadAloud=true') != -1;\n\nexport async function checkIfFiresPause() {\n // Pick some random text so that if it accidentally speaks, it's not too annoying\n const u = new SpeechSynthesisUtterance(\"Loading\");\n let calledPause = false;\n u.addEventListener('pause', () => calledPause = true);\n speechSynthesis.speak(u);\n await new Promise(res => setTimeout(res, 10));\n speechSynthesis.pause();\n return calledPause;\n}\n","/**\n * @typedef {String} StringWithVars\n * A template string with {{foo}} style variables\n * Also supports filters, like {{bookPath|urlencode}} (See APPLY_FILTERS for the\n * supported list of filters)\n **/\n\n/**\n * Count whitespace-delimited words in a string.\n * @param {string} text\n * @return {number}\n */\nexport function countWords(text) {\n const matches = text.match(/\\S+/g);\n return matches ? matches.length : 0;\n}\n\n/**\n * @param {StringWithVars|String} template\n * @param { {[varName: string]: { toString: () => string} } } vars\n * @param { {[varName: string]: { toString: () => string} } } [overrides]\n * @returns {StringWithVars|string}\n */\nexport function applyVariables(template, vars, overrides = {}, possibleFilters = APPLY_FILTERS) {\n return template?.replace(/\\{\\{([^}]*?)\\}\\}/g, ($0, $1) => {\n if (!$1) return $0;\n /** @type {string} */\n const expression = $1;\n const [varName, ...filterNames] = expression.split('|').map(x => x.trim());\n const defined = varName in overrides || varName in vars;\n\n // If it's not defined, don't expand it at all\n if (!defined) return $0;\n\n const value = varName in overrides ? overrides[varName]\n : varName in vars ? vars[varName] : null;\n const filters = filterNames.map(n => possibleFilters[n]);\n return filters.reduce((acc, cur) => cur(acc), value && value.toString());\n });\n}\n\n/** @type { {[filterName: String]:( string => string)} } */\nexport const APPLY_FILTERS = {\n urlencode: encodeURIComponent,\n};\n"],"names":["PROPER_FUNCTION_NAME","__webpack_require__","fails","whitespaces","module","exports","METHOD_NAME","name","uncurryThis","requireObjectCoercible","toString","replace","ltrim","RegExp","rtrim","createMethod","TYPE","$this","string","start","end","Bq","$","$trim","target","proto","forced","forcedStringTrimMethod","trim","this","BookReaderPlugin","constructor","br","options","setup","Object","assign","init","_configurePageContainer","pageContainer","_configureToolbar","$toolbarElement","_bindNavigationHandlers","extendNavBar","$navBar","view","_ref","_ref$searchCancelledC","searchCancelledCallback","matches","cacheDOMElements","cancelSearch","bindEvents","dom","toolbarSearch","buildToolbarSearch","setQuery","query","val","emptyMatches","removeResultPins","remove","clearSearchFieldAndResults","dispatchEventWhenComplete","arguments","length","undefined","plugins","search","removeSearchResults","teardownSearchNavigation","trigger","toggleSidebar","renderSearchNavigation","selector","before","concat","resultsPosition","searchNavigation","positionMessage","currentMatchIndex","bindSearchNavigationEvents","namespace","on","bind","showPrevResult","showNextResult","mode","constModeThumb","switchMode","constMode1up","getClosestMatchIndex","comparator","eq","click","updateResultsPosition","updateSearchNavigationButtons","comparisonFn","matchPages","map","m","par","page","currentPage","currentIndex","closestTo","pool","slice","closestPage","indexOf","find","text","attr","off","resize","setCurrentMatchIndex","matchingSearchResult","constMode2up","find2upMatchingSearchResult","find1upMatchingSearchResult","_isIndexDisplayed","updateSearchNavigation","togglePinsFor","bool","pinsVisibleState","refs","$BRfooter","css","visibility","document","createElement","classList","add","innerHTML","imagesBaseURL","renderPins","forEach","match","pageIndex","book","leafNumToIndex","percentThrough","util","cssPercentage","getNumLeafs","html","Math","max","substring","addClass","left","append","displayPageNumber","appendTo","event","marker","currentTarget","tooltip","querySelector","tooltipOffset","getBoundingClientRect","targetOffset","boxSizeAdjust","parseInt","getComputedStyle","paddingLeft","x","style","setProperty","removeClass","jumpToMatch","matchIndex","toggleSearchPending","showProgressPopup","progressPopupClosed","removeProgressPopup","renderErrorModal","errorDetails","renderModalMessage","delayModalRemovalFor","renderBookNotIndexedModal","renderResultsEmptyModal","messageHTML","modal","$br","timeoutMS","setTimeout","submitHandler","e","preventDefault","value","handleSearchCallback","_ref2","results","goToFirstResult","one","handleSearchStarted","removeSearchHilites","searchTerm","handleSearchCallbackError","_event$detail","isIndexed","detail","props","indexed","handleSearchCallbackBookNotIndexed","handleSearchCallbackEmpty","window","addEventListener","renderMatch","preTag","postTag","preTagRe","escapeRegExp","escapeHTML","postTagRe","regex","BookReader","SearchPlugin","super","enabled","searchInsideUrl","join","initialSearchTerm","searchResults","searchXHR","_searchBoxesByIndex","searchView","SearchView","_cancelSearch","term","instance","_this$br$urlPlugin","suppressFragmentChange","urlPlugin","getUrlParam","after","index","boxes","renderBoxesInPageContainerLayer","$container","b","overrides","jQuery","extend","disablePopup","error","success","searchCancelled","eventNames","fragmentChange","url","applyVariables","vars","searchInsideResults","responseHasError","hasCustomError","hasCustomSuccess","console","call","BRSearchCallbackError","BRSearchCallback","callSearchResultsCallback","ajax","cache","xhrFields","withCredentials","protected","beforeSend","xhr","_this$searchXHR","abort","cancelSearchRequest","bookLangCode","toISO6391","bookLanguage","displayPageNumberFn","entries","_slicedToArray","lang","box","marshallSearchResults","pageNum","getPageNum","updateSearchHilites","_BRSearchCallbackError","payload","_this$searchResults","boxesByIndex","push","pageIndexString","parseFloat","getPage","pageContainers","getActivePageContainerElementsForIndex","container","getActivePageContainerElements","_this$searchResults2","onNearbyPage","abs","requestPage","jumpToIndex","ariaLive","allowUnviewable","$boxes","poll","until","result","scrollIntoView","block","inline","behavior","Promise","resolve","removeAttr","registerPlugin","specialLangs","language","toLocaleLowerCase","codeObj","findLanguage","iso639_1","toNativeName","nativeName","split","fields","toLowerCase","langs","codeType","_lang$codeType","includes","hasLocalStorage","localStorage","DEBUG_READ_ALOUD","location","countWords","template","possibleFilters","APPLY_FILTERS","$0","$1","_expression$split$map2","varName","filterNames","_arrayLikeToArray","n","reduce","acc","cur","urlencode","encodeURIComponent"],"sourceRoot":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{default as e}from"iso-language-codes";import"@internetarchive/icon-share";import"@internetarchive/icon-ellipses";export const __webpack_esm_ids__=[326];export const __webpack_esm_modules__={5703:(e,t,n)=>{var r=n(1354),o=n.n(r),i=n(6314),a=n.n(i)()(o());a.push([e.id,'.BRtextLayer,.BRtranslateLayer{z-index:2;position:absolute;top:0;left:0;color:rgba(0,0,0,0);transform-origin:0 0;pointer-events:none;cursor:text}.BRtextLayer{mix-blend-mode:multiply}.BRtranslateLayer{hyphens:auto}.BRparagraphElement{margin:0;cursor:text;font-family:Georgia,serif;line-height:0}.BRlineElement{pointer-events:all;white-space:nowrap;display:inline-block}.BRtextLayer[dir=ltr] .BRlineElement{margin-right:100%}.BRtextLayer[dir=rtl] .BRlineElement{margin-left:100%}.BRwordElement::selection,.BRspace::selection,.BRparagraphElement::selection,.BRparagraphElement br::selection{background:hsla(210,74%,62%,.4)}.BRwordElement::-moz-selection,.BRspace::-moz-selection,.BRparagraphElement::-moz-selection,.BRparagraphElement br::-moz-selection{background:hsla(210,74%,62%,.4);color:rgba(0,0,0,0)}.BRtranslateLayer ::selection{background:hsla(210,74%,62%,.4)}.BRtranslateLayer ::-moz-selection{background:hsla(210,74%,62%,.4)}.BRparagraphElement br{visibility:hidden}.BRwordElement--hyphen::after{content:"-"}.BRsmooth-zooming .BRpagecontainer:not(.BRpagecontainer--hasSelection):not(:has(hypothesis-highlight)):not(:has(.BRhighlight)) .BRtextLayer,.BRscrolling-active .BRpagecontainer:not(.BRpagecontainer--hasSelection):not(:has(hypothesis-highlight)):not(:has(.BRhighlight)) .BRtextLayer{display:none}.BRmode1up .BRpagecontainer:not(.BRpage-visible) .BRtextLayer{display:none}.BRpagecontainer img{-webkit-user-select:none;-moz-user-select:none;user-select:none}.BRtextLayer:has([_istranslated="1"],msreadoutspan){mix-blend-mode:normal}.BRwordElement[_istranslated="1"],.BRwordElement[_msttexthash],.BRspace[_istranslated="1"],.BRspace[_msttexthash]{color:#000;letter-spacing:unset !important}.BRlineElement:has([_istranslated="1"],[_msttexthash]){background:rgba(248,237,192,.8);backdrop-filter:blur(8px);color:#000;text-align:justify;width:inherit}.BRlineElement:has([_istranslated="1"],[_msttexthash]):not(:nth-last-child(2)){text-align-last:justify}.BRlineElement[_msttexthash]{word-spacing:unset !important}.BRtranslateLayer .BRparagraphElement{pointer-events:auto;overflow-y:auto;background:rgba(248,237,192,.8);backdrop-filter:blur(8px);color:#000;line-height:1em;text-align:justify}.BRtranslateLayer .BRparagraphElement .BRlineElement{white-space:break-spaces;display:inline-block}.BRtextLayer.showingTranslation{display:none}.BRtranslateLayer .BRparagraphElement.BRtranslateHidden{display:none}.br-select-menu__root{display:none;color:#fff;color-scheme:dark;padding:2px;overflow:hidden;opacity:1;transition:opacity .2s;gap:5px}.br-select-menu__root[open]{display:flex}.br-select-menu__root[showextended]{display:block;gap:0px;background-color:#333;border-radius:10px}@starting-style{.br-select-menu__root{opacity:0}}.br-select-menu__root--scrolling{opacity:0;pointer-events:none}.br-select-menu__option{--iconWidth: 15px;--iconHeight: 15px;--iconFillColor: currentColor;background:rgba(0,0,0,0);display:flex;align-items:center;border-radius:25px;font-family:inherit;color:inherit;border:0;cursor:pointer;text-wrap:nowrap;background-color:#333;position:relative}@media(pointer: coarse)and (hover: none){.br-select-menu__option{padding:4px 8px}#br-select-more .br-select-menu__option{padding:4px}}.br-select-menu__option:hover:after{position:absolute;left:2px;right:2px;top:2px;bottom:2px;content:"";pointer-events:none;background-color:rgba(255,255,255,.1);border-radius:23px}.br-select-menu__root[showextended] .br-select-menu__option{width:100%}.br-select-menu__root[showextended] .br-select-menu__option:hover:after{border-radius:8px}.br-select-menu__icon{display:block;flex-shrink:0;width:17px;height:17px;padding:2px}.br-select-menu__label{margin-left:4px;font-size:12px;margin-right:4px}@media(hover: hover){.br-select-menu__option{padding:4px}.br-select-menu__label{width:0px;margin:0;opacity:0;interpolate-size:allow-keywords;transition:width .2s}.br-select-menu__root:hover .br-select-menu__label{width:auto;margin:0 4px;opacity:1}}.BRtextLayer .BRhighlight{background-color:#ff0;pointer-events:all;color:rgba(0,0,0,0)}@keyframes highlightTargetFlash{to{background-color:hsl(45,80%,66%)}}.BRtextLayer .BRhighlight--target-text,.BRtextLayer ::target-text{background-color:hsla(45,80%,66%,.6);color:rgba(0,0,0,0);animation:highlightTargetFlash 600ms 1 reverse}',"",{version:3,sources:["webpack://./src/css/_TextSelection.scss"],names:[],mappings:"AAAA,+BACI,SAAA,CACA,iBAAA,CACA,KAAA,CACA,MAAA,CACA,mBAAA,CACA,oBAAA,CAEA,mBAAA,CACA,WAAA,CAGJ,aACI,uBAAA,CAGJ,kBACI,YAAA,CAGJ,oBACI,QAAA,CACA,WAAA,CACA,yBAAA,CACA,aAAA,CAGJ,eACI,kBAAA,CACA,kBAAA,CACA,oBAAA,CASA,qCAAA,iBAAA,CACA,qCAAA,gBAAA,CAMA,+GACI,+BAAA,CAGJ,mIACI,+BAAA,CACA,mBAAA,CAIR,8BACI,+BAAA,CAGJ,mCACI,+BAAA,CAGJ,uBACI,iBAAA,CAKJ,8BACI,WAAA,CAMA,0RACI,YAAA,CAKR,8DACI,YAAA,CAIJ,qBACI,wBAAA,CACA,qBAAA,CACA,gBAAA,CAOJ,oDACI,qBAAA,CAIA,kHACI,UAAA,CACA,+BAAA,CAIR,uDACI,+BAAA,CACA,yBAAA,CACA,UAAA,CACA,kBAAA,CACA,aAAA,CACA,+EACI,uBAAA,CAIR,6BACI,6BAAA,CAGJ,sCACI,mBAAA,CACA,eAAA,CACA,+BAAA,CACA,yBAAA,CACA,UAAA,CACA,eAAA,CACA,kBAAA,CAGJ,qDACI,wBAAA,CACA,oBAAA,CAGJ,gCACI,YAAA,CAGJ,wDACI,YAAA,CAMJ,sBACE,YAAA,CACA,UAAA,CACA,iBAAA,CACA,WAAA,CACA,eAAA,CACA,SAAA,CACA,sBAAA,CACA,OAAA,CAEA,4BACE,YAAA,CAGF,oCACE,aAAA,CACA,OAAA,CACA,qBAAA,CACA,kBAnB0B,CAsB5B,gBArBF,sBAsBI,SAAA,CAAA,CAGJ,iCACE,SAAA,CACA,mBAAA,CAGF,wBACE,iBAAA,CACA,kBAAA,CACA,6BAAA,CACA,wBAAA,CACA,YAAA,CACA,kBAAA,CACA,kBAvCmB,CAwCnB,mBAAA,CACA,aAAA,CACA,QAAA,CACA,cAAA,CACA,gBAAA,CACA,qBAAA,CACA,iBAAA,CAEA,yCAhBF,wBAiBI,eAAA,CACA,wCACI,WAAA,CAAA,CAIN,oCACE,iBAAA,CACA,QAAA,CACA,SAAA,CACA,OAAA,CACA,UAAA,CACA,UAAA,CACA,mBAAA,CACA,qCAAA,CACA,kBAAA,CAGF,4DACI,UAAA,CACA,wEACE,iBAAA,CAKR,sBACE,aAAA,CACA,aAAA,CACA,UAAA,CACA,WAAA,CACA,WAAA,CAGF,uBACE,eAAA,CACA,cAAA,CACA,gBAAA,CAGF,qBACI,wBACI,WAAA,CAEJ,uBACI,SAAA,CACA,QAAA,CACA,SAAA,CACA,+BAAA,CACA,oBAAA,CAEJ,mDACI,UAAA,CACA,YAAA,CACA,SAAA,CAAA,CAIR,0BACI,qBAAA,CACA,kBAAA,CACA,mBAAA,CAGJ,gCACE,GAAA,gCAAA,CAAA,CAIF,kEAEI,oCAAA,CACA,mBAAA,CACA,8CAAA",sourcesContent:['.BRtextLayer, .BRtranslateLayer {\n z-index: 2;\n position: absolute;\n top: 0;\n left: 0;\n color: transparent;\n transform-origin: 0 0;\n // Make it so right-clicking on "blank" part of text layer sends events to the image (for saving)\n pointer-events: none;\n cursor: text;\n}\n\n.BRtextLayer {\n mix-blend-mode: multiply;\n}\n\n.BRtranslateLayer {\n hyphens: auto;\n}\n\n.BRparagraphElement {\n margin: 0;\n cursor: text;\n font-family: Georgia, serif;\n line-height: 0;\n}\n\n.BRlineElement {\n pointer-events: all;\n white-space: nowrap;\n display: inline-block;\n\n // We use display: inline-block, otherwise this causes every line\n // to have newlines at the end in safari. BUT, since they\'re inline,\n // if the OCR has to short line in the same paragraph, they can wrap\n // and one can go onto the other. This adds an arbitrary margin to\n // the right of each line, forcing things to wrap.\n // See eg https://www-drini.archive.org/details/countofmontecris00duma_7/page/261/mode/2up\n // Page 261, second last line on the page.\n .BRtextLayer[dir=ltr] & { margin-right: 100%; }\n .BRtextLayer[dir=rtl] & { margin-left: 100%; }\n}\n\n// Highlight colors for text selection layer\n.BRwordElement, .BRspace, .BRparagraphElement, .BRparagraphElement br {\n // these 2 properties do not work if joined\n &::selection {\n background: hsla(210, 74%, 62%, 0.4);\n }\n\n &::-moz-selection {\n background: hsla(210, 74%, 62%, 0.4);\n color:transparent;\n }\n}\n\n.BRtranslateLayer ::selection {\n background: hsla(210, 74%, 62%, 0.4);\n}\n\n.BRtranslateLayer ::-moz-selection {\n background: hsla(210, 74%, 62%, 0.4);\n}\n\n.BRparagraphElement br {\n visibility: hidden;\n}\n\n// Use CSS pseudo-elements to render the hyphens. This makes them\n// not selectable, so copy/pasting text doesn\'t include them.\n.BRwordElement--hyphen::after {\n content: "-";\n}\n\n// Hide text layer for performance during zooming & scrolling\n.BRsmooth-zooming, .BRscrolling-active {\n // If the text layer has an annotation, don\'t hide it\n .BRpagecontainer:not(.BRpagecontainer--hasSelection):not(:has(hypothesis-highlight)):not(:has(.BRhighlight)) .BRtextLayer {\n display: none;\n }\n}\n\n// Hide text selection layers of off-screen pages\n.BRmode1up .BRpagecontainer:not(.BRpage-visible) .BRtextLayer {\n display: none;\n}\n\n// Makes page image unselectable\n.BRpagecontainer img {\n -webkit-user-select: none;\n -moz-user-select: none;\n user-select: none;\n}\n\n\n// These are Microsoft Edge specific fixed to make some of the\n// browsers features work well. These are for the in-place\n// translation.\n.BRtextLayer:has([_istranslated="1"], msreadoutspan) {\n mix-blend-mode: normal;\n}\n\n.BRwordElement, .BRspace {\n &[_istranslated="1"], &[_msttexthash] {\n color: black;\n letter-spacing: unset !important;\n }\n}\n\n.BRlineElement:has([_istranslated="1"], [_msttexthash]) {\n background: rgba(248, 237, 192, 0.8);\n backdrop-filter: blur(8px);\n color: black;\n text-align: justify;\n width: inherit;\n &:not(:nth-last-child(2)) {\n text-align-last: justify;\n }\n}\n\n.BRlineElement[_msttexthash] {\n word-spacing: unset !important;\n}\n\n.BRtranslateLayer .BRparagraphElement {\n pointer-events: auto;\n overflow-y: auto;\n background: rgba(248, 237, 192, 0.8);\n backdrop-filter: blur(8px);\n color:black;\n line-height: 1em;\n text-align: justify;\n}\n\n.BRtranslateLayer .BRparagraphElement .BRlineElement {\n white-space: break-spaces;\n display: inline-block;\n}\n\n.BRtextLayer.showingTranslation {\n display: none;\n}\n\n.BRtranslateLayer .BRparagraphElement.BRtranslateHidden {\n display: none;\n}\n\n\n$select-menu-radius: 25px;\n$select-menu-extended-radius: 10px;\n.br-select-menu__root {\n display: none;\n color: white;\n color-scheme: dark;\n padding: 2px;\n overflow: hidden;\n opacity: 1;\n transition: opacity 0.2s;\n gap: 5px;\n\n &[open] {\n display: flex;\n }\n\n &[showextended] {\n display: block;\n gap: 0px;\n background-color: #333;\n border-radius: $select-menu-extended-radius;\n }\n\n @starting-style {\n opacity: 0;\n }\n}\n.br-select-menu__root--scrolling {\n opacity: 0;\n pointer-events: none;\n}\n\n.br-select-menu__option {\n --iconWidth: 15px;\n --iconHeight: 15px;\n --iconFillColor: currentColor;\n background: transparent;\n display: flex;\n align-items: center;\n border-radius: $select-menu-radius;\n font-family: inherit;\n color: inherit;\n border: 0;\n cursor: pointer;\n text-wrap: nowrap;\n background-color: #333;\n position: relative;\n\n @media (pointer: coarse) and (hover: none) {\n padding: 4px 8px;\n #br-select-more & {\n padding: 4px;\n }\n }\n\n &:hover:after {\n position: absolute;\n left: 2px;\n right: 2px;\n top: 2px;\n bottom: 2px;\n content: "";\n pointer-events: none;\n background-color: rgba(255, 255, 255, 0.1);\n border-radius: calc($select-menu-radius - 2px);\n }\n\n .br-select-menu__root[showextended] & {\n width:100%;\n &:hover:after {\n border-radius: calc($select-menu-extended-radius - 2px);\n }\n }\n}\n\n.br-select-menu__icon {\n display: block;\n flex-shrink: 0;\n width: 17px;\n height: 17px;\n padding: 2px;\n}\n\n.br-select-menu__label {\n margin-left: 4px;\n font-size: 12px;\n margin-right: 4px;\n}\n\n@media (hover: hover) {\n .br-select-menu__option {\n padding: 4px;\n }\n .br-select-menu__label {\n width: 0px;\n margin: 0;\n opacity: 0;\n interpolate-size: allow-keywords;\n transition: width 0.2s;\n }\n .br-select-menu__root:hover .br-select-menu__label {\n width: auto;\n margin: 0 4px;\n opacity: 1;\n }\n}\n\n.BRtextLayer .BRhighlight {\n background-color: yellow;\n pointer-events: all;\n color: transparent;\n}\n\n@keyframes highlightTargetFlash {\n to { background-color: hsla(45, 80%, 66%, 1); }\n}\n\n// Style URI TextFragments, eg ?text=example\n.BRtextLayer .BRhighlight--target-text, .BRtextLayer ::target-text {\n // Similar colour to the default one used in Safari, Firefox. Note Chrome uses a purple colour\n background-color: hsla(45, 80%, 66%, 0.6);\n color: transparent;\n animation: highlightTargetFlash 600ms 1 reverse;\n}\n'],sourceRoot:""}]);const s=a.toString();n.d(t,["A",0,s])},6314:e=>{e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var n="",r=void 0!==t[5];return t[4]&&(n+="@supports (".concat(t[4],") {")),t[2]&&(n+="@media ".concat(t[2]," {")),r&&(n+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),n+=e(t),r&&(n+="}"),t[2]&&(n+="}"),t[4]&&(n+="}"),n}).join("")},t.i=function(e,n,r,o,i){"string"==typeof e&&(e=[[null,e,void 0]]);var a={};if(r)for(var s=0;s<this.length;s++){var l=this[s][0];null!=l&&(a[l]=!0)}for(var c=0;c<e.length;c++){var d=[].concat(e[c]);r&&a[d[0]]||(void 0!==i&&(void 0===d[5]||(d[1]="@layer".concat(d[5].length>0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=i),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),o&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=o):d[4]="".concat(o)),t.push(d))}},t}},1354:e=>{e.exports=function(e){var t=e[1],n=e[3];if(!n)return t;if("function"==typeof btoa){var r=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),o="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(r),i="/*# ".concat(o," */");return[t].concat([i]).join("\n")}return[t].join("\n")}},706:(e,t,n)=>{var r=n(350).PROPER,o=n(9039),i=n(7452);e.exports=function(e){return o(function(){return!!i[e]()||"
"!=="
"[e]()||r&&i[e].name!==e})}},3802:(e,t,n)=>{var r=n(9504),o=n(7750),i=n(655),a=n(7452),s=r("".replace),l=RegExp("^["+a+"]+"),c=RegExp("(^|[^"+a+"])["+a+"]+$"),d=function(e){return function(t){var n=i(o(t));return 1&e&&(n=s(n,l,"")),2&e&&(n=s(n,c,"$1")),n}};e.exports={start:d(1),end:d(2),Bq:d(3)}},7452:e=>{e.exports="\t\n\v\f\r \u2028\u2029\ufeff"},2762:(e,t,n)=>{var r=n(6518),o=n(3802).Bq;r({target:"String",proto:!0,forced:n(706)("trim")},{trim:function(){return o(this)}})},6869:(e,t,n)=>{n.d(t,{S:()=>r});class r{constructor(e){this.br=e,this.options}setup(e){this.options=Object.assign({},this.options,e)}init(){}_configurePageContainer(e){}_configureToolbar(e){}_bindNavigationHandlers(){}extendNavBar(e){}}},6364:(e,t,n)=>{n.d(t,{r:()=>f}),n(9463),n(3792),n(6910),n(3362),n(7495),n(2762),n(2953),n(8408);var r=n(1391),o=n(6869),i=n(8965),a=n(5369),s=n(9748),l=n(3991),c=n(4297),d=n(5703),h=n(1669);function u(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,i,a,s=[],l=!0,c=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(s.push(r.value),s.length!==t);l=!0);}catch(e){c=!0,o=e}finally{try{if(!l&&null!=n.return&&(a=n.return(),Object(a)!==a))return}finally{if(c)throw o}}return s}}(e,t)||function(e,t){if(e){if("string"==typeof e)return p(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?p(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function p(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function g(e,t,n){return(t=function(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}const m=window.BookReader;class f extends o.S{constructor(e){super(e),g(this,"options",{enabled:!0,fullDjvuXmlUrl:null,singlePageDjvuXmlUrl:null,jsonp:!1,maxProtectedWords:200}),g(this,"djvuPagesPromise",null),g(this,"pageTextCache",new a.l),g(this,"maxWordRendered",2500),g(this,"_jumpedToHighlight",!1),g(this,"_measurementDocument",void 0),this.rtl="rl"===this.br.pageProgression,this.textSelectionManager=new l.bg(".BRtextLayer",this.br,{selectionElement:[".BRwordElement",".BRspace","mark"]},this.options.maxProtectedWords)}init(){if(!this.options.enabled)return;const e=document.createElement("iframe");e.setAttribute("aria-hidden","true"),e.tabIndex=-1,e.style.cssText="position:fixed; top:-99999px; left:-99999px; width:2000px; height:4000px; border:0; visibility:hidden;",document.body.appendChild(e),this._measurementDocument=e.contentDocument;const t=this._measurementDocument.createElement("style");t.textContent=d.A,this._measurementDocument.head.appendChild(t),this.br.on("pageVisible",(e,t)=>{let n=t.pageContainerEl;const r=n.querySelector(".BRtextLayer");r&&this.br.trigger("textLayerVisible",{pageContainerEl:n,textLayer:r})}),this.loadData(),this.textSelectionManager.init();const n=new URLSearchParams(location.search).get("text");n&&(this.br.targetTextFragment=l.yc.fromString(n,this.br.book,this.br.firstIndex),this.initTextFragment())}async initTextFragment(){if(this.br.options.verifyTextFragment&&!await this.br.options.verifyTextFragment.call(this,this.br.targetTextFragment))return;const e=this.br.targetTextFragment;this.br.on("textLayerVisible",async(t,n)=>{let r=n.pageContainerEl,o=n.textLayer;if(e.pageIndex===parseFloat(r.getAttribute("data-index"))){const t=(0,l.lB)(o,e,"BRhighlight--target-text");this._jumpedToHighlight||(this.br.scrollIntoView(t[0],{behavior:"smooth",block:"center"}),this._jumpedToHighlight=!0)}});const t=this.br.book.getPage(this.br.targetTextFragment.pageIndex);t.isViewable||(await this.br.requestPage(t),this.br.jumpToIndex(t.index,{ariaLive:!0,allowUnviewable:!0}))}_configurePageContainer(e){var t;return this.options.enabled&&this.br.mode!==this.br.constModeThumb&&null!==(t=e.page)&&void 0!==t&&t.isViewable&&this.createTextLayer(e),e}loadData(){this.options.singlePageDjvuXmlUrl||(this.djvuPagesPromise=h.ajax({type:"GET",url:(0,i.gT)(this.options.fullDjvuXmlUrl,this.br.options.vars),dataType:this.options.jsonp?"jsonp":"html",cache:!0,xhrFields:{withCredentials:this.br.protected},error:e=>{}}).then(e=>{try{const t=h.parseXML(e);return t&&h(t).find("OBJECT")}catch(e){return}}))}async getPageText(e){if(this.options.singlePageDjvuXmlUrl){const t=this.pageTextCache.entries.find(t=>t.index==e);if(t)return t.response;const n=await h.ajax({type:"GET",url:(0,i.gT)(this.options.singlePageDjvuXmlUrl,this.br.options.vars,{pageIndex:e}),dataType:this.options.jsonp?"jsonp":"html",cache:!0,xhrFields:{withCredentials:this.br.protected},error:e=>{}});try{const t=h.parseXML(n),r=t&&h(t).find("OBJECT")[0];return this.pageTextCache.add({index:e,response:r}),r}catch(e){return}}else{const t=await this.djvuPagesPromise;if(t)return t[e]}}async createTextLayer(e){const t=e.page.index,n=e.$container;if(n.find(".BRtextLayer").length)return;const o=await this.getPageText(t);if(!o)return;h(o).find("WORD").filter((e,t)=>{const n=u(t.getAttribute("coords").split(",").map(parseFloat),4),r=n[0],o=n[3];if(0==r&&0==o)return console.error("Found invalid ocr word coordinates"),!0}).remove(),b(o);const i=h(o).find("WORD").length;if(i>this.maxWordRendered)return void console.log("Page ".concat(t," has too many words (").concat(i," > ").concat(this.maxWordRendered,"). Not rendering text layer."));const a=(0,r.Ql)(e.page,"BRtextLayer");await Promise.resolve();const l=parseFloat(e.$container[0].style.width)/e.page.width,d=parseFloat(e.$container[0].style.height)/e.page.height;a.style.transform="scale(".concat(l,", ").concat(d,")");const p=(0,s.YH)(this.br.options.bookLanguage);p&&a.setAttribute("lang",p),a.setAttribute("dir",this.rtl?"rtl":"ltr");const g=h(o).find("PARAGRAPH[coords]").toArray(),m=g.map(e=>{const t=this.renderParagraph(e);return a.appendChild(t),t}),f=A(a,".BRparagraphElement",this._measurementDocument);let y=0;for(const e of(0,c.yU)(g,m)){var v=u(e,2);const t=v[0],n=v[1],r=h(t).attr("coords").split(",").map(parseFloat),o=f.get(n),i=u(r,4),s=i[0],l=i[2],c=i[3],d=this.rtl?o.right-l:s-o.left,p=c-(o.top+y);n.style[this.rtl?"marginRight":"marginLeft"]="".concat(d,"px"),n.style.marginTop="".concat(p,"px"),y+=p,a.appendChild(n),a.appendChild(document.createTextNode("\n"))}n.append(a),this.textSelectionManager.stopPageFlip(n),this.br.trigger("textLayerRendered",{pageIndex:t,pageContainer:e}),n.hasClass("BRpage-visible")&&this.br.trigger("textLayerVisible",{pageContainerEl:n[0],textLayer:a})}renderParagraph(e){const t=document.createElement("p");t.classList.add("BRparagraphElement"),e.getAttribute("x-role")&&(t.classList.add("ocr-role-header-footer"),t.ariaHidden="true");const n=u(h(e).attr("coords").split(",").map(parseFloat),4),r=n[0],o=n[1],i=n[2],a=n[3],s=[],l=h(e).find("LINE[coords]").toArray();if(!l.length)return t;for(const e of(0,c.pp)((0,c.Px)(l,y))){var d=u(e,3);const n=d[0],r=d[1],o=d[2],i=r.ocrElement==l[l.length-1],a=document.createElement("span");a.classList.add("BRlineElement");for(const e of r.words.entries()){var p=u(e,2);const t=p[0],r=p[1],i=u(h(r).attr("coords").split(",").map(parseFloat),4),l=i[1],c=i[2],d=i[3],g=l-d;if(s.push(g),0==t&&null!=n&&n.lastWord.textContent.trim().endsWith("-")){const e=u(h((o||n).firstWord).attr("coords").split(",").map(parseFloat),3)[0];h(r).attr("coords","".concat(e,",").concat(l,",").concat(c,",").concat(d))}const m=document.createElement("span");if(m.setAttribute("class","BRwordElement"),m.textContent=r.textContent.trim(),t>0){const e=document.createElement("span");e.classList.add("BRspace"),e.textContent=" ",e.setAttribute("aria-label"," "),a.append(e),a.appendChild(document.createTextNode(" "))}a.appendChild(m)}const c=r.lastWord.textContent.trim().endsWith("-"),g=a.children[a.children.length-1];c&&!i&&(g.textContent=g.textContent.trim().slice(0,-1),g.classList.add("BRwordElement--hyphen")),t.appendChild(a),i||c||t.appendChild(document.createTextNode(" "))}s.sort((e,t)=>e-t);const g=s[Math.floor(.85*s.length)]+4;t.style.left="".concat(r,"px"),t.style.top="".concat(a,"px"),t.style.width="".concat(i-r,"px"),t.style.height="".concat(o-a,"px"),t.style.fontSize="".concat(g,"px");let m=A(t,".BRwordElement",this._measurementDocument);const f=h(e).find("WORD").toArray(),b=t.querySelectorAll(".BRwordElement");for(const e of(0,c.yU)(f,b)){var v=u(e,2);const t=v[0],n=v[1],r=m.get(n),o=u(h(t).attr("coords").split(",").map(parseFloat),3),i=o[0];let a=o[2]-i;t.textContent.endsWith(" ")&&(a=a*(t.textContent.length-1)/t.textContent.length);const s=a-r.width;n.style.letterSpacing="".concat(s/(t.textContent.length-1),"px")}m=A(t,".BRwordElement",this._measurementDocument);const x=A(t,".BRspace",this._measurementDocument),C=h(e).find("LINE[coords]").toArray(),w=Array.from(t.querySelectorAll(".BRlineElement"));let E=a;for(const e of(0,c.yU)(C,w)){var k=u(e,2);const t=k[0],n=k[1],o=h(t).find("WORD").toArray();let a=this.rtl?i:r;for(const e of(0,c.yU)(o,n.querySelectorAll(".BRwordElement"))){var B=u(e,2);const t=B[0],n=B[1];{const e=m.get(n),r=u(h(t).attr("coords").split(",").map(parseFloat),3),o=r[0],i=r[2],s=this.rtl?-(i-a):o-a;if(n.previousElementSibling){const e=n.previousElementSibling;e.style.letterSpacing="".concat(s-x.get(e).width,"px")}else n.style[this.rtl?"paddingRight":"paddingLeft"]="".concat(s,"px");this.rtl?a-=s+e.width:a+=s+e.width}}const s=Math.min(...o.map(e=>parseFloat(h(e).attr("coords").split(",")[3])))-E;n.previousElementSibling&&(n.previousElementSibling.style.lineHeight="".concat(s,"px"),E+=s)}return w[w.length-1].style.lineHeight="".concat(o-E,"px"),t.appendChild(document.createElement("br")),t}}function A(e,t,n){const r={position:e.style.position,visibility:e.style.visibility,top:e.style.top,left:e.style.left,transform:e.style.transform};e.style.position="absolute",e.style.visibility="hidden",e.style.top="0",e.style.left="0",e.style.transform="none",n.body.appendChild(e);const o=new Map(Array.from(e.querySelectorAll(t)).map(e=>{const t=e.getBoundingClientRect();return[e,new v(t.left+n.defaultView.scrollX,t.top+n.defaultView.scrollY,t.width,t.height)]}));return n.body.removeChild(e),Object.assign(e.style,r),document.adoptNode(e),o}function y(e){const t=h(e).find("WORD").toArray();return{ocrElement:e,words:t,firstWord:t[0],lastWord:t[t.length-1]}}function b(e){if(h(e).attr("coords")||!e.children)return;const t=h(e).children().toArray();if(0===t.length)return;for(const e of t)b(e);const n=[];for(const e of t)h(e).attr("coords")&&n.push(h(e).attr("coords").split(",").map(parseFloat));const r=function(e){let t=1/0,n=-1/0,r=-1/0,o=1/0;for(const a of e){var i=u(a,4);const e=i[0],s=i[1],l=i[2],c=i[3];t=Math.min(t,e),n=Math.max(n,s),r=Math.max(r,l),o=Math.min(o,c)}return[t,n,r,o]}(n);Math.abs(r[0])!=1/0&&h(e).attr("coords",r.join(","))}null==m||m.registerPlugin("textSelection",f);class v{constructor(e,t,n,r){this.x=e,this.y=t,this.width=n,this.height=r}get right(){return this.x+this.width}get bottom(){return this.y+this.height}get top(){return this.y}get left(){return this.x}}},9748:(t,n,r)=>{r.d(n,{$x:()=>c,ND:()=>l,YH:()=>i,_4:()=>a}),r(4423),r(3792),r(3362),r(2953);const o={"zh-hans":"中文 (Zhōngwén)"};function i(e){if(!e)return null;if(e=e.toLocaleLowerCase(),o[e])return e;const t=s(e,["iso639_1"])||s(e,["iso639_2T"])||s(e,["iso639_2B","name","nativeName"]);return t?t.iso639_1:null}function a(e){if(!e)return null;if(e=e.toLocaleLowerCase(),o[e])return o[e];const t=s(e,["iso639_1"])||s(e,["iso639_2T"])||s(e,["iso639_2B","name","nativeName"]);return null!=t&&t.nativeName?t.nativeName.split(", ")[0]:null}function s(t,n){if(!t)return null;t=t.toLowerCase();for(const o of e)for(const e of n){var r;if(null!==(r=o[e])&&void 0!==r&&r.toLowerCase().split(", ").includes(t))return o}return null}function l(){try{return!!window.localStorage}catch(e){return!1}}const c=-1!=location.toString().indexOf("_debugReadAloud=true")},3991:(e,t,n)=>{n.d(t,{yc:()=>ce,bg:()=>V,lB:()=>ae});var r=n.cw(function(e,t){var r=n(3724),o=n(2106),i=n(5213),a=n(7979);r&&!i.correct&&(o(RegExp.prototype,"flags",{configurable:!0,get:a}),i.correct=!0)}),o=n.cw(function(e,t){var r=n(6518),o=n(9565),i=n(7476),a=n(3994),s=n(2529),l=n(7750),c=n(8014),d=n(655),h=n(8551),u=n(34),p=n(2195),g=n(788),m=n(1034),f=n(5966),A=n(6840),y=n(9039),b=n(8227),v=n(2293),x=n(7829),C=n(6682),w=n(1181),E=n(6395),k=b("matchAll"),B="RegExp String",R=B+" Iterator",S=w.set,_=w.getterFor(R),T=RegExp.prototype,L=TypeError,I=i("".indexOf),P=i("".matchAll),N=!!P&&!y(function(){P("a",/./)}),O=a(function(e,t,n,r){S(this,{type:R,regexp:e,string:t,global:n,unicode:r,done:!1})},B,function(){var e=_(this);if(e.done)return s(void 0,!0);var t=e.regexp,n=e.string,r=C(t,n);return null===r?(e.done=!0,s(void 0,!0)):e.global?(""===d(r[0])&&(t.lastIndex=x(n,c(t.lastIndex),e.unicode)),s(r,!1)):(e.done=!0,s(r,!1))}),D=function(e){var t,n,r,o=h(this),i=d(e),a=v(o,RegExp),s=d(m(o));return t=new a(a===RegExp?o.source:o,s),n=!!~I(s,"g"),r=!!~I(s,"u")||!!~I(s,"v"),t.lastIndex=c(o.lastIndex),new O(t,i,n,r)};r({target:"String",proto:!0,forced:N},{matchAll:function(e){var t,n,r,i,a=l(this);if(u(e)){if(g(e)&&(t=d(l(m(e))),!~I(t,"g")))throw new L("`.matchAll` does not allow non-global regexes");if(N)return P(a,e);if(void 0===(r=f(e,k))&&E&&"RegExp"===p(e)&&(r=D),r)return o(r,e,a)}else if(N)return P(a,e);return n=d(a),i=new RegExp(e,"g"),E?o(D,i,n):i[k](n)}}),E||k in T||A(T,k,D)}),i=n.cw(function(e,t){o()});n(4423),n(9463),n(3792),n(3362),n(4864),n(7495),r(),n(5440),n(2762),i(),n(2953),n(8408);var a=n(8965),s=n(1669);function l(e,t,n){return(t=function(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}class c{constructor(e,t){l(this,"selecting",!1),l(this,"startedInSelector",!1),l(this,"target",null),l(this,"lastKnownFocusNode",null),l(this,"_onSelectionChange",()=>{const e=window.getSelection();if(!e)return;const t=function(e){if(!e.isCollapsed)return!1;for(let t=0;t<e.rangeCount;t++)if(!e.getRangeAt(t).collapsed)return!1;return!0}(e);if(!this.selecting&&e.toString()){const t=s(e.anchorNode).closest(this.selector)[0];if(!t)return;this.target=t,this.selecting=!0,this.lastKnownFocusNode=e.focusNode,this.handler("started",this.target)}this.selecting&&this.lastKnownFocusNode!=e.focusNode&&e.toString()&&!t&&(this.lastKnownFocusNode=e.focusNode,this.handler("changed",this.target)),!this.selecting||!t&&e.toString()&&s(e.anchorNode).closest(this.selector)[0]||(this.selecting=!1,this.lastKnownFocusNode=null,this.handler("cleared",this.target))}),this.selector=e,this.handler=t}attach(){document.addEventListener("selectionchange",this._onSelectionChange)}detach(){document.removeEventListener("selectionchange",this._onSelectionChange)}}var d,h,u,p,g,m,f,A,y,b,v,x,C,w,E,k,B,R=n(9880),S=n(7597),_=n(6054),T=n(6248),L=(n(790),n(395)),I=n(4297),P=n(1669);function N(e,t){return t||(t=e.slice(0)),Object.freeze(Object.defineProperties(e,{raw:{value:Object.freeze(t)}}))}function O(e,t,n,r){var o=D();if(r)for(var i=0;i<r.length;i++)o=r[i](o);var a=t(function(e){o.initializeInstanceElements(e,s.elements)},n),s=o.decorateClass(function(e){for(var t=[],n=function(e){return"method"===e.kind&&e.key===i.key&&e.placement===i.placement},r=0;r<e.length;r++){var o,i=e[r];if("method"===i.kind&&(o=t.find(n)))if(M(i.descriptor)||M(o.descriptor)){if(j(i)||j(o))throw new ReferenceError("Duplicated methods ("+i.key+") can't be decorated.");o.descriptor=i.descriptor}else{if(j(i)){if(j(o))throw new ReferenceError("Decorators can't be placed on different accessors with for the same property ("+i.key+").");o.decorators=i.decorators}q(i,o)}else t.push(i)}return t}(a.d.map(F)),e);return o.initializeClassElements(a.F,s.elements),o.runClassFinishers(a.F,s.finishers)}function D(){D=function(){return e};var e={elementsDefinitionOrder:[["method"],["field"]],initializeInstanceElements:function(e,t){["method","field"].forEach(function(n){t.forEach(function(t){t.kind===n&&"own"===t.placement&&this.defineClassElement(e,t)},this)},this)},initializeClassElements:function(e,t){var n=e.prototype;["method","field"].forEach(function(r){t.forEach(function(t){var o=t.placement;if(t.kind===r&&("static"===o||"prototype"===o)){var i="static"===o?e:n;this.defineClassElement(i,t)}},this)},this)},defineClassElement:function(e,t){var n=t.descriptor;if("field"===t.kind){var r=t.initializer;n={enumerable:n.enumerable,writable:n.writable,configurable:n.configurable,value:void 0===r?void 0:r.call(e)}}Object.defineProperty(e,t.key,n)},decorateClass:function(e,t){var n=[],r=[],o={static:[],prototype:[],own:[]};if(e.forEach(function(e){this.addElementPlacement(e,o)},this),e.forEach(function(e){if(!j(e))return n.push(e);var t=this.decorateElement(e,o);n.push(t.element),n.push.apply(n,t.extras),r.push.apply(r,t.finishers)},this),!t)return{elements:n,finishers:r};var i=this.decorateConstructor(n,t);return r.push.apply(r,i.finishers),i.finishers=r,i},addElementPlacement:function(e,t,n){var r=t[e.placement];if(!n&&-1!==r.indexOf(e.key))throw new TypeError("Duplicated element ("+e.key+")");r.push(e.key)},decorateElement:function(e,t){for(var n=[],r=[],o=e.decorators,i=o.length-1;i>=0;i--){var a=t[e.placement];a.splice(a.indexOf(e.key),1);var s=this.fromElementDescriptor(e),l=this.toElementFinisherExtras((0,o[i])(s)||s);e=l.element,this.addElementPlacement(e,t),l.finisher&&r.push(l.finisher);var c=l.extras;if(c){for(var d=0;d<c.length;d++)this.addElementPlacement(c[d],t);n.push.apply(n,c)}}return{element:e,finishers:r,extras:n}},decorateConstructor:function(e,t){for(var n=[],r=t.length-1;r>=0;r--){var o=this.fromClassDescriptor(e),i=this.toClassDescriptor((0,t[r])(o)||o);if(void 0!==i.finisher&&n.push(i.finisher),void 0!==i.elements){e=i.elements;for(var a=0;a<e.length-1;a++)for(var s=a+1;s<e.length;s++)if(e[a].key===e[s].key&&e[a].placement===e[s].placement)throw new TypeError("Duplicated element ("+e[a].key+")")}}return{elements:e,finishers:n}},fromElementDescriptor:function(e){var t={kind:e.kind,key:e.key,placement:e.placement,descriptor:e.descriptor};return Object.defineProperty(t,Symbol.toStringTag,{value:"Descriptor",configurable:!0}),"field"===e.kind&&(t.initializer=e.initializer),t},toElementDescriptors:function(e){if(void 0!==e)return(t=e,function(e){if(Array.isArray(e))return e}(t)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(t)||function(e,t){if(e){if("string"==typeof e)return z(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?z(e,t):void 0}}(t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()).map(function(e){var t=this.toElementDescriptor(e);return this.disallowProperty(e,"finisher","An element descriptor"),this.disallowProperty(e,"extras","An element descriptor"),t},this);var t},toElementDescriptor:function(e){var t=e.kind+"";if("method"!==t&&"field"!==t)throw new TypeError('An element descriptor\'s .kind property must be either "method" or "field", but a decorator created an element descriptor with .kind "'+t+'"');var n=$(e.key),r=e.placement+"";if("static"!==r&&"prototype"!==r&&"own"!==r)throw new TypeError('An element descriptor\'s .placement property must be one of "static", "prototype" or "own", but a decorator created an element descriptor with .placement "'+r+'"');var o=e.descriptor;this.disallowProperty(e,"elements","An element descriptor");var i={kind:t,key:n,placement:r,descriptor:Object.assign({},o)};return"field"!==t?this.disallowProperty(e,"initializer","A method descriptor"):(this.disallowProperty(o,"get","The property descriptor of a field descriptor"),this.disallowProperty(o,"set","The property descriptor of a field descriptor"),this.disallowProperty(o,"value","The property descriptor of a field descriptor"),i.initializer=e.initializer),i},toElementFinisherExtras:function(e){return{element:this.toElementDescriptor(e),finisher:H(e,"finisher"),extras:this.toElementDescriptors(e.extras)}},fromClassDescriptor:function(e){var t={kind:"class",elements:e.map(this.fromElementDescriptor,this)};return Object.defineProperty(t,Symbol.toStringTag,{value:"Descriptor",configurable:!0}),t},toClassDescriptor:function(e){var t=e.kind+"";if("class"!==t)throw new TypeError('A class descriptor\'s .kind property must be "class", but a decorator created a class descriptor with .kind "'+t+'"');this.disallowProperty(e,"key","A class descriptor"),this.disallowProperty(e,"placement","A class descriptor"),this.disallowProperty(e,"descriptor","A class descriptor"),this.disallowProperty(e,"initializer","A class descriptor"),this.disallowProperty(e,"extras","A class descriptor");var n=H(e,"finisher");return{elements:this.toElementDescriptors(e.elements),finisher:n}},runClassFinishers:function(e,t){for(var n=0;n<t.length;n++){var r=(0,t[n])(e);if(void 0!==r){if("function"!=typeof r)throw new TypeError("Finishers must return a constructor.");e=r}}return e},disallowProperty:function(e,t,n){if(void 0!==e[t])throw new TypeError(n+" can't have a ."+t+" property.")}};return e}function F(e){var t,n=$(e.key);"method"===e.kind?t={value:e.value,writable:!0,configurable:!0,enumerable:!1}:"get"===e.kind?t={get:e.value,configurable:!0,enumerable:!1}:"set"===e.kind?t={set:e.value,configurable:!0,enumerable:!1}:"field"===e.kind&&(t={configurable:!0,writable:!0,enumerable:!0});var r={kind:"field"===e.kind?"field":"method",key:n,placement:e.static?"static":"field"===e.kind?"own":"prototype",descriptor:t};return e.decorators&&(r.decorators=e.decorators),"field"===e.kind&&(r.initializer=e.value),r}function q(e,t){void 0!==e.descriptor.get?t.descriptor.get=e.descriptor.get:t.descriptor.set=e.descriptor.set}function j(e){return e.decorators&&e.decorators.length}function M(e){return void 0!==e&&!(void 0===e.value&&void 0===e.writable)}function H(e,t){var n=e[t];if(void 0!==n&&"function"!=typeof n)throw new TypeError("Expected '"+t+"' to be a function");return n}function z(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function U(e,t,n,r){var o=W(J(1&r?e.prototype:e),t,n);return 2&r&&"function"==typeof o?function(e){return o.apply(n,e)}:o}function W(){return W="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,n){var r=function(e,t){for(;!{}.hasOwnProperty.call(e,t)&&null!==(e=J(e)););return e}(e,t);if(r){var o=Object.getOwnPropertyDescriptor(r,t);return o.get?o.get.call(arguments.length<3?e:n):o.value}},W.apply(null,arguments)}function J(e){return J=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},J(e)}function G(e,t,n){return(t=$(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function $(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}const X="BRhighlightStorage";class V{get selectMenuEnabled(){var e,t;return(null===(e=this.br.plugins.experiments)||void 0===e?void 0:e.isEnabled("copyLinkToHighlight"))||(null===(t=this.br.plugins.experiments)||void 0===t?void 0:t.isEnabled("annotateHighlight"))}constructor(e,t,n,r){let o=n.selectionElement;G(this,"options",{maxProtectedWords:200}),G(this,"selectMenu",void 0),G(this,"_onSelectionChange",(e,t)=>{if("started"===e)this.textSelectingMode(t);else if("cleared"===e)this.defaultMode(t);else if("changed"!==e)throw new Error("Unknown type ".concat(e))}),G(this,"_limitSelection",()=>{const e=window.getSelection();if(!e.rangeCount)return;const t=e.getRangeAt(0),n=!!t.startContainer.parentElement.closest(".BRcontainer"),r=!!t.endContainer.parentElement.closest(".BRcontainer");if(!n&&!r)return;if(!n||!r)return void e.removeAllRanges();const o=(0,I.eU)((0,I.nC)(Y(t,"element"),e=>e.classList.contains(this.selectionElement[0].replace(".",""))),this.options.maxProtectedWords-1);if(!o||t.endContainer.parentNode==o)return;const i=document.createRange();i.setStart(t.startContainer,t.startOffset),i.setEnd(o.firstChild,o.textContent.length),e.removeAllRanges(),e.addRange(i)}),this.layer=e,this.br=t,this.selectionElement=o,this.selectionObserver=new c(this.layer,this._onSelectionChange),this.options.maxProtectedWords=r||200,this.selectMenu=new Z(t),this.selectMenu.className="br-select-menu__root"}init(){this.attach(),new c(this.layer,e=>{var t,n;"started"==e&&(null===(t=this.br.plugins.archiveAnalytics)||void 0===t||t.sendEvent("BookReader","SelectStart"),this.br.refs.$br.find(".BRpagecontainer--hasSelection").removeClass("BRpagecontainer--hasSelection"),P(window.getSelection().anchorNode).closest(".BRpagecontainer").addClass("BRpagecontainer--hasSelection"),this.mouseIsDown||this.showSelectMenu()),"changed"==e&&!this.mouseIsDown&&null!==(n=window.getSelection())&&void 0!==n&&n.toString()&&this.showSelectMenu(),"cleared"==e&&this.hideSelectMenu()}).attach()}attach(){this.selectionObserver.attach(),this.br.protected&&(document.addEventListener("selectionchange",this._limitSelection),P(document.body).on("contextmenu dragstart copy",e=>{const t=document.getSelection();if(null!=t&&t.toString()&&P(this.layer).toArray().some(e=>t.containsNode(e,!0)))return e.preventDefault(),!1}))}detach(){this.selectionObserver.detach(),this.br.protected&&document.removeEventListener("selectionchange",this._limitSelection)}interceptCopy(e){e[0].addEventListener("copy",e=>{const t=document.getSelection();e.clipboardData.setData("text/plain",t.toString()),e.preventDefault()})}stopPageFlip(e){const t=e.find(this.layer);t.length&&(t.each((e,t)=>this.defaultMode(t)),this.br.protected||this.interceptCopy(e))}defaultMode(e){const t=P(e).closest(".BRpagecontainer");e.style.pointerEvents="none",t.find("img").css("pointer-events","auto"),P(e).off(".textSelectPluginHandler");const n=this.mouseIsDown;let r=this.mouseIsDown;n&&(e.style.pointerEvents="auto"),P(e).on("mousedown.textSelectPluginHandler",e=>{this.mouseIsDown=!0,P(e.target).is(this.selectionElement.join(", "))&&e.stopPropagation()}),P(e).on("mouseup.textSelectPluginHandler",t=>{this.mouseIsDown=!1,e.style.pointerEvents="none",r&&(r=!1,t.stopPropagation())})}textSelectingMode(e){const t=P(e).closest(".BRpagecontainer");e.style.pointerEvents="all",t.find("img").css("pointer-events","none"),P(e).off(".textSelectPluginHandler"),P(e).on("mousedown.textSelectPluginHandler",e=>{1==e.which&&(this.mouseIsDown=!0,e.stopPropagation())}),P(e).on("mouseup.textSelectPluginHandler",e=>{this.mouseIsDown=!1,1==e.which&&(e.stopPropagation(),this.showSelectMenu())})}showSelectMenu(){this.selectMenuEnabled&&(this.selectMenu.copyLinkToHighlightEnabled=this.br.plugins.experiments.isEnabled("copyLinkToHighlight"),this.selectMenu.highlightAnnotationEnabled=this.br.plugins.experiments.isEnabled("annotateHighlight"),this.selectMenu.isConnected||document.body.append(this.selectMenu),this.selectMenu.open?this.selectMenu.repositionToSelection():this.selectMenu.show())}hideSelectMenu(){this.selectMenu.hide()}}function Y(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text+element";return function*(){const n=e.startContainer,r=e.endContainer;let o=!1;const i=e=>"text"===t&&e.nodeType===Node.TEXT_NODE||"element"===t&&e.nodeType===Node.ELEMENT_NODE||"text+element"===t;yield*function e(t){let n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=n.children,s=void 0===a||a,l=n.parents,c=void 0===l||l,d=n.siblings,h=void 0===d||d;return function*(){if(t===r)return o=!0,void(i(t)&&(yield t));if(i(t)&&(yield t),!(s&&t.firstChild&&(yield*e(t.firstChild,{children:!0,parents:!1,siblings:!0}),o))){if(h)for(let n=t.nextSibling;n;n=n.nextSibling)if(yield*e(n,{children:!0,parents:!1,siblings:!1}),o)return;c&&t.parentNode&&(yield*e(t.parentNode,{children:!1,parents:!0,siblings:!0}))}}()}(n)}()}O([(0,_.EM)("br-menu-option")],function(e,t){class n extends t{constructor(){super(...arguments),e(this)}}return{F:n,d:[{kind:"field",decorators:[(0,_.MZ)({type:String})],key:"icon",value:()=>""},{kind:"field",decorators:[(0,_.MZ)({type:String})],key:"label",value:()=>""},{kind:"field",key:"temporaryText",value:()=>null},{kind:"field",decorators:[(0,_.MZ)({type:Number,attribute:"temporary-text-duration"})],key:"temporaryTextDuration",value:()=>1200},{kind:"field",decorators:[(0,_.MZ)({type:String,attribute:"aria-label"})],key:"ariaLabel",value:()=>""},{kind:"field",decorators:[(0,_.MZ)({type:Boolean,attribute:"live-label"})],key:"liveLabel",value:()=>!1},{kind:"field",decorators:[(0,_.MZ)({type:Boolean})],key:"temporaryTextVisible",value:()=>!1},{kind:"field",key:"temporaryTextTimeoutId",value:()=>null},{kind:"method",key:"createRenderRoot",value:function(){return this}},{kind:"method",key:"disconnectedCallback",value:function(){null!=this.temporaryTextTimeoutId&&(window.clearTimeout(this.temporaryTextTimeoutId),this.temporaryTextTimeoutId=null),U(n,"disconnectedCallback",this,3)([])}},{kind:"method",key:"showTemporaryText",value:function(e){null!=e&&e.trim()&&(this.temporaryText=e,this.temporaryTextVisible=!0,null!=this.temporaryTextTimeoutId&&window.clearTimeout(this.temporaryTextTimeoutId),this.temporaryTextTimeoutId=window.setTimeout(()=>{this.temporaryTextVisible=!1,this.temporaryText=null,this.temporaryTextTimeoutId=null},this.temporaryTextDuration))}},{kind:"method",key:"renderIcon",value:function(){return"share"===this.icon?(0,S.qy)(d||(d=N(['<ia-icon-share class="br-select-menu__icon" aria-hidden="true"></ia-icon-share>']))):"edit-pencil"===this.icon?(0,S.qy)(h||(h=N(['<ia-icon-edit-pencil class="br-select-menu__icon" aria-hidden="true"></ia-icon-edit-pencil>']))):"ellipses"===this.icon?(0,S.qy)(u||(u=N(['<ia-icon-ellipses class="br-select-menu__icon" aria-hidden="true"></ia-icon-ellipses>']))):""}},{kind:"method",key:"render",value:function(){var e,t;const n=null!==(e=this.label)&&void 0!==e?e:"",r=!!this.temporaryText,o=r?this.temporaryText:n,i=r&&this.temporaryTextVisible,a=i?o:n,s=null===(t=this.ariaLabel)||void 0===t?void 0:t.trim(),l=s&&s!==a.trim()?s:void 0,c=n.length>=o.length?n:o;return(0,S.qy)(p||(p=N(['\n <button\n type="button"\n class="br-select-menu__option"\n role="menuitem"\n aria-label=',"\n >\n ","\n ","\n </button>\n "])),(0,T.J)(l),this.renderIcon(),r||n?r?(0,S.qy)(g||(g=N(['\n <span class="br-select-menu__label-wrap" style="display: inline-flex; position: relative; align-items: center;">\n <span\n class="br-select-menu__label"\n style="visibility: hidden;"\n aria-hidden="true"\n >','</span>\n <span\n class="br-select-menu__label"\n style="position: absolute; inset: 0; display: inline-flex; align-items: center;"\n aria-live=',"\n >","</span>\n </span>\n "])),c,this.liveLabel?"polite":"off",i?o:n):(0,S.qy)(m||(m=N(['\n <span class="br-select-menu__label" aria-live=',">","</span>\n "])),this.liveLabel?"polite":"off",n):"")}}]}},S.WF);let Z=O([(0,_.EM)("br-select-menu")],function(e,t){class n extends t{constructor(t){super(),e(this),this.br=t}}return{F:n,d:[{kind:"field",key:"br",value:void 0},{kind:"field",decorators:[(0,_.MZ)({type:Boolean,reflect:!0})],key:"showExtended",value:()=>!1},{kind:"field",decorators:[(0,_.P)("#br-select-copy-link-option")],key:"copyLinkOption",value:void 0},{kind:"field",decorators:[(0,_.MZ)({type:Boolean,reflect:!0})],key:"open",value:()=>!1},{kind:"field",decorators:[(0,_.MZ)({type:Boolean})],key:"copyLinkToHighlightEnabled",value:()=>!0},{kind:"field",decorators:[(0,_.MZ)({type:Boolean})],key:"highlightAnnotationEnabled",value:()=>!0},{kind:"method",key:"createRenderRoot",value:function(){return this}},{kind:"field",key:"_scrollTimeoutId",value:()=>null},{kind:"field",key:"_onScroll",value(){return()=>{this.classList.add("br-select-menu__root--scrolling"),null!=this._scrollTimeoutId&&clearTimeout(this._scrollTimeoutId),this._scrollTimeoutId=window.setTimeout(()=>{this._scrollTimeoutId=null,this.repositionToSelection(),this.classList.remove("br-select-menu__root--scrolling")},150)}}},{kind:"method",key:"connectedCallback",value:function(){U(n,"connectedCallback",this,3)([]),this.setAttribute("role","menu"),this.setAttribute("aria-label","Text selection actions"),this.setAttribute("aria-orientation","vertical")}},{kind:"method",key:"disconnectedCallback",value:function(){U(n,"disconnectedCallback",this,3)([]),window.removeEventListener("scroll",this._onScroll,{capture:!0}),null!=this._scrollTimeoutId&&(clearTimeout(this._scrollTimeoutId),this._scrollTimeoutId=null)}},{kind:"method",key:"renderCopyLinkToHighlightOption",value:function(){return(0,S.qy)(f||(f=N(['\n <br-menu-option\n id="br-select-copy-link-option"\n @mousedown=',"\n @click=",'\n icon="share"\n label="Copy Link to Highlight"\n live-label\n ></br-menu-option>\n '])),e=>e.preventDefault(),this.handleCopyLinkToHighlight)}},{kind:"method",key:"renderRemoveOption",value:function(){return(0,S.qy)(A||(A=N(["\n <br-menu-option\n @click=",'\n icon="share"\n label="Delete Highlight and Annotation"\n ></br-menu-option>\n '])),this.handleDeleteHighlight)}},{kind:"method",key:"renderAddAnnotationOption",value:function(){return(0,S.qy)(y||(y=N(["\n <br-menu-option\n @click=",'\n icon="edit-pencil"\n label="Annotate"\n ></br-menu-option>\n '])),this.handleAddAnnotation)}},{kind:"method",key:"renderHighlightOption",value:function(){return(0,S.qy)(b||(b=N(["\n <br-menu-option\n @click=",'\n icon="edit-pencil"\n label="Highlight Selection"\n ></br-menu-option>\n '])),this.handleHighlightSave)}},{kind:"method",key:"renderShowMoreOption",value:function(){return(0,S.qy)(v||(v=N(['\n <br-menu-option\n id="br-select-more"\n @mousedown=',"\n @click=",'\n icon="ellipses"\n aria-label="Show more options"\n ></br-menu-option>\n '])),e=>e.preventDefault(),this.toggleExtendedMenu)}},{kind:"method",key:"renderLocalStorageOptions",value:function(){return(0,S.qy)(x||(x=N(["\n <br-menu-option\n @click=",'\n icon="share"\n label="Load Highlights"\n ></br-menu-option>\n <br-menu-option\n @click=','\n icon="share"\n label="Remove Stored Highlights"\n ></br-menu-option>'])),this.renderSavedHighlights,()=>{window.localStorage.removeItem(X)})}},{kind:"method",key:"renderDefaultOptions",value:function(){return(0,S.qy)(C||(C=N(["\n ","\n ","\n ","\n "])),this.copyLinkToHighlightEnabled?this.renderCopyLinkToHighlightOption():"",this.highlightAnnotationEnabled&&!this.nodesForRemoval?this.renderHighlightOption():"",this.nodesForRemoval?this.renderRemoveOption():"")}},{kind:"method",key:"renderExtendedOptions",value:function(){return(0,S.qy)(w||(w=N(["\n ","\n ","\n "])),this.renderDefaultOptions(),this.renderLocalStorageOptions())}},{kind:"method",key:"render",value:function(){var e;const t=null===(e=this.br.plugins.experiments)||void 0===e?void 0:e.isEnabled("annotateHighlight");return(0,S.qy)(E||(E=N(["\n ","\n ","\n "])),this.showExtended?this.renderExtendedOptions():this.renderDefaultOptions(),!this.showExtended&&t?this.renderShowMoreOption():"")}},{kind:"method",key:"handleCopyLinkToHighlight",value:async function(e){var t;e.preventDefault();const n=window.getSelection(),r=n.getRangeAt(0),o=this.getNodeTextLayer(r.startContainer);if(!o)return void console.warn("No text layer found for selection");const i=ce.fromSelection(n,[o]),a=i.toUrl();await navigator.clipboard.writeText(a),null===(t=this.copyLinkOption)||void 0===t||t.showTemporaryText("Copied!"),this.br.trigger("copyLinkToHighlight",{textFragment:i,link:a})}},{kind:"method",key:"toggleExtendedMenu",value:function(e){e.preventDefault(),this.showExtended=!this.showExtended}},{kind:"method",key:"getNodeTextLayer",value:function(e){var t;if(!e)return null;const n=e instanceof Element?e:e.parentElement;return null!==(t=null==n?void 0:n.closest(".BRtextLayer"))&&void 0!==t?t:null}},{kind:"method",key:"handleHighlightSave",value:function(){const e=window.getSelection(),t="backward"===e.direction?e.focusNode.parentElement:e.anchorNode.parentElement,n=this.getNodeTextLayer(t),r=ce.fromSelection(e,[n.parentElement]);r.uuid="id-".concat(crypto.randomUUID().split("-")[4]);const o=this.loadHighlightsFromLocalStorage();o.push(r),this.saveToLocalStorage(o),this.renderSavedHighlights()}},{kind:"method",key:"handleAddAnnotation",value:function(e){}},{kind:"method",key:"handleDeleteHighlight",value:function(){if(this.nodesForRemoval){const e=le(this.nodesForRemoval[0]);for(const e of this.nodesForRemoval){const t=e.textContent,n=e.parentElement;n.classList.contains("BRwordElement")||n.classList.contains("BRspace")?(e.remove(),n.textContent=t):console.log("This element did not match removal criteria:",n,e)}this.deleteHighlight(e),this.clearNodesForRemoval()}else console.log("there is nothing to remove")}},{kind:"method",key:"deleteHighlight",value:function(e){const t=this.loadHighlightsFromLocalStorage();for(let n=0;n<t.length;n++)if(t[n].uuid===e)return t.splice(n,1),void this.saveToLocalStorage(t)}},{kind:"method",key:"saveToLocalStorage",value:function(e){window.localStorage.setItem(X,JSON.stringify(e.map(e=>e.toJSON())))}},{kind:"method",key:"loadHighlightsFromLocalStorage",value:function(){return JSON.parse(window.localStorage.getItem(X)||"[]").map(e=>ce.fromJSON(e))}},{kind:"method",key:"renderSavedHighlights",value:function(){for(const e of this.loadHighlightsFromLocalStorage()){const t=this.br.$(".pagediv".concat(e.pageIndex," .BRtextLayer"))[0];t&&(ae(t,e),P(t).off("mouseup.BRHighlightClick").on("mouseup.BRHighlightClick",e=>{e.target.classList.contains("BRhighlight")&&(e.stopPropagation(),this.handleHighlightClick(e.target))}))}}},{kind:"method",key:"handleHighlightClick",value:function(e){const t=this.getNodeTextLayer(e),n=le(e),r=t.querySelectorAll(".".concat(n)),o=r[0],i=r[r.length-1],a=document.createRange();a.setStart(o,0),a.setEnd(i,1);const s=window.getSelection();s.removeAllRanges(),s.addRange(a),this.show()}},{kind:"method",key:"repositionToSelection",value:function(){const e=window.getSelection().getRangeAt(0).getBoundingClientRect(),t=(0,L.un)()||(0,L.m0)(),n=(0,L.m0)()?25:(0,L.un)()?15:10,r=t?60:0,o=(e.top<r?e.bottom+r:e.bottom)+n,i=Math.max(10,o)+window.scrollY,a=this.getBoundingClientRect().width,s=document.documentElement.clientWidth,l=a>e.width?e.left+e.width/2-a/2:e.left,c=(0,R.qE)(l,10,s-a-10)+window.scrollX;this.style.top="".concat(i,"px"),this.style.left="".concat(c,"px")}},{kind:"method",key:"show",value:async function(){var e;null!==(e=this.br.plugins.translate)&&void 0!==e&&e.userToggleTranslate||(this.style.zIndex="1",this.style.position="absolute",this.open=!0,this.classList.remove("br-select-menu__root--scrolling"),window.removeEventListener("scroll",this._onScroll,{capture:!0}),window.addEventListener("scroll",this._onScroll,{capture:!0,passive:!0}),await this.updateComplete,this.repositionToSelection(),this.clearNodesForRemoval())}},{kind:"method",key:"hide",value:function(){this.open&&(this.showExtended=!1,this.open=!1,window.removeEventListener("scroll",this._onScroll,{capture:!0}),this.clearNodesForRemoval())}},{kind:"field",key:"clearNodesForRemoval",value(){return()=>{this.nodesForRemoval=null,this.requestUpdate()}}}]}},S.WF);function K(e,t){t=t.trim();const n=new RegExp(String.raw(k||(k=N(["^(S+(s+|$)){1,","}"],["^(\\S+(\\s+|$)){1,","}"])),e)),r=t.match(n);return r?r[0].trim():""}function Q(e,t){t=t.trim();const n=new RegExp(String.raw(B||(B=N(["((^|s+)S+){1,","}s*?$"],["((^|\\s+)\\S+){1,","}\\s*?$"])),e)),r=t.match(n);return r?r[0].trim():""}function ee(e){for(;e.firstChild;)e=e.firstChild;return e}function te(e){for(;e.lastChild;)e=e.lastChild;return e}function ne(e){return e.replace(/(:|-,|,-|,|\n)/g,e=>1===e.length?" ":" ")}function re(e,t,n){let r=(arguments.length>3&&void 0!==arguments[3]?arguments[3]:{}).normalize,o=void 0===r?e=>e:r;if(!n.length)return;const i=n[0]===t.startContainer?t.startOffset:0,a=o(ie(t)),s=o(n[0].textContent.slice(0,i)).length,l=new RegExp(e.source,e.flags.includes("g")?e.flags:"".concat(e.flags,"g")),c=Array.from(a.matchAll(l)).map(e=>{const t=oe(s+e.index,n,!1,{normalize:o}),r=oe(s+e.index+e[0].length,n,!0,{normalize:o});if(!t||!r)return void console.warn("Could not find boundary points for regex match, skipping this match",{match:e,start:t,end:r});const i=new Range;return i.setStart(t.node,t.offset),i.setEnd(r.node,r.offset),i}).filter(e=>!!e);return null!=c&&c.length?c:void 0}function oe(e,t,n){let r=(arguments.length>3&&void 0!==arguments[3]?arguments[3]:{}).normalize,o=void 0===r?e=>e:r;const i=e;let a=0;for(const e of t){const t=e.textContent||"",r=o(t),s=a;if(s+r.length+(n?1:0)>i){const a=i-s;let l=Math.min(a,t.length);const c=n?r.substring(0,a):r.substring(a);let d=o(n?t.substring(0,a):t.substring(a));const h=(n?-1:1)*(c.length>d.length?-1:1);for(;l>=0&&l<=t.length;){if(d.length===c.length)return{node:e,offset:l};l+=h,d=o(n?t.substring(0,l):t.substring(l))}}a+=r.length}}function ie(e){const t=Array.from((0,I.nC)(Y(e,"text"),se));let n=t.map(e=>e.textContent).join("");const r=t[0],o=t[t.length-1];return e.startContainer===r&&(n=n.substring(e.startOffset)),e.endContainer===o&&(n=n.substring(0,n.length-(o.textContent.length-e.endOffset))),n}function ae(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const r=ee(e),o=te(e),i=new Range;i.setStart(r,0),i.setEnd(o,o.textContent.length);const a=Array.from((0,I.nC)(Y(i,"text"),se)),s=re(t.toRegExp({context:!0}),i,a,{normalize:ne});if(!s)return void console.warn("Could not find quote with context in page");const l=Array.from((0,I.nC)(Y(s[0],"text"),se)),c=re(t.toRegExp({context:!1}),s[0],l,{normalize:ne});if(!c)throw new Error("Could not find quote in page");const d=ee(c[0].startContainer),h=ee(c[0].endContainer),u=new Range;return u.setStart(d,0),u.setEnd(h,h.textContent.length),d.parentElement.classList.contains("BRhighlight")||h.parentElement.classList.contains("BRhighlight")?void 0:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:()=>document.createElement("mark");if(e.startContainer.nodeType!=Node.TEXT_NODE||e.endContainer.nodeType!=Node.TEXT_NODE)return[];if(e.startContainer===e.endContainer){const n=t();return e.surroundContents(n),[n]}const n=e.startContainer,r=e.cloneRange();r.setEndAfter(n);const o=e.endContainer,i=e.cloneRange();i.setStartBefore(o);const a=[];e.setStartAfter(n),e.setEndBefore(o);const s=document.createTreeWalker(e.commonAncestorContainer,NodeFilter.SHOW_ELEMENT|NodeFilter.SHOW_TEXT,{acceptNode:function(t){return e.intersectsNode(t)?t.nodeType===Node.TEXT_NODE?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP:NodeFilter.FILTER_REJECT}});let l=s.nextNode();for(;l;){if(l.nodeType===Node.TEXT_NODE){const e=t();l.parentNode.insertBefore(e,l),e.appendChild(l),a.push(e)}l=s.nextNode()}const c=t();r.surroundContents(c);const d=t();return i.surroundContents(d),[c,...a,d]}(u,()=>{const e=document.createElement("mark");return e.classList.add("BRhighlight"),n&&e.classList.add(n),t.uuid&&e.classList.add(t.uuid),e})}function se(e){var t;return!(null!==(t=e.previousElementSibling)&&void 0!==t&&t.classList.contains("BRspace"))}function le(e){if(!e)return null;const t=Array.from(null==e?void 0:e.classList).filter(e=>{if(e.slice(0,2).includes("id"))return e});return t.length?t[0]:null}class ce{constructor(e){let t=e.prefix,n=e.quote,r=e.quoteStart,o=e.quoteEnd,i=e.suffix,a=e.pageNumber,s=e.pageIndex,l=e.uuid;this.prefix=t,this.quote=null!=n?n:null,this.quoteStart=null!=r?r:null,this.quoteEnd=null!=o?o:null,this.suffix=i,this.pageNumber=a,this.pageIndex=s,this.uuid=null!=l?l:null}static fromString(e,t,n){const r=e.match(/^(?:(.*?):)?(?:(.*?)-,)?(.*?)(?:,-(.*))?$/);if(!r)throw new Error("Invalid text fragment format: ".concat(e));const o=r[1]||null,i=r[2]||null,a=(r[3]||"").split(",");let s=null,l=null,c=null;if(1===a.length)s=a[0];else{if(2!==a.length)throw new Error("Invalid text fragment quote format: ".concat(e));l=a[0],c=a[1]}const d=r[4]||null,h=o?t.getPageIndex(o):n;if("number"!=typeof h)throw new Error("Could not determine page index for text fragment with page number ".concat(o));if(!(s||l&&c))throw new Error("Invalid text fragment quote format: ".concat(e));return new ce({prefix:i,quote:s,quoteStart:l,quoteEnd:c,suffix:d,pageNumber:o,pageIndex:h})}toUrl(){const e=new URLSearchParams({text:this.toNormalizedString()}),t=window.location,n=encodeURIComponent(this.pageNumber||"n".concat(this.pageIndex));if(/^#\/?page\//.test(t.hash))return"".concat(t.origin).concat(t.pathname,"?").concat(e,"#page/").concat(n);const r=t.pathname.replace(/\/page\/.*/,"").replace(/\/+$/,"");return"".concat(t.origin).concat(r,"/page/").concat(n,"?").concat(e)}toNormalizedString(){const e=e=>function(e){return e.replace(/\s+/g," ").trim()}(ne(e).trim());let t=this.pageNumber?this.pageNumber:"n".concat(this.pageIndex);t+=":",this.prefix&&(t+=e(this.prefix),t+="-,");const n=this.quote?e(this.quote):null;let r=null;if(n&&n.length>80&&(n.match(/\S+/g)||[]).length>=6){const e=K(3,n),t=Q(3,n);e&&t&&(r={quoteStart:e,quoteEnd:t})}if(n&&!r)t+=n;else if(r)t+="".concat(r.quoteStart,",").concat(r.quoteEnd);else{if(!this.quoteStart||!this.quoteEnd)throw new Error("Text fragment requires either a quote or quoteStart/quoteEnd");t+="".concat(this.quoteStart,",").concat(this.quoteEnd)}return this.suffix&&(t+=",-",t+=e(this.suffix)),t}toRegExp(){let e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}).context,t=void 0!==e&&e;const n=this.quote?[this.quote]:[this.quoteStart,this.quoteEnd];t&&(this.prefix&&(n[0]=this.prefix+" "+n[0]),this.suffix&&(n[n.length-1]=n[n.length-1]+" "+this.suffix));const r=e=>RegExp.escape(ne(e)).replace(/(\\x20)+/g,"\\s+");return 1===n.length?new RegExp(r(n[0]),"gi"):new RegExp(r(n[0])+"[\\s\\S]*?"+r(n[1]),"gi")}toJSON(){return{prefix:this.prefix,quote:this.quote,quoteStart:this.quoteStart,quoteEnd:this.quoteEnd,suffix:this.suffix,pageNumber:this.pageNumber,pageIndex:this.pageIndex,uuid:this.uuid}}static fromJSON(e){return new ce(e)}static fromSelection(e,t){var n,r;const o=e.getRangeAt(0),i=new Range,s=te(o.startContainer),l=ee(o.endContainer);i.setStart(s,0),i.setEnd(l,0==o.endOffset?0:null!==(n=null===(r=l.textContent)||void 0===r?void 0:r.length)&&void 0!==n?n:0);const c=document.createRange();c.setStart(ee(t[0]),0),c.setEnd(s,0);const d=document.createRange();d.setStart(l,i.endOffset);const h=te(t[t.length-1]);d.setEnd(h,Math.max(0,h.textContent.length-1));const u=ie(c);let p=Q(3,u),g=(0,a.rj)(p);const m=ie(d);let f=K(3,m),A=(0,a.rj)(f);g<3&&(f=K(6-g,m),A=(0,a.rj)(f)),A<3&&(p=Q(6-A,u),g=(0,a.rj)(p));const y=ie(i),b=s.parentElement.closest(".BRpagecontainer");return new ce({quote:y,prefix:p,suffix:f,pageNumber:b.getAttribute("data-page-num"),pageIndex:parseFloat(b.getAttribute("data-index"))})}}},5369:(e,t,n)=>{n.d(t,{l:()=>r}),n(3792),n(2953);class r{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:10;this.maxSize=e,this.entries=[]}add(e){this.entries.length>=this.maxSize&&this.entries.shift(),this.entries.push(e)}}},4297:(e,t,n)=>{function r(e,t){let n=0;for(const r of e){if(n==t)return r;n++}}function*o(e,t){for(const n of e)t(n)&&(yield n)}function*i(e,t){for(const n of e)yield t(n)}function*a(e){let t,n,r;for(const o of e)void 0!==n&&(r=o,yield[t,n,r]),t=n,n=o,r=void 0;void 0!==n&&(yield[t,n,r])}function*s(e,t){const n=e[Symbol.iterator](),r=t[Symbol.iterator]();for(;;){const e=n.next(),t=r.next();if(e.done&&t.done)return;if(e.done||t.done)throw new Error("zip: one of the iterators is done");yield[e.value,t.value]}}n.d(t,{Px:()=>i,eU:()=>r,nC:()=>o,pp:()=>a,yU:()=>s}),n(3792),n(2953)},8965:(e,t,n)=>{function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function o(e){const t=e.match(/\S+/g);return t?t.length:0}function i(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:a;return null==e?void 0:e.replace(/\{\{([^}]*?)\}\}/g,(e,i)=>{if(!i)return e;const a=function(e){if(Array.isArray(e))return e}(c=i.split("|").map(e=>e.trim()))||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(c)||function(e,t){if(e){if("string"==typeof e)return r(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}(c)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(),s=a[0],l=r(a).slice(1);var c;if(!(s in n)&&!(s in t))return e;const d=s in n?n[s]:s in t?t[s]:null;return l.map(e=>o[e]).reduce((e,t)=>t(e),d&&d.toString())})}n.d(t,{gT:()=>i,rj:()=>o}),n(9463),n(3792),n(2712),n(7495),n(5440),n(2762),n(2953);const a={urlencode:encodeURIComponent}}};import{__webpack_require__ as t}from"../ia-bookreader.js";t.C({__webpack_esm_ids__,__webpack_esm_modules__});const n=t(6364).r;export{n as TextSelectionPlugin};
|
|
2
|
+
//# sourceMappingURL=plugin.text_selection.js.map
|