|
|
@ -63,23 +63,39 @@ async function makeWaniKaniKanjiLevels(opts: { cache?: boolean } = {}) { |
|
|
|
|
|
|
|
export async function makeKanjiLevels() { |
|
|
|
const wk = await makeWaniKaniKanjiLevels({ cache: true }); |
|
|
|
const wkKanji = new Set( |
|
|
|
Object.values(wk).flatMap((v) => Object.values(v).flat()), |
|
|
|
); |
|
|
|
|
|
|
|
const beyond = yaml.load( |
|
|
|
readFileSync('assets/beyond.yaml', 'utf-8'), |
|
|
|
) as ILevelMap; |
|
|
|
|
|
|
|
for (const [cat, map] of Object.entries(beyond)) { |
|
|
|
const catMap = wk[cat] || {}; |
|
|
|
Object.entries(map).map(([levelString, ks]) => { |
|
|
|
catMap[levelString] = ks.filter((k) => !wkKanji.has(k)); |
|
|
|
const kanjiToLevel = new Map< |
|
|
|
string, |
|
|
|
{ |
|
|
|
level: number; |
|
|
|
deckName: string; |
|
|
|
} |
|
|
|
>(); |
|
|
|
|
|
|
|
const setKanjiToLevel = (lvMap: ILevelMap) => { |
|
|
|
Object.entries(lvMap).map(([cat, map]) => { |
|
|
|
Object.entries(map).map(([levelString, ks]) => { |
|
|
|
const level = Number(levelString); |
|
|
|
ks.map((k) => { |
|
|
|
let prev = kanjiToLevel.get(k); |
|
|
|
if (!prev || prev.level > level) { |
|
|
|
prev = { |
|
|
|
level, |
|
|
|
deckName: cat + '::' + levelString, |
|
|
|
}; |
|
|
|
kanjiToLevel.set(k, prev); |
|
|
|
} |
|
|
|
}); |
|
|
|
}); |
|
|
|
}); |
|
|
|
wk[cat] = catMap; |
|
|
|
} |
|
|
|
}; |
|
|
|
setKanjiToLevel(wk); |
|
|
|
setKanjiToLevel(beyond); |
|
|
|
|
|
|
|
return wk; |
|
|
|
return kanjiToLevel; |
|
|
|
} |
|
|
|
|
|
|
|
export async function repairBeyond() { |
|
|
|