diff --git a/providers/markdown/markdown.go b/providers/markdown/markdown.go index 31494a8..360fe6d 100644 --- a/providers/markdown/markdown.go +++ b/providers/markdown/markdown.go @@ -6,20 +6,39 @@ import "strings" import "html/template" import "github.com/yuin/goldmark" import "github.com/yuin/goldmark/parser" +import "github.com/yuin/goldmark/renderer" +import "github.com/yuin/goldmark/extension" import "git.tebibyte.media/sashakoshka/step" +import "github.com/yuin/goldmark/renderer/html" var _ step.FuncProvider = new(Provider) // Provider provides Markdown functions. type Provider struct { - // Options contains parse options that are passed to the converter. - Options []parser.ParseOption + Extensions []goldmark.Extender + ParserOptions []parser.Option + RendererOptions []renderer.Option +} + +// Default returns a provider with the default configuration. +func Default () *Provider { + return &Provider { + Extensions: []goldmark.Extender { extension.GFM }, + ParserOptions: []parser.Option { parser.WithAutoHeadingID() }, + RendererOptions: []renderer.Option { + html.WithXHTML(), + html.WithUnsafe(), + }, + } } // FuncMap fulfills the step.FuncProvider interface. func (this *Provider) FuncMap () template.FuncMap { stat := &state { - options: this.Options, + md: goldmark.New ( + goldmark.WithExtensions(this.Extensions...), + goldmark.WithParserOptions(this.ParserOptions...), + goldmark.WithRendererOptions(this.RendererOptions...)), } return template.FuncMap { "markdown": stat.funcMarkdown, @@ -27,12 +46,12 @@ func (this *Provider) FuncMap () template.FuncMap { } type state struct { - options []parser.ParseOption + md goldmark.Markdown } func (this *state) funcMarkdown (input any) (template.HTML, error) { builder := strings.Builder { } - err := goldmark.Convert(toBytes(input), &builder, this.options...) + err := this.md.Convert(toBytes(input), &builder) if err != nil { return "", nil } return template.HTML(builder.String()), nil }