makeTreeData = (data) => {
data.sort((a, b) => d3.ascending(a.name, b.name));
let prefixes = new Set();
prefixes.add(data[0].firstLetter);
let prevPrefix = data[0].firstLetter;
let i = 0;
for (let i = 0; i < data.length; i++) {
let datum = data[i];
let com = commonPrefix(prevPrefix, datum.name);
if (com == datum.firstLetter && i < data.length - 1) {
com = commonPrefix(data[i + 1].name, datum.name);
}
prevPrefix = data[i].name;
prefixes.add(com);
}
prefixes = [...prefixes].sort((a, b) => b.length - a.length);
const sliceUp = (str) => {
let pieces = [];
for (let prefix of prefixes) {
if (str.startsWith(prefix)) {
pieces.push(str.slice(prefix.length));
str = prefix;
}
}
pieces.push(str);
return pieces.reverse().join("/");
};
const stratified = d3.stratify().path((d) => sliceUp(d.name))(data);
const root = d3.hierarchy(stratified);
return root.copy().sum((d) => d.data?.value);
}