mirror of
https://github.com/atom/atom.git
synced 2026-02-04 03:35:20 -05:00
56 lines
1.7 KiB
CoffeeScript
56 lines
1.7 KiB
CoffeeScript
$ = require 'jquery'
|
|
_ = require 'underscore'
|
|
fsUtils = require 'fs-utils'
|
|
|
|
Specificity = require 'specificity'
|
|
PEG = require 'pegjs'
|
|
|
|
### Internal ###
|
|
|
|
module.exports =
|
|
class BindingSet
|
|
|
|
@parser: null
|
|
|
|
selector: null
|
|
commandsByKeystrokes: null
|
|
commandForEvent: null
|
|
parser: null
|
|
name: null
|
|
|
|
constructor: (selector, commandsByKeystrokes, @index, @name) ->
|
|
BindingSet.parser ?= PEG.buildParser(fsUtils.read(require.resolve 'keystroke-pattern.pegjs'))
|
|
@specificity = Specificity(selector)
|
|
@selector = selector.replace(/!important/g, '')
|
|
@commandsByKeystrokes = @normalizeCommandsByKeystrokes(commandsByKeystrokes)
|
|
|
|
commandForEvent: (event) ->
|
|
for keystrokes, command of @commandsByKeystrokes
|
|
return command if event.keystrokes == keystrokes
|
|
null
|
|
|
|
matchesKeystrokePrefix: (event) ->
|
|
eventKeystrokes = event.keystrokes.split(' ')
|
|
for keystrokes, command of @commandsByKeystrokes
|
|
bindingKeystrokes = keystrokes.split(' ')
|
|
continue unless eventKeystrokes.length < bindingKeystrokes.length
|
|
return true if _.isEqual(eventKeystrokes, bindingKeystrokes[0...eventKeystrokes.length])
|
|
false
|
|
|
|
normalizeCommandsByKeystrokes: (commandsByKeystrokes) ->
|
|
normalizedCommandsByKeystrokes = {}
|
|
for keystrokes, command of commandsByKeystrokes
|
|
normalizedCommandsByKeystrokes[@normalizeKeystrokes(keystrokes)] = command
|
|
normalizedCommandsByKeystrokes
|
|
|
|
normalizeKeystrokes: (keystrokes) ->
|
|
normalizedKeystrokes = keystrokes.split(/\s+/).map (keystroke) =>
|
|
@normalizeKeystroke(keystroke)
|
|
normalizedKeystrokes.join(' ')
|
|
|
|
normalizeKeystroke: (keystroke) ->
|
|
keys = BindingSet.parser.parse(keystroke)
|
|
modifiers = keys[0...-1]
|
|
modifiers.sort()
|
|
[modifiers..., _.last(keys)].join('-')
|