diff options
Diffstat (limited to 'ext/bg/js/util.js')
-rw-r--r-- | ext/bg/js/util.js | 100 |
1 files changed, 87 insertions, 13 deletions
diff --git a/ext/bg/js/util.js b/ext/bg/js/util.js index 4e0cc671..a0fca270 100644 --- a/ext/bg/js/util.js +++ b/ext/bg/js/util.js @@ -39,19 +39,11 @@ function promiseCallback(promise, callback) { return promise.then(result => { callback({result}); }).catch(error => { + console.log(error); callback({error}); }); } -function loadJson(url) { - return new Promise((resolve, reject) => { - const xhr = new XMLHttpRequest(); - xhr.addEventListener('load', () => resolve(JSON.parse(xhr.responseText))); - xhr.open('GET', chrome.extension.getURL(url)); - xhr.send(); - }); -} - function sortTags(tags) { return tags.sort((v1, v2) => { const order1 = v1.order; @@ -92,8 +84,8 @@ function sortTermDefs(definitions) { return 1; } - const rl1 = v1.rules.length; - const rl2 = v2.rules.length; + const rl1 = v1.reasons.length; + const rl2 = v2.reasons.length; if (rl1 < rl2) { return -1; } else if (rl1 > rl2) { @@ -104,15 +96,97 @@ function sortTermDefs(definitions) { }); } -function applyTagMeta(tag, meta) { - const symbol = tag.name.split(':')[0]; +function buildTag(name, meta) { + const tag = {name}; + const symbol = name.split(':')[0]; for (const prop in meta[symbol] || {}) { tag[prop] = meta[symbol][prop]; } + return sanitizeTag(tag); +} + +function sanitizeTag(tag) { + tag.name = tag.name || 'untitled'; + tag.category = tag.category || 'default'; + tag.notes = tag.notes || ''; + tag.order = tag.order || 0; return tag; } function splitField(field) { return field.length === 0 ? [] : field.split(' '); } + +function loadJson(url) { + return new Promise((resolve, reject) => { + const xhr = new XMLHttpRequest(); + xhr.addEventListener('load', () => resolve(xhr.responseText)); + xhr.addEventListener('error', () => reject('failed to execute network request')); + xhr.open('GET', url); + xhr.send(); + }).then(responseText => { + try { + return JSON.parse(responseText); + } + catch (e) { + return Promise.reject('invalid JSON response'); + } + }); +} + +function loadJsonInt(url) { + return loadJson(chrome.extension.getURL(url)); +} + +function importJsonDb(indexUrl, indexLoaded, termsLoaded, kanjiLoaded) { + const indexDir = indexUrl.slice(0, indexUrl.lastIndexOf('/')); + return loadJson(indexUrl).then(index => { + if (!index.title || !index.version) { + return Promise.reject('unrecognized dictionary format'); + } + + if (indexLoaded !== null) { + return indexLoaded( + index.title, + index.version, + index.tagMeta, + index.termBanks > 0, + index.kanjiBanks > 0 + ).then(() => index); + } + + return index; + }).then(index => { + const loaders = []; + const banksTotal = index.termBanks + index.kanjiBanks; + let banksLoaded = 0; + + for (let i = 1; i <= index.termBanks; ++i) { + const bankUrl = `${indexDir}/term_bank_${i}.json`; + loaders.push(() => loadJson(bankUrl).then(entries => termsLoaded( + index.title, + entries, + banksTotal, + banksLoaded++ + ))); + } + + for (let i = 1; i <= index.kanjiBanks; ++i) { + const bankUrl = `${indexDir}/kanji_bank_${i}.json`; + loaders.push(() => loadJson(bankUrl).then(entries => kanjiLoaded( + index.title, + entries, + banksTotal, + banksLoaded++ + ))); + } + + let chain = Promise.resolve(); + for (const loader of loaders) { + chain = chain.then(loader); + } + + return chain; + }); +} |