diff --git a/app/config/keymaps.js b/app/config/keymaps.js index 22a709c5..3f9d3c7d 100644 --- a/app/config/keymaps.js +++ b/app/config/keymaps.js @@ -1,4 +1,5 @@ const {readFileSync} = require('fs'); +const {normalize} = require('../utils/keymaps-normalize'); const {defaultPlatformKeyPath} = require('./paths'); const commands = {}; @@ -7,7 +8,7 @@ const keys = {}; const _setKeysForCommands = function(keymap) { for (const command in keymap) { if (command) { - commands[command] = keymap[command].toLowerCase(); + commands[command] = normalize(keymap[command]); } } }; @@ -38,8 +39,8 @@ const _extend = function(customsKeys) { if (customsKeys) { for (const command in customsKeys) { if (command) { - commands[command] = customsKeys[command]; - keys[customsKeys[command]] = command; + commands[command] = normalize(customsKeys[command]); + keys[normalize(customsKeys[command])] = command; } } } diff --git a/app/utils/keymaps-normalize.js b/app/utils/keymaps-normalize.js new file mode 100644 index 00000000..459c375c --- /dev/null +++ b/app/utils/keymaps-normalize.js @@ -0,0 +1,27 @@ +const {getKeymaps} = require('../config/keymaps'); + +const normalize = keybinding => { + function sortAlphabetically(a, b) { + return a.localeCompare(b); + } + + return keybinding + .toLowerCase() + .split('+') + .sort(sortAlphabetically) + .join('+'); +}; + +const findCommandByKeys = (keys, commands) => { + return commands[normalize(keys)]; +}; + +const getCommand = keys => { + return findCommandByKeys(keys, getKeymaps().keys); +}; + +module.exports = { + normalize, + findCommandByKeys, + getCommand +}; diff --git a/lib/utils/keymaps.js b/lib/utils/keymaps.js index dc590b81..f4a456ff 100644 --- a/lib/utils/keymaps.js +++ b/lib/utils/keymaps.js @@ -1,6 +1,6 @@ import {remote} from 'electron'; -const {getKeymaps} = remote.require('./config'); +const {getCommand} = remote.require('./utils/keymaps-normalize'); export default function returnKey(e) { let keys = []; @@ -30,5 +30,5 @@ export default function returnKey(e) { } keys = keys.join('+'); - return getKeymaps().keys[keys.toLowerCase()]; + return getCommand(keys); } diff --git a/test/unit/keymaps-normalize.test.js b/test/unit/keymaps-normalize.test.js new file mode 100644 index 00000000..57b7aa53 --- /dev/null +++ b/test/unit/keymaps-normalize.test.js @@ -0,0 +1,34 @@ +import test from 'ava'; +import {findCommandByKeys} from '../../app/utils/keymaps-normalize'; + +const expectedCommand = 'test-command'; +const expectedLocalizedCommand = 'test-localized-command'; + +const commands = { + 'alt+p+shift': expectedCommand, + 'ç+cmd+ctrl': expectedLocalizedCommand +}; + +test(`returns a command`, t => { + t.is(findCommandByKeys('alt+shift+p', commands), expectedCommand); + + t.is(findCommandByKeys('shift+p+alt', commands), expectedCommand); + + t.is(findCommandByKeys('p+alt+shift', commands), expectedCommand); + + t.is(findCommandByKeys('alt+shift+P', commands), expectedCommand); + + t.is(findCommandByKeys('Shift+P+Alt', commands), expectedCommand); +}); + +test(`returns a localized command`, t => { + t.is(findCommandByKeys('cmd+ctrl+ç', commands), expectedLocalizedCommand); + + t.is(findCommandByKeys('ç+cmd+ctrl', commands), expectedLocalizedCommand); + + t.is(findCommandByKeys('ctrl+ç+cmd', commands), expectedLocalizedCommand); + + t.is(findCommandByKeys('ctrl+Ç+cmd', commands), expectedLocalizedCommand); + + t.is(findCommandByKeys('Cmd+Ctrl+Ç', commands), expectedLocalizedCommand); +});