timeline.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. package element
  2. import (
  3. "git.nspix.com/golang/pgenr/internal/pool"
  4. "golang.org/x/net/html/atom"
  5. "time"
  6. )
  7. type (
  8. TimelineItem struct {
  9. Datetime time.Time
  10. Content Element
  11. }
  12. Timeline struct {
  13. Layout string
  14. Items []TimelineItem
  15. }
  16. )
  17. func (element *Timeline) AddItem(tm time.Time, content Element) *Timeline {
  18. if element.Items == nil {
  19. element.Items = make([]TimelineItem, 0)
  20. }
  21. element.Items = append(element.Items, TimelineItem{
  22. Datetime: tm,
  23. Content: content,
  24. })
  25. return element
  26. }
  27. func (element *Timeline) Html() string {
  28. return element.String()
  29. }
  30. func (element *Timeline) String() string {
  31. br := pool.Get()
  32. defer pool.Put(br)
  33. br.WriteString(beginTag(atom.Ul.String(), Attrs{"class": "timeline"}))
  34. for _, item := range element.Items {
  35. br.WriteString(beginTag(atom.Li.String(), Attrs{"class": "timeline-item"}))
  36. br.WriteString(renderTag(atom.Div.String(), Attrs{"class": "timeline-item-tail"}, ""))
  37. br.WriteString(renderTag(atom.Div.String(), Attrs{"class": "timeline-item-node"}, ""))
  38. br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "timeline-item-wrapper"}))
  39. br.WriteString(renderTag(atom.Div.String(), Attrs{"class": "timeline-item-timestamp"}, item.Datetime.Format(element.Layout)))
  40. br.WriteString(renderTag(atom.Div.String(), Attrs{"class": "timeline-item-content"}, item.Content.Html()))
  41. br.WriteString(endTag(atom.Div.String()))
  42. br.WriteString(endTag(atom.Li.String()))
  43. }
  44. br.WriteString(endTag(atom.Ul.String()))
  45. return br.String()
  46. }
  47. func NewTimeline() *Timeline {
  48. return &Timeline{Layout: "2006-01-02", Items: make([]TimelineItem, 0)}
  49. }