From 22829cfab969233441ab43b5d69cd7147b3b7ddd Mon Sep 17 00:00:00 2001 From: Abdessamad Derraz <3028866+Abdess@users.noreply.github.com> Date: Thu, 2 Apr 2026 00:46:21 +0200 Subject: [PATCH] feat: improve site ux with cards, badges and hash truncation --- scripts/generate_site.py | 107 +++++++++++++++++++++++---------------- 1 file changed, 64 insertions(+), 43 deletions(-) diff --git a/scripts/generate_site.py b/scripts/generate_site.py index 7eadc2b9..19fa085e 100644 --- a/scripts/generate_site.py +++ b/scripts/generate_site.py @@ -388,12 +388,11 @@ def generate_platform_index(coverages: dict) -> str: lines = [ f"# Platforms - {SITE_NAME}", "", - f"{len(coverages)} supported platforms, " - f"{total_present:,}/{total_files:,} files present, " - f"{total_verified:,} verified.", + f"{len(coverages)} supported platforms with " + f"{total_present:,} verified files.", "", - "| Platform | Coverage | Verification | Status |", - "|----------|----------|-------------|--------|", + "| Platform | Files | Verification | Download |", + "|----------|-------|-------------|----------|", ] mode_labels = { @@ -404,38 +403,16 @@ def generate_platform_index(coverages: dict) -> str: for name, cov in sorted(coverages.items(), key=lambda x: x[1]["platform"]): display = cov["platform"] - pct_val = cov["present"] / cov["total"] * 100 if cov["total"] else 0 - pct = _pct(cov["present"], cov["total"]) - plat_status = cov["config"].get("status", "active") - - badge_cls = ( - "rb-badge-success" - if pct_val >= 95 - else "rb-badge-warning" - if pct_val >= 70 - else "rb-badge-danger" - ) - coverage_str = ( - f'{cov["present"]}/{cov["total"]} ' - f'{pct}' - ) mode_html = mode_labels.get( cov["mode"], f'{cov["mode"]}', ) - if plat_status == "archived": - status = 'archived' - elif pct_val >= 100: - status = 'complete' - elif pct_val >= 95: - status = 'near' - else: - status = 'partial' - lines.append( - f"| [{display}]({name}.md) | {coverage_str} | {mode_html} | {status} |" + f"| [{display}]({name}.md) | " + f"{cov['present']:,} | {mode_html} | " + f"[Pack]({RELEASE_URL}){{ .md-button .md-button--primary }} |" ) return "\n".join(lines) + "\n" @@ -721,38 +698,66 @@ def generate_system_page( md5_full = f.get("md5", "unknown") size = _fmt_size(f.get("size", 0)) - # Cross-reference: which platforms declare this file + # Cross-reference plats = sorted(p for p, names in platform_files.items() if name in names) - # Cross-reference: which emulators load this file emus = sorted( e for e, data in emulator_files.items() if name in data.get("files", set()) ) - lines.append(f"**`{name}`** ({size})") + # Truncated hashes for readability + sha1_short = sha1_full[:12] if sha1_full != "unknown" else "-" + md5_short = md5_full[:12] if md5_full != "unknown" else "-" + + lines.append('
') lines.append("") - lines.append(f"- SHA1: `{sha1_full}`") - lines.append(f"- MD5: `{md5_full}`") + lines.append( + f'**`{name}`** ' + f'{size}' + ) + lines.append("") + lines.append( + f'- SHA1: `{sha1_short}...`' + ) + lines.append( + f'- MD5: `{md5_short}...`' + ) if plats: - plat_links = [_platform_link(p, p, "../") for p in plats] - lines.append(f"- Platforms: {', '.join(plat_links)}") + plat_badges = " ".join( + f'' + f"[{p}](../platforms/{p}.md)" + for p in plats + ) + lines.append(f"- Platforms: {plat_badges}") if emus: emu_links = [_emulator_link(e, "../") for e in emus] lines.append(f"- Emulators: {', '.join(emu_links)}") lines.append("") + lines.append("
") + lines.append("") if variant_files: - lines.append("**Variants:**") + lines.append( + f'??? note "Variants ({len(variant_files)})"' + ) lines.append("") for v in sorted(variant_files, key=lambda x: x["name"]): vname = v["name"] vmd5 = v.get("md5", "unknown") - lines.append(f"- `{vname}` MD5: `{vmd5}`") + vmd5_short = vmd5[:12] if vmd5 != "unknown" else "-" + lines.append( + f' - `{vname}` ' + f'' + f"MD5: {vmd5_short}..." + ) + lines.append("") lines.append("") - lines.append(f"*Generated on {_timestamp()}*") + lines.append(f'
Generated on {_timestamp()}.
') return "\n".join(lines) + "\n" @@ -891,6 +896,8 @@ def generate_emulator_page( lines = [ f"# {emu_name} - {SITE_NAME}", "", + '
', + "", "| | |", "|---|---|", f"| Type | {emu_type} |", @@ -946,6 +953,8 @@ def generate_emulator_page( else: lines.append(f"| {label} | {val} |") lines.append("") + lines.append("
") + lines.append("") # Platform-specific details (rich structured data) platform_details = profile.get("platform_details") @@ -1184,13 +1193,25 @@ def generate_emulator_page( bounds.append(f"max {_fmt_size(fmax)}") details.append(f"Size: {', '.join(bounds)}") if fsha1: - details.append(f"SHA1: `{fsha1}`") + s = fsha1[:12] + details.append( + f'SHA1: ' + f"`{s}...`" + ) if fmd5: - details.append(f"MD5: `{fmd5}`") + s = fmd5[:12] + details.append( + f'MD5: ' + f"`{s}...`" + ) if fcrc32: details.append(f"CRC32: `{fcrc32}`") if fsha256: - details.append(f"SHA256: `{fsha256}`") + s = fsha256[:12] + details.append( + f'SHA256: ' + f"`{s}...`" + ) if fadler32: details.append(f"Adler32: `{fadler32}`") if aliases: