diff options
Diffstat (limited to 'modules/util')
-rw-r--r-- | modules/util/truncate.go | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/modules/util/truncate.go b/modules/util/truncate.go new file mode 100644 index 0000000000..8d0f630973 --- /dev/null +++ b/modules/util/truncate.go @@ -0,0 +1,35 @@ +// Copyright 2021 The Gitea Authors. All rights reserved. +// Use of this source code is governed by a MIT-style +// license that can be found in the LICENSE file. + +package util + +import "unicode/utf8" + +// SplitStringAtByteN splits a string at byte n accounting for rune boundaries. (Combining characters are not accounted for.) +func SplitStringAtByteN(input string, n int) (left, right string) { + if len(input) <= n { + left = input + return + } + + if !utf8.ValidString(input) { + left = input[:n-3] + "..." + right = "..." + input[n-3:] + return + } + + // in UTF8 "…" is 3 bytes so doesn't really gain us anything... + end := 0 + for end <= n-3 { + _, size := utf8.DecodeRuneInString(input[end:]) + if end+size > n-3 { + break + } + end += size + } + + left = input[:end] + "…" + right = "…" + input[end:] + return +} |