mirror of
https://github.com/Abdess/retroarch_system.git
synced 2026-11-06 01:53:56 -06:00
fix: redirect every list part that goes away
This commit is contained in:
1 parent
4efd64be70
commit
6fb79cab6d
3 files changed
+60
-12
No files matched your search
+43
-12
@@ -3339,18 +3339,49 @@ PLATFORM_PART_BUDGET = 700
|
|||||||
PLATFORM_REFERENCE_BUDGET = 600
|
PLATFORM_REFERENCE_BUDGET = 600
|
||||||
|
|
||||||
|
|
||||||
# Every part page a platform list has had, with the system it held:
|
# Every part page the site has published, with the page it belongs to:
|
||||||
# platforms/batocera-atari-st.md -> platforms/batocera.md#atari-st. When a
|
# platforms/batocera-atari-st.md -> platforms/batocera.md#atari-st,
|
||||||
# budget or a list changes, a part can fold back into its platform page,
|
# gaps-files-to-source-7.md -> gaps.md. When a budget or a list changes, a
|
||||||
# and its address then redirects there instead of ending on the 404 page.
|
# part can fold back or the list shrink, and its address then redirects to
|
||||||
PLATFORM_PARTS_FILE = (Path(__file__).resolve().parent.parent
|
# that page instead of ending on the 404 page.
|
||||||
/ "website" / "src" / "data" / "platform-parts.json")
|
PUBLISHED_PARTS_FILE = (Path(__file__).resolve().parent.parent
|
||||||
|
/ "website" / "src" / "data" / "published-parts.json")
|
||||||
|
|
||||||
|
|
||||||
def _published_platform_parts() -> dict[str, str]:
|
def _published_parts() -> dict[str, str]:
|
||||||
if not PLATFORM_PARTS_FILE.is_file():
|
if not PUBLISHED_PARTS_FILE.is_file():
|
||||||
return {}
|
return {}
|
||||||
return json.loads(PLATFORM_PARTS_FILE.read_text(encoding="utf-8"))
|
return json.loads(PUBLISHED_PARTS_FILE.read_text(encoding="utf-8"))
|
||||||
|
|
||||||
|
|
||||||
|
def _parent_page(link: str) -> str:
|
||||||
|
"""The page a `parent:` link names (/platforms/batocera/), under docs/."""
|
||||||
|
path, _, fragment = link.partition("#")
|
||||||
|
stem = path.strip("/") or "index"
|
||||||
|
return f"{stem}.md" + (f"#{fragment}" if fragment else "")
|
||||||
|
|
||||||
|
|
||||||
|
def record_parts(docs: Path, present: set[str], published: dict[str, str]) -> dict[str, str]:
|
||||||
|
"""``published`` with every page of this run that names its parent.
|
||||||
|
|
||||||
|
Only platform parts were recorded: gaps-files-to-source-7 or
|
||||||
|
mame-files-10, gone once their list shrank, ended on the 404 page. A
|
||||||
|
part already recorded keeps its target, which may name a section.
|
||||||
|
"""
|
||||||
|
found = dict(published)
|
||||||
|
for rel in sorted(present):
|
||||||
|
page = docs / rel
|
||||||
|
if not page.is_file():
|
||||||
|
page = page.with_suffix(".mdx")
|
||||||
|
try:
|
||||||
|
with page.open(encoding="utf-8") as handle:
|
||||||
|
head = handle.read(2048)
|
||||||
|
except OSError:
|
||||||
|
continue
|
||||||
|
link = re.search(r"^parent:\n(?: .*\n)*? link: (\"[^\"\n]*\")", head, re.M)
|
||||||
|
if link and rel not in found:
|
||||||
|
found[rel] = _parent_page(json.loads(link[1]))
|
||||||
|
return dict(sorted(found.items()))
|
||||||
|
|
||||||
|
|
||||||
# A list moved off a reference page (gaps, provenance) is cut in parts of
|
# A list moved off a reference page (gaps, provenance) is cut in parts of
|
||||||
@@ -12156,7 +12187,7 @@ def _generate(args: argparse.Namespace) -> None:
|
|||||||
)
|
)
|
||||||
if HANDHELD_GUIDE:
|
if HANDHELD_GUIDE:
|
||||||
write_if_changed(str(docs / HANDHELD_GUIDE.path), generate_handheld_guide(HANDHELD_GUIDE))
|
write_if_changed(str(docs / HANDHELD_GUIDE.path), generate_handheld_guide(HANDHELD_GUIDE))
|
||||||
published_parts = _published_platform_parts()
|
published_parts = _published_parts()
|
||||||
for name, cov in coverages.items():
|
for name, cov in coverages.items():
|
||||||
# The emulators this platform runs, not every one of the system.
|
# The emulators this platform runs, not every one of the system.
|
||||||
runs = resolve_platform_cores(cov["config"], profiles)
|
runs = resolve_platform_cores(cov["config"], profiles)
|
||||||
@@ -12345,8 +12376,6 @@ def _generate(args: argparse.Namespace) -> None:
|
|||||||
stale += _sweep_top_pages(docs)
|
stale += _sweep_top_pages(docs)
|
||||||
|
|
||||||
print("Adding page metadata and structured data...")
|
print("Adding page metadata and structured data...")
|
||||||
write_if_changed(str(PLATFORM_PARTS_FILE),
|
|
||||||
json.dumps(dict(sorted(published_parts.items())), indent=1) + "\n")
|
|
||||||
lastmod = decorate_markdown_pages(docs)
|
lastmod = decorate_markdown_pages(docs)
|
||||||
|
|
||||||
nav = generate_nav(coverages, manufacturers, profiles, registry,
|
nav = generate_nav(coverages, manufacturers, profiles, registry,
|
||||||
@@ -12357,6 +12386,8 @@ def _generate(args: argparse.Namespace) -> None:
|
|||||||
path.relative_to(docs).with_suffix(".md").as_posix()
|
path.relative_to(docs).with_suffix(".md").as_posix()
|
||||||
for path in docs.rglob("*.md*") if path.suffix in (".md", ".mdx")
|
for path in docs.rglob("*.md*") if path.suffix in (".md", ".mdx")
|
||||||
} - {"404.md"}
|
} - {"404.md"}
|
||||||
|
published_parts = record_parts(docs, present, published_parts)
|
||||||
|
write_if_changed(str(PUBLISHED_PARTS_FILE), json.dumps(published_parts, indent=1) + "\n")
|
||||||
generated = site / "src" / "generated"
|
generated = site / "src" / "generated"
|
||||||
generated.mkdir(parents=True, exist_ok=True)
|
generated.mkdir(parents=True, exist_ok=True)
|
||||||
write_if_changed(str(generated / "sidebar.json"),
|
write_if_changed(str(generated / "sidebar.json"),
|
||||||
|
|||||||
@@ -279,6 +279,23 @@ class Redirects(unittest.TestCase):
|
|||||||
source = Path(generate_site.__file__).read_text(encoding="utf-8")
|
source = Path(generate_site.__file__).read_text(encoding="utf-8")
|
||||||
self.assertIn('generated / "redirects.json"', source)
|
self.assertIn('generated / "redirects.json"', source)
|
||||||
|
|
||||||
|
def test_a_list_part_gone_with_its_rows_redirects_to_its_page(self):
|
||||||
|
"""Only platform parts were recorded: gaps-files-to-source-7, gone
|
||||||
|
once 29 files were collected, ended on the 404 page."""
|
||||||
|
with tempfile.TemporaryDirectory() as tmp:
|
||||||
|
docs = Path(tmp)
|
||||||
|
part = '---\nlevel: reference\nparent:\n label: "Gaps"\n link: "/gaps/"\n---\n\n# P\n'
|
||||||
|
(docs / "gaps-files-to-source-7.md").write_text(part, encoding="utf-8")
|
||||||
|
(docs / "gaps.md").write_text("# Gaps\n", encoding="utf-8")
|
||||||
|
kept = {"platforms/b-atari-st.md": "platforms/b.md#atari-st"}
|
||||||
|
published = generate_site.record_parts(
|
||||||
|
docs, {"gaps-files-to-source-7.md", "gaps.md"}, kept)
|
||||||
|
self.assertEqual(published, {"gaps-files-to-source-7.md": "gaps.md", **kept})
|
||||||
|
# The next run made six parts.
|
||||||
|
self.assertEqual(
|
||||||
|
sitestarlight.redirects({}, {"gaps.md", "platforms/b.md"}, published),
|
||||||
|
{"/gaps-files-to-source-7/": "/gaps/", "/platforms/b-atari-st/": "/platforms/b/#atari-st"})
|
||||||
|
|
||||||
|
|
||||||
class PlatformShareCards(unittest.TestCase):
|
class PlatformShareCards(unittest.TestCase):
|
||||||
def test_every_platform_page_shares_its_own_card(self):
|
def test_every_platform_page_shares_its_own_card(self):
|
||||||
|
|||||||
File renamed without changes.
Reference in new issue
Block a user