Improve issue references in markdown (#471)
* Improve issue references in markdown. (#3436) * Fix build * Fix lint * Fix comment typo
This commit is contained in:
		
					parent
					
						
							
								2342df183b
							
						
					
				
			
			
				commit
				
					
						71634452e1
					
				
			
		
					 1 changed files with 34 additions and 1 deletions
				
			
		| 
						 | 
					@ -91,6 +91,9 @@ var (
 | 
				
			||||||
	IssueNumericPattern = regexp.MustCompile(`( |^|\()#[0-9]+\b`)
 | 
						IssueNumericPattern = regexp.MustCompile(`( |^|\()#[0-9]+\b`)
 | 
				
			||||||
	// IssueAlphanumericPattern matches string that references to an alphanumeric issue, e.g. ABC-1234
 | 
						// IssueAlphanumericPattern matches string that references to an alphanumeric issue, e.g. ABC-1234
 | 
				
			||||||
	IssueAlphanumericPattern = regexp.MustCompile(`( |^|\()[A-Z]{1,10}-[1-9][0-9]*\b`)
 | 
						IssueAlphanumericPattern = regexp.MustCompile(`( |^|\()[A-Z]{1,10}-[1-9][0-9]*\b`)
 | 
				
			||||||
 | 
						// CrossReferenceIssueNumericPattern matches string that references a numeric issue in a different repository
 | 
				
			||||||
 | 
						// e.g. gogits/gogs#12345
 | 
				
			||||||
 | 
						CrossReferenceIssueNumericPattern = regexp.MustCompile(`( |^)[0-9a-zA-Z]+/[0-9a-zA-Z]+#[0-9]+\b`)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Sha1CurrentPattern matches string that represents a commit SHA, e.g. d8a994ef243349f321568f9e36d5c3f444b99cae
 | 
						// Sha1CurrentPattern matches string that represents a commit SHA, e.g. d8a994ef243349f321568f9e36d5c3f444b99cae
 | 
				
			||||||
	// FIXME: this pattern matches pure numbers as well, right now we do a hack to check in RenderSha1CurrentPattern
 | 
						// FIXME: this pattern matches pure numbers as well, right now we do a hack to check in RenderSha1CurrentPattern
 | 
				
			||||||
| 
						 | 
					@ -156,7 +159,19 @@ func (r *Renderer) AutoLink(out *bytes.Buffer, link []byte, kind int) {
 | 
				
			||||||
			if j == -1 {
 | 
								if j == -1 {
 | 
				
			||||||
				j = len(m)
 | 
									j = len(m)
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			out.WriteString(fmt.Sprintf(`<a href="%s">#%s</a>`, m, base.ShortSha(string(m[i+7:j]))))
 | 
					
 | 
				
			||||||
 | 
								issue := string(m[i+7 : j])
 | 
				
			||||||
 | 
								fullRepoURL := setting.AppURL + strings.TrimPrefix(r.urlPrefix, "/")
 | 
				
			||||||
 | 
								var link string
 | 
				
			||||||
 | 
								if strings.HasPrefix(string(m), fullRepoURL) {
 | 
				
			||||||
 | 
									// Use a short issue reference if the URL refers to this repository
 | 
				
			||||||
 | 
									link = fmt.Sprintf(`<a href="%s">#%s</a>`, m, issue)
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									// Use a cross-repository issue reference if the URL refers to a different repository
 | 
				
			||||||
 | 
									repo := string(m[len(setting.AppURL) : i-1])
 | 
				
			||||||
 | 
									link = fmt.Sprintf(`<a href="%s">%s#%s</a>`, m, repo, issue)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								out.WriteString(link)
 | 
				
			||||||
			return
 | 
								return
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -263,6 +278,23 @@ func RenderIssueIndexPattern(rawBytes []byte, urlPrefix string, metas map[string
 | 
				
			||||||
	return rawBytes
 | 
						return rawBytes
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// RenderCrossReferenceIssueIndexPattern renders issue indexes from other repositories to corresponding links.
 | 
				
			||||||
 | 
					func RenderCrossReferenceIssueIndexPattern(rawBytes []byte, urlPrefix string, metas map[string]string) []byte {
 | 
				
			||||||
 | 
						ms := CrossReferenceIssueNumericPattern.FindAll(rawBytes, -1)
 | 
				
			||||||
 | 
						for _, m := range ms {
 | 
				
			||||||
 | 
							if m[0] == ' ' || m[0] == '(' {
 | 
				
			||||||
 | 
								m = m[1:] // ignore leading space or opening parentheses
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							repo := string(bytes.Split(m, []byte("#"))[0])
 | 
				
			||||||
 | 
							issue := string(bytes.Split(m, []byte("#"))[1])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							link := fmt.Sprintf(`<a href="%s%s/issues/%s">%s</a>`, setting.AppURL, repo, issue, m)
 | 
				
			||||||
 | 
							rawBytes = bytes.Replace(rawBytes, m, []byte(link), 1)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return rawBytes
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// RenderSha1CurrentPattern renders SHA1 strings to corresponding links that assumes in the same repository.
 | 
					// RenderSha1CurrentPattern renders SHA1 strings to corresponding links that assumes in the same repository.
 | 
				
			||||||
func RenderSha1CurrentPattern(rawBytes []byte, urlPrefix string) []byte {
 | 
					func RenderSha1CurrentPattern(rawBytes []byte, urlPrefix string) []byte {
 | 
				
			||||||
	return []byte(Sha1CurrentPattern.ReplaceAllStringFunc(string(rawBytes[:]), func(m string) string {
 | 
						return []byte(Sha1CurrentPattern.ReplaceAllStringFunc(string(rawBytes[:]), func(m string) string {
 | 
				
			||||||
| 
						 | 
					@ -283,6 +315,7 @@ func RenderSpecialLink(rawBytes []byte, urlPrefix string, metas map[string]strin
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	rawBytes = RenderIssueIndexPattern(rawBytes, urlPrefix, metas)
 | 
						rawBytes = RenderIssueIndexPattern(rawBytes, urlPrefix, metas)
 | 
				
			||||||
 | 
						rawBytes = RenderCrossReferenceIssueIndexPattern(rawBytes, urlPrefix, metas)
 | 
				
			||||||
	rawBytes = RenderSha1CurrentPattern(rawBytes, urlPrefix)
 | 
						rawBytes = RenderSha1CurrentPattern(rawBytes, urlPrefix)
 | 
				
			||||||
	return rawBytes
 | 
						return rawBytes
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue