@internetarchive/elements 0.2.14-webdev-8969.0 → 0.2.14-webdev-9022.0
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/README.md +20 -0
- package/dist/src/elements/ia-image-viewer/ia-image-viewer.d.ts +147 -0
- package/dist/src/elements/ia-image-viewer/ia-image-viewer.d.ts.map +1 -0
- package/dist/src/elements/ia-image-viewer/ia-image-viewer.js +533 -0
- package/dist/src/elements/ia-image-viewer/ia-image-viewer.js.map +1 -0
- package/dist/src/elements/ia-image-viewer/ia-imgview-controls.d.ts +22 -0
- package/dist/src/elements/ia-image-viewer/ia-imgview-controls.d.ts.map +1 -0
- package/dist/src/elements/ia-image-viewer/ia-imgview-controls.js +145 -0
- package/dist/src/elements/ia-image-viewer/ia-imgview-controls.js.map +1 -0
- package/dist/src/elements/ia-image-viewer/ia-imgview-slide.d.ts +44 -0
- package/dist/src/elements/ia-image-viewer/ia-imgview-slide.d.ts.map +1 -0
- package/dist/src/elements/ia-image-viewer/ia-imgview-slide.js +213 -0
- package/dist/src/elements/ia-image-viewer/ia-imgview-slide.js.map +1 -0
- package/dist/src/elements/ia-image-viewer/image-viewer-gestures.d.ts +79 -0
- package/dist/src/elements/ia-image-viewer/image-viewer-gestures.d.ts.map +1 -0
- package/dist/src/elements/ia-image-viewer/image-viewer-gestures.js +254 -0
- package/dist/src/elements/ia-image-viewer/image-viewer-gestures.js.map +1 -0
- package/dist/src/elements/ia-image-viewer/models.d.ts +20 -0
- package/dist/src/elements/ia-image-viewer/models.d.ts.map +1 -0
- package/dist/src/elements/ia-image-viewer/models.js.map +1 -0
- package/dist/src/elements/ia-item-navigator/ia-item-navigator.d.ts +97 -0
- package/dist/src/elements/ia-item-navigator/ia-item-navigator.d.ts.map +1 -0
- package/dist/src/elements/ia-item-navigator/ia-item-navigator.js +588 -0
- package/dist/src/elements/ia-item-navigator/ia-item-navigator.js.map +1 -0
- package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-button.d.ts +39 -0
- package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-button.d.ts.map +1 -0
- package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-button.js +249 -0
- package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-button.js.map +1 -0
- package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-slider.d.ts +55 -0
- package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-slider.d.ts.map +1 -0
- package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-slider.js +394 -0
- package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-slider.js.map +1 -0
- package/dist/src/elements/ia-item-navigator/ia-itemnav-no-theater-available.d.ts +20 -0
- package/dist/src/elements/ia-item-navigator/ia-itemnav-no-theater-available.d.ts.map +1 -0
- package/dist/src/elements/ia-item-navigator/ia-itemnav-no-theater-available.js +102 -0
- package/dist/src/elements/ia-item-navigator/ia-itemnav-no-theater-available.js.map +1 -0
- package/dist/src/elements/ia-item-navigator/icons/collapse-sidebar.svg +7 -0
- package/dist/src/elements/ia-item-navigator/icons/ellipses.svg +7 -0
- package/dist/src/elements/ia-item-navigator/icons.d.ts +13 -0
- package/dist/src/elements/ia-item-navigator/icons.d.ts.map +1 -0
- package/dist/src/elements/ia-item-navigator/icons.js +16 -0
- package/dist/src/elements/ia-item-navigator/icons.js.map +1 -0
- package/dist/src/elements/ia-item-navigator/interfaces/event-interfaces.d.ts +41 -0
- package/dist/src/elements/ia-item-navigator/interfaces/event-interfaces.d.ts.map +1 -0
- package/dist/src/elements/ia-item-navigator/interfaces/event-interfaces.js +2 -0
- package/dist/src/elements/ia-item-navigator/interfaces/event-interfaces.js.map +1 -0
- package/dist/src/elements/ia-item-navigator/interfaces/menu-interfaces.d.ts +23 -0
- package/dist/src/elements/ia-item-navigator/interfaces/menu-interfaces.d.ts.map +1 -0
- package/dist/src/elements/ia-item-navigator/interfaces/menu-interfaces.js +2 -0
- package/dist/src/elements/ia-item-navigator/interfaces/menu-interfaces.js.map +1 -0
- package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-share-panel.d.ts +47 -0
- package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-share-panel.d.ts.map +1 -0
- package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-share-panel.js +352 -0
- package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-share-panel.js.map +1 -0
- package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-sort-files-button.d.ts +22 -0
- package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-sort-files-button.d.ts.map +1 -0
- package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-sort-files-button.js +137 -0
- package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-sort-files-button.js.map +1 -0
- package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-viewable-files-panel.d.ts +40 -0
- package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-viewable-files-panel.d.ts.map +1 -0
- package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-viewable-files-panel.js +217 -0
- package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-viewable-files-panel.js.map +1 -0
- package/dist/src/elements/ia-item-navigator/menus/icons/email.svg +6 -0
- package/dist/src/elements/ia-item-navigator/menus/icons/facebook.svg +6 -0
- package/dist/src/elements/ia-item-navigator/menus/icons/link.svg +6 -0
- package/dist/src/elements/ia-item-navigator/menus/icons/list.svg +3 -0
- package/dist/src/elements/ia-item-navigator/menus/icons/pinterest.svg +6 -0
- package/dist/src/elements/ia-item-navigator/menus/icons/share.svg +6 -0
- package/dist/src/elements/ia-item-navigator/menus/icons/sort-asc.svg +22 -0
- package/dist/src/elements/ia-item-navigator/menus/icons/sort-desc.svg +21 -0
- package/dist/src/elements/ia-item-navigator/menus/icons/sort-neutral.svg +13 -0
- package/dist/src/elements/ia-item-navigator/menus/icons/tumblr.svg +6 -0
- package/dist/src/elements/ia-item-navigator/menus/icons/twitter.svg +6 -0
- package/dist/src/elements/ia-item-navigator/menus/icons/viewable-files.svg +6 -0
- package/dist/src/elements/ia-item-navigator/menus/models.d.ts +17 -0
- package/dist/src/elements/ia-item-navigator/menus/models.d.ts.map +1 -0
- package/dist/src/elements/ia-item-navigator/menus/models.js.map +1 -0
- package/dist/src/elements/ia-item-navigator/menus/share-icons.d.ts +16 -0
- package/dist/src/elements/ia-item-navigator/menus/share-icons.d.ts.map +1 -0
- package/dist/src/elements/ia-item-navigator/menus/share-icons.js +23 -0
- package/dist/src/elements/ia-item-navigator/menus/share-icons.js.map +1 -0
- package/dist/src/elements/ia-status-indicator/ia-status-indicator.d.ts +51 -5
- package/dist/src/elements/ia-status-indicator/ia-status-indicator.d.ts.map +1 -1
- package/dist/src/elements/ia-status-indicator/ia-status-indicator.js +156 -16
- package/dist/src/elements/ia-status-indicator/ia-status-indicator.js.map +1 -1
- package/dist/src/elements/ia-status-indicator/icons/audio.svg +5 -0
- package/dist/src/elements/ia-status-indicator/icons/collection.svg +5 -0
- package/dist/src/elements/ia-status-indicator/icons/etree.svg +5 -0
- package/dist/src/elements/ia-status-indicator/icons/images.svg +6 -0
- package/dist/src/elements/ia-status-indicator/icons/search.svg +10 -0
- package/dist/src/elements/ia-status-indicator/icons/software.svg +6 -0
- package/dist/src/elements/ia-status-indicator/icons/texts.svg +6 -0
- package/dist/src/elements/ia-status-indicator/icons/tv.svg +5 -0
- package/dist/src/elements/ia-status-indicator/icons/video.svg +6 -0
- package/dist/src/elements/ia-status-indicator/icons/web.svg +6 -0
- package/dist/src/elements/index.d.ts +5 -27
- package/dist/src/elements/index.d.ts.map +1 -1
- package/dist/src/elements/index.js +5 -27
- package/dist/src/elements/index.js.map +1 -1
- package/dist/src/util/masked-icon.d.ts +24 -0
- package/dist/src/util/masked-icon.d.ts.map +1 -0
- package/dist/src/util/masked-icon.js +30 -0
- package/dist/src/util/masked-icon.js.map +1 -0
- package/dist/src/util/prefers-reduced-motion.d.ts +10 -0
- package/dist/src/util/prefers-reduced-motion.d.ts.map +1 -0
- package/dist/src/util/prefers-reduced-motion.js +12 -0
- package/dist/src/util/prefers-reduced-motion.js.map +1 -0
- package/package.json +1 -1
- package/dist/src/elements/ia-audio-element/ia-audio-element.d.ts +0 -72
- package/dist/src/elements/ia-audio-element/ia-audio-element.d.ts.map +0 -1
- package/dist/src/elements/ia-audio-element/ia-audio-element.js +0 -173
- package/dist/src/elements/ia-audio-element/ia-audio-element.js.map +0 -1
- package/dist/src/elements/ia-audio-element/models.d.ts +0 -13
- package/dist/src/elements/ia-audio-element/models.d.ts.map +0 -1
- package/dist/src/elements/ia-audio-element/models.js.map +0 -1
- package/dist/src/elements/ia-expandable-search-bar/assets/clear-results.d.ts +0 -3
- package/dist/src/elements/ia-expandable-search-bar/assets/clear-results.d.ts.map +0 -1
- package/dist/src/elements/ia-expandable-search-bar/assets/clear-results.js +0 -28
- package/dist/src/elements/ia-expandable-search-bar/assets/clear-results.js.map +0 -1
- package/dist/src/elements/ia-expandable-search-bar/assets/disclosure.d.ts +0 -3
- package/dist/src/elements/ia-expandable-search-bar/assets/disclosure.d.ts.map +0 -1
- package/dist/src/elements/ia-expandable-search-bar/assets/disclosure.js +0 -26
- package/dist/src/elements/ia-expandable-search-bar/assets/disclosure.js.map +0 -1
- package/dist/src/elements/ia-expandable-search-bar/assets/magnifying-glass.d.ts +0 -3
- package/dist/src/elements/ia-expandable-search-bar/assets/magnifying-glass.d.ts.map +0 -1
- package/dist/src/elements/ia-expandable-search-bar/assets/magnifying-glass.js +0 -22
- package/dist/src/elements/ia-expandable-search-bar/assets/magnifying-glass.js.map +0 -1
- package/dist/src/elements/ia-expandable-search-bar/ia-expandable-search-bar.d.ts +0 -53
- package/dist/src/elements/ia-expandable-search-bar/ia-expandable-search-bar.d.ts.map +0 -1
- package/dist/src/elements/ia-expandable-search-bar/ia-expandable-search-bar.js +0 -352
- package/dist/src/elements/ia-expandable-search-bar/ia-expandable-search-bar.js.map +0 -1
- package/dist/src/elements/ia-expandable-search-bar/ia-quick-search.d.ts +0 -19
- package/dist/src/elements/ia-expandable-search-bar/ia-quick-search.d.ts.map +0 -1
- package/dist/src/elements/ia-expandable-search-bar/ia-quick-search.js +0 -115
- package/dist/src/elements/ia-expandable-search-bar/ia-quick-search.js.map +0 -1
- package/dist/src/elements/ia-expandable-search-bar/models.d.ts +0 -13
- package/dist/src/elements/ia-expandable-search-bar/models.d.ts.map +0 -1
- package/dist/src/elements/ia-expandable-search-bar/models.js.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/next-section.d.ts +0 -3
- package/dist/src/elements/ia-playback-controls/assets/next-section.d.ts.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/next-section.js +0 -16
- package/dist/src/elements/ia-playback-controls/assets/next-section.js.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/pause.d.ts +0 -3
- package/dist/src/elements/ia-playback-controls/assets/pause.d.ts.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/pause.js +0 -17
- package/dist/src/elements/ia-playback-controls/assets/pause.js.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/play.d.ts +0 -3
- package/dist/src/elements/ia-playback-controls/assets/play.d.ts.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/play.js +0 -18
- package/dist/src/elements/ia-playback-controls/assets/play.js.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/playback-speed.d.ts +0 -3
- package/dist/src/elements/ia-playback-controls/assets/playback-speed.d.ts.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/playback-speed.js +0 -28
- package/dist/src/elements/ia-playback-controls/assets/playback-speed.js.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/previous-section.d.ts +0 -3
- package/dist/src/elements/ia-playback-controls/assets/previous-section.d.ts.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/previous-section.js +0 -16
- package/dist/src/elements/ia-playback-controls/assets/previous-section.js.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/replay.d.ts +0 -3
- package/dist/src/elements/ia-playback-controls/assets/replay.d.ts.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/replay.js +0 -28
- package/dist/src/elements/ia-playback-controls/assets/replay.js.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/skip-ahead.d.ts +0 -3
- package/dist/src/elements/ia-playback-controls/assets/skip-ahead.d.ts.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/skip-ahead.js +0 -29
- package/dist/src/elements/ia-playback-controls/assets/skip-ahead.js.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/volume-full.d.ts +0 -3
- package/dist/src/elements/ia-playback-controls/assets/volume-full.d.ts.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/volume-full.js +0 -19
- package/dist/src/elements/ia-playback-controls/assets/volume-full.js.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/volume-medium.d.ts +0 -3
- package/dist/src/elements/ia-playback-controls/assets/volume-medium.d.ts.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/volume-medium.js +0 -24
- package/dist/src/elements/ia-playback-controls/assets/volume-medium.js.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/volume-mute.d.ts +0 -3
- package/dist/src/elements/ia-playback-controls/assets/volume-mute.d.ts.map +0 -1
- package/dist/src/elements/ia-playback-controls/assets/volume-mute.js +0 -35
- package/dist/src/elements/ia-playback-controls/assets/volume-mute.js.map +0 -1
- package/dist/src/elements/ia-playback-controls/ia-playback-controls.d.ts +0 -57
- package/dist/src/elements/ia-playback-controls/ia-playback-controls.d.ts.map +0 -1
- package/dist/src/elements/ia-playback-controls/ia-playback-controls.js +0 -320
- package/dist/src/elements/ia-playback-controls/ia-playback-controls.js.map +0 -1
- package/dist/src/elements/ia-playback-controls/models.d.ts +0 -13
- package/dist/src/elements/ia-playback-controls/models.d.ts.map +0 -1
- package/dist/src/elements/ia-playback-controls/models.js +0 -12
- package/dist/src/elements/ia-playback-controls/models.js.map +0 -1
- package/dist/src/elements/ia-radio-player/assets/next-result.d.ts +0 -3
- package/dist/src/elements/ia-radio-player/assets/next-result.d.ts.map +0 -1
- package/dist/src/elements/ia-radio-player/assets/next-result.js +0 -27
- package/dist/src/elements/ia-radio-player/assets/next-result.js.map +0 -1
- package/dist/src/elements/ia-radio-player/assets/previous-result.d.ts +0 -3
- package/dist/src/elements/ia-radio-player/assets/previous-result.d.ts.map +0 -1
- package/dist/src/elements/ia-radio-player/assets/previous-result.js +0 -27
- package/dist/src/elements/ia-radio-player/assets/previous-result.js.map +0 -1
- package/dist/src/elements/ia-radio-player/ia-radio-player.d.ts +0 -130
- package/dist/src/elements/ia-radio-player/ia-radio-player.d.ts.map +0 -1
- package/dist/src/elements/ia-radio-player/ia-radio-player.js +0 -748
- package/dist/src/elements/ia-radio-player/ia-radio-player.js.map +0 -1
- package/dist/src/elements/ia-radio-player/ia-search-results-switcher.d.ts +0 -22
- package/dist/src/elements/ia-radio-player/ia-search-results-switcher.d.ts.map +0 -1
- package/dist/src/elements/ia-radio-player/ia-search-results-switcher.js +0 -137
- package/dist/src/elements/ia-radio-player/ia-search-results-switcher.js.map +0 -1
- package/dist/src/elements/ia-radio-player/models.d.ts +0 -29
- package/dist/src/elements/ia-radio-player/models.d.ts.map +0 -1
- package/dist/src/elements/ia-radio-player/models.js +0 -2
- package/dist/src/elements/ia-radio-player/models.js.map +0 -1
- package/dist/src/elements/ia-radio-player/search/backends/full-text-search-backend.d.ts +0 -38
- package/dist/src/elements/ia-radio-player/search/backends/full-text-search-backend.d.ts.map +0 -1
- package/dist/src/elements/ia-radio-player/search/backends/full-text-search-backend.js +0 -64
- package/dist/src/elements/ia-radio-player/search/backends/full-text-search-backend.js.map +0 -1
- package/dist/src/elements/ia-radio-player/search/backends/full-text-search-response.d.ts +0 -94
- package/dist/src/elements/ia-radio-player/search/backends/full-text-search-response.d.ts.map +0 -1
- package/dist/src/elements/ia-radio-player/search/backends/full-text-search-response.js +0 -56
- package/dist/src/elements/ia-radio-player/search/backends/full-text-search-response.js.map +0 -1
- package/dist/src/elements/ia-radio-player/search/backends/local-search-backend.d.ts +0 -15
- package/dist/src/elements/ia-radio-player/search/backends/local-search-backend.d.ts.map +0 -1
- package/dist/src/elements/ia-radio-player/search/backends/local-search-backend.js +0 -26
- package/dist/src/elements/ia-radio-player/search/backends/local-search-backend.js.map +0 -1
- package/dist/src/elements/ia-radio-player/search/backends/search-backend.d.ts +0 -12
- package/dist/src/elements/ia-radio-player/search/backends/search-backend.d.ts.map +0 -1
- package/dist/src/elements/ia-radio-player/search/backends/search-backend.js +0 -2
- package/dist/src/elements/ia-radio-player/search/backends/search-backend.js.map +0 -1
- package/dist/src/elements/ia-radio-player/search/models.d.ts +0 -38
- package/dist/src/elements/ia-radio-player/search/models.d.ts.map +0 -1
- package/dist/src/elements/ia-radio-player/search/models.js +0 -17
- package/dist/src/elements/ia-radio-player/search/models.js.map +0 -1
- package/dist/src/elements/ia-radio-player/search/search-handler.d.ts +0 -49
- package/dist/src/elements/ia-radio-player/search/search-handler.d.ts.map +0 -1
- package/dist/src/elements/ia-radio-player/search/search-handler.js +0 -128
- package/dist/src/elements/ia-radio-player/search/search-handler.js.map +0 -1
- package/dist/src/elements/ia-radio-player/search/search-helper.d.ts +0 -9
- package/dist/src/elements/ia-radio-player/search/search-helper.d.ts.map +0 -1
- package/dist/src/elements/ia-radio-player/search/search-helper.js +0 -15
- package/dist/src/elements/ia-radio-player/search/search-helper.js.map +0 -1
- package/dist/src/elements/ia-radio-player/search/transcript-index.d.ts +0 -45
- package/dist/src/elements/ia-radio-player/search/transcript-index.d.ts.map +0 -1
- package/dist/src/elements/ia-radio-player/search/transcript-index.js +0 -48
- package/dist/src/elements/ia-radio-player/search/transcript-index.js.map +0 -1
- package/dist/src/elements/ia-scrubber-bar/assets/next-section-marker.d.ts +0 -3
- package/dist/src/elements/ia-scrubber-bar/assets/next-section-marker.d.ts.map +0 -1
- package/dist/src/elements/ia-scrubber-bar/assets/next-section-marker.js +0 -18
- package/dist/src/elements/ia-scrubber-bar/assets/next-section-marker.js.map +0 -1
- package/dist/src/elements/ia-scrubber-bar/assets/previous-section-marker.d.ts +0 -3
- package/dist/src/elements/ia-scrubber-bar/assets/previous-section-marker.d.ts.map +0 -1
- package/dist/src/elements/ia-scrubber-bar/assets/previous-section-marker.js +0 -18
- package/dist/src/elements/ia-scrubber-bar/assets/previous-section-marker.js.map +0 -1
- package/dist/src/elements/ia-scrubber-bar/ia-scrubber-bar.d.ts +0 -82
- package/dist/src/elements/ia-scrubber-bar/ia-scrubber-bar.d.ts.map +0 -1
- package/dist/src/elements/ia-scrubber-bar/ia-scrubber-bar.js +0 -387
- package/dist/src/elements/ia-scrubber-bar/ia-scrubber-bar.js.map +0 -1
- package/dist/src/elements/ia-scrubber-bar/ia-section-marker.d.ts +0 -16
- package/dist/src/elements/ia-scrubber-bar/ia-section-marker.d.ts.map +0 -1
- package/dist/src/elements/ia-scrubber-bar/ia-section-marker.js +0 -109
- package/dist/src/elements/ia-scrubber-bar/ia-section-marker.js.map +0 -1
- package/dist/src/elements/ia-scrubber-bar/models.d.ts +0 -21
- package/dist/src/elements/ia-scrubber-bar/models.d.ts.map +0 -1
- package/dist/src/elements/ia-scrubber-bar/models.js +0 -20
- package/dist/src/elements/ia-scrubber-bar/models.js.map +0 -1
- package/dist/src/elements/ia-transcript-view/duration-formatter.d.ts +0 -13
- package/dist/src/elements/ia-transcript-view/duration-formatter.d.ts.map +0 -1
- package/dist/src/elements/ia-transcript-view/duration-formatter.js +0 -25
- package/dist/src/elements/ia-transcript-view/duration-formatter.js.map +0 -1
- package/dist/src/elements/ia-transcript-view/ia-transcript-entry.d.ts +0 -25
- package/dist/src/elements/ia-transcript-view/ia-transcript-entry.d.ts.map +0 -1
- package/dist/src/elements/ia-transcript-view/ia-transcript-entry.js +0 -51
- package/dist/src/elements/ia-transcript-view/ia-transcript-entry.js.map +0 -1
- package/dist/src/elements/ia-transcript-view/ia-transcript-view.d.ts +0 -81
- package/dist/src/elements/ia-transcript-view/ia-transcript-view.d.ts.map +0 -1
- package/dist/src/elements/ia-transcript-view/ia-transcript-view.js +0 -546
- package/dist/src/elements/ia-transcript-view/ia-transcript-view.js.map +0 -1
- package/dist/src/elements/ia-transcript-view/models.d.ts +0 -34
- package/dist/src/elements/ia-transcript-view/models.d.ts.map +0 -1
- package/dist/src/elements/ia-transcript-view/models.js +0 -38
- package/dist/src/elements/ia-transcript-view/models.js.map +0 -1
- package/dist/src/elements/ia-waveform-progress/ia-waveform-progress.d.ts +0 -62
- package/dist/src/elements/ia-waveform-progress/ia-waveform-progress.d.ts.map +0 -1
- package/dist/src/elements/ia-waveform-progress/ia-waveform-progress.js +0 -217
- package/dist/src/elements/ia-waveform-progress/ia-waveform-progress.js.map +0 -1
- package/dist/src/elements/ia-waveform-progress/models.d.ts +0 -13
- package/dist/src/elements/ia-waveform-progress/models.d.ts.map +0 -1
- package/dist/src/elements/ia-waveform-progress/models.js +0 -2
- package/dist/src/elements/ia-waveform-progress/models.js.map +0 -1
- /package/dist/src/elements/{ia-audio-element → ia-image-viewer}/models.js +0 -0
- /package/dist/src/elements/{ia-expandable-search-bar → ia-item-navigator/menus}/models.js +0 -0
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { TextRange } from '../models.js';
|
|
2
|
-
/**
|
|
3
|
-
* Searches the transcript in the browser, with no network involved.
|
|
4
|
-
*
|
|
5
|
-
* A plain case-insensitive substring scan, which is enough for a transcript
|
|
6
|
-
* already loaded on the page.
|
|
7
|
-
*/
|
|
8
|
-
export class LocalSearchBackend {
|
|
9
|
-
constructor(transcriptIndex) {
|
|
10
|
-
this.transcriptIndex = transcriptIndex;
|
|
11
|
-
}
|
|
12
|
-
async getSearchRanges(query) {
|
|
13
|
-
if (query === '')
|
|
14
|
-
return [];
|
|
15
|
-
const haystack = this.transcriptIndex.mergedTranscriptLowercased;
|
|
16
|
-
const needle = query.toLowerCase();
|
|
17
|
-
const ranges = [];
|
|
18
|
-
let index = haystack.indexOf(needle);
|
|
19
|
-
while (index !== -1) {
|
|
20
|
-
ranges.push(new TextRange(index, index + needle.length));
|
|
21
|
-
index = haystack.indexOf(needle, index + 1);
|
|
22
|
-
}
|
|
23
|
-
return ranges;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
//# sourceMappingURL=local-search-backend.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"local-search-backend.js","sourceRoot":"","sources":["../../../../../../src/elements/ia-radio-player/search/backends/local-search-backend.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAItC;;;;;GAKG;AACH,MAAM,OAAO,kBAAkB;IAG7B,YAAY,eAAyC;QACnD,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa;QACjC,IAAI,KAAK,KAAK,EAAE;YAAE,OAAO,EAAE,CAAC;QAE5B,MAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,CAAC,0BAA0B,CAAC;QACjE,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QACnC,MAAM,MAAM,GAAgB,EAAE,CAAC;QAE/B,IAAI,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACrC,OAAO,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACpB,MAAM,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;YACzD,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF","sourcesContent":["import { TextRange } from '../models';\nimport type { TranscriptIndexInterface } from '../transcript-index';\nimport type { SearchBackendInterface } from './search-backend';\n\n/**\n * Searches the transcript in the browser, with no network involved.\n *\n * A plain case-insensitive substring scan, which is enough for a transcript\n * already loaded on the page.\n */\nexport class LocalSearchBackend implements SearchBackendInterface {\n private transcriptIndex: TranscriptIndexInterface;\n\n constructor(transcriptIndex: TranscriptIndexInterface) {\n this.transcriptIndex = transcriptIndex;\n }\n\n async getSearchRanges(query: string): Promise<TextRange[]> {\n if (query === '') return [];\n\n const haystack = this.transcriptIndex.mergedTranscriptLowercased;\n const needle = query.toLowerCase();\n const ranges: TextRange[] = [];\n\n let index = haystack.indexOf(needle);\n while (index !== -1) {\n ranges.push(new TextRange(index, index + needle.length));\n index = haystack.indexOf(needle, index + 1);\n }\n\n return ranges;\n }\n}\n"]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import type { TextRange } from '../models.js';
|
|
2
|
-
/**
|
|
3
|
-
* Where the actual matching happens.
|
|
4
|
-
*
|
|
5
|
-
* The search handler asks a backend for the spans that matched, and knows
|
|
6
|
-
* nothing about how they were found. Swapping the backend is how the player
|
|
7
|
-
* moves between searching in the browser and searching against the archive.
|
|
8
|
-
*/
|
|
9
|
-
export interface SearchBackendInterface {
|
|
10
|
-
getSearchRanges(query: string): Promise<TextRange[]>;
|
|
11
|
-
}
|
|
12
|
-
//# sourceMappingURL=search-backend.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-backend.d.ts","sourceRoot":"","sources":["../../../../../../src/elements/ia-radio-player/search/backends/search-backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAE3C;;;;;;GAMG;AACH,MAAM,WAAW,sBAAsB;IACrC,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CACtD"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-backend.js","sourceRoot":"","sources":["../../../../../../src/elements/ia-radio-player/search/backends/search-backend.ts"],"names":[],"mappings":"","sourcesContent":["import type { TextRange } from '../models';\n\n/**\n * Where the actual matching happens.\n *\n * The search handler asks a backend for the spans that matched, and knows\n * nothing about how they were found. Swapping the backend is how the player\n * moves between searching in the browser and searching against the archive.\n */\nexport interface SearchBackendInterface {\n getSearchRanges(query: string): Promise<TextRange[]>;\n}\n"]}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import type { TranscriptEntryConfig } from '../../../elements/ia-transcript-view/models.js';
|
|
2
|
-
/**
|
|
3
|
-
* A span of characters within the merged transcript.
|
|
4
|
-
*
|
|
5
|
-
* Named `TextRange` rather than `Range` so it doesn't shadow the DOM's own
|
|
6
|
-
* `Range` for anyone importing it.
|
|
7
|
-
*/
|
|
8
|
-
export declare class TextRange {
|
|
9
|
-
startIndex: number;
|
|
10
|
-
endIndex: number;
|
|
11
|
-
constructor(startIndex: number, endIndex: number);
|
|
12
|
-
/** How many characters the span covers. */
|
|
13
|
-
get length(): number;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* A transcript entry paired with the span it occupies in the merged transcript.
|
|
17
|
-
*
|
|
18
|
-
* Search runs against one long string rather than entry by entry, so a match
|
|
19
|
-
* can cross entry boundaries. This is what lets the results be split back into
|
|
20
|
-
* entries afterwards.
|
|
21
|
-
*/
|
|
22
|
-
export interface TranscriptEntryRange {
|
|
23
|
-
entry: TranscriptEntryConfig;
|
|
24
|
-
range: TextRange;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* One chunk of the merged transcript, either a search match or the text
|
|
28
|
-
* between matches.
|
|
29
|
-
*
|
|
30
|
-
* Searching produces an alternating run of these, which is the first step in
|
|
31
|
-
* rebuilding a transcript that knows where its results are.
|
|
32
|
-
*/
|
|
33
|
-
export interface SearchResult {
|
|
34
|
-
range: TextRange;
|
|
35
|
-
text: string;
|
|
36
|
-
isSearchMatch: boolean;
|
|
37
|
-
}
|
|
38
|
-
//# sourceMappingURL=models.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../../src/elements/ia-radio-player/search/models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAErF;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,UAAU,EAAE,MAAM,CAAC;IAEnB,QAAQ,EAAE,MAAM,CAAC;gBAEL,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM;IAKhD,2CAA2C;IAC3C,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF;AAED;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,qBAAqB,CAAC;IAC7B,KAAK,EAAE,SAAS,CAAC;CAClB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,OAAO,CAAC;CACxB"}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* A span of characters within the merged transcript.
|
|
3
|
-
*
|
|
4
|
-
* Named `TextRange` rather than `Range` so it doesn't shadow the DOM's own
|
|
5
|
-
* `Range` for anyone importing it.
|
|
6
|
-
*/
|
|
7
|
-
export class TextRange {
|
|
8
|
-
constructor(startIndex, endIndex) {
|
|
9
|
-
this.startIndex = startIndex;
|
|
10
|
-
this.endIndex = endIndex;
|
|
11
|
-
}
|
|
12
|
-
/** How many characters the span covers. */
|
|
13
|
-
get length() {
|
|
14
|
-
return Math.abs(this.endIndex - this.startIndex);
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=models.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../../src/elements/ia-radio-player/search/models.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IAKpB,YAAY,UAAkB,EAAE,QAAgB;QAC9C,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,2CAA2C;IAC3C,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;CACF","sourcesContent":["import type { TranscriptEntryConfig } from '@src/elements/ia-transcript-view/models';\n\n/**\n * A span of characters within the merged transcript.\n *\n * Named `TextRange` rather than `Range` so it doesn't shadow the DOM's own\n * `Range` for anyone importing it.\n */\nexport class TextRange {\n startIndex: number;\n\n endIndex: number;\n\n constructor(startIndex: number, endIndex: number) {\n this.startIndex = startIndex;\n this.endIndex = endIndex;\n }\n\n /** How many characters the span covers. */\n get length(): number {\n return Math.abs(this.endIndex - this.startIndex);\n }\n}\n\n/**\n * A transcript entry paired with the span it occupies in the merged transcript.\n *\n * Search runs against one long string rather than entry by entry, so a match\n * can cross entry boundaries. This is what lets the results be split back into\n * entries afterwards.\n */\nexport interface TranscriptEntryRange {\n entry: TranscriptEntryConfig;\n range: TextRange;\n}\n\n/**\n * One chunk of the merged transcript, either a search match or the text\n * between matches.\n *\n * Searching produces an alternating run of these, which is the first step in\n * rebuilding a transcript that knows where its results are.\n */\nexport interface SearchResult {\n range: TextRange;\n text: string;\n isSearchMatch: boolean;\n}\n"]}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { TranscriptConfig } from '../../../elements/ia-transcript-view/models.js';
|
|
2
|
-
import { type SearchResult } from './models.js';
|
|
3
|
-
import type { TranscriptIndexInterface } from './transcript-index.js';
|
|
4
|
-
import type { SearchBackendInterface } from './backends/search-backend.js';
|
|
5
|
-
/**
|
|
6
|
-
* What the radio player needs from a search implementation.
|
|
7
|
-
*
|
|
8
|
-
* The player takes one of these rather than searching itself, so how the
|
|
9
|
-
* search runs is the consumer's choice.
|
|
10
|
-
*/
|
|
11
|
-
export interface SearchHandlerInterface {
|
|
12
|
-
search(query: string): Promise<TranscriptConfig>;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Runs a transcript search and returns the transcript rebuilt around the
|
|
16
|
-
* results.
|
|
17
|
-
*
|
|
18
|
-
* Matching is delegated to a backend, and the character bookkeeping to a
|
|
19
|
-
* transcript index. What this adds is the reassembly: a match may span several
|
|
20
|
-
* transcript entries, and it has to come back as one result carrying the right
|
|
21
|
-
* time codes, with the unmatched text either side split back into its original
|
|
22
|
-
* entries.
|
|
23
|
-
*/
|
|
24
|
-
export declare class SearchHandler implements SearchHandlerInterface {
|
|
25
|
-
private searchBackend;
|
|
26
|
-
private transcriptIndex;
|
|
27
|
-
constructor(searchBackend: SearchBackendInterface, transcriptIndex: TranscriptIndexInterface);
|
|
28
|
-
/** The transcript with the results for `query` woven into it. */
|
|
29
|
-
search(query: string): Promise<TranscriptConfig>;
|
|
30
|
-
/**
|
|
31
|
-
* One entry standing for a whole match.
|
|
32
|
-
*
|
|
33
|
-
* A match can run across several transcript entries, and it should stay one
|
|
34
|
-
* result rather than being broken up, so it starts where the first entry it
|
|
35
|
-
* touches starts and ends where the last one ends.
|
|
36
|
-
*/
|
|
37
|
-
private entryForMatch;
|
|
38
|
-
/**
|
|
39
|
-
* The merged transcript split into alternating matched and unmatched chunks.
|
|
40
|
-
*
|
|
41
|
-
* Searching `foo bar baz boop` for `baz` gives three chunks: `foo bar `,
|
|
42
|
-
* then `baz` as a match, then ` boop`.
|
|
43
|
-
*/
|
|
44
|
-
getSearchSeparatedTranscript(query: string): Promise<SearchResult[]>;
|
|
45
|
-
private chunkFor;
|
|
46
|
-
/** A copy of an entry with its text and result index cleared. */
|
|
47
|
-
private static blankEntryFrom;
|
|
48
|
-
}
|
|
49
|
-
//# sourceMappingURL=search-handler.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-handler.d.ts","sourceRoot":"","sources":["../../../../../src/elements/ia-radio-player/search/search-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAEjB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAa,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAExD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAExE;;;;;GAKG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAClD;AAED;;;;;;;;;GASG;AACH,qBAAa,aAAc,YAAW,sBAAsB;IAC1D,OAAO,CAAC,aAAa,CAAyB;IAE9C,OAAO,CAAC,eAAe,CAA2B;gBAGhD,aAAa,EAAE,sBAAsB,EACrC,eAAe,EAAE,wBAAwB;IAM3C,iEAAiE;IAC3D,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA8CtD;;;;;;OAMG;IACH,OAAO,CAAC,aAAa;IA4BrB;;;;;OAKG;IACG,4BAA4B,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAuC1E,OAAO,CAAC,QAAQ;IAWhB,iEAAiE;IACjE,OAAO,CAAC,MAAM,CAAC,cAAc;CAW9B"}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { TranscriptConfig, TranscriptEntryConfig, } from '../../../elements/ia-transcript-view/models.js';
|
|
2
|
-
import { TextRange } from './models.js';
|
|
3
|
-
import { getIntersection } from './search-helper.js';
|
|
4
|
-
/**
|
|
5
|
-
* Runs a transcript search and returns the transcript rebuilt around the
|
|
6
|
-
* results.
|
|
7
|
-
*
|
|
8
|
-
* Matching is delegated to a backend, and the character bookkeeping to a
|
|
9
|
-
* transcript index. What this adds is the reassembly: a match may span several
|
|
10
|
-
* transcript entries, and it has to come back as one result carrying the right
|
|
11
|
-
* time codes, with the unmatched text either side split back into its original
|
|
12
|
-
* entries.
|
|
13
|
-
*/
|
|
14
|
-
export class SearchHandler {
|
|
15
|
-
constructor(searchBackend, transcriptIndex) {
|
|
16
|
-
this.searchBackend = searchBackend;
|
|
17
|
-
this.transcriptIndex = transcriptIndex;
|
|
18
|
-
}
|
|
19
|
-
/** The transcript with the results for `query` woven into it. */
|
|
20
|
-
async search(query) {
|
|
21
|
-
const chunks = await this.getSearchSeparatedTranscript(query);
|
|
22
|
-
const entries = [];
|
|
23
|
-
let searchResultIndex = 0;
|
|
24
|
-
let entryIdentifier = 1;
|
|
25
|
-
chunks.forEach((chunk) => {
|
|
26
|
-
if (chunk.isSearchMatch) {
|
|
27
|
-
const matchEntry = this.entryForMatch(chunk, entryIdentifier);
|
|
28
|
-
if (!matchEntry)
|
|
29
|
-
return;
|
|
30
|
-
matchEntry.searchMatchIndex = searchResultIndex;
|
|
31
|
-
searchResultIndex += 1;
|
|
32
|
-
entryIdentifier += 1;
|
|
33
|
-
entries.push(matchEntry);
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
// Unmatched text goes back to being however many original entries it
|
|
37
|
-
// covered, so the times stay right.
|
|
38
|
-
this.transcriptIndex.transcriptEntryRanges.forEach((indexMap) => {
|
|
39
|
-
const intersection = getIntersection(chunk.range, indexMap.range);
|
|
40
|
-
if (!intersection)
|
|
41
|
-
return;
|
|
42
|
-
// An entry with no text of its own, a music break, occupies no
|
|
43
|
-
// characters, so it only ever meets a chunk at a single point. It still
|
|
44
|
-
// belongs in the rebuilt transcript, since the view draws a row and a
|
|
45
|
-
// time code for it. For an entry that does have text, meeting at a
|
|
46
|
-
// single point just means the chunk stops where the entry starts, and
|
|
47
|
-
// there is nothing of it in this chunk.
|
|
48
|
-
if (intersection.length === 0 && indexMap.range.length > 0)
|
|
49
|
-
return;
|
|
50
|
-
const entry = SearchHandler.blankEntryFrom(indexMap.entry);
|
|
51
|
-
entry.rawText = this.transcriptIndex.mergedTranscript
|
|
52
|
-
.substring(intersection.startIndex, intersection.endIndex)
|
|
53
|
-
.trim();
|
|
54
|
-
entry.id = entryIdentifier;
|
|
55
|
-
entryIdentifier += 1;
|
|
56
|
-
entries.push(entry);
|
|
57
|
-
});
|
|
58
|
-
});
|
|
59
|
-
return new TranscriptConfig(entries);
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* One entry standing for a whole match.
|
|
63
|
-
*
|
|
64
|
-
* A match can run across several transcript entries, and it should stay one
|
|
65
|
-
* result rather than being broken up, so it starts where the first entry it
|
|
66
|
-
* touches starts and ends where the last one ends.
|
|
67
|
-
*/
|
|
68
|
-
entryForMatch(chunk, entryIdentifier) {
|
|
69
|
-
const startEntry = this.transcriptIndex.getTranscriptEntryAt(chunk.range.startIndex);
|
|
70
|
-
if (!startEntry)
|
|
71
|
-
return undefined;
|
|
72
|
-
// The span's end is exclusive, so the last character of the match is one
|
|
73
|
-
// before it. Looking up the end itself lands on the space between entries
|
|
74
|
-
// whenever a match finishes on an entry's final character, which would
|
|
75
|
-
// leave the result carrying the wrong end time.
|
|
76
|
-
const lastCharIndex = Math.max(chunk.range.startIndex, chunk.range.endIndex - 1);
|
|
77
|
-
const endEntry = this.transcriptIndex.getTranscriptEntryAt(lastCharIndex) ?? startEntry;
|
|
78
|
-
const entry = SearchHandler.blankEntryFrom(startEntry.entry);
|
|
79
|
-
entry.rawText = chunk.text;
|
|
80
|
-
entry.id = entryIdentifier;
|
|
81
|
-
entry.end = endEntry.entry.end;
|
|
82
|
-
return entry;
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* The merged transcript split into alternating matched and unmatched chunks.
|
|
86
|
-
*
|
|
87
|
-
* Searching `foo bar baz boop` for `baz` gives three chunks: `foo bar `,
|
|
88
|
-
* then `baz` as a match, then ` boop`.
|
|
89
|
-
*/
|
|
90
|
-
async getSearchSeparatedTranscript(query) {
|
|
91
|
-
const searchRanges = await this.searchBackend.getSearchRanges(query);
|
|
92
|
-
const { mergedTranscript } = this.transcriptIndex;
|
|
93
|
-
if (searchRanges.length === 0) {
|
|
94
|
-
return [this.chunkFor(new TextRange(0, mergedTranscript.length), false)];
|
|
95
|
-
}
|
|
96
|
-
// The backend may return matches in any order, and the walk below runs
|
|
97
|
-
// start to finish, so out-of-order ranges would rebuild the wrong chunks.
|
|
98
|
-
const orderedRanges = [...searchRanges].sort((a, b) => a.startIndex - b.startIndex);
|
|
99
|
-
const chunks = [];
|
|
100
|
-
let startIndex = 0;
|
|
101
|
-
orderedRanges.forEach((searchRange) => {
|
|
102
|
-
// A backend may report matches that overlap each other, as a scan
|
|
103
|
-
// stepping one character at a time does for a repeated string. Only the
|
|
104
|
-
// first of an overlapping set can be shown, and taking a later one would
|
|
105
|
-
// build a backwards span, which `substring` quietly reverses into
|
|
106
|
-
// duplicated text.
|
|
107
|
-
if (searchRange.startIndex < startIndex)
|
|
108
|
-
return;
|
|
109
|
-
chunks.push(this.chunkFor(new TextRange(startIndex, searchRange.startIndex), false));
|
|
110
|
-
chunks.push(this.chunkFor(searchRange, true));
|
|
111
|
-
startIndex = searchRange.endIndex;
|
|
112
|
-
});
|
|
113
|
-
chunks.push(this.chunkFor(new TextRange(startIndex, mergedTranscript.length), false));
|
|
114
|
-
return chunks;
|
|
115
|
-
}
|
|
116
|
-
chunkFor(range, isSearchMatch) {
|
|
117
|
-
return {
|
|
118
|
-
range,
|
|
119
|
-
text: this.transcriptIndex.mergedTranscript.substring(range.startIndex, range.endIndex),
|
|
120
|
-
isSearchMatch,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
/** A copy of an entry with its text and result index cleared. */
|
|
124
|
-
static blankEntryFrom(source) {
|
|
125
|
-
return new TranscriptEntryConfig(source.id, source.start, source.end, '', source.isMusic);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
//# sourceMappingURL=search-handler.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-handler.js","sourceRoot":"","sources":["../../../../../src/elements/ia-radio-player/search/search-handler.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n TranscriptConfig,\n TranscriptEntryConfig,\n} from '@src/elements/ia-transcript-view/models';\n\nimport { TextRange, type SearchResult } from './models';\nimport { getIntersection } from './search-helper';\nimport type { TranscriptIndexInterface } from './transcript-index';\nimport type { SearchBackendInterface } from './backends/search-backend';\n\n/**\n * What the radio player needs from a search implementation.\n *\n * The player takes one of these rather than searching itself, so how the\n * search runs is the consumer's choice.\n */\nexport interface SearchHandlerInterface {\n search(query: string): Promise<TranscriptConfig>;\n}\n\n/**\n * Runs a transcript search and returns the transcript rebuilt around the\n * results.\n *\n * Matching is delegated to a backend, and the character bookkeeping to a\n * transcript index. What this adds is the reassembly: a match may span several\n * transcript entries, and it has to come back as one result carrying the right\n * time codes, with the unmatched text either side split back into its original\n * entries.\n */\nexport class SearchHandler implements SearchHandlerInterface {\n private searchBackend: SearchBackendInterface;\n\n private transcriptIndex: TranscriptIndexInterface;\n\n constructor(\n searchBackend: SearchBackendInterface,\n transcriptIndex: TranscriptIndexInterface,\n ) {\n this.searchBackend = searchBackend;\n this.transcriptIndex = transcriptIndex;\n }\n\n /** The transcript with the results for `query` woven into it. */\n async search(query: string): Promise<TranscriptConfig> {\n const chunks = await this.getSearchSeparatedTranscript(query);\n const entries: TranscriptEntryConfig[] = [];\n\n let searchResultIndex = 0;\n let entryIdentifier = 1;\n\n chunks.forEach((chunk) => {\n if (chunk.isSearchMatch) {\n const matchEntry = this.entryForMatch(chunk, entryIdentifier);\n if (!matchEntry) return;\n\n matchEntry.searchMatchIndex = searchResultIndex;\n searchResultIndex += 1;\n entryIdentifier += 1;\n entries.push(matchEntry);\n return;\n }\n\n // Unmatched text goes back to being however many original entries it\n // covered, so the times stay right.\n this.transcriptIndex.transcriptEntryRanges.forEach((indexMap) => {\n const intersection = getIntersection(chunk.range, indexMap.range);\n if (!intersection) return;\n\n // An entry with no text of its own, a music break, occupies no\n // characters, so it only ever meets a chunk at a single point. It still\n // belongs in the rebuilt transcript, since the view draws a row and a\n // time code for it. For an entry that does have text, meeting at a\n // single point just means the chunk stops where the entry starts, and\n // there is nothing of it in this chunk.\n if (intersection.length === 0 && indexMap.range.length > 0) return;\n\n const entry = SearchHandler.blankEntryFrom(indexMap.entry);\n entry.rawText = this.transcriptIndex.mergedTranscript\n .substring(intersection.startIndex, intersection.endIndex)\n .trim();\n entry.id = entryIdentifier;\n entryIdentifier += 1;\n entries.push(entry);\n });\n });\n\n return new TranscriptConfig(entries);\n }\n\n /**\n * One entry standing for a whole match.\n *\n * A match can run across several transcript entries, and it should stay one\n * result rather than being broken up, so it starts where the first entry it\n * touches starts and ends where the last one ends.\n */\n private entryForMatch(\n chunk: SearchResult,\n entryIdentifier: number,\n ): TranscriptEntryConfig | undefined {\n const startEntry = this.transcriptIndex.getTranscriptEntryAt(\n chunk.range.startIndex,\n );\n if (!startEntry) return undefined;\n\n // The span's end is exclusive, so the last character of the match is one\n // before it. Looking up the end itself lands on the space between entries\n // whenever a match finishes on an entry's final character, which would\n // leave the result carrying the wrong end time.\n const lastCharIndex = Math.max(\n chunk.range.startIndex,\n chunk.range.endIndex - 1,\n );\n const endEntry =\n this.transcriptIndex.getTranscriptEntryAt(lastCharIndex) ?? startEntry;\n\n const entry = SearchHandler.blankEntryFrom(startEntry.entry);\n entry.rawText = chunk.text;\n entry.id = entryIdentifier;\n entry.end = endEntry.entry.end;\n\n return entry;\n }\n\n /**\n * The merged transcript split into alternating matched and unmatched chunks.\n *\n * Searching `foo bar baz boop` for `baz` gives three chunks: `foo bar `,\n * then `baz` as a match, then ` boop`.\n */\n async getSearchSeparatedTranscript(query: string): Promise<SearchResult[]> {\n const searchRanges = await this.searchBackend.getSearchRanges(query);\n const { mergedTranscript } = this.transcriptIndex;\n\n if (searchRanges.length === 0) {\n return [this.chunkFor(new TextRange(0, mergedTranscript.length), false)];\n }\n\n // The backend may return matches in any order, and the walk below runs\n // start to finish, so out-of-order ranges would rebuild the wrong chunks.\n const orderedRanges = [...searchRanges].sort(\n (a, b) => a.startIndex - b.startIndex,\n );\n\n const chunks: SearchResult[] = [];\n let startIndex = 0;\n\n orderedRanges.forEach((searchRange) => {\n // A backend may report matches that overlap each other, as a scan\n // stepping one character at a time does for a repeated string. Only the\n // first of an overlapping set can be shown, and taking a later one would\n // build a backwards span, which `substring` quietly reverses into\n // duplicated text.\n if (searchRange.startIndex < startIndex) return;\n\n chunks.push(\n this.chunkFor(new TextRange(startIndex, searchRange.startIndex), false),\n );\n chunks.push(this.chunkFor(searchRange, true));\n startIndex = searchRange.endIndex;\n });\n\n chunks.push(\n this.chunkFor(new TextRange(startIndex, mergedTranscript.length), false),\n );\n\n return chunks;\n }\n\n private chunkFor(range: TextRange, isSearchMatch: boolean): SearchResult {\n return {\n range,\n text: this.transcriptIndex.mergedTranscript.substring(\n range.startIndex,\n range.endIndex,\n ),\n isSearchMatch,\n };\n }\n\n /** A copy of an entry with its text and result index cleared. */\n private static blankEntryFrom(\n source: TranscriptEntryConfig,\n ): TranscriptEntryConfig {\n return new TranscriptEntryConfig(\n source.id,\n source.start,\n source.end,\n '',\n source.isMusic,\n );\n }\n}\n"]}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { TextRange } from './models.js';
|
|
2
|
-
/**
|
|
3
|
-
* Where two spans overlap, or nothing if they don't.
|
|
4
|
-
*
|
|
5
|
-
* Used to work out which transcript entries a stretch of the merged transcript
|
|
6
|
-
* belongs to.
|
|
7
|
-
*/
|
|
8
|
-
export declare function getIntersection(a: TextRange, b: TextRange): TextRange | undefined;
|
|
9
|
-
//# sourceMappingURL=search-helper.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-helper.d.ts","sourceRoot":"","sources":["../../../../../src/elements/ia-radio-player/search/search-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,CAAC,EAAE,SAAS,EACZ,CAAC,EAAE,SAAS,GACX,SAAS,GAAG,SAAS,CAUvB"}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { TextRange } from './models.js';
|
|
2
|
-
/**
|
|
3
|
-
* Where two spans overlap, or nothing if they don't.
|
|
4
|
-
*
|
|
5
|
-
* Used to work out which transcript entries a stretch of the merged transcript
|
|
6
|
-
* belongs to.
|
|
7
|
-
*/
|
|
8
|
-
export function getIntersection(a, b) {
|
|
9
|
-
const earlier = a.startIndex < b.startIndex ? a : b;
|
|
10
|
-
const later = earlier === a ? b : a;
|
|
11
|
-
if (earlier.endIndex < later.startIndex)
|
|
12
|
-
return undefined;
|
|
13
|
-
return new TextRange(later.startIndex, Math.min(earlier.endIndex, later.endIndex));
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=search-helper.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"search-helper.js","sourceRoot":"","sources":["../../../../../src/elements/ia-radio-player/search/search-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAC7B,CAAY,EACZ,CAAY;IAEZ,MAAM,OAAO,GAAG,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEpC,IAAI,OAAO,CAAC,QAAQ,GAAG,KAAK,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAE1D,OAAO,IAAI,SAAS,CAClB,KAAK,CAAC,UAAU,EAChB,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,CAC3C,CAAC;AACJ,CAAC","sourcesContent":["import { TextRange } from './models';\n\n/**\n * Where two spans overlap, or nothing if they don't.\n *\n * Used to work out which transcript entries a stretch of the merged transcript\n * belongs to.\n */\nexport function getIntersection(\n a: TextRange,\n b: TextRange,\n): TextRange | undefined {\n const earlier = a.startIndex < b.startIndex ? a : b;\n const later = earlier === a ? b : a;\n\n if (earlier.endIndex < later.startIndex) return undefined;\n\n return new TextRange(\n later.startIndex,\n Math.min(earlier.endIndex, later.endIndex),\n );\n}\n"]}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
import type { TranscriptConfig } from '../../../elements/ia-transcript-view/models.js';
|
|
2
|
-
import { type TranscriptEntryRange } from './models.js';
|
|
3
|
-
/**
|
|
4
|
-
* What the search needs to know about a transcript in order to run against it
|
|
5
|
-
* and put the results back together.
|
|
6
|
-
*/
|
|
7
|
-
export interface TranscriptIndexInterface {
|
|
8
|
-
/** Every entry's text joined into one string, separated by single spaces. */
|
|
9
|
-
mergedTranscript: string;
|
|
10
|
-
/** The same string lowercased, for case-insensitive matching. */
|
|
11
|
-
mergedTranscriptLowercased: string;
|
|
12
|
-
/** Each entry paired with the span it occupies in the merged transcript. */
|
|
13
|
-
transcriptEntryRanges: TranscriptEntryRange[];
|
|
14
|
-
/** The entry covering a given character position, if any. */
|
|
15
|
-
getTranscriptEntryAt(overallCharIndex: number): TranscriptEntryRange | undefined;
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Indexes a transcript so searches can run against the whole thing at once.
|
|
19
|
-
*
|
|
20
|
-
* Entries are joined into a single string, and each one's span within it is
|
|
21
|
-
* recorded. That lets a match cross entry boundaries and still be split back
|
|
22
|
-
* into entries afterwards.
|
|
23
|
-
*/
|
|
24
|
-
export declare class TranscriptIndex implements TranscriptIndexInterface {
|
|
25
|
-
readonly mergedTranscript: string;
|
|
26
|
-
readonly mergedTranscriptLowercased: string;
|
|
27
|
-
readonly transcriptEntryRanges: TranscriptEntryRange[];
|
|
28
|
-
constructor(transcriptConfig: TranscriptConfig);
|
|
29
|
-
getTranscriptEntryAt(overallCharIndex: number): TranscriptEntryRange | undefined;
|
|
30
|
-
/**
|
|
31
|
-
* Joins the entries and records where each one landed.
|
|
32
|
-
*
|
|
33
|
-
* Spans are measured against `rawText`, which is what actually goes into the
|
|
34
|
-
* merged string. A music entry's `displayText` is a placeholder that is not
|
|
35
|
-
* in there, so measuring that instead would give it a span far longer than
|
|
36
|
-
* the text it stands for, overlapping the entries after it.
|
|
37
|
-
*
|
|
38
|
-
* Each span is taken from the string as it is being built, and the string is
|
|
39
|
-
* never adjusted afterwards. Trimming it at the end would shift every
|
|
40
|
-
* character left of the trim out from under the spans already recorded, which
|
|
41
|
-
* an entry with no text at the front of a transcript is enough to trigger.
|
|
42
|
-
*/
|
|
43
|
-
private static buildIndex;
|
|
44
|
-
}
|
|
45
|
-
//# sourceMappingURL=transcript-index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-index.d.ts","sourceRoot":"","sources":["../../../../../src/elements/ia-radio-player/search/transcript-index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAEjB,MAAM,yCAAyC,CAAC;AAEjD,OAAO,EAAa,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAEhE;;;GAGG;AACH,MAAM,WAAW,wBAAwB;IACvC,6EAA6E;IAC7E,gBAAgB,EAAE,MAAM,CAAC;IAEzB,iEAAiE;IACjE,0BAA0B,EAAE,MAAM,CAAC;IAEnC,4EAA4E;IAC5E,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;IAE9C,6DAA6D;IAC7D,oBAAoB,CAClB,gBAAgB,EAAE,MAAM,GACvB,oBAAoB,GAAG,SAAS,CAAC;CACrC;AAED;;;;;;GAMG;AACH,qBAAa,eAAgB,YAAW,wBAAwB;IAC9D,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAElC,QAAQ,CAAC,0BAA0B,EAAE,MAAM,CAAC;IAE5C,QAAQ,CAAC,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;gBAE3C,gBAAgB,EAAE,gBAAgB;IAQ9C,oBAAoB,CAClB,gBAAgB,EAAE,MAAM,GACvB,oBAAoB,GAAG,SAAS;IAQnC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;CAoB1B"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { TextRange } from './models.js';
|
|
2
|
-
/**
|
|
3
|
-
* Indexes a transcript so searches can run against the whole thing at once.
|
|
4
|
-
*
|
|
5
|
-
* Entries are joined into a single string, and each one's span within it is
|
|
6
|
-
* recorded. That lets a match cross entry boundaries and still be split back
|
|
7
|
-
* into entries afterwards.
|
|
8
|
-
*/
|
|
9
|
-
export class TranscriptIndex {
|
|
10
|
-
constructor(transcriptConfig) {
|
|
11
|
-
const { merged, ranges } = TranscriptIndex.buildIndex(transcriptConfig);
|
|
12
|
-
this.mergedTranscript = merged;
|
|
13
|
-
this.mergedTranscriptLowercased = merged.toLowerCase();
|
|
14
|
-
this.transcriptEntryRanges = ranges;
|
|
15
|
-
}
|
|
16
|
-
getTranscriptEntryAt(overallCharIndex) {
|
|
17
|
-
return this.transcriptEntryRanges.find(({ range }) => range.startIndex <= overallCharIndex &&
|
|
18
|
-
range.endIndex > overallCharIndex);
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Joins the entries and records where each one landed.
|
|
22
|
-
*
|
|
23
|
-
* Spans are measured against `rawText`, which is what actually goes into the
|
|
24
|
-
* merged string. A music entry's `displayText` is a placeholder that is not
|
|
25
|
-
* in there, so measuring that instead would give it a span far longer than
|
|
26
|
-
* the text it stands for, overlapping the entries after it.
|
|
27
|
-
*
|
|
28
|
-
* Each span is taken from the string as it is being built, and the string is
|
|
29
|
-
* never adjusted afterwards. Trimming it at the end would shift every
|
|
30
|
-
* character left of the trim out from under the spans already recorded, which
|
|
31
|
-
* an entry with no text at the front of a transcript is enough to trigger.
|
|
32
|
-
*/
|
|
33
|
-
static buildIndex(transcriptConfig) {
|
|
34
|
-
const ranges = [];
|
|
35
|
-
let merged = '';
|
|
36
|
-
transcriptConfig.entries.forEach((entry) => {
|
|
37
|
-
// A space between entries, or the words either side would run together.
|
|
38
|
-
// Skipped around entries with no text, which need no separating.
|
|
39
|
-
if (merged !== '' && entry.rawText !== '')
|
|
40
|
-
merged += ' ';
|
|
41
|
-
const startIndex = merged.length;
|
|
42
|
-
merged += entry.rawText;
|
|
43
|
-
ranges.push({ entry, range: new TextRange(startIndex, merged.length) });
|
|
44
|
-
});
|
|
45
|
-
return { merged, ranges };
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
//# sourceMappingURL=transcript-index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"transcript-index.js","sourceRoot":"","sources":["../../../../../src/elements/ia-radio-player/search/transcript-index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,SAAS,EAA6B,MAAM,UAAU,CAAC;AAsBhE;;;;;;GAMG;AACH,MAAM,OAAO,eAAe;IAO1B,YAAY,gBAAkC;QAC5C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,eAAe,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;QAExE,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;QAC/B,IAAI,CAAC,0BAA0B,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;QACvD,IAAI,CAAC,qBAAqB,GAAG,MAAM,CAAC;IACtC,CAAC;IAED,oBAAoB,CAClB,gBAAwB;QAExB,OAAO,IAAI,CAAC,qBAAqB,CAAC,IAAI,CACpC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CACZ,KAAK,CAAC,UAAU,IAAI,gBAAgB;YACpC,KAAK,CAAC,QAAQ,GAAG,gBAAgB,CACpC,CAAC;IACJ,CAAC;IAED;;;;;;;;;;;;OAYG;IACK,MAAM,CAAC,UAAU,CAAC,gBAAkC;QAI1D,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,IAAI,MAAM,GAAG,EAAE,CAAC;QAEhB,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAA4B,EAAE,EAAE;YAChE,wEAAwE;YACxE,iEAAiE;YACjE,IAAI,MAAM,KAAK,EAAE,IAAI,KAAK,CAAC,OAAO,KAAK,EAAE;gBAAE,MAAM,IAAI,GAAG,CAAC;YAEzD,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,OAAO,CAAC;YAExB,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,SAAS,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC1E,CAAC,CAAC,CAAC;QAEH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;CACF","sourcesContent":["import type {\n TranscriptConfig,\n TranscriptEntryConfig,\n} from '@src/elements/ia-transcript-view/models';\n\nimport { TextRange, type TranscriptEntryRange } from './models';\n\n/**\n * What the search needs to know about a transcript in order to run against it\n * and put the results back together.\n */\nexport interface TranscriptIndexInterface {\n /** Every entry's text joined into one string, separated by single spaces. */\n mergedTranscript: string;\n\n /** The same string lowercased, for case-insensitive matching. */\n mergedTranscriptLowercased: string;\n\n /** Each entry paired with the span it occupies in the merged transcript. */\n transcriptEntryRanges: TranscriptEntryRange[];\n\n /** The entry covering a given character position, if any. */\n getTranscriptEntryAt(\n overallCharIndex: number,\n ): TranscriptEntryRange | undefined;\n}\n\n/**\n * Indexes a transcript so searches can run against the whole thing at once.\n *\n * Entries are joined into a single string, and each one's span within it is\n * recorded. That lets a match cross entry boundaries and still be split back\n * into entries afterwards.\n */\nexport class TranscriptIndex implements TranscriptIndexInterface {\n readonly mergedTranscript: string;\n\n readonly mergedTranscriptLowercased: string;\n\n readonly transcriptEntryRanges: TranscriptEntryRange[];\n\n constructor(transcriptConfig: TranscriptConfig) {\n const { merged, ranges } = TranscriptIndex.buildIndex(transcriptConfig);\n\n this.mergedTranscript = merged;\n this.mergedTranscriptLowercased = merged.toLowerCase();\n this.transcriptEntryRanges = ranges;\n }\n\n getTranscriptEntryAt(\n overallCharIndex: number,\n ): TranscriptEntryRange | undefined {\n return this.transcriptEntryRanges.find(\n ({ range }) =>\n range.startIndex <= overallCharIndex &&\n range.endIndex > overallCharIndex,\n );\n }\n\n /**\n * Joins the entries and records where each one landed.\n *\n * Spans are measured against `rawText`, which is what actually goes into the\n * merged string. A music entry's `displayText` is a placeholder that is not\n * in there, so measuring that instead would give it a span far longer than\n * the text it stands for, overlapping the entries after it.\n *\n * Each span is taken from the string as it is being built, and the string is\n * never adjusted afterwards. Trimming it at the end would shift every\n * character left of the trim out from under the spans already recorded, which\n * an entry with no text at the front of a transcript is enough to trigger.\n */\n private static buildIndex(transcriptConfig: TranscriptConfig): {\n merged: string;\n ranges: TranscriptEntryRange[];\n } {\n const ranges: TranscriptEntryRange[] = [];\n let merged = '';\n\n transcriptConfig.entries.forEach((entry: TranscriptEntryConfig) => {\n // A space between entries, or the words either side would run together.\n // Skipped around entries with no text, which need no separating.\n if (merged !== '' && entry.rawText !== '') merged += ' ';\n\n const startIndex = merged.length;\n merged += entry.rawText;\n\n ranges.push({ entry, range: new TextRange(startIndex, merged.length) });\n });\n\n return { merged, ranges };\n }\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"next-section-marker.d.ts","sourceRoot":"","sources":["../../../../../src/elements/ia-scrubber-bar/assets/next-section-marker.ts"],"names":[],"mappings":";AAQA,wBASE"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Right-pointing arrow shown on a section marker
|
|
3
|
-
*
|
|
4
|
-
* Inline so the marker can recolor it with `currentColor`, which is not
|
|
5
|
-
* possible on the contents of an `<img>`.
|
|
6
|
-
*/
|
|
7
|
-
import { svg } from 'lit';
|
|
8
|
-
export default svg `
|
|
9
|
-
<svg height="10" viewBox="0 0 8 10" width="8" xmlns="http://www.w3.org/2000/svg">
|
|
10
|
-
<path
|
|
11
|
-
d="m4 1 5 8h-10z"
|
|
12
|
-
fill="currentColor"
|
|
13
|
-
fill-rule="evenodd"
|
|
14
|
-
transform="matrix(0 1 -1 0 9 1)"
|
|
15
|
-
/>
|
|
16
|
-
</svg>
|
|
17
|
-
`;
|
|
18
|
-
//# sourceMappingURL=next-section-marker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"next-section-marker.js","sourceRoot":"","sources":["../../../../../src/elements/ia-scrubber-bar/assets/next-section-marker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,eAAe,GAAG,CAAA;;;;;;;;;CASjB,CAAC","sourcesContent":["/**\n * @file Right-pointing arrow shown on a section marker\n *\n * Inline so the marker can recolor it with `currentColor`, which is not\n * possible on the contents of an `<img>`.\n */\nimport { svg } from 'lit';\n\nexport default svg`\n<svg height=\"10\" viewBox=\"0 0 8 10\" width=\"8\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"m4 1 5 8h-10z\"\n fill=\"currentColor\"\n fill-rule=\"evenodd\"\n transform=\"matrix(0 1 -1 0 9 1)\"\n />\n</svg>\n`;\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"previous-section-marker.d.ts","sourceRoot":"","sources":["../../../../../src/elements/ia-scrubber-bar/assets/previous-section-marker.ts"],"names":[],"mappings":";AAQA,wBASE"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @file Left-pointing arrow shown on a section marker
|
|
3
|
-
*
|
|
4
|
-
* Inline so the marker can recolor it with `currentColor`, which is not
|
|
5
|
-
* possible on the contents of an `<img>`.
|
|
6
|
-
*/
|
|
7
|
-
import { svg } from 'lit';
|
|
8
|
-
export default svg `
|
|
9
|
-
<svg height="10" viewBox="0 0 8 10" width="8" xmlns="http://www.w3.org/2000/svg">
|
|
10
|
-
<path
|
|
11
|
-
d="m4 1 5 8h-10z"
|
|
12
|
-
fill="currentColor"
|
|
13
|
-
fill-rule="evenodd"
|
|
14
|
-
transform="matrix(0 -1 1 0 -1 9)"
|
|
15
|
-
/>
|
|
16
|
-
</svg>
|
|
17
|
-
`;
|
|
18
|
-
//# sourceMappingURL=previous-section-marker.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"previous-section-marker.js","sourceRoot":"","sources":["../../../../../src/elements/ia-scrubber-bar/assets/previous-section-marker.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,eAAe,GAAG,CAAA;;;;;;;;;CASjB,CAAC","sourcesContent":["/**\n * @file Left-pointing arrow shown on a section marker\n *\n * Inline so the marker can recolor it with `currentColor`, which is not\n * possible on the contents of an `<img>`.\n */\nimport { svg } from 'lit';\n\nexport default svg`\n<svg height=\"10\" viewBox=\"0 0 8 10\" width=\"8\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"m4 1 5 8h-10z\"\n fill=\"currentColor\"\n fill-rule=\"evenodd\"\n transform=\"matrix(0 -1 1 0 -1 9)\"\n />\n</svg>\n`;\n"]}
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { LitElement, type CSSResultGroup, type PropertyValues, type TemplateResult } from 'lit';
|
|
2
|
-
import './ia-section-marker.js';
|
|
3
|
-
/**
|
|
4
|
-
* A range slider styled as a playback scrubber, with optional section markers
|
|
5
|
-
* laid over the track.
|
|
6
|
-
*/
|
|
7
|
-
export declare class IAScrubberBar extends LitElement {
|
|
8
|
-
/** The current position along the track */
|
|
9
|
-
value: number;
|
|
10
|
-
/** The lowest position the scrubber can reach */
|
|
11
|
-
min: number;
|
|
12
|
-
/** The highest position the scrubber can reach */
|
|
13
|
-
max: number;
|
|
14
|
-
/** How finely the scrubber can be moved */
|
|
15
|
-
step: number;
|
|
16
|
-
/** Where to draw section boundaries, as percentages of the track */
|
|
17
|
-
sectionMarkerPercentages: number[];
|
|
18
|
-
/** Whether the markers either side of the playhead point towards it */
|
|
19
|
-
expandSectionMarkers: boolean;
|
|
20
|
-
/** The accessible name for the slider */
|
|
21
|
-
label: string;
|
|
22
|
-
/**
|
|
23
|
-
* The position actually shown.
|
|
24
|
-
*
|
|
25
|
-
* `value` is driven from outside by whatever is playing the audio, but while
|
|
26
|
-
* the listener is scrubbing their position wins. Keeping the two apart is
|
|
27
|
-
* what stops playback updates fighting the drag.
|
|
28
|
-
*/
|
|
29
|
-
private currentValue;
|
|
30
|
-
private userIsInteracting;
|
|
31
|
-
/** How far along the track the playhead is, as a percentage */
|
|
32
|
-
get percentage(): number;
|
|
33
|
-
render(): TemplateResult;
|
|
34
|
-
updated(changedProperties: PropertyValues): void;
|
|
35
|
-
/**
|
|
36
|
-
* The section boundaries immediately below and above the playhead.
|
|
37
|
-
*
|
|
38
|
-
* Returns nothing when the markers aren't meant to react to the playhead, so
|
|
39
|
-
* every marker falls back to its resting state.
|
|
40
|
-
*/
|
|
41
|
-
private get surroundingMarkers();
|
|
42
|
-
/**
|
|
43
|
-
* The marker percentages in ascending numeric order.
|
|
44
|
-
*
|
|
45
|
-
* Sorted on a copy with an explicit comparator: the default `sort()` orders
|
|
46
|
-
* lexicographically, which puts 100 before 9, and it sorts in place, which
|
|
47
|
-
* would reorder the caller's own array.
|
|
48
|
-
*/
|
|
49
|
-
private get sortedMarkers();
|
|
50
|
-
private markerModeFor;
|
|
51
|
-
private handleSlide;
|
|
52
|
-
private interactionStarted;
|
|
53
|
-
/**
|
|
54
|
-
* Starts an interaction when the slider is scrubbed from the keyboard.
|
|
55
|
-
*
|
|
56
|
-
* Without this, arrowing along the bar sets the value but leaves
|
|
57
|
-
* `userIsInteracting` false, so the next playback tick snaps the thumb back
|
|
58
|
-
* to the playhead mid-scrub.
|
|
59
|
-
*
|
|
60
|
-
* Guarded against the auto-repeat that holding a key produces, which would
|
|
61
|
-
* otherwise emit a fresh `userInteractionStarted` on every repeat.
|
|
62
|
-
*/
|
|
63
|
-
private handleKeyDown;
|
|
64
|
-
private handleKeyUp;
|
|
65
|
-
/**
|
|
66
|
-
* Releases an interaction that focus left behind.
|
|
67
|
-
*
|
|
68
|
-
* A keyup can go missing, e.g. focus moves while the key is still down, and
|
|
69
|
-
* an interaction left latched on would ignore playback updates for good.
|
|
70
|
-
*/
|
|
71
|
-
private handleBlur;
|
|
72
|
-
/**
|
|
73
|
-
* Ends the interaction.
|
|
74
|
-
*
|
|
75
|
-
* Bound to `touchcancel` as well as `touchend`, because a touch the system
|
|
76
|
-
* takes over never delivers `touchend`, and an interaction left latched on
|
|
77
|
-
* would ignore playback updates from then on.
|
|
78
|
-
*/
|
|
79
|
-
private interactionEnded;
|
|
80
|
-
static get styles(): CSSResultGroup;
|
|
81
|
-
}
|
|
82
|
-
//# sourceMappingURL=ia-scrubber-bar.d.ts.map
|