Thanks to visit codestin.com
Credit goes to github.com

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)