diff --git a/ansi/baseelement.go b/ansi/baseelement.go index c4a388ea..43289fb6 100644 --- a/ansi/baseelement.go +++ b/ansi/baseelement.go @@ -3,6 +3,7 @@ package ansi import ( "bytes" "io" + "strings" "text/template" "github.com/muesli/termenv" @@ -38,13 +39,21 @@ func renderText(w io.Writer, p termenv.Profile, rules StylePrimitive, s string) out := termenv.String(s) + if rules.Upper != nil && *rules.Upper { + out = termenv.String(strings.ToUpper(s)) + } + if rules.Lower != nil && *rules.Lower { + out = termenv.String(strings.ToLower(s)) + } + if rules.Title != nil && *rules.Title { + out = termenv.String(strings.Title(s)) + } if rules.Color != nil { out = out.Foreground(p.Color(*rules.Color)) } if rules.BackgroundColor != nil { out = out.Background(p.Color(*rules.BackgroundColor)) } - if rules.Underline != nil && *rules.Underline { out = out.Underline() } diff --git a/ansi/style.go b/ansi/style.go index cdff8695..973243d5 100644 --- a/ansi/style.go +++ b/ansi/style.go @@ -45,6 +45,9 @@ type StylePrimitive struct { BackgroundColor *string `json:"background_color,omitempty"` Underline *bool `json:"underline,omitempty"` Bold *bool `json:"bold,omitempty"` + Upper *bool `json:"upper,omitempty"` + Lower *bool `json:"lower,omitempty"` + Title *bool `json:"title,omitempty"` Italic *bool `json:"italic,omitempty"` CrossedOut *bool `json:"crossed_out,omitempty"` Faint *bool `json:"faint,omitempty"` @@ -151,6 +154,9 @@ func cascadeStyle(parent StyleBlock, child StyleBlock, toBlock bool) StyleBlock s.BackgroundColor = parent.BackgroundColor s.Underline = parent.Underline s.Bold = parent.Bold + s.Upper = parent.Upper + s.Title = parent.Title + s.Lower = parent.Lower s.Italic = parent.Italic s.CrossedOut = parent.CrossedOut s.Faint = parent.Faint @@ -186,6 +192,15 @@ func cascadeStyle(parent StyleBlock, child StyleBlock, toBlock bool) StyleBlock if child.Bold != nil { s.Bold = child.Bold } + if child.Upper != nil { + s.Upper = child.Upper + } + if child.Lower != nil { + s.Lower = child.Lower + } + if child.Title != nil { + s.Title = child.Title + } if child.Italic != nil { s.Italic = child.Italic } diff --git a/glamour_test.go b/glamour_test.go index 7f36d219..8ff127fa 100644 --- a/glamour_test.go +++ b/glamour_test.go @@ -188,3 +188,33 @@ func TestRenderHelpers(t *testing.T) { string(td), b) } } + +func TestCapitalization(t *testing.T) { + p := true + style := DarkStyleConfig + style.H1.Upper = &p + style.H2.Title = &p + style.H3.Lower = &p + + r, err := NewTermRenderer( + WithStyles(style), + ) + if err != nil { + t.Fatal(err) + } + + b, err := r.Render("# everything is uppercase\n## everything is titled\n### everything is lowercase") + if err != nil { + t.Fatal(err) + } + + // expected outcome + td, err := ioutil.ReadFile("testdata/capitalization.test") + if err != nil { + t.Fatal(err) + } + + if string(td) != b { + t.Errorf("Rendered output doesn't match!\nExpected: `\n%s`\nGot: `\n%s`\n", td, b) + } +} diff --git a/testdata/capitalization.test b/testdata/capitalization.test new file mode 100644 index 00000000..2c684356 --- /dev/null +++ b/testdata/capitalization.test @@ -0,0 +1,7 @@ + +  EVERYTHING IS UPPERCASE                                                     +                                                                              + ## Everything Is Titled                                                      +                                                                              + ### everything is lowercase                                                  +