blob: 85b00f63c46d34506b4b59641720c70fe1cace5c [file]
/*
NOTE FOR RELEASE MAINTAINERS:
This file only needs updating in the development release ("master" branch)
When documentation for stable releases is built,
the latest version from "master" is used
by https://git.yoctoproject.org/yocto-autobuilder-helper/tree/scripts/run-docs-build
*/
(function() {
'use strict';
var all_releases = {
ALL_RELEASES_PLACEHOLDER
};
var switcher_versions = {
VERSIONS_PLACEHOLDER
};
var latest_version =
LATEST_VERSION_PLACEHOLDER
;
var all_doctypes = {
'single': 'Individual Webpages',
'mega': "All-in-one 'Mega' Manual",
};
// Simple version comparision
// Return 1 if a > b
// Return -1 if a < b
// Return 0 if a == b
function ver_compare(a, b) {
if (a == "dev") {
return 1;
}
if (a === b) {
return 0;
}
var a_components = a.split(".");
var b_components = b.split(".");
var len = Math.min(a_components.length, b_components.length);
// loop while the components are equal
for (var i = 0; i < len; i++) {
// A bigger than B
if (parseInt(a_components[i]) > parseInt(b_components[i])) {
return 1;
}
// B bigger than A
if (parseInt(a_components[i]) < parseInt(b_components[i])) {
return -1;
}
}
// If one's a prefix of the other, the longer one is greater.
if (a_components.length > b_components.length) {
return 1;
}
if (a_components.length < b_components.length) {
return -1;
}
// Otherwise they are the same.
return 0;
}
function build_version_select(current_version) {
// Note: the logic for switching to another version of the documentation is
// done in on_version_switch(). Here we only populate the switcher menu.
var buf = ['<select>'];
// Add a special "Outdated release manuals" entry here that points to the "Outdated
// release manuals" section
buf.push('<option value="outdated" selected="selected">Outdated release manuals</option>');
// Start by pushing the versions from the switcher_versions array,
// unless our current version matches one of them, in which case this is
// done last.
$.each(switcher_versions, function (version, vers_data) {
if (current_version != version) {
buf.push(
'<option value="' +
version +
'" selected="selected">' +
vers_data['title'] +
"</option>",
);
}
});
var current_title = current_version;
var current_series = current_version.split("-")[0].split(".").slice(0, 2).join(".");
if (current_version in switcher_versions) {
current_title = switcher_versions[current_version]['title'];
} else if (current_series in all_releases) {
current_title = all_releases[current_series]['codename'] + ' (' + current_version + ')';
}
buf.push(
'<option value="' +
current_version +
'" selected="selected">' +
current_title +
"</option>",
);
buf.push("</select>");
return buf.join("");
}
function get_docs_meta_info(current_version) {
if (current_version in switcher_versions) {
// Display the commit id of the documentation, as we're browsing a branch tip
var meta_info = ' (commit <a href="https://git.yoctoproject.org/yocto-docs/log?id=';
meta_info = meta_info + switcher_versions[current_version]['hash'];
meta_info = meta_info + '"> ' + switcher_versions[current_version]['hash'];
} else {
// Display the tag
var meta_info = ' (tag <a href="https://git.yoctoproject.org/yocto-docs/log?id=yocto-';
meta_info = meta_info + current_version;
meta_info = meta_info + '"> ' + current_version;
}
meta_info = meta_info + '</a>)';
return meta_info;
}
function build_doctype_select(current_doctype) {
var buf = ['<select>'];
$.each(all_doctypes, function(doctype, title) {
if (doctype == current_doctype)
buf.push('<option value="' + doctype + '" selected="selected">' +
all_doctypes[current_doctype] + '</option>');
else
buf.push('<option value="' + doctype + '">' + title + '</option>');
});
if (!(current_doctype in all_doctypes)) {
// In case we're browsing a doctype that is not yet in all_doctypes.
buf.push('<option value="' + current_doctype + '" selected="selected">' +
current_doctype + '</option>');
all_doctypes[current_doctype] = current_doctype;
}
buf.push('</select>');
return buf.join('');
}
function navigate_to_first_existing(urls) {
// Navigate to the first existing URL in urls.
var url = urls.shift();
// Web browsers won't redirect file:// urls to file urls using ajax but
// its useful for local testing
if (url.startsWith("file://")) {
window.location.href = url;
return;
}
if (urls.length == 0) {
window.location.href = url;
return;
}
$.ajax({
url: url,
success: function() {
window.location.href = url;
},
error: function() {
navigate_to_first_existing(urls);
}
});
}
function get_docroot_url() {
var url = window.location.href;
// Try to get the variable from documentation_options.js
var root = DOCUMENTATION_OPTIONS.URL_ROOT;
if (root == null) {
// In recent versions of Sphinx, URL_ROOT was removed from
// documentation_options.js, so get it like searchtools.js does.
root = document.documentElement.dataset.content_root;
}
var urlarray = url.split('/');
// Trim off anything after '/'
urlarray.pop();
var depth = (root.match(/\.\.\//g) || []).length;
for (var i = 0; i < depth; i++) {
urlarray.pop();
}
return urlarray.join('/') + '/';
}
function on_version_switch() {
var selected_version = $(this).children('option:selected').attr('value');
var url = window.location.href;
var current_version = DOCUMENTATION_OPTIONS.VERSION;
var docroot = get_docroot_url()
// If the current_version is X.Y-tip, we are currently browsing a branch
// tip, and we need to convert it to the branch name.
var current_version_split = current_version.split("-");
if ((current_version_split.length > 1) && (current_version_split[1] == "tip")) {
current_version = all_releases[current_version_split[0]]['codename'].toLowerCase();
}
if (selected_version != "outdated") {
if (selected_version == latest_version) {
// default landing page selected, empty the version
var new_versionpath = '';
} else if (selected_version.includes("-tip")) {
var branch_name = all_releases[selected_version.split("-")[0]]['codename'].toLowerCase();
var new_versionpath = branch_name + '/';
} else {
var new_versionpath = selected_version + '/';
}
}
if (selected_version == "outdated") {
var new_url = docroot + "releases.html#outdated-release-manuals";
var fallback_url = docroot;
} else if (docroot.endsWith("dev/")) {
var new_url = url.replace("/dev/", "/" + new_versionpath);
var fallback_url = new_url.replace(url.replace(docroot, ""), "");
} else if (docroot.endsWith(current_version + "/") == false) {
var new_url = docroot + new_versionpath + url.replace(docroot, "");
var fallback_url = docroot + new_versionpath;
} else {
var new_url = url.replace(
"/" + current_version + "/",
"/" + new_versionpath,
);
var fallback_url = new_url.replace(url.replace(docroot, ""), "");
}
console.log(get_docroot_url())
console.log(url + " to url " + new_url);
console.log(url + " to fallback " + fallback_url);
if (new_url != url) {
navigate_to_first_existing([
new_url,
fallback_url,
'https://www.yoctoproject.org/docs/',
]);
}
}
function on_doctype_switch() {
var selected_doctype = $(this).children('option:selected').attr('value');
var url = window.location.href;
if (selected_doctype == 'mega') {
var docroot = get_docroot_url()
var current_version = DOCUMENTATION_OPTIONS.VERSION;
// Assume manuals before 3.2 are using old docbook mega-manual
if (ver_compare(current_version, "3.2") < 0) {
var new_url = docroot + "mega-manual/mega-manual.html";
} else {
var new_url = docroot + "singleindex.html";
}
} else {
var new_url = url.replace("singleindex.html", "index.html")
}
if (new_url != url) {
navigate_to_first_existing([
new_url,
'https://www.yoctoproject.org/docs/',
]);
}
}
// Returns the current doctype based upon the url
function doctype_segment_from_url(url) {
if (url.includes("singleindex") || url.includes("mega-manual"))
return "mega";
return "single";
}
$(document).ready(function() {
var current_version = DOCUMENTATION_OPTIONS.VERSION;
var current_doctype = doctype_segment_from_url(window.location.href);
var version_select = build_version_select(current_version);
$('.version_switcher_placeholder').html(version_select);
$('.version_switcher_placeholder select').bind('change', on_version_switch);
var docs_meta_info = get_docs_meta_info(current_version);
$('.docs_meta_info_placeholder').html(docs_meta_info);
var doctype_select = build_doctype_select(current_doctype);
$('.doctype_switcher_placeholder').html(doctype_select);
$('.doctype_switcher_placeholder select').bind('change', on_doctype_switch);
// First, check that the version is not one of: dev, next, or any "*-tip"
if (!(["dev", "next"].includes(current_version)) && !(current_version.includes("-tip"))) {
// We could be either: a fixed tag (X.Y[.Z]) or a floating commit (X.Y[.Z]-<hash>)
var current_version_split = current_version.split("-");
var current_version_no_hash = current_version_split[0];
if (current_version_split.length > 1) {
// We're on a floating commit, we don't care
return;
}
var current_series = current_version_no_hash.split(".").slice(0, 2).join(".");
var match = false;
$.each(switcher_versions, function(version, vers_data) {
var series = version.split("-")[0];
if (current_series == series) {
// Our version is part of the supported releases (switcher_versions)
match = true;
if (ver_compare(current_version_no_hash, all_releases[series]['latest_tag']) >= 0) {
// Our version is higher or equal to the latest_tag from our series
return;
}
$('#outdated-warning').html('This document is for an outdated tag ' + current_version + ', you should select version ' + all_releases[series]['codename'] + ' (' + all_releases[series]['latest_tag'] + ').');
$('#outdated-warning').css('padding', '.5em');
return;
}
});
if (!match) {
// Our version is not part of the supported releases (switcher_versions)
$('#outdated-warning').html('This document is for obsolete release ' + current_version + ', you should select a supported release.');
$('#outdated-warning').css('padding', '.5em');
}
}
});
})();