package element import ( "git.nspix.com/golang/pgenr/internal/pool" "golang.org/x/net/html/atom" "time" ) type ( TimelineItem struct { Datetime time.Time Content Element } Timeline struct { Layout string Items []TimelineItem } ) func (element *Timeline) AddItem(tm time.Time, content Element) *Timeline { if element.Items == nil { element.Items = make([]TimelineItem, 0) } element.Items = append(element.Items, TimelineItem{ Datetime: tm, Content: content, }) return element } func (element *Timeline) Html() string { return element.String() } func (element *Timeline) String() string { br := pool.Get() defer pool.Put(br) br.WriteString(beginTag(atom.Ul.String(), Attrs{"class": "timeline"})) for _, item := range element.Items { br.WriteString(beginTag(atom.Li.String(), Attrs{"class": "timeline-item"})) br.WriteString(renderTag(atom.Div.String(), Attrs{"class": "timeline-item-tail"}, "")) br.WriteString(renderTag(atom.Div.String(), Attrs{"class": "timeline-item-node"}, "")) br.WriteString(beginTag(atom.Div.String(), Attrs{"class": "timeline-item-wrapper"})) br.WriteString(renderTag(atom.Div.String(), Attrs{"class": "timeline-item-timestamp"}, item.Datetime.Format("2006-01-02"))) br.WriteString(renderTag(atom.Div.String(), Attrs{"class": "timeline-item-content"}, item.Content.Html())) br.WriteString(endTag(atom.Div.String())) br.WriteString(endTag(atom.Li.String())) } br.WriteString(endTag(atom.Ul.String())) return br.String() } func NewTimeline() *Timeline { return &Timeline{Layout: "2006-01-02", Items: make([]TimelineItem, 0)} }