Skip to content

Commit dd65c34

Browse files
committed
Deduplicate version and language switchers informations.
1 parent 037a41e commit dd65c34

File tree

2 files changed

+89
-53
lines changed

2 files changed

+89
-53
lines changed

build_docs.py

Lines changed: 55 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
"""
3333

3434
from bisect import bisect_left as bisect
35-
from collections import namedtuple
35+
from collections import namedtuple, OrderedDict
3636
from contextlib import contextmanager, suppress
3737
import filecmp
3838
import json
@@ -197,6 +197,14 @@ def git_clone(repository, directory, branch=None):
197197
shell_out(["git", "-C", directory, "checkout", branch])
198198

199199

200+
def version_to_tuple(version):
201+
return tuple(int(part) for part in version.split("."))
202+
203+
204+
def tuple_to_version(version_tuple):
205+
return ".".join(str(part) for part in version_tuple)
206+
207+
200208
def locate_nearest_version(available_versions, target_version):
201209
"""Look for the nearest version of target_version in available_versions.
202210
Versions are to be given as tuples, like (3, 7) for 3.7.
@@ -213,12 +221,6 @@ def locate_nearest_version(available_versions, target_version):
213221
'3.7'
214222
"""
215223

216-
def version_to_tuple(version):
217-
return tuple(int(part) for part in version.split("."))
218-
219-
def tuple_to_version(version_tuple):
220-
return ".".join(str(part) for part in version_tuple)
221-
222224
available_versions_tuples = sorted(
223225
[
224226
version_to_tuple(available_version)
@@ -267,6 +269,14 @@ def edit(file):
267269
os.rename(temporary, file)
268270

269271

272+
def picker_label(version):
273+
if version.status == "in development":
274+
return "dev ({})".format(version.name)
275+
if version.status == "pre-release":
276+
return "pre ({})".format(version.name)
277+
return version.name
278+
279+
270280
def setup_switchers(html_root):
271281
"""Setup cross-links between cpython versions:
272282
- Cross-link various languages in a language switcher
@@ -281,18 +291,36 @@ def setup_switchers(html_root):
281291
template.safe_substitute(
282292
{
283293
"LANGUAGES": json.dumps(
284-
{
285-
language.tag: language.name
286-
for language in LANGUAGES
287-
if language.in_prod
288-
}
289-
)
294+
OrderedDict(
295+
sorted(
296+
[
297+
(language.tag, language.name)
298+
for language in LANGUAGES
299+
if language.in_prod
300+
]
301+
)
302+
)
303+
),
304+
"VERSIONS": json.dumps(
305+
OrderedDict(
306+
[
307+
(version.name, picker_label(version))
308+
for version in sorted(
309+
VERSIONS,
310+
key=lambda v: version_to_tuple(v.name),
311+
reverse=True,
312+
)
313+
]
314+
)
315+
),
290316
}
291317
)
292318
)
293319
for file in Path(html_root).glob("**/*.html"):
294320
depth = len(file.relative_to(html_root).parts) - 1
295-
script = f""" <script type="text/javascript" src="{'../' * depth}_static/switchers.js"></script>\n"""
321+
script = """ <script type="text/javascript" src="{}_static/switchers.js"></script>\n""".format(
322+
"../" * depth
323+
)
296324
with edit(file) as (i, o):
297325
for line in i:
298326
if line == script:
@@ -385,13 +413,13 @@ def copy_build_to_webroot(
385413
"""Copy a given build to the appropriate webroot with appropriate rights.
386414
"""
387415
logging.info(
388-
"Publishing start for version: %s, language: %s", version, language.tag
416+
"Publishing start for version: %s, language: %s", version.name, language.tag
389417
)
390418
checkout = os.path.join(
391-
build_root, version, "cpython-{lang}".format(lang=language.tag)
419+
build_root, version.name, "cpython-{lang}".format(lang=language.tag)
392420
)
393421
if language.tag == "en":
394-
target = os.path.join(www_root, version)
422+
target = os.path.join(www_root, version.name)
395423
else:
396424
language_dir = os.path.join(www_root, language.tag)
397425
os.makedirs(language_dir, exist_ok=True)
@@ -400,7 +428,7 @@ def copy_build_to_webroot(
400428
except subprocess.CalledProcessError as err:
401429
logging.warning("Can't change group of %s: %s", language_dir, str(err))
402430
os.chmod(language_dir, 0o775)
403-
target = os.path.join(language_dir, version)
431+
target = os.path.join(language_dir, version.name)
404432

405433
os.makedirs(target, exist_ok=True)
406434
try:
@@ -475,7 +503,9 @@ def copy_build_to_webroot(
475503
shell_out(
476504
["curl", "-XPURGE", "https://docs.python.org/{%s}" % ",".join(to_purge)]
477505
)
478-
logging.info("Publishing done for version: %s, language: %s", version, language.tag)
506+
logging.info(
507+
"Publishing done for version: %s, language: %s", version.name, language.tag
508+
)
479509

480510

481511
def head(lines, n=10):
@@ -491,7 +521,7 @@ def version_info():
491521
subprocess.check_output(["xelatex", "--version"], universal_newlines=True), n=2
492522
)
493523
print(
494-
f"""build_docs: {VERSION}
524+
"""build_docs: {VERSION}
495525
496526
# platex
497527
@@ -501,7 +531,11 @@ def version_info():
501531
# xelatex
502532
503533
{xelatex_version}
504-
"""
534+
""".format(
535+
VERSION=VERSION,
536+
platex_version=platex_version,
537+
xelatex_version=xelatex_version,
538+
)
505539
)
506540

507541

switchers.js

Lines changed: 34 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,15 @@
11
(function() {
22
'use strict';
33

4+
if (!String.prototype.startsWith) {
5+
Object.defineProperty(String.prototype, 'startsWith', {
6+
value: function(search, rawPos) {
7+
var pos = rawPos > 0 ? rawPos|0 : 0;
8+
return this.substring(pos, pos + search.length) === search;
9+
}
10+
});
11+
}
12+
413
// Parses versions in URL segments like:
514
// "3", "dev", "release/2.7" or "3.6rc2"
615
var version_regexs = [
@@ -9,27 +18,22 @@
918
'(?:dev)',
1019
'(?:release/\\d.\\d[\\x\\d\\.]*)'];
1120

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-
21+
var all_versions = $VERSIONS;
2222
var all_languages = $LANGUAGES;
2323

24-
function build_version_select(current_version, current_release) {
24+
function quote_attr(str) {
25+
return '"' + str.replace('"', '\\"') + '"';
26+
}
27+
28+
function build_version_select(release) {
2529
var buf = ['<select>'];
30+
var major_minor = release.split(".").slice(0, 2).join(".");
2631

2732
$.each(all_versions, function(version, title) {
28-
buf.push('<option value="' + version + '"');
29-
if (version == current_version)
30-
buf.push(' selected="selected">' + current_release + '</option>');
33+
if (version == major_minor)
34+
buf.push('<option value=' + quote_attr(version) + ' selected="selected">' + release + '</option>');
3135
else
32-
buf.push('>' + title + '</option>');
36+
buf.push('<option value=' + quote_attr(version) + '>' + title + '</option>');
3337
});
3438

3539
buf.push('</select>');
@@ -59,7 +63,7 @@
5963
function navigate_to_first_existing(urls) {
6064
// Navigate to the first existing URL in urls.
6165
var url = urls.shift();
62-
if (urls.length == 0) {
66+
if (urls.length == 0 || url.startsWith("file:///")) {
6367
window.location.href = url;
6468
return;
6569
}
@@ -79,16 +83,16 @@
7983
var url = window.location.href;
8084
var current_language = language_segment_from_url(url);
8185
var current_version = version_segment_in_url(url);
82-
var new_url = url.replace('.org/' + current_language + current_version,
83-
'.org/' + current_language + selected_version);
86+
var new_url = url.replace('/' + current_language + current_version,
87+
'/' + current_language + selected_version);
8488
if (new_url != url) {
8589
navigate_to_first_existing([
8690
new_url,
87-
url.replace('.org/' + current_language + current_version,
88-
'.org/' + selected_version),
89-
'https://docs.python.org/' + current_language + selected_version,
90-
'https://docs.python.org/' + selected_version,
91-
'https://docs.python.org/'
91+
url.replace('/' + current_language + current_version,
92+
'/' + selected_version),
93+
'/' + current_language + selected_version,
94+
'/' + selected_version,
95+
'/'
9296
]);
9397
}
9498
}
@@ -100,20 +104,20 @@
100104
var current_version = version_segment_in_url(url);
101105
if (selected_language == 'en/') // Special 'default' case for english.
102106
selected_language = '';
103-
var new_url = url.replace('.org/' + current_language + current_version,
104-
'.org/' + selected_language + current_version);
107+
var new_url = url.replace('/' + current_language + current_version,
108+
'/' + selected_language + current_version);
105109
if (new_url != url) {
106110
navigate_to_first_existing([
107111
new_url,
108-
'https://docs.python.org/'
112+
'/'
109113
]);
110114
}
111115
}
112116

113117
// Returns the path segment of the language as a string, like 'fr/'
114118
// or '' if not found.
115119
function language_segment_from_url(url) {
116-
var language_regexp = '\.org/([a-z]{2}(?:-[a-z]{2})?/)';
120+
var language_regexp = '/((?:' + Object.keys(all_languages).join("|") + ')/)'
117121
var match = url.match(language_regexp);
118122
if (match !== null)
119123
return match[1];
@@ -123,9 +127,9 @@
123127
// Returns the path segment of the version as a string, like '3.6/'
124128
// or '' if not found.
125129
function version_segment_in_url(url) {
126-
var language_segment = '(?:[a-z]{2}(?:-[a-z]{2})?/)';
130+
var language_segment = language_segment_from_url(url);
127131
var version_segment = '(?:(?:' + version_regexs.join('|') + ')/)';
128-
var version_regexp = '\\.org/' + language_segment + '?(' + version_segment + ')';
132+
var version_regexp = language_segment + '(' + version_segment + ')';
129133
var match = url.match(version_regexp);
130134
if (match !== null)
131135
return match[1];
@@ -141,11 +145,9 @@
141145
}
142146

143147
$(document).ready(function() {
144-
var release = DOCUMENTATION_OPTIONS.VERSION;
145148
var language_segment = language_segment_from_url(window.location.href);
146149
var current_language = language_segment.replace(/\/+$/g, '') || 'en';
147-
var version = release.substr(0, 3);
148-
var version_select = build_version_select(version, release);
150+
var version_select = build_version_select(DOCUMENTATION_OPTIONS.VERSION);
149151

150152
create_placeholders_if_missing();
151153
$('.version_switcher_placeholder').html(version_select);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy