Merge pull request #18823 from minamijoyo/fix-multibyte-trucate

command/hook_ui: Truncate the ID considering multibyte characters
This commit is contained in:
Pam Selle 2019-08-06 14:24:24 -04:00 committed by GitHub
commit ce8e7811ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 53 additions and 5 deletions

View File

@ -373,7 +373,10 @@ func dropCR(data []byte) []byte {
} }
func truncateId(id string, maxLen int) string { func truncateId(id string, maxLen int) string {
totalLength := len(id) // Note that the id may contain multibyte characters.
// We need to truncate it to maxLen characters, not maxLen bytes.
rid := []rune(id)
totalLength := len(rid)
if totalLength <= maxLen { if totalLength <= maxLen {
return id return id
} }
@ -383,11 +386,11 @@ func truncateId(id string, maxLen int) string {
maxLen = 5 maxLen = 5
} }
dots := "..." dots := []rune("...")
partLen := maxLen / 2 partLen := maxLen / 2
leftIdx := partLen - 1 leftIdx := partLen - 1
leftPart := id[0:leftIdx] leftPart := rid[0:leftIdx]
rightIdx := totalLength - partLen - 1 rightIdx := totalLength - partLen - 1
@ -396,7 +399,7 @@ func truncateId(id string, maxLen int) string {
rightIdx -= overlap rightIdx -= overlap
} }
rightPart := id[rightIdx:] rightPart := rid[rightIdx:]
return leftPart + dots + rightPart return string(leftPart) + string(dots) + string(rightPart)
} }

View File

@ -252,6 +252,51 @@ func TestTruncateId(t *testing.T) {
Expected: "Hello world", Expected: "Hello world",
MaxLen: 12, MaxLen: 12,
}, },
{
Input: "あいうえおかきくけこさ",
Expected: "あ...さ",
MaxLen: 3,
},
{
Input: "あいうえおかきくけこさ",
Expected: "あ...さ",
MaxLen: 5,
},
{
Input: "あいうえおかきくけこさ",
Expected: "あい...さ",
MaxLen: 6,
},
{
Input: "あいうえおかきくけこさ",
Expected: "あい...こさ",
MaxLen: 7,
},
{
Input: "あいうえおかきくけこさ",
Expected: "あいう...こさ",
MaxLen: 8,
},
{
Input: "あいうえおかきくけこさ",
Expected: "あいう...けこさ",
MaxLen: 9,
},
{
Input: "あいうえおかきくけこさ",
Expected: "あいうえ...けこさ",
MaxLen: 10,
},
{
Input: "あいうえおかきくけこさ",
Expected: "あいうえおかきくけこさ",
MaxLen: 11,
},
{
Input: "あいうえおかきくけこさ",
Expected: "あいうえおかきくけこさ",
MaxLen: 12,
},
} }
for i, tc := range testCases { for i, tc := range testCases {
testName := fmt.Sprintf("%d", i) testName := fmt.Sprintf("%d", i)