diff --git a/app/config/keymaps.js b/app/config/keymaps.js index 22602c08..44d9c734 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]); } } }; @@ -35,8 +36,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..15224e5b --- /dev/null +++ b/app/utils/keymaps-normalize.js @@ -0,0 +1,23 @@ +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..3d4abfaf --- /dev/null +++ b/test/unit/keymaps-normalize.test.js @@ -0,0 +1,64 @@ +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 + ); +});