summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--pkg/gui/context/list_renderer.go2
-rw-r--r--pkg/gui/presentation/commits_test.go2
-rw-r--r--pkg/utils/formatting.go9
-rw-r--r--pkg/utils/formatting_test.go89
4 files changed, 60 insertions, 42 deletions
diff --git a/pkg/gui/context/list_renderer.go b/pkg/gui/context/list_renderer.go
index 40562a599..cca5a6c77 100644
--- a/pkg/gui/context/list_renderer.go
+++ b/pkg/gui/context/list_renderer.go
@@ -23,7 +23,7 @@ func (self *ListRenderer) renderLines(startIdx int, endIdx int) string {
if self.getColumnAlignments != nil {
columnAlignments = self.getColumnAlignments()
}
- lines := utils.RenderDisplayStrings(
+ lines, _ := utils.RenderDisplayStrings(
self.getDisplayStrings(startIdx, utils.Min(endIdx, self.list.Len())),
columnAlignments)
return strings.Join(lines, "\n")
diff --git a/pkg/gui/presentation/commits_test.go b/pkg/gui/presentation/commits_test.go
index 5167681cd..16f1de660 100644
--- a/pkg/gui/presentation/commits_test.go
+++ b/pkg/gui/presentation/commits_test.go
@@ -422,7 +422,7 @@ func TestGetCommitListDisplayStrings(t *testing.T) {
s.showYouAreHereLabel,
)
- renderedLines := utils.RenderDisplayStrings(result, nil)
+ renderedLines, _ := utils.RenderDisplayStrings(result, nil)
renderedResult := strings.Join(renderedLines, "\n")
t.Logf("\n%s", renderedResult)
diff --git a/pkg/utils/formatting.go b/pkg/utils/formatting.go
index cb50d6643..241d69732 100644
--- a/pkg/utils/formatting.go
+++ b/pkg/utils/formatting.go
@@ -37,10 +37,14 @@ func WithPadding(str string, padding int, alignment Alignment) string {
// defaults to left-aligning each column. If you want to set the alignment of
// each column, pass in a slice of Alignment values.
-func RenderDisplayStrings(displayStringsArr [][]string, columnAlignments []Alignment) []string {
+// returns a list of strings that should be joined with "\n", and an array of
+// the column positions
+func RenderDisplayStrings(displayStringsArr [][]string, columnAlignments []Alignment) ([]string, []int) {
displayStringsArr, columnAlignments = excludeBlankColumns(displayStringsArr, columnAlignments)
padWidths := getPadWidths(displayStringsArr)
columnConfigs := make([]ColumnConfig, len(padWidths))
+ columnPositions := make([]int, len(padWidths)+1)
+ columnPositions[0] = 0
for i, padWidth := range padWidths {
// gracefully handle when columnAlignments is shorter than padWidths
alignment := AlignLeft
@@ -52,8 +56,9 @@ func RenderDisplayStrings(displayStringsArr [][]string, columnAlignments []Align
Width: padWidth,
Alignment: alignment,
}
+ columnPositions[i+1] = columnPositions[i] + padWidth + 1
}
- return getPaddedDisplayStrings(displayStringsArr, columnConfigs)
+ return getPaddedDisplayStrings(displayStringsArr, columnConfigs), columnPositions
}
// NOTE: this mutates the input slice for the sake of performance
diff --git a/pkg/utils/formatting_test.go b/pkg/utils/formatting_test.go
index 5168bbad4..a91a96ea1 100644
--- a/pkg/utils/formatting_test.go
+++ b/pkg/utils/formatting_test.go
@@ -158,71 +158,84 @@ func TestTruncateWithEllipsis(t *testing.T) {
func TestRenderDisplayStrings(t *testing.T) {
type scenario struct {
- input [][]string
- columnAlignments []Alignment
- expected string
+ input [][]string
+ columnAlignments []Alignment
+ expectedOutput string
+ expectedColumnPositions []int
}
tests := []scenario{
{
- input: [][]string{{""}, {""}},
- columnAlignments: nil,
- expected: "",
+ input: [][]string{{""}, {""}},
+ columnAlignments: nil,
+ expectedOutput: "",
+ expectedColumnPositions: []int{0},
},
{
- input: [][]string{{"a"}, {""}},
- columnAlignments: nil,
- expected: "a\n",
+ input: [][]string{{"a"}, {""}},
+ columnAlignments: nil,
+ expectedOutput: "a\n",
+ expectedColumnPositions: []int{0},
},
{
- input: [][]string{{"a"}, {"b"}},
- columnAlignments: nil,
- expected: "a\nb",
+ input: [][]string{{"a"}, {"b"}},
+ columnAlignments: nil,
+ expectedOutput: "a\nb",
+ expectedColumnPositions: []int{0},
},
{
- input: [][]string{{"a", "b"}, {"c", "d"}},
- columnAlignments: nil,
- expected: "a b\nc d",
+ input: [][]string{{"a", "b"}, {"c", "d"}},
+ columnAlignments: nil,
+ expectedOutput: "a b\nc d",
+ expectedColumnPositions: []int{0, 2},
},
{
- input: [][]string{{"a", "", "c"}, {"d", "", "f"}},
- columnAlignments: nil,
- expected: "a c\nd f",
+ input: [][]string{{"a", "", "c"}, {"d", "", "f"}},
+ columnAlignments: nil,
+ expectedOutput: "a c\nd f",
+ expectedColumnPositions: []int{0, 2},
},
{
- input: [][]string{{"a", "", "c", ""}, {"d", "", "f", ""}},
- columnAlignments: nil,
- expected: "a c\nd f",
+ input: [][]string{{"a", "", "c", ""}, {"d", "", "f", ""}},
+ columnAlignments: nil,
+ expectedOutput: "a c\nd f",
+ expectedColumnPositions: []int{0, 2},
},
{
- input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
- columnAlignments: nil,
- expected: "abc d\ne f",
+ input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
+ columnAlignments: nil,
+ expectedOutput: "abc d\ne f",
+ expectedColumnPositions: []int{0, 4},
},
{
- input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
- columnAlignments: []Alignment{AlignLeft, AlignLeft}, // same as nil (default)
- expected: "abc d\ne f",
+ input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
+ columnAlignments: []Alignment{AlignLeft, AlignLeft}, // same as nil (default)
+ expectedOutput: "abc d\ne f",
+ expectedColumnPositions: []int{0, 4},
},
{
- input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
- columnAlignments: []Alignment{AlignRight, AlignLeft},
- expected: "abc d\n e f",
+ input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
+ columnAlignments: []Alignment{AlignRight, AlignLeft},
+ expectedOutput: "abc d\n e f",
+ expectedColumnPositions: []int{0, 4},
},
{
- input: [][]string{{"a", "", "bcd", "efg", "h"}, {"i", "", "j", "k", "l"}},
- columnAlignments: []Alignment{AlignLeft, AlignLeft, AlignRight, AlignLeft},
- expected: "a bcd efg h\ni j k l",
+ input: [][]string{{"a", "", "bcd", "efg", "h"}, {"i", "", "j", "k", "l"}},
+ columnAlignments: []Alignment{AlignLeft, AlignLeft, AlignRight, AlignLeft},
+ expectedOutput: "a bcd efg h\ni j k l",
+ expectedColumnPositions: []int{0, 2, 6, 10},
},
{
- input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
- columnAlignments: []Alignment{AlignRight}, // gracefully defaults unspecified columns to left-align
- expected: "abc d\n e f",
+ input: [][]string{{"abc", "", "d", ""}, {"e", "", "f", ""}},
+ columnAlignments: []Alignment{AlignRight}, // gracefully defaults unspecified columns to left-align
+ expectedOutput: "abc d\n e f",
+ expectedColumnPositions: []int{0, 4},
},
}
for _, test := range tests {
- output := RenderDisplayStrings(test.input, test.columnAlignments)
- assert.EqualValues(t, test.expected, strings.Join(output, "\n"))
+ output, columnPositions := RenderDisplayStrings(test.input, test.columnAlignments)
+ assert.EqualValues(t, test.expectedOutput, strings.Join(output, "\n"))
+ assert.EqualValues(t, test.expectedColumnPositions, columnPositions)
}
}