upfront-editable
Version:
Friendly contenteditable API
121 lines (98 loc) • 3.7 kB
JavaScript
;
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;