weiro/providers/markdown/renderer.go
Leon Mika 199ff9feb9 More changes to uploads:
- Have got upload images appearing in the post list
- Allowed for deleting uploads
- Allowed for seeing the upload progress
- Fixed the setting of upload properties like the MIME type
- Removed the stripe exif logic with just re-encoding PNGs and JPEGs by loading them and saving them
2026-03-04 22:33:39 +11:00

87 lines
1.8 KiB
Go

package markdown
import (
"context"
"fmt"
"io"
"strings"
"github.com/microcosm-cc/bluemonday"
"github.com/yuin/goldmark"
"github.com/yuin/goldmark/extension"
"github.com/yuin/goldmark/parser"
gm_html "github.com/yuin/goldmark/renderer/html"
"lmika.dev/lmika/weiro/models"
)
type Renderer struct {
mdParser goldmark.Markdown
bmPolicy *bluemonday.Policy
htmlTransforms []htmlTransform
}
func NewRendererForUI() *Renderer {
mdParser := goldmark.New(
goldmark.WithExtensions(extension.GFM),
goldmark.WithRendererOptions(
gm_html.WithUnsafe(),
),
)
bmPolicy := bluemonday.UGCPolicy()
return &Renderer{
mdParser: mdParser,
bmPolicy: bmPolicy,
htmlTransforms: []htmlTransform{
rewriteImgSrc(func(ctx context.Context, src string) string {
if strings.HasPrefix(src, "/uploads/") {
if site, ok := models.GetSite(ctx); ok {
return fmt.Sprintf("/sites/%v/uploads/slug/%v", site.ID, strings.TrimPrefix(src, "/uploads/"))
}
return src
}
return src
}),
},
}
}
func NewRendererForSite() *Renderer {
mdParser := goldmark.New(
goldmark.WithExtensions(extension.GFM),
goldmark.WithParserOptions(
parser.WithAutoHeadingID(),
),
goldmark.WithRendererOptions(
gm_html.WithUnsafe(),
),
)
return &Renderer{
mdParser: mdParser,
}
}
func (r *Renderer) Render(ctx context.Context, in string) (string, error) {
var sb strings.Builder
if err := r.mdParser.Convert([]byte(in), &sb); err != nil {
return "", err
}
outHTML := applyTransforms(ctx, sb.String(), r.htmlTransforms)
if r.bmPolicy != nil {
return r.bmPolicy.Sanitize(outHTML), nil
}
return sb.String(), nil
}
func (r *Renderer) RenderTo(ctx context.Context, w io.Writer, in string) error {
s, err := r.Render(ctx, in)
if err != nil {
return err
}
_, err = w.Write([]byte(s))
return err
}