UNPKG

r2-navigator-js

Version:

Readium 2 'navigator' for NodeJS (TypeScript)

1,007 lines 43.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ttsPlayQueueIndex = exports.ttsPreviewAndEventuallyPlayQueueIndex = exports.ttsPrevious = exports.ttsNext = exports.ttsQueueCurrentText = exports.ttsQueueCurrentIndex = exports.ttsQueueSize = exports.ttsPauseOrResume = exports.isTtsActive = exports.isTtsPlaying = exports.ttsResume = exports.ttsPlaybackRate = exports.ttsVoice = exports.ttsPause = exports.ttsStop = exports.ttsPlay = void 0; var tslib_1 = require("tslib"); var debounce_1 = require("debounce"); var electron_1 = require("electron"); var events_1 = require("../../common/events"); var highlight_1 = require("../../common/highlight"); var styles_1 = require("../../common/styles"); var animateProperty_1 = require("../common/animateProperty"); var cssselector2_3_1 = require("../common/cssselector2-3"); var dom_text_utils_1 = require("../common/dom-text-utils"); var easings_1 = require("../common/easings"); var popup_dialog_1 = require("../common/popup-dialog"); var highlight_2 = require("./highlight"); var readium_css_1 = require("./readium-css"); var selection_1 = require("./selection"); var IS_DEV = (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "dev"); var win = global.window; var _dialogState; function resetState(stop) { if (stop) { _resumableState = undefined; } if (_dialogState) { if (_dialogState.hasAttribute("open") || _dialogState.open) { console.log("...DIALOG close() from TTS resetState()"); _dialogState.close(); } _dialogState.popDialog = undefined; _dialogState.focusScrollRaw = undefined; _dialogState.ensureTwoPageSpreadWithOddColumnsIsOffsetTempDisable = undefined; _dialogState.ensureTwoPageSpreadWithOddColumnsIsOffsetReEnable = undefined; _dialogState.ttsRootElement = undefined; _dialogState.ttsQueue = undefined; _dialogState.ttsQueueLength = -1; _dialogState.ttsUtterance = undefined; _dialogState.ttsQueueItem = undefined; _dialogState.domSlider = undefined; _dialogState.domNext = undefined; _dialogState.domPrevious = undefined; _dialogState.domText = undefined; _dialogState.ttsOverlayEnabled = win.READIUM2.ttsOverlayEnabled; _dialogState.remove(); } _dialogState = undefined; win.document.documentElement.classList.remove(styles_1.TTS_CLASS_IS_ACTIVE); if (stop || !_resumableState) { electron_1.ipcRenderer.sendToHost(events_1.R2_EVENT_TTS_IS_STOPPED); win.READIUM2.ttsClickEnabled = false; win.document.documentElement.classList.remove(styles_1.TTS_CLASS_PLAYING, styles_1.TTS_CLASS_PAUSED); win.document.documentElement.classList.add(styles_1.TTS_CLASS_STOPPED); } else { win.READIUM2.ttsClickEnabled = true; win.document.documentElement.classList.remove(styles_1.TTS_CLASS_PLAYING, styles_1.TTS_CLASS_STOPPED); win.document.documentElement.classList.add(styles_1.TTS_CLASS_PAUSED); } (0, readium_css_1.clearImageZoomOutlineDebounced)(); } function ttsPlay(speed, voice, focusScrollRaw, rootElem, startElem, startTextNode, startTextNodeOffset, ensureTwoPageSpreadWithOddColumnsIsOffsetTempDisable, ensureTwoPageSpreadWithOddColumnsIsOffsetReEnable) { ttsStop(); var rootEl = rootElem; if (!rootEl) { rootEl = win.document.body; } var splitSentences = win.READIUM2.ttsSentenceDetectionEnabled; var ttsQueue = (0, dom_text_utils_1.generateTtsQueue)(rootEl, splitSentences); if (!ttsQueue.length) { return; } var ttsQueueIndex = -1; if (startElem) { var idx = (0, dom_text_utils_1.findTtsQueueItemIndex)(ttsQueue, startElem, startTextNode, startTextNodeOffset, rootEl); if (idx >= 0) { ttsQueueIndex = idx; } } if (ttsQueueIndex < 0) { ttsQueueIndex = 0; } setTimeout(function () { startTTSSession(speed, voice, rootEl, ttsQueue, ttsQueueIndex, focusScrollRaw, ensureTwoPageSpreadWithOddColumnsIsOffsetTempDisable, ensureTwoPageSpreadWithOddColumnsIsOffsetReEnable); }, 100); } exports.ttsPlay = ttsPlay; function ttsStop() { ttsPause(true); resetState(true); } exports.ttsStop = ttsStop; function ttsPause(doNotReset) { if (doNotReset === void 0) { doNotReset = false; } highlights(false); if (win.speechSynthesis.speaking) { if (_dialogState && _dialogState.ttsUtterance) { _dialogState.ttsUtterance.r2_cancel = true; } setTimeout(function () { win.speechSynthesis.cancel(); }, 0); } else if (win.speechSynthesis.pending) { if (_dialogState && _dialogState.ttsUtterance) { _dialogState.ttsUtterance.r2_cancel = true; } setTimeout(function () { win.speechSynthesis.cancel(); }, 0); } win.document.documentElement.classList.remove(styles_1.TTS_CLASS_PLAYING, styles_1.TTS_CLASS_STOPPED); win.document.documentElement.classList.add(styles_1.TTS_CLASS_PAUSED); if (_dialogState && _dialogState.ttsOverlayEnabled) { win.document.documentElement.classList.add(styles_1.TTS_CLASS_IS_ACTIVE); } electron_1.ipcRenderer.sendToHost(events_1.R2_EVENT_TTS_IS_PAUSED); win.READIUM2.ttsClickEnabled = true; (0, readium_css_1.clearImageZoomOutlineDebounced)(); var isOpen = (_dialogState === null || _dialogState === void 0 ? void 0 : _dialogState.hasAttribute("open")) || (_dialogState === null || _dialogState === void 0 ? void 0 : _dialogState.open); if ((0, popup_dialog_1.isPopupDialogOpen)(win.document) && isOpen) { var diagEl = win.document.getElementById(styles_1.POPUP_DIALOG_CLASS); if (diagEl) { var isCollapsed = diagEl.classList.contains(styles_1.POPUP_DIALOG_CLASS_COLLAPSE); if (!isCollapsed) { doNotReset = true; } } } if (!doNotReset) { if (isOpen) { console.log("...DIALOG close() from TTS ttsPause()"); _dialogState === null || _dialogState === void 0 ? void 0 : _dialogState.close(); } } } exports.ttsPause = ttsPause; function ttsVoice(voice) { win.READIUM2.ttsVoice = voice; if (_dialogState) { var resumableState_1 = _resumableState; ttsStop(); setTimeout(function () { _resumableState = resumableState_1; ttsResume(); }, 60); } } exports.ttsVoice = ttsVoice; function ttsPlaybackRate(speed) { win.READIUM2.ttsPlaybackRate = speed; if (_dialogState) { ttsPause(true); if (_dialogState === null || _dialogState === void 0 ? void 0 : _dialogState.ttsUtterance) { _dialogState.ttsUtterance.rate = speed; } setTimeout(function () { ttsResume(); }, 60); } } exports.ttsPlaybackRate = ttsPlaybackRate; var _resumableState; function ttsResume() { if (_dialogState && _dialogState.ttsUtterance) { highlights(true); setTimeout(function () { if (_dialogState && _dialogState.ttsUtterance) { _dialogState.ttsUtterance.r2_cancel = false; win.speechSynthesis.speak(_dialogState.ttsUtterance); } }, 0); win.document.documentElement.classList.remove(styles_1.TTS_CLASS_PAUSED, styles_1.TTS_CLASS_STOPPED); win.document.documentElement.classList.add(styles_1.TTS_CLASS_PLAYING); if (_dialogState && _dialogState.ttsOverlayEnabled) { win.document.documentElement.classList.add(styles_1.TTS_CLASS_IS_ACTIVE); } electron_1.ipcRenderer.sendToHost(events_1.R2_EVENT_TTS_IS_PLAYING); win.READIUM2.ttsClickEnabled = true; (0, readium_css_1.clearImageZoomOutlineDebounced)(); } else if (_resumableState) { setTimeout(function () { if (_resumableState) { startTTSSession(win.READIUM2.ttsPlaybackRate, win.READIUM2.ttsVoice, _resumableState.ttsRootElement, _resumableState.ttsQueue, _resumableState.ttsQueueIndex, _resumableState.focusScrollRaw, _resumableState.ensureTwoPageSpreadWithOddColumnsIsOffsetTempDisable, _resumableState.ensureTwoPageSpreadWithOddColumnsIsOffsetReEnable); } }, 100); } } exports.ttsResume = ttsResume; function isTtsPlaying() { return isTtsActive() && !win.speechSynthesis.paused; } exports.isTtsPlaying = isTtsPlaying; function isTtsActive() { if (_dialogState && (_dialogState.hasAttribute("open") || _dialogState.open) && (win.speechSynthesis.speaking || win.speechSynthesis.pending)) { return true; } return false; } exports.isTtsActive = isTtsActive; function ttsPauseOrResume() { if (isTtsPlaying()) { ttsPause(); } else { ttsResume(); } } exports.ttsPauseOrResume = ttsPauseOrResume; function ttsQueueSize() { if (_dialogState && _dialogState.ttsQueue) { (0, dom_text_utils_1.getTtsQueueLength)(_dialogState.ttsQueue); } return -1; } exports.ttsQueueSize = ttsQueueSize; function ttsQueueCurrentIndex() { if (_dialogState && _dialogState.ttsQueueItem) { return _dialogState.ttsQueueItem.iGlobal; } return -1; } exports.ttsQueueCurrentIndex = ttsQueueCurrentIndex; function ttsQueueCurrentText() { if (_dialogState && _dialogState.ttsQueueItem) { return (0, dom_text_utils_1.getTtsQueueItemRefText)(_dialogState.ttsQueueItem); } return undefined; } exports.ttsQueueCurrentText = ttsQueueCurrentText; function ttsNext(skipSentences) { if (skipSentences === void 0) { skipSentences = false; } if (_dialogState && _dialogState.ttsQueueItem) { var j = _dialogState.ttsQueueItem.iGlobal + 1; if (skipSentences && _dialogState.ttsQueueItem.iSentence !== -1 && _dialogState.ttsQueueItem.item.combinedTextSentences) { j = _dialogState.ttsQueueItem.iGlobal + (_dialogState.ttsQueueItem.item.combinedTextSentences.length - _dialogState.ttsQueueItem.iSentence); } if (j >= _dialogState.ttsQueueLength || j < 0) { return; } ttsPause(true); ttsPlayQueueIndexDebounced(j); } else if (_resumableState) { ttsResume(); } } exports.ttsNext = ttsNext; function ttsPrevious(skipSentences) { if (skipSentences === void 0) { skipSentences = false; } if (_dialogState && _dialogState.ttsQueueItem) { var j = _dialogState.ttsQueueItem.iGlobal - 1; if (skipSentences && _dialogState.ttsQueueItem.iSentence !== -1 && _dialogState.ttsQueueItem.item.combinedTextSentences) { j = _dialogState.ttsQueueItem.iGlobal - _dialogState.ttsQueueItem.iSentence - 1; } if (j >= _dialogState.ttsQueueLength || j < 0) { return; } ttsPause(true); ttsPlayQueueIndexDebounced(j); } else if (_resumableState) { ttsResume(); } } exports.ttsPrevious = ttsPrevious; function ttsPreviewAndEventuallyPlayQueueIndex(n) { ttsPause(true); ttsPlayQueueIndexDebounced(n); } exports.ttsPreviewAndEventuallyPlayQueueIndex = ttsPreviewAndEventuallyPlayQueueIndex; var _getCssSelectorOptions = { className: function (_str) { return true; }, idName: function (_str) { return true; }, tagName: function (_str) { return true; }, }; function getCssSelector(element) { try { return (0, cssselector2_3_1.uniqueCssSelector)(element, win.document, _getCssSelectorOptions); } catch (err) { console.log("uniqueCssSelector:"); console.log(err); return ""; } } var _ttsQueueItemHighlightsSentence; var _ttsQueueItemHighlightsWord; function wrapHighlightWord(ttsQueueItemRef, utteranceText, charIndex, charLength, word, start, end) { var e_1, _a; if (_dialogState && _dialogState.ttsOverlayEnabled) { return; } if (_ttsQueueItemHighlightsWord) { _ttsQueueItemHighlightsWord.forEach(function (highlight) { if (highlight) { (0, highlight_2.destroyHighlight)(win.document, highlight.id); } }); _ttsQueueItemHighlightsWord = undefined; } var ttsQueueItem = ttsQueueItemRef.item; var txtToCheck = ttsQueueItemRef.item.combinedText; var charIndexAdjusted = charIndex; if (ttsQueueItem.combinedTextSentences && ttsQueueItem.combinedTextSentencesRangeBegin && ttsQueueItem.combinedTextSentencesRangeEnd && ttsQueueItemRef.iSentence >= 0) { var sentOffset = ttsQueueItem.combinedTextSentencesRangeBegin[ttsQueueItemRef.iSentence]; charIndexAdjusted += sentOffset; txtToCheck = ttsQueueItem.combinedTextSentences[ttsQueueItemRef.iSentence]; } if (IS_DEV) { if (utteranceText !== txtToCheck) { console.log("TTS utteranceText DIFF?? ", "[[".concat(utteranceText, "]]"), "[[".concat(txtToCheck, "]]")); } var ttsWord = utteranceText.substr(charIndex, charLength); if (ttsWord !== word) { console.log("TTS word DIFF?? ", "[[".concat(ttsWord, "]]"), "[[".concat(word, "]]"), "".concat(charIndex, "--").concat(charLength), "".concat(start, "--").concat(end - start)); } } var acc = 0; var rangeStartNode; var rangeStartOffset = -1; var rangeEndNode; var rangeEndOffset = -1; var charIndexEnd = charIndexAdjusted + charLength; try { for (var _b = tslib_1.__values(ttsQueueItem.textNodes), _c = _b.next(); !_c.done; _c = _b.next()) { var txtNode = _c.value; if (!txtNode.nodeValue && txtNode.nodeValue !== "") { continue; } var l = txtNode.nodeValue.length; acc += l; if (!rangeStartNode) { if (charIndexAdjusted < acc) { rangeStartNode = txtNode; rangeStartOffset = l - (acc - charIndexAdjusted); } } if (rangeStartNode && charIndexEnd <= acc) { rangeEndNode = txtNode; rangeEndOffset = l - (acc - charIndexEnd); break; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } if (rangeStartNode && rangeEndNode) { var range = new Range(); range.setStart(rangeStartNode, rangeStartOffset); range.setEnd(rangeEndNode, rangeEndOffset); if (_dialogState && _dialogState.focusScrollRaw) { var domRect = range.getBoundingClientRect(); _dialogState.focusScrollRaw(ttsQueueItemRef.item.parentElement, false, true, domRect); } var tuple = (0, selection_1.convertRange)(range, getCssSelector, function (_node) { return ""; }); if (!tuple) { return; } var rangeInfo = tuple[0]; var textInfo = tuple[1]; var highlightDefinitions = [ { color: { blue: 0, green: 147, red: 255, }, drawType: highlight_1.HighlightDrawTypeUnderline, expand: 2, selectionInfo: { rawBefore: textInfo.rawBefore, rawText: textInfo.rawText, rawAfter: textInfo.rawAfter, cleanBefore: textInfo.cleanBefore, cleanText: textInfo.cleanText, cleanAfter: textInfo.cleanAfter, rangeInfo: rangeInfo, }, }, ]; _ttsQueueItemHighlightsWord = (0, highlight_2.createHighlights)(win, highlightDefinitions, false); } } function wrapHighlight(doHighlight, ttsQueueItemRef) { var e_2, _a; if (_dialogState && _dialogState.ttsOverlayEnabled) { return; } if (_ttsQueueItemHighlightsWord) { _ttsQueueItemHighlightsWord.forEach(function (highlight) { if (highlight) { (0, highlight_2.destroyHighlight)(win.document, highlight.id); } }); _ttsQueueItemHighlightsWord = undefined; } if (_ttsQueueItemHighlightsSentence) { _ttsQueueItemHighlightsSentence.forEach(function (highlight) { if (highlight) { (0, highlight_2.destroyHighlight)(win.document, highlight.id); } }); _ttsQueueItemHighlightsSentence = undefined; } var ttsQueueItem = ttsQueueItemRef.item; if (doHighlight && ttsQueueItem.parentElement) { var range = void 0; if (!ttsQueueItem.textNodes || !ttsQueueItem.textNodes.length) { range = new Range(); range.selectNode(ttsQueueItem.parentElement); } else if (ttsQueueItem.combinedTextSentences && ttsQueueItem.combinedTextSentencesRangeBegin && ttsQueueItem.combinedTextSentencesRangeEnd && ttsQueueItemRef.iSentence >= 0) { var sentBegin = ttsQueueItem.combinedTextSentencesRangeBegin[ttsQueueItemRef.iSentence]; var sentEnd = ttsQueueItem.combinedTextSentencesRangeEnd[ttsQueueItemRef.iSentence]; var acc = 0; var rangeStartNode = void 0; var rangeStartOffset = -1; var rangeEndNode = void 0; var rangeEndOffset = -1; try { for (var _b = tslib_1.__values(ttsQueueItemRef.item.textNodes), _c = _b.next(); !_c.done; _c = _b.next()) { var txtNode = _c.value; if (!txtNode.nodeValue && txtNode.nodeValue !== "") { continue; } var l = txtNode.nodeValue.length; acc += l; if (!rangeStartNode) { if (sentBegin < acc) { rangeStartNode = txtNode; rangeStartOffset = l - (acc - sentBegin); } } if (rangeStartNode && sentEnd <= acc) { rangeEndNode = txtNode; rangeEndOffset = l - (acc - sentEnd); break; } } } catch (e_2_1) { e_2 = { error: e_2_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_2) throw e_2.error; } } if (rangeStartNode && rangeEndNode) { range = new Range(); range.setStart(rangeStartNode, rangeStartOffset); range.setEnd(rangeEndNode, rangeEndOffset); } } else { range = new Range(); var firstTextNode = ttsQueueItem.textNodes[0]; if (!firstTextNode.nodeValue && firstTextNode.nodeValue !== "") { return; } range.setStart(firstTextNode, 0); var lastTextNode = ttsQueueItem.textNodes[ttsQueueItem.textNodes.length - 1]; if (!lastTextNode.nodeValue && lastTextNode.nodeValue !== "") { return; } range.setEnd(lastTextNode, lastTextNode.nodeValue.length); } if (range) { if (_dialogState && _dialogState.focusScrollRaw) { var domRect = range.getBoundingClientRect(); _dialogState.focusScrollRaw(ttsQueueItemRef.item.parentElement, false, true, domRect); } var tuple = (0, selection_1.convertRange)(range, getCssSelector, function (_node) { return ""; }); if (!tuple) { return; } var rangeInfo = tuple[0]; var textInfo = tuple[1]; var highlightDefinitions = [ { color: { blue: 116, green: 248, red: 248, }, drawType: highlight_1.HighlightDrawTypeBackground, expand: 4, selectionInfo: { rawBefore: textInfo.rawBefore, rawText: textInfo.rawText, rawAfter: textInfo.rawAfter, cleanBefore: textInfo.cleanBefore, cleanText: textInfo.cleanText, cleanAfter: textInfo.cleanAfter, rangeInfo: rangeInfo, }, }, ]; _ttsQueueItemHighlightsSentence = (0, highlight_2.createHighlights)(win, highlightDefinitions, false); } } } function highlights(doHighlight) { if (_dialogState && _dialogState.ttsOverlayEnabled) { return; } if (!_dialogState) { return; } if (doHighlight) { if (_dialogState.ttsQueueItem) { wrapHighlight(true, _dialogState.ttsQueueItem); } if (win.READIUM2.DEBUG_VISUALS && _dialogState.ttsRootElement) { _dialogState.ttsRootElement.classList.add(styles_1.TTS_ID_SPEAKING_DOC_ELEMENT); } } else { if (_dialogState.ttsQueueItem) { wrapHighlight(false, _dialogState.ttsQueueItem); } if (_dialogState.ttsRootElement) { _dialogState.ttsRootElement.classList.remove(styles_1.TTS_ID_SPEAKING_DOC_ELEMENT); } } } var _lastAnimState; var animationTime = 400; var scrollIntoViewSpokenTextDebounced = (0, debounce_1.debounce)(function (id) { scrollIntoViewSpokenText(id); }, 200); function scrollIntoViewSpokenText(id) { var reduceMotion = win.document.documentElement.classList.contains(styles_1.ROOT_CLASS_REDUCE_MOTION); var span = win.document.getElementById(id); if (span && _dialogState && _dialogState.domText) { var rect = span.getBoundingClientRect(); var rect2 = _dialogState.domText.getBoundingClientRect(); var scrollTopMax = _dialogState.domText.scrollHeight - _dialogState.domText.clientHeight; var offset = _dialogState.domText.scrollTop + (rect.top - rect2.top - (_dialogState.domText.clientHeight / 2)); if (offset > scrollTopMax) { offset = scrollTopMax; } else if (offset < 0) { offset = 0; } var diff = Math.abs(_dialogState.domText.scrollTop - offset); if (diff < 20) { return; } if (_lastAnimState && _lastAnimState.animating) { win.cancelAnimationFrame(_lastAnimState.id); _lastAnimState.object[_lastAnimState.property] = _lastAnimState.destVal; } var targetObj = _dialogState.domText; var targetProp = "scrollTop"; if (reduceMotion) { _lastAnimState = undefined; targetObj[targetProp] = offset; } else { _lastAnimState = (0, animateProperty_1.animateProperty)(win.cancelAnimationFrame, undefined, targetProp, animationTime, targetObj, offset, win.requestAnimationFrame, easings_1.easings.easeInOutQuad); } } } var R2_DATA_ATTR_UTTERANCE_INDEX = "data-r2-tts-utterance-index"; function updateTTSInfo(charIndex, charLength, utteranceText) { if (!_dialogState || !_dialogState.hasAttribute("open") || !_dialogState.open || !_dialogState.domText || !_dialogState.ttsQueue || !_dialogState.ttsQueueItem) { return undefined; } var ttsQueueItem = _dialogState.ttsQueueItem; if (!ttsQueueItem) { return undefined; } var isWordBoundary = charIndex >= 0 && utteranceText; if (_dialogState.ttsOverlayEnabled && !isWordBoundary && _dialogState.focusScrollRaw && ttsQueueItem.item.parentElement) { _dialogState.focusScrollRaw(ttsQueueItem.item.parentElement, false, true, undefined); } var ttsQueueItemText = utteranceText ? utteranceText : (0, dom_text_utils_1.getTtsQueueItemRefText)(ttsQueueItem); var ttsQueueItemMarkup = (0, dom_text_utils_1.normalizeHtmlText)(ttsQueueItemText); if (charIndex >= 0 && utteranceText) { var start = utteranceText.slice(0, charIndex + 1).search(/\S+$/); var right = utteranceText.slice(charIndex).search(/\s/); var word = right < 0 ? utteranceText.slice(start) : utteranceText.slice(start, right + charIndex); var end = start + word.length; if (_dialogState && _dialogState.ttsOverlayEnabled) { var prefix = "<span id=\"".concat(styles_1.TTS_ID_ACTIVE_WORD, "\">"); var suffix = "</span>"; var before = utteranceText.substr(0, start); var after = utteranceText.substr(end); var l = before.length + word.length + after.length; ttsQueueItemMarkup = (l === utteranceText.length) ? "".concat((0, dom_text_utils_1.normalizeHtmlText)(before)).concat(prefix).concat((0, dom_text_utils_1.normalizeHtmlText)(word)).concat(suffix).concat((0, dom_text_utils_1.normalizeHtmlText)(after)) : (0, dom_text_utils_1.normalizeHtmlText)(utteranceText); } else { wrapHighlightWord(ttsQueueItem, utteranceText, charIndex, charLength, word, start, end); } } if (!(_dialogState && _dialogState.ttsOverlayEnabled)) { return ttsQueueItemText; } var activeUtteranceElem = _dialogState.domText.ownerDocument ? _dialogState.domText.ownerDocument.getElementById(styles_1.TTS_ID_ACTIVE_UTTERANCE) : _dialogState.domText.querySelector("#".concat(styles_1.TTS_ID_ACTIVE_UTTERANCE)); if (activeUtteranceElem) { var indexStr = activeUtteranceElem.getAttribute(R2_DATA_ATTR_UTTERANCE_INDEX); if (indexStr && indexStr !== "".concat(ttsQueueItem.iGlobal)) { activeUtteranceElem.removeAttribute("id"); var activeWordElem = activeUtteranceElem.ownerDocument ? activeUtteranceElem.ownerDocument.getElementById(styles_1.TTS_ID_ACTIVE_WORD) : activeUtteranceElem.querySelector("#".concat(styles_1.TTS_ID_ACTIVE_WORD)); if (activeWordElem) { var index = parseInt(indexStr, 10); if (!isNaN(index)) { var ttsQItem = (0, dom_text_utils_1.getTtsQueueItemRef)(_dialogState.ttsQueue, index); if (ttsQItem) { var txt = (0, dom_text_utils_1.getTtsQueueItemRefText)(ttsQItem); try { activeUtteranceElem.innerHTML = (0, dom_text_utils_1.normalizeHtmlText)(txt); } catch (err) { console.log(err); console.log(txt); activeUtteranceElem.innerHTML = "txt"; } } } } activeUtteranceElem = _dialogState.domText.querySelector("[".concat(R2_DATA_ATTR_UTTERANCE_INDEX, "=\"").concat(ttsQueueItem.iGlobal, "\"]")); if (activeUtteranceElem) { activeUtteranceElem.setAttribute("id", styles_1.TTS_ID_ACTIVE_UTTERANCE); } } if (activeUtteranceElem) { try { activeUtteranceElem.innerHTML = ttsQueueItemMarkup; } catch (err) { console.log(err); console.log(ttsQueueItemMarkup); activeUtteranceElem.innerHTML = "ttsQueueItemMarkup"; } } } else { var fullMarkup = ""; for (var i = 0; i < _dialogState.ttsQueueLength; i++) { var ttsQItem = (0, dom_text_utils_1.getTtsQueueItemRef)(_dialogState.ttsQueue, i); if (!ttsQItem) { continue; } var ttsQItemMarkup = ttsQueueItemMarkup; var isHeadingLevel1 = false; var isHeadingLevel2 = false; var isHeadingLevel3 = false; var isHeadingLevel4 = false; var isHeadingLevel5 = false; var p = ttsQItem.item.parentElement; while (p && p.tagName) { var tagName = p.tagName.toLowerCase(); if (tagName === "h1") { isHeadingLevel1 = true; break; } else if (tagName === "h2") { isHeadingLevel2 = true; break; } else if (tagName === "h3") { isHeadingLevel3 = true; break; } else if (tagName === "h4") { isHeadingLevel4 = true; break; } else if (tagName === "h5") { isHeadingLevel5 = true; break; } p = p.parentNode; } var classes = styles_1.TTS_CLASS_UTTERANCE + (isHeadingLevel1 ? " ".concat(styles_1.TTS_CLASS_UTTERANCE_HEADING1) : (isHeadingLevel2 ? " ".concat(styles_1.TTS_CLASS_UTTERANCE_HEADING2) : (isHeadingLevel3 ? " ".concat(styles_1.TTS_CLASS_UTTERANCE_HEADING3) : (isHeadingLevel4 ? " ".concat(styles_1.TTS_CLASS_UTTERANCE_HEADING4) : (isHeadingLevel5 ? " ".concat(styles_1.TTS_CLASS_UTTERANCE_HEADING5) : ""))))); var ttsQItemMarkupAttributes = "".concat(R2_DATA_ATTR_UTTERANCE_INDEX, "=\"").concat(ttsQItem.iGlobal, "\" class=\"").concat(classes, "\""); if (ttsQItem.iGlobal === ttsQueueItem.iGlobal) { ttsQItemMarkupAttributes += " id=\"".concat(styles_1.TTS_ID_ACTIVE_UTTERANCE, "\" "); } else { ttsQItemMarkup = (0, dom_text_utils_1.normalizeHtmlText)((0, dom_text_utils_1.getTtsQueueItemRefText)(ttsQItem)); } var imageMarkup = ""; if (ttsQItem.item.parentElement && ttsQItem.item.parentElement.tagName && ttsQItem.item.parentElement.tagName.toLowerCase() === "img" && ttsQItem.item.parentElement.src) { imageMarkup = "<img src=\"".concat(ttsQItem.item.parentElement.src, "\" />"); } if (ttsQItem.item.parentElement && ttsQItem.item.parentElement.tagName && ttsQItem.item.parentElement.tagName.toLowerCase() === "svg") { imageMarkup = ttsQItem.item.parentElement.outerHTML; } if (ttsQItem.item.dir) { ttsQItemMarkupAttributes += " dir=\"".concat(ttsQItem.item.dir, "\" "); } if (ttsQItem.item.lang) { ttsQItemMarkupAttributes += " lang=\"".concat(ttsQItem.item.lang, "\" xml:lang=\"").concat(ttsQItem.item.lang, "\" "); } fullMarkup += "".concat(imageMarkup, "<div ").concat(ttsQItemMarkupAttributes, ">").concat(ttsQItemMarkup, "</div>"); } try { _dialogState.domText.insertAdjacentHTML("beforeend", fullMarkup); } catch (err) { console.log(err); console.log(fullMarkup); try { _dialogState.domText.innerHTML = fullMarkup; } catch (err) { console.log(err); console.log(fullMarkup); _dialogState.domText.innerHTML = "fullMarkup"; } } } scrollIntoViewSpokenTextDebounced(isWordBoundary ? styles_1.TTS_ID_ACTIVE_WORD : styles_1.TTS_ID_ACTIVE_UTTERANCE); return ttsQueueItemText; } var ttsPlayQueueIndexDebounced = (0, debounce_1.debounce)(function (ttsQueueIndex) { ttsPlayQueueIndex(ttsQueueIndex); }, 150); function ttsPlayQueueIndex(ttsQueueIndex) { var _a; if (!_dialogState || !_dialogState.ttsRootElement || !_dialogState.focusScrollRaw || !_dialogState.ensureTwoPageSpreadWithOddColumnsIsOffsetReEnable || !_dialogState.ensureTwoPageSpreadWithOddColumnsIsOffsetTempDisable || !_dialogState.ttsQueue || !_dialogState.hasAttribute("open") || !_dialogState.open) { ttsStop(); return; } _dialogState.ttsQueueItem = undefined; _dialogState.ttsUtterance = undefined; if (_dialogState.domSlider) { _dialogState.domSlider.valueAsNumber = ttsQueueIndex; } if (ttsQueueIndex < 0) { ttsStop(); return; } if (ttsQueueIndex >= _dialogState.ttsQueueLength) { ttsStop(); setTimeout(function () { electron_1.ipcRenderer.sendToHost(events_1.R2_EVENT_TTS_DOC_END); }, 400); return; } var ttsQueueItem = (0, dom_text_utils_1.getTtsQueueItemRef)(_dialogState.ttsQueue, ttsQueueIndex); if (!ttsQueueItem) { ttsStop(); return; } _dialogState.ttsQueueItem = ttsQueueItem; highlights(true); var txtStr = updateTTSInfo(-1, -1, undefined); if (!txtStr) { ttsStop(); return; } var utterance = new SpeechSynthesisUtterance(txtStr); _dialogState.ttsUtterance = utterance; utterance.r2_ttsQueueIndex = ttsQueueIndex; if (_dialogState.ttsQueueItem.item.lang) { utterance.lang = _dialogState.ttsQueueItem.item.lang; } if (win.READIUM2.ttsPlaybackRate >= 0.1 && win.READIUM2.ttsPlaybackRate <= 10) { utterance.rate = win.READIUM2.ttsPlaybackRate; } utterance.voice = speechSynthesis.getVoices().find(function (voice) { return win.READIUM2.ttsVoice && (voice.name === win.READIUM2.ttsVoice.name && voice.lang === win.READIUM2.ttsVoice.lang && voice.voiceURI === win.READIUM2.ttsVoice.voiceURI && voice.default === win.READIUM2.ttsVoice.default && voice.localService === win.READIUM2.ttsVoice.localService); }) || null; if (utterance.lang && ((_a = utterance.voice) === null || _a === void 0 ? void 0 : _a.lang)) { var utteranceLang = utterance.lang.toLowerCase(); var utteranceLangShort = utteranceLang; var i = utteranceLangShort.indexOf("-"); var utteranceLangIsSpecific = i > 0; if (utteranceLangIsSpecific) { utteranceLangShort = utteranceLangShort.substring(0, i); } var utteranceVoiceLang = utterance.voice.lang.toLowerCase(); var utteranceVoiceLangShort = utteranceVoiceLang; var j = utteranceVoiceLangShort.indexOf("-"); var utteranceVoiceLangIsSpecific = j > 0; if (utteranceVoiceLangIsSpecific) { utteranceVoiceLangShort = utteranceVoiceLangShort.substring(0, j); } if (utteranceLang !== utteranceVoiceLang) { var doReset = false; if (utteranceVoiceLangShort !== utteranceLangShort) { doReset = true; } else if (utteranceLangIsSpecific) { } if (doReset) { utterance.voice = null; } } } utterance.onboundary = function (ev) { if (utterance.r2_cancel) { return; } if (!_dialogState || !_dialogState.ttsQueueItem) { return; } if (utterance.r2_ttsQueueIndex !== _dialogState.ttsQueueItem.iGlobal) { return; } if (ev.name !== "word") { return; } updateTTSInfo(ev.charIndex, ev.charLength, utterance.text); }; var onEnd = function () { if (utterance.r2_cancel) { return; } if (!_dialogState || !_dialogState.ttsQueueItem) { return; } if (utterance.r2_ttsQueueIndex !== _dialogState.ttsQueueItem.iGlobal) { return; } highlights(false); ttsPlayQueueIndexDebounced(ttsQueueIndex + 1); }; utterance.onend = function (_ev) { onEnd(); }; _resumableState = { ensureTwoPageSpreadWithOddColumnsIsOffsetReEnable: _dialogState.ensureTwoPageSpreadWithOddColumnsIsOffsetReEnable, ensureTwoPageSpreadWithOddColumnsIsOffsetTempDisable: _dialogState.ensureTwoPageSpreadWithOddColumnsIsOffsetTempDisable, focusScrollRaw: _dialogState.focusScrollRaw, ttsQueue: _dialogState.ttsQueue, ttsQueueIndex: _dialogState.ttsQueueItem.iGlobal, ttsRootElement: _dialogState.ttsRootElement, }; utterance.r2_cancel = false; setTimeout(function () { win.speechSynthesis.speak(utterance); }, 0); win.document.documentElement.classList.remove(styles_1.TTS_CLASS_PAUSED, styles_1.TTS_CLASS_STOPPED); win.document.documentElement.classList.add(styles_1.TTS_CLASS_PLAYING); if (_dialogState && _dialogState.ttsOverlayEnabled) { win.document.documentElement.classList.add(styles_1.TTS_CLASS_IS_ACTIVE); } electron_1.ipcRenderer.sendToHost(events_1.R2_EVENT_TTS_IS_PLAYING); win.READIUM2.ttsClickEnabled = true; (0, readium_css_1.clearImageZoomOutlineDebounced)(); } exports.ttsPlayQueueIndex = ttsPlayQueueIndex; function startTTSSession(speed, voice, ttsRootElement, ttsQueue, ttsQueueIndexStart, focusScrollRaw, ensureTwoPageSpreadWithOddColumnsIsOffsetTempDisable, ensureTwoPageSpreadWithOddColumnsIsOffsetReEnable) { win.READIUM2.ttsPlaybackRate = speed; win.READIUM2.ttsVoice = voice; var ttsQueueItemStart = (0, dom_text_utils_1.getTtsQueueItemRef)(ttsQueue, ttsQueueIndexStart); if (!ttsQueueItemStart) { ttsStop(); return; } var ttsQueueLength = (0, dom_text_utils_1.getTtsQueueLength)(ttsQueue); var val = win.READIUM2.ttsOverlayEnabled ? ensureTwoPageSpreadWithOddColumnsIsOffsetTempDisable() : undefined; function onDialogClosed(el) { ttsPause(true); if (_dialogState && _dialogState.focusScrollRaw) { var toScrollTo = el; if (_dialogState.ttsQueueItem && _dialogState.ttsQueueItem.item.parentElement) { toScrollTo = _dialogState.ttsQueueItem.item.parentElement; } if (toScrollTo) { _dialogState.focusScrollRaw(toScrollTo, true, false, undefined); } else if (typeof val !== "undefined") { ensureTwoPageSpreadWithOddColumnsIsOffsetReEnable(val); } } else if (typeof val !== "undefined") { ensureTwoPageSpreadWithOddColumnsIsOffsetReEnable(val); } setTimeout(function () { resetState(false); }, 50); } var outerHTML = "<div id=\"".concat(styles_1.TTS_ID_CONTAINER, "\"\n class=\"").concat(styles_1.CSS_CLASS_NO_FOCUS_OUTLINE, " ").concat(styles_1.TTS_CLASS_THEME1, "\"\n dir=\"ltr\"\n lang=\"en\"\n xml:lang=\"en\"\n tabindex=\"0\" autofocus=\"autofocus\"></div>\n").concat(win.READIUM2.ttsOverlayEnabled ? "\n<button id=\"".concat(styles_1.TTS_ID_PREVIOUS, "\" class=\"").concat(styles_1.TTS_NAV_BUTTON_CLASS, "\" title=\"previous\"><span>&#9668;</span></button>\n<button id=\"").concat(styles_1.TTS_ID_NEXT, "\" class=\"").concat(styles_1.TTS_NAV_BUTTON_CLASS, "\" title=\"next\"><span>&#9658;</span></button>\n<input id=\"").concat(styles_1.TTS_ID_SLIDER, "\" type=\"range\" min=\"0\" max=\"").concat(ttsQueueLength - 1, "\" value=\"0\"\n ").concat((0, readium_css_1.isRTL)() ? "dir=\"rtl\"" : "dir=\"ltr\"", " title=\"progress\"/>\n") : "", "\n"); var pop = new popup_dialog_1.PopupDialog(win.document, outerHTML, onDialogClosed, "".concat(styles_1.TTS_POPUP_DIALOG_CLASS).concat(win.READIUM2.ttsOverlayEnabled ? "" : " ".concat(styles_1.POPUP_DIALOG_CLASS_COLLAPSE)), true); pop.show(ttsQueueItemStart.item.parentElement); _dialogState = pop.dialog; if (!_dialogState) { return; } _dialogState.ttsOverlayEnabled = win.READIUM2.ttsOverlayEnabled; _dialogState.focusScrollRaw = focusScrollRaw; _dialogState.ensureTwoPageSpreadWithOddColumnsIsOffsetTempDisable = ensureTwoPageSpreadWithOddColumnsIsOffsetTempDisable; _dialogState.ensureTwoPageSpreadWithOddColumnsIsOffsetReEnable = ensureTwoPageSpreadWithOddColumnsIsOffsetReEnable; _dialogState.ttsRootElement = ttsRootElement; _dialogState.domSlider = win.document.getElementById(styles_1.TTS_ID_SLIDER); _dialogState.domPrevious = win.document.getElementById(styles_1.TTS_ID_PREVIOUS); _dialogState.domNext = win.document.getElementById(styles_1.TTS_ID_NEXT); _dialogState.domText = win.document.getElementById(styles_1.TTS_ID_CONTAINER); _dialogState.ttsQueue = ttsQueue; _dialogState.ttsQueueLength = ttsQueueLength; if (_dialogState.domSlider) { _dialogState.domSlider.addEventListener("input", function (_ev) { if (_dialogState && _dialogState.domSlider) { var n = _dialogState.domSlider.valueAsNumber; ttsPreviewAndEventuallyPlayQueueIndex(n); } }); } if (_dialogState.domPrevious) { _dialogState.domPrevious.addEventListener("click", function (ev) { var skipSentences = ev.shiftKey && ev.altKey; if ((0, readium_css_1.isRTL)()) { ttsNext(skipSentences); } else { ttsPrevious(skipSentences); } }); } if (_dialogState.domNext) { _dialogState.domNext.addEventListener("click", function (ev) { var skipSentences = ev.shiftKey && ev.altKey; if (!(0, readium_css_1.isRTL)()) { ttsNext(skipSentences); } else { ttsPrevious(skipSentences); } }); } if (_dialogState.domText) { _dialogState.domText.addEventListener("click", function (ev) { if (ev.target && _dialogState && _dialogState.ttsQueue && _dialogState.ttsQueueItem) { var indexStr = ev.target.getAttribute(R2_DATA_ATTR_UTTERANCE_INDEX); if (indexStr) { var index = parseInt(indexStr, 10); if (!isNaN(index)) { var ttsQItem = (0, dom_text_utils_1.getTtsQueueItemRef)(_dialogState.ttsQueue, index); if (ttsQItem) { if (ttsQItem.iGlobal !== _dialogState.ttsQueueItem.iGlobal) { ttsPause(true); ttsPlayQueueIndexDebounced(index); return; } } } } } ttsPauseOrResume(); }); } ttsPlayQueueIndexDebounced(ttsQueueIndexStart); } //# sourceMappingURL=readaloud.js.map