228 lines
6.9 KiB
JavaScript
228 lines
6.9 KiB
JavaScript
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>Версии</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>Загрузки</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>На Read the Docs</dt>
|
||
<dd>
|
||
<a href="${config.projects.current.urls.home}">Домашняя страница проекта</a>
|
||
</dd>
|
||
<dd>
|
||
<a href="${config.projects.current.urls.builds}">Сборки</a>
|
||
</dd>
|
||
<dd>
|
||
<a href="${config.projects.current.urls.downloads}">Загрузки</a>
|
||
</dd>
|
||
</dl>
|
||
<dl>
|
||
<dt>Поиск</dt>
|
||
<dd>
|
||
<form id="flyout-search-form">
|
||
<input
|
||
class="wy-form"
|
||
type="text"
|
||
name="q"
|
||
aria-label="Поиск в документации"
|
||
placeholder="Поиск в документации"
|
||
/>
|
||
</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);
|
||
});
|
||
}); |