mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Make cross-reference issue links work in markdown documents again (#28682)
In #26365 issue references were disabled entirely for documents, intending to match GitHub behavior. However cross-references do appear to work in documents on GitHub. This is useful for example to write release notes in a markdown document and reference issues. While the simpler syntax may create links when not intended, hopefully the cross-reference syntax is unique enough to avoid it.
This commit is contained in:
		 Brecht Van Lommel
					Brecht Van Lommel
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						GitHub
					
				
			
						parent
						
							91aa263225
						
					
				
				
					commit
					12c0487e01
				
			| @@ -852,11 +852,14 @@ func fullIssuePatternProcessor(ctx *RenderContext, node *html.Node) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func issueIndexPatternProcessor(ctx *RenderContext, node *html.Node) { | func issueIndexPatternProcessor(ctx *RenderContext, node *html.Node) { | ||||||
| 	// FIXME: the use of "mode" is quite dirty and hacky, for example: what is a "document"? how should it be rendered? | 	if ctx.Metas == nil { | ||||||
| 	// The "mode" approach should be refactored to some other more clear&reliable way. |  | ||||||
| 	if ctx.Metas == nil || (ctx.Metas["mode"] == "document" && !ctx.IsWiki) { |  | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	// FIXME: the use of "mode" is quite dirty and hacky, for example: what is a "document"? how should it be rendered? | ||||||
|  | 	// The "mode" approach should be refactored to some other more clear&reliable way. | ||||||
|  | 	crossLinkOnly := (ctx.Metas["mode"] == "document" && !ctx.IsWiki) | ||||||
|  |  | ||||||
| 	var ( | 	var ( | ||||||
| 		found bool | 		found bool | ||||||
| 		ref   *references.RenderizableReference | 		ref   *references.RenderizableReference | ||||||
| @@ -870,7 +873,7 @@ func issueIndexPatternProcessor(ctx *RenderContext, node *html.Node) { | |||||||
| 		// Repos with external issue trackers might still need to reference local PRs | 		// Repos with external issue trackers might still need to reference local PRs | ||||||
| 		// We need to concern with the first one that shows up in the text, whichever it is | 		// We need to concern with the first one that shows up in the text, whichever it is | ||||||
| 		isNumericStyle := ctx.Metas["style"] == "" || ctx.Metas["style"] == IssueNameStyleNumeric | 		isNumericStyle := ctx.Metas["style"] == "" || ctx.Metas["style"] == IssueNameStyleNumeric | ||||||
| 		foundNumeric, refNumeric := references.FindRenderizableReferenceNumeric(node.Data, hasExtTrackFormat && !isNumericStyle) | 		foundNumeric, refNumeric := references.FindRenderizableReferenceNumeric(node.Data, hasExtTrackFormat && !isNumericStyle, crossLinkOnly) | ||||||
|  |  | ||||||
| 		switch ctx.Metas["style"] { | 		switch ctx.Metas["style"] { | ||||||
| 		case "", IssueNameStyleNumeric: | 		case "", IssueNameStyleNumeric: | ||||||
|   | |||||||
| @@ -561,11 +561,16 @@ func TestPostProcess_RenderDocument(t *testing.T) { | |||||||
| 		assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(res.String())) | 		assert.Equal(t, strings.TrimSpace(expected), strings.TrimSpace(res.String())) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Issue index shouldn't be post processing in an document. | 	// Issue index shouldn't be post processing in a document. | ||||||
| 	test( | 	test( | ||||||
| 		"#1", | 		"#1", | ||||||
| 		"#1") | 		"#1") | ||||||
|  |  | ||||||
|  | 	// But cross-referenced issue index should work. | ||||||
|  | 	test( | ||||||
|  | 		"go-gitea/gitea#12345", | ||||||
|  | 		`<a href="`+util.URLJoin(markup.TestAppURL, "go-gitea", "gitea", "issues", "12345")+`" class="ref-issue">go-gitea/gitea#12345</a>`) | ||||||
|  |  | ||||||
| 	// Test that other post processing still works. | 	// Test that other post processing still works. | ||||||
| 	test( | 	test( | ||||||
| 		":gitea:", | 		":gitea:", | ||||||
|   | |||||||
| @@ -331,8 +331,11 @@ func FindAllIssueReferences(content string) []IssueReference { | |||||||
| } | } | ||||||
|  |  | ||||||
| // FindRenderizableReferenceNumeric returns the first unvalidated reference found in a string. | // FindRenderizableReferenceNumeric returns the first unvalidated reference found in a string. | ||||||
| func FindRenderizableReferenceNumeric(content string, prOnly bool) (bool, *RenderizableReference) { | func FindRenderizableReferenceNumeric(content string, prOnly, crossLinkOnly bool) (bool, *RenderizableReference) { | ||||||
| 	match := issueNumericPattern.FindStringSubmatchIndex(content) | 	var match []int | ||||||
|  | 	if !crossLinkOnly { | ||||||
|  | 		match = issueNumericPattern.FindStringSubmatchIndex(content) | ||||||
|  | 	} | ||||||
| 	if match == nil { | 	if match == nil { | ||||||
| 		if match = crossReferenceIssueNumericPattern.FindStringSubmatchIndex(content); match == nil { | 		if match = crossReferenceIssueNumericPattern.FindStringSubmatchIndex(content); match == nil { | ||||||
| 			return false, nil | 			return false, nil | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user