UNPKG

@openui5/sap.m

Version:

OpenUI5 UI Library sap.m

114 lines (94 loc) 4.02 kB
/*! * OpenUI5 * (c) Copyright 2009-2023 SAP SE or an SAP affiliate company. * Licensed under the Apache License, Version 2.0 - see LICENSE.txt. */ /* * IMPORTANT: This is a private module, its API must not be used and is subject to change. * Code other than the libraries specified in the restricted flag below must not introduce dependencies to this module. */ sap.ui.define([ "sap/m/inputUtils/wordStartsWithValue", "sap/base/security/encodeXML" ], function (wordStartsWithValue, encodeXML) { "use strict"; /** * Creates highlighted text. * * @private * @param {sap.m.Label} oItemDomRef Label within the input. * @param {string} sInputValue Text to highlight * @param {boolean} bWordMode Whether to highlight single string or to highlight each string that starts with space + sInputValue * @returns {string} newText Created text. */ var _createHighlightedText = function (oItemDomRef, sInputValue, bWordMode) { var sDomRefLowerText, iStartHighlightingIndex, iInputLength, iNextSpaceIndex, sChunk, sText = oItemDomRef ? oItemDomRef.textContent : "", sFormattedText = ""; if (!wordStartsWithValue(sText, sInputValue)) { return encodeXML(sText); } sInputValue = sInputValue.toLowerCase(); iInputLength = sInputValue.length; while (wordStartsWithValue(sText, sInputValue)) { sDomRefLowerText = sText.toLowerCase(); iStartHighlightingIndex = sDomRefLowerText.indexOf(sInputValue); // search for the first word which starts with these characters iStartHighlightingIndex = (iStartHighlightingIndex > 0) ? sDomRefLowerText.indexOf(' ' + sInputValue) + 1 : iStartHighlightingIndex; // Chunk before highlighting sChunk = sText.substring(0, iStartHighlightingIndex); sText = sText.substring(iStartHighlightingIndex); sFormattedText += encodeXML(sChunk); // Highlighting chunk sChunk = sText.substring(0, iInputLength); sText = sText.substring(iInputLength); sFormattedText += '<span class="sapMInputHighlight">' + encodeXML(sChunk) + '</span>'; // Check for repetitive patterns. For example: "prodProdProd prod" should highlight only // the starting of every word, but not the whole string when tested with "prod" input. iNextSpaceIndex = sText.indexOf(" "); iNextSpaceIndex = iNextSpaceIndex === -1 ? sText.length : iNextSpaceIndex; // The rest sChunk = sText.substring(0, iNextSpaceIndex); sText = sText.substring(iNextSpaceIndex); sFormattedText += encodeXML(sChunk); // Run only for the first occurrence when highlighting for the Input for example if (!bWordMode) { break; } } if (sText) { sFormattedText += encodeXML(sText); } return sFormattedText; }; /** * Highlights text in DOM items. * * @param {Array<HTMLElement>} aItemsDomRef DOM elements on which formatting would be applied * @param {string} sInputValue Text to highlight * @param {boolean} bWordMode Whether to highlight single string or to highlight each string that starts with space + sInputValue * @param {int} iLimit Threshold of the items to enable highlighting. Above that limit, highlighting would be disabled due to performance reasons- DOM trashing. Default: 200 * @private * @ui5-restricted sap.m, sap.ui.comp, sap.fe */ var highlightItems = function (aItemsDomRef, sInputValue, bWordMode, iLimit) { var i, highlightedTexts; iLimit = iLimit || 200; if (!sInputValue || // No input value (!aItemsDomRef && !aItemsDomRef.length) || // Performance optimisation. This module causes inevitable DOM thrashing. // We need to limit that thrashing, so when the limit is hit, highlighting would be entirely disabled. aItemsDomRef.length > iLimit) { return; } highlightedTexts = []; for (i = 0; i < aItemsDomRef.length; i++) { highlightedTexts.push(_createHighlightedText(aItemsDomRef[i], sInputValue, bWordMode)); } for (i = 0; i < aItemsDomRef.length; i++) { aItemsDomRef[i].innerHTML = highlightedTexts[i]; } }; return highlightItems; });