summaryrefslogtreecommitdiff
path: root/_static/js/versions.js
diff options
context:
space:
mode:
authorDmitriyEshenko <DmitriyEshenko@users.noreply.github.com>2024-12-22 18:23:36 +0000
committerDmitriyEshenko <DmitriyEshenko@users.noreply.github.com>2024-12-22 18:23:36 +0000
commitb2cf2fae3dd53a6281f5e787b694b7c4aece2c1f (patch)
tree9a5942bd97ac16de9697f386a3c02753bff97c7b /_static/js/versions.js
downloadaccel-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.js228
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