From 620fb882ea2dec4e032f280583752fa05ddfe1ac Mon Sep 17 00:00:00 2001 From: mrsdizzie Date: Fri, 24 Jul 2020 17:11:54 -0400 Subject: [PATCH 1/2] Fix emoji detection certain cases Previous tests weren't complicated enough so there were some situations where emojis were't detected properly. Find the earliest occurance in addition to checking for the longest combination. Fixes #12312 --- modules/emoji/emoji.go | 19 ++++++++++++++++++- modules/markup/html_test.go | 4 ++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/modules/emoji/emoji.go b/modules/emoji/emoji.go index e2c3d202e2fd7..bd8922c170c42 100644 --- a/modules/emoji/emoji.go +++ b/modules/emoji/emoji.go @@ -130,6 +130,8 @@ func ReplaceAliases(s string) string { // FindEmojiSubmatchIndex returns index pair of longest emoji in a string func FindEmojiSubmatchIndex(s string) []int { loadMap() + found := make(map[int]int) + keys := make([]int, 0) //see if there are any emoji in string before looking for position of specific ones //no performance difference when there is a match but 10x faster when there are not @@ -137,11 +139,26 @@ func FindEmojiSubmatchIndex(s string) []int { return nil } + // get index of first emoji occurance while also checking for longest combination for j := range GemojiData { i := strings.Index(s, GemojiData[j].Emoji) if i != -1 { - return []int{i, i + len(GemojiData[j].Emoji)} + if _, ok := found[i]; !ok { + if len(keys) == 0 || i < keys[0] { + found[i] = j + keys = []int{i} + } + if i == 0 { + break + } + } } } + + if len(keys) > 0 { + index := keys[0] + return []int{index, index + len(GemojiData[found[index]].Emoji)} + } + return nil } diff --git a/modules/markup/html_test.go b/modules/markup/html_test.go index a73236a7a3004..69c4e675f593e 100644 --- a/modules/markup/html_test.go +++ b/modules/markup/html_test.go @@ -266,6 +266,10 @@ func TestRender_emoji(t *testing.T) { test( "Some text with 😄😄 2 emoji next to each other", `

Some text with 😄😄 2 emoji next to each other

`) + test( + "😎ðŸĪŠðŸ”ðŸĪ‘❓", + `

😎ðŸĪŠðŸ”ðŸĪ‘❓

`) + // should match nothing test( "2001:0db8:85a3:0000:0000:8a2e:0370:7334", From 2062949e7d3199d4ee8a832f7d0d361f91b2b36a Mon Sep 17 00:00:00 2001 From: mrsdizzie Date: Fri, 24 Jul 2020 17:25:57 -0400 Subject: [PATCH 2/2] ok spell bot --- modules/emoji/emoji.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/emoji/emoji.go b/modules/emoji/emoji.go index bd8922c170c42..169ee0a182d4d 100644 --- a/modules/emoji/emoji.go +++ b/modules/emoji/emoji.go @@ -139,7 +139,7 @@ func FindEmojiSubmatchIndex(s string) []int { return nil } - // get index of first emoji occurance while also checking for longest combination + // get index of first emoji occurrence while also checking for longest combination for j := range GemojiData { i := strings.Index(s, GemojiData[j].Emoji) if i != -1 {