| {# |
| Override the default searchbox from RTD theme to provide the ability to select a search method |
| (ex. built-in search, Google Custom Search, ...) |
| #} |
| {%- if ('singlehtml' not in builder) %} |
| <div class="search-container" role="search"> |
| <form id="rtd-search-form" class="wy-form" action="{{ pathto('search') }}" method="get"> |
| <input type="search" name="q" placeholder="{{ _('Search docs') }}" |
| aria-label="{{ _('Search docs') }}" /> |
| {%- if google_searchengine_id is defined %} |
| <span id="search-se-settings-icon" class="fa fa-gear" role="button" tabindex="0" |
| title="Search settings" aria-label="Search settings" |
| aria-haspopup="true" aria-controls="search-se-menu" aria-expanded="false" |
| onclick="toggleSearchEngineSettingsMenu()"> |
| </span> |
| <div id="search-se-menu" role="menu" aria-labelledby="search-se-settings-icon"> |
| <ul> |
| <li id="search-se-menuitem-sphinx" role="menuitemradio" tabindex="-1" |
| aria-label="Built-in search" onclick="switchSearchEngine('sphinx')"> |
| Built-in search <span class="fa fa-check"> |
| </li> |
| <li id="search-se-menuitem-google" role="menuitemradio" tabindex="-1" |
| aria-label="Google search" onclick="switchSearchEngine('google')"> |
| Google search <span class="fa fa-check"> |
| </li> |
| </div> |
| {%- endif %} |
| <input type="hidden" name="check_keywords" value="yes" /> |
| <input type="hidden" name="area" value="default" /> |
| </form> |
| </div> |
| {%- if google_searchengine_id is defined %} |
| <script> |
| (function () { |
| var form = document.getElementById("rtd-search-form"); |
| var searchMenu = document.getElementById("search-se-menu"); |
| var isBrowsingLatest = window.location.pathname.startsWith("/latest"); |
| var preferenceKey = "search-se-" + (isBrowsingLatest ? "latest" : "default"); |
| var query = new URLSearchParams(window.location.search).get("q"); |
| |
| if (query !== null) { |
| form.q.value = query; |
| form.q.focus(); |
| } |
| |
| // Load the saved search preference. Defaults to Google when browsing "/latest" documentation, |
| // built-in Sphinx search otherwise. |
| var engine = localStorage.getItem(preferenceKey); |
| if (engine === null) { |
| engine = isBrowsingLatest ? "google" : "sphinx"; |
| } |
| setActiveSearchEngine(engine); |
| |
| setSearchEngineSettingsMenuVisibility = function (visible) { |
| searchMenu.style.display = visible ? "block" : "none"; |
| document |
| .getElementById("search-se-settings-icon") |
| .setAttribute("aria-expanded", visible ? "true" : "false"); |
| }; |
| |
| window.toggleSearchEngineSettingsMenu = function () { |
| isVisible = searchMenu.style.display === "block"; |
| setSearchEngineSettingsMenuVisibility(!isVisible); |
| }; |
| |
| function setActiveSearchEngine(engine) { |
| if(engine === "sphinx") { |
| form.action = "{{ pathto('search') }}"; |
| form.q.placeholder = "Search docs (built-in search)"; |
| } else { |
| form.action = "{{ pathto('gsearch') }}"; |
| form.q.placeholder = "Search docs (powered by Google)"; |
| } |
| |
| var selectedElement = document.getElementById("search-se-menuitem-" + engine); |
| var otherElement = document.getElementById( |
| "search-se-menuitem-" + (engine === "sphinx" ? "google" : "sphinx") |
| ); |
| |
| selectedElement.classList.add("selected"); |
| selectedElement.setAttribute("aria-checked", "true"); |
| otherElement.classList.remove("selected"); |
| otherElement.setAttribute("aria-checked", "false"); |
| } |
| |
| window.switchSearchEngine = function (engine) { |
| setActiveSearchEngine(engine); |
| localStorage.setItem(preferenceKey, engine); |
| setSearchEngineSettingsMenuVisibility(false); |
| form.q.focus(); |
| if (form.q.value !== "") { |
| form.submit(); |
| } |
| }; |
| |
| // Close the dropdown if the user clicks outside of it |
| window.onclick = function (event) { |
| if (!event.target.matches("#search-se-settings-icon")) { |
| if (searchMenu.style.display === "block") { |
| setSearchEngineSettingsMenuVisibility(false); |
| } |
| } |
| }; |
| |
| document.addEventListener("keydown", function (event) { |
| if(searchMenu.style.display === "none") return; |
| |
| let menuItems = document.querySelectorAll('[role="menuitemradio"]'); |
| let currentIndex = Array.from(menuItems).findIndex((item) => item === document.activeElement); |
| |
| if (event.key === "ArrowDown" || event.key === "ArrowUp") { |
| let nextIndex = event.key === "ArrowDown" ? currentIndex + 1 : currentIndex - 1; |
| |
| if (nextIndex >= menuItems.length) nextIndex = 0; |
| if (nextIndex < 0) nextIndex = menuItems.length - 1; |
| |
| menuItems[nextIndex].focus(); |
| event.preventDefault(); |
| } else if (event.key === "Enter") { |
| let activeItem = document.activeElement; |
| if (activeItem && activeItem.getAttribute("role") === "menuitemradio") { |
| activeItem.click(); |
| event.preventDefault(); |
| } |
| } |
| }); |
| })(); |
| </script> |
| {%- endif %} |
| {%- endif %} |