text.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package element
  2. import (
  3. "git.nspix.com/golang/pgenr/internal/pool"
  4. "golang.org/x/net/html/atom"
  5. "html"
  6. )
  7. const (
  8. TextThemeSuccess = "success"
  9. TextThemeDanger = "danger"
  10. )
  11. type (
  12. TextOption func(t *Text)
  13. Text struct {
  14. Tag atom.Atom
  15. Content string
  16. Theme string
  17. Color string
  18. Style Style
  19. }
  20. )
  21. func WithTextTheme(s string) TextOption {
  22. return func(t *Text) {
  23. t.Theme = s
  24. }
  25. }
  26. func WithTextStyle(ms map[string]string) TextOption {
  27. return func(t *Text) {
  28. t.Style = ms
  29. }
  30. }
  31. func WithTextTag(tag atom.Atom) TextOption {
  32. return func(t *Text) {
  33. t.Tag = tag
  34. }
  35. }
  36. func WithTextColor(color string) TextOption {
  37. return func(t *Text) {
  38. t.Color = color
  39. }
  40. }
  41. func (text *Text) Html() string {
  42. return text.String()
  43. }
  44. func (text *Text) String() string {
  45. br := pool.Get()
  46. defer pool.Put(br)
  47. if text.Style == nil {
  48. text.Style = make(map[string]string)
  49. }
  50. if text.Color != "" {
  51. text.Style["color"] = text.Color
  52. }
  53. if text.Tag == 0 {
  54. text.Tag = atom.Span
  55. }
  56. br.WriteString("<")
  57. br.WriteString(text.Tag.String())
  58. if text.Theme != "" {
  59. br.WriteString(" class='text-")
  60. br.WriteString(text.Theme)
  61. br.WriteString("'")
  62. }
  63. if len(text.Style) > 0 {
  64. br.WriteString(" style='")
  65. br.WriteString(text.Style.String())
  66. br.WriteString("'")
  67. }
  68. br.WriteString(">")
  69. br.WriteString(html.EscapeString(text.Content))
  70. br.WriteString("</")
  71. br.WriteString(text.Tag.String())
  72. br.WriteString(">")
  73. return br.String()
  74. }
  75. func NewText(s string, opts ...TextOption) *Text {
  76. txt := &Text{Content: s, Tag: atom.Span}
  77. for _, cb := range opts {
  78. cb(txt)
  79. }
  80. return txt
  81. }