table.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package element
  2. import (
  3. "fmt"
  4. "git.nspix.com/golang/pgenr/internal/pool"
  5. "golang.org/x/net/html/atom"
  6. )
  7. type (
  8. Table struct {
  9. Title Element
  10. FixedColumn bool
  11. FixedWidth int
  12. Header []Element
  13. Body [][]Element
  14. Outro Element
  15. }
  16. )
  17. func (table *Table) SetHead(elements ...Element) {
  18. table.Header = elements
  19. }
  20. func (table *Table) AddCell(elements ...Element) {
  21. if table.Body == nil {
  22. table.Body = make([][]Element, 0)
  23. }
  24. table.Body = append(table.Body, elements)
  25. }
  26. func (table *Table) String() string {
  27. br := pool.Get()
  28. defer pool.Put(br)
  29. br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "table-wrapper"}))
  30. if table.Title != nil {
  31. br.WriteString(renderTag(atom.Div.String(), Attrs{"class": "table-title"}, table.Title.Html()))
  32. }
  33. br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "table-wrapper-inner"}))
  34. if table.FixedColumn {
  35. if table.FixedWidth <= 0 {
  36. table.FixedWidth = 100
  37. }
  38. br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "table-fixed", "style": fmt.Sprintf("width:%dpx", table.FixedWidth+1)}))
  39. br.WriteString(beginTag(atom.Table.String(), Attrs{"class": "table"}))
  40. if len(table.Header) > 0 {
  41. br.WriteString(beginTag(atom.Thead.String(), nil))
  42. br.WriteString(beginTag(atom.Tr.String(), nil))
  43. br.WriteString(renderTag(atom.Th.String(), nil, table.Header[0].Html()))
  44. br.WriteString(endTag(atom.Tr.String()))
  45. br.WriteString(endTag(atom.Thead.String()))
  46. }
  47. if len(table.Body) > 0 {
  48. br.WriteString(beginTag(atom.Tbody.String(), nil))
  49. for _, cell := range table.Body {
  50. br.WriteString(beginTag(atom.Tr.String(), nil))
  51. br.WriteString(renderTag(atom.Td.String(), nil, cell[0].Html()))
  52. br.WriteString(endTag(atom.Tr.String()))
  53. }
  54. br.WriteString(endTag(atom.Tbody.String()))
  55. }
  56. br.WriteString(endTag(atom.Table.String()))
  57. br.WriteString(endTag(atom.Div.String()))
  58. br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "table-relative", "style": fmt.Sprintf("padding-left:%dpx", table.FixedWidth)}))
  59. br.WriteString(beginTag(atom.Table.String(), Attrs{"class": "table"}))
  60. if len(table.Header) > 0 {
  61. br.WriteString(beginTag(atom.Thead.String(), nil))
  62. br.WriteString(beginTag(atom.Tr.String(), nil))
  63. for i, text := range table.Header {
  64. if i == 0 {
  65. continue
  66. }
  67. br.WriteString(renderTag(atom.Th.String(), nil, text.Html()))
  68. }
  69. br.WriteString(endTag(atom.Tr.String()))
  70. br.WriteString(endTag(atom.Thead.String()))
  71. }
  72. if len(table.Body) > 0 {
  73. br.WriteString(beginTag(atom.Tbody.String(), nil))
  74. for _, cell := range table.Body {
  75. br.WriteString(beginTag(atom.Tr.String(), nil))
  76. for i, text := range cell {
  77. if i == 0 {
  78. continue
  79. }
  80. br.WriteString(renderTag(atom.Td.String(), nil, text.Html()))
  81. }
  82. br.WriteString(endTag(atom.Tr.String()))
  83. }
  84. br.WriteString(endTag(atom.Tbody.String()))
  85. }
  86. br.WriteString(endTag(atom.Table.String()))
  87. br.WriteString(endTag(atom.Div.String()))
  88. } else {
  89. br.WriteString(beginTag(atom.Table.String(), Attrs{"class": "table"}))
  90. if len(table.Header) > 0 {
  91. br.WriteString(beginTag(atom.Thead.String(), nil))
  92. br.WriteString(beginTag(atom.Tr.String(), nil))
  93. for _, text := range table.Header {
  94. br.WriteString(renderTag(atom.Th.String(), nil, text.Html()))
  95. }
  96. br.WriteString(endTag(atom.Tr.String()))
  97. br.WriteString(endTag(atom.Thead.String()))
  98. }
  99. if len(table.Body) > 0 {
  100. br.WriteString(beginTag(atom.Tbody.String(), nil))
  101. for _, cell := range table.Body {
  102. br.WriteString(beginTag(atom.Tr.String(), nil))
  103. for _, text := range cell {
  104. br.WriteString(renderTag(atom.Td.String(), nil, text.Html()))
  105. }
  106. br.WriteString(endTag(atom.Tr.String()))
  107. }
  108. br.WriteString(endTag(atom.Tbody.String()))
  109. }
  110. br.WriteString(endTag(atom.Table.String()))
  111. }
  112. br.WriteString(endTag(atom.Div.String()))
  113. if table.Outro != nil {
  114. br.WriteString(table.Outro.Html())
  115. }
  116. br.WriteString(endTag(atom.Div.String()))
  117. return br.String()
  118. }
  119. func NewTable(title Element) *Table {
  120. table := &Table{
  121. Title: title,
  122. Header: make([]Element, 0),
  123. Body: make([][]Element, 0),
  124. }
  125. return table
  126. }