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