62 lines
1.3 KiB
Go
62 lines
1.3 KiB
Go
package markdown
|
|
|
|
import (
|
|
"os"
|
|
"strings"
|
|
|
|
"github.com/charmbracelet/glamour"
|
|
)
|
|
|
|
func WithoutIndentation() glamour.TermRendererOption {
|
|
overrides := []byte(`
|
|
{
|
|
"document": {
|
|
"margin": 0
|
|
},
|
|
"code_block": {
|
|
"margin": 0
|
|
}
|
|
}`)
|
|
|
|
return glamour.WithStylesFromJSONBytes(overrides)
|
|
}
|
|
|
|
func WithWrap(w int) glamour.TermRendererOption {
|
|
return glamour.WithWordWrap(w)
|
|
}
|
|
|
|
type IOStreams interface {
|
|
TerminalTheme() string
|
|
}
|
|
|
|
func WithIO(io IOStreams) glamour.TermRendererOption {
|
|
style := os.Getenv("GLAMOUR_STYLE")
|
|
if style == "" || style == "auto" {
|
|
theme := io.TerminalTheme()
|
|
switch theme {
|
|
case "light", "dark":
|
|
style = theme
|
|
default:
|
|
style = "notty"
|
|
}
|
|
}
|
|
return glamour.WithStylePath(style)
|
|
}
|
|
|
|
func WithBaseURL(u string) glamour.TermRendererOption {
|
|
return glamour.WithBaseURL(u)
|
|
}
|
|
|
|
func Render(text string, opts ...glamour.TermRendererOption) (string, error) {
|
|
// Glamour rendering preserves carriage return characters in code blocks, but
|
|
// we need to ensure that no such characters are present in the output.
|
|
text = strings.ReplaceAll(text, "\r\n", "\n")
|
|
|
|
opts = append(opts, glamour.WithEmoji(), glamour.WithPreservedNewLines())
|
|
tr, err := glamour.NewTermRenderer(opts...)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return tr.Render(text)
|
|
}
|