blob: 9fe0ad073fd637ba7ee14a44a6c08a544be33251 [file]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
// Generate a version switcher on the fly. This is actually meant to
// be loaded from the website root (arrow.apache.org/adbc/version.js)
// and not from the documentation subdirectory itself. This lets us
// update the script globally. It depends on certain variables being
// injected into the Sphinx template.
function adbcInjectVersionSwitcher() {
// The template should contain this list, we just populate it
const root = document.querySelector("#version-switcher ul");
// Variable injected by ci/scripts/website_build.sh
// Format:
// path;version\npath2;version2;\n...
// Versions are sorted at generation time
const parsedVersions = versions
.trim()
.split(/\n/g)
.map((version) => version.split(/;/))
// Most recent on top
.reverse();
parsedVersions.forEach((version) => {
const el = document.createElement("a");
// Variable injected by template
el.setAttribute("href", versionsRoot + "/" + version[0]);
el.innerText = version[1];
if (version[1] === currentVersion) {
el.classList.toggle("active");
}
const li = document.createElement("li");
li.appendChild(el);
root.appendChild(li);
el.addEventListener("click", (e) => {
e.preventDefault();
try {
let relativePart = window.location.pathname.replace(/^\//, "");
// Remove the adbc/ prefix
relativePart = relativePart.replace(/^adbc[^\/]+\//, "");
// Remove the version number
relativePart = relativePart.replace(/^[^\/]+\//, "");
const newUrl = `${el.getAttribute("href")}/${relativePart}`;
window.fetch(newUrl).then((resp) => {
if (resp.status === 200) {
window.location.href = newUrl;
} else {
window.location.href = el.getAttribute("href");
}
}, () => {
window.location.href = el.getAttribute("href");
});
} catch (e) {
window.location.href = el.getAttribute("href");
}
return false;
});
});
// Inject a banner warning if the user is looking at older/development
// version documentation
// If the user has dismissed the popup, don't show it again
const storageKey = "adbc-ignored-version-warnings";
const ignoreVersionWarnings = new Set();
try {
const savedVersions = JSON.parse(window.localStorage[storageKey]);
for (const version of savedVersions) {
ignoreVersionWarnings.add(version);
}
} catch (e) {
// ignore
}
if (ignoreVersionWarnings.has(currentVersion)) {
return;
}
let warningBanner = null;
const redirectUrl = `${versionsRoot}/current`;
let redirectText = null;
if (currentVersion.endsWith(" (dev)")) {
warningBanner = "This is documentation for an unstable development version.";
redirectText = "Switch to stable version";
} else {
const stableVersions = parsedVersions
.filter(v => v[0] === "current");
if (stableVersions.length > 0) {
const stableVersion = stableVersions[0][1].match(/^(.+) \(current\)/)[1];
if (currentVersion !== stableVersion) {
warningBanner = `This is documentation for version ${currentVersion}.`;
redirectText = `Switch to current stable version`;
}
}
}
if (warningBanner !== null) {
// Generate on the fly instead of depending on the template containing
// the right elements/styles
const container = document.createElement("div");
const text = document.createElement("span");
text.innerText = warningBanner + " ";
const button = document.createElement("a");
button.setAttribute("href", redirectUrl);
button.innerText = redirectText;
const hide = document.createElement("a");
hide.innerText = "Hide for this version";
const spacer = document.createTextNode(" ");
container.appendChild(text);
container.appendChild(button);
container.appendChild(spacer);
container.appendChild(hide);
hide.addEventListener("click", (e) => {
container.remove();
ignoreVersionWarnings.add(currentVersion);
window.localStorage[storageKey] =
JSON.stringify(Array.from(ignoreVersionWarnings));
});
container.style.background = "#f8d7da";
container.style.color = "#000";
container.style.padding = "1em";
container.style.textAlign = "center";
document.body.prepend(container);
}
};
if (document.readyState !== "loading") {
adbcInjectVersionSwitcher();
} else {
window.addEventListener("DOMContentLoaded", adbcInjectVersionSwitcher);
}