Skip to content

Commit 490f807

Browse files
committed
Add needed informations to build the language switcher.
1 parent e23245a commit 490f807

File tree

1 file changed

+91
-92
lines changed

1 file changed

+91
-92
lines changed

build_docs.py

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

3434
from bisect import bisect_left as bisect
35+
from collections import namedtuple
3536
from contextlib import contextmanager, suppress
3637
import filecmp
3738
import logging
@@ -64,57 +65,56 @@
6465
("3.10", "master", True),
6566
]
6667

67-
LANGUAGES = ["en", "es", "fr", "id", "ja", "ko", "pt-br", "zh-cn", "zh-tw"]
68-
69-
SPHINXOPTS = {
70-
"ja": [
71-
"-D latex_engine=platex",
72-
"-D latex_elements.inputenc=",
73-
"-D latex_elements.fontenc=",
74-
],
75-
"ko": [
76-
"-D latex_engine=xelatex",
77-
"-D latex_elements.inputenc=",
78-
"-D latex_elements.fontenc=",
79-
r"-D latex_elements.preamble=\\usepackage{kotex}\\setmainhangulfont{UnBatang}\\setsanshangulfont{UnDotum}\\setmonohangulfont{UnTaza}",
80-
],
81-
"pt-br": [
82-
"-D latex_engine=xelatex",
83-
"-D latex_elements.inputenc=",
84-
"-D latex_elements.fontenc=",
85-
],
86-
"fr": [
87-
"-D latex_engine=xelatex",
88-
"-D latex_elements.inputenc=",
89-
r"-D latex_elements.fontenc=\\usepackage{fontspec}",
90-
],
91-
"en": [
92-
"-D latex_engine=xelatex",
93-
"-D latex_elements.inputenc=",
94-
"-D latex_elements.fontenc=",
95-
],
96-
"es": [
97-
"-D latex_engine=xelatex",
98-
"-D latex_elements.inputenc=",
99-
r"-D latex_elements.fontenc=\\usepackage{fontspec}",
100-
],
101-
"zh-cn": [
102-
"-D latex_engine=xelatex",
103-
"-D latex_elements.inputenc=",
104-
r"-D latex_elements.fontenc=\\usepackage{xeCJK}",
105-
],
106-
"zh-tw": [
107-
"-D latex_engine=xelatex",
108-
"-D latex_elements.inputenc=",
109-
r"-D latex_elements.fontenc=\\usepackage{xeCJK}",
110-
],
111-
"id": [
112-
"-D latex_engine=xelatex",
113-
"-D latex_elements.inputenc=",
114-
"-D latex_elements.fontenc=",
115-
],
68+
69+
Language = namedtuple(
70+
"Language", ["tag", "iso639_tag", "name", "in_prod", "sphinxopts"]
71+
)
72+
73+
XELATEX_DEFAULT = (
74+
"-D latex_engine=xelatex",
75+
"-D latex_elements.inputenc=",
76+
"-D latex_elements.fontenc=",
77+
)
78+
79+
PLATEX_DEFAULT = (
80+
"-D latex_engine=platex",
81+
"-D latex_elements.inputenc=",
82+
"-D latex_elements.fontenc=",
83+
)
84+
85+
XELATEX_WITH_FONTSPEC = (
86+
"-D latex_engine=xelatex",
87+
"-D latex_elements.inputenc=",
88+
r"-D latex_elements.fontenc=\\usepackage{fontspec}",
89+
)
90+
91+
XELATEX_FOR_KOREAN = (
92+
"-D latex_engine=xelatex",
93+
"-D latex_elements.inputenc=",
94+
"-D latex_elements.fontenc=",
95+
r"-D latex_elements.preamble=\\usepackage{kotex}\\setmainhangulfont{UnBatang}\\setsanshangulfont{UnDotum}\\setmonohangulfont{UnTaza}",
96+
)
97+
98+
XELATEX_WITH_CJK = (
99+
"-D latex_engine=xelatex",
100+
"-D latex_elements.inputenc=",
101+
r"-D latex_elements.fontenc=\\usepackage{xeCJK}",
102+
)
103+
104+
LANGUAGES = {
105+
Language("en", "en", "English", True, XELATEX_DEFAULT),
106+
Language("es", "es", "Spanish", False, XELATEX_WITH_FONTSPEC),
107+
Language("fr", "fr", "French", True, XELATEX_WITH_FONTSPEC),
108+
Language("id", "id", "Indonesian", False, XELATEX_DEFAULT),
109+
Language("ja", "ja", "Japanese", True, PLATEX_DEFAULT),
110+
Language("ko", "ko", "Korean", True, XELATEX_FOR_KOREAN),
111+
Language("pt-br", "pt_BR", "Brazilian Portuguese", True, XELATEX_DEFAULT),
112+
Language("zh-cn", "zh_CN", "Simplified Chinese", True, XELATEX_WITH_CJK),
113+
Language("zh-tw", "zh_TW", "Traditional Chinese", True, XELATEX_WITH_CJK),
116114
}
117115

116+
DEFAULT_LANGUAGES_SET = {language.tag for language in LANGUAGES if language.in_prod}
117+
118118

119119
def shell_out(cmd, shell=False, logfile=None):
120120
logging.debug("Running command %r", cmd)
@@ -191,17 +191,6 @@ def git_clone(repository, directory, branch=None):
191191
shell_out(["git", "-C", directory, "checkout", branch])
192192

193193

194-
def pep_545_tag_to_gettext_tag(tag):
195-
"""Transforms PEP 545 language tags like "pt-br" to gettext language
196-
tags like "pt_BR". (Note that none of those are IETF language tags
197-
like "pt-BR").
198-
"""
199-
if "-" not in tag:
200-
return tag
201-
language, region = tag.split("-")
202-
return language + "_" + region.upper()
203-
204-
205194
def locate_nearest_version(available_versions, target_version):
206195
"""Look for the nearest version of target_version in available_versions.
207196
Versions are to be given as tuples, like (3, 7) for 3.7.
@@ -297,27 +286,22 @@ def build_one(
297286
quick,
298287
venv,
299288
build_root,
300-
group="docs",
301-
log_directory="/var/log/docsbuild/",
302-
language=None,
289+
group,
290+
log_directory,
291+
language: Language,
303292
):
304-
if not language:
305-
language = "en"
306-
if sentry_sdk:
307-
with sentry_sdk.configure_scope() as scope:
308-
scope.set_tag("version", version)
309-
scope.set_tag("language", language)
310-
checkout = os.path.join(build_root, version, "cpython-{lang}".format(lang=language))
311-
logging.info("Build start for version: %s, language: %s", version, language)
312-
sphinxopts = SPHINXOPTS[language].copy()
293+
checkout = os.path.join(
294+
build_root, version, "cpython-{lang}".format(lang=language.tag)
295+
)
296+
logging.info("Build start for version: %s, language: %s", version, language.tag)
297+
sphinxopts = list(language.sphinxopts)
313298
sphinxopts.extend(["-q"])
314-
if language != "en":
315-
gettext_language_tag = pep_545_tag_to_gettext_tag(language)
299+
if language.tag != "en":
316300
locale_dirs = os.path.join(build_root, version, "locale")
317-
locale_clone_dir = os.path.join(
318-
locale_dirs, gettext_language_tag, "LC_MESSAGES"
301+
locale_clone_dir = os.path.join(locale_dirs, language.iso639_tag, "LC_MESSAGES")
302+
locale_repo = "https://github.com/python/python-docs-{}.git".format(
303+
language.tag
319304
)
320-
locale_repo = "https://github.com/python/python-docs-{}.git".format(language)
321305
git_clone(
322306
locale_repo,
323307
locale_clone_dir,
@@ -326,7 +310,7 @@ def build_one(
326310
sphinxopts.extend(
327311
(
328312
"-D locale_dirs={}".format(locale_dirs),
329-
"-D language={}".format(gettext_language_tag),
313+
"-D language={}".format(language.iso639_tag),
330314
"-D gettext_compact=0",
331315
)
332316
)
@@ -335,7 +319,7 @@ def build_one(
335319
"autobuild-" + ("dev" if isdev else "stable") + ("-html" if quick else "")
336320
)
337321
logging.info("Running make %s", maketarget)
338-
logname = "cpython-{lang}-{version}.log".format(lang=language, version=version)
322+
logname = "cpython-{lang}-{version}.log".format(lang=language.tag, version=version)
339323
python = os.path.join(venv, "bin/python")
340324
sphinxbuild = os.path.join(venv, "bin/sphinx-build")
341325
blurb = os.path.join(venv, "bin/blurb")
@@ -365,20 +349,30 @@ def build_one(
365349
)
366350
shell_out(["chgrp", "-R", group, log_directory])
367351
setup_switchers(os.path.join(checkout, "Doc", "build", "html"))
368-
logging.info("Build done for version: %s, language: %s", version, language)
352+
logging.info("Build done for version: %s, language: %s", version, language.tag)
369353

370354

371355
def copy_build_to_webroot(
372-
build_root, version, language, group, quick, skip_cache_invalidation, www_root
356+
build_root,
357+
version,
358+
language: Language,
359+
group,
360+
quick,
361+
skip_cache_invalidation,
362+
www_root,
373363
):
374364
"""Copy a given build to the appropriate webroot with appropriate rights.
375365
"""
376-
logging.info("Publishing start for version: %s, language: %s", version, language)
377-
checkout = os.path.join(build_root, version, "cpython-{lang}".format(lang=language))
378-
if language == "en":
366+
logging.info(
367+
"Publishing start for version: %s, language: %s", version, language.tag
368+
)
369+
checkout = os.path.join(
370+
build_root, version, "cpython-{lang}".format(lang=language.tag)
371+
)
372+
if language.tag == "en":
379373
target = os.path.join(www_root, version)
380374
else:
381-
language_dir = os.path.join(www_root, language)
375+
language_dir = os.path.join(www_root, language.tag)
382376
os.makedirs(language_dir, exist_ok=True)
383377
try:
384378
shell_out(["chgrp", "-R", group, language_dir])
@@ -460,7 +454,7 @@ def copy_build_to_webroot(
460454
shell_out(
461455
["curl", "-XPURGE", "https://docs.python.org/{%s}" % ",".join(to_purge)]
462456
)
463-
logging.info("Publishing done for version: %s, language: %s", version, language)
457+
logging.info("Publishing done for version: %s, language: %s", version, language.tag)
464458

465459

466460
def head(lines, n=10):
@@ -551,7 +545,7 @@ def parse_args():
551545
parser.add_argument(
552546
"--languages",
553547
nargs="*",
554-
default=LANGUAGES,
548+
default=DEFAULT_LANGUAGES_SET,
555549
help="Language translation, as a PEP 545 language tag like" " 'fr' or 'pt-br'.",
556550
metavar="fr",
557551
)
@@ -577,6 +571,7 @@ def setup_logging(log_directory):
577571

578572
def main():
579573
args = parse_args()
574+
languages_dict = {language.tag: language for language in LANGUAGES}
580575
if args.version:
581576
version_info()
582577
exit(0)
@@ -596,17 +591,21 @@ def main():
596591
]
597592
else:
598593
branches_to_do = BRANCHES
599-
if not args.languages:
594+
if args.languages:
595+
languages = [languages_dict[tag] for tag in args.languages]
596+
else:
600597
# Allow "--languages" to build all languages (as if not given)
601598
# instead of none. "--languages en" builds *no* translation,
602599
# as "en" is the untranslated one.
603-
args.languages = LANGUAGES
600+
languages = [
601+
language for language in LANGUAGES if language.tag in DEFAULT_LANGUAGES_SET
602+
]
604603
for version, git_branch, devel in branches_to_do:
605-
for language in args.languages:
604+
for language in languages:
606605
if sentry_sdk:
607606
with sentry_sdk.configure_scope() as scope:
608607
scope.set_tag("version", version)
609-
scope.set_tag("language", language if language else "en")
608+
scope.set_tag("language", language.tag)
610609
try:
611610
build_one(
612611
version,
@@ -631,7 +630,7 @@ def main():
631630
except Exception as err:
632631
logging.error(
633632
"Exception while building %s version %s: %s",
634-
language,
633+
language.tag,
635634
version,
636635
err,
637636
)

0 commit comments

Comments
 (0)