diff options
| author | DmitriyEshenko <DmitriyEshenko@users.noreply.github.com> | 2024-12-22 18:23:36 +0000 |
|---|---|---|
| committer | DmitriyEshenko <DmitriyEshenko@users.noreply.github.com> | 2024-12-22 18:23:36 +0000 |
| commit | b2cf2fae3dd53a6281f5e787b694b7c4aece2c1f (patch) | |
| tree | 9a5942bd97ac16de9697f386a3c02753bff97c7b /_static/js/versions.js | |
| download | accel-ppp.github.io-b2cf2fae3dd53a6281f5e787b694b7c4aece2c1f.tar.gz accel-ppp.github.io-b2cf2fae3dd53a6281f5e787b694b7c4aece2c1f.zip | |
deploy: 328aee7bbec7ff3ec66b2c9f10760bbcb613076d
Diffstat (limited to '_static/js/versions.js')
| -rw-r--r-- | _static/js/versions.js | 228 |
1 files changed, 228 insertions, 0 deletions
diff --git a/_static/js/versions.js b/_static/js/versions.js new file mode 100644 index 0000000..4958195 --- /dev/null +++ b/_static/js/versions.js @@ -0,0 +1,228 @@ +const themeFlyoutDisplay = "hidden"; +const themeVersionSelector = true; +const themeLanguageSelector = true; + +if (themeFlyoutDisplay === "attached") { + function renderLanguages(config) { + if (!config.projects.translations.length) { + return ""; + } + + // Insert the current language to the options on the selector + let languages = config.projects.translations.concat(config.projects.current); + languages = languages.sort((a, b) => a.language.name.localeCompare(b.language.name)); + + const languagesHTML = ` + <dl> + <dt>Languages</dt> + ${languages + .map( + (translation) => ` + <dd ${translation.slug == config.projects.current.slug ? 'class="rtd-current-item"' : ""}> + <a href="${translation.urls.documentation}">${translation.language.code}</a> + </dd> + `, + ) + .join("\n")} + </dl> + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` + <dl> + <dt>Versions</dt> + ${config.versions.active + .map( + (version) => ` + <dd ${version.slug === config.versions.current.slug ? 'class="rtd-current-item"' : ""}> + <a href="${version.urls.documentation}">${version.slug}</a> + </dd> + `, + ) + .join("\n")} + </dl> + `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` + <dl> + <dt>Downloads</dt> + ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` + <dd> + <a href="${url}">${downloadsNameDisplay[name]}</a> + </dd> + `, + ) + .join("\n")} + </dl> + `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` + <div class="rst-versions" data-toggle="rst-versions" role="note"> + <span class="rst-current-version" data-toggle="rst-current-version"> + <span class="fa fa-book"> Read the Docs</span> + v: ${config.versions.current.slug} + <span class="fa fa-caret-down"></span> + </span> + <div class="rst-other-versions"> + <div class="injected"> + ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} + <dl> + <dt>On Read the Docs</dt> + <dd> + <a href="${config.projects.current.urls.home}">Project Home</a> + </dd> + <dd> + <a href="${config.projects.current.urls.builds}">Builds</a> + </dd> + <dd> + <a href="${config.projects.current.urls.downloads}">Downloads</a> + </dd> + </dl> + <dl> + <dt>Search</dt> + <dd> + <form id="flyout-search-form"> + <input + class="wy-form" + type="text" + name="q" + aria-label="Search docs" + placeholder="Search docs" + /> + </form> + </dd> + </dl> + <hr /> + <small> + <span>Hosted by <a href="https://about.readthedocs.org/?utm_source=&utm_content=flyout">Read the Docs</a></span> + </small> + </div> + </div> + `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + <select> + ${versions + .map( + (version) => ` + <option + value="${version.slug}" + ${config.versions.current.slug === version.slug ? 'selected="selected"' : ""} + data-url="${version.urls.documentation}"> + ${version.slug} + </option>`, + ) + .join("\n")} + </select> + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + <select> + ${languages + .map( + (language) => ` + <option + value="${language.language.code}" + ${config.projects.current.slug === language.slug ? 'selected="selected"' : ""} + data-url="${language.urls.documentation}"> + ${language.language.name} + </option>`, + ) + .join("\n")} + </select> + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +});
\ No newline at end of file |
