| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- 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);
- });
- });
|