mirror of
https://github.com/charmbracelet/crush.git
synced 2025-08-02 05:20:46 +03:00
fix(diffview): fix rendering issue caused by line breaks added by chroma
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
9
internal/tui/exp/diffview/testdata/TestDiffViewLineBreakIssue/Split.golden
generated
vendored
Normal file
9
internal/tui/exp/diffview/testdata/TestDiffViewLineBreakIssue/Split.golden
generated
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
[48;2;71;118;255m [m[38;2;77;76;87;48;2;71;118;255m …[m[48;2;71;118;255m [m[38;2;96;95;107;48;2;113;154;252m @@ -1,6 +1,8 @@ [m[48;2;113;154;252m [m[48;2;71;118;255m [m[38;2;77;76;87;48;2;71;118;255m …[m[48;2;71;118;255m [m[38;2;96;95;107;48;2;113;154;252m [m[48;2;113;154;252m [m
|
||||
[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;205;210m 1[m[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;235;238m- [m[38;2;32;31;38;48;2;255;235;238m[3;38;2;156;160;176;48;2;255;235;238m// this is[m[m[48;2;255;235;238m [m[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m 1[m[48;2;200;230;201m [m[38;2;10;220;217;48;2;232;245;233m+ [m[38;2;32;31;38;48;2;232;245;233m[38;2;210;15;57;48;2;232;245;233m/**[m[m[48;2;232;245;233m [m
|
||||
[48;2;223;219;221m [m[48;2;223;219;221m [m[48;2;223;219;221m [m[48;2;223;219;221m [m[48;2;223;219;221m [m[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m 2[m[48;2;200;230;201m [m[38;2;10;220;217;48;2;232;245;233m+ [m[38;2;32;31;38;48;2;232;245;233m[38;2;76;79;105;48;2;232;245;233m [m[1;38;2;4;165;229;48;2;232;245;233m*[m[38;2;76;79;105;48;2;232;245;233m [m[38;2;136;57;239;48;2;232;245;233mthis[m[38;2;76;79;105;48;2;232;245;233m [m[38;2;76;79;105;48;2;232;245;233mis[m[m[48;2;232;245;233m [m
|
||||
[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;205;210m 2[m[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;235;238m- [m[38;2;32;31;38;48;2;255;235;238m[3;38;2;156;160;176;48;2;255;235;238m// a regular[m[m[48;2;255;235;238m [m[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m 3[m[48;2;200;230;201m [m[38;2;10;220;217;48;2;232;245;233m+ [m[38;2;32;31;38;48;2;232;245;233m[38;2;76;79;105;48;2;232;245;233m [m[1;38;2;4;165;229;48;2;232;245;233m*[m[38;2;76;79;105;48;2;232;245;233m [m[38;2;76;79;105;48;2;232;245;233ma[m[38;2;76;79;105;48;2;232;245;233m [m[38;2;76;79;105;48;2;232;245;233mblock[m[m[48;2;232;245;233m [m
|
||||
[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;205;210m 3[m[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;235;238m- [m[38;2;32;31;38;48;2;255;235;238m[3;38;2;156;160;176;48;2;255;235;238m// comment[m[m[48;2;255;235;238m [m[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m 4[m[48;2;200;230;201m [m[38;2;10;220;217;48;2;232;245;233m+ [m[38;2;32;31;38;48;2;232;245;233m[38;2;76;79;105;48;2;232;245;233m [m[1;38;2;4;165;229;48;2;232;245;233m*[m[38;2;76;79;105;48;2;232;245;233m [m[38;2;76;79;105;48;2;232;245;233mcomment[m[m[48;2;232;245;233m [m
|
||||
[48;2;223;219;221m [m[48;2;223;219;221m [m[48;2;223;219;221m [m[48;2;223;219;221m [m[48;2;223;219;221m [m[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m 5[m[48;2;200;230;201m [m[38;2;10;220;217;48;2;232;245;233m+ [m[38;2;32;31;38;48;2;232;245;233m[38;2;76;79;105;48;2;232;245;233m [m[1;38;2;4;165;229;48;2;232;245;233m*[m[38;2;210;15;57;48;2;232;245;233m/[m[m[48;2;232;245;233m [m
|
||||
[48;2;223;219;221m [m[38;2;58;57;67;48;2;223;219;221m 4[m[48;2;223;219;221m [m[38;2;32;31;38;48;2;241;239;239m [38;2;76;79;105;48;2;241;239;239m$[m[38;2;76;79;105;48;2;241;239;239m([m[38;2;210;15;57;48;2;241;239;239mfunction[m[38;2;76;79;105;48;2;241;239;239m()[m[38;2;76;79;105;48;2;241;239;239m [m[38;2;76;79;105;48;2;241;239;239m{[m[m[48;2;241;239;239m [m[48;2;223;219;221m [m[38;2;58;57;67;48;2;223;219;221m 6[m[48;2;223;219;221m [m[38;2;32;31;38;48;2;241;239;239m [38;2;76;79;105;48;2;241;239;239m$[m[38;2;76;79;105;48;2;241;239;239m([m[38;2;210;15;57;48;2;241;239;239mfunction[m[38;2;76;79;105;48;2;241;239;239m()[m[38;2;76;79;105;48;2;241;239;239m [m[38;2;76;79;105;48;2;241;239;239m{[m[m[48;2;241;239;239m [m
|
||||
[48;2;223;219;221m [m[38;2;58;57;67;48;2;223;219;221m 5[m[48;2;223;219;221m [m[38;2;32;31;38;48;2;241;239;239m [38;2;76;79;105;48;2;241;239;239m [m[38;2;76;79;105;48;2;241;239;239mconsole[m[38;2;76;79;105;48;2;241;239;239m.[m[38;2;76;79;105;48;2;241;239;239mlog[m[38;2;76;79;105;48;2;241;239;239m([m[38;2;64;160;43;48;2;241;239;239m"Hello, world!"[m[38;2;76;79;105;48;2;241;239;239m);[m[m[48;2;241;239;239m [m[48;2;223;219;221m [m[38;2;58;57;67;48;2;223;219;221m 7[m[48;2;223;219;221m [m[38;2;32;31;38;48;2;241;239;239m [38;2;76;79;105;48;2;241;239;239m [m[38;2;76;79;105;48;2;241;239;239mconsole[m[38;2;76;79;105;48;2;241;239;239m.[m[38;2;76;79;105;48;2;241;239;239mlog[m[38;2;76;79;105;48;2;241;239;239m([m[38;2;64;160;43;48;2;241;239;239m"Hello, world!"[m[38;2;76;79;105;48;2;241;239;239m);[m[m[48;2;241;239;239m [m
|
||||
[48;2;223;219;221m [m[38;2;58;57;67;48;2;223;219;221m 6[m[48;2;223;219;221m [m[38;2;32;31;38;48;2;241;239;239m [38;2;76;79;105;48;2;241;239;239m});[m[m[48;2;241;239;239m [m[48;2;223;219;221m [m[38;2;58;57;67;48;2;223;219;221m 8[m[48;2;223;219;221m [m[38;2;32;31;38;48;2;241;239;239m [38;2;76;79;105;48;2;241;239;239m});[m[m[48;2;241;239;239m [m
|
||||
12
internal/tui/exp/diffview/testdata/TestDiffViewLineBreakIssue/Unified.golden
generated
vendored
Normal file
12
internal/tui/exp/diffview/testdata/TestDiffViewLineBreakIssue/Unified.golden
generated
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
[48;2;71;118;255m [m[38;2;77;76;87;48;2;71;118;255m …[m[48;2;71;118;255m [m[48;2;71;118;255m [m[38;2;77;76;87;48;2;71;118;255m …[m[48;2;71;118;255m [m[38;2;96;95;107;48;2;113;154;252m @@ -1,6 +1,8 @@ [m[48;2;113;154;252m [m
|
||||
[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;205;210m 1[m[48;2;255;205;210m [m[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;205;210m [m[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;235;238m- [m[38;2;32;31;38;48;2;255;235;238m[3;38;2;156;160;176;48;2;255;235;238m// this is[m[m[48;2;255;235;238m [m
|
||||
[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m [m[48;2;200;230;201m [m[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m 1[m[48;2;200;230;201m [m[38;2;10;220;217;48;2;232;245;233m+ [m[38;2;32;31;38;48;2;232;245;233m[38;2;210;15;57;48;2;232;245;233m/**[m[m[48;2;232;245;233m [m
|
||||
[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m [m[48;2;200;230;201m [m[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m 2[m[48;2;200;230;201m [m[38;2;10;220;217;48;2;232;245;233m+ [m[38;2;32;31;38;48;2;232;245;233m[38;2;76;79;105;48;2;232;245;233m [m[1;38;2;4;165;229;48;2;232;245;233m*[m[38;2;76;79;105;48;2;232;245;233m [m[38;2;136;57;239;48;2;232;245;233mthis[m[38;2;76;79;105;48;2;232;245;233m [m[38;2;76;79;105;48;2;232;245;233mis[m[m[48;2;232;245;233m [m
|
||||
[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;205;210m 2[m[48;2;255;205;210m [m[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;205;210m [m[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;235;238m- [m[38;2;32;31;38;48;2;255;235;238m[3;38;2;156;160;176;48;2;255;235;238m// a regular[m[m[48;2;255;235;238m [m
|
||||
[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m [m[48;2;200;230;201m [m[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m 3[m[48;2;200;230;201m [m[38;2;10;220;217;48;2;232;245;233m+ [m[38;2;32;31;38;48;2;232;245;233m[38;2;76;79;105;48;2;232;245;233m [m[1;38;2;4;165;229;48;2;232;245;233m*[m[38;2;76;79;105;48;2;232;245;233m [m[38;2;76;79;105;48;2;232;245;233ma[m[38;2;76;79;105;48;2;232;245;233m [m[38;2;76;79;105;48;2;232;245;233mblock[m[m[48;2;232;245;233m [m
|
||||
[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;205;210m 3[m[48;2;255;205;210m [m[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;205;210m [m[48;2;255;205;210m [m[38;2;255;56;139;48;2;255;235;238m- [m[38;2;32;31;38;48;2;255;235;238m[3;38;2;156;160;176;48;2;255;235;238m// comment[m[m[48;2;255;235;238m [m
|
||||
[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m [m[48;2;200;230;201m [m[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m 4[m[48;2;200;230;201m [m[38;2;10;220;217;48;2;232;245;233m+ [m[38;2;32;31;38;48;2;232;245;233m[38;2;76;79;105;48;2;232;245;233m [m[1;38;2;4;165;229;48;2;232;245;233m*[m[38;2;76;79;105;48;2;232;245;233m [m[38;2;76;79;105;48;2;232;245;233mcomment[m[m[48;2;232;245;233m [m
|
||||
[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m [m[48;2;200;230;201m [m[48;2;200;230;201m [m[38;2;10;220;217;48;2;200;230;201m 5[m[48;2;200;230;201m [m[38;2;10;220;217;48;2;232;245;233m+ [m[38;2;32;31;38;48;2;232;245;233m[38;2;76;79;105;48;2;232;245;233m [m[1;38;2;4;165;229;48;2;232;245;233m*[m[38;2;210;15;57;48;2;232;245;233m/[m[m[48;2;232;245;233m [m
|
||||
[48;2;223;219;221m [m[38;2;58;57;67;48;2;223;219;221m 4[m[48;2;223;219;221m [m[48;2;223;219;221m [m[38;2;58;57;67;48;2;223;219;221m 6[m[48;2;223;219;221m [m[38;2;32;31;38;48;2;241;239;239m [38;2;76;79;105;48;2;241;239;239m$[m[38;2;76;79;105;48;2;241;239;239m([m[38;2;210;15;57;48;2;241;239;239mfunction[m[38;2;76;79;105;48;2;241;239;239m()[m[38;2;76;79;105;48;2;241;239;239m [m[38;2;76;79;105;48;2;241;239;239m{[m[m[48;2;241;239;239m [m
|
||||
[48;2;223;219;221m [m[38;2;58;57;67;48;2;223;219;221m 5[m[48;2;223;219;221m [m[48;2;223;219;221m [m[38;2;58;57;67;48;2;223;219;221m 7[m[48;2;223;219;221m [m[38;2;32;31;38;48;2;241;239;239m [38;2;76;79;105;48;2;241;239;239m [m[38;2;76;79;105;48;2;241;239;239mconsole[m[38;2;76;79;105;48;2;241;239;239m.[m[38;2;76;79;105;48;2;241;239;239mlog[m[38;2;76;79;105;48;2;241;239;239m([m[38;2;64;160;43;48;2;241;239;239m"Hello, world!"[m[38;2;76;79;105;48;2;241;239;239m);[m[m[48;2;241;239;239m [m
|
||||
[48;2;223;219;221m [m[38;2;58;57;67;48;2;223;219;221m 6[m[48;2;223;219;221m [m[48;2;223;219;221m [m[38;2;58;57;67;48;2;223;219;221m 8[m[48;2;223;219;221m [m[38;2;32;31;38;48;2;241;239;239m [38;2;76;79;105;48;2;241;239;239m});[m[m[48;2;241;239;239m [m
|
||||
8
internal/tui/exp/diffview/testdata/TestLineBreakIssue.after
vendored
Normal file
8
internal/tui/exp/diffview/testdata/TestLineBreakIssue.after
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
/**
|
||||
* this is
|
||||
* a block
|
||||
* comment
|
||||
*/
|
||||
$(function() {
|
||||
console.log("Hello, world!");
|
||||
});
|
||||
6
internal/tui/exp/diffview/testdata/TestLineBreakIssue.before
vendored
Normal file
6
internal/tui/exp/diffview/testdata/TestLineBreakIssue.before
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
// this is
|
||||
// a regular
|
||||
// comment
|
||||
$(function() {
|
||||
console.log("Hello, world!");
|
||||
});
|
||||
Reference in New Issue
Block a user