diff options
Diffstat (limited to 'ext/bg/js/options.js')
| -rw-r--r-- | ext/bg/js/options.js | 132 | 
1 files changed, 132 insertions, 0 deletions
| diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js new file mode 100644 index 00000000..a9345fdd --- /dev/null +++ b/ext/bg/js/options.js @@ -0,0 +1,132 @@ +/* + * Copyright (C) 2016  Alex Yatskov <alex@foosoft.net> + * Author: Alex Yatskov <alex@foosoft.net> + * + * 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 <http://www.gnu.org/licenses/>. + */ + + +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(() => { +        instYomi().optionsSet(options); +        fgOptionsSet(options); +    }); +} |