xref: /OK3568_Linux_fs/yocto/poky/documentation/sphinx-static/switchers.js.in (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593SmuzhiyunNOTE FOR RELEASE MAINTAINERS:
3*4882a593SmuzhiyunThis file only needs updating in the development release ("master" branch)
4*4882a593SmuzhiyunWhen documentation for stable releases is built,
5*4882a593Smuzhiyunthe latest version from "master" is used
6*4882a593Smuzhiyunby https://git.yoctoproject.org/yocto-autobuilder-helper/tree/scripts/run-docs-build
7*4882a593Smuzhiyun*/
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun(function() {
10*4882a593Smuzhiyun  'use strict';
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun  var all_releases =
13*4882a593Smuzhiyun	ALL_RELEASES_PLACEHOLDER
14*4882a593Smuzhiyun  ;
15*4882a593Smuzhiyun
16*4882a593Smuzhiyun  var switcher_versions = {
17*4882a593Smuzhiyun    VERSIONS_PLACEHOLDER
18*4882a593Smuzhiyun  };
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun  var all_doctypes = {
21*4882a593Smuzhiyun      'single': 'Individual Webpages',
22*4882a593Smuzhiyun      'mega': "All-in-one 'Mega' Manual",
23*4882a593Smuzhiyun  };
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun  // Simple version comparision
26*4882a593Smuzhiyun  // Return 1 if a > b
27*4882a593Smuzhiyun  // Return -1 if a < b
28*4882a593Smuzhiyun  // Return 0 if a == b
29*4882a593Smuzhiyun  function ver_compare(a, b) {
30*4882a593Smuzhiyun    if (a == "dev") {
31*4882a593Smuzhiyun       return 1;
32*4882a593Smuzhiyun    }
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun    if (a === b) {
35*4882a593Smuzhiyun       return 0;
36*4882a593Smuzhiyun    }
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun    var a_components = a.split(".");
39*4882a593Smuzhiyun    var b_components = b.split(".");
40*4882a593Smuzhiyun
41*4882a593Smuzhiyun    var len = Math.min(a_components.length, b_components.length);
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun    // loop while the components are equal
44*4882a593Smuzhiyun    for (var i = 0; i < len; i++) {
45*4882a593Smuzhiyun        // A bigger than B
46*4882a593Smuzhiyun        if (parseInt(a_components[i]) > parseInt(b_components[i])) {
47*4882a593Smuzhiyun            return 1;
48*4882a593Smuzhiyun        }
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun        // B bigger than A
51*4882a593Smuzhiyun        if (parseInt(a_components[i]) < parseInt(b_components[i])) {
52*4882a593Smuzhiyun            return -1;
53*4882a593Smuzhiyun        }
54*4882a593Smuzhiyun    }
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun    // If one's a prefix of the other, the longer one is greater.
57*4882a593Smuzhiyun    if (a_components.length > b_components.length) {
58*4882a593Smuzhiyun        return 1;
59*4882a593Smuzhiyun    }
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun    if (a_components.length < b_components.length) {
62*4882a593Smuzhiyun        return -1;
63*4882a593Smuzhiyun    }
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun    // Otherwise they are the same.
66*4882a593Smuzhiyun    return 0;
67*4882a593Smuzhiyun  }
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun  function build_version_select(current_series, current_version) {
70*4882a593Smuzhiyun    var buf = ['<select>'];
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun    $.each(switcher_versions, function(version, vers_data) {
73*4882a593Smuzhiyun      var series = version.substr(0, 3);
74*4882a593Smuzhiyun      if (series == current_series) {
75*4882a593Smuzhiyun        if (version == current_version)
76*4882a593Smuzhiyun            buf.push('<option value="' + version + '" selected="selected">' + vers_data["title"] + '</option>');
77*4882a593Smuzhiyun	      else
78*4882a593Smuzhiyun            buf.push('<option value="' + version + '">' + vers_data["title"] + '</option>');
79*4882a593Smuzhiyun      } else {
80*4882a593Smuzhiyun        buf.push('<option value="' + version + '">' + vers_data["title"] + '</option>');
81*4882a593Smuzhiyun      }
82*4882a593Smuzhiyun    });
83*4882a593Smuzhiyun
84*4882a593Smuzhiyun    buf.push('</select>');
85*4882a593Smuzhiyun    return buf.join('');
86*4882a593Smuzhiyun  }
87*4882a593Smuzhiyun
88*4882a593Smuzhiyun  function build_doctype_select(current_doctype) {
89*4882a593Smuzhiyun    var buf = ['<select>'];
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun    $.each(all_doctypes, function(doctype, title) {
92*4882a593Smuzhiyun      if (doctype == current_doctype)
93*4882a593Smuzhiyun        buf.push('<option value="' + doctype + '" selected="selected">' +
94*4882a593Smuzhiyun                 all_doctypes[current_doctype] + '</option>');
95*4882a593Smuzhiyun      else
96*4882a593Smuzhiyun        buf.push('<option value="' + doctype + '">' + title + '</option>');
97*4882a593Smuzhiyun    });
98*4882a593Smuzhiyun    if (!(current_doctype in all_doctypes)) {
99*4882a593Smuzhiyun        // In case we're browsing a doctype that is not yet in all_doctypes.
100*4882a593Smuzhiyun        buf.push('<option value="' + current_doctype + '" selected="selected">' +
101*4882a593Smuzhiyun                 current_doctype + '</option>');
102*4882a593Smuzhiyun        all_doctypes[current_doctype] = current_doctype;
103*4882a593Smuzhiyun    }
104*4882a593Smuzhiyun    buf.push('</select>');
105*4882a593Smuzhiyun    return buf.join('');
106*4882a593Smuzhiyun  }
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun  function navigate_to_first_existing(urls) {
109*4882a593Smuzhiyun    // Navigate to the first existing URL in urls.
110*4882a593Smuzhiyun    var url = urls.shift();
111*4882a593Smuzhiyun
112*4882a593Smuzhiyun    // Web browsers won't redirect file:// urls to file urls using ajax but
113*4882a593Smuzhiyun    // its useful for local testing
114*4882a593Smuzhiyun    if (url.startsWith("file://")) {
115*4882a593Smuzhiyun      window.location.href = url;
116*4882a593Smuzhiyun      return;
117*4882a593Smuzhiyun    }
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun    if (urls.length == 0) {
120*4882a593Smuzhiyun      window.location.href = url;
121*4882a593Smuzhiyun      return;
122*4882a593Smuzhiyun    }
123*4882a593Smuzhiyun    $.ajax({
124*4882a593Smuzhiyun      url: url,
125*4882a593Smuzhiyun      success: function() {
126*4882a593Smuzhiyun        window.location.href = url;
127*4882a593Smuzhiyun      },
128*4882a593Smuzhiyun      error: function() {
129*4882a593Smuzhiyun        navigate_to_first_existing(urls);
130*4882a593Smuzhiyun      }
131*4882a593Smuzhiyun    });
132*4882a593Smuzhiyun  }
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun  function get_docroot_url() {
135*4882a593Smuzhiyun    var url = window.location.href;
136*4882a593Smuzhiyun    var root = DOCUMENTATION_OPTIONS.URL_ROOT;
137*4882a593Smuzhiyun
138*4882a593Smuzhiyun    var urlarray = url.split('/');
139*4882a593Smuzhiyun    // Trim off anything after '/'
140*4882a593Smuzhiyun    urlarray.pop();
141*4882a593Smuzhiyun    var depth = (root.match(/\.\.\//g) || []).length;
142*4882a593Smuzhiyun    for (var i = 0; i < depth; i++) {
143*4882a593Smuzhiyun      urlarray.pop();
144*4882a593Smuzhiyun    }
145*4882a593Smuzhiyun
146*4882a593Smuzhiyun    return urlarray.join('/') + '/';
147*4882a593Smuzhiyun  }
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun  function on_version_switch() {
150*4882a593Smuzhiyun    var selected_version = $(this).children('option:selected').attr('value');
151*4882a593Smuzhiyun    var url = window.location.href;
152*4882a593Smuzhiyun    var current_version = DOCUMENTATION_OPTIONS.VERSION;
153*4882a593Smuzhiyun    var docroot = get_docroot_url()
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun    var new_versionpath = selected_version + '/';
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun    // latest tag is also the default page (without version information)
158*4882a593Smuzhiyun    if (docroot.endsWith(current_version + '/') == false) {
159*4882a593Smuzhiyun        var new_url = docroot + new_versionpath + url.replace(docroot, "");
160*4882a593Smuzhiyun        var fallback_url = docroot + new_versionpath;
161*4882a593Smuzhiyun    } else {
162*4882a593Smuzhiyun	// check for named releases (e.g. dunfell) in the subpath
163*4882a593Smuzhiyun        $.each(all_releases, function(idx, release) {
164*4882a593Smuzhiyun		if (docroot.endsWith('/' + release + '/')) {
165*4882a593Smuzhiyun			current_version = release;
166*4882a593Smuzhiyun			return false;
167*4882a593Smuzhiyun		}
168*4882a593Smuzhiyun	});
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun        var new_url = url.replace('/' + current_version + '/', '/' + new_versionpath);
171*4882a593Smuzhiyun        var fallback_url = new_url.replace(url.replace(docroot, ""), "");
172*4882a593Smuzhiyun    }
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun    console.log(get_docroot_url())
175*4882a593Smuzhiyun    console.log(url + " to url " + new_url);
176*4882a593Smuzhiyun    console.log(url + " to fallback " + fallback_url);
177*4882a593Smuzhiyun
178*4882a593Smuzhiyun    if (new_url != url) {
179*4882a593Smuzhiyun      navigate_to_first_existing([
180*4882a593Smuzhiyun        new_url,
181*4882a593Smuzhiyun        fallback_url,
182*4882a593Smuzhiyun        'https://www.yoctoproject.org/docs/',
183*4882a593Smuzhiyun      ]);
184*4882a593Smuzhiyun    }
185*4882a593Smuzhiyun  }
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun  function on_doctype_switch() {
188*4882a593Smuzhiyun    var selected_doctype = $(this).children('option:selected').attr('value');
189*4882a593Smuzhiyun    var url = window.location.href;
190*4882a593Smuzhiyun    if (selected_doctype == 'mega') {
191*4882a593Smuzhiyun      var docroot = get_docroot_url()
192*4882a593Smuzhiyun      var current_version = DOCUMENTATION_OPTIONS.VERSION;
193*4882a593Smuzhiyun      // Assume manuals before 3.2 are using old docbook mega-manual
194*4882a593Smuzhiyun      if (ver_compare(current_version, "3.2") < 0) {
195*4882a593Smuzhiyun        var new_url = docroot + "mega-manual/mega-manual.html";
196*4882a593Smuzhiyun      } else {
197*4882a593Smuzhiyun        var new_url = docroot + "singleindex.html";
198*4882a593Smuzhiyun      }
199*4882a593Smuzhiyun    } else {
200*4882a593Smuzhiyun      var new_url = url.replace("singleindex.html", "index.html")
201*4882a593Smuzhiyun    }
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun    if (new_url != url) {
204*4882a593Smuzhiyun      navigate_to_first_existing([
205*4882a593Smuzhiyun        new_url,
206*4882a593Smuzhiyun        'https://www.yoctoproject.org/docs/',
207*4882a593Smuzhiyun      ]);
208*4882a593Smuzhiyun    }
209*4882a593Smuzhiyun  }
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun  // Returns the current doctype based upon the url
212*4882a593Smuzhiyun  function doctype_segment_from_url(url) {
213*4882a593Smuzhiyun    if (url.includes("singleindex") || url.includes("mega-manual"))
214*4882a593Smuzhiyun      return "mega";
215*4882a593Smuzhiyun    return "single";
216*4882a593Smuzhiyun  }
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun  $(document).ready(function() {
219*4882a593Smuzhiyun    var release = DOCUMENTATION_OPTIONS.VERSION;
220*4882a593Smuzhiyun    var current_doctype = doctype_segment_from_url(window.location.href);
221*4882a593Smuzhiyun    var current_series = release.substr(0, 3);
222*4882a593Smuzhiyun    var version_select = build_version_select(current_series, release);
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun    $('.version_switcher_placeholder').html(version_select);
225*4882a593Smuzhiyun    $('.version_switcher_placeholder select').bind('change', on_version_switch);
226*4882a593Smuzhiyun
227*4882a593Smuzhiyun    var doctype_select = build_doctype_select(current_doctype);
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun    $('.doctype_switcher_placeholder').html(doctype_select);
230*4882a593Smuzhiyun    $('.doctype_switcher_placeholder select').bind('change', on_doctype_switch);
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun    if (release != "dev") {
233*4882a593Smuzhiyun      $.each(switcher_versions, function(version, vers_data) {
234*4882a593Smuzhiyun        var series = version.substr(0, 3);
235*4882a593Smuzhiyun        if (series == current_series) {
236*4882a593Smuzhiyun          if (version != release && release.endsWith('.999') == false) {
237*4882a593Smuzhiyun            $('#outdated-warning').html('This document is for outdated version ' + release + ', you should select the latest release version in this series, ' + version + '.');
238*4882a593Smuzhiyun            $('#outdated-warning').css('padding', '.5em');
239*4882a593Smuzhiyun            return false;
240*4882a593Smuzhiyun          }
241*4882a593Smuzhiyun          if (vers_data["obsolete"]) {
242*4882a593Smuzhiyun            $('#outdated-warning').html('Version ' + release + ' of the project is now considered obsolete, please select and use a more recent version');
243*4882a593Smuzhiyun            $('#outdated-warning').css('padding', '.5em');
244*4882a593Smuzhiyun            return false;
245*4882a593Smuzhiyun          }
246*4882a593Smuzhiyun        }
247*4882a593Smuzhiyun      });
248*4882a593Smuzhiyun    }
249*4882a593Smuzhiyun  });
250*4882a593Smuzhiyun})();
251