cpolis/cmd/backend/markdown.go

52 lines
1.1 KiB
Go
Raw Normal View History

package backend
import (
"bytes"
"fmt"
2024-02-22 15:22:45 +01:00
"github.com/microcosm-cc/bluemonday"
"github.com/yuin/goldmark"
2025-03-01 09:37:30 +01:00
"github.com/yuin/goldmark/extension"
2025-03-01 09:37:56 +01:00
"github.com/yuin/goldmark/parser"
"github.com/yuin/goldmark/renderer/html"
)
2024-02-18 12:41:49 +01:00
func ConvertToHTML(md string) (string, error) {
var buf bytes.Buffer
2025-03-01 09:37:30 +01:00
gm := goldmark.New(
goldmark.WithExtensions(
extension.GFM,
),
2025-03-01 09:37:56 +01:00
goldmark.WithParserOptions(
parser.WithAttribute(),
),
goldmark.WithRendererOptions(
html.WithUnsafe(), // HTML-Inhalte erlauben
),
2025-03-01 09:37:30 +01:00
)
if err := gm.Convert([]byte(md), &buf); err != nil {
2024-02-22 15:22:45 +01:00
return "", fmt.Errorf("error converting markdown to html: %v", err)
}
2024-02-22 15:22:45 +01:00
p := bluemonday.UGCPolicy()
p.AllowAttrs("id").OnElements("h1", "h2", "h3", "h4", "h5", "h6")
2024-02-22 15:22:45 +01:00
html := p.Sanitize(buf.String())
return html, nil
}
func ConvertToPlain(md string) (string, error) {
var buf bytes.Buffer
if err := goldmark.Convert([]byte(md), &buf); err != nil {
return "", fmt.Errorf("error converting markdown to html: %v", err)
}
p := bluemonday.StrictPolicy()
plain := p.Sanitize(buf.String())
return plain, nil
}