diff --git a/glamour.go b/glamour.go index bc1870cc..c365f697 100644 --- a/glamour.go +++ b/glamour.go @@ -66,6 +66,16 @@ func RenderBytes(in []byte, stylePath string) ([]byte, error) { return r.RenderBytes(in) } +func RenderBytesTo(in []byte, stylePath string, w io.Writer) error { + r, err := NewTermRenderer( + WithStylePath(stylePath), + ) + if err != nil { + return err + } + return r.RenderBytesTo(in, w) +} + // NewTermRenderer returns a new TermRenderer the given options. func NewTermRenderer(options ...TermRendererOption) (*TermRenderer, error) { tr := &TermRenderer{ @@ -290,10 +300,15 @@ func (tr *TermRenderer) Render(in string) (string, error) { // RenderBytes returns the markdown rendered into a byte slice. func (tr *TermRenderer) RenderBytes(in []byte) ([]byte, error) { var buf bytes.Buffer - err := tr.md.Convert(in, &buf) + err := tr.RenderBytesTo(in, &buf) return buf.Bytes(), err } +// RenderBytesTo renders markdown into the provided writer. +func (tr *TermRenderer) RenderBytesTo(in []byte, w io.Writer) error { + return tr.md.Convert(in, w) +} + func getEnvironmentStyle() string { glamourStyle := os.Getenv("GLAMOUR_STYLE") if len(glamourStyle) == 0 { diff --git a/glamour_test.go b/glamour_test.go index 46fed567..a3594111 100644 --- a/glamour_test.go +++ b/glamour_test.go @@ -325,3 +325,59 @@ func TestWithChromaFormatterCustom(t *testing.T) { golden.RequireEqual(t, []byte(b)) } + +func TestRenderBytesTo(t *testing.T) { + in, err := os.ReadFile(markdown) + if err != nil { + t.Fatal(err) + } + + var buf bytes.Buffer + err = RenderBytesTo(in, "dark", &buf) + if err != nil { + t.Fatal(err) + } + + golden.RequireEqual(t, buf.Bytes()) +} + +func TestRenderBytesToWithCustomStyle(t *testing.T) { + in, err := os.ReadFile(markdown) + if err != nil { + t.Fatal(err) + } + + var buf bytes.Buffer + err = RenderBytesTo(in, "testdata/custom.style", &buf) + if err != nil { + t.Fatal(err) + } + + // Compare with expected output + r, err := NewTermRenderer(WithStylePath("testdata/custom.style")) + if err != nil { + t.Fatal(err) + } + + expected, err := r.RenderBytes(in) + if err != nil { + t.Fatal(err) + } + + if !bytes.Equal(expected, buf.Bytes()) { + t.Errorf("Output doesn't match expected result") + } +} + +func TestRenderBytesToError(t *testing.T) { + in, err := os.ReadFile(markdown) + if err != nil { + t.Fatal(err) + } + + var buf bytes.Buffer + err = RenderBytesTo(in, "non-existent-style", &buf) + if err == nil { + t.Error("Expected error for non-existent style, got nil") + } +} diff --git a/testdata/TestRenderBytesTo.golden b/testdata/TestRenderBytesTo.golden new file mode 100644 index 00000000..0e989404 --- /dev/null +++ b/testdata/TestRenderBytesTo.golden @@ -0,0 +1,40 @@ + +  Gold                                                                        +                                                                              + Render markdown on the CLI, with pizzazz!                                    +                                                                              + ## What is it?                                                               +                                                                              + Gold is a Golang library that allows you to use JSON based stylesheets to    + render Markdown files in the terminal. Just like CSS, you can define color   + and style attributes on Markdown elements. The difference is that you use    + ANSI color and terminal codes instead of CSS properties and hex colors.      +                                                                              + ## Usage                                                                     +                                                                              + See cmd/gold /cmd/gold/.                                                     +                                                                              + ## Example Output                                                            +                                                                              + Image: Gold Dark Style →                                                     + https://github.com/charmbracelet/gold/raw/master/styles/gallery/dark.png     +                                                                              + Check out the Gold Style Gallery                                             + https://github.com/charmbracelet/gold/blob/master/styles/gallery/README.md!  +                                                                              + ## Colors                                                                    +                                                                              + Currently  gold  uses the Aurora ANSI colors                                 + https://godoc.org/github.com/logrusorgru/aurora#Index.                       +                                                                              + ## Development                                                               +                                                                              + Style definitions located in  styles/  can be embedded into the binary by    + running statik https://github.com/rakyll/statik:                             +                                                                              +   statik -f -src styles -include "*.json"                                    +                                                                              + You can re-generate screenshots of all available styles by running           + gallery.sh . This requires  termshot  and  pngcrush  installed on your       + system!                                                                      +