import streamlit as st import os from app.backend.constant import LEADERBOARD_ICON_MAP LEADERBOARD_MAP = {} LI_CSS = [] PAGE_SECTIONS = [] def init_leaderboard(): data_engine = st.session_state["data_engine"] leaderboard_map = {} page_sections = [] li_css = [] sort_id = 0 leaderboard_change = False page_change = False for dataset in data_engine.datasets: sort_id += 1 leaderboard = dataset["leaderboard"] name = dataset["name"] leaderboard_section = f"{leaderboard.capitalize()} Leaderboard" if leaderboard_section not in leaderboard_map: leaderboard_map[leaderboard_section] = [] if name.lower() == leaderboard.lower(): leaderboard_map[leaderboard_section].append((name, 0)) else: leaderboard_map[leaderboard_section].append((name, sort_id)) li_css.append(f""" ul[data-testid="stSidebarNavItems"] li:nth-child({sort_id}) {{ text-indent: 2rem; }} """) page_name = leaderboard_section if name.lower() == leaderboard.lower() else name.capitalize() page_sections.append(f""" [[pages]] path = "app/ui/pages/{name}.py" name = "{page_name}" icon = "{LEADERBOARD_ICON_MAP.get(page_name, "")}" """) # ensure leaderboard is first for k, v in leaderboard_map.items(): v.sort(key=lambda x: x[1]) if leaderboard_map != LEADERBOARD_MAP: LEADERBOARD_MAP.update(leaderboard_map) leaderboard_change = True if page_sections != PAGE_SECTIONS: PAGE_SECTIONS.clear() PAGE_SECTIONS.extend(page_sections) page_change = True if li_css != LI_CSS: LI_CSS.clear() LI_CSS.extend(li_css) return leaderboard_change, page_change def init_pages(leaderboard_change, page_change): # init pages if leaderboard_change: with open("app/ui/pages/data_page.py", "r", encoding="utf-8") as f: data_page = f.read() for leaderboard, group_names in LEADERBOARD_MAP.items(): for group_name in group_names: path = os.path.join("app/ui/pages", f"{group_name[0]}.py") with open(path, "w", encoding="utf-8") as f: f.write(data_page.replace("$group_name$", group_name[0]) ) if page_change: with open("app/ui/pages_sections.toml", "w", encoding="utf-8") as f: f.write("\n".join(PAGE_SECTIONS)) if __name__ == '__main__': init_leaderboard() init_pages() print("\n".join(PAGE_SECTIONS)) print("\n".join(LI_CSS))