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