pkg/text/text.go (77 lines of code) (raw):
package text
import (
"bytes"
"regexp"
"strings"
"github.com/mattn/go-runewidth"
)
const ExperimentalString = `
This feature is experimental. It might be broken or removed without any prior notice.
Read more about what experimental features mean at
<https://docs.gitlab.com/policy/development_stages_support/>
Use experimental features at your own risk.
`
const ansi = "[\u001B\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))"
var re = regexp.MustCompile(ansi)
var hyperlinkOSCRegexp = regexp.MustCompile("\u001B\\]8;[^;]*;.*?\u001B\\\\")
// Join joins the list of the string with the delim provided.
// Returns an empty string for empty list
func Join(list []string, delim string) string {
if len(list) == 0 {
return ""
}
var buf bytes.Buffer
for i := range len(list) - 1 {
buf.WriteString(list[i] + delim)
}
buf.WriteString(list[len(list)-1])
return buf.String()
}
// Strip strips the string of all colors
func Strip(s string) string {
return re.ReplaceAllString(hyperlinkOSCRegexp.ReplaceAllString(s, ""), "")
}
// StringWidth returns the actual width of the string without colors
func StringWidth(s string) int {
return runewidth.StringWidth(Strip(s))
}
// RuneWidth returns the actual width of the rune
func RuneWidth(s rune) int {
return runewidth.RuneWidth(s)
}
func WrapString(text string, lineWidth int) string {
words := strings.Fields(strings.TrimSpace(text))
if len(words) == 0 {
return text
}
wrapped := words[0]
spaceLeft := lineWidth - len(wrapped)
for _, word := range words[1:] {
if len(word)+1 > spaceLeft {
wrapped += "\n" + word
spaceLeft = lineWidth - len(word)
} else {
wrapped += " " + word
spaceLeft -= 1 + len(word)
}
}
return wrapped
}
// PadRight returns a new string of a specified length in which the end of the current string is padded with spaces or with a specified Unicode character.
func PadRight(str string, length int, pad byte) string {
slen := StringWidth(str)
if slen >= length {
return str
}
buf := bytes.NewBufferString(str)
for range length - slen {
buf.WriteByte(pad)
}
return buf.String()
}
// PadLeft returns a new string of a specified length in which the beginning of the current string is padded with spaces or with a specified Unicode character.
func PadLeft(str string, length int, pad byte) string {
slen := StringWidth(str)
if slen >= length {
return str
}
var buf bytes.Buffer
for range length - slen {
buf.WriteByte(pad)
}
buf.WriteString(str)
return buf.String()
}