mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-19 12:52:11 +03:00
fddde93759
Follow https://github.com/go-gitea/gitea/pull/32383 This PR cleans up the "Deadline" usages in templates, make them call `ParseLegacy` first to get a `Time` struct then display by `DateUtils`. Now it should be pretty clear how "deadline string" works, it makes it possible to do further refactoring and correcting. (cherry picked from commit 259811617ba15c77ddd89360178a59251d611af2)
60 lines
1.8 KiB
Go
60 lines
1.8 KiB
Go
// Copyright 2023 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package timeutil
|
|
|
|
import (
|
|
"fmt"
|
|
"html"
|
|
"html/template"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// DateTime renders an absolute time HTML element by datetime.
|
|
func DateTime(format string, datetime any) template.HTML {
|
|
if p, ok := datetime.(*time.Time); ok {
|
|
datetime = *p
|
|
}
|
|
if p, ok := datetime.(*TimeStamp); ok {
|
|
datetime = *p
|
|
}
|
|
switch v := datetime.(type) {
|
|
case TimeStamp:
|
|
datetime = v.AsTime()
|
|
case int:
|
|
datetime = TimeStamp(v).AsTime()
|
|
case int64:
|
|
datetime = TimeStamp(v).AsTime()
|
|
}
|
|
|
|
var datetimeEscaped, textEscaped string
|
|
switch v := datetime.(type) {
|
|
case nil:
|
|
return "-"
|
|
case time.Time:
|
|
if v.IsZero() || v.Unix() == 0 {
|
|
return "-"
|
|
}
|
|
datetimeEscaped = html.EscapeString(v.Format(time.RFC3339))
|
|
if format == "full" {
|
|
textEscaped = html.EscapeString(v.Format("2006-01-02 15:04:05 -07:00"))
|
|
} else {
|
|
textEscaped = html.EscapeString(v.Format("2006-01-02"))
|
|
}
|
|
default:
|
|
panic(fmt.Sprintf("Unsupported time type %T", datetime))
|
|
}
|
|
|
|
attrs := []string{`weekday=""`, `year="numeric"`}
|
|
switch format {
|
|
case "short", "long": // date only
|
|
attrs = append(attrs, `month="`+format+`"`, `day="numeric"`)
|
|
return template.HTML(fmt.Sprintf(`<absolute-date %s date="%s">%s</absolute-date>`, strings.Join(attrs, " "), datetimeEscaped, textEscaped))
|
|
case "full": // full date including time
|
|
attrs = append(attrs, `format="datetime"`, `month="short"`, `day="numeric"`, `hour="numeric"`, `minute="numeric"`, `second="numeric"`, `data-tooltip-content`, `data-tooltip-interactive="true"`)
|
|
return template.HTML(fmt.Sprintf(`<relative-time %s datetime="%s">%s</relative-time>`, strings.Join(attrs, " "), datetimeEscaped, textEscaped))
|
|
default:
|
|
panic(fmt.Sprintf("Unsupported format %s", format))
|
|
}
|
|
}
|