diff --git a/scripts/get-kanji-level.ts b/scripts/get-kanji-level.ts index 407bb5b..e7e2449 100644 --- a/scripts/get-kanji-level.ts +++ b/scripts/get-kanji-level.ts @@ -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() { diff --git a/scripts/sort-anki.ts b/scripts/sort-anki.ts index c654cf7..a26a0fc 100644 --- a/scripts/sort-anki.ts +++ b/scripts/sort-anki.ts @@ -1,6 +1,9 @@ import { AnkiConnect } from '@/ankiconnect'; +import { makeKanjiLevels } from './get-kanji-level'; + const DECK = 'Takoboto'; +const KANJI_FIELD = 'Japanese'; async function main() { const anki = new AnkiConnect(); @@ -11,7 +14,9 @@ async function main() { query: `deck:${DECK}`, }) .then((cards) => anki.api('cardsInfo', { cards })) - .then((rs) => { + .then(async (rs) => { + const kanjiLevels = await makeKanjiLevels(); + const modelToSubdecks = new Map< string, { @@ -20,11 +25,28 @@ async function main() { >(); rs.map((r) => { const vs = modelToSubdecks.get(r.modelName) || {}; - // Get the subdeck names from Kanji - const subdeck = '???'; - vs[subdeck] = vs[subdeck] || []; - vs[subdeck]!.push(r.cardId); - modelToSubdecks.set(r.modelName, vs); + const { value } = r.fields[KANJI_FIELD] || {}; + if (value) { + // Get the subdeck names from Kanji + let subdeck = ''; + let level = 0; + + 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); + } + } }); return Promise.all(