"""Generation de la carte hreflang (balises `alternate` multilingues + x-default). Pour chaque page (accueil + une par projet) : une alternate par langue du site plus un `x-default` pointant vers la langue par defaut. La `canonical` de chaque page est l'URL de la langue par defaut. URLs construites depuis `site.base_url` et `site.path_prefix` — deterministe, aucune horloge. """ from __future__ import annotations from . import deps def _build_url(base: str, prefix: str, rel: str) -> str: """base + prefixe de langue + chemin relatif, slashs normalises. rel == "" -> page d'accueil (slash final conserve).""" pre = prefix.strip("/") segs = [s for s in (pre, rel.strip("/")) if s] path = "/".join(segs) if not rel: return base + "/" + (path + "/" if path else "") return base + "/" + path def _page(base: str, prefixes: dict, langs: list, default: str, xdef: str, name: str, rel: str) -> dict: alternates = [{"hreflang": lang, "href": _build_url(base, prefixes[lang], rel)} for lang in langs] alternates.append({"hreflang": "x-default", "href": _build_url(base, prefixes[xdef], rel)}) return { "page": name, "canonical": _build_url(base, prefixes[default], rel), "alternates": alternates, } def generate(spec: dict, master: dict) -> dict: site = spec["site"] base = site["base_url"].rstrip("/") prefixes = site["path_prefix"] langs = site["langs"] default = site["default_lang"] xdef = site["x_default_lang"] pages = [_page(base, prefixes, langs, default, xdef, "home", "")] for p in master["projets"]: slug = deps.slugify(p["nom"]) pages.append(_page(base, prefixes, langs, default, xdef, p["code"], f"projets/{slug}")) return {"base_url": base, "x_default_lang": xdef, "pages": pages}