/* * Copyright (C) 2016 Alex Yatskov * Author: Alex Yatskov * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ function optionsSetDefaults(options) { const defaults = { general: { enable: true, audioSource: 'jpod101', audioVolume: 100, groupResults: true, debugInfo: false, maxResults: 32, showAdvanced: false, popupWidth: 400, popupHeight: 250, popupOffset: 10, showGuide: true }, scanning: { middleMouse: true, selectText: true, alphanumeric: true, delay: 15, length: 10, modifier: 'shift' }, dictionaries: {}, anki: { enable: false, server: 'http://127.0.0.1:8765', tags: ['yomichan'], htmlCards: true, sentenceExt: 200, terms: {deck: '', model: '', fields: {}}, kanji: {deck: '', model: '', fields: {}} } }; const combine = (target, source) => { for (const key in source) { if (!target.hasOwnProperty(key)) { target[key] = source[key]; } } }; combine(options, defaults); combine(options.general, defaults.general); combine(options.scanning, defaults.scanning); combine(options.anki, defaults.anki); combine(options.anki.terms, defaults.anki.terms); combine(options.anki.kanji, defaults.anki.kanji); return options; } function optionsVersion(options) { const fixups = [ () => {}, () => {}, () => {}, () => {}, () => { if (options.general.audioPlayback) { options.general.audioSource = 'jpod101'; } else { options.general.audioSource = 'disabled'; } }, () => { options.general.showGuide = false; }, () => { if (options.scanning.requireShift) { options.scanning.modifier = 'shift'; } else { options.scanning.modifier = 'none'; } } ]; optionsSetDefaults(options); if (!options.hasOwnProperty('version')) { options.version = fixups.length; } while (options.version < fixups.length) { fixups[options.version++](); } return options; } function optionsLoad() { return new Promise((resolve, reject) => { chrome.storage.local.get(null, store => resolve(store.options)); }).then(optionsStr => { return optionsStr ? JSON.parse(optionsStr) : {}; }).catch(error => { return {}; }).then(options => { return optionsVersion(options); }); } function optionsSave(options) { return new Promise((resolve, reject) => { chrome.storage.local.set({options: JSON.stringify(options)}, resolve); }).then(() => { apiOptionsSet(options); }); }