From 7b3a48d9d5578fa304158faa4be537abfdeae61a Mon Sep 17 00:00:00 2001 From: Daniel Schmidt Date: Fri, 19 May 2023 19:57:17 +0200 Subject: [PATCH] Fix SGR passing edge case. --- sgr.go | 4 ++++ sgr_test.go | 52 ++++++++++++++++++++++++++-------------------------- 2 files changed, 30 insertions(+), 26 deletions(-) diff --git a/sgr.go b/sgr.go index fbde889..d90df77 100644 --- a/sgr.go +++ b/sgr.go @@ -17,6 +17,10 @@ func extractSGR(s string) (string, bool) { } for i := 2; i < len(s); i++ { + if s[i] == ' ' || s[i] == termenv.CSI[0] { + return "", false + } + if s[i] == 'm' { return s[:i+1], true } diff --git a/sgr_test.go b/sgr_test.go index 7162678..f4ad889 100644 --- a/sgr_test.go +++ b/sgr_test.go @@ -1,36 +1,36 @@ package crt import ( -"bytes" -"github.com/charmbracelet/lipgloss" -"github.com/muesli/termenv" -"github.com/stretchr/testify/assert" -"testing" + "bytes" + "github.com/charmbracelet/lipgloss" + "github.com/muesli/termenv" + "github.com/stretchr/testify/assert" + "testing" ) func TestSGR(t *testing.T) { -buf := &bytes.Buffer{} -lip := lipgloss.NewRenderer(buf, termenv.WithProfile(termenv.TrueColor)) -testString := lip.NewStyle().Bold(true).Foreground(lipgloss.Color("#ff00ff")).Render("Hello World") + "asdasdasdasdasd" + lip.NewStyle().Italic(true).Background(lipgloss.Color("#ff00ff")).Render("Hello World") + buf := &bytes.Buffer{} + lip := lipgloss.NewRenderer(buf, termenv.WithProfile(termenv.TrueColor)) + testString := lip.NewStyle().Bold(true).Foreground(lipgloss.Color("#ff00ff")).Render("Hello World") + "asdasdasdasdasd" + lip.NewStyle().Italic(true).Background(lipgloss.Color("#ff00ff")).Render("Hello World") -var sequences []any -for i := 0; i < len(testString); i++ { -sgr, ok := extractSGR(testString[i:]) -if ok { -i += len(sgr) - 1 + var sequences []any + for i := 0; i < len(testString); i++ { + sgr, ok := extractSGR(testString[i:]) + if ok { + i += len(sgr) - 1 -if res, ok := parseSGR(sgr); ok { -sequences = append(sequences, res...) -} -} -} + if res, ok := parseSGR(sgr); ok { + sequences = append(sequences, res...) + } + } + } -assert.Equal(t, []any{ -SGRBold{}, -SGRFgTrueColor{R: 255, G: 0, B: 255}, -SGRReset{}, -SGRItalic{}, -SGRBgTrueColor{R: 255, G: 0, B: 255}, -SGRReset{}, -}, sequences) + assert.Equal(t, []any{ + SGRBold{}, + SGRFgTrueColor{R: 255, G: 0, B: 255}, + SGRReset{}, + SGRItalic{}, + SGRBgTrueColor{R: 255, G: 0, B: 255}, + SGRReset{}, + }, sequences) }