UNPKG

tc-ui-toolkit

Version:

React components used to develop tools for the desktop app translationCore

142 lines (116 loc) 14.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getAlignedText = exports.getQuoteAsArray = void 0; var BREAK_CHAR = '&'; var DEFAULT_SEPARATOR = ' '; /** * gets the quote as an array of occurrences * @param {Array|String} quote * @param {int} occurrenceToMatch * @return {Array} */ var getQuoteAsArray = function getQuoteAsArray(quote, occurrenceToMatch) { var quoteArray = quote; if (typeof quote === 'string') { // should only be string in case of single word quote, otherwise is an array quoteArray = quote.split(' '); quoteArray = quoteArray.map(function (word) { return { word: word, occurrence: occurrenceToMatch }; }); } return quoteArray; }; /** * see if occurrence of verseObject is a match to `match`. If match occurrence is -1, it will match all occurrences in verse * @param {object} verseObject * @param {object} match * @returns {boolean} */ exports.getQuoteAsArray = getQuoteAsArray; function isOccurrenceMatch(verseObject, match) { var isMatch = verseObject.occurrence === match.occurrence || match.occurrence === -1; return isMatch; } /** * getAlignedText - returns a string of the text found in an array of verseObjects that matches the words to find * and their occurrence in the verse. * @param {Array} verseObjects * @param {Array|String} quote * @param {int} occurrenceToMatch * @param {boolean} isMatch - if true, all verseObjects will be considered a match and will be included in the returned text */ var getAlignedText = function getAlignedText(verseObjects, quote, occurrenceToMatch) { var isMatch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false; var text = ''; if (!verseObjects || !quote || !occurrenceToMatch) { return text; } var wordsToMatch = getQuoteAsArray(quote, occurrenceToMatch); var separator = DEFAULT_SEPARATOR; var needsBreak = false; var _loop = function _loop(i, l) { var verseObject = verseObjects[i]; var lastMatch = false; if (verseObject.type === 'milestone' || verseObject.type === 'word') { // It is a milestone or a word...we want to handle all of them. if (isMatch || wordsToMatch.find(function (item) { return verseObject.content === item.word && isOccurrenceMatch(verseObject, item); })) { lastMatch = true; // We have a match (or previously had a match in the parent) so we want to include all text that we find, if (needsBreak) { // Need to add an ellipsis to the separator since a previous match but not one right next to this one separator += BREAK_CHAR + DEFAULT_SEPARATOR; needsBreak = false; } if (text) { // There has previously been text, so append the separator, either a space or punctuation text += separator; } separator = DEFAULT_SEPARATOR; // reset the separator for the next word if (verseObject.text) { // Handle type word, appending the text from this node text += verseObject.text; } if (verseObject.children) { // Handle children of type milestone, appending all the text of the children, isMatch is true text += getAlignedText(verseObject.children, wordsToMatch, occurrenceToMatch, true); } } else if (verseObject.children) { // Did not find a match, yet still need to go through all the children and see if there's match. // If there isn't a match here, i.e. childText is empty, and we have text, we still need // an ellipsis if a later match is found since there was some text here var childText = getAlignedText(verseObject.children, wordsToMatch, occurrenceToMatch, isMatch); if (childText) { lastMatch = true; if (needsBreak) { separator += BREAK_CHAR + DEFAULT_SEPARATOR; needsBreak = false; } text += (text ? separator : '') + childText; separator = DEFAULT_SEPARATOR; } else if (text) { needsBreak = true; } } } if (lastMatch && verseObjects[i + 1] && verseObjects[i + 1].type === 'text' && text) { // Found some text that is a word separator/punctuation, e.g. the apostrophe between "God" and "s" for "God's" // We want to preserve this so we can show "God's" instead of "God ... s" if (separator === DEFAULT_SEPARATOR) { separator = ''; } separator += verseObjects[i + 1].text; } }; for (var i = 0, l = verseObjects.length; i < l; i++) { _loop(i, l); } return text; }; exports.getAlignedText = getAlignedText; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9WZXJzZUNoZWNrL2hlbHBlcnMvY2hlY2tBcmVhSGVscGVycy5qcyJdLCJuYW1lcyI6WyJCUkVBS19DSEFSIiwiREVGQVVMVF9TRVBBUkFUT1IiLCJnZXRRdW90ZUFzQXJyYXkiLCJxdW90ZSIsIm9jY3VycmVuY2VUb01hdGNoIiwicXVvdGVBcnJheSIsInNwbGl0IiwibWFwIiwid29yZCIsIm9jY3VycmVuY2UiLCJpc09jY3VycmVuY2VNYXRjaCIsInZlcnNlT2JqZWN0IiwibWF0Y2giLCJpc01hdGNoIiwiZ2V0QWxpZ25lZFRleHQiLCJ2ZXJzZU9iamVjdHMiLCJ0ZXh0Iiwid29yZHNUb01hdGNoIiwic2VwYXJhdG9yIiwibmVlZHNCcmVhayIsImkiLCJsIiwibGFzdE1hdGNoIiwidHlwZSIsImZpbmQiLCJpdGVtIiwiY29udGVudCIsImNoaWxkcmVuIiwiY2hpbGRUZXh0IiwibGVuZ3RoIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxJQUFNQSxVQUFVLEdBQUcsR0FBbkI7QUFDQSxJQUFNQyxpQkFBaUIsR0FBRyxHQUExQjtBQUVBOzs7Ozs7O0FBTU8sSUFBTUMsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixDQUFDQyxLQUFELEVBQVFDLGlCQUFSLEVBQThCO0FBQzNELE1BQUlDLFVBQVUsR0FBR0YsS0FBakI7O0FBRUEsTUFBSSxPQUFPQSxLQUFQLEtBQWdCLFFBQXBCLEVBQThCO0FBQUU7QUFDOUJFLElBQUFBLFVBQVUsR0FBR0YsS0FBSyxDQUFDRyxLQUFOLENBQVksR0FBWixDQUFiO0FBQ0FELElBQUFBLFVBQVUsR0FBR0EsVUFBVSxDQUFDRSxHQUFYLENBQWUsVUFBQUMsSUFBSTtBQUFBLGFBQUs7QUFBRUEsUUFBQUEsSUFBSSxFQUFKQSxJQUFGO0FBQVFDLFFBQUFBLFVBQVUsRUFBRUw7QUFBcEIsT0FBTDtBQUFBLEtBQW5CLENBQWI7QUFDRDs7QUFDRCxTQUFPQyxVQUFQO0FBQ0QsQ0FSTTtBQVVQOzs7Ozs7Ozs7O0FBTUEs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QUFBLFVBQVUsR0FBRyxJQUFiO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFFBQUtHLFNBQVMsSUFBSVAsWUFBWSxDQUFDSyxDQUFDLEdBQUcsQ0FBTCxDQUF6QixJQUFvQ0wsWUFBWSxDQUFDSyxDQUFDLEdBQUcsQ0FBTCxDQUFaLENBQW9CRyxJQUFwQixLQUE2QixNQUFqRSxJQUEyRVAsSUFBaEYsRUFBc0Y7QUFDcEY7QUFDQTtBQUNBLFVBQUlFLFNBQVMsS0FBS2pCLGlCQUFsQixFQUFxQztBQUNuQ2lCLFFBQUFBLFNBQVMsR0FBRyxFQUFaO0FBQ0Q7O0FBQ0RBLE1BQUFBLFNBQVMsSUFBSUgsWUFBWSxDQUFDSyxDQUFDLEdBQUcsQ0FBTCxDQUFaLENBQW9CSixJQUFqQztBQUNEO0FBdEVvRjs7QUFXdkYsT0FBSyxJQUFJSSxDQUFDLEdBQUcsQ0FBUixFQUFXQyxDQUFDLEdBQUdOLFlBQVksQ0FBQ2MsTUFBakMsRUFBeUNULENBQUMsR0FBR0MsQ0FBN0MsRUFBZ0RELENBQUMsRUFBakQsRUFBcUQ7QUFBQSxVQUE1Q0EsQ0FBNEMsRUFBckNDLENBQXFDO0FBNERwRDs7QUFDRCxTQUFPTCxJQUFQO0FBQ0QsQ0F6RU0iLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBCUkVBS19DSEFSID0gJyYnO1xuY29uc3QgREVGQVVMVF9TRVBBUkFUT1IgPSAnICc7XG5cbi8qKlxuICogZ2V0cyB0aGUgcXVvdGUgYXMgYW4gYXJyYXkgb2Ygb2NjdXJyZW5jZXNcbiAqIEBwYXJhbSB7QXJyYXl8U3RyaW5nfSBxdW90ZVxuICogQHBhcmFtIHtpbnR9IG9jY3VycmVuY2VUb01hdGNoXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFF1b3RlQXNBcnJheSA9IChxdW90ZSwgb2NjdXJyZW5jZVRvTWF0Y2gpID0+IHtcbiAgbGV0IHF1b3RlQXJyYXkgPSBxdW90ZTtcblxuICBpZiAodHlwZW9mIHF1b3RlID09PSdzdHJpbmcnKSB7IC8vIHNob3VsZCBvbmx5IGJlIHN0cmluZyBpbiBjYXNlIG9mIHNpbmdsZSB3b3JkIHF1b3RlLCBvdGhlcndpc2UgaXMgYW4gYXJyYXlcbiAgICBxdW90ZUFycmF5ID0gcXVvdGUuc3BsaXQoJyAnKTtcbiAgICBxdW90ZUFycmF5ID0gcXVvdGVBcnJheS5tYXAod29yZCA9PiAoeyB3b3JkLCBvY2N1cnJlbmNlOiBvY2N1cnJlbmNlVG9NYXRjaCB9KSk7XG4gIH1cbiAgcmV0dXJuIHF1b3RlQXJyYXk7XG59O1xuXG4vKipcbiAqIHNlZSBpZiBvY2N1cnJlbmNlIG9mIHZlcnNlT2JqZWN0IGlzIGEgbWF0Y2ggdG8gYG1hdGNoYC4gIElmIG1hdGNoIG9jY3VycmVuY2UgaXMgLTEsIGl0IHdpbGwgbWF0Y2ggYWxsIG9jY3VycmVuY2VzIGluIHZlcnNlXG4gKiBAcGFyYW0ge29iamVjdH0gdmVyc2VPYmplY3RcbiAqIEBwYXJhbSB7b2JqZWN0fSBtYXRjaFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmZ1bmN0aW9uIGlzT2NjdXJyZW5jZU1hdGNoKHZlcnNlT2JqZWN0LCBtYXRjaCkge1xuICBjb25zdCBpc01hdGNoID0gKHZlcnNlT2JqZWN0Lm9jY3VycmVuY2UgPT09IG1hdGNoLm9jY3VycmVuY2UpIHx8IChtYXRjaC5vY2N1cnJlbmNlID09PSAtMSk7XG4gIHJldHVybiBpc01hdGNoO1xufVxuXG4vKipcbiAqIGdldEFsaWduZWRUZXh0IC0gcmV0dXJucyBhIHN0cmluZyBvZiB0aGUgdGV4dCBmb3VuZCBpbiBhbiBhcnJheSBvZiB2ZXJzZU9iamVjdHMgdGhhdCBtYXRjaGVzIHRoZSB3b3JkcyB0byBmaW5kXG4gKiAgICAgICAgICAgICAgICAgIGFuZCB0aGVpciBvY2N1cnJlbmNlIGluIHRoZSB2ZXJzZS5cbiAqIEBwYXJhbSB7QXJyYXl9IHZlcnNlT2JqZWN0c1xuICogQHBhcmFtIHtBcnJheXxTdHJpbmd9IHF1b3RlXG4gKiBAcGFyYW0ge2ludH0gb2NjdXJyZW5jZVRvTWF0Y2hcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNNYXRjaCAtIGlmIHRydWUsIGFsbCB2ZXJzZU9iamVjdHMgd2lsbCBiZSBjb25zaWRlcmVkIGEgbWF0Y2ggYW5kIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJldHVybmVkIHRleHRcbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFsaWduZWRUZXh0ID0gKHZlcnNlT2JqZWN0cywgcXVvdGUsIG9jY3VycmVuY2VUb01hdGNoLCBpc01hdGNoPWZhbHNlKSA9PiB7XG4gIGxldCB0ZXh0ID0gJyc7XG5cbiAgaWYgKCEgdmVyc2VPYmplY3RzIHx8ICEgcXVvdGUgfHwgISBvY2N1cnJlbmNlVG9NYXRjaCkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgY29uc3Qgd29yZHNUb01hdGNoID0gZ2V0UXVvdGVBc0FycmF5KHF1b3RlLCBvY2N1cnJlbmNlVG9NYXRjaCk7XG4gIGxldCBzZXBhcmF0b3IgPSBERUZBVUxUX1NFUEFSQVRPUjtcbiAgbGV0IG5lZWRzQnJlYWsgPSBmYWxzZTtcblxuICBmb3IgKGxldCBpID0gMCwgbCA9IHZlcnNlT2JqZWN0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBjb25zdCB2ZXJzZU9iamVjdCA9IHZlcnNlT2JqZWN0c1tpXTtcbiAgICBsZXQgbGFzdE1hdGNoID0gZmFsc2U7XG5cbiAgICBpZiAoKHZlcnNlT2JqZWN0LnR5cGUgPT09ICdtaWxlc3RvbmUnIHx8IHZlcnNlT2JqZWN0LnR5cGUgPT09ICd3b3JkJykpIHtcbiAgICAgIC8vIEl0IGlzIGEgbWlsZXN0b25lIG9yIGEgd29yZC4uLndlIHdhbnQgdG8gaGFuZGxlIGFsbCBvZiB0aGVtLlxuICAgICAgaWYgKGlzTWF0Y2ggfHwgd29yZHNUb01hdGNoLmZpbmQoaXRlbSA9PiAodmVyc2VPYmplY3QuY29udGVudCA9PT0gaXRlbS53b3JkKSAmJiBpc09jY3VycmVuY2VNYXRjaCh2ZXJzZU9iamVjdCwgaXRlbSkpKSB7XG4gICAgICAgIGxhc3RNYXRjaCA9IHRydWU7XG5cbiAgICAgICAgLy8gV2UgaGF2ZSBhIG1hdGNoIChvciBwcmV2aW91c2x5IGhhZCBhIG1hdGNoIGluIHRoZSBwYXJlbnQpIHNvIHdlIHdhbnQgdG8gaW5jbHVkZSBhbGwgdGV4dCB0aGF0IHdlIGZpbmQsXG4gICAgICAgIGlmIChuZWVkc0JyZWFrKSB7XG4gICAgICAgICAgLy8gTmVlZCB0byBhZGQgYW4gZWxsaXBzaXMgdG8gdGhlIHNlcGFyYXRvciBzaW5jZSBhIHByZXZpb3VzIG1hdGNoIGJ1dCBub3Qgb25lIHJpZ2h0IG5leHQgdG8gdGhpcyBvbmVcbiAgICAgICAgICBzZXBhcmF0b3IgKz0gQlJFQUtfQ0hBUitERUZBVUxUX1NFUEFSQVRPUjtcbiAgICAgICAgICBuZWVkc0JyZWFrID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgIC8vIFRoZXJlIGhhcyBwcmV2aW91c2x5IGJlZW4gdGV4dCwgc28gYXBwZW5kIHRoZSBzZXBhcmF0b3IsIGVpdGhlciBhIHNwYWNlIG9yIHB1bmN0dWF0aW9uXG4gICAgICAgICAgdGV4dCArPSBzZXBhcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgc2VwYXJhdG9yID0gREVGQVVMVF9TRVBBUkFUT1I7IC8vIHJlc2V0IHRoZSBzZXBhcmF0b3IgZm9yIHRoZSBuZXh0IHdvcmRcblxuICAgICAgICBpZiAodmVyc2VPYmplY3QudGV4dCkge1xuICAgICAgICAgIC8vIEhhbmRsZSB0eXBlIHdvcmQsIGFwcGVuZGluZyB0aGUgdGV4dCBmcm9tIHRoaXMgbm9kZVxuICAgICAgICAgIHRleHQgKz0gdmVyc2VPYmplY3QudGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2ZXJzZU9iamVjdC5jaGlsZHJlbikge1xuICAgICAgICAgIC8vIEhhbmRsZSBjaGlsZHJlbiBvZiB0eXBlIG1pbGVzdG9uZSwgYXBwZW5kaW5nIGFsbCB0aGUgdGV4dCBvZiB0aGUgY2hpbGRyZW4sIGlzTWF0Y2ggaXMgdHJ1ZVxuICAgICAgICAgIHRleHQgKz0gZ2V0QWxpZ25lZFRleHQodmVyc2VPYmplY3QuY2hpbGRyZW4sIHdvcmRzVG9NYXRjaCwgb2NjdXJyZW5jZVRvTWF0Y2gsIHRydWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHZlcnNlT2JqZWN0LmNoaWxkcmVuKSB7XG4gICAgICAgIC8vIERpZCBub3QgZmluZCBhIG1hdGNoLCB5ZXQgc3RpbGwgbmVlZCB0byBnbyB0aHJvdWdoIGFsbCB0aGUgY2hpbGRyZW4gYW5kIHNlZSBpZiB0aGVyZSdzIG1hdGNoLlxuICAgICAgICAvLyBJZiB0aGVyZSBpc24ndCBhIG1hdGNoIGhlcmUsIGkuZS4gY2hpbGRUZXh0IGlzIGVtcHR5LCBhbmQgd2UgaGF2ZSB0ZXh0LCB3ZSBzdGlsbCBuZWVkXG4gICAgICAgIC8vIGFuIGVsbGlwc2lzIGlmIGEgbGF0ZXIgbWF0Y2ggaXMgZm91bmQgc2luY2UgdGhlcmUgd2FzIHNvbWUgdGV4dCBoZXJlXG4gICAgICAgIGxldCBjaGlsZFRleHQgPSBnZXRBbGlnbmVkVGV4dCh2ZXJzZU9iamVjdC5jaGlsZHJlbiwgd29yZHNUb01hdGNoLCBvY2N1cnJlbmNlVG9NYXRjaCwgaXNNYXRjaCk7XG5cbiAgICAgICAgaWYgKGNoaWxkVGV4dCkge1xuICAgICAgICAgIGxhc3RNYXRjaCA9IHRydWU7XG5cbiAgICAgICAgICBpZiAobmVlZHNCcmVhaykge1xuICAgICAgICAgICAgc2VwYXJhdG9yICs9IEJSRUFLX0NIQVIrREVGQVVMVF9TRVBBUkFUT1I7XG4gICAgICAgICAgICBuZWVkc0JyZWFrID0gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRleHQgKz0gKHRleHQ/c2VwYXJhdG9yOicnKSArIGNoaWxkVGV4dDtcbiAgICAgICAgICBzZXBhcmF0b3IgPSBERUZBVUxUX1NFUEFSQVRPUjtcbiAgICAgICAgfSBlbHNlIGlmICh0ZXh0KSB7XG4gICAgICAgICAgbmVlZHNCcmVhayA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIGxhc3RNYXRjaCAmJiB2ZXJzZU9iamVjdHNbaSArIDFdICYmIHZlcnNlT2JqZWN0c1tpICsgMV0udHlwZSA9PT0gJ3RleHQnICYmIHRleHQpIHtcbiAgICAgIC8vIEZvdW5kIHNvbWUgdGV4dCB0aGF0IGlzIGEgd29yZCBzZXBhcmF0b3IvcHVuY3R1YXRpb24sIGUuZy4gdGhlIGFwb3N0cm9waGUgYmV0d2VlbiBcIkdvZFwiIGFuZCBcInNcIiBmb3IgXCJHb2Qnc1wiXG4gICAgICAvLyBXZSB3YW50IHRvIHByZXNlcnZlIHRoaXMgc28gd2UgY2FuIHNob3cgXCJHb2Qnc1wiIGluc3RlYWQgb2YgXCJHb2QgLi4uIHNcIlxuICAgICAgaWYgKHNlcGFyYXRvciA9PT0gREVGQVVMVF9TRVBBUkFUT1IpIHtcbiAgICAgICAgc2VwYXJhdG9yID0gJyc7XG4gICAgICB9XG4gICAgICBzZXBhcmF0b3IgKz0gdmVyc2VPYmplY3RzW2kgKyAxXS50ZXh0O1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGV4dDtcbn07XG4iXX0=