update wk populate
This commit is contained in:
1 parent
292beabffe
commit
6d46308e78
5 files changed
+244
-242
No files matched your search
@@ -1,95 +1,9 @@
|
||||
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
||||
import { readFileSync, writeFileSync } from 'fs';
|
||||
|
||||
import { IKanji, WaniKani } from '@/wanikani';
|
||||
import { ILevelMap } from '@/level';
|
||||
import { WaniKani } from '@/wanikani';
|
||||
import yaml from 'js-yaml';
|
||||
|
||||
interface ILevelMap {
|
||||
[category: string]: {
|
||||
[levelString: string]: string[];
|
||||
};
|
||||
}
|
||||
|
||||
async function makeWaniKaniKanjiLevels(
|
||||
opts: { cache?: boolean; force?: boolean } = {},
|
||||
) {
|
||||
const FILENAME = 'cache/wanikani-kanji.yaml';
|
||||
if (opts.cache && existsSync(FILENAME)) {
|
||||
return yaml.load(readFileSync(FILENAME, 'utf-8')) as ILevelMap;
|
||||
}
|
||||
|
||||
const wkKanji = await new WaniKani()
|
||||
.subjects({ force: !!opts.force })
|
||||
.then((vs) => vs.filter((v) => v.object === 'kanji') as IKanji[]);
|
||||
|
||||
const levelMap: ILevelMap = {};
|
||||
|
||||
for (const k of wkKanji) {
|
||||
const { level, characters } = k.data;
|
||||
const label = WaniKani.getLevelLabel(level);
|
||||
if (!label) throw new Error(`Invalid level: ${level}`);
|
||||
|
||||
const category = `${label.range}: ${
|
||||
label.ja
|
||||
} ${label.en.toLocaleUpperCase()}`;
|
||||
|
||||
const catMap = levelMap[category] || {};
|
||||
const levelString = level.toString().padStart(2, '0');
|
||||
|
||||
const ks = catMap[levelString] || [];
|
||||
ks.push(characters);
|
||||
catMap[levelString] = ks;
|
||||
|
||||
levelMap[category] = catMap;
|
||||
}
|
||||
|
||||
writeFileSync(
|
||||
FILENAME,
|
||||
yaml.dump(levelMap, {
|
||||
sortKeys: true,
|
||||
flowLevel: 2,
|
||||
}),
|
||||
);
|
||||
|
||||
return levelMap;
|
||||
}
|
||||
|
||||
export async function makeKanjiLevels(opts: { useBeyond: boolean }) {
|
||||
const wk = await makeWaniKaniKanjiLevels({ cache: true });
|
||||
const beyond = opts.useBeyond
|
||||
? (yaml.load(readFileSync('assets/beyond.yaml', 'utf-8')) as ILevelMap)
|
||||
: {};
|
||||
|
||||
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);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
};
|
||||
setKanjiToLevel(wk);
|
||||
setKanjiToLevel(beyond);
|
||||
|
||||
return kanjiToLevel;
|
||||
}
|
||||
|
||||
export async function repairBeyond() {
|
||||
const beyond = yaml.load(
|
||||
readFileSync('cache/beyond.yaml', 'utf-8'),
|
||||
@@ -119,7 +33,7 @@ export async function repairBeyond() {
|
||||
}
|
||||
|
||||
writeFileSync(
|
||||
'assets/beyond.yaml',
|
||||
WaniKani.files.beyond,
|
||||
yaml.dump(levelMap, {
|
||||
sortKeys: true,
|
||||
flowLevel: 2,
|
||||
|
||||
Reference in new issue
Block a user