mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Alternate syntax for cross references (#9116)
* Add support for local vs. remote xrefs * Add doc for references * Docs: fix cases not currently supported * One more doc fix * Doc: mentions for teams and orgs * Change !num ref concept, no change in functionality * Fix test * Improve table of issue reference types * Fix paragraph mark
This commit is contained in:
		@@ -640,10 +640,19 @@ func issueIndexPatternProcessor(ctx *postProcessCtx, node *html.Node) {
 | 
			
		||||
		ref   *references.RenderizableReference
 | 
			
		||||
	)
 | 
			
		||||
 | 
			
		||||
	if ctx.metas["style"] == IssueNameStyleAlphanumeric {
 | 
			
		||||
		found, ref = references.FindRenderizableReferenceAlphanumeric(node.Data)
 | 
			
		||||
	} else {
 | 
			
		||||
		found, ref = references.FindRenderizableReferenceNumeric(node.Data)
 | 
			
		||||
	_, exttrack := ctx.metas["format"]
 | 
			
		||||
	alphanum := ctx.metas["style"] == IssueNameStyleAlphanumeric
 | 
			
		||||
 | 
			
		||||
	// 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
 | 
			
		||||
	found, ref = references.FindRenderizableReferenceNumeric(node.Data, exttrack && alphanum)
 | 
			
		||||
	if exttrack && alphanum {
 | 
			
		||||
		if found2, ref2 := references.FindRenderizableReferenceAlphanumeric(node.Data); found2 {
 | 
			
		||||
			if !found || ref2.RefLocation.Start < ref.RefLocation.Start {
 | 
			
		||||
				found = true
 | 
			
		||||
				ref = ref2
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if !found {
 | 
			
		||||
		return
 | 
			
		||||
@@ -651,13 +660,22 @@ func issueIndexPatternProcessor(ctx *postProcessCtx, node *html.Node) {
 | 
			
		||||
 | 
			
		||||
	var link *html.Node
 | 
			
		||||
	reftext := node.Data[ref.RefLocation.Start:ref.RefLocation.End]
 | 
			
		||||
	if _, ok := ctx.metas["format"]; ok {
 | 
			
		||||
	if exttrack && !ref.IsPull {
 | 
			
		||||
		ctx.metas["index"] = ref.Issue
 | 
			
		||||
		link = createLink(com.Expand(ctx.metas["format"], ctx.metas), reftext, "issue")
 | 
			
		||||
	} else if ref.Owner == "" {
 | 
			
		||||
		link = createLink(util.URLJoin(setting.AppURL, ctx.metas["user"], ctx.metas["repo"], "issues", ref.Issue), reftext, "issue")
 | 
			
		||||
	} else {
 | 
			
		||||
		link = createLink(util.URLJoin(setting.AppURL, ref.Owner, ref.Name, "issues", ref.Issue), reftext, "issue")
 | 
			
		||||
		// Path determines the type of link that will be rendered. It's unknown at this point whether
 | 
			
		||||
		// the linked item is actually a PR or an issue. Luckily it's of no real consequence because
 | 
			
		||||
		// Gitea will redirect on click as appropriate.
 | 
			
		||||
		path := "issues"
 | 
			
		||||
		if ref.IsPull {
 | 
			
		||||
			path = "pulls"
 | 
			
		||||
		}
 | 
			
		||||
		if ref.Owner == "" {
 | 
			
		||||
			link = createLink(util.URLJoin(setting.AppURL, ctx.metas["user"], ctx.metas["repo"], path, ref.Issue), reftext, "issue")
 | 
			
		||||
		} else {
 | 
			
		||||
			link = createLink(util.URLJoin(setting.AppURL, ref.Owner, ref.Name, path, ref.Issue), reftext, "issue")
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if ref.Action == references.XRefActionNone {
 | 
			
		||||
@@ -667,7 +685,7 @@ func issueIndexPatternProcessor(ctx *postProcessCtx, node *html.Node) {
 | 
			
		||||
 | 
			
		||||
	// Decorate action keywords if actionable
 | 
			
		||||
	var keyword *html.Node
 | 
			
		||||
	if references.IsXrefActionable(ref.Action) {
 | 
			
		||||
	if references.IsXrefActionable(ref, exttrack, alphanum) {
 | 
			
		||||
		keyword = createKeyword(node.Data[ref.ActionLocation.Start:ref.ActionLocation.End])
 | 
			
		||||
	} else {
 | 
			
		||||
		keyword = &html.Node{
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user