diff options
author | silverwind <me@silverwind.io> | 2020-12-03 19:46:11 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-03 19:46:11 +0100 |
commit | 9269a038a4e904bdeaf5470e76e3a4f8a2a4685b (patch) | |
tree | 59730c0dbe7b011a8cb751d135e44152e7feeec0 /modules/templates | |
parent | 0d35ef5b439623774d1adddf7071d744b1116809 (diff) | |
download | gitea-9269a038a4e904bdeaf5470e76e3a4f8a2a4685b.tar.gz gitea-9269a038a4e904bdeaf5470e76e3a4f8a2a4685b.zip |
Direct avatar rendering (#13649)
* Direct avatar rendering
This adds new template helpers for avatar rendering which output image
elements with direct links to avatars which makes them cacheable by the
browsers.
This should be a major performance improvment for pages with many avatars.
* fix avatars of other user's profile pages
* fix top border on user avatar name
* uncircle avatars
* remove old incomplete avatar selector
* use title attribute for name and add it back on blame
* minor refactor
* tweak comments
* fix url path join and adjust test to new result
* dedupe functions
Diffstat (limited to 'modules/templates')
-rw-r--r-- | modules/templates/helper.go | 67 |
1 files changed, 60 insertions, 7 deletions
diff --git a/modules/templates/helper.go b/modules/templates/helper.go index 8b96397529..5af1addb60 100644 --- a/modules/templates/helper.go +++ b/modules/templates/helper.go @@ -88,7 +88,6 @@ func NewFuncMap() []template.FuncMap { "AllowedReactions": func() []string { return setting.UI.Reactions }, - "AvatarLink": models.AvatarLink, "Safe": Safe, "SafeJS": SafeJS, "Str2html": Str2html, @@ -339,7 +338,9 @@ func NewFuncMap() []template.FuncMap { } return false }, - "svg": SVG, + "svg": SVG, + "avatar": Avatar, + "avatarByEmail": AvatarByEmail, "SortArrow": func(normSort, revSort, urlSort string, isDefault bool) template.HTML { // if needed if len(normSort) == 0 || len(urlSort) == 0 { @@ -499,18 +500,38 @@ func NewTextFuncMap() []texttmpl.FuncMap { var widthRe = regexp.MustCompile(`width="[0-9]+?"`) var heightRe = regexp.MustCompile(`height="[0-9]+?"`) -// SVG render icons - arguments icon name (string), size (int), class (string) -func SVG(icon string, others ...interface{}) template.HTML { - size := 16 +func parseOthers(defaultSize int, defaultClass string, others ...interface{}) (int, string) { + size := defaultSize if len(others) > 0 && others[0].(int) != 0 { size = others[0].(int) } - class := "" + class := defaultClass if len(others) > 1 && others[1].(string) != "" { - class = others[1].(string) + if defaultClass == "" { + class = others[1].(string) + } else { + class = defaultClass + " " + others[1].(string) + } + } + + return size, class +} + +func avatarHTML(src string, size int, class string, name string) template.HTML { + sizeStr := fmt.Sprintf(`%d`, size) + + if name == "" { + name = "avatar" } + return template.HTML(`<img class="` + class + `" src="` + src + `" title="` + html.EscapeString(name) + `" width="` + sizeStr + `" height="` + sizeStr + `"/>`) +} + +// SVG render icons - arguments icon name (string), size (int), class (string) +func SVG(icon string, others ...interface{}) template.HTML { + size, class := parseOthers(16, "", others...) + if svgStr, ok := svg.SVGs[icon]; ok { if size != 16 { svgStr = widthRe.ReplaceAllString(svgStr, fmt.Sprintf(`width="%d"`, size)) @@ -524,6 +545,38 @@ func SVG(icon string, others ...interface{}) template.HTML { return template.HTML("") } +// Avatar renders user and repo avatars. args: user/repo, size (int), class (string) +func Avatar(item interface{}, others ...interface{}) template.HTML { + size, class := parseOthers(28, "ui avatar image", others...) + if user, ok := item.(*models.User); ok { + src := user.RealSizedAvatarLink(size * 2) // request double size for finer rendering + if src != "" { + return avatarHTML(src, size, class, user.DisplayName()) + } + } + + if repo, ok := item.(*models.Repository); ok { + src := repo.RelAvatarLink() + if src != "" { + return avatarHTML(src, size, class, repo.FullName()) + } + } + + return template.HTML("") +} + +// AvatarByEmail renders avatars by email address. args: email, name, size (int), class (string) +func AvatarByEmail(email string, name string, others ...interface{}) template.HTML { + size, class := parseOthers(28, "ui avatar image", others...) + src := models.SizedAvatarLink(email, size*2) // request double size for finer rendering + + if src != "" { + return avatarHTML(src, size, class, name) + } + + return template.HTML("") +} + // Safe render raw as HTML func Safe(raw string) template.HTML { return template.HTML(raw) |