From c9b8c12bc9d9cfa0618293fe9bb700c602bb569d Mon Sep 17 00:00:00 2001
From: 6543 <24977596+6543@users.noreply.github.com>
Date: Mon, 7 Oct 2019 05:41:46 +0200
Subject: [PATCH] feat: highlight issue references with : (#8101) (#8404)

* feat: highlight issue references with :

e.g. #1287: my commit msg
e.g. ABC-1234: my commit msg

* ref: update model regex to consistent with issueNumericPattern

* test: check highlight issue with : in commits messages
---
 models/action.go                     | 2 +-
 models/action_test.go                | 1 +
 modules/markup/html.go               | 4 ++--
 modules/markup/html_internal_test.go | 7 +++++++
 4 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/models/action.go b/models/action.go
index a092f564bf..7011f216c3 100644
--- a/models/action.go
+++ b/models/action.go
@@ -65,7 +65,7 @@ var (
 )
 
 const issueRefRegexpStr = `(?:([0-9a-zA-Z-_\.]+)/([0-9a-zA-Z-_\.]+))?(#[0-9]+)+`
-const issueRefRegexpStrNoKeyword = `(?:\s|^|\(|\[)(?:([0-9a-zA-Z-_\.]+)/([0-9a-zA-Z-_\.]+))?(#[0-9]+)(?:\s|$|\)|\]|\.(\s|$))`
+const issueRefRegexpStrNoKeyword = `(?:\s|^|\(|\[)(?:([0-9a-zA-Z-_\.]+)/([0-9a-zA-Z-_\.]+))?(#[0-9]+)(?:\s|$|\)|\]|:|\.(\s|$))`
 
 func assembleKeywordsPattern(words []string) string {
 	return fmt.Sprintf(`(?i)(?:%s)(?::?) %s`, strings.Join(words, "|"), issueRefRegexpStr)
diff --git a/models/action_test.go b/models/action_test.go
index da50ebce80..93ee585101 100644
--- a/models/action_test.go
+++ b/models/action_test.go
@@ -160,6 +160,7 @@ func TestRegExp_issueReferenceKeywordsPat(t *testing.T) {
 		"#2",
 		"[#2]",
 		"please see go-gitea/gitea#5",
+		"#2:",
 	}
 	falseTestCases := []string{
 		"kb#2",
diff --git a/modules/markup/html.go b/modules/markup/html.go
index 3e976929c7..4d5ca852a1 100644
--- a/modules/markup/html.go
+++ b/modules/markup/html.go
@@ -38,9 +38,9 @@ var (
 	mentionPattern = regexp.MustCompile(`(?:\s|^|\(|\[)(@[0-9a-zA-Z-_\.]+)(?:\s|$|\)|\])`)
 
 	// issueNumericPattern matches string that references to a numeric issue, e.g. #1287
-	issueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[)(#[0-9]+)(?:\s|$|\)|\]|\.(\s|$))`)
+	issueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[)(#[0-9]+)(?:\s|$|\)|\]|:|\.(\s|$))`)
 	// issueAlphanumericPattern matches string that references to an alphanumeric issue, e.g. ABC-1234
-	issueAlphanumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([A-Z]{1,10}-[1-9][0-9]*)(?:\s|$|\)|\]|\.(\s|$))`)
+	issueAlphanumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([A-Z]{1,10}-[1-9][0-9]*)(?:\s|$|\)|\]|:|\.(\s|$))`)
 	// crossReferenceIssueNumericPattern matches string that references a numeric issue in a different repository
 	// e.g. gogits/gogs#12345
 	crossReferenceIssueNumericPattern = regexp.MustCompile(`(?:\s|^|\(|\[)([0-9a-zA-Z-_\.]+/[0-9a-zA-Z-_\.]+#[0-9]+)(?:\s|$|\)|\]|\.(\s|$))`)
diff --git a/modules/markup/html_internal_test.go b/modules/markup/html_internal_test.go
index f0d894532b..bb47ba3b2c 100644
--- a/modules/markup/html_internal_test.go
+++ b/modules/markup/html_internal_test.go
@@ -118,6 +118,10 @@ func TestRender_IssueIndexPattern2(t *testing.T) {
 	test("wow (#54321 #1243)", "wow (%s %s)", 54321, 1243)
 	test("(#4)(#5)", "(%s)(%s)", 4, 5)
 	test("#1 (#4321) test", "%s (%s) test", 1, 4321)
+
+	// should render with :
+	test("#1234: test", "%s: test", 1234)
+	test("wow (#54321: test)", "wow (%s: test)", 54321)
 }
 
 func TestRender_IssueIndexPattern3(t *testing.T) {
@@ -237,6 +241,8 @@ func TestRegExp_issueNumericPattern(t *testing.T) {
 		"#0",
 		"#1234567890987654321",
 		"  #12",
+		"#12:",
+		"ref: #12: msg",
 	}
 	falseTestCases := []string{
 		"# 1234",
@@ -354,6 +360,7 @@ func TestRegExp_issueAlphanumericPattern(t *testing.T) {
 		"ABC-123.",
 		"(ABC-123)",
 		"[ABC-123]",
+		"ABC-123:",
 	}
 	falseTestCases := []string{
 		"RC-08",