UNPKG

upfront-editable

Version:
121 lines (98 loc) 3.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _jquery = _interopRequireDefault(require("jquery")); var WordHighlighting = /*#__PURE__*/function () { // @param markerNode {DOM Node} // @param matchMode {String} either 'word' or 'text' function WordHighlighting(markerNode) { var matchMode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'word'; (0, _classCallCheck2["default"])(this, WordHighlighting); this.marker = markerNode; this.matchMode = matchMode; } (0, _createClass2["default"])(WordHighlighting, [{ key: "findMatches", value: function findMatches(text, highlights) { if (!text) return; if (highlights && highlights.length > 0) { return this.searchMatches(text, highlights); } } }, { key: "searchMatches", value: function searchMatches(text, highlights) { var _this = this; var createRegex = this.matchMode === 'word' ? createWordRegex : createHighlightRegex; var regex = createRegex(highlights); var matches = []; var match; while (match = regex.exec(text)) { matches.push(match); } return matches.map(function (entry) { return _this.prepareMatch(entry); }); } }, { key: "prepareMatch", value: function prepareMatch(match) { var startIndex; var matchedText; if (this.matchMode === 'word') { startIndex = match.index + match[1].length; matchedText = match[2]; } else { startIndex = match.index; matchedText = match[0]; } return { startIndex: startIndex, endIndex: startIndex + matchedText.length, match: matchedText, marker: this.marker }; } }]); return WordHighlighting; }(); exports["default"] = WordHighlighting; function createHighlightRegex(words) { var escapedWords = _jquery["default"].map(words, function (word) { return escapeRegEx(word); }); var regex = "(".concat(escapedWords.join('|'), ")"); return new RegExp(regex, 'g'); } // Regex to find whole words within a string // // Unicode character blocks for letters. // See: http://jrgraphix.net/research/unicode_blocks.php // // \\u0041-\\u005A A-Z (Basic Latin) // \\u0061-\\u007A a-z (Basic Latin) // \\u0030-\\u0039 0-9 (Basic Latin) // \\u00AA ª (Latin-1 Supplement) // \\u00B5 µ (Latin-1 Supplement) // \\u00BA º (Latin-1 Supplement) // \\u00C0-\\u00D6 À-Ö (Latin-1 Supplement) // \\u00D8-\\u00F6 Ø-ö (Latin-1 Supplement) // \\u00F8-\\u00FF ø-ÿ (Latin-1 Supplement) // \\u0100-\\u017F Ā-ſ (Latin Extended-A) // \\u0180-\\u024F ƀ-ɏ (Latin Extended-B) var letterChars = "\\u0041-\\u005A\\u0061-\\u007A\\u0030-\\u0039\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u00FF\\u0100-\\u017F\\u0180-\\u024F"; function createWordRegex(words) { var escapedWords = _jquery["default"].map(words, function (word) { return escapeRegEx(word); }); // (notLetter|^)(words)(?=notLetter|$) var regex = "([^".concat(letterChars, "]|^)") + "(".concat(escapedWords.join('|'), ")") + "(?=[^".concat(letterChars, "]|$)"); return new RegExp(regex, 'g'); } function escapeRegEx(s) { return String(s).replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'); } module.exports = exports.default;