templatehelper.go

 1package termenv
 2
 3import (
 4	"text/template"
 5)
 6
 7// TemplateFuncs returns template helpers for the given output.
 8func (o Output) TemplateFuncs() template.FuncMap {
 9	return TemplateFuncs(o.Profile)
10}
11
12// TemplateFuncs contains a few useful template helpers.
13//
14//nolint:mnd
15func TemplateFuncs(p Profile) template.FuncMap {
16	if p == Ascii {
17		return noopTemplateFuncs
18	}
19
20	return template.FuncMap{
21		"Color": func(values ...interface{}) string {
22			s := p.String(values[len(values)-1].(string))
23			switch len(values) {
24			case 2:
25				s = s.Foreground(p.Color(values[0].(string)))
26			case 3:
27				s = s.
28					Foreground(p.Color(values[0].(string))).
29					Background(p.Color(values[1].(string)))
30			}
31
32			return s.String()
33		},
34		"Foreground": func(values ...interface{}) string {
35			s := p.String(values[len(values)-1].(string))
36			if len(values) == 2 {
37				s = s.Foreground(p.Color(values[0].(string)))
38			}
39
40			return s.String()
41		},
42		"Background": func(values ...interface{}) string {
43			s := p.String(values[len(values)-1].(string))
44			if len(values) == 2 {
45				s = s.Background(p.Color(values[0].(string)))
46			}
47
48			return s.String()
49		},
50		"Bold":      styleFunc(p, Style.Bold),
51		"Faint":     styleFunc(p, Style.Faint),
52		"Italic":    styleFunc(p, Style.Italic),
53		"Underline": styleFunc(p, Style.Underline),
54		"Overline":  styleFunc(p, Style.Overline),
55		"Blink":     styleFunc(p, Style.Blink),
56		"Reverse":   styleFunc(p, Style.Reverse),
57		"CrossOut":  styleFunc(p, Style.CrossOut),
58	}
59}
60
61func styleFunc(p Profile, f func(Style) Style) func(...interface{}) string {
62	return func(values ...interface{}) string {
63		s := p.String(values[0].(string))
64		return f(s).String()
65	}
66}
67
68var noopTemplateFuncs = template.FuncMap{
69	"Color":      noColorFunc,
70	"Foreground": noColorFunc,
71	"Background": noColorFunc,
72	"Bold":       noStyleFunc,
73	"Faint":      noStyleFunc,
74	"Italic":     noStyleFunc,
75	"Underline":  noStyleFunc,
76	"Overline":   noStyleFunc,
77	"Blink":      noStyleFunc,
78	"Reverse":    noStyleFunc,
79	"CrossOut":   noStyleFunc,
80}
81
82func noColorFunc(values ...interface{}) string {
83	return values[len(values)-1].(string)
84}
85
86func noStyleFunc(values ...interface{}) string {
87	return values[0].(string)
88}