upfront-editable
Version:
Friendly contenteditable API
127 lines (101 loc) • 3.74 kB
JavaScript
;
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');
}