Skip to content

Commit

Permalink
Fix emoji detection in certain cases (go-gitea#12320)
Browse files Browse the repository at this point in the history
* 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 go-gitea#12312

* ok spell bot

Co-authored-by: Lauris BH <lauris@nix.lv>
  • Loading branch information
2 people authored and silverwind committed Jul 25, 2020
1 parent 8d1cd4d commit 9a79b47
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
19 changes: 18 additions & 1 deletion modules/emoji/emoji.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,18 +130,35 @@ 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
if s == ReplaceCodes(s) {
return nil
}

// 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 {
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
}
4 changes: 4 additions & 0 deletions modules/markup/html_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,10 @@ func TestRender_emoji(t *testing.T) {
test(
"Some text with πŸ˜„πŸ˜„ 2 emoji next to each other",
`<p>Some text with <span class="emoji" aria-label="grinning face with smiling eyes">πŸ˜„</span><span class="emoji" aria-label="grinning face with smiling eyes">πŸ˜„</span> 2 emoji next to each other</p>`)
test(
"😎πŸ€ͺπŸ”πŸ€‘β“",
`<p><span class="emoji" aria-label="smiling face with sunglasses">😎</span><span class="emoji" aria-label="zany face">πŸ€ͺ</span><span class="emoji" aria-label="locked with key">πŸ”</span><span class="emoji" aria-label="money-mouth face">πŸ€‘</span><span class="emoji" aria-label="question mark">❓</span></p>`)

// should match nothing
test(
"2001:0db8:85a3:0000:0000:8a2e:0370:7334",
Expand Down

0 comments on commit 9a79b47

Please sign in to comment.