46 lines
1.0 KiB
Go
46 lines
1.0 KiB
Go
package markdown
|
|
|
|
import (
|
|
"bytes"
|
|
"html/template"
|
|
|
|
"github.com/microcosm-cc/bluemonday"
|
|
"github.com/yuin/goldmark"
|
|
highlighting "github.com/yuin/goldmark-highlighting/v2"
|
|
"github.com/yuin/goldmark/extension"
|
|
"github.com/yuin/goldmark/renderer/html"
|
|
)
|
|
|
|
var (
|
|
md goldmark.Markdown
|
|
policy *bluemonday.Policy
|
|
)
|
|
|
|
func init() {
|
|
md = goldmark.New(
|
|
goldmark.WithExtensions(
|
|
extension.GFM,
|
|
highlighting.NewHighlighting(
|
|
highlighting.WithStyle("github"),
|
|
),
|
|
),
|
|
goldmark.WithRendererOptions(
|
|
html.WithHardWraps(),
|
|
),
|
|
)
|
|
|
|
policy = bluemonday.UGCPolicy()
|
|
policy.AllowAttrs("class").OnElements("code", "pre", "span", "div")
|
|
policy.AllowAttrs("style").OnElements("span", "pre", "code")
|
|
}
|
|
|
|
// RenderMarkdown converts markdown text to sanitized HTML.
|
|
func RenderMarkdown(input string) template.HTML {
|
|
var buf bytes.Buffer
|
|
if err := md.Convert([]byte(input), &buf); err != nil {
|
|
return template.HTML(template.HTMLEscapeString(input))
|
|
}
|
|
sanitized := policy.SanitizeBytes(buf.Bytes())
|
|
return template.HTML(sanitized)
|
|
}
|