mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 21:28:11 +09: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:
		
				
					committed by
					
						 techknowlogick
						techknowlogick
					
				
			
			
				
	
			
			
			
						parent
						
							ad86b843e1
						
					
				
				
					commit
					020075e12f
				
			| @@ -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>`) | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user