diff --git a/website/build.py b/website/build.py index 8689ca90..c223ef18 100644 --- a/website/build.py +++ b/website/build.py @@ -6,6 +6,7 @@ import re import shutil from datetime import UTC, datetime from pathlib import Path +from typing import Any from jinja2 import Environment, FileSystemLoader from readme_parser import ParsedGroup, ParsedSection, parse_readme, parse_sponsors @@ -75,45 +76,40 @@ def extract_entries( Entries appearing in multiple categories are merged into a single entry with lists of categories and groups. """ - cat_to_group: dict[str, str] = {} - for group in groups: - for cat in group["categories"]: - cat_to_group[cat["name"]] = group["name"] + cat_to_group = {cat["name"]: group["name"] for group in groups for cat in group["categories"]} - seen: dict[tuple[str, str], dict] = {} # (url, name) -> entry - entries: list[dict] = [] + seen: dict[tuple[str, str], dict[str, Any]] = {} # (url, name) -> entry + entries: list[dict[str, Any]] = [] for cat in categories: group_name = cat_to_group.get(cat["name"], "Other") for entry in cat["entries"]: - url = entry["url"] - key = (url, entry["name"]) - if key in seen: - existing = seen[key] - if cat["name"] not in existing["categories"]: - existing["categories"].append(cat["name"]) - if group_name not in existing["groups"]: - existing["groups"].append(group_name) - subcat = entry["subcategory"] - if subcat: - scoped = f"{cat['name']} > {subcat}" - if not any(s["value"] == scoped for s in existing["subcategories"]): - existing["subcategories"].append({"name": subcat, "value": scoped}) - else: - merged = { + key = (entry["url"], entry["name"]) + existing: dict[str, Any] | None = seen.get(key) + if existing is None: + existing = { "name": entry["name"], - "url": url, + "url": entry["url"], "description": entry["description"], - "categories": [cat["name"]], - "groups": [group_name], - "subcategories": [{"name": entry["subcategory"], "value": f"{cat['name']} > {entry['subcategory']}"}] if entry["subcategory"] else [], + "categories": [], + "groups": [], + "subcategories": [], "stars": None, "owner": None, "last_commit_at": None, - "source_type": detect_source_type(url), + "source_type": detect_source_type(entry["url"]), "also_see": entry["also_see"], } - seen[key] = merged - entries.append(merged) + seen[key] = existing + entries.append(existing) + if cat["name"] not in existing["categories"]: + existing["categories"].append(cat["name"]) + if group_name not in existing["groups"]: + existing["groups"].append(group_name) + subcat = entry["subcategory"] + if subcat: + scoped = f"{cat['name']} > {subcat}" + if not any(s["value"] == scoped for s in existing["subcategories"]): + existing["subcategories"].append({"name": subcat, "value": scoped}) return entries