Add markdown support

This commit is contained in:
2024-12-05 14:20:37 -05:00
parent 0da05d465e
commit b395963709
4 changed files with 58 additions and 3 deletions

View File

@@ -1,13 +1,15 @@
package providers
import "git.tebibyte.media/sashakoshka/step"
import fpos "git.tebibyte.media/sashakoshka/step/providers/os"
import fpsprig "git.tebibyte.media/sashakoshka/step/providers/sprig"
import fpos "git.tebibyte.media/sashakoshka/step/providers/os"
import fpsprig "git.tebibyte.media/sashakoshka/step/providers/sprig"
import fpmarkdown "git.tebibyte.media/sashakoshka/step/providers/markdown"
// All returns a slice of all providers defined in sub-packages.
func All () []step.FuncProvider {
return []step.FuncProvider {
new(fpsprig.Provider),
new(fpos.Provider),
new(fpsprig.Provider),
new(fpmarkdown.Provider),
}
}

View File

@@ -0,0 +1,50 @@
package markdown
import "fmt"
import "bytes"
import "strings"
import "html/template"
import "github.com/yuin/goldmark"
import "github.com/yuin/goldmark/parser"
import "git.tebibyte.media/sashakoshka/step"
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
}
// FuncMap fulfills the step.FuncProvider interface.
func (this *Provider) FuncMap () template.FuncMap {
stat := &state {
options: this.Options,
}
return template.FuncMap {
"markdown": stat.funcMarkdown,
}
}
type state struct {
options []parser.ParseOption
}
func (this *state) funcMarkdown (input any) (template.HTML, error) {
builder := strings.Builder { }
err := goldmark.Convert(toBytes(input), &builder, this.options...)
if err != nil { return "", nil }
return template.HTML(builder.String()), nil
}
func toBytes (data any) []byte {
switch data := data.(type) {
case []byte: return data
case string: return []byte(data)
case template.HTML: return []byte(data)
default:
buffer := bytes.Buffer { }
fmt.Fprint(&buffer, data)
return buffer.Bytes()
}
}