blob: ff23202a5e0fd70c36fc77d3e4f759508fc29d13 [file] [log] [blame]
Julien Palard245dafc2017-08-08 14:14:23 +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',
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',
Julien Palardfe8d9dc2017-08-13 23:44:51 +020024 'ja': 'Japanese',
Julien Palard245dafc2017-08-08 14:14:23 +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 });
52 buf.push('</select>');
53 return buf.join('');
54 }
55
56 function navigate_to_first_existing(urls) {
57 // Navigate to the first existing URL in urls.
58 var url = urls.shift();
59 if (urls.length == 0) {
60 window.location.href = url;
61 return;
62 }
63 $.ajax({
64 url: url,
65 success: function() {
66 window.location.href = url;
67 },
68 error: function() {
69 navigate_to_first_existing(urls);
70 }
71 });
72 }
73
74 function on_version_switch() {
75 var selected_version = $(this).children('option:selected').attr('value') + '/';
76 var url = window.location.href;
77 var current_language = language_segment_from_url(url);
78 var current_version = version_segment_in_url(url);
79 var new_url = url.replace('.org/' + current_language + current_version,
80 '.org/' + current_language + selected_version);
81 if (new_url != url) {
82 navigate_to_first_existing([
83 new_url,
84 url.replace('.org/' + current_language + current_version,
85 '.org/' + selected_version),
86 'https://docs.python.org/' + current_language + selected_version,
87 'https://docs.python.org/' + selected_version,
88 'https://docs.python.org/'
89 ]);
90 }
91 }
92
93 function on_language_switch() {
94 var selected_language = $(this).children('option:selected').attr('value') + '/';
95 var url = window.location.href;
96 var current_language = language_segment_from_url(url);
97 var current_version = version_segment_in_url(url);
98 if (selected_language == 'en/') // Special 'default' case for english.
99 selected_language = '';
100 var new_url = url.replace('.org/' + current_language + current_version,
101 '.org/' + selected_language + current_version);
102 if (new_url != url) {
103 navigate_to_first_existing([
104 new_url,
105 'https://docs.python.org/'
106 ]);
107 }
108 }
109
110 // Returns the path segment of the language as a string, like 'fr/'
111 // or '' if not found.
112 function language_segment_from_url(url) {
Julien Palardfe8d9dc2017-08-13 23:44:51 +0200113 var language_regexp = '\.org/([a-z]{2}(?:-[a-z]{2})?/)';
Julien Palard245dafc2017-08-08 14:14:23 +0200114 var match = url.match(language_regexp);
115 if (match !== null)
116 return match[1];
117 return '';
118 }
119
120 // Returns the path segment of the version as a string, like '3.6/'
121 // or '' if not found.
122 function version_segment_in_url(url) {
Julien Palardfe8d9dc2017-08-13 23:44:51 +0200123 var language_segment = '(?:[a-z]{2}(?:-[a-z]{2})?/)';
Julien Palard245dafc2017-08-08 14:14:23 +0200124 var version_segment = '(?:(?:' + version_regexs.join('|') + ')/)';
125 var version_regexp = '\\.org/' + language_segment + '?(' + version_segment + ')';
126 var match = url.match(version_regexp);
127 if (match !== null)
128 return match[1];
129 return ''
130 }
131
132 $(document).ready(function() {
133 var release = DOCUMENTATION_OPTIONS.VERSION;
134 var language_segment = language_segment_from_url(window.location.href);
135 var current_language = language_segment.replace(/\/+$/g, '') || 'en';
136 var version = release.substr(0, 3);
137 var version_select = build_version_select(version, release);
138
139 $('.version_switcher_placeholder').html(version_select);
140 $('.version_switcher_placeholder select').bind('change', on_version_switch);
141
142 var language_select = build_language_select(current_language);
143
144 $('.language_switcher_placeholder').html(language_select);
145 $('.language_switcher_placeholder select').bind('change', on_language_switch);
146 });
147})();