diff --git a/wanikani-similar-kanji/wk_niai.db.js b/wanikani-similar-kanji/wk_niai.db.js index 297a670..59b6675 100644 --- a/wanikani-similar-kanji/wk_niai.db.js +++ b/wanikani-similar-kanji/wk_niai.db.js @@ -14,12 +14,12 @@ function NiaiDB() NiaiDB.prototype = { constructor: NiaiDB, - init: function(override_db) + init: async function(override_db) { this.override_db = override_db; if (typeof wkof === `object`) - this.wkof_items = this.load_wkof_items(); + this.wkof_items = await this.load_wkof_items(); }, load_wkof_items: async function() @@ -43,8 +43,10 @@ function NiaiDB() isKanjiInWK: function(kanji) { // WK started adding new kanji, treat unknown kanji gracefully - if (!this.isKanjiInDB(kanji)) + if (!this.isKanjiInDB(kanji) && !(kanji in this.wkof_items)) return false; + else if (!this.isKanjiInDB(kanji) && (kanji in this.wkof_items)) + return true; return (this.lookup_db[kanji].level !== 99); }, @@ -56,22 +58,60 @@ function NiaiDB() isKanjiLocked: function(kanji, level) { - if (this.isKanjiInDB(kanji)) - return (this.lookup_db[kanji].level > level); - else - return true; + if (kanji in this.wkof_items) + return (this.wkof_items[kanji].data.level > level); + else if (this.isKanjiInDB(kanji)) + return (this.lookup_db[kanji].level === 99 || this.wkof_items[kanji].data.level > level); + + return true; }, getInfo: function(kanji) { - if (!this.isKanjiInDB(kanji)) + if (!this.isKanjiInDB(kanji) && !(kanji in this.wkof_items)) return {"meanings": "Not in DB!", "readings": " ", level: "N/A"}; + else if (kanji in this.wkof_items) { // if it's in wkof fetch we don't care about local db info + // we need to build the k_info object from the open framework data + let k_data = this.wkof_items[kanji].data; + let k_info = { + kunyomi: [], + onyomi: [], + nanori: [], + important_reading: '' + }; + + for (const reading_info of k_data.readings) { + switch (reading_info.type) { + case 'kunyomi': + k_info.kunyomi.push(reading_info.reading); + if (reading_info.primary) k_info.important_reading = 'kunyomi'; + break; + case 'onyomi': + k_info.onyomi.push(reading_info.reading); + if (reading_info.primary) k_info.important_reading = 'onyomi'; + break; + case 'nanori': + k_info.nanori.push(reading_info.reading); + if (reading_info.primary) k_info.important_reading = 'nanori'; + break; + default: + break; + } + } + + k_info.level = k_data.level; + k_info.meanings = k_data.meanings.map(m => m.meaning); + k_info.readings = k_info[k_info.important_reading]; - let k_info = this.lookup_db[kanji]; + return k_info; + } + else { // not in wkof fetch, must be in local db + let k_info = this.lookup_db[kanji]; - k_info.readings = k_info[k_info.important_reading]; + k_info.readings = k_info[k_info.important_reading]; - return k_info; + return k_info; + } }, getSimilar: function(kanji, level, sources, min_score) @@ -97,9 +137,9 @@ function NiaiDB() let score = source.base_score + (hasScore ? sim_info.score : 0.0); - if (!this.isKanjiInDB(sim_kanji)) + if (!this.isKanjiInDB(sim_kanji) && !this.isKanjiInWK(sim_kanji)) { - console.log("Ignoring", sim_kanji, ", not in DB yet!"); + console.log("Ignoring", sim_kanji, ", not in DB or WK yet!"); return; // equivalent to continue } @@ -131,7 +171,8 @@ function NiaiDB() let result = Object.values(similar_kanji); - result.sort((a,b) => 2*Math.sign(b.score - a.score) + + result.sort((a,b) => a.locked - b.locked + || 2*Math.sign(b.score - a.score) + a.kan.localeCompare(b.kan)) .splice(19); @@ -141,9 +182,9 @@ function NiaiDB() // Use the WK Open Framework to replace the offine DB of Niai // ######################################################################### - WK_Niai.prototype.update_wk_cache = async function(similar_list) + WK_Niai.prototype.update_wk_cache = function(similar_list) { - let index = await this.ndb.wkof_items; + let index = this.ndb.wkof_items; similar_list.forEach((sim_kanji) => { let item = index[sim_kanji]; if (item) { diff --git a/wanikani-similar-kanji/wk_niai.html.js b/wanikani-similar-kanji/wk_niai.html.js index 856e18c..65bfc9e 100644 --- a/wanikani-similar-kanji/wk_niai.html.js +++ b/wanikani-similar-kanji/wk_niai.html.js @@ -289,7 +289,7 @@ } ); - if (!found && this.ndb.isKanjiInDB(new_kanji)) + if (!found && (this.ndb.isKanjiInWK(new_kanji) || this.ndb.isKanjiInDB(new_kanji))) this.override_db[kanji].push({"kan": new_kanji, "score": 1.0}); GM_setValue(`override_db`, JSON.stringify(this.override_db)); diff --git a/wanikani-similar-kanji/wk_niai.main.js b/wanikani-similar-kanji/wk_niai.main.js index 48a40d3..f239ded 100644 --- a/wanikani-similar-kanji/wk_niai.main.js +++ b/wanikani-similar-kanji/wk_niai.main.js @@ -197,17 +197,12 @@ function initializeCustomIcons() if (this.settings.use_alt) use_sources = [...this.settings.alt_sources, ...use_sources]; - const similar_list = [kanji, - ...this.ndb.getSimilar(kanji, - this.settings.user_level, - use_sources, - this.settings.min_score)]; + const similar_list = [kanji,...this.ndb.getSimilar(kanji,this.settings.user_level,use_sources,this.settings.min_score)]; let char_list = []; - similar_list.forEach( function(sim_kanji, i) { - if (!this.ndb.isKanjiInDB(sim_kanji)) + if (!this.ndb.isKanjiInDB(sim_kanji) && !this.ndb.isKanjiInWK(sim_kanji)) return; const sim_info = this.ndb.getInfo(sim_kanji); @@ -272,7 +267,7 @@ function initializeCustomIcons() // ######################################################################### // ######################################################################### - WK_Niai.prototype.init = function() + WK_Niai.prototype.init = async function() { GM_addStyle(GM_getResourceText(`niai_style`) .replace(/\.wk_namespace/g, `#niai_section`)); @@ -301,7 +296,7 @@ function initializeCustomIcons() } : function() {}; - this.ndb.init(this.override_db); + await this.ndb.init(this.override_db); this.log(`The script element is:`, GM_info); this.log("The override db is", this.override_db); @@ -352,8 +347,7 @@ let promise = typeof wkof !== `undefined` ? (wkof.include(`Jquery, Apiv2`), wkof promise.then(() => { const wk_niai = new WK_Niai(); - wk_niai.init(); - wk_niai.run(); + wk_niai.init().then(() => wk_niai.run()); }); // ############################################################################# // #############################################################################