owl-blogs/render/templates.go

103 lines
2.0 KiB
Go

package render
import (
"bytes"
"embed"
"io"
"net/url"
"owl-blogs/domain/model"
"text/template"
"github.com/yuin/goldmark"
"github.com/yuin/goldmark/extension"
"github.com/yuin/goldmark/parser"
"github.com/yuin/goldmark/renderer/html"
)
type TemplateData struct {
Data interface{}
SiteConfig model.SiteConfig
}
//go:embed templates
var templates embed.FS
var SiteConfigService model.SiteConfigInterface
var funcMap = template.FuncMap{
"markdown": func(text string) string {
html, err := RenderMarkdown(text)
if err != nil {
return ">>>could not render markdown<<<"
}
return html
},
"urljoin": func(elems ...string) string {
r, _ := url.JoinPath(elems[0], elems[1:]...)
return r
},
}
func CreateTemplateWithBase(templateName string) (*template.Template, error) {
return template.New(templateName).Funcs(funcMap).ParseFS(
templates,
"templates/base.tmpl",
"templates/"+templateName+".tmpl",
)
}
func RenderTemplateWithBase(w io.Writer, templateName string, data interface{}) error {
t, err := CreateTemplateWithBase(templateName)
if err != nil {
return err
}
siteConfig, err := SiteConfigService.GetSiteConfig()
if err != nil {
return err
}
err = t.ExecuteTemplate(w, "base", TemplateData{
Data: data,
SiteConfig: siteConfig,
})
return err
}
func RenderTemplateToString(templateName string, data interface{}) (string, error) {
tmplStr, _ := templates.ReadFile("templates/" + templateName + ".tmpl")
t, err := template.New("templates/" + templateName + ".tmpl").Funcs(funcMap).Parse(string(tmplStr))
if err != nil {
return "", err
}
var output bytes.Buffer
err = t.Execute(&output, data)
return output.String(), err
}
func RenderMarkdown(mdText string) (string, error) {
markdown := goldmark.New(
goldmark.WithRendererOptions(
html.WithUnsafe(),
),
goldmark.WithExtensions(
// meta.Meta,
extension.GFM,
),
)
var buf bytes.Buffer
context := parser.NewContext()
err := markdown.Convert([]byte(mdText), &buf, parser.WithContext(context))
return buf.String(), err
}