diff --git a/doc/changelog.d/798.added.md b/doc/changelog.d/798.added.md new file mode 100644 index 000000000..3000c75e8 --- /dev/null +++ b/doc/changelog.d/798.added.md @@ -0,0 +1 @@ +Cleanup \`\`js\`\` diff --git a/src/ansys_sphinx_theme/theme/ansys_sphinx_theme/components/announcement_version.html b/src/ansys_sphinx_theme/theme/ansys_sphinx_theme/components/announcement_version.html index c35ede7ce..e43b34778 100644 --- a/src/ansys_sphinx_theme/theme/ansys_sphinx_theme/components/announcement_version.html +++ b/src/ansys_sphinx_theme/theme/ansys_sphinx_theme/components/announcement_version.html @@ -1,5 +1,11 @@ -
+ + + diff --git a/src/ansys_sphinx_theme/theme/ansys_sphinx_theme/components/cheatsheet_sidebar.html b/src/ansys_sphinx_theme/theme/ansys_sphinx_theme/components/cheatsheet_sidebar.html index 634a7884c..badd7cd1c 100644 --- a/src/ansys_sphinx_theme/theme/ansys_sphinx_theme/components/cheatsheet_sidebar.html +++ b/src/ansys_sphinx_theme/theme/ansys_sphinx_theme/components/cheatsheet_sidebar.html @@ -1,13 +1,19 @@ + +{# + Cheatsheet Sidebar + Displays a cheatsheet link and thumbnail in the sidebar if configured. + UsesNo results found.
"; return; } - const highlightedResults = highlightResults(mergedResults, query); displayResults(highlightedResults); } + /** + * Highlight search query in the results. + * @param {Array} results - Array of result objects. + * @param {string} query - Search query. + * @returns {Array} Highlighted results. + */ function highlightResults(results, query) { const regex = new RegExp(`(${query})`, "gi"); - return results .map((result) => { const matchIndex = result.text .toLowerCase() .indexOf(query.toLowerCase()); if (matchIndex === -1) return null; - const contextLength = 100; const start = Math.max(0, matchIndex - contextLength); const end = Math.min(result.text.length, matchIndex + contextLength); let snippet = result.text.slice(start, end); - if (start > 0) snippet = "…" + snippet; if (end < result.text.length) snippet += "…"; - return { ...result, title: result.title.replace( @@ -418,47 +390,51 @@ require(["fuse"], function (Fuse) { } /** - * Displays the final search results on the UI. + * Display the final search results on the UI. + * @param {Array} results - Array of result objects. */ function displayResults(results) { const container = document.getElementById("search-results"); container.innerHTML = ""; - results.forEach((item) => { const div = document.createElement("div"); div.className = "result-item"; - const title = document.createElement("a"); title.href = item.href || item.link || "#"; title.target = "_blank"; title.innerHTML = item.title || "Untitled"; title.className = "result-title"; - div.appendChild(title); - if (item.text) { const text = document.createElement("p"); text.innerHTML = item.text; text.className = "result-text"; div.appendChild(text); } - if (item.source) { const source = document.createElement("p"); source.className = "checkmark"; source.textContent = `Source: ${item.source}`; div.appendChild(source); } - container.appendChild(div); }); } + /** + * Get the selected result limit from the dropdown. + * @returns {number} Result limit. + */ function getSelectedResultLimit() { const select = document.getElementById("result-limit"); - return parseInt(select.value, 10) || 10; // default to 10 if not set + return parseInt(select.value, 10) || 10; } + // --- Event Handlers and Initialization --- + + /** + * Debounced handler for search input changes. + */ const handleSearchInput = debounce( () => { const query = document.getElementById("search-input").value.trim(); @@ -469,7 +445,11 @@ require(["fuse"], function (Fuse) { parseInt(SEARCH_OPTIONS.delay) || 300, ); - // Utility to get element by ID + /** + * Utility to get element by ID. + * @param {string} id - Element ID. + * @returns {HTMLElement} DOM element. + */ const $ = (id) => document.getElementById(id); // Elements @@ -483,7 +463,9 @@ require(["fuse"], function (Fuse) { searchInput.value = initialQuery; } - // Unified search trigger + /** + * Unified search trigger for input events. + */ const triggerSearch = () => { const query = searchInput.value.trim(); if (query) { diff --git a/src/ansys_sphinx_theme/theme/ansys_sphinx_theme/static/js/search.js b/src/ansys_sphinx_theme/theme/ansys_sphinx_theme/static/js/search.js index 23b81b80d..d6cef2af1 100644 --- a/src/ansys_sphinx_theme/theme/ansys_sphinx_theme/static/js/search.js +++ b/src/ansys_sphinx_theme/theme/ansys_sphinx_theme/static/js/search.js @@ -6,10 +6,10 @@ const MAIN_PAGE_CONTENT = document.querySelector(".bd-main"); const FUSE_VERSION = "6.4.6"; let SEARCH_BAR, - RESULTS, + RESULTS_CONTAINER, SEARCH_INPUT, CURRENT_INDEX = -1, - fuse; + fuseInstance; /** * Load fuse.js from CDN and initialize search functionality. @@ -20,8 +20,13 @@ require.config({ }, }); -require(["fuse"], function (Fuse) { - // Debounce utility +require(["fuse"], (Fuse) => { + /** + * Debounce utility to limit function execution rate. + * @param {Function} func + * @param {number} delay + * @returns {Function} + */ const debounce = (func, delay) => { let timeout; return (...args) => { @@ -30,25 +35,39 @@ require(["fuse"], function (Fuse) { }; }; - // Truncate text for preview + /** + * Truncate text for preview. + * @param {string} text + * @param {number} maxLength + * @returns {string} + */ const truncateTextPreview = (text, maxLength = 200) => text.length <= maxLength ? text : `${text.slice(0, maxLength)}...`; - // Get full path using Sphinx's data-content_root + /** + * Get full path using Sphinx's data-content_root. + * @param {string} targetFile + * @returns {string} + */ const getDynamicPath = (targetFile) => { const contentRoot = document.documentElement.getAttribute("data-content_root"); return `${contentRoot}${targetFile}`; }; - // Navigate to a given URL + /** + * Navigate to a given URL. + * @param {string} href + */ const navigateToHref = (href) => { window.location.href = getDynamicPath(href); }; - // Expand the search input UI + /** + * Expand the search input UI. + */ function expandSearchInput() { - RESULTS.style.display = "flex"; + RESULTS_CONTAINER.style.display = "flex"; SEARCH_INPUT.classList.add("expanded"); MAIN_PAGE_CONTENT.classList.add("blurred"); SEARCH_INPUT.focus(); @@ -60,9 +79,11 @@ require(["fuse"], function (Fuse) { if (modalSidebar) modalSidebar.style.opacity = "0.1"; } - // Collapse and reset the search UI + /** + * Collapse and reset the search UI. + */ function collapseSearchInput() { - RESULTS.style.display = "none"; + RESULTS_CONTAINER.style.display = "none"; SEARCH_INPUT.classList.remove("expanded"); SEARCH_INPUT.value = ""; MAIN_PAGE_CONTENT.classList.remove("blurred"); @@ -74,32 +95,39 @@ require(["fuse"], function (Fuse) { if (modalSidebar) modalSidebar.style.opacity = "1"; } - // Show banner when no results found + /** + * Show banner when no results found. + */ function noResultsFoundBanner() { - RESULTS.innerHTML = ""; - RESULTS.style.display = "flex"; + RESULTS_CONTAINER.innerHTML = ""; + RESULTS_CONTAINER.style.display = "flex"; const banner = document.createElement("div"); banner.className = "warning-banner"; banner.textContent = "No results found. Press Ctrl+Enter for extended search."; banner.style.fontStyle = "italic"; - RESULTS.appendChild(banner); + RESULTS_CONTAINER.appendChild(banner); } - // Show a temporary searching indicator + /** + * Show a temporary searching indicator. + */ function searchingForResultsBanner() { - RESULTS.innerHTML = ""; - RESULTS.style.display = "flex"; + RESULTS_CONTAINER.innerHTML = ""; + RESULTS_CONTAINER.style.display = "flex"; const banner = document.createElement("div"); banner.className = "searching-banner"; banner.textContent = "Searching..."; banner.style.fontStyle = "italic"; - RESULTS.appendChild(banner); + RESULTS_CONTAINER.appendChild(banner); } - // Display search results from Fuse + /** + * Display search results from Fuse. + * @param {Array} results + */ function displayResults(results) { - RESULTS.innerHTML = ""; + RESULTS_CONTAINER.innerHTML = ""; if (!results.length) return noResultsFoundBanner(); const fragment = document.createDocumentFragment(); @@ -136,11 +164,14 @@ require(["fuse"], function (Fuse) { }); fragment.appendChild(advancedSearchItem); - RESULTS.appendChild(fragment); - RESULTS.style.display = "flex"; + RESULTS_CONTAINER.appendChild(fragment); + RESULTS_CONTAINER.style.display = "flex"; } - // Focus the currently selected result item + /** + * Focus the currently selected result item. + * @param {NodeList} resultsItems + */ function focusSelected(resultsItems) { if (CURRENT_INDEX >= 0 && CURRENT_INDEX < resultsItems.length) { resultsItems.forEach((item) => item.classList.remove("selected")); @@ -151,23 +182,12 @@ require(["fuse"], function (Fuse) { } } - // Handle search query input with debounce - const handleSearchInput = debounce( - () => { - const query = SEARCH_INPUT.value.trim(); - if (!query) return (RESULTS.style.display = "none"); - - const searchResults = fuse.search(query, { - limit: parseInt(SEARCH_OPTIONS.limit), - }); - displayResults(searchResults); - }, - parseInt(SEARCH_OPTIONS.delay) || 300, - ); - - // Handle keyboard navigation inside search input + /** + * Handle keyboard navigation inside search input. + * @param {KeyboardEvent} event + */ function handleKeyDownSearchInput(event) { - const resultItems = RESULTS.querySelectorAll(".result-item"); + const resultItems = RESULTS_CONTAINER.querySelectorAll(".result-item"); switch (event.key) { case "Tab": event.preventDefault(); @@ -214,24 +234,42 @@ require(["fuse"], function (Fuse) { ) { searchingForResultsBanner(); } else { - RESULTS.style.display = "none"; + RESULTS_CONTAINER.style.display = "none"; } handleSearchInput(); } } - // Initialize and bind search elements + /** + * Handle search query input with debounce. + */ + const handleSearchInput = debounce( + () => { + const query = SEARCH_INPUT.value.trim(); + if (!query) return (RESULTS_CONTAINER.style.display = "none"); + + const searchResults = fuseInstance.search(query, { + limit: parseInt(SEARCH_OPTIONS.limit), + }); + displayResults(searchResults); + }, + parseInt(SEARCH_OPTIONS.delay) || 300, + ); + + /** + * Initialize and bind search elements. + */ function setupSearchElements() { if (window.innerWidth < 1200) { SEARCH_BAR = document.querySelector( "div.sidebar-header-items__end #search-bar", ); - RESULTS = document.querySelector( + RESULTS_CONTAINER = document.querySelector( "div.sidebar-header-items__end .static-search-results", ); } else { SEARCH_BAR = document.getElementById("search-bar"); - RESULTS = document.querySelector(".static-search-results"); + RESULTS_CONTAINER = document.querySelector(".static-search-results"); } if (!SEARCH_BAR) { console.warn("SEARCH_BAR not found for current view."); @@ -244,19 +282,38 @@ require(["fuse"], function (Fuse) { } } - // Handle global keydown events for search shortcuts + /** + * Handle global keydown events for search shortcuts. + * @param {KeyboardEvent} event + */ function handleGlobalKeyDown(event) { if (event.key === "Escape") collapseSearchInput(); else if (event.key === "k" && event.ctrlKey) expandSearchInput(); } - // Collapse search if clicking outside + /** + * Collapse search if clicking outside. + * @param {MouseEvent} event + */ function handleGlobalClick(event) { - if (!RESULTS.contains(event.target) && event.target !== SEARCH_INPUT) { + if ( + !RESULTS_CONTAINER.contains(event.target) && + event.target !== SEARCH_INPUT + ) { collapseSearchInput(); } } + /** + * Initialize Fuse with the given data and options. + * @param {Array} data + * @param {Object} options + */ + function initializeFuse(data, options) { + fuseInstance = new Fuse(data, options); + document.documentElement.setAttribute("data-fuse_active", "true"); + } + // Initialize search functionality on page load setupSearchElements(); window.addEventListener("resize", debounce(setupSearchElements, 250)); @@ -273,10 +330,4 @@ require(["fuse"], function (Fuse) { .catch((error) => console.error(`[AST]: Cannot fetch ${SEARCH_FILE}`, error.message), ); - - // Initialize Fuse with the given data and options - function initializeFuse(data, options) { - fuse = new Fuse(data, options); - document.documentElement.setAttribute("data-fuse_active", "true"); - } });