From f0ebe92155f17c0359fa29c238dfd3f528afa767 Mon Sep 17 00:00:00 2001 From: Vinta Chen Date: Sun, 27 Sep 2026 14:47:00 +0800 Subject: [PATCH] fix: order category page JSON-LD ItemList to match rendered rows Category pages' JSON-LD ItemList listed entries in download order while the table renders them in README (editorial) order, so structured-data positions didn't match the visible rows. Co-Authored-By: Claude --- website/build.py | 3 ++- website/tests/test_build.py | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/website/build.py b/website/build.py index 27b9adc0..0f299340 100644 --- a/website/build.py +++ b/website/build.py @@ -755,8 +755,9 @@ def build(repo_root: Path) -> None: if parent_category: breadcrumbs.append((parent_category["name"], category_public_url(parent_category))) breadcrumbs.append((category["name"], category_url)) + page_entries = [entry for group in entry_groups for entry in group["entries"]] if entry_groups else entries category_json_ld = json.dumps( - build_category_json_ld(category_title.removesuffix(" - Awesome Python"), category_url, category_description, entries, breadcrumbs), + build_category_json_ld(category_title.removesuffix(" - Awesome Python"), category_url, category_description, page_entries, breadcrumbs), ensure_ascii=False, ).replace("' + start = category_html.index(marker) + len(marker) + data = json.loads(category_html[start : category_html.index("", start)]) + collection = next(node for node in data["@graph"] if node["@type"] == "CollectionPage") + items = collection["mainEntity"]["itemListElement"] + assert [(item["position"], item["name"]) for item in items] == [(1, "zeta"), (2, "alpha")] + def test_group_page_falls_back_to_default_description_in_json_ld(self, tmp_path): readme = textwrap.dedent("""\ # T