/** * Search for settings that match the search string and highlight them. */ async function searchSettings() { removeHighlighting(); // Remove previous highlights const searchString = String($("#settingsSearch").val()); const searchableText = $("#user-settings-block-content"); // Get the HTML block if (searchString.trim() !== "") { highlightMatchingElements(searchableText[0], searchString); // Highlight matching elements } } /** * Check if the element is a child of a header element * @param {HTMLElement | Text | Document | Comment} element Settings block HTML element * @returns {boolean} True if the element is a child of a header element, false otherwise */ function isParentHeader(element) { return $(element).closest('h4, h3').length > 0; } /** * Recursively highlight elements that match the search string * @param {HTMLElement | Text | Document | Comment} element Settings block HTML element * @param {string} searchString Search string */ function highlightMatchingElements(element, searchString) { $(element).contents().each(function () { const isTextNode = this.nodeType === Node.TEXT_NODE; const isElementNode = this.nodeType === Node.ELEMENT_NODE; if (isTextNode && this.nodeValue.trim() !== "" && !isParentHeader(this)) { const parentElement = $(this).parent(); const elementText = this.nodeValue; if (elementText.toLowerCase().includes(searchString.toLowerCase())) { parentElement.addClass('highlighted'); // Add CSS class to highlight matched elements } } else if (isElementNode && !$(this).is("h4")) { highlightMatchingElements(this, searchString); } }); } /** * Remove highlighting from previously highlighted elements. */ function removeHighlighting() { $(".highlighted").removeClass("highlighted"); // Remove CSS class from previously highlighted elements } jQuery(() => { $('#settingsSearch').on('input change', searchSettings); });