diff options
author | 2022-08-31 11:40:11 -0400 | |
---|---|---|
committer | 2022-08-31 17:40:11 +0200 | |
commit | f01492ae4899aa6219f29a127da2e749ebf64c30 (patch) | |
tree | 6bbe9b3439eae3b379a0e55884971b6d405ec59f /internal/text/markdown.go | |
parent | [chore] Test fixes (#788) (diff) | |
download | gotosocial-f01492ae4899aa6219f29a127da2e749ebf64c30.tar.xz |
[bugfix] Use custom blackfriday renderer to only add mention/hashtag links in normal text (#787)
* Use custom blackfriday renderer to only add mention/hashtag links in normal text
* Add additional markdown tests
Diffstat (limited to 'internal/text/markdown.go')
-rw-r--r-- | internal/text/markdown.go | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/internal/text/markdown.go b/internal/text/markdown.go index 13fb93378..1382cbf61 100644 --- a/internal/text/markdown.go +++ b/internal/text/markdown.go @@ -19,7 +19,9 @@ package text import ( + "bytes" "context" + "io" "github.com/russross/blackfriday/v2" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" @@ -33,18 +35,51 @@ var ( m *minify.M ) +type renderer struct { + f *formatter + ctx context.Context + mentions []*gtsmodel.Mention + tags []*gtsmodel.Tag + blackfriday.HTMLRenderer +} + +func (r *renderer) RenderNode(w io.Writer, node *blackfriday.Node, entering bool) blackfriday.WalkStatus { + if node.Type == blackfriday.Text { + // call RenderNode to do the html escaping + var buff bytes.Buffer + status := r.HTMLRenderer.RenderNode(&buff, node, entering) + + html := buff.String() + html = r.f.ReplaceTags(r.ctx, html, r.tags) + html = r.f.ReplaceMentions(r.ctx, html, r.mentions) + + // we don't have much recourse if this fails + _, err := io.WriteString(w, html) + if err != nil { + log.Errorf("error outputting markdown text: %s", err) + } + return status + } + return r.HTMLRenderer.RenderNode(w, node, entering) +} + func (f *formatter) FromMarkdown(ctx context.Context, md string, mentions []*gtsmodel.Mention, tags []*gtsmodel.Tag) string { - // format tags nicely - content := f.ReplaceTags(ctx, md, tags) - // format mentions nicely - content = f.ReplaceMentions(ctx, content, mentions) + renderer := &renderer{ + f: f, + ctx: ctx, + mentions: mentions, + tags: tags, + HTMLRenderer: *blackfriday.NewHTMLRenderer(blackfriday.HTMLRendererParameters{ + Flags: blackfriday.CommonHTMLFlags, + }), + } - // parse markdown - contentBytes := blackfriday.Run([]byte(content), blackfriday.WithExtensions(bfExtensions)) + // parse markdown, use custom renderer to add hashtag/mention links + contentBytes := blackfriday.Run([]byte(md), blackfriday.WithExtensions(bfExtensions), blackfriday.WithRenderer(renderer)) // clean anything dangerous out of it - content = SanitizeHTML(string(contentBytes)) + content := SanitizeHTML(string(contentBytes)) if m == nil { m = minify.New() |