fix word wrapping

This commit is contained in:
2026-07-17 09:52:55 +02:00
parent 6f3ca3243a
commit 744cdcb733
4 changed files with 41 additions and 36 deletions

View File

@@ -25,7 +25,6 @@ import (
"strings"
"codeberg.org/scip/esctl/pkg/cfg"
"github.com/seeruk/go-wordwrap"
"gopkg.in/yaml.v3"
)
@@ -161,20 +160,8 @@ func (table *Table) PrintTSV() error {
length := visibleLen(entry)
if length+currentWidth > table.maxwidth && table.maxwidth-currentWidth > 1 {
// text is too wide to be put into one line, wrap it
wrapper := wordwrap.Wrapper(table.maxwidth-currentWidth, false)
wrapped := wrapper(entry)
// and indent it
first := true
for line := range strings.Lines(wrapped) {
if first {
entry = line
first = false
} else {
entry += "\n " + strings.Repeat(" ", currentWidth) + line
}
}
// // text is too wide to be put into one line, wrap it
entry = wrap(table.maxwidth-currentWidth, currentWidth+2, entry)
}
currentWidth += table.lenHeaders[idx]
@@ -202,6 +189,43 @@ func (table *Table) PrintTSV() error {
return nil
}
// Wrap a text into multiple lines, first line is not indented, all
// further lines will be indented. Used within Print() to print large
// cell text.
func wrap(width, indent int, text string) string {
wrapped := ""
line := ""
for word := range strings.FieldsSeq(text) {
if len(line)+len(word)+1 <= width {
// appending word to current line doesn't exceed width
if line != "" {
line += " "
}
line += word
} else {
// it exceeds it, so we need to wrap
if wrapped == "" {
// beginning of output, no indenting here
wrapped = line + "\n"
} else {
// we're in the middle of the text, so add the indent
wrapped += strings.Repeat(" ", indent) + line + "\n"
}
// remember the current word for the next round
line = word
}
}
if line != "" {
// last line, no newline needed here
wrapped += strings.Repeat(" ", indent) + line
}
return wrapped
}
func (table *Table) PrintCSV() error {
table.preprocessRows()