table.go 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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.Div.String(), Attrs{"class": "table-wrapper-inner"}))
  31. br.WriteString(beginTag(atom.Table.String(), Attrs{"class": "table"}))
  32. if len(table.Header) > 0 {
  33. br.WriteString(beginTag(atom.Thead.String(), nil))
  34. br.WriteString(beginTag(atom.Tr.String(), nil))
  35. for _, text := range table.Header {
  36. br.WriteString(renderTag(atom.Th.String(), nil, text.Html()))
  37. }
  38. br.WriteString(endTag(atom.Tr.String()))
  39. br.WriteString(endTag(atom.Thead.String()))
  40. }
  41. if len(table.Body) > 0 {
  42. br.WriteString(beginTag(atom.Tbody.String(), nil))
  43. for _, cell := range table.Body {
  44. br.WriteString(beginTag(atom.Tr.String(), nil))
  45. for _, text := range cell {
  46. br.WriteString(renderTag(atom.Td.String(), nil, text.Html()))
  47. }
  48. br.WriteString(endTag(atom.Tr.String()))
  49. }
  50. br.WriteString(endTag(atom.Tbody.String()))
  51. }
  52. br.WriteString(endTag(atom.Table.String()))
  53. br.WriteString(endTag(atom.Div.String()))
  54. if table.Outro != nil {
  55. br.WriteString(table.Outro.Html())
  56. }
  57. br.WriteString(endTag(atom.Div.String()))
  58. return br.String()
  59. }
  60. func NewTable(title Element) *Table {
  61. table := &Table{
  62. Title: title,
  63. Header: make([]Element, 0),
  64. Body: make([][]Element, 0),
  65. }
  66. return table
  67. }