UNPKG

upfront-editable

Version:
127 lines (101 loc) 3.74 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _jquery = require('jquery'); var _jquery2 = _interopRequireDefault(_jquery); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var WordHighlighting = 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, _classCallCheck3.default)(this, WordHighlighting); this.marker = markerNode; this.matchMode = matchMode; } (0, _createClass3.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 = void 0; 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 = void 0; var matchedText = void 0; 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 = _jquery2.default.map(words, function (word) { return escapeRegEx(word); }); var regex = '(' + 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 = _jquery2.default.map(words, function (word) { return escapeRegEx(word); }); // (notLetter|^)(words)(?=notLetter|$) var regex = '([^' + letterChars + ']|^)' + ('(' + escapedWords.join('|') + ')') + ('(?=[^' + letterChars + ']|$)'); return new RegExp(regex, 'g'); } function escapeRegEx(s) { return String(s).replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'); }