fix truncate utf8 string (#15828) (#15854)

Backport #15828

* fix truncate utf8 string.

* revoke truncated user info.

Co-authored-by: yan <sxty32@gmail.com>
This commit is contained in:
zeripath 2021-05-13 15:10:29 +01:00 committed by GitHub
parent 62daf84596
commit 387a1bc472
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 13 additions and 4 deletions

View file

@ -21,6 +21,7 @@ import (
"strings" "strings"
"time" "time"
"unicode" "unicode"
"unicode/utf8"
"code.gitea.io/gitea/modules/git" "code.gitea.io/gitea/modules/git"
"code.gitea.io/gitea/modules/log" "code.gitea.io/gitea/modules/log"
@ -213,19 +214,19 @@ func EllipsisString(str string, length int) string {
if length <= 3 { if length <= 3 {
return "..." return "..."
} }
if len(str) <= length { if utf8.RuneCountInString(str) <= length {
return str return str
} }
return str[:length-3] + "..." return string([]rune(str)[:length-3]) + "..."
} }
// TruncateString returns a truncated string with given limit, // TruncateString returns a truncated string with given limit,
// it returns input string if length is not reached limit. // it returns input string if length is not reached limit.
func TruncateString(str string, limit int) string { func TruncateString(str string, limit int) string {
if len(str) < limit { if utf8.RuneCountInString(str) < limit {
return str return str
} }
return str[:limit] return string([]rune(str)[:limit])
} }
// StringsToInt64s converts a slice of string to a slice of int64. // StringsToInt64s converts a slice of string to a slice of int64.

View file

@ -170,6 +170,10 @@ func TestEllipsisString(t *testing.T) {
assert.Equal(t, "fo...", EllipsisString("foobar", 5)) assert.Equal(t, "fo...", EllipsisString("foobar", 5))
assert.Equal(t, "foobar", EllipsisString("foobar", 6)) assert.Equal(t, "foobar", EllipsisString("foobar", 6))
assert.Equal(t, "foobar", EllipsisString("foobar", 10)) assert.Equal(t, "foobar", EllipsisString("foobar", 10))
assert.Equal(t, "测...", EllipsisString("测试文本一二三四", 4))
assert.Equal(t, "测试...", EllipsisString("测试文本一二三四", 5))
assert.Equal(t, "测试文...", EllipsisString("测试文本一二三四", 6))
assert.Equal(t, "测试文本一二三四", EllipsisString("测试文本一二三四", 10))
} }
func TestTruncateString(t *testing.T) { func TestTruncateString(t *testing.T) {
@ -181,6 +185,10 @@ func TestTruncateString(t *testing.T) {
assert.Equal(t, "fooba", TruncateString("foobar", 5)) assert.Equal(t, "fooba", TruncateString("foobar", 5))
assert.Equal(t, "foobar", TruncateString("foobar", 6)) assert.Equal(t, "foobar", TruncateString("foobar", 6))
assert.Equal(t, "foobar", TruncateString("foobar", 7)) assert.Equal(t, "foobar", TruncateString("foobar", 7))
assert.Equal(t, "测试文本", TruncateString("测试文本一二三四", 4))
assert.Equal(t, "测试文本一", TruncateString("测试文本一二三四", 5))
assert.Equal(t, "测试文本一二", TruncateString("测试文本一二三四", 6))
assert.Equal(t, "测试文本一二三", TruncateString("测试文本一二三四", 7))
} }
func TestStringsToInt64s(t *testing.T) { func TestStringsToInt64s(t *testing.T) {