mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-24 23:33:33 +01:00
Remove visitLinksForShortLinks features (#6257)
The visitLinksForShortLinks feature would look inside of an <a> tag and run shortLinkProcessorFull on any text, which attempts to create links out of potential 'short links' like [[test]] [[link|example]] etc... This makes no sense because you can't have nested links within an <a> tag. Specifically, the html5 standard says <a> tags can't include interactive content if they contain the href attribute: http://w3c.github.io/html/single-page.html#the-a-element And also defines an <a> element with a href attribute as interactive: http://w3c.github.io/html/single-page.html#interactive-content Therefore you can't really put a link inside of another link. In practice none of this works anyways since browsers won't render it, it would probably be broken if they tried, and it is causing a bug (#4946). No current tests rely on this behavior either. This removes the feature and also explicitly excludes the current visitNodeForShortLinks from looking in <a> tags.
This commit is contained in:
parent
ad86b843e1
commit
020075e12f
2 changed files with 9 additions and 14 deletions
|
@ -171,11 +171,6 @@ type postProcessCtx struct {
|
||||||
|
|
||||||
// processors used by this context.
|
// processors used by this context.
|
||||||
procs []processor
|
procs []processor
|
||||||
|
|
||||||
// if set to true, when an <a> is found, instead of just returning during
|
|
||||||
// visitNode, it will recursively visit the node exclusively running
|
|
||||||
// shortLinkProcessorFull with true.
|
|
||||||
visitLinksForShortLinks bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// PostProcess does the final required transformations to the passed raw HTML
|
// PostProcess does the final required transformations to the passed raw HTML
|
||||||
|
@ -191,11 +186,10 @@ func PostProcess(
|
||||||
) ([]byte, error) {
|
) ([]byte, error) {
|
||||||
// create the context from the parameters
|
// create the context from the parameters
|
||||||
ctx := &postProcessCtx{
|
ctx := &postProcessCtx{
|
||||||
metas: metas,
|
metas: metas,
|
||||||
urlPrefix: urlPrefix,
|
urlPrefix: urlPrefix,
|
||||||
isWikiMarkdown: isWikiMarkdown,
|
isWikiMarkdown: isWikiMarkdown,
|
||||||
procs: defaultProcessors,
|
procs: defaultProcessors,
|
||||||
visitLinksForShortLinks: true,
|
|
||||||
}
|
}
|
||||||
return ctx.postProcess(rawHTML)
|
return ctx.postProcess(rawHTML)
|
||||||
}
|
}
|
||||||
|
@ -285,9 +279,6 @@ func (ctx *postProcessCtx) visitNode(node *html.Node) {
|
||||||
ctx.textNode(node)
|
ctx.textNode(node)
|
||||||
case html.ElementNode:
|
case html.ElementNode:
|
||||||
if node.Data == "a" || node.Data == "code" || node.Data == "pre" {
|
if node.Data == "a" || node.Data == "code" || node.Data == "pre" {
|
||||||
if node.Data == "a" && ctx.visitLinksForShortLinks {
|
|
||||||
ctx.visitNodeForShortLinks(node)
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for n := node.FirstChild; n != nil; n = n.NextSibling {
|
for n := node.FirstChild; n != nil; n = n.NextSibling {
|
||||||
|
@ -302,7 +293,7 @@ func (ctx *postProcessCtx) visitNodeForShortLinks(node *html.Node) {
|
||||||
case html.TextNode:
|
case html.TextNode:
|
||||||
shortLinkProcessorFull(ctx, node, true)
|
shortLinkProcessorFull(ctx, node, true)
|
||||||
case html.ElementNode:
|
case html.ElementNode:
|
||||||
if node.Data == "code" || node.Data == "pre" {
|
if node.Data == "code" || node.Data == "pre" || node.Data == "a" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
for n := node.FirstChild; n != nil; n = n.NextSibling {
|
for n := node.FirstChild; n != nil; n = n.NextSibling {
|
||||||
|
|
|
@ -222,4 +222,8 @@ func TestRender_ShortLinks(t *testing.T) {
|
||||||
"[[some/path/Link #.jpg]]",
|
"[[some/path/Link #.jpg]]",
|
||||||
`<p><a href="`+notencodedImgurl+`" rel="nofollow"><img src="`+notencodedImgurl+`"/></a></p>`,
|
`<p><a href="`+notencodedImgurl+`" rel="nofollow"><img src="`+notencodedImgurl+`"/></a></p>`,
|
||||||
`<p><a href="`+notencodedImgurlWiki+`" rel="nofollow"><img src="`+notencodedImgurlWiki+`"/></a></p>`)
|
`<p><a href="`+notencodedImgurlWiki+`" rel="nofollow"><img src="`+notencodedImgurlWiki+`"/></a></p>`)
|
||||||
|
test(
|
||||||
|
"<p><a href=\"https://example.org\">[[foobar]]</a></p>",
|
||||||
|
`<p><a href="https://example.org" rel="nofollow">[[foobar]]</a></p>`,
|
||||||
|
`<p><a href="https://example.org" rel="nofollow">[[foobar]]</a></p>`)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue