This commit is contained in:
Alex Yatskov 2017-01-13 20:47:40 -08:00
parent 94034890cc
commit 11fcc465ac

View File

@ -17,64 +17,104 @@
*/
function versionOptions(options) {
function optionsSetDefaults(options) {
const defaults = {
general: {
autoStart: true,
audioPlayback: true,
softKatakana: true,
groupResults: true,
showAdvanced: false
},
scanning: {
requireShift: true,
selectText: true,
delay: 15,
length: 10
},
dictionaries: {},
anki: {
enable: false,
tags: ['yomichan'],
sentenceExt: 200,
terms: {deck: '', model: '', fields: {}},
kanji: {deck: '', model: '', fields: {}},
}
};
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;
versionOptions(options);
}
}
function sanitizeOptions(options) {
const defaults = {
activateOnStartup: true,
enableAudioPlayback: true,
enableSoftKatakanaSearch: true,
groupTermResults: true,
showAdvancedOptions: false,
selectMatchedText: true,
holdShiftToScan: true,
scanDelay: 15,
scanLength: 20,
dictionaries: {},
ankiEnable: false,
ankiCardTags: ['yomichan'],
sentenceExtent: 200,
ankiTermDeck: '',
ankiTermModel: '',
ankiTermFields: {},
ankiKanjiDeck: '',
ankiKanjiModel: '',
ankiKanjiFields: {}
};
for (const key in defaults) {
if (!(key in options)) {
options[key] = defaults[key];
}
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);
});
}