blob: 20dad93d6a5edf46058f1d6dfbca77bcfc66c4e3 [file] [log] [blame]
Juliendff9b5f2017-08-07 10:27:21 +02001(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 = {
Ned Deily07a18922018-01-31 18:12:38 -050013 '3.8': 'dev (3.8)',
Ned Deilyaee5df52018-06-27 18:45:50 -040014 '3.7': '3.7',
Juliendff9b5f2017-08-07 10:27:21 +020015 '3.6': '3.6',
Ned Deilyb7cbfe42017-10-12 14:08:43 -040016 '3.5': '3.5',
Juliendff9b5f2017-08-07 10:27:21 +020017 '2.7': '2.7',
18 };
19
20 var all_languages = {
21 'en': 'English',
Julien Palardb616b972017-08-17 16:24:02 +020022 'fr': 'French',
Julien Palardc82b7f32017-08-08 23:26:46 +020023 'ja': 'Japanese',
Dong-hee Na57794832018-04-29 05:08:22 +090024 'ko': 'Korean',
Juliendff9b5f2017-08-07 10:27:21 +020025 };
26
27 function build_version_select(current_version, current_release) {
28 var buf = ['<select>'];
29
30 $.each(all_versions, function(version, title) {
31 buf.push('<option value="' + version + '"');
32 if (version == current_version)
33 buf.push(' selected="selected">' + current_release + '</option>');
34 else
35 buf.push('>' + title + '</option>');
36 });
37
38 buf.push('</select>');
39 return buf.join('');
40 }
41
42 function build_language_select(current_language) {
43 var buf = ['<select>'];
44
45 $.each(all_languages, function(language, title) {
46 if (language == current_language)
47 buf.push('<option value="' + language + '" selected="selected">' +
48 all_languages[current_language] + '</option>');
49 else
50 buf.push('<option value="' + language + '">' + title + '</option>');
51 });
Julien Palard6b73bb52018-11-20 17:18:30 +010052 if (!(current_language in all_languages)) {
53 // In case we're browsing a language that is not yet in all_languages.
54 buf.push('<option value="' + current_language + '" selected="selected">' +
55 current_language + '</option>');
56 all_languages[current_language] = current_language;
57 }
Juliendff9b5f2017-08-07 10:27:21 +020058 buf.push('</select>');
59 return buf.join('');
60 }
61
62 function navigate_to_first_existing(urls) {
63 // Navigate to the first existing URL in urls.
64 var url = urls.shift();
65 if (urls.length == 0) {
66 window.location.href = url;
67 return;
68 }
69 $.ajax({
70 url: url,
71 success: function() {
72 window.location.href = url;
73 },
74 error: function() {
75 navigate_to_first_existing(urls);
76 }
77 });
78 }
79
80 function on_version_switch() {
81 var selected_version = $(this).children('option:selected').attr('value') + '/';
82 var url = window.location.href;
83 var current_language = language_segment_from_url(url);
84 var current_version = version_segment_in_url(url);
85 var new_url = url.replace('.org/' + current_language + current_version,
86 '.org/' + current_language + selected_version);
87 if (new_url != url) {
88 navigate_to_first_existing([
89 new_url,
90 url.replace('.org/' + current_language + current_version,
91 '.org/' + selected_version),
92 'https://docs.python.org/' + current_language + selected_version,
93 'https://docs.python.org/' + selected_version,
94 'https://docs.python.org/'
95 ]);
96 }
97 }
98
99 function on_language_switch() {
100 var selected_language = $(this).children('option:selected').attr('value') + '/';
101 var url = window.location.href;
102 var current_language = language_segment_from_url(url);
103 var current_version = version_segment_in_url(url);
104 if (selected_language == 'en/') // Special 'default' case for english.
105 selected_language = '';
106 var new_url = url.replace('.org/' + current_language + current_version,
107 '.org/' + selected_language + current_version);
108 if (new_url != url) {
109 navigate_to_first_existing([
110 new_url,
111 'https://docs.python.org/'
112 ]);
113 }
114 }
115
116 // Returns the path segment of the language as a string, like 'fr/'
117 // or '' if not found.
118 function language_segment_from_url(url) {
Julien Palard122081d2017-08-09 17:01:15 +0200119 var language_regexp = '\.org/([a-z]{2}(?:-[a-z]{2})?/)';
Juliendff9b5f2017-08-07 10:27:21 +0200120 var match = url.match(language_regexp);
121 if (match !== null)
122 return match[1];
123 return '';
124 }
125
126 // Returns the path segment of the version as a string, like '3.6/'
127 // or '' if not found.
128 function version_segment_in_url(url) {
Julien Palard122081d2017-08-09 17:01:15 +0200129 var language_segment = '(?:[a-z]{2}(?:-[a-z]{2})?/)';
Juliendff9b5f2017-08-07 10:27:21 +0200130 var version_segment = '(?:(?:' + version_regexs.join('|') + ')/)';
131 var version_regexp = '\\.org/' + language_segment + '?(' + version_segment + ')';
132 var match = url.match(version_regexp);
133 if (match !== null)
134 return match[1];
135 return ''
136 }
137
138 $(document).ready(function() {
139 var release = DOCUMENTATION_OPTIONS.VERSION;
140 var language_segment = language_segment_from_url(window.location.href);
141 var current_language = language_segment.replace(/\/+$/g, '') || 'en';
142 var version = release.substr(0, 3);
143 var version_select = build_version_select(version, release);
144
145 $('.version_switcher_placeholder').html(version_select);
146 $('.version_switcher_placeholder select').bind('change', on_version_switch);
147
148 var language_select = build_language_select(current_language);
149
150 $('.language_switcher_placeholder').html(language_select);
151 $('.language_switcher_placeholder select').bind('change', on_language_switch);
152 });
153})();