2021-07-25 05:59:27 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-07-25 05:59:27 +03:00
package util
2023-06-05 10:00:12 +03:00
import (
"strings"
"unicode/utf8"
)
2021-07-25 05:59:27 +03:00
2021-12-09 08:41:17 +03:00
// in UTF8 "…" is 3 bytes so doesn't really gain us anything...
2022-01-20 20:46:10 +03:00
const (
utf8Ellipsis = "…"
asciiEllipsis = "..."
)
2021-12-09 08:41:17 +03:00
2021-07-25 05:59:27 +03:00
// 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 {
2021-12-09 08:41:17 +03:00
return input , ""
2021-07-25 05:59:27 +03:00
}
if ! utf8 . ValidString ( input ) {
2021-12-09 08:41:17 +03:00
if n - 3 < 0 {
return input , ""
}
return input [ : n - 3 ] + asciiEllipsis , asciiEllipsis + input [ n - 3 : ]
2021-07-25 05:59:27 +03:00
}
end := 0
for end <= n - 3 {
_ , size := utf8 . DecodeRuneInString ( input [ end : ] )
if end + size > n - 3 {
break
}
end += size
}
2021-12-09 08:41:17 +03:00
return input [ : end ] + utf8Ellipsis , utf8Ellipsis + input [ end : ]
}
2023-06-05 10:00:12 +03:00
// SplitTrimSpace splits the string at given separator and trims leading and trailing space
func SplitTrimSpace ( input , sep string ) [ ] string {
// replace CRLF with LF
input = strings . ReplaceAll ( input , "\r\n" , "\n" )
var stringList [ ] string
for _ , s := range strings . Split ( input , sep ) {
// trim leading and trailing space
stringList = append ( stringList , strings . TrimSpace ( s ) )
}
return stringList
}