diff options
Diffstat (limited to 'config/style.go')
-rw-r--r-- | config/style.go | 372 |
1 files changed, 0 insertions, 372 deletions
diff --git a/config/style.go b/config/style.go deleted file mode 100644 index fb17d93f..00000000 --- a/config/style.go +++ /dev/null @@ -1,372 +0,0 @@ -package config - -import ( - "errors" - "os" - "path" - "regexp" - "strings" - - "github.com/gdamore/tcell" - "github.com/go-ini/ini" - "github.com/mitchellh/go-homedir" -) - -type StyleObject int32 - -const ( - STYLE_DEFAULT StyleObject = iota - STYLE_ERROR - STYLE_WARNING - STYLE_SUCCESS - - STYLE_TITLE - STYLE_HEADER - - STYLE_STATUSLINE_DEFAULT - STYLE_STATUSLINE_ERROR - STYLE_STATUSLINE_SUCCESS - - STYLE_MSGLIST_DEFAULT - STYLE_MSGLIST_UNREAD - STYLE_MSGLIST_READ - STYLE_MSGLIST_DELETED - STYLE_MSGLIST_MARKED - STYLE_MSGLIST_FLAGGED - - STYLE_DIRLIST_DEFAULT - - STYLE_COMPLETION_DEFAULT - STYLE_COMPLETION_GUTTER - STYLE_COMPLETION_PILL - - STYLE_TAB - STYLE_STACK - STYLE_SPINNER - STYLE_BORDER - - STYLE_SELECTER_DEFAULT - STYLE_SELECTER_FOCUSED - STYLE_SELECTER_CHOOSER -) - -var StyleNames = map[string]StyleObject{ - "default": STYLE_DEFAULT, - "error": STYLE_ERROR, - "warning": STYLE_WARNING, - "success": STYLE_SUCCESS, - - "title": STYLE_TITLE, - "header": STYLE_HEADER, - - "statusline_default": STYLE_STATUSLINE_DEFAULT, - "statusline_error": STYLE_STATUSLINE_ERROR, - "statusline_success": STYLE_STATUSLINE_SUCCESS, - - "msglist_default": STYLE_MSGLIST_DEFAULT, - "msglist_unread": STYLE_MSGLIST_UNREAD, - "msglist_read": STYLE_MSGLIST_READ, - "msglist_deleted": STYLE_MSGLIST_DELETED, - "msglist_marked": STYLE_MSGLIST_MARKED, - "msglist_flagged": STYLE_MSGLIST_FLAGGED, - - "dirlist_default": STYLE_DIRLIST_DEFAULT, - - "completion_default": STYLE_COMPLETION_DEFAULT, - "completion_gutter": STYLE_COMPLETION_GUTTER, - "completion_pill": STYLE_COMPLETION_PILL, - - "tab": STYLE_TAB, - "stack": STYLE_STACK, - "spinner": STYLE_SPINNER, - "border": STYLE_BORDER, - - "selecter_default": STYLE_SELECTER_DEFAULT, - "selecter_focused": STYLE_SELECTER_FOCUSED, - "selecter_chooser": STYLE_SELECTER_CHOOSER, -} - -type Style struct { - Fg tcell.Color - Bg tcell.Color - Bold bool - Blink bool - Underline bool - Reverse bool -} - -func (s Style) Get() tcell.Style { - return tcell.StyleDefault. - Foreground(s.Fg). - Background(s.Bg). - Bold(s.Bold). - Blink(s.Blink). - Underline(s.Blink). - Reverse(s.Reverse) -} - -func (s *Style) Normal() { - s.Bold = false - s.Blink = false - s.Underline = false - s.Reverse = false -} - -func (s *Style) Default() *Style { - s.Fg = tcell.ColorDefault - s.Bg = tcell.ColorDefault - return s -} - -func (s *Style) Reset() *Style { - s.Default() - s.Normal() - return s -} - -func boolSwitch(val string, cur_val bool) (bool, error) { - switch val { - case "true": - return true, nil - case "false": - return false, nil - case "toggle": - return !cur_val, nil - default: - return cur_val, errors.New( - "Bool Switch attribute must be true, false, or toggle") - } -} - -func (s *Style) Set(attr, val string) error { - switch attr { - case "fg": - s.Fg = tcell.GetColor(val) - case "bg": - s.Bg = tcell.GetColor(val) - case "bold": - if state, err := boolSwitch(val, s.Bold); err != nil { - return err - } else { - s.Bold = state - } - case "blink": - if state, err := boolSwitch(val, s.Blink); err != nil { - return err - } else { - s.Blink = state - } - case "underline": - if state, err := boolSwitch(val, s.Underline); err != nil { - return err - } else { - s.Underline = state - } - case "reverse": - if state, err := boolSwitch(val, s.Reverse); err != nil { - return err - } else { - s.Reverse = state - } - case "default": - s.Default() - case "normal": - s.Normal() - default: - return errors.New("Unknown style attribute: " + attr) - } - - return nil -} - -type StyleSet struct { - objects map[StyleObject]*Style - selected map[StyleObject]*Style -} - -func NewStyleSet() StyleSet { - ss := StyleSet{ - objects: make(map[StyleObject]*Style), - selected: make(map[StyleObject]*Style), - } - for _, so := range StyleNames { - ss.objects[so] = new(Style) - ss.selected[so] = new(Style) - } - - return ss -} - -func (ss StyleSet) reset() { - for _, so := range StyleNames { - ss.objects[so].Reset() - ss.selected[so].Reset() - } -} - -func (ss StyleSet) Get(so StyleObject) tcell.Style { - return ss.objects[so].Get() -} - -func (ss StyleSet) Selected(so StyleObject) tcell.Style { - return ss.selected[so].Get() -} - -func findStyleSet(stylesetName string, stylesetsDir []string) (string, error) { - for _, dir := range stylesetsDir { - stylesetPath, err := homedir.Expand(path.Join(dir, stylesetName)) - if err != nil { - return "", err - } - - if _, err := os.Stat(stylesetPath); os.IsNotExist(err) { - continue - } - - return stylesetPath, nil - } - - return "", errors.New("Can't find styleset - " + stylesetName) -} -func (ss *StyleSet) ParseStyleSet(stylesetName string, stylesetDirs []string) error { - filepath, err := findStyleSet(stylesetName, stylesetDirs) - if err != nil { - return err - } - - file, err := ini.Load(filepath) - if err != nil { - return err - } - - ss.reset() - - defaultSection, err := file.GetSection(ini.DefaultSection) - if err != nil { - return err - } - - selectedKeys := []string{} - - for _, key := range defaultSection.KeyStrings() { - tokens := strings.Split(key, ".") - var styleName, attr string - switch len(tokens) { - case 2: - styleName, attr = tokens[0], tokens[1] - case 3: - if tokens[1] != "selected" { - return errors.New("Unknown modifier: " + tokens[1]) - } - selectedKeys = append(selectedKeys, key) - continue - default: - return errors.New("Style parsing error: " + key) - } - val := defaultSection.KeysHash()[key] - - if strings.ContainsAny(styleName, "*?") { - regex := fnmatchToRegex(styleName) - for sn, so := range StyleNames { - matched, err := regexp.MatchString(regex, sn) - if err != nil { - return err - } - - if !matched { - continue - } - - if err := ss.objects[so].Set(attr, val); err != nil { - return err - } - if err := ss.selected[so].Set(attr, val); err != nil { - return err - } - } - } else { - so, ok := StyleNames[styleName] - if !ok { - return errors.New("Unknown style object: " + styleName) - } - if err := ss.objects[so].Set(attr, val); err != nil { - return err - } - if err := ss.selected[so].Set(attr, val); err != nil { - return err - } - } - } - - for _, key := range selectedKeys { - tokens := strings.Split(key, ".") - styleName, modifier, attr := tokens[0], tokens[1], tokens[2] - if modifier != "selected" { - return errors.New("Unknown modifier: " + modifier) - } - - val := defaultSection.KeysHash()[key] - - if strings.ContainsAny(styleName, "*?") { - regex := fnmatchToRegex(styleName) - for sn, so := range StyleNames { - matched, err := regexp.MatchString(regex, sn) - if err != nil { - return err - } - - if !matched { - continue - } - - if err := ss.selected[so].Set(attr, val); err != nil { - return err - } - } - } else { - so, ok := StyleNames[styleName] - if !ok { - return errors.New("Unknown style object: " + styleName) - } - if err := ss.selected[so].Set(attr, val); err != nil { - return err - } - } - } - - for _, key := range defaultSection.KeyStrings() { - tokens := strings.Split(key, ".") - styleName, attr := tokens[0], tokens[1] - val := defaultSection.KeysHash()[key] - - if styleName != "selected" { - continue - } - - for _, so := range StyleNames { - if err := ss.selected[so].Set(attr, val); err != nil { - return err - } - } - } - - return nil -} - -func fnmatchToRegex(pattern string) string { - n := len(pattern) - var regex strings.Builder - - for i := 0; i < n; i++ { - switch pattern[i] { - case '*': - regex.WriteString(".*") - case '?': - regex.WriteByte('.') - default: - regex.WriteByte(pattern[i]) - } - } - - return regex.String() -} |