summaryrefslogtreecommitdiffstats
path: root/modules/util
diff options
context:
space:
mode:
Diffstat (limited to 'modules/util')
-rw-r--r--modules/util/truncate.go35
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
+}