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