@internetarchive/bookreader 5.0.0-63 → 5.0.0-65
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/.github/workflows/node.js.yml +1 -0
- package/BookReader/BookReader.css +44 -56
- package/BookReader/BookReader.js +1 -1
- package/BookReader/BookReader.js.LICENSE.txt +2 -0
- package/BookReader/BookReader.js.map +1 -1
- package/BookReader/ia-bookreader-bundle.js +95 -95
- package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +2 -0
- package/BookReader/ia-bookreader-bundle.js.map +1 -1
- package/BookReader/icons/1up.svg +1 -1
- package/BookReader/icons/2up.svg +1 -1
- package/BookReader/icons/advance.svg +1 -1
- package/BookReader/icons/chevron-right.svg +1 -1
- package/BookReader/icons/close-circle-dark.svg +1 -1
- package/BookReader/icons/close-circle.svg +1 -1
- package/BookReader/icons/fullscreen.svg +1 -1
- package/BookReader/icons/fullscreen_exit.svg +1 -1
- package/BookReader/icons/hamburger.svg +1 -1
- package/BookReader/icons/left-arrow.svg +1 -1
- package/BookReader/icons/magnify-minus.svg +1 -1
- package/BookReader/icons/magnify-plus.svg +1 -1
- package/BookReader/icons/magnify.svg +1 -1
- package/BookReader/icons/pause.svg +1 -1
- package/BookReader/icons/play.svg +1 -1
- package/BookReader/icons/playback-speed.svg +1 -1
- package/BookReader/icons/read-aloud.svg +1 -1
- package/BookReader/icons/review.svg +1 -1
- package/BookReader/icons/thumbnails.svg +1 -1
- package/BookReader/icons/voice.svg +1 -1
- package/BookReader/icons/volume-full.svg +1 -1
- package/BookReader/images/BRicons.svg +3 -3
- package/BookReader/images/books_graphic.svg +1 -1
- package/BookReader/images/icon_book.svg +1 -1
- package/BookReader/images/icon_bookmark.svg +1 -1
- package/BookReader/images/icon_gear.svg +1 -1
- package/BookReader/images/icon_hamburger.svg +1 -1
- package/BookReader/images/icon_home.svg +1 -1
- package/BookReader/images/icon_info.svg +1 -1
- package/BookReader/images/icon_one_page.svg +1 -1
- package/BookReader/images/icon_pause.svg +1 -1
- package/BookReader/images/icon_play.svg +1 -1
- package/BookReader/images/icon_search_button.svg +1 -1
- package/BookReader/images/icon_share.svg +1 -1
- package/BookReader/images/icon_skip-ahead.svg +1 -1
- package/BookReader/images/icon_skip-back.svg +1 -1
- package/BookReader/images/icon_speaker.svg +1 -1
- package/BookReader/images/icon_speaker_open.svg +1 -1
- package/BookReader/images/icon_thumbnails.svg +1 -1
- package/BookReader/images/icon_toc.svg +1 -1
- package/BookReader/images/icon_two_pages.svg +1 -1
- package/BookReader/images/marker_chap-off.svg +1 -1
- package/BookReader/images/marker_chap-on.svg +1 -1
- package/BookReader/images/marker_srch-on.svg +1 -1
- package/BookReader/jquery-3.js +1 -1
- package/BookReader/plugins/plugin.archive_analytics.js +1 -1
- package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
- package/BookReader/plugins/plugin.autoplay.js +1 -1
- package/BookReader/plugins/plugin.autoplay.js.map +1 -1
- package/BookReader/plugins/plugin.chapters.js +2 -1
- package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.chapters.js.map +1 -1
- package/BookReader/plugins/plugin.iframe.js.map +1 -1
- package/BookReader/plugins/plugin.mobile_nav.js +1 -1
- package/BookReader/plugins/plugin.mobile_nav.js.map +1 -1
- package/BookReader/plugins/plugin.resume.js +1 -1
- package/BookReader/plugins/plugin.resume.js.map +1 -1
- package/BookReader/plugins/plugin.search.js +2 -1
- package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.search.js.map +1 -1
- package/BookReader/plugins/plugin.text_selection.js +2 -1
- package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
- package/BookReader/plugins/plugin.text_selection.js.map +1 -1
- package/BookReader/plugins/plugin.tts.js +1 -1
- package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
- package/BookReader/plugins/plugin.tts.js.map +1 -1
- package/BookReader/plugins/plugin.url.js +1 -1
- package/BookReader/plugins/plugin.url.js.map +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
- package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
- package/BookReader/webcomponents-bundle.js +1 -1
- package/BookReader/webcomponents-bundle.js.map +1 -1
- package/CHANGELOG.md +10 -0
- package/babel.config.js +5 -4
- package/netlify.toml +4 -0
- package/package.json +19 -19
- package/src/BookNavigator/search/search-results.js +1 -7
- package/src/BookReader/utils.js +10 -0
- package/src/BookReader.js +0 -5
- package/src/css/_BRnav.scss +2 -2
- package/src/css/_BRsearch.scss +38 -10
- package/src/plugins/search/plugin.search.js +14 -21
- package/src/plugins/search/utils.js +43 -0
- package/src/plugins/search/view.js +11 -24
- package/tests/e2e/helpers/desktopSearch.js +3 -3
- package/tests/jest/BookNavigator/search/search-results.test.js +6 -1
- package/tests/jest/BookReader/utils.test.js +12 -0
- package/tests/jest/plugins/search/plugin.search.test.js +2 -39
- package/tests/jest/plugins/search/plugin.search.view.test.js +5 -0
- package/tests/jest/plugins/search/utils.js +25 -0
- package/tests/jest/plugins/search/utils.test.js +29 -0
- package/src/BookReader/DebugConsole.js +0 -54
- package/tests/jest/BookReader/DebugConsole.test.js +0 -25
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins/plugin.text_selection.js","mappings":"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","sources":["webpack://@internetarchive/bookreader/./src/BookReader/utils/SelectionObserver.js","webpack://@internetarchive/bookreader/./src/util/strings.js","webpack://@internetarchive/bookreader/./src/plugins/plugin.text_selection.js","webpack://@internetarchive/bookreader/./node_modules/core-js/internals/number-parse-float.js","webpack://@internetarchive/bookreader/./node_modules/core-js/internals/string-trim-forced.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.parse-float.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.string.trim.js"],"sourcesContent":["// @ts-check\nexport class SelectionObserver {\n selecting = false;\n startedInSelector = false;\n /** @type {HTMLElement} */\n target = null;\n\n /**\n * @param {string} selector\n * @param {function('started' | 'cleared', HTMLElement): any} handler\n */\n constructor(selector, handler) {\n this.selector = selector;\n this.handler = handler;\n }\n\n attach() {\n // We can't just use selectstart, because safari on iOS just\n // randomly decides when to fire it 😤\n // document.addEventListener(\"selectstart\", this._onSelectStart);\n // This has to be on document :/\n document.addEventListener(\"selectionchange\", this._onSelectionChange);\n }\n\n detach() {\n document.removeEventListener(\"selectionchange\", this._onSelectionChange);\n }\n\n _onSelectionChange = () => {\n const sel = window.getSelection();\n\n if (!this.selecting && sel.toString()) {\n this.selecting = true;\n this.target = $(sel.anchorNode).closest(this.selector)[0];\n this.handler('started', this.target);\n }\n\n if (this.selecting && (sel.isCollapsed || !sel.toString() || !$(sel.anchorNode).closest(this.selector)[0])) {\n this.selecting = false;\n this.handler('cleared', this.target);\n }\n };\n}\n","/**\n * @typedef {String} StringWithVars\n * A template string with {{foo}} style variables\n * Also supports filters, like {{bookPath|urlencode}} (See APPLY_FILTERS for the\n * supported list of filters)\n **/\n\n/**\n * @param {StringWithVars|String} template\n * @param { {[varName: string]: { toString: () => string} } } vars\n * @param { {[varName: string]: { toString: () => string} } } [overrides]\n */\nexport function applyVariables(template, vars, overrides = {}, possibleFilters = APPLY_FILTERS) {\n return template?.replace(/\\{\\{([^}]*?)\\}\\}/g, ($0, $1) => {\n if (!$1) return $0;\n /** @type {string} */\n const expression = $1;\n const [varName, ...filterNames] = expression.split('|').map(x => x.trim());\n const defined = varName in overrides || varName in vars;\n\n // If it's not defined, don't expand it at all\n if (!defined) return $0;\n\n const value = varName in overrides ? overrides[varName]\n : varName in vars ? vars[varName] : null;\n const filters = filterNames.map(n => possibleFilters[n]);\n return filters.reduce((acc, cur) => cur(acc), value && value.toString());\n });\n}\n\n/** @type { {[filterName: String]:( string => string)} } */\nexport const APPLY_FILTERS = {\n urlencode: encodeURIComponent,\n};\n","//@ts-check\nimport { createDIVPageLayer } from '../BookReader/PageContainer.js';\nimport { SelectionObserver } from '../BookReader/utils/SelectionObserver.js';\nimport { applyVariables } from '../util/strings.js';\n/** @typedef {import('../util/strings.js').StringWithVars} StringWithVars */\n/** @typedef {import('../BookReader/PageContainer.js').PageContainer} PageContainer */\n\nconst BookReader = /** @type {typeof import('../BookReader').default} */(window.BookReader);\n\nexport const DEFAULT_OPTIONS = {\n enabled: true,\n /** @type {StringWithVars} The URL to fetch the entire DJVU xml. Supports options.vars */\n fullDjvuXmlUrl: null,\n /** @type {StringWithVars} The URL to fetch a single page of the DJVU xml. Supports options.vars. Also has {{pageIndex}} */\n singlePageDjvuXmlUrl: null,\n /** Whether to fetch the XML as a jsonp */\n jsonp: false,\n};\n/** @typedef {typeof DEFAULT_OPTIONS} TextSelectionPluginOptions */\n\n/**\n * @template T\n */\nexport class Cache {\n constructor(maxSize = 10) {\n this.maxSize = maxSize;\n /** @type {T[]} */\n this.entries = [];\n }\n\n /**\n * @param {T} entry\n */\n add(entry) {\n if (this.entries.length >= this.maxSize) {\n this.entries.shift();\n }\n this.entries.push(entry);\n }\n}\n\nexport class TextSelectionPlugin {\n /**\n * @param {'lr' | 'rl'} pageProgression In the future this should be in the ocr file\n * since a book being right to left doesn't mean the ocr is right to left. But for\n * now we do make that assumption.\n */\n constructor(options = DEFAULT_OPTIONS, optionVariables, pageProgression = 'lr') {\n this.options = options;\n this.optionVariables = optionVariables;\n /**@type {PromiseLike<JQuery<HTMLElement>|undefined>} */\n this.djvuPagesPromise = null;\n /** Whether the book is right-to-left */\n this.rtl = pageProgression === 'rl';\n\n /** @type {Cache<{index: number, response: any}>} */\n this.pageTextCache = new Cache();\n\n /**\n * Sometimes there are too many words on a page, and the browser becomes near\n * unusable. For now don't render text layer for pages with too many words.\n */\n this.maxWordRendered = 2500;\n\n this.selectionObserver = new SelectionObserver('.BRtextLayer', this._onSelectionChange);\n }\n\n /**\n * @param {'started' | 'cleared'} type\n * @param {HTMLElement} target\n */\n _onSelectionChange = (type, target) => {\n if (type === 'started') {\n this.textSelectingMode(target);\n } else if (type === 'cleared') {\n this.defaultMode(target);\n } else {\n throw new Error(`Unknown type ${type}`);\n }\n }\n\n init() {\n this.selectionObserver.attach();\n\n // Only fetch the full djvu xml if the single page url isn't there\n if (this.options.singlePageDjvuXmlUrl) return;\n this.djvuPagesPromise = $.ajax({\n type: \"GET\",\n url: applyVariables(this.options.fullDjvuXmlUrl, this.optionVariables),\n dataType: this.options.jsonp ? \"jsonp\" : \"html\",\n cache: true,\n error: (e) => undefined\n }).then((res) => {\n try {\n const xmlMap = $.parseXML(res);\n return xmlMap && $(xmlMap).find(\"OBJECT\");\n } catch (e) {\n return undefined;\n }\n });\n }\n\n /**\n * @param {number} index\n * @returns {Promise<HTMLElement|undefined>}\n */\n async getPageText(index) {\n if (this.options.singlePageDjvuXmlUrl) {\n const cachedEntry = this.pageTextCache.entries.find(x => x.index == index);\n if (cachedEntry) {\n return cachedEntry.response;\n }\n const res = await $.ajax({\n type: \"GET\",\n url: applyVariables(this.options.singlePageDjvuXmlUrl, this.optionVariables, { pageIndex: index }),\n dataType: this.options.jsonp ? \"jsonp\" : \"html\",\n cache: true,\n error: (e) => undefined,\n });\n try {\n const xmlDoc = $.parseXML(res);\n const result = xmlDoc && $(xmlDoc).find(\"OBJECT\")[0];\n this.pageTextCache.add({ index, response: result });\n return result;\n } catch (e) {\n return undefined;\n }\n } else {\n const XMLpagesArr = await this.djvuPagesPromise;\n if (XMLpagesArr) return XMLpagesArr[index];\n }\n }\n\n /**\n * Intercept copied text to remove any styling applied to it\n * @param {JQuery} $container\n */\n interceptCopy($container) {\n $container[0].addEventListener('copy', (event) => {\n const selection = document.getSelection();\n event.clipboardData.setData('text/plain', selection.toString());\n event.preventDefault();\n });\n }\n\n /**\n * Applies mouse events when in default mode\n * @param {HTMLElement} textLayer\n */\n defaultMode(textLayer) {\n const $pageContainer = $(textLayer).closest('.BRpagecontainer');\n textLayer.style.pointerEvents = \"none\";\n $pageContainer.find(\"img\").css(\"pointer-events\", \"auto\");\n\n $(textLayer).off(\".textSelectPluginHandler\");\n const startedMouseDown = this.mouseIsDown;\n let skipNextMouseup = this.mouseIsDown;\n if (startedMouseDown) {\n textLayer.style.pointerEvents = \"auto\";\n }\n\n // Need to stop propagation to prevent DragScrollable from\n // blocking selection\n $(textLayer).on(\"mousedown.textSelectPluginHandler\", (event) => {\n this.mouseIsDown = true;\n if ($(event.target).is(\".BRwordElement, .BRspace\")) {\n event.stopPropagation();\n }\n });\n\n $(textLayer).on(\"mouseup.textSelectPluginHandler\", (event) => {\n this.mouseIsDown = false;\n textLayer.style.pointerEvents = \"none\";\n if (skipNextMouseup) {\n skipNextMouseup = false;\n event.stopPropagation();\n }\n });\n }\n\n /**\n * This mode is active while there is a selection on the given textLayer\n * @param {HTMLElement} textLayer\n */\n textSelectingMode(textLayer) {\n const $pageContainer = $(textLayer).closest('.BRpagecontainer');\n // Make text layer consume all events\n textLayer.style.pointerEvents = \"all\";\n // Block img from getting long-press to save while selecting\n $pageContainer.find(\"img\").css(\"pointer-events\", \"none\");\n\n $(textLayer).off(\".textSelectPluginHandler\");\n\n $(textLayer).on('mousedown.textSelectPluginHandler', (event) => {\n this.mouseIsDown = true;\n event.stopPropagation();\n });\n\n // Prevent page flip on click\n $(textLayer).on('mouseup.textSelectPluginHandler', (event) => {\n this.mouseIsDown = false;\n event.stopPropagation();\n });\n }\n\n /**\n * Initializes text selection modes if there is a text layer on the page\n * @param {JQuery} $container\n */\n stopPageFlip($container) {\n /** @type {JQuery<HTMLElement>} */\n const $textLayer = $container.find('.BRtextLayer');\n if (!$textLayer.length) return;\n $textLayer.each((i, s) => this.defaultMode(s));\n this.interceptCopy($container);\n }\n\n /**\n * @param {PageContainer} pageContainer\n */\n async createTextLayer(pageContainer) {\n const pageIndex = pageContainer.page.index;\n const $container = pageContainer.$container;\n const $textLayers = $container.find('.BRtextLayer');\n if ($textLayers.length) return;\n const XMLpage = await this.getPageText(pageIndex);\n if (!XMLpage) return;\n recursivelyAddCoords(XMLpage);\n\n const totalWords = $(XMLpage).find(\"WORD\").length;\n if (totalWords > this.maxWordRendered) {\n console.log(`Page ${pageIndex} has too many words (${totalWords} > ${this.maxWordRendered}). Not rendering text layer.`);\n return;\n }\n\n const textLayer = createDIVPageLayer(pageContainer.page, 'BRtextLayer');\n const ratioW = parseFloat(pageContainer.$container[0].style.width) / pageContainer.page.width;\n const ratioH = parseFloat(pageContainer.$container[0].style.height) / pageContainer.page.height;\n textLayer.style.transform = `scale(${ratioW}, ${ratioH})`;\n textLayer.setAttribute(\"dir\", this.rtl ? \"rtl\" : \"ltr\");\n\n const ocrParagraphs = $(XMLpage).find(\"PARAGRAPH[coords]\").toArray();\n const paragEls = ocrParagraphs.map(p => {\n const el = this.renderParagraph(p);\n textLayer.appendChild(el);\n return el;\n });\n\n // Fix up paragraph positions\n const paragraphRects = determineRealRects(textLayer, '.BRparagraphElement');\n let yAdded = 0;\n for (const [ocrParagraph, paragEl] of zip(ocrParagraphs, paragEls)) {\n const ocrParagBounds = $(ocrParagraph).attr(\"coords\").split(\",\").map(parseFloat);\n const realRect = paragraphRects.get(paragEl);\n const [ocrLeft, , ocrRight, ocrTop] = ocrParagBounds;\n const newStartMargin = this.rtl ? (realRect.right - ocrRight) : (ocrLeft - realRect.left);\n const newTop = ocrTop - (realRect.top + yAdded);\n\n paragEl.style[this.rtl ? 'marginRight' : 'marginLeft'] = `${newStartMargin}px`;\n paragEl.style.marginTop = `${newTop}px`;\n yAdded += newTop;\n textLayer.appendChild(paragEl);\n }\n $container.append(textLayer);\n this.stopPageFlip($container);\n }\n\n /**\n * @param {HTMLElement} ocrParagraph\n * @returns {HTMLParagraphElement}\n */\n renderParagraph(ocrParagraph) {\n const paragEl = document.createElement('p');\n paragEl.classList.add('BRparagraphElement');\n const [paragLeft, paragBottom, paragRight, paragTop] = $(ocrParagraph).attr(\"coords\").split(\",\").map(parseFloat);\n const wordHeightArr = [];\n const lines = $(ocrParagraph).find(\"LINE[coords]\").toArray();\n if (!lines.length) return paragEl;\n\n\n for (const [prevLine, line, nextLine] of lookAroundWindow(genMap(lines, augmentLine))) {\n const isLastLineOfParagraph = line.ocrElement == lines[lines.length - 1];\n const lineEl = document.createElement('span');\n lineEl.classList.add('BRlineElement');\n\n for (const [wordIndex, currWord] of line.words.entries()) {\n const [, bottom, right, top] = $(currWord).attr(\"coords\").split(',').map(parseFloat);\n const wordHeight = bottom - top;\n wordHeightArr.push(wordHeight);\n\n if (wordIndex == 0 && prevLine?.lastWord.textContent.trim().endsWith('-')) {\n // ideally prefer the next line to determine the left position,\n // since the previous line could be the first line of the paragraph\n // and hence have an incorrectly indented first word.\n // E.g. https://archive.org/details/driitaleofdaring00bachuoft/page/360/mode/2up\n const [newLeft, , , ] = $((nextLine || prevLine).firstWord).attr(\"coords\").split(',').map(parseFloat);\n $(currWord).attr(\"coords\", `${newLeft},${bottom},${right},${top}`);\n }\n\n const wordEl = document.createElement('span');\n wordEl.setAttribute(\"class\", \"BRwordElement\");\n wordEl.textContent = currWord.textContent.trim();\n\n if (wordIndex > 0) {\n const space = document.createElement('span');\n space.classList.add('BRspace');\n space.textContent = ' ';\n lineEl.append(space);\n\n // Edge ignores empty elements (like BRspace), so add another\n // space to ensure Edge's ReadAloud works correctly.\n lineEl.appendChild(document.createTextNode(' '));\n }\n\n lineEl.appendChild(wordEl);\n }\n\n const hasHyphen = line.lastWord.textContent.trim().endsWith('-');\n const lastWordEl = lineEl.children[lineEl.children.length - 1];\n if (hasHyphen && !isLastLineOfParagraph) {\n lastWordEl.textContent = lastWordEl.textContent.trim().slice(0, -1);\n lastWordEl.classList.add('BRwordElement--hyphen');\n }\n\n paragEl.appendChild(lineEl);\n if (!isLastLineOfParagraph && !hasHyphen) {\n // Edge does not correctly have spaces between the lines.\n paragEl.appendChild(document.createTextNode(' '));\n }\n }\n\n wordHeightArr.sort((a, b) => a - b);\n const paragWordHeight = wordHeightArr[Math.floor(wordHeightArr.length * 0.85)] + 4;\n paragEl.style.left = `${paragLeft}px`;\n paragEl.style.top = `${paragTop}px`;\n paragEl.style.width = `${paragRight - paragLeft}px`;\n paragEl.style.height = `${paragBottom - paragTop}px`;\n paragEl.style.fontSize = `${paragWordHeight}px`;\n\n // Fix up sizes - stretch/crush words as necessary using letter spacing\n let wordRects = determineRealRects(paragEl, '.BRwordElement');\n const ocrWords = $(ocrParagraph).find(\"WORD\").toArray();\n const wordEls = paragEl.querySelectorAll('.BRwordElement');\n for (const [ocrWord, wordEl] of zip(ocrWords, wordEls)) {\n const realRect = wordRects.get(wordEl);\n const [left, , right ] = $(ocrWord).attr(\"coords\").split(',').map(parseFloat);\n let ocrWidth = right - left;\n // Some books (eg theworksofplato01platiala) have a space _inside_ the <WORD>\n // element. That makes it impossible to determine the correct positining\n // of everything, but to avoid the BRspace's being width 0, which makes selection\n // janky on Chrome Android, assume the space is the same width as one of the\n // letters.\n if (ocrWord.textContent.endsWith(' ')) {\n ocrWidth = ocrWidth * (ocrWord.textContent.length - 1) / ocrWord.textContent.length;\n }\n const diff = ocrWidth - realRect.width;\n wordEl.style.letterSpacing = `${diff / (ocrWord.textContent.length - 1)}px`;\n }\n\n // Stretch/crush lines as necessary using line spacing\n // Recompute rects after letter spacing\n wordRects = determineRealRects(paragEl, '.BRwordElement');\n const spaceRects = determineRealRects(paragEl, '.BRspace');\n\n const ocrLines = $(ocrParagraph).find(\"LINE[coords]\").toArray();\n const lineEls = Array.from(paragEl.querySelectorAll('.BRlineElement'));\n\n let ySoFar = paragTop;\n for (const [ocrLine, lineEl] of zip(ocrLines, lineEls)) {\n // shift words using marginLeft to align with the correct x position\n const words = $(ocrLine).find(\"WORD\").toArray();\n // const ocrLineLeft = Math.min(...words.map(w => parseFloat($(w).attr(\"coords\").split(',')[0])));\n let xSoFar = this.rtl ? paragRight : paragLeft;\n for (const [ocrWord, wordEl] of zip(words, lineEl.querySelectorAll('.BRwordElement'))) {\n // start of line, need to compute the offset relative to the OCR words\n const wordRect = wordRects.get(wordEl);\n const [ocrLeft, , ocrRight ] = $(ocrWord).attr(\"coords\").split(',').map(parseFloat);\n const diff = (this.rtl ? -(ocrRight - xSoFar) : ocrLeft - xSoFar);\n\n if (wordEl.previousElementSibling) {\n const space = wordEl.previousElementSibling;\n space.style.letterSpacing = `${diff - spaceRects.get(space).width}px`;\n } else {\n wordEl.style[this.rtl ? 'paddingRight' : 'paddingLeft'] = `${diff}px`;\n }\n if (this.rtl) xSoFar -= diff + wordRect.width;\n else xSoFar += diff + wordRect.width;\n }\n // And also fix y position\n const ocrLineTop = Math.min(...words.map(w => parseFloat($(w).attr(\"coords\").split(',')[3])));\n const diff = ocrLineTop - ySoFar;\n if (lineEl.previousElementSibling) {\n lineEl.previousElementSibling.style.lineHeight = `${diff}px`;\n ySoFar += diff;\n }\n }\n\n // The last line will have a line height subtracting from the paragraph height\n lineEls[lineEls.length - 1].style.lineHeight = `${paragBottom - ySoFar}px`;\n\n // Edge does not include a newline for some reason when copying/pasting the <p> els\n paragEl.appendChild(document.createElement('br'));\n return paragEl;\n }\n}\n\nexport class BookreaderWithTextSelection extends BookReader {\n init() {\n const options = Object.assign({}, DEFAULT_OPTIONS, this.options.plugins.textSelection);\n if (options.enabled) {\n this.textSelectionPlugin = new TextSelectionPlugin(options, this.options.vars, this.pageProgression);\n // Write this back; this way the plugin is the source of truth, and BR just\n // contains a reference to it.\n this.options.plugins.textSelection = options;\n this.textSelectionPlugin.init();\n\n new SelectionObserver('.BRtextLayer', (selectEvent) => {\n // Track how often selection is used\n if (selectEvent == 'started') {\n this.archiveAnalyticsSendEvent?.('BookReader', 'SelectStart');\n\n // Set a class on the page to avoid hiding it when zooming/etc\n this.refs.$br.find('.BRpagecontainer--hasSelection').removeClass('BRpagecontainer--hasSelection');\n $(window.getSelection().anchorNode).closest('.BRpagecontainer').addClass('BRpagecontainer--hasSelection');\n }\n }).attach();\n }\n\n super.init();\n }\n\n /**\n * @param {number} index\n */\n _createPageContainer(index) {\n const pageContainer = super._createPageContainer(index);\n // Disable if thumb mode; it's too janky\n // .page can be null for \"pre-cover\" region\n if (this.mode !== this.constModeThumb && pageContainer.page) {\n this.textSelectionPlugin?.createTextLayer(pageContainer);\n }\n return pageContainer;\n }\n}\nwindow.BookReader = BookreaderWithTextSelection;\nexport default BookreaderWithTextSelection;\n\n\n/**\n * @param {HTMLElement} parentEl\n * @param {string} selector\n * @returns {Map<Element, Rect>}\n */\nfunction determineRealRects(parentEl, selector) {\n const initals = {\n position: parentEl.style.position,\n visibility: parentEl.style.visibility,\n top: parentEl.style.top,\n left: parentEl.style.left,\n transform: parentEl.style.transform,\n };\n parentEl.style.position = 'absolute';\n parentEl.style.visibility = 'hidden';\n parentEl.style.top = '0';\n parentEl.style.left = '0';\n parentEl.style.transform = 'none';\n document.body.appendChild(parentEl);\n const rects = new Map(\n Array.from(parentEl.querySelectorAll(selector))\n .map(wordEl => {\n const origRect = wordEl.getBoundingClientRect();\n return [wordEl, new Rect(\n origRect.left + window.scrollX,\n origRect.top + window.scrollY,\n origRect.width,\n origRect.height,\n )];\n })\n );\n document.body.removeChild(parentEl);\n Object.assign(parentEl.style, initals);\n return rects;\n}\n\n/**\n * @param {HTMLElement} line\n */\nfunction augmentLine(line) {\n const words = $(line).find(\"WORD\").toArray();\n return {\n ocrElement: line,\n words,\n firstWord: words[0],\n lastWord: words[words.length - 1],\n };\n}\n\n/**\n * @template TFrom, TTo\n * Generator version of map\n * @param {Iterable<TFrom>} gen\n * @param {function(TFrom): TTo} fn\n * @returns {Iterable<TTo>}\n */\nexport function* genMap(gen, fn) {\n for (const x of gen) yield fn(x);\n}\n\n/**\n * @template T\n * Generator that provides a sliding window of 3 elements,\n * prev, current, and next.\n * @param {Iterable<T>} gen\n * @returns {Iterable<[T | undefined, T, T | undefined]>}\n */\nexport function* lookAroundWindow(gen) {\n let prev = undefined;\n let cur = undefined;\n let next = undefined;\n for (const x of gen) {\n if (typeof cur !== 'undefined') {\n next = x;\n yield [prev, cur, next];\n }\n prev = cur;\n cur = x;\n next = undefined;\n }\n\n if (typeof cur !== 'undefined') {\n yield [prev, cur, next];\n }\n}\n\n/**\n * @template T1, T2\n * Lazy zip implementation to avoid importing lodash\n * Expects iterators to be of the same length\n * @param {Iterable<T1>} gen1\n * @param {Iterable<T2>} gen2\n * @returns {Iterable<[T1, T2]>}\n */\nexport function* zip(gen1, gen2) {\n const it1 = gen1[Symbol.iterator]();\n const it2 = gen2[Symbol.iterator]();\n while (true) {\n const r1 = it1.next();\n const r2 = it2.next();\n if (r1.done && r2.done) {\n return;\n }\n if (r1.done || r2.done) {\n throw new Error('zip: one of the iterators is done');\n }\n yield [r1.value, r2.value];\n }\n}\n\n/**\n * [left, bottom, right, top]\n * @param {Array<[number, number, number, number]>} bounds\n * @returns {[number, number, number, number]}\n */\nfunction determineBounds(bounds) {\n let leftMost = Infinity;\n let bottomMost = -Infinity;\n let rightMost = -Infinity;\n let topMost = Infinity;\n\n for (const [left, bottom, right, top] of bounds) {\n leftMost = Math.min(leftMost, left);\n bottomMost = Math.max(bottomMost, bottom);\n rightMost = Math.max(rightMost, right);\n topMost = Math.min(topMost, top);\n }\n\n return [leftMost, bottomMost, rightMost, topMost];\n}\n\n/**\n * Recursively traverses the XML tree and adds coords\n * which are the bounding box of all child coords\n * @param {Element} xmlEl\n */\nfunction recursivelyAddCoords(xmlEl) {\n if ($(xmlEl).attr('coords') || !xmlEl.children) {\n return;\n }\n\n const children = $(xmlEl).children().toArray();\n if (children.length === 0) {\n return;\n }\n\n for (const child of children) {\n recursivelyAddCoords(child);\n }\n\n const childCoords = [];\n\n for (const child of children) {\n if (!$(child).attr('coords')) continue;\n childCoords.push($(child).attr('coords').split(',').map(parseFloat));\n }\n\n const boundingCoords = determineBounds(childCoords);\n if (Math.abs(boundingCoords[0]) != Infinity) {\n $(xmlEl).attr('coords', boundingCoords.join(','));\n }\n}\n\n/**\n * Basically a polyfill for the native DOMRect class\n */\nclass Rect {\n /**\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n */\n constructor(x, y, width, height) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n\n get right() { return this.x + this.width; }\n get bottom() { return this.y + this.height; }\n get top() { return this.y; }\n get left() { return this.x; }\n}\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar trim = require('../internals/string-trim').trim;\nvar whitespaces = require('../internals/whitespaces');\n\nvar charAt = uncurryThis(''.charAt);\nvar n$ParseFloat = global.parseFloat;\nvar Symbol = global.Symbol;\nvar ITERATOR = Symbol && Symbol.iterator;\nvar FORCED = 1 / n$ParseFloat(whitespaces + '-0') !== -Infinity\n // MS Edge 18- broken with boxed symbols\n || (ITERATOR && !fails(function () { n$ParseFloat(Object(ITERATOR)); }));\n\n// `parseFloat` method\n// https://tc39.es/ecma262/#sec-parsefloat-string\nmodule.exports = FORCED ? function parseFloat(string) {\n var trimmedString = trim(toString(string));\n var result = n$ParseFloat(trimmedString);\n return result === 0 && charAt(trimmedString, 0) == '-' ? -0 : result;\n} : n$ParseFloat;\n","var PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;\nvar fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]()\n || non[METHOD_NAME]() !== non\n || (PROPER_FUNCTION_NAME && whitespaces[METHOD_NAME].name !== METHOD_NAME);\n });\n};\n","var $ = require('../internals/export');\nvar $parseFloat = require('../internals/number-parse-float');\n\n// `parseFloat` method\n// https://tc39.es/ecma262/#sec-parsefloat-string\n$({ global: true, forced: parseFloat != $parseFloat }, {\n parseFloat: $parseFloat\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.es/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n"],"names":["SelectionObserver","selector","handler","sel","window","getSelection","selecting","toString","target","$","anchorNode","closest","isCollapsed","this","document","addEventListener","_onSelectionChange","removeEventListener","applyVariables","template","vars","overrides","possibleFilters","APPLY_FILTERS","replace","$0","$1","split","map","x","trim","varName","filterNames","value","n","reduce","acc","cur","urlencode","encodeURIComponent","genMap","lookAroundWindow","zip","BookReader","DEFAULT_OPTIONS","enabled","fullDjvuXmlUrl","singlePageDjvuXmlUrl","jsonp","Cache","maxSize","entries","entry","length","shift","push","TextSelectionPlugin","options","optionVariables","pageProgression","type","textSelectingMode","Error","defaultMode","djvuPagesPromise","rtl","pageTextCache","maxWordRendered","selectionObserver","attach","ajax","url","dataType","cache","error","e","then","res","xmlMap","parseXML","find","index","cachedEntry","response","pageIndex","xmlDoc","result","add","undefined","XMLpagesArr","$container","event","selection","clipboardData","setData","preventDefault","textLayer","$pageContainer","style","pointerEvents","css","off","startedMouseDown","mouseIsDown","skipNextMouseup","on","is","stopPropagation","$textLayer","each","i","s","interceptCopy","pageContainer","page","getPageText","XMLpage","recursivelyAddCoords","totalWords","console","log","createDIVPageLayer","ratioW","parseFloat","width","ratioH","height","transform","setAttribute","ocrParagraphs","toArray","paragEls","p","el","renderParagraph","appendChild","paragraphRects","determineRealRects","yAdded","ocrParagraph","paragEl","ocrParagBounds","attr","realRect","get","ocrLeft","ocrRight","ocrTop","newStartMargin","right","left","newTop","top","marginTop","append","stopPageFlip","createElement","classList","paragLeft","paragBottom","paragRight","paragTop","wordHeightArr","lines","augmentLine","prevLine","line","nextLine","isLastLineOfParagraph","ocrElement","lineEl","words","wordIndex","currWord","bottom","wordHeight","lastWord","textContent","endsWith","newLeft","firstWord","wordEl","space","createTextNode","hasHyphen","lastWordEl","children","slice","sort","a","b","paragWordHeight","Math","floor","fontSize","wordRects","querySelectorAll","ocrWord","ocrWidth","diff","letterSpacing","spaceRects","ocrLines","lineEls","Array","from","ySoFar","ocrLine","xSoFar","wordRect","previousElementSibling","min","w","lineHeight","BookreaderWithTextSelection","Object","assign","plugins","textSelection","textSelectionPlugin","init","selectEvent","archiveAnalyticsSendEvent","refs","$br","removeClass","addClass","mode","constModeThumb","createTextLayer","parentEl","initals","position","visibility","body","rects","Map","origRect","getBoundingClientRect","Rect","scrollX","scrollY","removeChild","gen","fn","f","prev","next","gen1","gen2","it1","Symbol","iterator","it2","r1","r2","done","xmlEl","childCoords","child","boundingCoords","bounds","leftMost","Infinity","bottomMost","rightMost","topMost","max","determineBounds","abs","join","y","global","fails","uncurryThis","whitespaces","charAt","n$ParseFloat","ITERATOR","FORCED","module","exports","string","trimmedString","PROPER_FUNCTION_NAME","METHOD_NAME","name","$parseFloat","forced","$trim","proto","forcedStringTrimMethod"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"plugins/plugin.text_selection.js","mappings":"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","sources":["webpack://@internetarchive/bookreader/./src/BookReader/utils/SelectionObserver.js","webpack://@internetarchive/bookreader/./src/util/strings.js","webpack://@internetarchive/bookreader/./src/plugins/plugin.text_selection.js","webpack://@internetarchive/bookreader/./node_modules/core-js/internals/number-parse-float.js","webpack://@internetarchive/bookreader/./node_modules/core-js/internals/string-trim-forced.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.parse-float.js","webpack://@internetarchive/bookreader/./node_modules/core-js/modules/es.string.trim.js"],"sourcesContent":["// @ts-check\nexport class SelectionObserver {\n selecting = false;\n startedInSelector = false;\n /** @type {HTMLElement} */\n target = null;\n\n /**\n * @param {string} selector\n * @param {function('started' | 'cleared', HTMLElement): any} handler\n */\n constructor(selector, handler) {\n this.selector = selector;\n this.handler = handler;\n }\n\n attach() {\n // We can't just use selectstart, because safari on iOS just\n // randomly decides when to fire it 😤\n // document.addEventListener(\"selectstart\", this._onSelectStart);\n // This has to be on document :/\n document.addEventListener(\"selectionchange\", this._onSelectionChange);\n }\n\n detach() {\n document.removeEventListener(\"selectionchange\", this._onSelectionChange);\n }\n\n _onSelectionChange = () => {\n const sel = window.getSelection();\n\n if (!this.selecting && sel.toString()) {\n this.selecting = true;\n this.target = $(sel.anchorNode).closest(this.selector)[0];\n this.handler('started', this.target);\n }\n\n if (this.selecting && (sel.isCollapsed || !sel.toString() || !$(sel.anchorNode).closest(this.selector)[0])) {\n this.selecting = false;\n this.handler('cleared', this.target);\n }\n };\n}\n","/**\n * @typedef {String} StringWithVars\n * A template string with {{foo}} style variables\n * Also supports filters, like {{bookPath|urlencode}} (See APPLY_FILTERS for the\n * supported list of filters)\n **/\n\n/**\n * @param {StringWithVars|String} template\n * @param { {[varName: string]: { toString: () => string} } } vars\n * @param { {[varName: string]: { toString: () => string} } } [overrides]\n */\nexport function applyVariables(template, vars, overrides = {}, possibleFilters = APPLY_FILTERS) {\n return template?.replace(/\\{\\{([^}]*?)\\}\\}/g, ($0, $1) => {\n if (!$1) return $0;\n /** @type {string} */\n const expression = $1;\n const [varName, ...filterNames] = expression.split('|').map(x => x.trim());\n const defined = varName in overrides || varName in vars;\n\n // If it's not defined, don't expand it at all\n if (!defined) return $0;\n\n const value = varName in overrides ? overrides[varName]\n : varName in vars ? vars[varName] : null;\n const filters = filterNames.map(n => possibleFilters[n]);\n return filters.reduce((acc, cur) => cur(acc), value && value.toString());\n });\n}\n\n/** @type { {[filterName: String]:( string => string)} } */\nexport const APPLY_FILTERS = {\n urlencode: encodeURIComponent,\n};\n","//@ts-check\nimport { createDIVPageLayer } from '../BookReader/PageContainer.js';\nimport { SelectionObserver } from '../BookReader/utils/SelectionObserver.js';\nimport { applyVariables } from '../util/strings.js';\n/** @typedef {import('../util/strings.js').StringWithVars} StringWithVars */\n/** @typedef {import('../BookReader/PageContainer.js').PageContainer} PageContainer */\n\nconst BookReader = /** @type {typeof import('../BookReader').default} */(window.BookReader);\n\nexport const DEFAULT_OPTIONS = {\n enabled: true,\n /** @type {StringWithVars} The URL to fetch the entire DJVU xml. Supports options.vars */\n fullDjvuXmlUrl: null,\n /** @type {StringWithVars} The URL to fetch a single page of the DJVU xml. Supports options.vars. Also has {{pageIndex}} */\n singlePageDjvuXmlUrl: null,\n /** Whether to fetch the XML as a jsonp */\n jsonp: false,\n};\n/** @typedef {typeof DEFAULT_OPTIONS} TextSelectionPluginOptions */\n\n/**\n * @template T\n */\nexport class Cache {\n constructor(maxSize = 10) {\n this.maxSize = maxSize;\n /** @type {T[]} */\n this.entries = [];\n }\n\n /**\n * @param {T} entry\n */\n add(entry) {\n if (this.entries.length >= this.maxSize) {\n this.entries.shift();\n }\n this.entries.push(entry);\n }\n}\n\nexport class TextSelectionPlugin {\n /**\n * @param {'lr' | 'rl'} pageProgression In the future this should be in the ocr file\n * since a book being right to left doesn't mean the ocr is right to left. But for\n * now we do make that assumption.\n */\n constructor(options = DEFAULT_OPTIONS, optionVariables, pageProgression = 'lr') {\n this.options = options;\n this.optionVariables = optionVariables;\n /**@type {PromiseLike<JQuery<HTMLElement>|undefined>} */\n this.djvuPagesPromise = null;\n /** Whether the book is right-to-left */\n this.rtl = pageProgression === 'rl';\n\n /** @type {Cache<{index: number, response: any}>} */\n this.pageTextCache = new Cache();\n\n /**\n * Sometimes there are too many words on a page, and the browser becomes near\n * unusable. For now don't render text layer for pages with too many words.\n */\n this.maxWordRendered = 2500;\n\n this.selectionObserver = new SelectionObserver('.BRtextLayer', this._onSelectionChange);\n }\n\n /**\n * @param {'started' | 'cleared'} type\n * @param {HTMLElement} target\n */\n _onSelectionChange = (type, target) => {\n if (type === 'started') {\n this.textSelectingMode(target);\n } else if (type === 'cleared') {\n this.defaultMode(target);\n } else {\n throw new Error(`Unknown type ${type}`);\n }\n }\n\n init() {\n this.selectionObserver.attach();\n\n // Only fetch the full djvu xml if the single page url isn't there\n if (this.options.singlePageDjvuXmlUrl) return;\n this.djvuPagesPromise = $.ajax({\n type: \"GET\",\n url: applyVariables(this.options.fullDjvuXmlUrl, this.optionVariables),\n dataType: this.options.jsonp ? \"jsonp\" : \"html\",\n cache: true,\n error: (e) => undefined\n }).then((res) => {\n try {\n const xmlMap = $.parseXML(res);\n return xmlMap && $(xmlMap).find(\"OBJECT\");\n } catch (e) {\n return undefined;\n }\n });\n }\n\n /**\n * @param {number} index\n * @returns {Promise<HTMLElement|undefined>}\n */\n async getPageText(index) {\n if (this.options.singlePageDjvuXmlUrl) {\n const cachedEntry = this.pageTextCache.entries.find(x => x.index == index);\n if (cachedEntry) {\n return cachedEntry.response;\n }\n const res = await $.ajax({\n type: \"GET\",\n url: applyVariables(this.options.singlePageDjvuXmlUrl, this.optionVariables, { pageIndex: index }),\n dataType: this.options.jsonp ? \"jsonp\" : \"html\",\n cache: true,\n error: (e) => undefined,\n });\n try {\n const xmlDoc = $.parseXML(res);\n const result = xmlDoc && $(xmlDoc).find(\"OBJECT\")[0];\n this.pageTextCache.add({ index, response: result });\n return result;\n } catch (e) {\n return undefined;\n }\n } else {\n const XMLpagesArr = await this.djvuPagesPromise;\n if (XMLpagesArr) return XMLpagesArr[index];\n }\n }\n\n /**\n * Intercept copied text to remove any styling applied to it\n * @param {JQuery} $container\n */\n interceptCopy($container) {\n $container[0].addEventListener('copy', (event) => {\n const selection = document.getSelection();\n event.clipboardData.setData('text/plain', selection.toString());\n event.preventDefault();\n });\n }\n\n /**\n * Applies mouse events when in default mode\n * @param {HTMLElement} textLayer\n */\n defaultMode(textLayer) {\n const $pageContainer = $(textLayer).closest('.BRpagecontainer');\n textLayer.style.pointerEvents = \"none\";\n $pageContainer.find(\"img\").css(\"pointer-events\", \"auto\");\n\n $(textLayer).off(\".textSelectPluginHandler\");\n const startedMouseDown = this.mouseIsDown;\n let skipNextMouseup = this.mouseIsDown;\n if (startedMouseDown) {\n textLayer.style.pointerEvents = \"auto\";\n }\n\n // Need to stop propagation to prevent DragScrollable from\n // blocking selection\n $(textLayer).on(\"mousedown.textSelectPluginHandler\", (event) => {\n this.mouseIsDown = true;\n if ($(event.target).is(\".BRwordElement, .BRspace\")) {\n event.stopPropagation();\n }\n });\n\n $(textLayer).on(\"mouseup.textSelectPluginHandler\", (event) => {\n this.mouseIsDown = false;\n textLayer.style.pointerEvents = \"none\";\n if (skipNextMouseup) {\n skipNextMouseup = false;\n event.stopPropagation();\n }\n });\n }\n\n /**\n * This mode is active while there is a selection on the given textLayer\n * @param {HTMLElement} textLayer\n */\n textSelectingMode(textLayer) {\n const $pageContainer = $(textLayer).closest('.BRpagecontainer');\n // Make text layer consume all events\n textLayer.style.pointerEvents = \"all\";\n // Block img from getting long-press to save while selecting\n $pageContainer.find(\"img\").css(\"pointer-events\", \"none\");\n\n $(textLayer).off(\".textSelectPluginHandler\");\n\n $(textLayer).on('mousedown.textSelectPluginHandler', (event) => {\n this.mouseIsDown = true;\n event.stopPropagation();\n });\n\n // Prevent page flip on click\n $(textLayer).on('mouseup.textSelectPluginHandler', (event) => {\n this.mouseIsDown = false;\n event.stopPropagation();\n });\n }\n\n /**\n * Initializes text selection modes if there is a text layer on the page\n * @param {JQuery} $container\n */\n stopPageFlip($container) {\n /** @type {JQuery<HTMLElement>} */\n const $textLayer = $container.find('.BRtextLayer');\n if (!$textLayer.length) return;\n $textLayer.each((i, s) => this.defaultMode(s));\n this.interceptCopy($container);\n }\n\n /**\n * @param {PageContainer} pageContainer\n */\n async createTextLayer(pageContainer) {\n const pageIndex = pageContainer.page.index;\n const $container = pageContainer.$container;\n const $textLayers = $container.find('.BRtextLayer');\n if ($textLayers.length) return;\n const XMLpage = await this.getPageText(pageIndex);\n if (!XMLpage) return;\n recursivelyAddCoords(XMLpage);\n\n const totalWords = $(XMLpage).find(\"WORD\").length;\n if (totalWords > this.maxWordRendered) {\n console.log(`Page ${pageIndex} has too many words (${totalWords} > ${this.maxWordRendered}). Not rendering text layer.`);\n return;\n }\n\n const textLayer = createDIVPageLayer(pageContainer.page, 'BRtextLayer');\n const ratioW = parseFloat(pageContainer.$container[0].style.width) / pageContainer.page.width;\n const ratioH = parseFloat(pageContainer.$container[0].style.height) / pageContainer.page.height;\n textLayer.style.transform = `scale(${ratioW}, ${ratioH})`;\n textLayer.setAttribute(\"dir\", this.rtl ? \"rtl\" : \"ltr\");\n\n const ocrParagraphs = $(XMLpage).find(\"PARAGRAPH[coords]\").toArray();\n const paragEls = ocrParagraphs.map(p => {\n const el = this.renderParagraph(p);\n textLayer.appendChild(el);\n return el;\n });\n\n // Fix up paragraph positions\n const paragraphRects = determineRealRects(textLayer, '.BRparagraphElement');\n let yAdded = 0;\n for (const [ocrParagraph, paragEl] of zip(ocrParagraphs, paragEls)) {\n const ocrParagBounds = $(ocrParagraph).attr(\"coords\").split(\",\").map(parseFloat);\n const realRect = paragraphRects.get(paragEl);\n const [ocrLeft, , ocrRight, ocrTop] = ocrParagBounds;\n const newStartMargin = this.rtl ? (realRect.right - ocrRight) : (ocrLeft - realRect.left);\n const newTop = ocrTop - (realRect.top + yAdded);\n\n paragEl.style[this.rtl ? 'marginRight' : 'marginLeft'] = `${newStartMargin}px`;\n paragEl.style.marginTop = `${newTop}px`;\n yAdded += newTop;\n textLayer.appendChild(paragEl);\n }\n $container.append(textLayer);\n this.stopPageFlip($container);\n }\n\n /**\n * @param {HTMLElement} ocrParagraph\n * @returns {HTMLParagraphElement}\n */\n renderParagraph(ocrParagraph) {\n const paragEl = document.createElement('p');\n paragEl.classList.add('BRparagraphElement');\n const [paragLeft, paragBottom, paragRight, paragTop] = $(ocrParagraph).attr(\"coords\").split(\",\").map(parseFloat);\n const wordHeightArr = [];\n const lines = $(ocrParagraph).find(\"LINE[coords]\").toArray();\n if (!lines.length) return paragEl;\n\n\n for (const [prevLine, line, nextLine] of lookAroundWindow(genMap(lines, augmentLine))) {\n const isLastLineOfParagraph = line.ocrElement == lines[lines.length - 1];\n const lineEl = document.createElement('span');\n lineEl.classList.add('BRlineElement');\n\n for (const [wordIndex, currWord] of line.words.entries()) {\n const [, bottom, right, top] = $(currWord).attr(\"coords\").split(',').map(parseFloat);\n const wordHeight = bottom - top;\n wordHeightArr.push(wordHeight);\n\n if (wordIndex == 0 && prevLine?.lastWord.textContent.trim().endsWith('-')) {\n // ideally prefer the next line to determine the left position,\n // since the previous line could be the first line of the paragraph\n // and hence have an incorrectly indented first word.\n // E.g. https://archive.org/details/driitaleofdaring00bachuoft/page/360/mode/2up\n const [newLeft, , , ] = $((nextLine || prevLine).firstWord).attr(\"coords\").split(',').map(parseFloat);\n $(currWord).attr(\"coords\", `${newLeft},${bottom},${right},${top}`);\n }\n\n const wordEl = document.createElement('span');\n wordEl.setAttribute(\"class\", \"BRwordElement\");\n wordEl.textContent = currWord.textContent.trim();\n\n if (wordIndex > 0) {\n const space = document.createElement('span');\n space.classList.add('BRspace');\n space.textContent = ' ';\n lineEl.append(space);\n\n // Edge ignores empty elements (like BRspace), so add another\n // space to ensure Edge's ReadAloud works correctly.\n lineEl.appendChild(document.createTextNode(' '));\n }\n\n lineEl.appendChild(wordEl);\n }\n\n const hasHyphen = line.lastWord.textContent.trim().endsWith('-');\n const lastWordEl = lineEl.children[lineEl.children.length - 1];\n if (hasHyphen && !isLastLineOfParagraph) {\n lastWordEl.textContent = lastWordEl.textContent.trim().slice(0, -1);\n lastWordEl.classList.add('BRwordElement--hyphen');\n }\n\n paragEl.appendChild(lineEl);\n if (!isLastLineOfParagraph && !hasHyphen) {\n // Edge does not correctly have spaces between the lines.\n paragEl.appendChild(document.createTextNode(' '));\n }\n }\n\n wordHeightArr.sort((a, b) => a - b);\n const paragWordHeight = wordHeightArr[Math.floor(wordHeightArr.length * 0.85)] + 4;\n paragEl.style.left = `${paragLeft}px`;\n paragEl.style.top = `${paragTop}px`;\n paragEl.style.width = `${paragRight - paragLeft}px`;\n paragEl.style.height = `${paragBottom - paragTop}px`;\n paragEl.style.fontSize = `${paragWordHeight}px`;\n\n // Fix up sizes - stretch/crush words as necessary using letter spacing\n let wordRects = determineRealRects(paragEl, '.BRwordElement');\n const ocrWords = $(ocrParagraph).find(\"WORD\").toArray();\n const wordEls = paragEl.querySelectorAll('.BRwordElement');\n for (const [ocrWord, wordEl] of zip(ocrWords, wordEls)) {\n const realRect = wordRects.get(wordEl);\n const [left, , right ] = $(ocrWord).attr(\"coords\").split(',').map(parseFloat);\n let ocrWidth = right - left;\n // Some books (eg theworksofplato01platiala) have a space _inside_ the <WORD>\n // element. That makes it impossible to determine the correct positining\n // of everything, but to avoid the BRspace's being width 0, which makes selection\n // janky on Chrome Android, assume the space is the same width as one of the\n // letters.\n if (ocrWord.textContent.endsWith(' ')) {\n ocrWidth = ocrWidth * (ocrWord.textContent.length - 1) / ocrWord.textContent.length;\n }\n const diff = ocrWidth - realRect.width;\n wordEl.style.letterSpacing = `${diff / (ocrWord.textContent.length - 1)}px`;\n }\n\n // Stretch/crush lines as necessary using line spacing\n // Recompute rects after letter spacing\n wordRects = determineRealRects(paragEl, '.BRwordElement');\n const spaceRects = determineRealRects(paragEl, '.BRspace');\n\n const ocrLines = $(ocrParagraph).find(\"LINE[coords]\").toArray();\n const lineEls = Array.from(paragEl.querySelectorAll('.BRlineElement'));\n\n let ySoFar = paragTop;\n for (const [ocrLine, lineEl] of zip(ocrLines, lineEls)) {\n // shift words using marginLeft to align with the correct x position\n const words = $(ocrLine).find(\"WORD\").toArray();\n // const ocrLineLeft = Math.min(...words.map(w => parseFloat($(w).attr(\"coords\").split(',')[0])));\n let xSoFar = this.rtl ? paragRight : paragLeft;\n for (const [ocrWord, wordEl] of zip(words, lineEl.querySelectorAll('.BRwordElement'))) {\n // start of line, need to compute the offset relative to the OCR words\n const wordRect = wordRects.get(wordEl);\n const [ocrLeft, , ocrRight ] = $(ocrWord).attr(\"coords\").split(',').map(parseFloat);\n const diff = (this.rtl ? -(ocrRight - xSoFar) : ocrLeft - xSoFar);\n\n if (wordEl.previousElementSibling) {\n const space = wordEl.previousElementSibling;\n space.style.letterSpacing = `${diff - spaceRects.get(space).width}px`;\n } else {\n wordEl.style[this.rtl ? 'paddingRight' : 'paddingLeft'] = `${diff}px`;\n }\n if (this.rtl) xSoFar -= diff + wordRect.width;\n else xSoFar += diff + wordRect.width;\n }\n // And also fix y position\n const ocrLineTop = Math.min(...words.map(w => parseFloat($(w).attr(\"coords\").split(',')[3])));\n const diff = ocrLineTop - ySoFar;\n if (lineEl.previousElementSibling) {\n lineEl.previousElementSibling.style.lineHeight = `${diff}px`;\n ySoFar += diff;\n }\n }\n\n // The last line will have a line height subtracting from the paragraph height\n lineEls[lineEls.length - 1].style.lineHeight = `${paragBottom - ySoFar}px`;\n\n // Edge does not include a newline for some reason when copying/pasting the <p> els\n paragEl.appendChild(document.createElement('br'));\n return paragEl;\n }\n}\n\nexport class BookreaderWithTextSelection extends BookReader {\n init() {\n const options = Object.assign({}, DEFAULT_OPTIONS, this.options.plugins.textSelection);\n if (options.enabled) {\n this.textSelectionPlugin = new TextSelectionPlugin(options, this.options.vars, this.pageProgression);\n // Write this back; this way the plugin is the source of truth, and BR just\n // contains a reference to it.\n this.options.plugins.textSelection = options;\n this.textSelectionPlugin.init();\n\n new SelectionObserver('.BRtextLayer', (selectEvent) => {\n // Track how often selection is used\n if (selectEvent == 'started') {\n this.archiveAnalyticsSendEvent?.('BookReader', 'SelectStart');\n\n // Set a class on the page to avoid hiding it when zooming/etc\n this.refs.$br.find('.BRpagecontainer--hasSelection').removeClass('BRpagecontainer--hasSelection');\n $(window.getSelection().anchorNode).closest('.BRpagecontainer').addClass('BRpagecontainer--hasSelection');\n }\n }).attach();\n }\n\n super.init();\n }\n\n /**\n * @param {number} index\n */\n _createPageContainer(index) {\n const pageContainer = super._createPageContainer(index);\n // Disable if thumb mode; it's too janky\n // .page can be null for \"pre-cover\" region\n if (this.mode !== this.constModeThumb && pageContainer.page) {\n this.textSelectionPlugin?.createTextLayer(pageContainer);\n }\n return pageContainer;\n }\n}\nwindow.BookReader = BookreaderWithTextSelection;\nexport default BookreaderWithTextSelection;\n\n\n/**\n * @param {HTMLElement} parentEl\n * @param {string} selector\n * @returns {Map<Element, Rect>}\n */\nfunction determineRealRects(parentEl, selector) {\n const initals = {\n position: parentEl.style.position,\n visibility: parentEl.style.visibility,\n top: parentEl.style.top,\n left: parentEl.style.left,\n transform: parentEl.style.transform,\n };\n parentEl.style.position = 'absolute';\n parentEl.style.visibility = 'hidden';\n parentEl.style.top = '0';\n parentEl.style.left = '0';\n parentEl.style.transform = 'none';\n document.body.appendChild(parentEl);\n const rects = new Map(\n Array.from(parentEl.querySelectorAll(selector))\n .map(wordEl => {\n const origRect = wordEl.getBoundingClientRect();\n return [wordEl, new Rect(\n origRect.left + window.scrollX,\n origRect.top + window.scrollY,\n origRect.width,\n origRect.height,\n )];\n })\n );\n document.body.removeChild(parentEl);\n Object.assign(parentEl.style, initals);\n return rects;\n}\n\n/**\n * @param {HTMLElement} line\n */\nfunction augmentLine(line) {\n const words = $(line).find(\"WORD\").toArray();\n return {\n ocrElement: line,\n words,\n firstWord: words[0],\n lastWord: words[words.length - 1],\n };\n}\n\n/**\n * @template TFrom, TTo\n * Generator version of map\n * @param {Iterable<TFrom>} gen\n * @param {function(TFrom): TTo} fn\n * @returns {Iterable<TTo>}\n */\nexport function* genMap(gen, fn) {\n for (const x of gen) yield fn(x);\n}\n\n/**\n * @template T\n * Generator that provides a sliding window of 3 elements,\n * prev, current, and next.\n * @param {Iterable<T>} gen\n * @returns {Iterable<[T | undefined, T, T | undefined]>}\n */\nexport function* lookAroundWindow(gen) {\n let prev = undefined;\n let cur = undefined;\n let next = undefined;\n for (const x of gen) {\n if (typeof cur !== 'undefined') {\n next = x;\n yield [prev, cur, next];\n }\n prev = cur;\n cur = x;\n next = undefined;\n }\n\n if (typeof cur !== 'undefined') {\n yield [prev, cur, next];\n }\n}\n\n/**\n * @template T1, T2\n * Lazy zip implementation to avoid importing lodash\n * Expects iterators to be of the same length\n * @param {Iterable<T1>} gen1\n * @param {Iterable<T2>} gen2\n * @returns {Iterable<[T1, T2]>}\n */\nexport function* zip(gen1, gen2) {\n const it1 = gen1[Symbol.iterator]();\n const it2 = gen2[Symbol.iterator]();\n while (true) {\n const r1 = it1.next();\n const r2 = it2.next();\n if (r1.done && r2.done) {\n return;\n }\n if (r1.done || r2.done) {\n throw new Error('zip: one of the iterators is done');\n }\n yield [r1.value, r2.value];\n }\n}\n\n/**\n * [left, bottom, right, top]\n * @param {Array<[number, number, number, number]>} bounds\n * @returns {[number, number, number, number]}\n */\nfunction determineBounds(bounds) {\n let leftMost = Infinity;\n let bottomMost = -Infinity;\n let rightMost = -Infinity;\n let topMost = Infinity;\n\n for (const [left, bottom, right, top] of bounds) {\n leftMost = Math.min(leftMost, left);\n bottomMost = Math.max(bottomMost, bottom);\n rightMost = Math.max(rightMost, right);\n topMost = Math.min(topMost, top);\n }\n\n return [leftMost, bottomMost, rightMost, topMost];\n}\n\n/**\n * Recursively traverses the XML tree and adds coords\n * which are the bounding box of all child coords\n * @param {Element} xmlEl\n */\nfunction recursivelyAddCoords(xmlEl) {\n if ($(xmlEl).attr('coords') || !xmlEl.children) {\n return;\n }\n\n const children = $(xmlEl).children().toArray();\n if (children.length === 0) {\n return;\n }\n\n for (const child of children) {\n recursivelyAddCoords(child);\n }\n\n const childCoords = [];\n\n for (const child of children) {\n if (!$(child).attr('coords')) continue;\n childCoords.push($(child).attr('coords').split(',').map(parseFloat));\n }\n\n const boundingCoords = determineBounds(childCoords);\n if (Math.abs(boundingCoords[0]) != Infinity) {\n $(xmlEl).attr('coords', boundingCoords.join(','));\n }\n}\n\n/**\n * Basically a polyfill for the native DOMRect class\n */\nclass Rect {\n /**\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n */\n constructor(x, y, width, height) {\n this.x = x;\n this.y = y;\n this.width = width;\n this.height = height;\n }\n\n get right() { return this.x + this.width; }\n get bottom() { return this.y + this.height; }\n get top() { return this.y; }\n get left() { return this.x; }\n}\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar toString = require('../internals/to-string');\nvar trim = require('../internals/string-trim').trim;\nvar whitespaces = require('../internals/whitespaces');\n\nvar charAt = uncurryThis(''.charAt);\nvar $parseFloat = global.parseFloat;\nvar Symbol = global.Symbol;\nvar ITERATOR = Symbol && Symbol.iterator;\nvar FORCED = 1 / $parseFloat(whitespaces + '-0') !== -Infinity\n // MS Edge 18- broken with boxed symbols\n || (ITERATOR && !fails(function () { $parseFloat(Object(ITERATOR)); }));\n\n// `parseFloat` method\n// https://tc39.es/ecma262/#sec-parsefloat-string\nmodule.exports = FORCED ? function parseFloat(string) {\n var trimmedString = trim(toString(string));\n var result = $parseFloat(trimmedString);\n return result === 0 && charAt(trimmedString, 0) == '-' ? -0 : result;\n} : $parseFloat;\n","var PROPER_FUNCTION_NAME = require('../internals/function-name').PROPER;\nvar fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]()\n || non[METHOD_NAME]() !== non\n || (PROPER_FUNCTION_NAME && whitespaces[METHOD_NAME].name !== METHOD_NAME);\n });\n};\n","var $ = require('../internals/export');\nvar $parseFloat = require('../internals/number-parse-float');\n\n// `parseFloat` method\n// https://tc39.es/ecma262/#sec-parsefloat-string\n$({ global: true, forced: parseFloat != $parseFloat }, {\n parseFloat: $parseFloat\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.es/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n"],"names":["SelectionObserver","selector","handler","_this","_classCallCheck","_defineProperty","sel","window","getSelection","selecting","toString","target","$","anchorNode","closest","isCollapsed","this","key","value","document","addEventListener","_onSelectionChange","removeEventListener","applyVariables","template","vars","overrides","arguments","length","undefined","possibleFilters","APPLY_FILTERS","replace","$0","$1","_expression$split$map2","split","map","x","trim","varName","filterNames","slice","n","reduce","acc","cur","urlencode","encodeURIComponent","genMap","_marked2","_regeneratorRuntime","mark","lookAroundWindow","_marked3","zip","_get","Reflect","get","bind","property","receiver","base","object","Object","prototype","hasOwnProperty","call","_getPrototypeOf","_superPropBase","desc","getOwnPropertyDescriptor","apply","_setPrototypeOf","o","p","setPrototypeOf","__proto__","getPrototypeOf","_slicedToArray","arr","i","Array","isArray","_arrayWithHoles","_i","Symbol","iterator","_s","_e","_x","_r","_arr","_n","_d","next","done","push","err","return","_iterableToArrayLimit","_unsupportedIterableToArray","TypeError","_nonIterableRest","_createForOfIteratorHelper","allowArrayLike","it","F","s","e","_e2","f","normalCompletion","didErr","step","_e3","minLen","_arrayLikeToArray","constructor","name","from","test","len","arr2","exports","Op","hasOwn","defineProperty","obj","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","toStringTag","define","enumerable","configurable","writable","wrap","innerFn","outerFn","self","tryLocsList","protoGenerator","Generator","generator","create","context","Context","makeInvokeMethod","tryCatch","fn","arg","type","ContinueSentinel","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","NativeIteratorPrototype","values","Gp","defineIteratorMethods","forEach","method","_invoke","AsyncIterator","PromiseImpl","invoke","resolve","reject","record","result","_typeof","__await","then","unwrapped","error","previousPromise","callInvokeWithMethodAndArg","state","Error","delegate","delegateResult","maybeInvokeDelegate","sent","_sent","dispatchException","abrupt","methodName","info","resultName","nextLoc","pushTryEntry","locs","entry","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","reset","iterable","iteratorMethod","isNaN","doneResult","displayName","isGeneratorFunction","genFun","ctor","awrap","async","Promise","iter","keys","val","reverse","pop","skipTempReset","prev","charAt","stop","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","catch","thrown","delegateYield","asyncGeneratorStep","gen","_next","_throw","_asyncToGenerator","args","instance","Constructor","_defineProperties","props","descriptor","_toPropertyKey","_createClass","protoProps","staticProps","input","hint","prim","toPrimitive","res","String","_toPrimitive","BookReader","DEFAULT_OPTIONS","enabled","fullDjvuXmlUrl","singlePageDjvuXmlUrl","jsonp","Cache","maxSize","entries","shift","TextSelectionPlugin","options","optionVariables","pageProgression","textSelectingMode","concat","defaultMode","djvuPagesPromise","rtl","pageTextCache","maxWordRendered","selectionObserver","_createTextLayer","_getPageText","attach","ajax","url","dataType","cache","xmlMap","parseXML","find","_callee","index","cachedEntry","xmlDoc","XMLpagesArr","_context","response","pageIndex","add","t0","$container","event","selection","clipboardData","setData","preventDefault","textLayer","_this2","$pageContainer","style","pointerEvents","css","off","startedMouseDown","mouseIsDown","skipNextMouseup","on","is","stopPropagation","_this3","_this4","$textLayer","each","interceptCopy","_callee2","pageContainer","XMLpage","totalWords","ratioW","ratioH","ocrParagraphs","paragEls","paragraphRects","yAdded","_iterator","_step","_step$value","ocrParagraph","paragEl","ocrParagBounds","realRect","_ocrParagBounds","ocrLeft","ocrRight","ocrTop","newStartMargin","newTop","_this5","_context2","page","getPageText","recursivelyAddCoords","console","log","createDIVPageLayer","parseFloat","width","height","transform","setAttribute","toArray","el","renderParagraph","appendChild","determineRealRects","attr","right","left","top","marginTop","append","stopPageFlip","_x2","createElement","classList","_$$attr$split$map2","paragLeft","paragBottom","paragRight","paragTop","wordHeightArr","lines","_step2","_iterator2","augmentLine","_step2$value","prevLine","line","nextLine","isLastLineOfParagraph","ocrElement","lineEl","_step5","_iterator5","words","_step5$value","wordIndex","currWord","_$$attr$split$map4","bottom","wordHeight","lastWord","textContent","endsWith","newLeft","firstWord","wordEl","space","createTextNode","hasHyphen","lastWordEl","children","sort","a","b","paragWordHeight","Math","floor","fontSize","_step3","wordRects","_iterator3","querySelectorAll","_step3$value","ocrWord","_$$attr$split$map8","ocrWidth","diff","letterSpacing","_step4","spaceRects","ocrLines","lineEls","ySoFar","_iterator4","_step6","_step4$value","ocrLine","xSoFar","_iterator6","_step6$value","wordRect","_$$attr$split$map10","previousElementSibling","min","_arrayWithoutHoles","w","_iterableToArray","_nonIterableSpread","lineHeight","BookreaderWithTextSelection","_BookReader","subClass","superClass","_inherits","Derived","hasNativeReflectConstruct","_super","construct","sham","Proxy","Boolean","valueOf","_isNativeReflectConstruct","Super","NewTarget","ReferenceError","_assertThisInitialized","_possibleConstructorReturn","_this6","assign","plugins","textSelection","textSelectionPlugin","init","selectEvent","_this6$archiveAnalyti","archiveAnalyticsSendEvent","refs","$br","removeClass","addClass","_this$textSelectionPl","mode","constModeThumb","createTextLayer","parentEl","initals","position","visibility","body","rects","Map","origRect","getBoundingClientRect","Rect","scrollX","scrollY","removeChild","_iterator7","_step7","_context3","_marked","_iterator8","_step8","_context4","gen1","gen2","it1","it2","r1","r2","_context5","xmlEl","_step10","_iterator10","_step11","childCoords","_iterator11","child","boundingCoords","bounds","_step9","leftMost","Infinity","bottomMost","rightMost","topMost","_iterator9","_step9$value","max","determineBounds","abs","join","y","global","fails","uncurryThis","whitespaces","$parseFloat","ITERATOR","FORCED","module","string","trimmedString","PROPER_FUNCTION_NAME","METHOD_NAME","forced","$trim","proto","forcedStringTrimMethod"],"sourceRoot":""}
|