1
0
textfmt/table.go

93 lines
1.6 KiB
Go

package textfmt
import "strings"
func normalizeTable(rows []TableRow) []TableRow {
var maxColumns int
for _, row := range rows {
if len(row.cells) > maxColumns {
maxColumns = len(row.cells)
}
}
var normalized []TableRow
for _, row := range rows {
row.cells = append(
row.cells,
make([]TableCell, maxColumns-len(row.cells))...,
)
normalized = append(normalized, row)
}
return normalized
}
func columnWeights(cells [][]string) []int {
if len(cells) == 0 {
return nil
}
w := make([]int, len(cells[0]))
for _, row := range cells {
for i, cell := range row {
weight := len([]rune(cell))
if weight == 0 {
weight = 1
}
w[i] += weight
}
}
return w
}
func targetColumnWidths(tableWidth int, weights []int) []int {
var weightSum int
for _, w := range weights {
weightSum += w
}
widths := make([]int, len(weights))
for i := range weights {
widths[i] = (weights[i] * tableWidth) / weightSum
}
return widths
}
func columnWidths(rows [][]string) []int {
if len(rows) == 0 {
return nil
}
if len(rows[0]) == 0 {
return nil
}
widths := make([]int, len(rows[0]))
for i := range rows {
for j := range rows[i] {
l := strings.Split(rows[i][j], "\n")
for k := range l {
lk := len([]rune(l[k]))
if lk > widths[j] {
widths[j] = lk
}
}
}
}
return widths
}
func ensureHeader(rows []TableRow) []TableRow {
if len(rows) == 0 || len(rows[0].cells) == 0 || rows[0].header {
return rows
}
h := []TableRow{{header: true, cells: make([]TableCell, len(rows[0].cells))}}
return append(h, rows...)
}