1
0
textfmt/text.go

129 lines
1.9 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 (
2025-10-23 02:55:49 +02:00
"bytes"
"fmt"
2025-10-14 20:46:32 +02:00
"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
}
2025-10-28 00:47:41 +01:00
func itemToParagraph(list Entry, itemText Txt, prefix ...string) Entry {
p := Entry{
typ: paragraph,
wrapWidth: list.wrapWidth,
indent: list.indent,
indentFirst: list.indentFirst,
}
if len(prefix) == 0 {
p.text = itemText
return p
}
var prefixLength int
for _, p := range prefix {
prefixLength += len([]rune(p)) + 1
}
var prefixText []Txt
for _, p := range prefix {
prefixText = append(prefixText, Text(p))
}
p.indent += prefixLength
p.indentFirst -= prefixLength
p.text.cat = append(prefixText, itemText)
return p
}