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
					
				| @ -171,11 +171,6 @@ type postProcessCtx struct { | ||||
| 
 | ||||
| 	// processors used by this context.
 | ||||
| 	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
 | ||||
| @ -191,11 +186,10 @@ func PostProcess( | ||||
| ) ([]byte, error) { | ||||
| 	// create the context from the parameters
 | ||||
| 	ctx := &postProcessCtx{ | ||||
| 		metas:                   metas, | ||||
| 		urlPrefix:               urlPrefix, | ||||
| 		isWikiMarkdown:          isWikiMarkdown, | ||||
| 		procs:                   defaultProcessors, | ||||
| 		visitLinksForShortLinks: true, | ||||
| 		metas:          metas, | ||||
| 		urlPrefix:      urlPrefix, | ||||
| 		isWikiMarkdown: isWikiMarkdown, | ||||
| 		procs:          defaultProcessors, | ||||
| 	} | ||||
| 	return ctx.postProcess(rawHTML) | ||||
| } | ||||
| @ -285,9 +279,6 @@ func (ctx *postProcessCtx) visitNode(node *html.Node) { | ||||
| 		ctx.textNode(node) | ||||
| 	case html.ElementNode: | ||||
| 		if node.Data == "a" || node.Data == "code" || node.Data == "pre" { | ||||
| 			if node.Data == "a" && ctx.visitLinksForShortLinks { | ||||
| 				ctx.visitNodeForShortLinks(node) | ||||
| 			} | ||||
| 			return | ||||
| 		} | ||||
| 		for n := node.FirstChild; n != nil; n = n.NextSibling { | ||||
| @ -302,7 +293,7 @@ func (ctx *postProcessCtx) visitNodeForShortLinks(node *html.Node) { | ||||
| 	case html.TextNode: | ||||
| 		shortLinkProcessorFull(ctx, node, true) | ||||
| 	case html.ElementNode: | ||||
| 		if node.Data == "code" || node.Data == "pre" { | ||||
| 		if node.Data == "code" || node.Data == "pre" || node.Data == "a" { | ||||
| 			return | ||||
| 		} | ||||
| 		for n := node.FirstChild; n != nil; n = n.NextSibling { | ||||
|  | ||||
| @ -222,4 +222,8 @@ func TestRender_ShortLinks(t *testing.T) { | ||||
| 		"[[some/path/Link #.jpg]]", | ||||
| 		`<p><a href="`+notencodedImgurl+`" rel="nofollow"><img src="`+notencodedImgurl+`"/></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 New Issue
	
	Block a user