bpo-31045: Language switch (#2652) (#3023) · python/cpython@e93135d
1+(function() {
2+'use strict';
3+4+// Parses versions in URL segments like:
5+// "3", "dev", "release/2.7" or "3.6rc2"
6+var version_regexs = [
7+'(?:\\d)',
8+'(?:\\d\\.\\d[\\w\\d\\.]*)',
9+'(?:dev)',
10+'(?:release/\\d.\\d[\\x\\d\\.]*)'];
11+12+var all_versions = {
13+'3.7': 'dev (3.7)',
14+'3.6': '3.6',
15+'3.5': '3.5',
16+'3.4': '3.4',
17+'3.3': '3.3',
18+'2.7': '2.7',
19+};
20+21+var all_languages = {
22+'en': 'English',
23+'fr': 'Français',
24+};
25+26+function build_version_select(current_version, current_release) {
27+var buf = ['<select>'];
28+29+$.each(all_versions, function(version, title) {
30+buf.push('<option value="' + version + '"');
31+if (version == current_version)
32+buf.push(' selected="selected">' + current_release + '</option>');
33+else
34+buf.push('>' + title + '</option>');
35+});
36+37+buf.push('</select>');
38+return buf.join('');
39+}
40+41+function build_language_select(current_language) {
42+var buf = ['<select>'];
43+44+$.each(all_languages, function(language, title) {
45+if (language == current_language)
46+buf.push('<option value="' + language + '" selected="selected">' +
47+all_languages[current_language] + '</option>');
48+else
49+buf.push('<option value="' + language + '">' + title + '</option>');
50+});
51+buf.push('</select>');
52+return buf.join('');
53+}
54+55+function navigate_to_first_existing(urls) {
56+// Navigate to the first existing URL in urls.
57+var url = urls.shift();
58+if (urls.length == 0) {
59+window.location.href = url;
60+return;
61+}
62+$.ajax({
63+url: url,
64+success: function() {
65+window.location.href = url;
66+},
67+error: function() {
68+navigate_to_first_existing(urls);
69+}
70+});
71+}
72+73+function on_version_switch() {
74+var selected_version = $(this).children('option:selected').attr('value') + '/';
75+var url = window.location.href;
76+var current_language = language_segment_from_url(url);
77+var current_version = version_segment_in_url(url);
78+var new_url = url.replace('.org/' + current_language + current_version,
79+'.org/' + current_language + selected_version);
80+if (new_url != url) {
81+navigate_to_first_existing([
82+new_url,
83+url.replace('.org/' + current_language + current_version,
84+'.org/' + selected_version),
85+'https://docs.python.org/' + current_language + selected_version,
86+'https://docs.python.org/' + selected_version,
87+'https://docs.python.org/'
88+]);
89+}
90+}
91+92+function on_language_switch() {
93+var selected_language = $(this).children('option:selected').attr('value') + '/';
94+var url = window.location.href;
95+var current_language = language_segment_from_url(url);
96+var current_version = version_segment_in_url(url);
97+if (selected_language == 'en/') // Special 'default' case for english.
98+selected_language = '';
99+var new_url = url.replace('.org/' + current_language + current_version,
100+'.org/' + selected_language + current_version);
101+if (new_url != url) {
102+navigate_to_first_existing([
103+new_url,
104+'https://docs.python.org/'
105+]);
106+}
107+}
108+109+// Returns the path segment of the language as a string, like 'fr/'
110+// or '' if not found.
111+function language_segment_from_url(url) {
112+var language_regexp = '\.org/(' + Object.keys(all_languages).join('|') + '/)';
113+var match = url.match(language_regexp);
114+if (match !== null)
115+return match[1];
116+return '';
117+}
118+119+// Returns the path segment of the version as a string, like '3.6/'
120+// or '' if not found.
121+function version_segment_in_url(url) {
122+var language_segment = '(?:(?:' + Object.keys(all_languages).join('|') + ')/)';
123+var version_segment = '(?:(?:' + version_regexs.join('|') + ')/)';
124+var version_regexp = '\\.org/' + language_segment + '?(' + version_segment + ')';
125+var match = url.match(version_regexp);
126+if (match !== null)
127+return match[1];
128+return ''
129+}
130+131+$(document).ready(function() {
132+var release = DOCUMENTATION_OPTIONS.VERSION;
133+var language_segment = language_segment_from_url(window.location.href);
134+var current_language = language_segment.replace(/\/+$/g, '') || 'en';
135+var version = release.substr(0, 3);
136+var version_select = build_version_select(version, release);
137+138+$('.version_switcher_placeholder').html(version_select);
139+$('.version_switcher_placeholder select').bind('change', on_version_switch);
140+141+var language_select = build_language_select(current_language);
142+143+$('.language_switcher_placeholder').html(language_select);
144+$('.language_switcher_placeholder select').bind('change', on_language_switch);
145+});
146+})();