@@ -521,7 +521,7 @@ class DocBuilder:
521
521
version :Version
522
522
language :Language
523
523
cpython_repo :Repository
524
- indexsidebar_content :bytes
524
+ docs_by_version_content :bytes
525
525
switchers_content :bytes
526
526
build_root :Path
527
527
www_root :Path
@@ -657,8 +657,7 @@ def build(self) -> None:
657
657
text = text .replace (" -A switchers=1" ,"" )
658
658
(self .checkout / "Doc" / "Makefile" ).write_text (text ,encoding = "utf-8" )
659
659
660
- indexsidebar_path = self .checkout / "Doc/tools/templates/indexsidebar.html"
661
- indexsidebar_path .write_bytes (self .indexsidebar_content )
660
+ self .setup_indexsidebar ()
662
661
run_with_logging ([
663
662
"make" ,
664
663
"-C" ,
@@ -701,6 +700,18 @@ def build_venv(self) -> None:
701
700
run ([venv_path / "bin" / "python" ,"-m" ,"pip" ,"freeze" ,"--all" ])
702
701
self .venv = venv_path
703
702
703
+ def setup_indexsidebar (self )-> None :
704
+ """Copy indexsidebar.html for Sphinx."""
705
+ tmpl_src = HERE / "templates"
706
+ tmpl_dst = self .checkout / "Doc" / "tools" / "templates"
707
+ dbv_path = tmpl_dst / "_docs_by_version.html"
708
+
709
+ shutil .copy (tmpl_src / "indexsidebar.html" ,tmpl_dst / "indexsidebar.html" )
710
+ if self .version .status != "EOL" :
711
+ dbv_path .write_bytes (self .docs_by_version_content )
712
+ else :
713
+ shutil .copy (tmpl_src / "_docs_by_version.html" ,dbv_path )
714
+
704
715
def copy_build_to_webroot (self ,http :urllib3 .PoolManager )-> None :
705
716
"""Copy a given build to the appropriate webroot with appropriate rights."""
706
717
logging .info ("Publishing start." )
@@ -1086,7 +1097,7 @@ def build_docs(args: argparse.Namespace) -> bool:
1086
1097
force_build = args .force
1087
1098
del args .force
1088
1099
1089
- isb_content , eol_isb_content = render_indexsidebar (versions )
1100
+ docs_by_version_content = render_docs_by_version (versions ). encode ( )
1090
1101
switchers_content = render_switchers (versions ,languages )
1091
1102
1092
1103
build_succeeded = set ()
@@ -1107,13 +1118,12 @@ def build_docs(args: argparse.Namespace) -> bool:
1107
1118
scope .set_tag ("version" ,version .name )
1108
1119
scope .set_tag ("language" ,language .tag )
1109
1120
cpython_repo .update ()
1110
- v_isb_content = isb_content if version .status != "EOL" else eol_isb_content
1111
1121
builder = DocBuilder (
1112
1122
version ,
1113
1123
versions ,
1114
1124
language ,
1115
1125
cpython_repo ,
1116
- v_isb_content ,
1126
+ docs_by_version_content ,
1117
1127
switchers_content ,
1118
1128
** vars (args ),
1119
1129
)
@@ -1169,21 +1179,10 @@ def parse_languages_from_config() -> Languages:
1169
1179
return Languages .from_json (config ["defaults" ],config ["languages" ])
1170
1180
1171
1181
1172
- def render_indexsidebar (versions :Versions )-> tuple [bytes ,bytes ]:
1173
- """Pre-render indexsidebar.html for Sphinx."""
1174
- docs_by_version = f"""\
1175
- <h3>{{% trans %}}Docs by version{{% endtrans %}}</h3>
1176
- <ul>
1177
- { "\n " .join ([f' <li><a href="{ v .url } ">{ v .title } </a></li>' for v in reversed (versions )])}
1178
- <li><a href="https://www.python.org/doc/versions/">{{% trans %}}All versions{{% endtrans %}}</a></li>
1179
- </ul>
1180
- """
1181
-
1182
- template_path = HERE / "templates" / "indexsidebar.html"
1183
- template = Template (template_path .read_text (encoding = "UTF-8" ))
1184
- rendered_template = template .substitute (DOCS_BY_VERSION = docs_by_version ).encode ()
1185
- eol_template = template .substitute (DOCS_BY_VERSION = "" ).encode ()
1186
- return rendered_template ,eol_template
1182
+ def render_docs_by_version (versions :Versions )-> str :
1183
+ """Generate content for _docs_by_version.html."""
1184
+ links = [f'<li><a href="{ v .url } ">{ v .title } </a></li>' for v in reversed (versions )]
1185
+ return "\n " .join (links )
1187
1186
1188
1187
1189
1188
def render_switchers (versions :Versions ,languages :Languages )-> bytes :