diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/settings/actions/setting.js | 4 | ||||
-rw-r--r-- | src/shared/settings/values.js | 95 |
2 files changed, 82 insertions, 17 deletions
diff --git a/src/settings/actions/setting.js b/src/settings/actions/setting.js index 1d4ef34..1d01fda 100644 --- a/src/settings/actions/setting.js +++ b/src/settings/actions/setting.js @@ -27,9 +27,9 @@ const save = (settings) => { const set = (settings) => { let value = JSON.parse(DefaultSettings.json); if (settings.source === 'json') { - value = settingsValues.fromJson(settings.json); + value = settingsValues.valueFromJson(settings.json); } else if (settings.source === 'form') { - value = settingsValues.fromForm(settings.form); + value = settingsValues.valueFromForm(settings.form); } return { diff --git a/src/shared/settings/values.js b/src/shared/settings/values.js index d86cfdc..4482fbb 100644 --- a/src/shared/settings/values.js +++ b/src/shared/settings/values.js @@ -1,4 +1,6 @@ -const operationFromName = (name) => { +import DefaultSettings from './default'; + +const operationFromFormName = (name) => { let [type, argStr] = name.split('?'); let args = {}; if (argStr) { @@ -7,29 +9,92 @@ const operationFromName = (name) => { return Object.assign({ type }, args); }; -const fromJson = (json) => { +const operationToFormName = (op) => { + let type = op.type; + let args = Object.assign({}, op); + delete args.type; + + if (Object.keys(args).length === 0) { + return type; + } + return op.type + '?' + JSON.stringify(args); +}; + +const valueFromJson = (json) => { return JSON.parse(json); }; -const fromForm = (form) => { - let keymaps = {}; - for (let name of Object.keys(form.keymaps)) { - let keys = form.keymaps[name]; - keymaps[keys] = operationFromName(name); +const valueFromForm = (form) => { + let keymaps = undefined; + if (form.keymaps) { + keymaps = {}; + for (let name of Object.keys(form.keymaps)) { + let keys = form.keymaps[name]; + keymaps[keys] = operationFromFormName(name); + } } - let engines = {}; - for (let { name, url } of form.search.engines) { - engines[name] = url; + let search = undefined; + if (form.search) { + search = { default: form.search.default }; + + if (form.search.engines) { + search.engines = {}; + for (let [name, url] of form.search.engines) { + search.engines[name] = url; + } + } } - let search = { - default: form.search.default, - engines, - }; let blacklist = form.blacklist; return { keymaps, search, blacklist }; }; -export { fromJson, fromForm }; +const jsonFromValue = (value) => { + return JSON.stringify(value, undefined, 2); +}; + +const formFromValue = (value) => { + + let keymaps = undefined; + if (value.keymaps) { + let allowedOps = new Set(Object.keys(DefaultSettings.form.keymaps)); + + keymaps = {}; + for (let keys of Object.keys(value.keymaps)) { + let op = operationToFormName(value.keymaps[keys]); + if (allowedOps.has(op)) { + keymaps[op] = keys; + } + } + } + + let search = undefined; + if (value.search) { + search = { default: value.search.default }; + if (value.search.engines) { + search.engines = Object.keys(value.search.engines).map((name) => { + return [name, value.search.engines[name]]; + }); + } + } + + let blacklist = value.blacklist; + + return { keymaps, search, blacklist }; +}; + +const jsonFromForm = (form) => { + return jsonFromValue(valueFromForm(form)); +}; + +const formFromJson = (json) => { + let value = valueFromJson(json); + return formFromValue(value); +}; + +export { + valueFromJson, valueFromForm, jsonFromValue, formFromValue, + jsonFromForm, formFromJson +}; |