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  }