github.com/ladydascalie/elvish@v0.0.0-20170703214355-2964dd3ece7f/edit/ui/styled.go (about) 1 package ui 2 3 import ( 4 "strings" 5 6 "github.com/elves/elvish/parse" 7 ) 8 9 // Styled is a piece of text with style. 10 type Styled struct { 11 Text string 12 Styles Styles 13 } 14 15 var styleTranslationTable = map[string]string{ 16 "bold": "1", 17 "dim": "2", 18 "italic": "3", 19 "underlined": "4", 20 "blink": "5", 21 "inverse": "7", 22 23 "black": "30", 24 "red": "31", 25 "green": "32", 26 "yellow": "33", 27 "blue": "34", 28 "magenta": "35", 29 "cyan": "36", 30 "lightgray": "37", 31 "gray": "90", 32 "lightred": "91", 33 "lightgreen": "92", 34 "lightyellow": "93", 35 "lightblue": "94", 36 "lightmagenta": "95", 37 "lightcyan": "96", 38 "white": "97", 39 40 "bg-default": "49", 41 "bg-black": "40", 42 "bg-red": "41", 43 "bg-green": "42", 44 "bg-yellow": "43", 45 "bg-blue": "44", 46 "bg-magenta": "45", 47 "bg-cyan": "46", 48 "bg-lightgray": "47", 49 "bg-gray": "100", 50 "bg-lightred": "101", 51 "bg-lightgreen": "102", 52 "bg-lightyellow": "103", 53 "bg-lightblue": "104", 54 "bg-lightmagenta": "105", 55 "bg-lightcyan": "106", 56 "bg-white": "107", 57 } 58 59 func Unstyled(s string) Styled { 60 return Styled{s, Styles{}} 61 } 62 63 func (s *Styled) Kind() string { 64 return "styled" 65 } 66 67 func (s *Styled) String() string { 68 return "\033[" + s.Styles.String() + "m" + s.Text + "\033[m" 69 } 70 71 func (s *Styled) Repr(indent int) string { 72 return "(le:styled " + parse.Quote(s.Text) + " " + parse.Quote(s.Styles.String()) + ")" 73 } 74 75 type Styles []string 76 77 func JoinStyles(so Styles, st ...Styles) Styles { 78 for _, v := range st { 79 so = append(so, v...) 80 } 81 82 return so 83 } 84 85 func TranslateStyle(s string) string { 86 v, ok := styleTranslationTable[s] 87 if ok { 88 return v 89 } 90 return s 91 } 92 93 func StylesFromString(s string) Styles { 94 var st Styles 95 for _, v := range strings.Split(s, ";") { 96 st = append(st, v) 97 } 98 99 return st 100 } 101 102 func (s Styles) String() string { 103 var o string 104 for i, v := range s { 105 if len(v) > 0 { 106 if i > 0 { 107 o += ";" 108 } 109 o += TranslateStyle(v) 110 } 111 } 112 113 return o 114 }