2025-09-11 21:16:09 +02:00
|
|
|
package textfmt
|
|
|
|
|
|
2025-10-14 20:46:32 +02:00
|
|
|
import (
|
|
|
|
|
"strings"
|
|
|
|
|
"unicode"
|
|
|
|
|
)
|
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
|
|
|
}
|