diff options
author | KN4CK3R <admin@oldschoolhack.me> | 2021-12-16 00:49:12 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-12-15 23:49:12 +0000 |
commit | b748acf2a04b756ba14e4258159e7f292fc5c4c0 (patch) | |
tree | 4e7222c3f0e96109d8500b04c031240021574d09 /modules/markup | |
parent | f58e687a83b18d58298097d485f4febf98062dd7 (diff) | |
download | gitea-b748acf2a04b756ba14e4258159e7f292fc5c4c0.tar.gz gitea-b748acf2a04b756ba14e4258159e7f292fc5c4c0.zip |
Fixed emoji alias not parsed in links (#16221)
* Do not skip links.
* Restrict text in links to emojis.
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: zeripath <art27@cantab.net>
Diffstat (limited to 'modules/markup')
-rw-r--r-- | modules/markup/html.go | 17 | ||||
-rw-r--r-- | modules/markup/markdown/markdown_test.go | 8 |
2 files changed, 16 insertions, 9 deletions
diff --git a/modules/markup/html.go b/modules/markup/html.go index c47ecc165f..827be1a9af 100644 --- a/modules/markup/html.go +++ b/modules/markup/html.go @@ -322,7 +322,7 @@ func postProcess(ctx *RenderContext, procs []processor, input io.Reader, output node = node.FirstChild } - visitNode(ctx, procs, node, true) + visitNode(ctx, procs, procs, node) newNodes := make([]*html.Node, 0, 5) @@ -354,7 +354,7 @@ func postProcess(ctx *RenderContext, procs []processor, input io.Reader, output return nil } -func visitNode(ctx *RenderContext, procs []processor, node *html.Node, visitText bool) { +func visitNode(ctx *RenderContext, procs, textProcs []processor, node *html.Node) { // Add user-content- to IDs if they don't already have them for idx, attr := range node.Attr { if attr.Key == "id" && !(strings.HasPrefix(attr.Val, "user-content-") || blackfridayExtRegex.MatchString(attr.Val)) { @@ -362,16 +362,14 @@ func visitNode(ctx *RenderContext, procs []processor, node *html.Node, visitText } if attr.Key == "class" && attr.Val == "emoji" { - visitText = false + textProcs = nil } } - // We ignore code, pre and already generated links. + // We ignore code and pre. switch node.Type { case html.TextNode: - if visitText { - textNode(ctx, procs, node) - } + textNode(ctx, textProcs, node) case html.ElementNode: if node.Data == "img" { for i, attr := range node.Attr { @@ -390,7 +388,8 @@ func visitNode(ctx *RenderContext, procs []processor, node *html.Node, visitText node.Attr[i] = attr } } else if node.Data == "a" { - visitText = false + // Restrict text in links to emojis + textProcs = emojiProcessors } else if node.Data == "code" || node.Data == "pre" { return } else if node.Data == "i" { @@ -416,7 +415,7 @@ func visitNode(ctx *RenderContext, procs []processor, node *html.Node, visitText } } for n := node.FirstChild; n != nil; n = n.NextSibling { - visitNode(ctx, procs, n, visitText) + visitNode(ctx, procs, textProcs, n) } } // ignore everything else diff --git a/modules/markup/markdown/markdown_test.go b/modules/markup/markdown/markdown_test.go index 936e4a39fd..083484813a 100644 --- a/modules/markup/markdown/markdown_test.go +++ b/modules/markup/markdown/markdown_test.go @@ -391,5 +391,13 @@ func TestRenderSiblingImages_Issue12925(t *testing.T) { res, err := RenderRawString(&markup.RenderContext{}, testcase) assert.NoError(t, err) assert.Equal(t, expected, res) +} +func TestRenderEmojiInLinks_Issue12331(t *testing.T) { + testcase := `[Link with emoji :moon: in text](https://gitea.io)` + expected := `<p><a href="https://gitea.io" rel="nofollow">Link with emoji <span class="emoji" aria-label="waxing gibbous moon">🌔</span> in text</a></p> +` + res, err := RenderString(&markup.RenderContext{}, testcase) + assert.NoError(t, err) + assert.Equal(t, expected, res) } |