summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2021-10-30 17:42:43 +1100
committerJesse Duffield <jessedduffield@gmail.com>2021-10-30 18:26:06 +1100
commit7561703e8d9cadd3cae72ab5d9f1d23b5df362bc (patch)
tree3391cb232d52ad8b440b146f07a2651fa4fc9d1d
parentb04b45724671a1f13f1faf277007c76df6ca9fed (diff)
move author name colouring code into its own file
-rw-r--r--pkg/gui/presentation/authors/authors.go103
-rw-r--r--pkg/gui/presentation/authors/authors_test.go (renamed from pkg/gui/presentation/commits_test.go)2
-rw-r--r--pkg/gui/presentation/commits.go82
3 files changed, 107 insertions, 80 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
+}
diff --git a/pkg/gui/presentation/commits_test.go b/pkg/gui/presentation/authors/authors_test.go
index 578091166..58efba297 100644
--- a/pkg/gui/presentation/commits_test.go
+++ b/pkg/gui/presentation/authors/authors_test.go
@@ -1,4 +1,4 @@
-package presentation
+package authors
import "testing"
diff --git a/pkg/gui/presentation/commits.go b/pkg/gui/presentation/commits.go
index 0018d45df..2474a283e 100644
--- a/pkg/gui/presentation/commits.go
+++ b/pkg/gui/presentation/commits.go
@@ -1,17 +1,14 @@
package presentation
import (
- "crypto/md5"
"strings"
- "github.com/gookit/color"
"github.com/jesseduffield/lazygit/pkg/commands/models"
+ "github.com/jesseduffield/lazygit/pkg/gui/presentation/authors"
"github.com/jesseduffield/lazygit/pkg/gui/style"
"github.com/jesseduffield/lazygit/pkg/theme"
"github.com/jesseduffield/lazygit/pkg/utils"
"github.com/kyokomi/emoji/v2"
- colorful "github.com/lucasb-eyer/go-colorful"
- "github.com/mattn/go-runewidth"
)
func GetCommitListDisplayStrings(commits []*models.Commit, fullDescription bool, cherryPickedCommitShaMap map[string]bool, diffName string, parseEmoji bool) [][]string {
@@ -72,7 +69,7 @@ func getFullDescriptionDisplayStringsForCommit(c *models.Commit, cherryPickedCom
return []string{
shaColor.Sprint(c.ShortSha()),
secondColumnString,
- longAuthor(c.Author),
+ authors.LongAuthor(c.Author),
tagString + theme.DefaultTextColor.Sprint(name),
}
}
@@ -116,84 +113,11 @@ func getDisplayStringsForCommit(c *models.Commit, cherryPickedCommitShaMap map[s
return []string{
shaColor.Sprint(c.ShortSha()),
- shortAuthor(c.Author),
+ authors.ShortAuthor(c.Author),
actionString + tagString + theme.DefaultTextColor.Sprint(name),
}
}
-var authorInitialCache = make(map[string]string)
-var authorNameCache = make(map[string]string)
-
-func shortAuthor(authorName string) string {
- if value, ok := authorInitialCache[authorName]; ok {
- return value
- }
-
- initials := getInitials(authorName)
- if initials == "" {
- return ""
- }
-
- value := authorColor(authorName).Sprint(initials)
- authorInitialCache[authorName] = value
-
- return value
-}
-
-func longAuthor(authorName string) string {
- if value, ok := authorNameCache[authorName]; ok {
- return value
- }
-
- truncatedName := utils.TruncateWithEllipsis(authorName, 17)
- value := authorColor(authorName).Sprint(truncatedName)
- authorNameCache[authorName] = value
-
- return value
-}
-
-func authorColor(authorName string) style.TextStyle {
- hash := md5.Sum([]byte(authorName))
- 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 {
- sum := 0
- for _, b := range hash {
- sum = (sum + int(b)) % 100
- }
- return float64(sum) / 100
-}
-
-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
-}
-
func actionColorMap(str string) style.TextStyle {
switch str {
case "pick":