1
0
textfmt/text.go

100 lines
1.3 KiB
Go
Raw Normal View History

2025-09-11 21:16:09 +02:00
package textfmt
2025-10-14 20:46:32 +02:00
import (
"strings"
"unicode"
2025-10-23 02:55:38 +02:00
"fmt"
"bytes"
2025-10-14 20:46:32 +02:00
)
2025-09-11 21:16:09 +02:00
func timesn(s string, n int) string {
2025-10-14 20:46:32 +02:00
if n < 0 {
return ""
}
2025-09-11 21:16:09 +02:00
ss := make([]string, n+1)
return strings.Join(ss, s)
}
2025-10-14 20:46:32 +02:00
// non-negative numbers only
2025-10-10 15:47:36 +02:00
func numDigits(n int) int {
2025-09-11 21:16:09 +02:00
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 {
2025-10-14 20:46:32 +02:00
if len([]rune(s)) >= n {
2025-10-10 15:47:36 +02:00
return s
}
2025-09-11 21:16:09 +02:00
n -= len([]rune(s))
2025-10-14 20:46:32 +02:00
return s + timesn("\u00a0", n)
}
func trim(s string) string {
return strings.TrimFunc(
s,
func(r rune) bool { return r != '\u00a0' && unicode.IsSpace(r) },
)
2025-09-11 21:16:09 +02:00
}
2025-10-10 15:47:36 +02:00
func singleLine(text string) string {
var l []string
p := strings.Split(text, "\n")
for _, part := range p {
2025-10-14 20:46:32 +02:00
part = trim(part)
2025-10-10 15:47:36 +02:00
if part == "" {
continue
}
l = append(l, part)
}
return strings.Join(l, " ")
}
2025-10-14 20:46:32 +02:00
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)
}
2025-10-10 15:47:36 +02:00
2025-10-14 20:46:32 +02:00
if len(t.cat) == 0 {
return fmt.Sprintf("%s (%s)", t.text, t.link)
}
b := bytes.NewBuffer(nil)
for i := range t.cat {
2025-10-10 15:47:36 +02:00
if i > 0 {
2025-10-14 20:46:32 +02:00
b.WriteRune(' ')
2025-10-10 15:47:36 +02:00
}
2025-10-14 20:46:32 +02:00
b.WriteString(textToString(t.cat[i]))
2025-10-10 15:47:36 +02:00
}
2025-10-14 20:46:32 +02:00
return singleLine(b.String())
2025-10-10 15:47:36 +02:00
}