diff --git a/anko/anko.go b/anko/anko.go index a8c82da5..8df7bfbc 100644 --- a/anko/anko.go +++ b/anko/anko.go @@ -155,12 +155,18 @@ func (a *Anko) KeybindExists(panel string, eventKey *tcell.EventKey) bool { name := eventKey.Name() if strings.Contains(name, "Ctrl") { - key := extractCtrlRune(name) + key, ok := extractCtrlRune(name) + if !ok { + return false + } src = fmt.Sprintf("Keybinds.%s[\"ctrl_%s\"]", panel, strings.ToLower(string(key))) } else if strings.Contains(name, "Alt") { - key := extractAltRune(name) + key, ok := extractAltRune(name) + if !ok { + return false + } src = fmt.Sprintf("Keybinds.%s[\"alt_%c\"]", panel, key) } else if strings.Contains(name, "Rune") { @@ -186,12 +192,18 @@ func (a *Anko) ExecKeybind(panel string, eventKey *tcell.EventKey) error { name := eventKey.Name() if strings.Contains(name, "Ctrl") { - key := extractCtrlRune(name) + key, ok := extractCtrlRune(name) + if !ok { + return nil + } src = fmt.Sprintf("Keybinds.%s[\"ctrl_%s\"]()", panel, strings.ToLower(string(key))) } else if strings.Contains(name, "Alt") { - key := extractAltRune(name) + key, ok := extractAltRune(name) + if !ok { + return nil + } src = fmt.Sprintf("Keybinds.%s[\"alt_%c\"]()", panel, key) } else if strings.Contains(name, "Rune") { @@ -210,14 +222,20 @@ func (a *Anko) ExecKeybind(panel string, eventKey *tcell.EventKey) error { return nil } -func extractCtrlRune(str string) rune { +func extractCtrlRune(str string) (rune, bool) { re := regexp.MustCompile(`\+(.)$`) x := re.FindStringSubmatch(str) - return rune(x[0][1]) + if len(x) == 0 { + return rune(' '), false + } + return rune(x[0][1]), true } -func extractAltRune(str string) rune { +func extractAltRune(str string) (rune, bool) { re := regexp.MustCompile(`\[(.)\]`) x := re.FindStringSubmatch(str) - return rune(x[0][1]) + if len(x) == 0 { + return rune(' '), false + } + return rune(x[0][1]), true } diff --git a/anko/anko_test.go b/anko/anko_test.go index ecddd323..978752dd 100644 --- a/anko/anko_test.go +++ b/anko/anko_test.go @@ -145,18 +145,22 @@ func TestExtractCtrlRune(t *testing.T) { tests := []struct { in string out rune + ok bool }{ - {in: "Ctrl+x", out: 'x'}, - {in: "Ctrl+]", out: ']'}, - {in: "Ctrl+%", out: '%'}, - {in: "Ctrl+^", out: '^'}, - {in: "Ctrl+7", out: '7'}, - {in: "Ctrl+B", out: 'B'}, + {in: "Ctrl+x", out: 'x', ok: true}, + {in: "Ctrl+]", out: ']', ok: true}, + {in: "Ctrl+%", out: '%', ok: true}, + {in: "Ctrl+^", out: '^', ok: true}, + {in: "Ctrl+7", out: '7', ok: true}, + {in: "Ctrl+B", out: 'B', ok: true}, + {in: "Ctrl+Down", out: ' ', ok: false}, + {in: "Ctrl+Left", out: ' ', ok: false}, } for _, test := range tests { - got := extractCtrlRune(test.in) + got, ok := extractCtrlRune(test.in) assert.Equal(t, test.out, got) + assert.Equal(t, test.ok, ok) } } @@ -164,18 +168,20 @@ func TestExtractAltRune(t *testing.T) { tests := []struct { in string out rune + ok bool }{ - {in: "Alt+Rune[x]", out: 'x'}, - {in: "Alt+Rune[]]", out: ']'}, - {in: "Alt+Rune[%]", out: '%'}, - {in: "Alt+Rune[^]", out: '^'}, - {in: "Alt+Rune[7]", out: '7'}, - {in: "Alt+Rune[B]", out: 'B'}, + {in: "Alt+Rune[x]", out: 'x', ok: true}, + {in: "Alt+Rune[]]", out: ']', ok: true}, + {in: "Alt+Rune[%]", out: '%', ok: true}, + {in: "Alt+Rune[^]", out: '^', ok: true}, + {in: "Alt+Rune[7]", out: '7', ok: true}, + {in: "Alt+Rune[B]", out: 'B', ok: true}, } for _, test := range tests { - got := extractAltRune(test.in) + got, ok := extractAltRune(test.in) assert.Equal(t, test.out, got) + assert.Equal(t, test.ok, ok) } }