summaryrefslogtreecommitdiffstats
path: root/modules/templates
diff options
context:
space:
mode:
authorsilverwind <me@silverwind.io>2020-12-03 19:46:11 +0100
committerGitHub <noreply@github.com>2020-12-03 19:46:11 +0100
commit9269a038a4e904bdeaf5470e76e3a4f8a2a4685b (patch)
tree59730c0dbe7b011a8cb751d135e44152e7feeec0 /modules/templates
parent0d35ef5b439623774d1adddf7071d744b1116809 (diff)
downloadgitea-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.go67
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)