1
0
textfmt/text.go
2025-10-23 02:55:38 +02:00

100 lines
1.3 KiB
Go

package textfmt
import (
"strings"
"unicode"
"fmt"
"bytes"
)
func timesn(s string, n int) string {
if n < 0 {
return ""
}
ss := make([]string, n+1)
return strings.Join(ss, s)
}
// non-negative numbers only
func numDigits(n int) int {
if n == 0 {
return 1
}
var d int
for n > 0 {
d++
n /= 10
}
return d
}
func maxLength(names []string) int {
var m int
for _, n := range names {
if len([]rune(n)) > m {
m = len([]rune(n))
}
}
return m
}
func padRight(s string, n int) string {
if len([]rune(s)) >= n {
return s
}
n -= len([]rune(s))
return s + timesn("\u00a0", n)
}
func trim(s string) string {
return strings.TrimFunc(
s,
func(r rune) bool { return r != '\u00a0' && unicode.IsSpace(r) },
)
}
func singleLine(text string) string {
var l []string
p := strings.Split(text, "\n")
for _, part := range p {
part = trim(part)
if part == "" {
continue
}
l = append(l, part)
}
return strings.Join(l, " ")
}
func textToString(t Txt) string {
if len(t.cat) == 0 && t.link == "" {
return trim(t.text)
}
if len(t.cat) == 0 && t.text == "" {
return trim(t.link)
}
if len(t.cat) == 0 {
return fmt.Sprintf("%s (%s)", t.text, t.link)
}
b := bytes.NewBuffer(nil)
for i := range t.cat {
if i > 0 {
b.WriteRune(' ')
}
b.WriteString(textToString(t.cat[i]))
}
return singleLine(b.String())
}