table.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. package element
  2. import (
  3. "git.nspix.com/golang/pgenr/internal/pool"
  4. "golang.org/x/net/html/atom"
  5. )
  6. type (
  7. Table struct {
  8. Title Element
  9. Header []Element
  10. Body [][]Element
  11. Outro Element
  12. }
  13. )
  14. func (table *Table) SetHead(elements ...Element) {
  15. table.Header = elements
  16. }
  17. func (table *Table) AddCell(elements ...Element) {
  18. if table.Body == nil {
  19. table.Body = make([][]Element, 0)
  20. }
  21. table.Body = append(table.Body, elements)
  22. }
  23. func (table *Table) String() string {
  24. br := pool.Get()
  25. defer pool.Put(br)
  26. br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "table-wrapper"}))
  27. if table.Title != nil {
  28. br.WriteString(renderTag(atom.Div.String(), Attrs{"class": "table-title"}, table.Title.Html()))
  29. }
  30. br.WriteString(beginTag(atom.Table.String(), Attrs{"class": "table"}))
  31. if len(table.Header) > 0 {
  32. br.WriteString(beginTag(atom.Thead.String(), nil))
  33. br.WriteString(beginTag(atom.Tr.String(), nil))
  34. for _, text := range table.Header {
  35. br.WriteString(renderTag(atom.Th.String(), nil, text.Html()))
  36. }
  37. br.WriteString(endTag(atom.Tr.String()))
  38. br.WriteString(endTag(atom.Thead.String()))
  39. }
  40. if len(table.Body) > 0 {
  41. br.WriteString(beginTag(atom.Tbody.String(), nil))
  42. for _, cell := range table.Body {
  43. br.WriteString(beginTag(atom.Tr.String(), nil))
  44. for _, text := range cell {
  45. br.WriteString(renderTag(atom.Td.String(), nil, text.Html()))
  46. }
  47. br.WriteString(endTag(atom.Tr.String()))
  48. }
  49. br.WriteString(endTag(atom.Tbody.String()))
  50. }
  51. br.WriteString(endTag(atom.Table.String()))
  52. if table.Outro != nil {
  53. br.WriteString(table.Outro.Html())
  54. }
  55. br.WriteString(endTag(atom.Div.String()))
  56. return br.String()
  57. }
  58. func NewTable(title *Text) *Table {
  59. table := &Table{
  60. Title: title,
  61. Header: make([]Element, 0),
  62. Body: make([][]Element, 0),
  63. }
  64. return table
  65. }