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