@internetarchive/bookreader 5.0.0-32 → 5.0.0-32-shadydom2
Sign up to get free protection for your applications and to get access to all the features.
- package/BookReader/BookReader.js +32261 -2
- package/BookReader/BookReader.js.map +1 -1
- package/BookReader/ia-bookreader-bundle.js +14862 -1133
- package/BookReader/ia-bookreader-bundle.js.map +1 -1
- package/BookReader/icons/1up.svg +12 -1
- package/BookReader/icons/2up.svg +15 -1
- package/BookReader/icons/advance.svg +26 -3
- 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 +17 -1
- package/BookReader/icons/fullscreen_exit.svg +17 -1
- package/BookReader/icons/hamburger.svg +15 -1
- package/BookReader/icons/left-arrow.svg +12 -1
- package/BookReader/icons/magnify-minus.svg +16 -1
- package/BookReader/icons/magnify-plus.svg +17 -1
- package/BookReader/icons/magnify.svg +15 -1
- package/BookReader/icons/pause.svg +23 -1
- package/BookReader/icons/play.svg +22 -1
- package/BookReader/icons/playback-speed.svg +34 -1
- package/BookReader/icons/read-aloud.svg +22 -1
- package/BookReader/icons/review.svg +22 -3
- package/BookReader/icons/thumbnails.svg +17 -1
- package/BookReader/icons/voice.svg +1 -1
- package/BookReader/icons/volume-full.svg +22 -1
- package/BookReader/images/BRicons.svg +94 -5
- package/BookReader/images/books_graphic.svg +177 -1
- package/BookReader/images/icon_book.svg +12 -1
- package/BookReader/images/icon_bookmark.svg +12 -1
- package/BookReader/images/icon_gear.svg +14 -1
- package/BookReader/images/icon_hamburger.svg +20 -1
- package/BookReader/images/icon_home.svg +21 -1
- package/BookReader/images/icon_info.svg +11 -1
- package/BookReader/images/icon_one_page.svg +8 -1
- package/BookReader/images/icon_pause.svg +1 -1
- package/BookReader/images/icon_play.svg +1 -1
- package/BookReader/images/icon_playback-rate.svg +15 -1
- package/BookReader/images/icon_search_button.svg +8 -1
- package/BookReader/images/icon_share.svg +9 -1
- package/BookReader/images/icon_skip-ahead.svg +6 -1
- package/BookReader/images/icon_skip-back.svg +13 -2
- package/BookReader/images/icon_speaker.svg +18 -1
- package/BookReader/images/icon_speaker_open.svg +10 -1
- package/BookReader/images/icon_thumbnails.svg +12 -1
- package/BookReader/images/icon_toc.svg +5 -1
- package/BookReader/images/icon_two_pages.svg +9 -1
- package/BookReader/images/marker_chap-off.svg +11 -1
- package/BookReader/images/marker_chap-on.svg +11 -1
- package/BookReader/images/marker_srch-on.svg +11 -1
- package/BookReader/jquery-1.10.1.js +108 -2
- package/BookReader/plugins/plugin.archive_analytics.js +170 -1
- package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
- package/BookReader/plugins/plugin.autoplay.js +163 -1
- package/BookReader/plugins/plugin.autoplay.js.map +1 -1
- package/BookReader/plugins/plugin.chapters.js +333 -1
- package/BookReader/plugins/plugin.chapters.js.map +1 -1
- package/BookReader/plugins/plugin.iframe.js +72 -1
- package/BookReader/plugins/plugin.iframe.js.map +1 -1
- package/BookReader/plugins/plugin.mobile_nav.js +332 -1
- package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
- package/BookReader/plugins/plugin.resume.js +241 -1
- package/BookReader/plugins/plugin.resume.js.map +1 -1
- package/BookReader/plugins/plugin.search.js +1261 -1
- package/BookReader/plugins/plugin.search.js.map +1 -1
- package/BookReader/plugins/plugin.text_selection.js +839 -1
- package/BookReader/plugins/plugin.text_selection.js.map +1 -1
- package/BookReader/plugins/plugin.tts.js +9115 -2
- package/BookReader/plugins/plugin.tts.js.map +1 -1
- package/BookReader/plugins/plugin.url.js +811 -1
- package/BookReader/plugins/plugin.url.js.map +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js +326 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
- package/BookReader/webcomponents-bundle.js +411 -2
- package/BookReader/webcomponents-bundle.js.map +1 -1
- package/CHANGELOG.md +0 -3
- package/package.json +2 -2
- package/src/BookNavigator/bookmarks/bookmarks-provider.js +1 -1
- package/src/BookNavigator/bookmarks/ia-bookmarks.js +3 -5
- package/tests/karma/BookNavigator/bookmarks/ia-bookmarks.test.js +0 -57
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"plugins/plugin.search.js","mappings":"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","sources":["webpack://@internetarchive/bookreader/./src/plugins/search/plugin.search.js","webpack://@internetarchive/bookreader/./src/plugins/search/view.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.object.entries.js"],"sourcesContent":["/* global BookReader */\n/**\n * Plugin for Archive.org book search\n * NOTE: This script must be loaded AFTER `plugin.mobile_nav.js`\n * as it mutates mobile nav drawer\n *\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 { renderBoxesInPageContainerLayer } from '../../BookReader/PageContainer.js';\nimport SearchView from './view.js';\n/** @typedef {import('../../BookReader/PageContainer').PageContainer} PageContainer */\n/** @typedef {import('../../BookReader/BookModel').PageIndex} PageIndex */\n\njQuery.extend(BookReader.defaultOptions, {\n server: 'ia600609.us.archive.org',\n bookId: '',\n subPrefix: '',\n bookPath: '',\n enableSearch: true,\n searchInsideUrl: '/fulltext/inside.php',\n initialSearchTerm: null,\n});\n\n/** @override */\nBookReader.prototype.setup = (function (super_) {\n return function (options) {\n super_.call(this, options);\n\n this.searchTerm = '';\n this.searchResults = null;\n this.searchInsideUrl = options.searchInsideUrl;\n this.enableSearch = options.enableSearch;\n\n // Base server used by some api calls\n this.bookId = options.bookId;\n this.server = options.server;\n this.subPrefix = options.subPrefix;\n this.bookPath = options.bookPath;\n\n this.searchXHR = null;\n this._cancelSearch.bind(this);\n this.cancelSearchRequest.bind(this);\n\n /** @type { {[pageIndex: number]: SearchInsideMatchBox[]} } */\n this._searchBoxesByIndex = {};\n\n this.searchView = undefined;\n };\n})(BookReader.prototype.setup);\n\n/** @override */\nBookReader.prototype.init = (function (super_) {\n return function () {\n super_.call(this);\n // give SearchView the most complete bookreader state\n this.searchView = new SearchView({\n br: this,\n searchCancelledCallback: () => {\n this._cancelSearch();\n this.trigger('SearchCanceled', { term: this.searchTerm, instance: this });\n }\n });\n if (this.options.enableSearch && 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 }\n };\n})(BookReader.prototype.init);\n\n/** @override */\nBookReader.prototype.buildToolbarElement = (function (super_) {\n return function () {\n const $el = super_.call(this);\n if (!this.enableSearch) { return; }\n if (this.searchView.dom.toolbarSearch) {\n $el.find('.BRtoolbarSectionInfo').after(this.searchView.dom.toolbarSearch);\n }\n return $el;\n };\n})(BookReader.prototype.buildToolbarElement);\n\n/** @override */\nBookReader.prototype._createPageContainer = (function (super_) {\n return function (index) {\n const pageContainer = super_.call(this, index);\n if (this.enableSearch && pageContainer.page && index in this._searchBoxesByIndex) {\n const pageIndex = pageContainer.page.index;\n renderBoxesInPageContainerLayer('searchHiliteLayer', this._searchBoxesByIndex[pageIndex], pageContainer.page, pageContainer.$container[0]);\n }\n return pageContainer;\n };\n})(BookReader.prototype._createPageContainer);\n\n/**\n * @typedef {object} SearchOptions\n * @property {boolean} goToFirstResult\n * @property {boolean} disablePopup\n * @property {(null|function)} error - @deprecated at v.5.0\n * @property {(null|function)} success - @deprecated at v.5.0\n */\n\n/**\n * Submits search request\n *\n * @param {string} term\n * @param {SearchOptions} overrides\n */\nBookReader.prototype.search = function(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\n // strip slashes, since this goes in the url\n this.searchTerm = term.replace(/\\//g, ' ');\n\n if (!options.suppressFragmentChange) {\n this.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 // Remove the port and userdir\n const serverPath = this.server.replace(/:.+/, '');\n const baseUrl = `https://${serverPath}${this.searchInsideUrl}?`;\n\n // Remove subPrefix from end of path\n let path = this.bookPath;\n const subPrefixWithSlash = `/${this.subPrefix}`;\n if (this.bookPath.length - this.bookPath.lastIndexOf(subPrefixWithSlash) == subPrefixWithSlash.length) {\n path = this.bookPath.substr(0, this.bookPath.length - subPrefixWithSlash.length);\n }\n\n const urlParams = {\n item_id: this.bookId,\n doc: this.subPrefix,\n path,\n q: term,\n };\n\n // NOTE that the API does not expect / (slashes) to be encoded. (%2F) won't work\n const paramStr = $.param(urlParams).replace(/%2F/g, '/');\n\n const url = `${baseUrl}${paramStr}`;\n\n const cleanup = () => {\n this.searchXHR = null;\n window.BRSearchInProgress = () => {};\n };\n\n const processSearchResults = (searchInsideResults) => {\n if (!this.searchXHR) {\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 hasCustomError\n ? options.error.call(this, searchInsideResults, options)\n : this.BRSearchCallbackError(searchInsideResults, options);\n } else {\n hasCustomSuccess\n ? options.success.call(this, searchInsideResults, options)\n : this.BRSearchCallback(searchInsideResults, options);\n }\n cleanup();\n };\n\n const beforeSend = (xhr) => {\n this.searchXHR = xhr;\n window.BRSearchInProgress = processSearchResults;\n };\n\n this.trigger('SearchStarted', { term: this.searchTerm, instance: this });\n return $.ajax({\n url: url,\n dataType: 'jsonp',\n cache: true,\n beforeSend,\n jsonpCallback: 'BRSearchInProgress'\n }).then(processSearchResults);\n};\n\n/**\n * cancels AJAX Call\n * emits custom event\n */\nBookReader.prototype._cancelSearch = function () {\n this.searchXHR?.abort();\n this.searchView.clearSearchFieldAndResults(false);\n this.searchTerm = '';\n this.searchXHR = null;\n this.searchResults = [];\n window.BRSearchInProgress = () => {};\n};\n\n/**\n * External function to cancel search\n * checks for term & xhr in flight before running\n */\nBookReader.prototype.cancelSearchRequest = function () {\n if (this.searchXHR !== null) {\n this._cancelSearch();\n this.searchView.toggleSearchPending();\n this.trigger('SearchCanceled', { term: this.searchTerm, instance: this });\n }\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 */\n\n/**\n * @typedef {object} SearchInsideMatch\n * @property {string} text\n * @property {Array<{ page: number, boxes: SearchInsideMatchBox[] }>} par\n */\n\n/**\n * @typedef {object} SearchInsideResults\n * @property {string} error\n * @property {SearchInsideMatch[]} matches\n * @property {boolean} indexed\n */\n\n/**\n * Search Results return handler\n * @callback\n * @param {SearchInsideResults} results\n * @param {object} options\n * @param {boolean} options.goToFirstResult\n */\nBookReader.prototype.BRSearchCallback = function(results, options) {\n this.searchResults = results || [];\n\n this.updateSearchHilites();\n this.removeProgressPopup();\n if (options.goToFirstResult) {\n const pageIndex = this._models.book.leafNumToIndex(results.matches[0].par[0].page);\n this._searchPluginGoToResult(pageIndex);\n }\n this.trigger('SearchCallback', { results, options, instance: this });\n};\n\n/**\n * Main search results error handler\n * @callback\n * @param {SearchInsideResults} results\n */\nBookReader.prototype.BRSearchCallbackError = function(results) {\n this._BRSearchCallbackError(results);\n};\n\n/**\n * @private draws search results error\n * @callback\n * @param {SearchInsideResults} results\n * @param {jQuery} $el\n * @param {boolean} fade\n */\nBookReader.prototype._BRSearchCallbackError = function(results) {\n this.searchResults = results;\n const basePayload = {\n term: this.searchTerm,\n instance: this,\n };\n if (results.error) {\n const payload = Object.assign({}, basePayload, { results });\n this.trigger('SearchCallbackError', payload);\n } else if (0 == results.matches.length) {\n if (false === results.indexed) {\n this.trigger('SearchCallbackBookNotIndexed', basePayload);\n return;\n }\n this.trigger('SearchCallbackEmpty', basePayload);\n }\n};\n\n/**\n * updates search on-page highlights controller\n */\nBookReader.prototype.updateSearchHilites = function() {\n /** @type {SearchInsideMatch[]} */\n const matches = this.searchResults?.matches || [];\n /** @type { {[pageIndex: number]: SearchInsideMatch[]} } */\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.leafNumToIndex(box.page);\n const pageMatches = boxesByIndex[pageIndex] || (boxesByIndex[pageIndex] = []);\n pageMatches.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._models.book.getPage(pageIndex);\n const pageContainers = this.getActivePageContainerElementsForIndex(pageIndex);\n pageContainers.forEach(container => renderBoxesInPageContainerLayer('searchHiliteLayer', boxes, page, container));\n }\n\n this._searchBoxesByIndex = boxesByIndex;\n};\n\n/**\n * remove search highlights\n */\nBookReader.prototype.removeSearchHilites = function() {\n $(this.getActivePageContainerElements()).find('.searchHiliteLayer').remove();\n};\n\n/**\n * @private\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 {PageIndex} pageIndex\n */\nBookReader.prototype._searchPluginGoToResult = async function (pageIndex) {\n const { book } = this._models;\n const page = book.getPage(pageIndex);\n let makeUnviewableAtEnd = false;\n if (!page.isViewable) {\n const resp = await fetch('/services/bookreader/request_page?' + new URLSearchParams({\n id: this.options.bookId,\n subprefix: this.options.subPrefix,\n leafNum: page.leafNum,\n })).then(r => r.json());\n\n for (const leafNum of resp.value) {\n book.getPage(book.leafNumToIndex(leafNum)).makeViewable();\n }\n\n // not able to show page; make the page viewable anyways so that it can\n // actually open. On IA, it has a fallback to a special error page.\n if (!resp.value.length) {\n book.getPage(pageIndex).makeViewable();\n makeUnviewableAtEnd = true;\n }\n }\n /* this updates the URL */\n this.suppressFragmentChange = false;\n this.jumpToIndex(pageIndex);\n\n // Reset it to unviewable if it wasn't resolved\n if (makeUnviewableAtEnd) {\n book.getPage(pageIndex).makeViewable(false);\n }\n};\n\n/**\n * Removes all search pins\n */\nBookReader.prototype.removeSearchResults = function(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.trigger(BookReader.eventNames.fragmentChange);\n }\n};\n\n/**\n * Returns true if a search highlight is currently being displayed\n * @returns {boolean}\n */\nBookReader.prototype.searchHighlightVisible = function() {\n const results = this.searchResults;\n let visiblePages = [];\n if (null == results) return false;\n\n if (this.constMode2up == this.mode) {\n visiblePages = [this.twoPage.currentIndexL, this.twoPage.currentIndexR];\n } else if (this.constMode1up == this.mode) {\n visiblePages = [this.currentIndex()];\n } else {\n return false;\n }\n\n results.matches.some(match => {\n return match.par[0].boxes.some(box => {\n const pageIndex = this.leafNumToIndex(box.page);\n if (jQuery.inArray(pageIndex, visiblePages) >= 0) {\n return true;\n }\n });\n });\n\n return false;\n};\n","class SearchView {\n /**\n * @param {object} params\n * @param {object} params.br The BookReader instance\n * @param {function} params.cancelSearch 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 this.br = br;\n\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 this.matcher = new RegExp('{{{(.+?)}}}', 'g');\n this.matches = [];\n this.cacheDOMElements();\n this.bindEvents();\n this.cancelSearch = searchCancelledCallback;\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.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').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 this.dom.searchNavigation.find('[data-id=resultsCount]').text(this.resultsPosition());\n }\n\n updateSearchNavigationButtons() {\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.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 queryString = match.text;\n const pageIndex = this.br.leafNumToIndex(match.par[0].page);\n const pageNumber = this.br.getPageNum(pageIndex);\n const uiStringSearch = \"Search result\"; // i18n\n const uiStringPage = \"Page\"; // i18n\n\n const percentThrough = this.br.constructor.util.cssPercentage(pageIndex, this.br.getNumLeafs() - 1);\n\n const queryStringWithB = queryString.replace(this.matcher, '<b>$1</b>');\n\n let queryStringWithBTruncated = '';\n\n if (queryString.length > 100) {\n queryStringWithBTruncated = queryString\n .replace(/^(.{100}[^\\s]*).*/, \"$1\")\n .replace(this.matcher, '<b>$1</b>')\n + '...';\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 <div>${queryStringWithBTruncated || queryStringWithB}</div>\n <div>${uiStringPage} ${pageNumber}</div>\n </div>\n `)\n .data({ pageIndex })\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\", function (event) {\n // closures are nested and deep, using an arrow function breaks references.\n // Todo: update to arrow function & clean up closures\n // to remove `bind` dependency\n this.br._searchPluginGoToResult(+$(event.target).data('pageIndex'));\n }.bind(this));\n });\n }\n\n /**\n * @param {boolean} bool\n */\n toggleSearchPending(bool) {\n if (bool) {\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 document.querySelector(this.br.el).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 /**\n * @param {Event} e\n */\n handleNavToggledCallback(e) {\n const is_visible = this.br.navigationIsVisible();\n this.togglePinsFor(is_visible);\n }\n\n handleSearchStarted() {\n this.emptyMatches();\n this.br.removeSearchHilites();\n this.removeResultPins();\n this.toggleSearchPending(true);\n this.teardownSearchNavigation();\n this.setQuery(this.br.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}navToggled`, this.handleNavToggledCallback.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","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.es/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n"],"names":["super_","SearchView","br","searchCancelledCallback","this","matcher","RegExp","matches","cacheDOMElements","bindEvents","cancelSearch","dom","toolbarSearch","buildToolbarSearch","query","$","val","remove","dispatchEventWhenComplete","removeSearchResults","removeResultPins","emptyMatches","setQuery","teardownSearchNavigation","trigger","selector","before","resultsPosition","searchNavigation","positionMessage","length","currentMatchIndex","namespace","on","clearSearchFieldAndResults","bind","showPrevResult","showNextResult","toggleSidebar","mode","constModeThumb","switchMode","constMode1up","getClosestMatchIndex","start","end","comparator","eq","click","updateResultsPosition","updateSearchNavigationButtons","comparisonFn","closestPage","closestTo","pool","slice","map","m","par","page","currentIndex","indexOf","find","text","attr","off","resize","matchingSearchResult","constMode2up","find2upMatchingSearchResult","find1upMatchingSearchResult","_isIndexDisplayed","setCurrentMatchIndex","bool","pinsVisibleState","refs","$BRfooter","css","visibility","document","createElement","classList","add","innerHTML","imagesBaseURL","forEach","match","queryString","pageIndex","leafNumToIndex","pageNumber","getPageNum","percentThrough","constructor","util","cssPercentage","getNumLeafs","queryStringWithB","replace","queryStringWithBTruncated","addClass","left","append","data","appendTo","event","marker","currentTarget","tooltip","querySelector","tooltipOffset","getBoundingClientRect","targetOffset","boxSizeAdjust","parseInt","getComputedStyle","paddingLeft","x","style","setProperty","removeClass","target","_searchPluginGoToResult","showProgressPopup","progressPopupClosed","removeProgressPopup","toggleSearchPending","textIsProcessing","errorDetails","renderModalMessage","delayModalRemovalFor","messageHTML","modal","el","timeoutMS","setTimeout","e","preventDefault","value","search","results","options","renderSearchNavigation","bindSearchNavigationEvents","renderPins","goToFirstResult","one","is_visible","navigationIsVisible","togglePinsFor","removeSearchHilites","searchTerm","isIndexed","detail","props","indexed","renderErrorModal","renderBookNotIndexedModal","renderResultsEmptyModal","window","addEventListener","handleSearchCallbackError","handleSearchCallback","handleNavToggledCallback","handleSearchStarted","handleSearchCallbackBookNotIndexed","handleSearchCallbackEmpty","updateSearchNavigation","submitHandler","jQuery","extend","BookReader","defaultOptions","server","bookId","subPrefix","bookPath","enableSearch","searchInsideUrl","initialSearchTerm","prototype","setup","call","searchResults","searchXHR","_cancelSearch","cancelSearchRequest","_searchBoxesByIndex","searchView","undefined","init","term","instance","suppressFragmentChange","buildToolbarElement","$el","after","_createPageContainer","index","pageContainer","renderBoxesInPageContainerLayer","$container","overrides","disablePopup","error","success","eventNames","fragmentChange","serverPath","baseUrl","path","subPrefixWithSlash","lastIndexOf","substr","urlParams","item_id","doc","q","paramStr","param","url","cleanup","BRSearchInProgress","processSearchResults","searchInsideResults","responseHasError","hasCustomError","hasCustomSuccess","BRSearchCallbackError","BRSearchCallback","beforeSend","xhr","ajax","dataType","cache","jsonpCallback","then","abort","updateSearchHilites","_models","book","_BRSearchCallbackError","basePayload","payload","Object","assign","boxesByIndex","boxes","box","push","pageIndexString","parseFloat","getPage","getActivePageContainerElementsForIndex","container","entries","getActivePageContainerElements","makeUnviewableAtEnd","isViewable","fetch","URLSearchParams","id","subprefix","leafNum","r","json","resp","makeViewable","jumpToIndex","searchHighlightVisible","visiblePages","twoPage","currentIndexL","currentIndexR","some","inArray","$entries","stat","O"],"sourceRoot":""}
|
1
|
+
{"version":3,"file":"plugins/plugin.search.js","mappings":"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","sources":["webpack://@internetarchive/bookreader/./src/plugins/search/plugin.search.js","webpack://@internetarchive/bookreader/./src/plugins/search/view.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.object.entries.js"],"sourcesContent":["/* global BookReader */\n/**\n * Plugin for Archive.org book search\n * NOTE: This script must be loaded AFTER `plugin.mobile_nav.js`\n * as it mutates mobile nav drawer\n *\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 { renderBoxesInPageContainerLayer } from '../../BookReader/PageContainer.js';\nimport SearchView from './view.js';\n/** @typedef {import('../../BookReader/PageContainer').PageContainer} PageContainer */\n/** @typedef {import('../../BookReader/BookModel').PageIndex} PageIndex */\n\njQuery.extend(BookReader.defaultOptions, {\n server: 'ia600609.us.archive.org',\n bookId: '',\n subPrefix: '',\n bookPath: '',\n enableSearch: true,\n searchInsideUrl: '/fulltext/inside.php',\n initialSearchTerm: null,\n});\n\n/** @override */\nBookReader.prototype.setup = (function (super_) {\n return function (options) {\n super_.call(this, options);\n\n this.searchTerm = '';\n this.searchResults = null;\n this.searchInsideUrl = options.searchInsideUrl;\n this.enableSearch = options.enableSearch;\n\n // Base server used by some api calls\n this.bookId = options.bookId;\n this.server = options.server;\n this.subPrefix = options.subPrefix;\n this.bookPath = options.bookPath;\n\n this.searchXHR = null;\n this._cancelSearch.bind(this);\n this.cancelSearchRequest.bind(this);\n\n /** @type { {[pageIndex: number]: SearchInsideMatchBox[]} } */\n this._searchBoxesByIndex = {};\n\n this.searchView = undefined;\n };\n})(BookReader.prototype.setup);\n\n/** @override */\nBookReader.prototype.init = (function (super_) {\n return function () {\n super_.call(this);\n // give SearchView the most complete bookreader state\n this.searchView = new SearchView({\n br: this,\n searchCancelledCallback: () => {\n this._cancelSearch();\n this.trigger('SearchCanceled', { term: this.searchTerm, instance: this });\n }\n });\n if (this.options.enableSearch && 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 }\n };\n})(BookReader.prototype.init);\n\n/** @override */\nBookReader.prototype.buildToolbarElement = (function (super_) {\n return function () {\n const $el = super_.call(this);\n if (!this.enableSearch) { return; }\n if (this.searchView.dom.toolbarSearch) {\n $el.find('.BRtoolbarSectionInfo').after(this.searchView.dom.toolbarSearch);\n }\n return $el;\n };\n})(BookReader.prototype.buildToolbarElement);\n\n/** @override */\nBookReader.prototype._createPageContainer = (function (super_) {\n return function (index) {\n const pageContainer = super_.call(this, index);\n if (this.enableSearch && pageContainer.page && index in this._searchBoxesByIndex) {\n const pageIndex = pageContainer.page.index;\n renderBoxesInPageContainerLayer('searchHiliteLayer', this._searchBoxesByIndex[pageIndex], pageContainer.page, pageContainer.$container[0]);\n }\n return pageContainer;\n };\n})(BookReader.prototype._createPageContainer);\n\n/**\n * @typedef {object} SearchOptions\n * @property {boolean} goToFirstResult\n * @property {boolean} disablePopup\n * @property {(null|function)} error - @deprecated at v.5.0\n * @property {(null|function)} success - @deprecated at v.5.0\n */\n\n/**\n * Submits search request\n *\n * @param {string} term\n * @param {SearchOptions} overrides\n */\nBookReader.prototype.search = function(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\n // strip slashes, since this goes in the url\n this.searchTerm = term.replace(/\\//g, ' ');\n\n if (!options.suppressFragmentChange) {\n this.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 // Remove the port and userdir\n const serverPath = this.server.replace(/:.+/, '');\n const baseUrl = `https://${serverPath}${this.searchInsideUrl}?`;\n\n // Remove subPrefix from end of path\n let path = this.bookPath;\n const subPrefixWithSlash = `/${this.subPrefix}`;\n if (this.bookPath.length - this.bookPath.lastIndexOf(subPrefixWithSlash) == subPrefixWithSlash.length) {\n path = this.bookPath.substr(0, this.bookPath.length - subPrefixWithSlash.length);\n }\n\n const urlParams = {\n item_id: this.bookId,\n doc: this.subPrefix,\n path,\n q: term,\n };\n\n // NOTE that the API does not expect / (slashes) to be encoded. (%2F) won't work\n const paramStr = $.param(urlParams).replace(/%2F/g, '/');\n\n const url = `${baseUrl}${paramStr}`;\n\n const cleanup = () => {\n this.searchXHR = null;\n window.BRSearchInProgress = () => {};\n };\n\n const processSearchResults = (searchInsideResults) => {\n if (!this.searchXHR) {\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 hasCustomError\n ? options.error.call(this, searchInsideResults, options)\n : this.BRSearchCallbackError(searchInsideResults, options);\n } else {\n hasCustomSuccess\n ? options.success.call(this, searchInsideResults, options)\n : this.BRSearchCallback(searchInsideResults, options);\n }\n cleanup();\n };\n\n const beforeSend = (xhr) => {\n this.searchXHR = xhr;\n window.BRSearchInProgress = processSearchResults;\n };\n\n this.trigger('SearchStarted', { term: this.searchTerm, instance: this });\n return $.ajax({\n url: url,\n dataType: 'jsonp',\n cache: true,\n beforeSend,\n jsonpCallback: 'BRSearchInProgress'\n }).then(processSearchResults);\n};\n\n/**\n * cancels AJAX Call\n * emits custom event\n */\nBookReader.prototype._cancelSearch = function () {\n this.searchXHR?.abort();\n this.searchView.clearSearchFieldAndResults(false);\n this.searchTerm = '';\n this.searchXHR = null;\n this.searchResults = [];\n window.BRSearchInProgress = () => {};\n};\n\n/**\n * External function to cancel search\n * checks for term & xhr in flight before running\n */\nBookReader.prototype.cancelSearchRequest = function () {\n if (this.searchXHR !== null) {\n this._cancelSearch();\n this.searchView.toggleSearchPending();\n this.trigger('SearchCanceled', { term: this.searchTerm, instance: this });\n }\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 */\n\n/**\n * @typedef {object} SearchInsideMatch\n * @property {string} text\n * @property {Array<{ page: number, boxes: SearchInsideMatchBox[] }>} par\n */\n\n/**\n * @typedef {object} SearchInsideResults\n * @property {string} error\n * @property {SearchInsideMatch[]} matches\n * @property {boolean} indexed\n */\n\n/**\n * Search Results return handler\n * @callback\n * @param {SearchInsideResults} results\n * @param {object} options\n * @param {boolean} options.goToFirstResult\n */\nBookReader.prototype.BRSearchCallback = function(results, options) {\n this.searchResults = results || [];\n\n this.updateSearchHilites();\n this.removeProgressPopup();\n if (options.goToFirstResult) {\n const pageIndex = this._models.book.leafNumToIndex(results.matches[0].par[0].page);\n this._searchPluginGoToResult(pageIndex);\n }\n this.trigger('SearchCallback', { results, options, instance: this });\n};\n\n/**\n * Main search results error handler\n * @callback\n * @param {SearchInsideResults} results\n */\nBookReader.prototype.BRSearchCallbackError = function(results) {\n this._BRSearchCallbackError(results);\n};\n\n/**\n * @private draws search results error\n * @callback\n * @param {SearchInsideResults} results\n * @param {jQuery} $el\n * @param {boolean} fade\n */\nBookReader.prototype._BRSearchCallbackError = function(results) {\n this.searchResults = results;\n const basePayload = {\n term: this.searchTerm,\n instance: this,\n };\n if (results.error) {\n const payload = Object.assign({}, basePayload, { results });\n this.trigger('SearchCallbackError', payload);\n } else if (0 == results.matches.length) {\n if (false === results.indexed) {\n this.trigger('SearchCallbackBookNotIndexed', basePayload);\n return;\n }\n this.trigger('SearchCallbackEmpty', basePayload);\n }\n};\n\n/**\n * updates search on-page highlights controller\n */\nBookReader.prototype.updateSearchHilites = function() {\n /** @type {SearchInsideMatch[]} */\n const matches = this.searchResults?.matches || [];\n /** @type { {[pageIndex: number]: SearchInsideMatch[]} } */\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.leafNumToIndex(box.page);\n const pageMatches = boxesByIndex[pageIndex] || (boxesByIndex[pageIndex] = []);\n pageMatches.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._models.book.getPage(pageIndex);\n const pageContainers = this.getActivePageContainerElementsForIndex(pageIndex);\n pageContainers.forEach(container => renderBoxesInPageContainerLayer('searchHiliteLayer', boxes, page, container));\n }\n\n this._searchBoxesByIndex = boxesByIndex;\n};\n\n/**\n * remove search highlights\n */\nBookReader.prototype.removeSearchHilites = function() {\n $(this.getActivePageContainerElements()).find('.searchHiliteLayer').remove();\n};\n\n/**\n * @private\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 {PageIndex} pageIndex\n */\nBookReader.prototype._searchPluginGoToResult = async function (pageIndex) {\n const { book } = this._models;\n const page = book.getPage(pageIndex);\n let makeUnviewableAtEnd = false;\n if (!page.isViewable) {\n const resp = await fetch('/services/bookreader/request_page?' + new URLSearchParams({\n id: this.options.bookId,\n subprefix: this.options.subPrefix,\n leafNum: page.leafNum,\n })).then(r => r.json());\n\n for (const leafNum of resp.value) {\n book.getPage(book.leafNumToIndex(leafNum)).makeViewable();\n }\n\n // not able to show page; make the page viewable anyways so that it can\n // actually open. On IA, it has a fallback to a special error page.\n if (!resp.value.length) {\n book.getPage(pageIndex).makeViewable();\n makeUnviewableAtEnd = true;\n }\n }\n /* this updates the URL */\n this.suppressFragmentChange = false;\n this.jumpToIndex(pageIndex);\n\n // Reset it to unviewable if it wasn't resolved\n if (makeUnviewableAtEnd) {\n book.getPage(pageIndex).makeViewable(false);\n }\n};\n\n/**\n * Removes all search pins\n */\nBookReader.prototype.removeSearchResults = function(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.trigger(BookReader.eventNames.fragmentChange);\n }\n};\n\n/**\n * Returns true if a search highlight is currently being displayed\n * @returns {boolean}\n */\nBookReader.prototype.searchHighlightVisible = function() {\n const results = this.searchResults;\n let visiblePages = [];\n if (null == results) return false;\n\n if (this.constMode2up == this.mode) {\n visiblePages = [this.twoPage.currentIndexL, this.twoPage.currentIndexR];\n } else if (this.constMode1up == this.mode) {\n visiblePages = [this.currentIndex()];\n } else {\n return false;\n }\n\n results.matches.some(match => {\n return match.par[0].boxes.some(box => {\n const pageIndex = this.leafNumToIndex(box.page);\n if (jQuery.inArray(pageIndex, visiblePages) >= 0) {\n return true;\n }\n });\n });\n\n return false;\n};\n","class SearchView {\n /**\n * @param {object} params\n * @param {object} params.br The BookReader instance\n * @param {function} params.cancelSearch 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 this.br = br;\n\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 this.matcher = new RegExp('{{{(.+?)}}}', 'g');\n this.matches = [];\n this.cacheDOMElements();\n this.bindEvents();\n this.cancelSearch = searchCancelledCallback;\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.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').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 this.dom.searchNavigation.find('[data-id=resultsCount]').text(this.resultsPosition());\n }\n\n updateSearchNavigationButtons() {\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.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 queryString = match.text;\n const pageIndex = this.br.leafNumToIndex(match.par[0].page);\n const pageNumber = this.br.getPageNum(pageIndex);\n const uiStringSearch = \"Search result\"; // i18n\n const uiStringPage = \"Page\"; // i18n\n\n const percentThrough = this.br.constructor.util.cssPercentage(pageIndex, this.br.getNumLeafs() - 1);\n\n const queryStringWithB = queryString.replace(this.matcher, '<b>$1</b>');\n\n let queryStringWithBTruncated = '';\n\n if (queryString.length > 100) {\n queryStringWithBTruncated = queryString\n .replace(/^(.{100}[^\\s]*).*/, \"$1\")\n .replace(this.matcher, '<b>$1</b>')\n + '...';\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 <div>${queryStringWithBTruncated || queryStringWithB}</div>\n <div>${uiStringPage} ${pageNumber}</div>\n </div>\n `)\n .data({ pageIndex })\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\", function (event) {\n // closures are nested and deep, using an arrow function breaks references.\n // Todo: update to arrow function & clean up closures\n // to remove `bind` dependency\n this.br._searchPluginGoToResult(+$(event.target).data('pageIndex'));\n }.bind(this));\n });\n }\n\n /**\n * @param {boolean} bool\n */\n toggleSearchPending(bool) {\n if (bool) {\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 document.querySelector(this.br.el).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 /**\n * @param {Event} e\n */\n handleNavToggledCallback(e) {\n const is_visible = this.br.navigationIsVisible();\n this.togglePinsFor(is_visible);\n }\n\n handleSearchStarted() {\n this.emptyMatches();\n this.br.removeSearchHilites();\n this.removeResultPins();\n this.toggleSearchPending(true);\n this.teardownSearchNavigation();\n this.setQuery(this.br.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}navToggled`, this.handleNavToggledCallback.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","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.es/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n"],"names":["renderBoxesInPageContainerLayer","SearchView","jQuery","extend","BookReader","defaultOptions","server","bookId","subPrefix","bookPath","enableSearch","searchInsideUrl","initialSearchTerm","prototype","setup","super_","options","call","searchTerm","searchResults","searchXHR","_cancelSearch","bind","cancelSearchRequest","_searchBoxesByIndex","searchView","undefined","init","br","searchCancelledCallback","trigger","term","instance","search","goToFirstResult","suppressFragmentChange","buildToolbarElement","$el","dom","toolbarSearch","find","after","_createPageContainer","index","pageContainer","page","pageIndex","$container","overrides","disablePopup","error","success","replace","eventNames","fragmentChange","serverPath","baseUrl","path","subPrefixWithSlash","length","lastIndexOf","substr","urlParams","item_id","doc","q","paramStr","$","param","url","cleanup","window","BRSearchInProgress","processSearchResults","searchInsideResults","responseHasError","matches","hasCustomError","hasCustomSuccess","BRSearchCallbackError","BRSearchCallback","beforeSend","xhr","ajax","dataType","cache","jsonpCallback","then","abort","clearSearchFieldAndResults","toggleSearchPending","results","updateSearchHilites","removeProgressPopup","_models","book","leafNumToIndex","par","_searchPluginGoToResult","_BRSearchCallbackError","basePayload","payload","Object","assign","indexed","boxesByIndex","removeSearchHilites","match","boxes","box","pageMatches","push","pageIndexString","parseFloat","getPage","pageContainers","getActivePageContainerElementsForIndex","forEach","container","entries","getActivePageContainerElements","remove","makeUnviewableAtEnd","isViewable","fetch","URLSearchParams","id","subprefix","leafNum","r","json","resp","value","makeViewable","jumpToIndex","removeSearchResults","searchHighlightVisible","visiblePages","constMode2up","mode","twoPage","currentIndexL","currentIndexR","constMode1up","currentIndex","some","inArray","matcher","RegExp","cacheDOMElements","bindEvents","cancelSearch","buildToolbarSearch","query","val","dispatchEventWhenComplete","removeResultPins","emptyMatches","setQuery","teardownSearchNavigation","selector","before","resultsPosition","searchNavigation","positionMessage","currentMatchIndex","namespace","on","showPrevResult","showNextResult","toggleSidebar","constModeThumb","switchMode","getClosestMatchIndex","start","end","comparator","eq","click","updateResultsPosition","updateSearchNavigationButtons","comparisonFn","matchPages","map","m","currentPage","closestTo","pool","slice","closestPage","indexOf","text","attr","off","resize","matchingSearchResult","find2upMatchingSearchResult","find1upMatchingSearchResult","_isIndexDisplayed","setCurrentMatchIndex","bool","pinsVisibleState","refs","$BRfooter","css","visibility","document","createElement","classList","add","innerHTML","imagesBaseURL","queryString","pageNumber","getPageNum","uiStringSearch","uiStringPage","percentThrough","constructor","util","cssPercentage","getNumLeafs","queryStringWithB","queryStringWithBTruncated","addClass","left","append","data","appendTo","event","marker","currentTarget","tooltip","querySelector","tooltipOffset","getBoundingClientRect","targetOffset","boxSizeAdjust","parseInt","getComputedStyle","paddingLeft","x","style","setProperty","removeClass","target","showProgressPopup","progressPopupClosed","textIsProcessing","errorDetails","renderModalMessage","delayModalRemovalFor","messageHTML","modal","el","timeoutMS","setTimeout","e","preventDefault","renderSearchNavigation","bindSearchNavigationEvents","renderPins","one","is_visible","navigationIsVisible","togglePinsFor","isIndexed","detail","props","renderErrorModal","renderBookNotIndexedModal","renderResultsEmptyModal","addEventListener","handleSearchCallbackError","handleSearchCallback","handleNavToggledCallback","handleSearchStarted","handleSearchCallbackBookNotIndexed","handleSearchCallbackEmpty","updateSearchNavigation","submitHandler"],"sourceRoot":""}
|