2021-02-14 14:35:36 +08:00
|
|
|
package anko
|
|
|
|
|
|
|
|
import (
|
2021-02-14 20:33:24 +08:00
|
|
|
"fmt"
|
2021-02-17 15:23:08 +08:00
|
|
|
"regexp"
|
|
|
|
"strings"
|
2021-02-14 20:33:24 +08:00
|
|
|
|
2021-02-17 15:23:08 +08:00
|
|
|
"github.com/gdamore/tcell/v2"
|
2021-02-14 14:35:36 +08:00
|
|
|
"github.com/mattn/anko/core"
|
|
|
|
"github.com/mattn/anko/env"
|
|
|
|
_ "github.com/mattn/anko/packages"
|
2021-02-17 15:23:08 +08:00
|
|
|
"github.com/mattn/anko/vm"
|
2021-02-14 14:35:36 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
type Anko struct {
|
|
|
|
env *env.Env
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewAnko() Anko {
|
2021-02-15 12:37:05 +08:00
|
|
|
|
|
|
|
env := core.Import(env.NewEnv())
|
|
|
|
importToX(env)
|
|
|
|
|
|
|
|
return Anko{env}
|
2021-02-14 14:35:36 +08:00
|
|
|
}
|
|
|
|
|
2021-02-14 21:37:31 +08:00
|
|
|
// Define defines new symbol and value to the Anko env.
|
2021-02-14 14:35:36 +08:00
|
|
|
func (a *Anko) Define(symbol string, value interface{}) error {
|
|
|
|
return a.env.DefineGlobal(symbol, value)
|
|
|
|
}
|
|
|
|
|
2021-02-14 21:37:31 +08:00
|
|
|
// Set sets new value to existing symbol. Use this when change value under an
|
2021-02-14 14:35:36 +08:00
|
|
|
// existing symbol.
|
|
|
|
func (a *Anko) Set(symbol string, value interface{}) error {
|
|
|
|
return a.env.Set(symbol, value)
|
|
|
|
}
|
|
|
|
|
2021-02-14 21:37:31 +08:00
|
|
|
// Get gets value from anko env, returns error if symbol is not found.
|
2021-02-14 14:35:36 +08:00
|
|
|
func (a *Anko) Get(symbol string) (interface{}, error) {
|
|
|
|
return a.env.Get(symbol)
|
|
|
|
}
|
|
|
|
|
2021-02-14 21:37:31 +08:00
|
|
|
// GetInt gets int value from symbol, returns golang default value if not found.
|
2021-02-14 14:35:36 +08:00
|
|
|
func (a *Anko) GetInt(symbol string) int {
|
|
|
|
v, err := a.env.Get(symbol)
|
|
|
|
if err != nil {
|
|
|
|
return 0
|
|
|
|
}
|
|
|
|
|
2021-02-15 21:46:43 +08:00
|
|
|
switch val := v.(type) {
|
2021-02-17 15:23:08 +08:00
|
|
|
case int:
|
2021-02-15 21:46:43 +08:00
|
|
|
return val
|
|
|
|
case int64:
|
|
|
|
return int(val)
|
2021-02-14 14:35:36 +08:00
|
|
|
}
|
|
|
|
|
2021-02-15 21:46:43 +08:00
|
|
|
return 0
|
2021-02-14 14:35:36 +08:00
|
|
|
}
|
|
|
|
|
2021-02-14 21:37:31 +08:00
|
|
|
// GetString gets string value from symbol, returns golang default value if not
|
|
|
|
// found.
|
2021-02-14 14:35:36 +08:00
|
|
|
func (a *Anko) GetString(symbol string) string {
|
|
|
|
v, err := a.env.Get(symbol)
|
|
|
|
if err != nil {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
val, ok := v.(string)
|
|
|
|
if !ok {
|
|
|
|
return ""
|
|
|
|
}
|
|
|
|
|
|
|
|
return val
|
|
|
|
}
|
|
|
|
|
2021-02-14 21:37:31 +08:00
|
|
|
// GetBool gets bool value from symbol, returns golang default value if not
|
|
|
|
// found.
|
2021-02-14 14:35:36 +08:00
|
|
|
func (a *Anko) GetBool(symbol string) bool {
|
|
|
|
v, err := a.env.Get(symbol)
|
|
|
|
if err != nil {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
val, ok := v.(bool)
|
|
|
|
if !ok {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
return val
|
|
|
|
}
|
|
|
|
|
2021-02-14 21:37:31 +08:00
|
|
|
// Execute executes anko script.
|
2021-02-14 14:35:36 +08:00
|
|
|
func (a *Anko) Execute(src string) (interface{}, error) {
|
|
|
|
return vm.Execute(a.env, nil, src)
|
|
|
|
}
|
2021-02-14 20:33:24 +08:00
|
|
|
|
2021-02-14 21:37:31 +08:00
|
|
|
// KeybindExists checks if keybinding is defined.
|
2021-02-17 15:23:08 +08:00
|
|
|
func (a *Anko) KeybindExists(panel string, eventKey *tcell.EventKey) bool {
|
|
|
|
var src string
|
|
|
|
name := eventKey.Name()
|
|
|
|
|
|
|
|
if strings.Contains(name, "Ctrl") {
|
|
|
|
key := extractCtrlRune(name)
|
2021-02-17 17:08:39 +08:00
|
|
|
src = fmt.Sprintf("Keybinds.%s[\"ctrl_%s\"]",
|
2021-02-17 15:23:08 +08:00
|
|
|
panel, strings.ToLower(string(key)))
|
|
|
|
|
|
|
|
} else if strings.Contains(name, "Alt") {
|
|
|
|
key := extractAltRune(name)
|
2021-02-17 17:08:39 +08:00
|
|
|
src = fmt.Sprintf("Keybinds.%s[\"alt_%c\"]", panel, key)
|
2021-02-17 15:23:08 +08:00
|
|
|
|
|
|
|
} else if strings.Contains(name, "Rune") {
|
2021-02-17 17:08:39 +08:00
|
|
|
src = fmt.Sprintf("Keybinds.%s[\"%c\"]", panel, eventKey.Rune())
|
2021-02-17 15:23:08 +08:00
|
|
|
|
|
|
|
} else {
|
2021-02-17 17:08:39 +08:00
|
|
|
src = fmt.Sprintf("Keybinds.%s[\"%s\"]", panel, strings.ToLower(name))
|
2021-02-17 15:23:08 +08:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-02-14 21:37:31 +08:00
|
|
|
val, err := a.Execute(src)
|
2021-02-14 20:33:24 +08:00
|
|
|
if err != nil {
|
2021-02-14 21:37:31 +08:00
|
|
|
return false
|
2021-02-14 20:33:24 +08:00
|
|
|
}
|
|
|
|
|
2021-02-14 21:37:31 +08:00
|
|
|
return val != nil
|
|
|
|
}
|
2021-02-14 20:33:24 +08:00
|
|
|
|
2021-02-14 21:37:31 +08:00
|
|
|
// ExecKeybind executes function bounded by the keybinding.
|
2021-02-17 15:23:08 +08:00
|
|
|
func (a *Anko) ExecKeybind(panel string, eventKey *tcell.EventKey) error {
|
|
|
|
|
|
|
|
var src string
|
|
|
|
name := eventKey.Name()
|
|
|
|
|
|
|
|
if strings.Contains(name, "Ctrl") {
|
|
|
|
key := extractCtrlRune(name)
|
2021-02-17 17:08:39 +08:00
|
|
|
src = fmt.Sprintf("Keybinds.%s[\"ctrl_%s\"]()",
|
2021-02-17 15:23:08 +08:00
|
|
|
panel, strings.ToLower(string(key)))
|
|
|
|
|
|
|
|
} else if strings.Contains(name, "Alt") {
|
|
|
|
key := extractAltRune(name)
|
2021-02-17 17:08:39 +08:00
|
|
|
src = fmt.Sprintf("Keybinds.%s[\"alt_%c\"]()", panel, key)
|
2021-02-17 15:23:08 +08:00
|
|
|
|
|
|
|
} else if strings.Contains(name, "Rune") {
|
2021-02-17 17:08:39 +08:00
|
|
|
src = fmt.Sprintf("Keybinds.%s[\"%c\"]()", panel, eventKey.Rune())
|
2021-02-17 15:23:08 +08:00
|
|
|
|
|
|
|
} else {
|
2021-02-17 17:08:39 +08:00
|
|
|
src = fmt.Sprintf("Keybinds.%s[\"%s\"]()", panel, strings.ToLower(name))
|
2021-02-17 15:23:08 +08:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2021-02-15 13:55:43 +08:00
|
|
|
_, err := a.Execute(src)
|
2021-02-17 15:23:08 +08:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func extractCtrlRune(str string) rune {
|
|
|
|
re := regexp.MustCompile(`\+(.)$`)
|
|
|
|
x := re.FindStringSubmatch(str)
|
|
|
|
return rune(x[0][1])
|
|
|
|
}
|
|
|
|
|
|
|
|
func extractAltRune(str string) rune {
|
|
|
|
re := regexp.MustCompile(`\[(.)\]`)
|
|
|
|
x := re.FindStringSubmatch(str)
|
|
|
|
return rune(x[0][1])
|
2021-02-14 20:33:24 +08:00
|
|
|
}
|