@@ -7,19 +7,54 @@ import (
77 "fmt"
88 "html"
99 "html/template"
10+ "time"
1011)
1112
12- // DateTime renders an absolute time HTML given a time as a string
13- func DateTime (format , datetime , fallback string ) template.HTML {
14- datetimeEscaped := html .EscapeString (datetime )
15- fallbackEscaped := html .EscapeString (fallback )
13+ // DateTime renders an absolute time HTML element by datetime.
14+ func DateTime (format string , datetime any ) template.HTML {
15+ if p , ok := datetime .(* time.Time ); ok {
16+ datetime = * p
17+ }
18+ if p , ok := datetime .(* TimeStamp ); ok {
19+ datetime = * p
20+ }
21+ switch v := datetime .(type ) {
22+ case TimeStamp :
23+ datetime = v .AsTime ()
24+ case int :
25+ datetime = TimeStamp (v ).AsTime ()
26+ case int64 :
27+ datetime = TimeStamp (v ).AsTime ()
28+ }
29+
30+ var datetimeEscaped , textEscaped string
31+ switch v := datetime .(type ) {
32+ case nil :
33+ return "N/A"
34+ case string :
35+ datetimeEscaped = html .EscapeString (v )
36+ textEscaped = datetimeEscaped
37+ case time.Time :
38+ if v .IsZero () || v .Unix () == 0 {
39+ return "N/A"
40+ }
41+ datetimeEscaped = html .EscapeString (v .Format (time .RFC3339 ))
42+ if format == "full" {
43+ textEscaped = html .EscapeString (v .Format ("2006-01-02 15:04:05 -07:00" ))
44+ } else {
45+ textEscaped = html .EscapeString (v .Format ("2006-01-02" ))
46+ }
47+ default :
48+ panic (fmt .Sprintf ("Unsupported time type %T" , datetime ))
49+ }
50+
1651 switch format {
1752 case "short" :
18- return template .HTML (fmt .Sprintf (`<relative-time format="datetime" year="numeric" month="short" day="numeric" weekday="" datetime="%s">%s</relative-time>` , datetimeEscaped , fallbackEscaped ))
53+ return template .HTML (fmt .Sprintf (`<relative-time format="datetime" year="numeric" month="short" day="numeric" weekday="" datetime="%s">%s</relative-time>` , datetimeEscaped , textEscaped ))
1954 case "long" :
20- return template .HTML (fmt .Sprintf (`<relative-time format="datetime" year="numeric" month="long" day="numeric" weekday="" datetime="%s">%s</relative-time>` , datetimeEscaped , fallbackEscaped ))
55+ return template .HTML (fmt .Sprintf (`<relative-time format="datetime" year="numeric" month="long" day="numeric" weekday="" datetime="%s">%s</relative-time>` , datetimeEscaped , textEscaped ))
2156 case "full" :
22- return template .HTML (fmt .Sprintf (`<relative-time format="datetime" weekday="" year="numeric" month="short" day="numeric" hour="numeric" minute="numeric" second="numeric" datetime="%s">%s</relative-time>` , datetimeEscaped , fallbackEscaped ))
57+ return template .HTML (fmt .Sprintf (`<relative-time format="datetime" weekday="" year="numeric" month="short" day="numeric" hour="numeric" minute="numeric" second="numeric" datetime="%s">%s</relative-time>` , datetimeEscaped , textEscaped ))
2358 }
24- return template . HTML ( "error in DateTime" )
59+ panic ( fmt . Sprintf ( "Unsupported format %s" , format ) )
2560}
0 commit comments