@@ -143,16 +143,6 @@ def current_dev(self) -> Version:
143143 """Find the current CPython version in development."""
144144 return max (self , key = Version .as_tuple )
145145
146- def setup_indexsidebar (self , current : Version , dest_path : Path ) -> None :
147- """Build indexsidebar.html for Sphinx."""
148- template_path = HERE / "templates" / "indexsidebar.html"
149- template = jinja2 .Template (template_path .read_text (encoding = "UTF-8" ))
150- rendered_template = template .render (
151- current_version = current ,
152- versions = list (reversed (self )),
153- )
154- dest_path .write_text (rendered_template , encoding = "UTF-8" )
155-
156146
157147@dataclasses .dataclass (frozen = True , kw_only = True , slots = True )
158148class Version :
@@ -529,9 +519,9 @@ class DocBuilder:
529519 """Builder for a CPython version and a language."""
530520
531521 version : Version
532- versions : Versions
533522 language : Language
534523 cpython_repo : Repository
524+ indexsidebar_content : bytes
535525 switchers_content : bytes
536526 build_root : Path
537527 www_root : Path
@@ -667,10 +657,8 @@ def build(self) -> None:
667657 text = text .replace (" -A switchers=1" , "" )
668658 (self .checkout / "Doc" / "Makefile" ).write_text (text , encoding = "utf-8" )
669659
670- self .versions .setup_indexsidebar (
671- self .version ,
672- self .checkout / "Doc" / "tools" / "templates" / "indexsidebar.html" ,
673- )
660+ indexsidebar_path = self .checkout / "Doc/tools/templates/indexsidebar.html"
661+ indexsidebar_path .write_bytes (self .indexsidebar_content )
674662 run_with_logging ([
675663 "make" ,
676664 "-C" ,
@@ -1098,6 +1086,7 @@ def build_docs(args: argparse.Namespace) -> bool:
10981086 force_build = args .force
10991087 del args .force
11001088
1089+ isb_content , eol_isb_content = render_indexsidebar (versions )
11011090 switchers_content = render_switchers (versions , languages )
11021091
11031092 build_succeeded = set ()
@@ -1117,12 +1106,14 @@ def build_docs(args: argparse.Namespace) -> bool:
11171106 scope = sentry_sdk .get_isolation_scope ()
11181107 scope .set_tag ("version" , version .name )
11191108 scope .set_tag ("language" , language .tag )
1120- cpython_repo .update ()
1109+ cpython_repo .update ()
1110+ v_isb_content = isb_content if version .status != "EOL" else eol_isb_content
11211111 builder = DocBuilder (
11221112 version ,
11231113 versions ,
11241114 language ,
11251115 cpython_repo ,
1116+ v_isb_content ,
11261117 switchers_content ,
11271118 ** vars (args ),
11281119 )
@@ -1178,6 +1169,23 @@ def parse_languages_from_config() -> Languages:
11781169 return Languages .from_json (config ["defaults" ], config ["languages" ])
11791170
11801171
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
1187+
1188+
11811189def render_switchers (versions : Versions , languages : Languages ) -> bytes :
11821190 language_pairs = sorted ((l .tag , l .switcher_label ) for l in languages if l .in_prod ) # NoQA: E741
11831191 version_pairs = [(v .name , v .picker_label ) for v in reversed (versions )]
0 commit comments