summaryrefslogtreecommitdiff
path: root/ext/bg/js/options.js
diff options
context:
space:
mode:
Diffstat (limited to 'ext/bg/js/options.js')
-rw-r--r--ext/bg/js/options.js124
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);
});
}