diff options
| -rw-r--r-- | ext/bg/js/options.js | 124 | 
1 files changed, 82 insertions, 42 deletions
| diff --git a/ext/bg/js/options.js b/ext/bg/js/options.js index 13229d2a..64278fca 100644 --- a/ext/bg/js/options.js +++ b/ext/bg/js/options.js @@ -17,64 +17,104 @@   */ -function versionOptions(options) { -    const version = options.version || 0; -    const fixups = [ -        () => {} -    ]; - -    if (version < fixups.length) { -        fixups[version](); -        ++options.version; -        versionOptions(options); -    } -} - -function sanitizeOptions(options) { +function optionsSetDefaults(options) {      const defaults = { -        activateOnStartup: true, -        enableAudioPlayback: true, -        enableSoftKatakanaSearch: true, -        groupTermResults: true, -        showAdvancedOptions: false, -        selectMatchedText: true, -        holdShiftToScan: true, -        scanDelay: 15, -        scanLength: 20, +        general: { +            autoStart:     true, +            audioPlayback: true, +            softKatakana:  true, +            groupResults:  true, +            showAdvanced:  false +        }, -        dictionaries: {}, +        scanning: { +            requireShift: true, +            selectText:   true, +            delay:        15, +            length:       10 +        }, -        ankiEnable: false, -        ankiCardTags: ['yomichan'], -        sentenceExtent: 200, +        dictionaries: {}, -        ankiTermDeck: '', -        ankiTermModel: '', -        ankiTermFields: {}, -        ankiKanjiDeck: '', -        ankiKanjiModel: '', -        ankiKanjiFields: {} +        anki: { +            enable:      false, +            tags:        ['yomichan'], +            sentenceExt: 200, +            terms:       {deck: '', model: '', fields: {}}, +            kanji:       {deck: '', model: '', fields: {}}, +        }      }; -    for (const key in defaults) { -        if (!(key in options)) { -            options[key] = defaults[key]; +    const combine = (target, source) => { +        for (const key in source) { +            if (!(key in target)) { +                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 copy = (targetDict, targetKey, sourceDict, sourceKey) => { +        targetDict[targetKey] = sourceDict[sourceKey] || targetDict[targetKey]; +    }; + +    const version = options.version || 0; +    const fixups = [ +        () => { +            optionsSetDefaults(options); + +            copy(options.general, 'autoStart',     options, 'activateOnStartup'); +            copy(options.general, 'audioPlayback', options, 'enableAudioPlayback'); +            copy(options.general, 'softKatakana',  options, 'enableSoftKatakanaSearch'); +            copy(options.general, 'groupResults',  options, 'goupTermResults'); +            copy(options.general, 'showAdvanced',  options, 'showAdvancedOptions'); + +            copy(options.scanning, 'requireShift', options, 'holdShiftToScan'); +            copy(options.scanning, 'selectText',   options, 'selectMatchedText'); +            copy(options.scanning, 'delay',        options, 'scanDelay'); +            copy(options.scanning, 'length',       options, 'scanLength'); + +            options.anki.enable = options.ankiMethod === 'ankiconnect'; + +            copy(options.anki,       'tags',        options, 'ankiCardTags'); +            copy(options.anki,       'sentenceExt', options, 'sentenceExtent'); +            copy(options.anki.term,  'deck',        options, 'ankiTermDeck'); +            copy(options.anki.term,  'model',       options, 'ankiTermModel'); +            copy(options.anki.term,  'fields',      options, 'ankiTermFields'); +            copy(options.anki.kanji, 'deck',        options, 'ankiKanjiDeck'); +            copy(options.anki.kanji, 'model',       options, 'ankiKanjiModel'); +            copy(options.anki.kanji, 'fields',      options, 'ankiKanjiFields'); +        }, +    ]; + +    if (version < fixups.length) { +        fixups[version](); +        ++options.version; +        optionsVersion(options);      }      return options;  } -function loadOptions() { +function optionsLoad() {      return new Promise((resolve, reject) => { -        chrome.storage.sync.get(null, opts => { -            resolve(sanitizeOptions(opts)); -        }); +        chrome.storage.sync.get(null, options => resolve(optionsVersion(options)));      });  } -function saveOptions(opts) { +function optionsSave(options) {      return new Promise((resolve, reject) => { -        chrome.storage.sync.set(sanitizeOptions(opts), resolve); +        chrome.storage.sync.set(options, resolve);      });  } |