Path: blob/main/docs/_static/js/versions.js
801 views
const themeFlyoutDisplay = "hidden";1const themeVersionSelector = true;2const themeLanguageSelector = true;3if (themeFlyoutDisplay === "attached") {4function renderLanguages(config) {5if (!config.projects.translations.length) {6return "";7}8// Insert the current language to the options on the selector9let languages = config.projects.translations.concat(config.projects.current);10languages = languages.sort((a, b) => a.language.name.localeCompare(b.language.name));11const languagesHTML = `12<dl>13<dt>Languages</dt>14${languages15.map(16(translation) => `17<dd ${translation.slug == config.projects.current.slug ? 'class="rtd-current-item"' : ""}>18<a href="${translation.urls.documentation}">${translation.language.code}</a>19</dd>20`,21)22.join("\n")}23</dl>24`;25return languagesHTML;26}27function renderVersions(config) {28if (!config.versions.active.length) {29return "";30}31const versionsHTML = `32<dl>33<dt>Versions</dt>34${config.versions.active35.map(36(version) => `37<dd ${version.slug === config.versions.current.slug ? 'class="rtd-current-item"' : ""}>38<a href="${version.urls.documentation}">${version.slug}</a>39</dd>40`,41)42.join("\n")}43</dl>44`;45return versionsHTML;46}47function renderDownloads(config) {48if (!Object.keys(config.versions.current.downloads).length) {49return "";50}51const downloadsNameDisplay = {52pdf: "PDF",53epub: "Epub",54htmlzip: "HTML",55};56const downloadsHTML = `57<dl>58<dt>Downloads</dt>59${Object.entries(config.versions.current.downloads)60.map(61([name, url]) => `62<dd>63<a href="${url}">${downloadsNameDisplay[name]}</a>64</dd>65`,66)67.join("\n")}68</dl>69`;70return downloadsHTML;71}72document.addEventListener("readthedocs-addons-data-ready", function (event) {73const config = event.detail.data();74const flyout = `75<div class="rst-versions" data-toggle="rst-versions" role="note">76<span class="rst-current-version" data-toggle="rst-current-version">77<span class="fa fa-book"> Read the Docs</span>78v: ${config.versions.current.slug}79<span class="fa fa-caret-down"></span>80</span>81<div class="rst-other-versions">82<div class="injected">83${renderLanguages(config)}84${renderVersions(config)}85${renderDownloads(config)}86<dl>87<dt>On Read the Docs</dt>88<dd>89<a href="${config.projects.current.urls.home}">Project Home</a>90</dd>91<dd>92<a href="${config.projects.current.urls.builds}">Builds</a>93</dd>94<dd>95<a href="${config.projects.current.urls.downloads}">Downloads</a>96</dd>97</dl>98<dl>99<dt>Search</dt>100<dd>101<form id="flyout-search-form">102<input103class="wy-form"104type="text"105name="q"106aria-label="Search docs"107placeholder="Search docs"108/>109</form>110</dd>111</dl>112<hr />113<small>114<span>Hosted by <a href="https://about.readthedocs.org/?utm_source=&utm_content=flyout">Read the Docs</a></span>115</small>116</div>117</div>118`;119// Inject the generated flyout into the body HTML element.120document.body.insertAdjacentHTML("beforeend", flyout);121// Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout.122document123.querySelector("#flyout-search-form")124.addEventListener("focusin", () => {125const event = new CustomEvent("readthedocs-search-show");126document.dispatchEvent(event);127});128})129}130if (themeLanguageSelector || themeVersionSelector) {131function onSelectorSwitch(event) {132const option = event.target.selectedIndex;133const item = event.target.options[option];134window.location.href = item.dataset.url;135}136document.addEventListener("readthedocs-addons-data-ready", function (event) {137const config = event.detail.data();138const versionSwitch = document.querySelector(139"div.switch-menus > div.version-switch",140);141if (themeVersionSelector) {142let versions = config.versions.active;143if (config.versions.current.hidden || config.versions.current.type === "external") {144versions.unshift(config.versions.current);145}146const versionSelect = `147<select>148${versions149.map(150(version) => `151<option152value="${version.slug}"153${config.versions.current.slug === version.slug ? 'selected="selected"' : ""}154data-url="${version.urls.documentation}">155${version.slug}156</option>`,157)158.join("\n")}159</select>160`;161versionSwitch.innerHTML = versionSelect;162versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch);163}164const languageSwitch = document.querySelector(165"div.switch-menus > div.language-switch",166);167if (themeLanguageSelector) {168if (config.projects.translations.length) {169// Add the current language to the options on the selector170let languages = config.projects.translations.concat(171config.projects.current,172);173languages = languages.sort((a, b) =>174a.language.name.localeCompare(b.language.name),175);176const languageSelect = `177<select>178${languages179.map(180(language) => `181<option182value="${language.language.code}"183${config.projects.current.slug === language.slug ? 'selected="selected"' : ""}184data-url="${language.urls.documentation}">185${language.language.name}186</option>`,187)188.join("\n")}189</select>190`;191languageSwitch.innerHTML = languageSelect;192languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch);193}194else {195languageSwitch.remove();196}197}198});199}200document.addEventListener("readthedocs-addons-data-ready", function (event) {201// Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav.202document203.querySelector("[role='search'] input")204.addEventListener("focusin", () => {205const event = new CustomEvent("readthedocs-search-show");206document.dispatchEvent(event);207});208});209210211