blob: c2b342b919a28b6e42cff5d68a26eecd7e8fbab4 [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 = {
13 '3.7': 'dev (3.7)',
14 '3.6': '3.6',
Juliendff9b5f2017-08-07 10:27:21 +020015 '2.7': '2.7',
16 };
17
18 var all_languages = {
19 'en': 'English',
Julien Palardb616b972017-08-17 16:24:02 +020020 'fr': 'French',
Julien Palardc82b7f32017-08-08 23:26:46 +020021 'ja': 'Japanese',
Juliendff9b5f2017-08-07 10:27:21 +020022 };
23
24 function build_version_select(current_version, current_release) {
25 var buf = ['<select>'];
26
27 $.each(all_versions, function(version, title) {
28 buf.push('<option value="' + version + '"');
29 if (version == current_version)
30 buf.push(' selected="selected">' + current_release + '</option>');
31 else
32 buf.push('>' + title + '</option>');
33 });
34
35 buf.push('</select>');
36 return buf.join('');
37 }
38
39 function build_language_select(current_language) {
40 var buf = ['<select>'];
41
42 $.each(all_languages, function(language, title) {
43 if (language == current_language)
44 buf.push('<option value="' + language + '" selected="selected">' +
45 all_languages[current_language] + '</option>');
46 else
47 buf.push('<option value="' + language + '">' + title + '</option>');
48 });
49 buf.push('</select>');
50 return buf.join('');
51 }
52
53 function navigate_to_first_existing(urls) {
54 // Navigate to the first existing URL in urls.
55 var url = urls.shift();
56 if (urls.length == 0) {
57 window.location.href = url;
58 return;
59 }
60 $.ajax({
61 url: url,
62 success: function() {
63 window.location.href = url;
64 },
65 error: function() {
66 navigate_to_first_existing(urls);
67 }
68 });
69 }
70
71 function on_version_switch() {
72 var selected_version = $(this).children('option:selected').attr('value') + '/';
73 var url = window.location.href;
74 var current_language = language_segment_from_url(url);
75 var current_version = version_segment_in_url(url);
76 var new_url = url.replace('.org/' + current_language + current_version,
77 '.org/' + current_language + selected_version);
78 if (new_url != url) {
79 navigate_to_first_existing([
80 new_url,
81 url.replace('.org/' + current_language + current_version,
82 '.org/' + selected_version),
83 'https://docs.python.org/' + current_language + selected_version,
84 'https://docs.python.org/' + selected_version,
85 'https://docs.python.org/'
86 ]);
87 }
88 }
89
90 function on_language_switch() {
91 var selected_language = $(this).children('option:selected').attr('value') + '/';
92 var url = window.location.href;
93 var current_language = language_segment_from_url(url);
94 var current_version = version_segment_in_url(url);
95 if (selected_language == 'en/') // Special 'default' case for english.
96 selected_language = '';
97 var new_url = url.replace('.org/' + current_language + current_version,
98 '.org/' + selected_language + current_version);
99 if (new_url != url) {
100 navigate_to_first_existing([
101 new_url,
102 'https://docs.python.org/'
103 ]);
104 }
105 }
106
107 // Returns the path segment of the language as a string, like 'fr/'
108 // or '' if not found.
109 function language_segment_from_url(url) {
Julien Palard122081d2017-08-09 17:01:15 +0200110 var language_regexp = '\.org/([a-z]{2}(?:-[a-z]{2})?/)';
Juliendff9b5f2017-08-07 10:27:21 +0200111 var match = url.match(language_regexp);
112 if (match !== null)
113 return match[1];
114 return '';
115 }
116
117 // Returns the path segment of the version as a string, like '3.6/'
118 // or '' if not found.
119 function version_segment_in_url(url) {
Julien Palard122081d2017-08-09 17:01:15 +0200120 var language_segment = '(?:[a-z]{2}(?:-[a-z]{2})?/)';
Juliendff9b5f2017-08-07 10:27:21 +0200121 var version_segment = '(?:(?:' + version_regexs.join('|') + ')/)';
122 var version_regexp = '\\.org/' + language_segment + '?(' + version_segment + ')';
123 var match = url.match(version_regexp);
124 if (match !== null)
125 return match[1];
126 return ''
127 }
128
129 $(document).ready(function() {
130 var release = DOCUMENTATION_OPTIONS.VERSION;
131 var language_segment = language_segment_from_url(window.location.href);
132 var current_language = language_segment.replace(/\/+$/g, '') || 'en';
133 var version = release.substr(0, 3);
134 var version_select = build_version_select(version, release);
135
136 $('.version_switcher_placeholder').html(version_select);
137 $('.version_switcher_placeholder select').bind('change', on_version_switch);
138
139 var language_select = build_language_select(current_language);
140
141 $('.language_switcher_placeholder').html(language_select);
142 $('.language_switcher_placeholder select').bind('change', on_language_switch);
143 });
144})();