diff options
Diffstat (limited to 'pkg/gui/presentation/authors/authors.go')
-rw-r--r-- | pkg/gui/presentation/authors/authors.go | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/pkg/gui/presentation/authors/authors.go b/pkg/gui/presentation/authors/authors.go new file mode 100644 index 000000000..8040a8d4b --- /dev/null +++ b/pkg/gui/presentation/authors/authors.go @@ -0,0 +1,103 @@ +package authors + +import ( + "crypto/md5" + "strings" + + "github.com/gookit/color" + "github.com/jesseduffield/lazygit/pkg/gui/style" + "github.com/jesseduffield/lazygit/pkg/utils" + "github.com/lucasb-eyer/go-colorful" + "github.com/mattn/go-runewidth" +) + +var authorInitialCache = make(map[string]string) +var authorNameCache = make(map[string]string) +var authorStyleCache = make(map[string]style.TextStyle) + +func ShortAuthor(authorName string) string { + if value, ok := authorInitialCache[authorName]; ok { + return value + } + + initials := getInitials(authorName) + if initials == "" { + return "" + } + + value := AuthorStyle(authorName).Sprint(initials) + authorInitialCache[authorName] = value + + return value +} + +func LongAuthor(authorName string) string { + if value, ok := authorNameCache[authorName]; ok { + return value + } + + paddedAuthorName := utils.WithPadding(authorName, 17) + truncatedName := utils.TruncateWithEllipsis(paddedAuthorName, 17) + value := AuthorStyle(authorName).Sprint(truncatedName) + authorNameCache[authorName] = value + + return value +} + +func AuthorStyle(authorName string) style.TextStyle { + if value, ok := authorStyleCache[authorName]; ok { + return value + } + + value := trueColorStyle(authorName) + + authorStyleCache[authorName] = value + + return value +} + +func trueColorStyle(str string) style.TextStyle { + hash := md5.Sum([]byte(str)) + c := colorful.Hsl(randFloat(hash[0:4])*360.0, 0.6+0.4*randFloat(hash[4:8]), 0.4+randFloat(hash[8:12])*0.2) + + return style.New().SetFg(style.NewRGBColor(color.RGB(uint8(c.R*255), uint8(c.G*255), uint8(c.B*255)))) +} + +func randFloat(hash []byte) float64 { + return float64(randInt(hash, 100)) / 100 +} + +func randInt(hash []byte, max int) int { + sum := 0 + for _, b := range hash { + sum = (sum + int(b)) % max + } + return sum +} + +func getInitials(authorName string) string { + if authorName == "" { + return authorName + } + + firstRune := getFirstRune(authorName) + if runewidth.RuneWidth(firstRune) > 1 { + return string(firstRune) + } + + split := strings.Split(authorName, " ") + if len(split) == 1 { + return utils.LimitStr(authorName, 2) + } + + return utils.LimitStr(split[0], 1) + utils.LimitStr(split[1], 1) +} + +func getFirstRune(str string) rune { + // just using the loop for the sake of getting the first rune + for _, r := range str { + return r + } + // should never land here + return 0 +} |