|
4 | 4 | if (!String.prototype.startsWith) {
|
5 | 5 | Object.defineProperty(String.prototype, 'startsWith', {
|
6 | 6 | value: function(search, rawPos) {
|
7 |
| - var pos = rawPos > 0 ? rawPos|0 : 0; |
| 7 | + const pos = rawPos > 0 ? rawPos|0 : 0; |
8 | 8 | return this.substring(pos, pos + search.length) === search;
|
9 | 9 | }
|
10 | 10 | });
|
11 | 11 | }
|
12 | 12 |
|
13 | 13 | // Parses versions in URL segments like:
|
14 | 14 | // "3", "dev", "release/2.7" or "3.6rc2"
|
15 |
| - var version_regexs = [ |
| 15 | + const version_regexs = [ |
16 | 16 | '(?:\\d)',
|
17 | 17 | '(?:\\d\\.\\d[\\w\\d\\.]*)',
|
18 | 18 | '(?:dev)',
|
19 | 19 | '(?:release/\\d.\\d[\\x\\d\\.]*)'];
|
20 | 20 |
|
21 |
| - var all_versions = $VERSIONS; |
22 |
| - var all_languages = $LANGUAGES; |
| 21 | + const all_versions = $VERSIONS; |
| 22 | + const all_languages = $LANGUAGES; |
23 | 23 |
|
24 | 24 | function quote_attr(str) {
|
25 | 25 | return '"' + str.replace('"', '\\"') + '"';
|
26 | 26 | }
|
27 | 27 |
|
28 | 28 | function build_version_select(release) {
|
29 |
| - var buf = ['<select id="version_select">']; |
30 |
| - var major_minor = release.split(".").slice(0, 2).join("."); |
| 29 | + let buf = ['<select id="version_select">']; |
| 30 | + const major_minor = release.split(".").slice(0, 2).join("."); |
31 | 31 |
|
32 |
| - $.each(all_versions, function(version, title) { |
33 |
| - if (version == major_minor) |
| 32 | + Object.entries(all_versions).forEach(function([version, title]) { |
| 33 | + if (version === major_minor) { |
34 | 34 | buf.push('<option value=' + quote_attr(version) + ' selected="selected">' + release + '</option>');
|
35 |
| - else |
| 35 | + } else { |
36 | 36 | buf.push('<option value=' + quote_attr(version) + '>' + title + '</option>');
|
| 37 | + } |
37 | 38 | });
|
38 | 39 |
|
39 | 40 | buf.push('</select>');
|
40 | 41 | return buf.join('');
|
41 | 42 | }
|
42 | 43 |
|
43 | 44 | function build_language_select(current_language) {
|
44 |
| - var buf = ['<select id="language_select">']; |
| 45 | + let buf = ['<select id="language_select">']; |
45 | 46 |
|
46 |
| - $.each(all_languages, function(language, title) { |
47 |
| - if (language == current_language) |
48 |
| - buf.push('<option value="' + language + '" selected="selected">' + |
49 |
| - all_languages[current_language] + '</option>'); |
50 |
| - else |
| 47 | + Object.entries(all_languages).forEach(function([language, title]) { |
| 48 | + if (language === current_language) { |
| 49 | + buf.push('<option value="' + language + '" selected="selected">' + title + '</option>'); |
| 50 | + } else { |
51 | 51 | buf.push('<option value="' + language + '">' + title + '</option>');
|
| 52 | + } |
52 | 53 | });
|
53 | 54 | if (!(current_language in all_languages)) {
|
54 | 55 | // In case we're browsing a language that is not yet in all_languages.
|
|
62 | 63 |
|
63 | 64 | function navigate_to_first_existing(urls) {
|
64 | 65 | // Navigate to the first existing URL in urls.
|
65 |
| - var url = urls.shift(); |
| 66 | + const url = urls.shift(); |
66 | 67 | if (urls.length == 0 || url.startsWith("file:///")) {
|
67 | 68 | window.location.href = url;
|
68 | 69 | return;
|
69 | 70 | }
|
70 |
| - $.ajax({ |
71 |
| - url: url, |
72 |
| - success: function() { |
73 |
| - window.location.href = url; |
74 |
| - }, |
75 |
| - error: function() { |
| 71 | + fetch(url) |
| 72 | + .then(function(response) { |
| 73 | + if (response.ok) { |
| 74 | + window.location.href = url; |
| 75 | + } else { |
| 76 | + navigate_to_first_existing(urls); |
| 77 | + } |
| 78 | + }) |
| 79 | + .catch(function(error) { |
76 | 80 | navigate_to_first_existing(urls);
|
77 |
| - } |
78 |
| - }); |
| 81 | + }); |
79 | 82 | }
|
80 | 83 |
|
81 | 84 | function on_version_switch() {
|
82 |
| - var selected_version = $(this).children('option:selected').attr('value') + '/'; |
83 |
| - var url = window.location.href; |
84 |
| - var current_language = language_segment_from_url(); |
85 |
| - var current_version = version_segment_from_url(); |
86 |
| - var new_url = url.replace('/' + current_language + current_version, |
87 |
| - '/' + current_language + selected_version); |
| 85 | + const selected_version = this.options[this.selectedIndex].value + '/'; |
| 86 | + const url = window.location.href; |
| 87 | + const current_language = language_segment_from_url(); |
| 88 | + const current_version = version_segment_from_url(); |
| 89 | + const new_url = url.replace('/' + current_language + current_version, |
| 90 | + '/' + current_language + selected_version); |
88 | 91 | if (new_url != url) {
|
89 | 92 | navigate_to_first_existing([
|
90 | 93 | new_url,
|
|
98 | 101 | }
|
99 | 102 |
|
100 | 103 | function on_language_switch() {
|
101 |
| - var selected_language = $(this).children('option:selected').attr('value') + '/'; |
102 |
| - var url = window.location.href; |
103 |
| - var current_language = language_segment_from_url(); |
104 |
| - var current_version = version_segment_from_url(); |
105 |
| - if (selected_language == 'en/') // Special 'default' case for english. |
| 104 | + let selected_language = this.options[this.selectedIndex].value + '/'; |
| 105 | + const url = window.location.href; |
| 106 | + const current_language = language_segment_from_url(); |
| 107 | + const current_version = version_segment_from_url(); |
| 108 | + if (selected_language == 'en/') // Special 'default' case for English. |
106 | 109 | selected_language = '';
|
107 |
| - var new_url = url.replace('/' + current_language + current_version, |
| 110 | + let new_url = url.replace('/' + current_language + current_version, |
108 | 111 | '/' + selected_language + current_version);
|
109 | 112 | if (new_url != url) {
|
110 | 113 | navigate_to_first_existing([
|
|
117 | 120 | // Returns the path segment of the language as a string, like 'fr/'
|
118 | 121 | // or '' if not found.
|
119 | 122 | function language_segment_from_url() {
|
120 |
| - var path = window.location.pathname; |
121 |
| - var language_regexp = '/((?:' + Object.keys(all_languages).join("|") + ')/)' |
122 |
| - var match = path.match(language_regexp); |
| 123 | + const path = window.location.pathname; |
| 124 | + const language_regexp = '/((?:' + Object.keys(all_languages).join("|") + ')/)' |
| 125 | + const match = path.match(language_regexp); |
123 | 126 | if (match !== null)
|
124 | 127 | return match[1];
|
125 | 128 | return '';
|
|
128 | 131 | // Returns the path segment of the version as a string, like '3.6/'
|
129 | 132 | // or '' if not found.
|
130 | 133 | function version_segment_from_url() {
|
131 |
| - var path = window.location.pathname; |
132 |
| - var language_segment = language_segment_from_url(); |
133 |
| - var version_segment = '(?:(?:' + version_regexs.join('|') + ')/)'; |
134 |
| - var version_regexp = language_segment + '(' + version_segment + ')'; |
135 |
| - var match = path.match(version_regexp); |
| 134 | + const path = window.location.pathname; |
| 135 | + const language_segment = language_segment_from_url(); |
| 136 | + const version_segment = '(?:(?:' + version_regexs.join('|') + ')/)'; |
| 137 | + const version_regexp = language_segment + '(' + version_segment + ')'; |
| 138 | + const match = path.match(version_regexp); |
136 | 139 | if (match !== null)
|
137 | 140 | return match[1];
|
138 | 141 | return ''
|
139 | 142 | }
|
140 | 143 |
|
141 | 144 | function create_placeholders_if_missing() {
|
142 |
| - var version_segment = version_segment_from_url(); |
143 |
| - var language_segment = language_segment_from_url(); |
144 |
| - var index = "/" + language_segment + version_segment; |
| 145 | + const version_segment = version_segment_from_url(); |
| 146 | + const language_segment = language_segment_from_url(); |
| 147 | + const index = "/" + language_segment + version_segment; |
145 | 148 |
|
146 |
| - if ($('.version_switcher_placeholder').length) |
| 149 | + if (document.querySelectorAll('.version_switcher_placeholder').length > 0) { |
147 | 150 | return;
|
| 151 | + } |
148 | 152 |
|
149 |
| - var html = '<span class="language_switcher_placeholder"></span> \ |
| 153 | + const html = '<span class="language_switcher_placeholder"></span> \ |
150 | 154 | <span class="version_switcher_placeholder"></span> \
|
151 | 155 | <a href="/" id="indexlink">Documentation</a> »';
|
152 | 156 |
|
153 |
| - var probable_places = [ |
| 157 | + const probable_places = [ |
154 | 158 | "body>div.related>ul>li:not(.right):contains('Documentation'):first",
|
155 | 159 | "body>div.related>ul>li:not(.right):contains('documentation'):first",
|
156 | 160 | ];
|
157 | 161 |
|
158 |
| - for (var i = 0; i < probable_places.length; i++) { |
159 |
| - var probable_place = $(probable_places[i]); |
| 162 | + for (let i = 0; i < probable_places.length; i++) { |
| 163 | + let probable_place = $(probable_places[i]); |
160 | 164 | if (probable_place.length == 1) {
|
161 | 165 | probable_place.html(html);
|
162 | 166 | document.getElementById('indexlink').href = index;
|
|
165 | 169 | }
|
166 | 170 | }
|
167 | 171 |
|
168 |
| - $(document).ready(function() { |
169 |
| - var language_segment = language_segment_from_url(); |
170 |
| - var current_language = language_segment.replace(/\/+$/g, '') || 'en'; |
171 |
| - var version_select = build_version_select(DOCUMENTATION_OPTIONS.VERSION); |
| 172 | + document.addEventListener('DOMContentLoaded', function() { |
| 173 | + const language_segment = language_segment_from_url(); |
| 174 | + const current_language = language_segment.replace(/\/+$/g, '') || 'en'; |
| 175 | + const version_select = build_version_select(DOCUMENTATION_OPTIONS.VERSION); |
172 | 176 |
|
173 | 177 | create_placeholders_if_missing();
|
174 |
| - $('.version_switcher_placeholder').html(version_select); |
175 |
| - $('.version_switcher_placeholder select').bind('change', on_version_switch); |
176 | 178 |
|
177 |
| - var language_select = build_language_select(current_language); |
| 179 | + let placeholders = document.querySelectorAll('.version_switcher_placeholder'); |
| 180 | + placeholders.forEach(function(placeholder) { |
| 181 | + placeholder.innerHTML = version_select; |
178 | 182 |
|
179 |
| - $('.language_switcher_placeholder').html(language_select); |
180 |
| - $('.language_switcher_placeholder select').bind('change', on_language_switch); |
| 183 | + let selectElement = placeholder.querySelector('select'); |
| 184 | + selectElement.addEventListener('change', on_version_switch); |
| 185 | + }); |
| 186 | + |
| 187 | + const language_select = build_language_select(current_language); |
| 188 | + |
| 189 | + placeholders = document.querySelectorAll('.language_switcher_placeholder'); |
| 190 | + placeholders.forEach(function(placeholder) { |
| 191 | + placeholder.innerHTML = language_select; |
| 192 | + |
| 193 | + let selectElement = placeholder.querySelector('select'); |
| 194 | + selectElement.addEventListener('change', on_language_switch); |
| 195 | + }); |
181 | 196 | });
|
182 | 197 | })();
|
0 commit comments