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 }