From 4f5b806ba910f04a9d81ddcf39a1aa53c110b7c5 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Thu, 25 Jun 2026 22:44:09 +0000 Subject: [PATCH] fix(cli): respect preserve-new-lines flag in CLI renderer CLI mode unconditionally applied glamour.WithPreservedNewLines(), ignoring the -n flag and config default. Match TUI behavior by only enabling the option when preserveNewLines is true. Related to #858 --- glow_test.go | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ main.go | 9 +++++--- 2 files changed, 70 insertions(+), 3 deletions(-) diff --git a/glow_test.go b/glow_test.go index 8743be29..d5f2b557 100644 --- a/glow_test.go +++ b/glow_test.go @@ -1,10 +1,22 @@ package main import ( + "bytes" + "io" + "regexp" + "strings" + "sync" "testing" + + "github.com/spf13/viper" ) +var cliTestMu sync.Mutex + func TestGlowFlags(t *testing.T) { + cliTestMu.Lock() + defer cliTestMu.Unlock() + tt := []struct { args []string check func() bool @@ -39,3 +51,55 @@ func TestGlowFlags(t *testing.T) { } } } + +func TestCLIPreserveNewLinesFlag(t *testing.T) { + cliTestMu.Lock() + defer cliTestMu.Unlock() + + md := "soft\nbreak\n" + + render := func(preserve bool) string { + oldPreserve := preserveNewLines + oldStyle := style + oldWidth := width + oldPager := pager + oldTUI := tui + t.Cleanup(func() { + preserveNewLines = oldPreserve + style = oldStyle + width = oldWidth + pager = oldPager + tui = oldTUI + }) + + preserveNewLines = preserve + style = "notty" + width = 80 + pager = false + tui = false + viper.Set("pager", false) + viper.Set("tui", false) + _ = rootCmd.Flags().Set("pager", "false") + _ = rootCmd.Flags().Set("tui", "false") + rootCmd.Flags().Lookup("pager").Changed = false + rootCmd.Flags().Lookup("tui").Changed = false + + var buf bytes.Buffer + src := &source{reader: io.NopCloser(strings.NewReader(md)), URL: "test.md"} + if err := executeCLI(rootCmd, src, &buf); err != nil { + t.Fatalf("executeCLI failed: %v", err) + } + return ansiStrip.ReplaceAllString(buf.String(), "") + } + + outFalse := render(false) + outTrue := render(true) + if strings.Contains(outFalse, "soft\nbreak") { + t.Fatalf("expected soft line break to collapse when preserve-new-lines is false, got: %q", outFalse) + } + if outFalse == outTrue { + t.Fatalf("expected preserve-new-lines flag to change rendering") + } +} + +var ansiStrip = regexp.MustCompile(`\x1b\[[0-9;]*m`) diff --git a/main.go b/main.go index b31ca15b..4ecac3ed 100644 --- a/main.go +++ b/main.go @@ -291,13 +291,16 @@ func executeCLI(cmd *cobra.Command, src *source, w io.Writer) error { isCode := !utils.IsMarkdownFile(src.URL) // initialize glamour - r, err := glamour.NewTermRenderer( + options := []glamour.TermRendererOption{ glamour.WithColorProfile(lipgloss.ColorProfile()), utils.GlamourStyle(style, isCode), glamour.WithWordWrap(int(width)), //nolint:gosec glamour.WithBaseURL(baseURL), - glamour.WithPreservedNewLines(), - ) + } + if preserveNewLines { + options = append(options, glamour.WithPreservedNewLines()) + } + r, err := glamour.NewTermRenderer(options...) if err != nil { return fmt.Errorf("unable to create renderer: %w", err) }