Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fixed emoji alias not parsed in links #16221

Merged
merged 9 commits into from
Dec 15, 2021
17 changes: 8 additions & 9 deletions modules/markup/html.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -354,24 +354,22 @@ 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)) {
node.Attr[idx].Val = "user-content-" + attr.Val
}

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 {
Expand All @@ -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" {
Expand All @@ -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
Expand Down
8 changes: 8 additions & 0 deletions modules/markup/markdown/markdown_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}