templatehelper.go 2.1 KB

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