Source: components/instant-search/instant-search-item/instant-search-result-item.js

import BaseComponent from "../../base-component";
import Settings from "../../../helpers/settings";

/**
 * Instant search result item
 * @extends BaseComponent
 */
class InstantSearchResultItem extends BaseComponent {
	/**
	 * Build highlight for instant search result label
	 * @param {*} resultItem 
	 * @param {*} searchTerm 
	 */
	_highlightSuggestionResult(resultItem, searchTerm) {
		if (Settings.getSettingValue('search.highlightSuggestionResult') && searchTerm.length > 1 && resultItem) {
			function createRegex(str) {
				return new RegExp(str.replace(/([\(\)\{\}\[\]\.\+\-\=\\\/])/g, '\\$&'), 'ig');
			}
			
			// Find words that are the same with the Search term
			var termElements = searchTerm.split(' ');
			var i;
			var termElementsLength = termElements.length;
			for (i = 0; i < termElementsLength; i++) {
				// Escape the following characters: ( ) { } and .
				var reg = createRegex(termElements[i]);
				var foundWords = resultItem.match(reg);
				if (foundWords !== null && foundWords.length > 0) {
					// Remove duplicate values
					foundWords = foundWords.filter(function(item, pos) {
						return foundWords.indexOf(item) == pos && item != '';
					})
					// Highlight the above words
					var k;
					var foundWordsLength = foundWords.length;
					for (k = 0; k < foundWordsLength; k++) {
						if (foundWords[k].length > 1) {
							var reg = createRegex(foundWords[k]);
							resultItem = resultItem.replace(reg, '<b>' + foundWords[k] + '</b>');
						}
					}
				}
			}
		}
		return resultItem;
	};
}

export default InstantSearchResultItem;