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