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.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();
})();