add beyond
This commit is contained in:
1 parent
49cd39297a
commit
1c362c0c1c
4 files changed
+168
-11
No files matched your search
@@ -0,0 +1,124 @@
|
||||
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
||||
|
||||
import { IKanji, WaniKani } from '@/wanikani';
|
||||
import yaml from 'js-yaml';
|
||||
|
||||
interface ILevelMap {
|
||||
[category: string]: {
|
||||
[levelString: string]: string[];
|
||||
};
|
||||
}
|
||||
|
||||
async function makeWaniKaniKanjiLevels(opts: { cache?: 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()
|
||||
.then((vs) => vs.filter((v) => v.object === 'kanji') as IKanji[]);
|
||||
|
||||
const levelMap: ILevelMap = {};
|
||||
|
||||
for (const k of wkKanji) {
|
||||
const { level, characters } = k.data;
|
||||
|
||||
let category: string;
|
||||
if (level < 11) {
|
||||
category = '01-10: 快 PLEASANT';
|
||||
} else if (level < 21) {
|
||||
category = '11-21: 苦 PAINFUL';
|
||||
} else if (level < 31) {
|
||||
category = '21-30: 死 DEATH';
|
||||
} else if (level < 41) {
|
||||
category = '31-40: 地獄 HELL';
|
||||
} else if (level < 51) {
|
||||
category = '41-50: 天国 PARADISE';
|
||||
} else {
|
||||
category = '51-60: 現実 REALITY';
|
||||
}
|
||||
|
||||
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() {
|
||||
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));
|
||||
});
|
||||
wk[cat] = catMap;
|
||||
}
|
||||
|
||||
return wk;
|
||||
}
|
||||
|
||||
export async function repairBeyond() {
|
||||
const beyond = yaml.load(
|
||||
readFileSync('cache/beyond.yaml', 'utf-8'),
|
||||
) as Record<string, string>;
|
||||
|
||||
const levelMap: ILevelMap = {};
|
||||
|
||||
for (const [levelString, vs] of Object.entries(beyond)) {
|
||||
const level = Number(levelString);
|
||||
|
||||
let category: string;
|
||||
if (level < 71) {
|
||||
category = '61-70: 無限 INFINITY';
|
||||
} else if (level < 76) {
|
||||
category = '71-75: 極度 BEYOND';
|
||||
} else {
|
||||
category = '76+: 名人 MASTERY';
|
||||
}
|
||||
|
||||
const catMap = levelMap[category] || {};
|
||||
|
||||
const ks = catMap[levelString] || [];
|
||||
ks.push(...vs);
|
||||
catMap[levelString] = ks;
|
||||
|
||||
levelMap[category] = catMap;
|
||||
}
|
||||
|
||||
writeFileSync(
|
||||
'assets/beyond.yaml',
|
||||
yaml.dump(levelMap, {
|
||||
sortKeys: true,
|
||||
flowLevel: 2,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
if (require.main === module) {
|
||||
repairBeyond();
|
||||
}
|
||||
+20
-10
@@ -41,6 +41,20 @@ async function main() {
|
||||
);
|
||||
})
|
||||
.then((rs) => {
|
||||
const cardsByTemplateName = {
|
||||
data: new Map<string, number[]>(),
|
||||
async get(templateName: string) {
|
||||
let v = this.data.get(templateName);
|
||||
if (!v) {
|
||||
v = await anki.api('findCards', {
|
||||
query: `deck:${DECK} card:${templateName}`,
|
||||
});
|
||||
}
|
||||
this.data.set(templateName, v);
|
||||
return v;
|
||||
},
|
||||
};
|
||||
|
||||
return Promise.all(
|
||||
rs
|
||||
.flat()
|
||||
@@ -51,16 +65,12 @@ async function main() {
|
||||
})),
|
||||
)
|
||||
.map(({ templateName, subdeck, cardIdsSet }) =>
|
||||
anki
|
||||
.api('findCards', {
|
||||
query: `deck:${DECK} card:${templateName}`,
|
||||
})
|
||||
.then((cards) =>
|
||||
anki.api('changeDeck', {
|
||||
cards: cards.filter((c) => cardIdsSet.has(c)),
|
||||
deck: `${DECK}::${subdeck}::${templateName}`,
|
||||
}),
|
||||
),
|
||||
cardsByTemplateName.get(templateName).then((cards) =>
|
||||
anki.api('changeDeck', {
|
||||
cards: cards.filter((c) => cardIdsSet.has(c)),
|
||||
deck: `${DECK}::${subdeck}::${templateName}`,
|
||||
}),
|
||||
),
|
||||
),
|
||||
);
|
||||
}),
|
||||
|
||||
Reference in new issue
Block a user