const HF = "https://huggingface.co/"; const esc = (s) => String(s ?? "").replace(/[&<>"]/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """ }[c])); const link = (path, text) => `${esc(text)}`; const size = (b) => (b >= 1e9 ? (b / 1e9).toFixed(1) + " GB" : b >= 1e6 ? Math.round(b / 1e6) + " MB" : Math.max(1, Math.round(b / 1e3)) + " KB"); const logo = (o) => (o === "danielrosehill" ? '' : o === "Hebrish" ? '' : ""); function card(d) { const facts = [["Size", size(d.bytes)]]; if (d.rows >= 10) facts.push(["Rows", d.rows.toLocaleString("en-US")]); if (d.license) facts.push(["License", esc(d.license)]); return `
${logo(d.owner)}${esc(d.owner)} · ${esc(d.type)}

${link("datasets/" + d.id, d.name)}

${esc(d.summary)}

${d.gated ? '
Access request
' : ""}
${facts.map(([k, v]) => `
${k}
${v}
`).join("")}
`; } const navCard = (n) => `
Navigator

${link("spaces/" + n.space, n.name)}

${esc(n.summary)}

${n.count} dataset${n.count === 1 ? "" : "s"}
`; const topicCard = (g) => `
Topic

${esc(g.name)}

${esc(g.datasets.slice(0, 3).map((d) => d.name).join(", "))} and more.

${g.datasets.length} datasets
`; (async () => { const data = await (await fetch("data.json")).json(); const q = document.getElementById("q"), out = document.getElementById("list"), tabs = document.getElementById("tabs"); const navName = Object.fromEntries(data.navigators.map((n) => [n.id, n.name])); document.getElementById("built").textContent = data.built; document.getElementById("count").textContent = `${data.total} datasets.`; const grid = (html) => `
${html}
`; const draw = () => { const slug = location.hash.slice(1), current = data.groups.find((g) => g.slug === slug); const term = q.value.trim().toLowerCase(); tabs.innerHTML = [`Navigators`, ...data.groups.map((g) => `${esc(g.tab)} (${g.datasets.length})`)].join(""); if (!term) { out.innerHTML = current ? `

${esc(current.name)}

` + grid(current.datasets.map(card).join("")) : "

Specialist navigators

" + grid(data.navigators.map(navCard).join("")) + "

By topic

" + grid(data.groups.map(topicCard).join("")); return; } const has = (...parts) => parts.join(" ").toLowerCase().includes(term); const groups = data.groups.map((g) => [g, g.datasets.filter((d) => has(d.id, d.name, d.type, d.summary))]).filter(([, h]) => h.length); const inside = data.inside.filter((d) => has(d.id, d.name, navName[d.nav])); out.innerHTML = groups.map(([g, h]) => `

${esc(g.name)}

` + grid(h.map(card).join(""))).join("") + (inside.length ? "

Inside the navigators

" + grid(inside.map((d) => `
${esc(d.id.split("/")[0])} · ${esc(navName[d.nav])}

${link("datasets/" + d.id, d.name)}

`).join("")) : ""); if (!out.innerHTML) out.innerHTML = '

No datasets match.

'; }; q.addEventListener("input", draw); addEventListener("hashchange", () => { q.value = ""; draw(); }); draw(); })();