feat: lay the site out as a reading funnel

Five tabs from Start here to Contribute, a level on every page, a device picker on Get your files that lists every registered platform, and platform pages that open on where the files go, the command, the pack and how to check. FAQ and troubleshooting keep the questions asked before installing, the technical ones move to their own page, and getting started points to the pages that took its content.
This commit is contained in:
Abdessamad Derraz committed 2026-10-22 11:50:53 +02:00
1 parent 533b85586f
commit 6353ee53df
27 files changed
+2574 -1922

No files matched your search

+1 -1
View File
@@ -659,7 +659,7 @@ def generate_readme(db: dict, platforms_dir: str) -> str:
"Hashes document what emulator code loads and accepts, not dump"
" provenance. That boundary, and how it relates to preservation"
" catalogs such as No-Intro, is drawn in the"
f" [FAQ]({SITE_URL}wiki/faq/"
f" [technical questions]({SITE_URL}wiki/technical-faq/"
"#are-these-files-verified-against-original-hardware-dumps).",
"",
"1. **Read emulator source code**: trace every file the code loads, its expected hash and size",
+783 -504
View File
File diff suppressed because it is too large. Load diff
+6
View File
@@ -20,6 +20,10 @@ _produced: set[str] = set()
def _record(path: str | Path) -> None:
_produced.add(os.path.realpath(str(path)))
# The reader level label the decoration pass puts above a page's title.
LEVEL_LABEL_START = '<span class="rb-level '
def _undecorated(markdown: str) -> str:
"""Return a page body without the front matter the decoration pass adds."""
if markdown.startswith("---\n") and "generated_by: retrobios-site" in markdown[:300]:
@@ -29,6 +33,8 @@ def _undecorated(markdown: str) -> str:
script_end = markdown.find("</script>\n\n")
if markdown.startswith('<script type="application/ld+json">') and script_end != -1:
markdown = markdown[script_end + len("</script>\n\n"):]
if markdown.startswith(LEVEL_LABEL_START):
markdown = markdown[markdown.find("\n\n") + 2:]
return markdown
def write_if_changed(path: str, content: str) -> bool: