table.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. }
  12. )
  13. func (table *Table) SetHead(elements ...Element) {
  14. table.Header = elements
  15. }
  16. func (table *Table) AddCell(elements ...Element) {
  17. if table.Body == nil {
  18. table.Body = make([][]Element, 0)
  19. }
  20. table.Body = append(table.Body, elements)
  21. }
  22. func (table *Table) String() string {
  23. br := pool.Get()
  24. defer pool.Put(br)
  25. br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "table-wrapper"}))
  26. if table.Title != nil {
  27. br.WriteString(renderTag(atom.Div.String(), Attrs{"class": "table-title"}, table.Title.Html()))
  28. }
  29. br.WriteString(beginTag(atom.Table.String(), Attrs{"class": "table"}))
  30. if len(table.Header) > 0 {
  31. br.WriteString(beginTag(atom.Thead.String(), nil))
  32. br.WriteString(beginTag(atom.Tr.String(), nil))
  33. for _, text := range table.Header {
  34. br.WriteString(renderTag(atom.Th.String(), nil, text.Html()))
  35. }
  36. br.WriteString(endTag(atom.Tr.String()))
  37. br.WriteString(endTag(atom.Thead.String()))
  38. }
  39. if len(table.Body) > 0 {
  40. br.WriteString(beginTag(atom.Tbody.String(), nil))
  41. for _, cell := range table.Body {
  42. br.WriteString(beginTag(atom.Tr.String(), nil))
  43. for _, text := range cell {
  44. br.WriteString(renderTag(atom.Td.String(), nil, text.Html()))
  45. }
  46. br.WriteString(endTag(atom.Tr.String()))
  47. }
  48. br.WriteString(endTag(atom.Tbody.String()))
  49. }
  50. br.WriteString(endTag(atom.Table.String()))
  51. br.WriteString(endTag(atom.Div.String()))
  52. return br.String()
  53. }
  54. func NewTable(title *Text) *Table {
  55. table := &Table{
  56. Title: title,
  57. Header: make([]Element, 0),
  58. Body: make([][]Element, 0),
  59. }
  60. return table
  61. }