prototype subdeck from Kanji

This commit is contained in:
polv committed 2022-04-27 13:20:49 +07:00
1 parent 1c362c0c1c
commit f427a8e148
2 files changed
+53 -15

No files matched your search

+27 -11
View File
@@ -63,23 +63,39 @@ async function makeWaniKaniKanjiLevels(opts: { cache?: boolean } = {}) {
export async function makeKanjiLevels() { export async function makeKanjiLevels() {
const wk = await makeWaniKaniKanjiLevels({ cache: true }); const wk = await makeWaniKaniKanjiLevels({ cache: true });
const wkKanji = new Set(
Object.values(wk).flatMap((v) => Object.values(v).flat()),
);
const beyond = yaml.load( const beyond = yaml.load(
readFileSync('assets/beyond.yaml', 'utf-8'), readFileSync('assets/beyond.yaml', 'utf-8'),
) as ILevelMap; ) as ILevelMap;
for (const [cat, map] of Object.entries(beyond)) { const kanjiToLevel = new Map<
const catMap = wk[cat] || {}; string,
Object.entries(map).map(([levelString, ks]) => { {
catMap[levelString] = ks.filter((k) => !wkKanji.has(k)); level: number;
}); deckName: string;
wk[cat] = catMap;
} }
>();
return wk; 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() { export async function repairBeyond() {
+26 -4
View File
@@ -1,6 +1,9 @@
import { AnkiConnect } from '@/ankiconnect'; import { AnkiConnect } from '@/ankiconnect';
import { makeKanjiLevels } from './get-kanji-level';
const DECK = 'Takoboto'; const DECK = 'Takoboto';
const KANJI_FIELD = 'Japanese';
async function main() { async function main() {
const anki = new AnkiConnect(); const anki = new AnkiConnect();
@@ -11,7 +14,9 @@ async function main() {
query: `deck:${DECK}`, query: `deck:${DECK}`,
}) })
.then((cards) => anki.api('cardsInfo', { cards })) .then((cards) => anki.api('cardsInfo', { cards }))
.then((rs) => { .then(async (rs) => {
const kanjiLevels = await makeKanjiLevels();
const modelToSubdecks = new Map< const modelToSubdecks = new Map<
string, string,
{ {
@@ -20,11 +25,28 @@ async function main() {
>(); >();
rs.map((r) => { rs.map((r) => {
const vs = modelToSubdecks.get(r.modelName) || {}; const vs = modelToSubdecks.get(r.modelName) || {};
const { value } = r.fields[KANJI_FIELD] || {};
if (value) {
// Get the subdeck names from Kanji // Get the subdeck names from Kanji
const subdeck = '???'; let subdeck = '';
vs[subdeck] = vs[subdeck] || []; let level = 0;
vs[subdeck]!.push(r.cardId);
Array.from(value).map((k) => {
const m = kanjiLevels.get(k);
if (m && m.level > level) {
level = m.level;
subdeck = m.deckName;
}
});
if (subdeck) {
const cardIds = vs[subdeck] || [];
cardIds.push(r.cardId);
vs[subdeck] = cardIds;
modelToSubdecks.set(r.modelName, vs); modelToSubdecks.set(r.modelName, vs);
}
}
}); });
return Promise.all( return Promise.all(