const state = { view: "summary", sort: "overall", direction: "desc", query: "", type: "all" }; const languages = ["DE", "EN", "ES", "FR", "ID", "IT", "NL", "PT", "VI", "AR", "HI", "JP", "KO", "RU", "TH", "ZH", "ZH-T"]; const summaryColumns = [["overall", "Overall"], ["digital", "Digital"], ["photo", "Photo"], ["latin", "Latin"], ["non_latin", "Non-Latin"], ["private", "Private"]]; function value(score) { return Number.isFinite(score) ? score.toFixed(1) : "โ€”"; } function metadata(model) { return MODEL_METADATA[model.name] || { label: model.name, links: [] }; } function linkIcon(label) { if (label === "GitHub") return ``; return ``; } function modelLinks(model) { const links = metadata(model).links || []; if (!links.length) return ""; return `${links.map((link) => `${linkIcon(link.label)}`).join("")}`; } function columnsForView() { return state.view === "languages" ? languages.map((language) => [language, language]) : summaryColumns; } function scoreFor(model, key) { return languages.includes(key) ? model.languages[key] : model[key]; } function sortIndicator(key) { if (state.sort !== key) return ``; return ``; } function renderHeader() { const headings = columnsForView().map(([key, label]) => ``).join(""); document.querySelector("#leaderboard-head").innerHTML = `RankModelType${headings}`; } function render(data) { const models = data.models .filter((m) => state.type === "all" || m.type === state.type) .filter((m) => `${m.name} ${m.source_name || ""}`.toLowerCase().includes(state.query)) .sort((a, b) => { const difference = scoreFor(a, state.sort) - scoreFor(b, state.sort); return state.direction === "desc" ? -difference : difference; }); renderHeader(); document.querySelector("#leaderboard-body").innerHTML = models.map((model, index) => { const scores = columnsForView().map(([key]) => `${value(scoreFor(model, key))}`).join(""); return `${index + 1}${metadata(model).label}${modelLinks(model)}${model.type}${scores}`; }).join(""); document.querySelectorAll("[data-column]").forEach((button) => button.addEventListener("click", () => { const column = button.dataset.column; state.direction = state.sort === column && state.direction === "desc" ? "asc" : "desc"; state.sort = column; render(data); })); } fetch("leaderboard.json") .then((response) => response.json()) .then((data) => { document.querySelector("#updated").textContent = `Last updated ยท ${data.benchmark.updated}`; render(data); document.querySelectorAll("[data-view]").forEach((button) => button.addEventListener("click", () => { state.view = button.dataset.view; state.sort = state.view === "languages" ? "EN" : "overall"; state.direction = "desc"; document.querySelectorAll("[data-view]").forEach((item) => item.classList.toggle("active", item === button)); render(data); })); document.querySelector("#search").addEventListener("input", (event) => { state.query = event.target.value.toLowerCase().trim(); render(data); }); document.querySelector("#type-filter").addEventListener("change", (event) => { state.type = event.target.value; render(data); }); }) .catch(() => { document.querySelector("#leaderboard-body").innerHTML = 'Could not load leaderboard data.'; });