diff --git a/ext/bg/js/database.js b/ext/bg/js/database.js index b56cf7e2..0acf974f 100644 --- a/ext/bg/js/database.js +++ b/ext/bg/js/database.js @@ -110,6 +110,8 @@ class Database { kunyomi: dictFieldSplit(row.kunyomi), tags: dictFieldSplit(row.tags), glossary: row.meanings, + indices: row.indices, + stats: row.stats, dictionary: row.dictionary }); } @@ -168,6 +170,10 @@ class Database { } const indexDataLoaded = async summary => { + if (summary.version > 2) { + throw 'unsupported dictionary version'; + } + const count = await this.db.dictionaries.where('title').equals(summary.title).count(); if (count > 0) { throw `dictionary "${summary.title}" is already imported`; @@ -176,28 +182,42 @@ class Database { await this.db.dictionaries.add(summary); }; - const termDataLoaded = async (title, entries, total, current) => { + const termDataLoaded = async (summary, entries, total, current) => { if (callback) { callback(total, current); } const rows = []; - for (const [expression, reading, tags, rules, score, ...glossary] of entries) { - rows.push({ - expression, - reading, - tags, - rules, - score, - glossary, - dictionary: title - }); + if (summary.version === 1) { + for (const [expression, reading, tags, rules, score, ...glossary] of entries) { + rows.push({ + expression, + reading, + tags, + rules, + score, + glossary, + dictionary: summary.title + }); + } + } else { + for (const [expression, reading, tags, rules, score, glossary] of entries) { + rows.push({ + expression, + reading, + tags, + rules, + score, + glossary, + dictionary: summary.title + }); + } } await this.db.terms.bulkAdd(rows); }; - const termFreqDataLoaded = async (title, entries, total, current) => { + const termFreqDataLoaded = async (summary, entries, total, current) => { if (callback) { callback(total, current); } @@ -207,34 +227,49 @@ class Database { rows.push({ expression, frequency, - dictionary: title + dictionary: summary.title }); } await this.db.termFreq.bulkAdd(rows); }; - const kanjiDataLoaded = async (title, entries, total, current) => { + const kanjiDataLoaded = async (summary, entries, total, current) => { if (callback) { callback(total, current); } const rows = []; - for (const [character, onyomi, kunyomi, tags, ...meanings] of entries) { - rows.push({ - character, - onyomi, - kunyomi, - tags, - meanings, - dictionary: title - }); + if (summary.version === 1) { + for (const [character, onyomi, kunyomi, tags, ...meanings] of entries) { + rows.push({ + character, + onyomi, + kunyomi, + tags, + meanings, + dictionary: summary.title + }); + } + } else { + for (const [character, onyomi, kunyomi, tags, meanings, indices, stats] of entries) { + rows.push({ + character, + onyomi, + kunyomi, + tags, + meanings, + indices, + stats, + dictionary: summary.title + }); + } } await this.db.kanji.bulkAdd(rows); }; - const kanjiFreqDataLoaded = async (title, entries, total, current) => { + const kanjiFreqDataLoaded = async (summary, entries, total, current) => { if (callback) { callback(total, current); } @@ -244,14 +279,14 @@ class Database { rows.push({ character, frequency, - dictionary: title + dictionary: summary.title }); } await this.db.kanjiFreq.bulkAdd(rows); }; - const tagDataLoaded = async (title, entries, total, current) => { + const tagDataLoaded = async (summary, entries, total, current) => { if (callback) { callback(total, current); } @@ -263,7 +298,7 @@ class Database { category, order, notes, - dictionary: title + dictionary: summary.title }); rows.push(row); @@ -300,11 +335,16 @@ class Database { } const index = JSON.parse(await indexFile.async('string')); - if (!index.title || !index.version || !index.revision) { + if (!index.title || !index.revision) { throw 'unrecognized dictionary format'; } - const summary = {title: index.title, version: index.version, revision: index.revision}; + const summary = { + title: index.title, + revision: index.revision, + version: index.format || index.version + }; + if (indexDataLoaded) { await indexDataLoaded(summary); } @@ -345,24 +385,24 @@ class Database { bank.push([name, tag.category, tag.order, tag.notes]); } - tagDataLoaded(index.title, bank, ++bankTotalCount, bankLoadedCount++); + tagDataLoaded(summary, bank, ++bankTotalCount, bankLoadedCount++); } - const loadBank = async (namer, count, callback) => { + const loadBank = async (summary, namer, count, callback) => { if (callback) { for (let i = 0; i < count; ++i) { const bankFile = zip.files[namer(i)]; const bank = JSON.parse(await bankFile.async('string')); - await callback(index.title, bank, bankTotalCount, bankLoadedCount++); + await callback(summary, bank, bankTotalCount, bankLoadedCount++); } } }; - await loadBank(buildTermBankName, termBankCount, termDataLoaded); - await loadBank(buildTermFreqBankName, termFreqBankCount, termFreqDataLoaded); - await loadBank(buildKanjiBankName, kanjiBankCount, kanjiDataLoaded); - await loadBank(buildKanjiFreqBankName, kanjiFreqBankCount, kanjiFreqDataLoaded); - await loadBank(buildTagBankName, tagBankCount, tagDataLoaded); + await loadBank(summary, buildTermBankName, termBankCount, termDataLoaded); + await loadBank(summary, buildTermFreqBankName, termFreqBankCount, termFreqDataLoaded); + await loadBank(summary, buildKanjiBankName, kanjiBankCount, kanjiDataLoaded); + await loadBank(summary, buildKanjiFreqBankName, kanjiFreqBankCount, kanjiFreqDataLoaded); + await loadBank(summary, buildTagBankName, tagBankCount, tagDataLoaded); return summary; } diff --git a/ext/bg/js/templates.js b/ext/bg/js/templates.js index a8fc87b6..0d546909 100644 --- a/ext/bg/js/templates.js +++ b/ext/bg/js/templates.js @@ -36,8 +36,12 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.onyomi : depth0),{"name":"if","hash":{},"fn":container.program(11, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + " \n \n \n" + ((stack1 = helpers["if"].call(alias1,((stack1 = (depth0 != null ? depth0.glossary : depth0)) != null ? stack1["1"] : stack1),{"name":"if","hash":{},"fn":container.program(13, data, 0),"inverse":container.program(16, data, 0),"data":data})) != null ? stack1 : "") - + " \n \n \n \n\n" - + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.debug : depth0),{"name":"if","hash":{},"fn":container.program(18, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + + " \n \n
\n" + + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.stats : depth0),{"name":"if","hash":{},"fn":container.program(18, data, 0),"inverse":container.program(21, data, 0),"data":data})) != null ? stack1 : "") + + "
\n \n \n \n Dictionary Indices\n \n \n \n
\n" + + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.indices : depth0),{"name":"if","hash":{},"fn":container.program(23, data, 0),"inverse":container.program(25, data, 0),"data":data})) != null ? stack1 : "") + + "
\n \n \n \n\n" + + ((stack1 = helpers["if"].call(alias1,(depth0 != null ? depth0.debug : depth0),{"name":"if","hash":{},"fn":container.program(27, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n"; },"2":function(container,depth0,helpers,partials,data) { return " \n \n"; @@ -84,35 +88,55 @@ templates['kanji.html'] = template({"1":function(container,depth0,helpers,partia + container.escapeExpression(container.lambda(((stack1 = (depth0 != null ? depth0.glossary : depth0)) != null ? stack1["0"] : stack1), depth0)) + "\n"; },"18":function(container,depth0,helpers,partials,data) { + var stack1; + + return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.stats : depth0),{"name":"each","hash":{},"fn":container.program(19, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); +},"19":function(container,depth0,helpers,partials,data) { + var helper, alias1=container.escapeExpression; + + return "
" + + alias1(((helper = (helper = helpers.key || (data && data.key)) != null ? helper : helpers.helperMissing),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),{"name":"key","hash":{},"data":data}) : helper))) + + ": " + + alias1(container.lambda(depth0, depth0)) + + "
\n"; +},"21":function(container,depth0,helpers,partials,data) { + return " No statistical data found\n"; +},"23":function(container,depth0,helpers,partials,data) { + var stack1; + + return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.indices : depth0),{"name":"each","hash":{},"fn":container.program(19, data, 0),"inverse":container.noop,"data":data})) != null ? stack1 : ""); +},"25":function(container,depth0,helpers,partials,data) { + return " No index data found\n"; +},"27":function(container,depth0,helpers,partials,data) { var stack1, helper, options, buffer = "
";
-  stack1 = ((helper = (helper = helpers.dumpObject || (depth0 != null ? depth0.dumpObject : depth0)) != null ? helper : helpers.helperMissing),(options={"name":"dumpObject","hash":{},"fn":container.program(19, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),options) : helper));
+  stack1 = ((helper = (helper = helpers.dumpObject || (depth0 != null ? depth0.dumpObject : depth0)) != null ? helper : helpers.helperMissing),(options={"name":"dumpObject","hash":{},"fn":container.program(28, data, 0),"inverse":container.noop,"data":data}),(typeof helper === "function" ? helper.call(depth0 != null ? depth0 : (container.nullContext || {}),options) : helper));
   if (!helpers.dumpObject) { stack1 = helpers.blockHelperMissing.call(depth0,stack1,options)}
   if (stack1 != null) { buffer += stack1; }
   return buffer + "
\n"; -},"19":function(container,depth0,helpers,partials,data) { +},"28":function(container,depth0,helpers,partials,data) { var stack1; return ((stack1 = container.lambda(depth0, depth0)) != null ? stack1 : ""); -},"21":function(container,depth0,helpers,partials,data,blockParams,depths) { +},"30":function(container,depth0,helpers,partials,data,blockParams,depths) { var stack1; - return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.definitions : depth0),{"name":"each","hash":{},"fn":container.program(22, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : ""); -},"22":function(container,depth0,helpers,partials,data,blockParams,depths) { + return ((stack1 = helpers.each.call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.definitions : depth0),{"name":"each","hash":{},"fn":container.program(31, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : ""); +},"31":function(container,depth0,helpers,partials,data,blockParams,depths) { var stack1; - return ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(data && data.first),{"name":"unless","hash":{},"fn":container.program(23, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + return ((stack1 = helpers.unless.call(depth0 != null ? depth0 : (container.nullContext || {}),(data && data.first),{"name":"unless","hash":{},"fn":container.program(32, data, 0, blockParams, depths),"inverse":container.noop,"data":data})) != null ? stack1 : "") + "\n" + ((stack1 = container.invokePartial(partials.kanji,depth0,{"name":"kanji","hash":{"root":(depths[1] != null ? depths[1].root : depths[1]),"source":(depths[1] != null ? depths[1].source : depths[1]),"addable":(depths[1] != null ? depths[1].addable : depths[1]),"debug":(depths[1] != null ? depths[1].debug : depths[1])},"data":data,"helpers":helpers,"partials":partials,"decorators":container.decorators})) != null ? stack1 : ""); -},"23":function(container,depth0,helpers,partials,data) { +},"32":function(container,depth0,helpers,partials,data) { return "
"; -},"25":function(container,depth0,helpers,partials,data) { - return "

No results found.

\n"; +},"34":function(container,depth0,helpers,partials,data) { + return "

No results found

\n"; },"compiler":[7,">= 4.0.0"],"main":function(container,depth0,helpers,partials,data,blockParams,depths) { var stack1; return "\n" - + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.definitions : depth0),{"name":"if","hash":{},"fn":container.program(21, data, 0, blockParams, depths),"inverse":container.program(25, data, 0, blockParams, depths),"data":data})) != null ? stack1 : ""); + + ((stack1 = helpers["if"].call(depth0 != null ? depth0 : (container.nullContext || {}),(depth0 != null ? depth0.definitions : depth0),{"name":"if","hash":{},"fn":container.program(30, data, 0, blockParams, depths),"inverse":container.program(34, data, 0, blockParams, depths),"data":data})) != null ? stack1 : ""); },"main_d": function(fn, props, container, depth0, data, blockParams, depths) { var decorators = container.decorators; diff --git a/tmpl/kanji.html b/tmpl/kanji.html index 9ab5b2a8..6cea57f9 100644 --- a/tmpl/kanji.html +++ b/tmpl/kanji.html @@ -53,7 +53,33 @@ {{glossary.[0]}} {{/if}} - + +
+ {{#if stats}} + {{#each stats}} +
{{@key}}: {{.}}
+ {{/each}} + {{else}} + No statistical data found + {{/if}} +
+ + + + Dictionary Indices + + + +
+ {{#if indices}} + {{#each indices}} +
{{@key}}: {{.}}
+ {{/each}} + {{else}} + No index data found + {{/if}} +
+ @@ -69,5 +95,5 @@ {{> kanji debug=../debug addable=../addable source=../source root=../root}} {{/each}} {{else}} -

No results found.

+

No results found

{{/if}}