From b365a2062c29f913a3c0804ff2b29561c113191a Mon Sep 17 00:00:00 2001 From: Bryan Housel Date: Sun, 27 Sep 2015 21:28:04 -0400 Subject: [PATCH] Handle multi-character keys in `iD.ui.cmd` (closes #2786) --- js/id/ui/cmd.js | 26 ++++++++++++++------------ test/spec/ui/cmd.js | 23 ++++++++++++++++++++--- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/js/id/ui/cmd.js b/js/id/ui/cmd.js index 4bc3e30b0..5708d5c4c 100644 --- a/js/id/ui/cmd.js +++ b/js/id/ui/cmd.js @@ -1,28 +1,30 @@ // Translate a MacOS key command into the appropriate Windows/Linux equivalent. // For example, ⌘Z -> Ctrl+Z iD.ui.cmd = function(code) { - if (iD.detect().os === 'mac') + if (iD.detect().os === 'mac') { return code; - - var replacements = { - '⌘': 'Ctrl', - '⇧': 'Shift', - '⌥': 'Alt', - '⌫': 'Backspace', - '⌦': 'Delete' - }, keys = []; + } if (iD.detect().os === 'win') { if (code === '⌘⇧Z') return 'Ctrl+Y'; } + var result = '', + replacements = { + '⌘': 'Ctrl', + '⇧': 'Shift', + '⌥': 'Alt', + '⌫': 'Backspace', + '⌦': 'Delete' + }; + for (var i = 0; i < code.length; i++) { if (code[i] in replacements) { - keys.push(replacements[code[i]]); + result += replacements[code[i]] + '+'; } else { - keys.push(code[i]); + result += code[i]; } } - return keys.join('+'); + return result; }; diff --git a/test/spec/ui/cmd.js b/test/spec/ui/cmd.js index c8350343f..f7f960d8d 100644 --- a/test/spec/ui/cmd.js +++ b/test/spec/ui/cmd.js @@ -14,12 +14,29 @@ describe('iD.ui.cmd', function () { it('does not overwrite mac keybindings', function () { os = 'mac'; - expect(iD.ui.cmd('⌘a')).to.eql('⌘a'); + expect(iD.ui.cmd('⌘A')).to.eql('⌘A'); }); it('changes keys to linux versions', function () { os = 'linux'; - expect(iD.ui.cmd('⌘a')).to.eql('Ctrl+a'); - expect(iD.ui.cmd('⇧a')).to.eql('Shift+a'); + expect(iD.ui.cmd('⌘A')).to.eql('Ctrl+A'); + expect(iD.ui.cmd('⇧A')).to.eql('Shift+A'); + expect(iD.ui.cmd('⌘⇧A')).to.eql('Ctrl+Shift+A'); + expect(iD.ui.cmd('⌘⇧Z')).to.eql('Ctrl+Shift+Z'); }); + + it('changes keys to win versions', function () { + os = 'win'; + expect(iD.ui.cmd('⌘A')).to.eql('Ctrl+A'); + expect(iD.ui.cmd('⇧A')).to.eql('Shift+A'); + expect(iD.ui.cmd('⌘⇧A')).to.eql('Ctrl+Shift+A'); + expect(iD.ui.cmd('⌘⇧Z')).to.eql('Ctrl+Y'); // special case + }); + + it('handles multi-character keys', function () { + os = 'win'; + expect(iD.ui.cmd('f11')).to.eql('f11'); + expect(iD.ui.cmd('⌘plus')).to.eql('Ctrl+plus'); + }); + });