|
| 1 | +'''Generate index.html listing all doc versions on gh-pages.''' |
| 2 | +import re |
| 3 | +import sys |
| 4 | +from pathlib import Path |
| 5 | +from string import Template |
| 6 | + |
| 7 | + |
| 8 | +def find_versions() -> list[str]: |
| 9 | + '''Find version directories (e.g., 0.2.1, 1.0.0) sorted descending.''' |
| 10 | + dirs = [ |
| 11 | + d.name for d in Path('.').iterdir() |
| 12 | + if d.is_dir() and re.match(r'\d', d.name) |
| 13 | + ] |
| 14 | + dirs.sort(key=lambda v: [int(x) for x in v.split('.')], reverse=True) |
| 15 | + return dirs |
| 16 | + |
| 17 | + |
| 18 | +def find_latest_version(versions: list[str]) -> str | None: |
| 19 | + '''Return the version that /latest/ points to, if any.''' |
| 20 | + if not versions or not Path('latest').is_dir(): |
| 21 | + return None |
| 22 | + return versions[0] |
| 23 | + |
| 24 | + |
| 25 | +def build_version_list(versions: list[str], latest_version: str | None) -> str: |
| 26 | + '''Build HTML list items for all versions.''' |
| 27 | + lines: list[str] = [] |
| 28 | + if latest_version: |
| 29 | + lines.append(f' <li><a href="latest/">latest</a> <span class="meta">({latest_version})</span></li>') |
| 30 | + if Path('dev').is_dir(): |
| 31 | + lines.append(' <li><a href="dev/">dev</a></li>') |
| 32 | + for v in versions: |
| 33 | + lines.append(f' <li><a href="{v}/">{v}</a></li>') |
| 34 | + return '\n'.join(lines) |
| 35 | + |
| 36 | + |
| 37 | +def main() -> None: |
| 38 | + repo_name = sys.argv[1] |
| 39 | + repo_url = sys.argv[2] |
| 40 | + |
| 41 | + template_path = Path(__file__).parent / 'index.html' |
| 42 | + template = Template(template_path.read_text()) |
| 43 | + |
| 44 | + versions = find_versions() |
| 45 | + latest_version = find_latest_version(versions) |
| 46 | + version_list = build_version_list(versions, latest_version) |
| 47 | + |
| 48 | + html = template.substitute( |
| 49 | + repo_name=repo_name, |
| 50 | + repo_url=repo_url, |
| 51 | + version_list=version_list, |
| 52 | + ) |
| 53 | + |
| 54 | + Path('index.html').write_text(html) |
| 55 | + |
| 56 | + |
| 57 | +main() |
0 commit comments