79 lines
1.3 KiB
Go
79 lines
1.3 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 {
|
||
|
|
w[i] += len([]rune(cell))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
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
|
||
|
|
}
|