substance
Version:
Substance is a JavaScript library for web-based content editing. It provides building blocks for realizing custom text editors and web-based publishing system. It is developed to power our online editing platform [Substance](http://substance.io).
80 lines (78 loc) • 1.88 kB
JavaScript
import platform from './platform'
import keys from './keys'
import hasOwnProperty from './hasOwnProperty'
/**
* Parses a key-combo such as 'CommandOrControl+Enter' and turns it into a
* record equivalent to a DOM KeyboardEvent.
*
* @param {string} combo a key-combo such as 'CommandOrControl+Enter'
*/
export default function parseKeyCombo (combo) {
const frags = combo.split('+')
const keyEvent = {
keyCode: -1
}
for (var i = 0; i < frags.length; i++) {
const frag = frags[i].toUpperCase()
switch (frag) {
case 'ALT': {
keyEvent.altKey = true
break
}
case 'ALTGR': {
keyEvent.altKey = true
keyEvent.code = 'AltRight'
break
}
case 'CMD': {
keyEvent.metaKey = true
break
}
case 'CTRL': {
keyEvent.ctrlKey = true
break
}
case 'COMMANDORCONTROL': {
if (platform.isMac) {
keyEvent.metaKey = true
} else {
keyEvent.ctrlKey = true
}
break
}
case 'MEDIANEXTTRACK': {
keyEvent.code = 'MediaTrackNext'
break
}
case 'MEDIAPLAYPAUSE': {
keyEvent.code = 'MediaPlayPause'
break
}
case 'MEDIAPREVIOUSTRACK': {
keyEvent.code = 'MediaPreviousTrack'
break
}
case 'MEDIASTOP': {
keyEvent.code = 'MediaStop'
break
}
case 'SHIFT': {
keyEvent.shiftKey = true
break
}
case 'SUPER': {
keyEvent.metaKey = true
break
}
default:
if (frag.length === 1) {
keyEvent.keyCode = frag.charCodeAt(0)
} else if (hasOwnProperty(keys, frag)) {
keyEvent.keyCode = keys[frag]
} else {
throw new Error('Unsupported keyboard command: ' + combo)
}
}
}
return keyEvent
}