Breite im Terminal begrenzen
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"fmt"
|
||||
"io"
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
|
||||
"royalroadupdates/internal/royalroad"
|
||||
)
|
||||
@@ -17,17 +18,46 @@ func PrintTable(w io.Writer, stories []royalroad.Story) {
|
||||
nameHeader := "Story Name"
|
||||
updateHeader := "Last Update"
|
||||
|
||||
maxNameLen := len(nameHeader)
|
||||
// 1. Measure natural widths in runes
|
||||
maxNameLen := utf8.RuneCountInString(nameHeader)
|
||||
maxUpdateLen := utf8.RuneCountInString(updateHeader)
|
||||
|
||||
for _, s := range stories {
|
||||
if l := len(s.Name); l > maxNameLen {
|
||||
if l := utf8.RuneCountInString(s.Name); l > maxNameLen {
|
||||
maxNameLen = l
|
||||
}
|
||||
if l := utf8.RuneCountInString(Relative(s.DateModified)); l > maxUpdateLen {
|
||||
maxUpdateLen = l
|
||||
}
|
||||
}
|
||||
|
||||
fmt.Fprintf(w, "%-*s %s\n", maxNameLen, nameHeader, updateHeader)
|
||||
fmt.Fprintf(w, "%s %s\n", strings.Repeat("-", maxNameLen), strings.Repeat("-", len(updateHeader)))
|
||||
// 2. Determine final name column width based on terminal availability
|
||||
nameWidth := maxNameLen
|
||||
const minNameWidth = 30
|
||||
const gutter = 2
|
||||
|
||||
termWidth, err := getTerminalWidth()
|
||||
if err == nil {
|
||||
// We have a terminal. check if it's wide enough to support a cap above the min.
|
||||
if termWidth >= minNameWidth+gutter+maxUpdateLen {
|
||||
availableForName := termWidth - gutter - maxUpdateLen
|
||||
if nameWidth > availableForName {
|
||||
nameWidth = availableForName
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Render Table
|
||||
fmt.Fprintf(w, "%-*s %s\n", nameWidth, nameHeader, updateHeader)
|
||||
fmt.Fprintf(w, "%s %s\n", strings.Repeat("-", nameWidth), strings.Repeat("-", maxUpdateLen))
|
||||
|
||||
for _, s := range stories {
|
||||
fmt.Fprintf(w, "%-*s %s\n", maxNameLen, s.Name, Relative(s.DateModified))
|
||||
displayName := s.Name
|
||||
runeName := []rune(displayName)
|
||||
if len(runeName) > nameWidth {
|
||||
// Truncate to (nameWidth - 3) and add ellipsis
|
||||
displayName = string(runeName[:nameWidth-3]) + "..."
|
||||
}
|
||||
fmt.Fprintf(w, "%-*s %s\n", nameWidth, displayName, Relative(s.DateModified))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user