123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- package element
- import (
- "fmt"
- "git.nspix.com/golang/pgenr/internal/pool"
- "golang.org/x/net/html/atom"
- )
- type (
- Table struct {
- Title Element
- FixedColumn bool
- FixedWidth int
- Header []Element
- Body [][]Element
- Outro Element
- }
- )
- func (table *Table) SetHead(elements ...Element) {
- table.Header = elements
- }
- func (table *Table) AddCell(elements ...Element) {
- if table.Body == nil {
- table.Body = make([][]Element, 0)
- }
- table.Body = append(table.Body, elements)
- }
- func (table *Table) String() string {
- br := pool.Get()
- defer pool.Put(br)
- br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "table-wrapper"}))
- if table.Title != nil {
- br.WriteString(renderTag(atom.Div.String(), Attrs{"class": "table-title"}, table.Title.Html()))
- }
- br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "table-wrapper-inner"}))
- if table.FixedColumn {
- if table.FixedWidth <= 0 {
- table.FixedWidth = 100
- }
- br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "table-fixed", "style": fmt.Sprintf("width:%dpx", table.FixedWidth+1)}))
- br.WriteString(beginTag(atom.Table.String(), Attrs{"class": "table"}))
- if len(table.Header) > 0 {
- br.WriteString(beginTag(atom.Thead.String(), nil))
- br.WriteString(beginTag(atom.Tr.String(), nil))
- br.WriteString(renderTag(atom.Th.String(), nil, table.Header[0].Html()))
- br.WriteString(endTag(atom.Tr.String()))
- br.WriteString(endTag(atom.Thead.String()))
- }
- if len(table.Body) > 0 {
- br.WriteString(beginTag(atom.Tbody.String(), nil))
- for _, cell := range table.Body {
- br.WriteString(beginTag(atom.Tr.String(), nil))
- br.WriteString(renderTag(atom.Td.String(), nil, cell[0].Html()))
- br.WriteString(endTag(atom.Tr.String()))
- }
- br.WriteString(endTag(atom.Tbody.String()))
- }
- br.WriteString(endTag(atom.Table.String()))
- br.WriteString(endTag(atom.Div.String()))
- br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "table-relative", "style": fmt.Sprintf("padding-left:%dpx", table.FixedWidth)}))
- br.WriteString(beginTag(atom.Table.String(), Attrs{"class": "table"}))
- if len(table.Header) > 0 {
- br.WriteString(beginTag(atom.Thead.String(), nil))
- br.WriteString(beginTag(atom.Tr.String(), nil))
- for i, text := range table.Header {
- if i == 0 {
- continue
- }
- br.WriteString(renderTag(atom.Th.String(), nil, text.Html()))
- }
- br.WriteString(endTag(atom.Tr.String()))
- br.WriteString(endTag(atom.Thead.String()))
- }
- if len(table.Body) > 0 {
- br.WriteString(beginTag(atom.Tbody.String(), nil))
- for _, cell := range table.Body {
- br.WriteString(beginTag(atom.Tr.String(), nil))
- for i, text := range cell {
- if i == 0 {
- continue
- }
- br.WriteString(renderTag(atom.Td.String(), nil, text.Html()))
- }
- br.WriteString(endTag(atom.Tr.String()))
- }
- br.WriteString(endTag(atom.Tbody.String()))
- }
- br.WriteString(endTag(atom.Table.String()))
- br.WriteString(endTag(atom.Div.String()))
- } else {
- br.WriteString(beginTag(atom.Table.String(), Attrs{"class": "table"}))
- if len(table.Header) > 0 {
- br.WriteString(beginTag(atom.Thead.String(), nil))
- br.WriteString(beginTag(atom.Tr.String(), nil))
- for _, text := range table.Header {
- br.WriteString(renderTag(atom.Th.String(), nil, text.Html()))
- }
- br.WriteString(endTag(atom.Tr.String()))
- br.WriteString(endTag(atom.Thead.String()))
- }
- if len(table.Body) > 0 {
- br.WriteString(beginTag(atom.Tbody.String(), nil))
- for _, cell := range table.Body {
- br.WriteString(beginTag(atom.Tr.String(), nil))
- for _, text := range cell {
- br.WriteString(renderTag(atom.Td.String(), nil, text.Html()))
- }
- br.WriteString(endTag(atom.Tr.String()))
- }
- br.WriteString(endTag(atom.Tbody.String()))
- }
- br.WriteString(endTag(atom.Table.String()))
- }
- br.WriteString(endTag(atom.Div.String()))
- if table.Outro != nil {
- br.WriteString(table.Outro.Html())
- }
- br.WriteString(endTag(atom.Div.String()))
- return br.String()
- }
- func NewTable(title Element) *Table {
- table := &Table{
- Title: title,
- Header: make([]Element, 0),
- Body: make([][]Element, 0),
- }
- return table
- }
|