highlight-text
Version:
Highlight text case and accent insensitive
51 lines (38 loc) • 1.69 kB
JavaScript
;
exports.__esModule = true;
exports['default'] = highlightText;
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _lodashEscape = require('lodash.escape');
var _lodashEscape2 = _interopRequireDefault(_lodashEscape);
var _mergeRanges = require('merge-ranges');
var _mergeRanges2 = _interopRequireDefault(_mergeRanges);
var _diacritics = require('diacritics');
function allIndexesOf(str, word) {
var indexes = [];
for (var idx = str.indexOf(word); idx !== -1; idx = str.indexOf(word, idx + 1)) {
indexes.push(idx);
}
return indexes;
}
function highlightText(text, highlight) {
var tag = arguments.length <= 2 || arguments[2] === undefined ? 'b' : arguments[2];
var escapedText = _lodashEscape2['default'](text);
var normalizedText = _diacritics.remove(escapedText).toLowerCase();
var highlightIntervals = _lodashEscape2['default'](highlight).split(/(\s+)/).map(function (word) {
return word.trim();
}).filter(function (word) {
return word;
}).reduce(function (intervals, word) {
var normalizedWord = _diacritics.remove(word).toLowerCase();
var wordIntervals = allIndexesOf(normalizedText, normalizedWord).map(function (idx) {
return [idx, idx + normalizedWord.length];
});
return intervals.concat(wordIntervals);
}, []);
return _mergeRanges2['default'](highlightIntervals).reduceRight(function (reducedText, _ref) {
var start = _ref[0];
var end = _ref[1];
return reducedText.slice(0, start) + ('<' + tag + '>') + reducedText.slice(start, end) + ('</' + tag + '>') + reducedText.slice(end);
}, escapedText);
}
module.exports = exports['default'];