diff --git a/internal/tui/exp/diffview/chroma.go b/internal/tui/exp/diffview/chroma.go index e4d6b2dbaa12651b28ace04e2e051c7a64522899..5584c668b6631c934d8e81992b420bcdb34f8d06 100644 --- a/internal/tui/exp/diffview/chroma.go +++ b/internal/tui/exp/diffview/chroma.go @@ -4,6 +4,7 @@ import ( "fmt" "image/color" "io" + "strings" "github.com/alecthomas/chroma/v2" "github.com/charmbracelet/lipgloss/v2" @@ -20,9 +21,11 @@ type chromaFormatter struct { // Format implements the chroma.Formatter interface. func (c chromaFormatter) Format(w io.Writer, style *chroma.Style, it chroma.Iterator) error { for token := it(); token != chroma.EOF; token = it() { + value := strings.TrimSuffix(token.Value, "\n") + entry := style.Get(token.Type) if entry.IsZero() { - if _, err := fmt.Fprint(w, token.Value); err != nil { + if _, err := fmt.Fprint(w, value); err != nil { return err } continue @@ -44,7 +47,7 @@ func (c chromaFormatter) Format(w io.Writer, style *chroma.Style, it chroma.Iter s = s.Foreground(lipgloss.Color(entry.Colour.String())) } - if _, err := fmt.Fprint(w, s.Render(token.Value)); err != nil { + if _, err := fmt.Fprint(w, s.Render(value)); err != nil { return err } } diff --git a/internal/tui/exp/diffview/diffview_test.go b/internal/tui/exp/diffview/diffview_test.go index 595e0fa83260fbc981998aad0171fd4a1dcb25b8..c77c9e0e945072862aecdfbe5802e8093c5def83 100644 --- a/internal/tui/exp/diffview/diffview_test.go +++ b/internal/tui/exp/diffview/diffview_test.go @@ -36,6 +36,12 @@ var TestTabsBefore string //go:embed testdata/TestTabs.after var TestTabsAfter string +//go:embed testdata/TestLineBreakIssue.before +var TestLineBreakIssueBefore string + +//go:embed testdata/TestLineBreakIssue.after +var TestLineBreakIssueAfter string + type ( TestFunc func(dv *diffview.DiffView) *diffview.DiffView TestFuncs map[string]TestFunc @@ -177,6 +183,26 @@ func TestDiffViewTabs(t *testing.T) { } } +func TestDiffViewLineBreakIssue(t *testing.T) { + t.Parallel() + + for layoutName, layoutFunc := range LayoutFuncs { + t.Run(layoutName, func(t *testing.T) { + t.Parallel() + + dv := diffview.New(). + Before("index.js", TestLineBreakIssueBefore). + After("index.js", TestLineBreakIssueAfter). + Style(diffview.DefaultLightStyle()). + ChromaStyle(styles.Get("catppuccin-latte")) + dv = layoutFunc(dv) + + output := dv.String() + golden.RequireEqual(t, []byte(output)) + }) + } +} + func TestDiffViewWidth(t *testing.T) { for layoutName, layoutFunc := range LayoutFuncs { t.Run(layoutName, func(t *testing.T) { diff --git a/internal/tui/exp/diffview/testdata/TestDiffViewLineBreakIssue/Split.golden b/internal/tui/exp/diffview/testdata/TestDiffViewLineBreakIssue/Split.golden new file mode 100644 index 0000000000000000000000000000000000000000..41ec3a82928b33ab5e27b100d71abded6fd8b305 --- /dev/null +++ b/internal/tui/exp/diffview/testdata/TestDiffViewLineBreakIssue/Split.golden @@ -0,0 +1,9 @@ +  …  @@ -1,6 +1,8 @@    …    +  1 - // this is   1 + /**  +       2 +  * this is  +  2 - // a regular   3 +  * a block  +  3 - // comment   4 +  * comment  +       5 +  */  +  4  $(function() {   6  $(function() {  +  5   console.log("Hello, world!");   7   console.log("Hello, world!");  +  6  });   8  });  \ No newline at end of file diff --git a/internal/tui/exp/diffview/testdata/TestDiffViewLineBreakIssue/Unified.golden b/internal/tui/exp/diffview/testdata/TestDiffViewLineBreakIssue/Unified.golden new file mode 100644 index 0000000000000000000000000000000000000000..c3bded237b15f4207dc76d99ec52869124759506 --- /dev/null +++ b/internal/tui/exp/diffview/testdata/TestDiffViewLineBreakIssue/Unified.golden @@ -0,0 +1,12 @@ +  …   …  @@ -1,6 +1,8 @@   +  1    - // this is  +     1 + /**  +     2 +  * this is  +  2    - // a regular  +     3 +  * a block  +  3    - // comment  +     4 +  * comment  +     5 +  */  +  4   6  $(function() {  +  5   7   console.log("Hello, world!");  +  6   8  });  \ No newline at end of file diff --git a/internal/tui/exp/diffview/testdata/TestLineBreakIssue.after b/internal/tui/exp/diffview/testdata/TestLineBreakIssue.after new file mode 100644 index 0000000000000000000000000000000000000000..b26198ffbc2f9f7b3817d4aa486b1d3d56c752e0 --- /dev/null +++ b/internal/tui/exp/diffview/testdata/TestLineBreakIssue.after @@ -0,0 +1,8 @@ +/** + * this is + * a block + * comment + */ +$(function() { + console.log("Hello, world!"); +}); diff --git a/internal/tui/exp/diffview/testdata/TestLineBreakIssue.before b/internal/tui/exp/diffview/testdata/TestLineBreakIssue.before new file mode 100644 index 0000000000000000000000000000000000000000..7dea269c551b41906d6eb2b7a83d652250476e47 --- /dev/null +++ b/internal/tui/exp/diffview/testdata/TestLineBreakIssue.before @@ -0,0 +1,6 @@ +// this is +// a regular +// comment +$(function() { + console.log("Hello, world!"); +});