From c3e17da8c8ebd101d43ea9185821c44b651535b1 Mon Sep 17 00:00:00 2001 From: Harrison Healey Date: Fri, 28 Apr 2017 10:13:07 -0400 Subject: PLT-6271 Changed word splitting to initially split on any non-name character (#6261) * PLT-6271 Changed word splitting to initially split on any non-name character * Fixed detection of out of channel mentions --- app/notification.go | 18 +++++++++++------ app/notification_test.go | 52 +++++++++++++++++++++++------------------------- app/user_test.go | 2 +- model/utils.go | 2 -- 4 files changed, 38 insertions(+), 36 deletions(-) diff --git a/app/notification.go b/app/notification.go index c14701b5f..c48465003 100644 --- a/app/notification.go +++ b/app/notification.go @@ -665,8 +665,8 @@ func GetExplicitMentions(message string, keywords map[string][]string) (map[stri message = removeCodeFromMessage(message) for _, word := range strings.FieldsFunc(message, func(c rune) bool { - // Split on whitespace (as strings.Fields normally does) or on Markdown characters - return unicode.IsSpace(c) || c == '*' || c == '~' + // Split on any whitespace or punctuation that can't be part of an at mention + return !(c == '.' || c == '-' || c == '_' || c == '@' || unicode.IsLetter(c) || unicode.IsNumber(c)) }) { isMention := false @@ -694,11 +694,14 @@ func GetExplicitMentions(message string, keywords map[string][]string) (map[stri isMention = true } - if !isMention { - // No matches were found with the string split just on whitespace so try further splitting - // the message on punctuation + if isMention { + continue + } + + if strings.ContainsAny(word, ".-") { + // This word contains a character that may be the end of a sentence, so split further splitWords := strings.FieldsFunc(word, func(c rune) bool { - return model.SplitRunes[c] + return c == '.' || c == '-' }) for _, splitWord := range splitWords { @@ -727,6 +730,9 @@ func GetExplicitMentions(message string, keywords map[string][]string) (map[stri potentialOthersMentioned = append(potentialOthersMentioned, username) } } + } else if _, ok := systemMentions[word]; !ok && strings.HasPrefix(word, "@") { + username := word[1:] + potentialOthersMentioned = append(potentialOthersMentioned, username) } } diff --git a/app/notification_test.go b/app/notification_test.go index 1d5c82405..e59ba35d8 100644 --- a/app/notification_test.go +++ b/app/notification_test.go @@ -168,40 +168,38 @@ func TestGetExplicitMentionsAtHere(t *testing.T) { "here": false, "@here": true, " @here ": true, - "\t@here\t": true, "\n@here\n": true, - // "!@here!": true, - // "@@here@": true, - // "#@here#": true, - // "$@here$": true, - // "%@here%": true, - // "^@here^": true, - // "&@here&": true, - // "*@here*": true, - "(@here(": true, - ")@here)": true, - // "-@here-": true, - // "_@here_": true, - // "=@here=": true, + "!@here!": true, + "#@here#": true, + "$@here$": true, + "%@here%": true, + "^@here^": true, + "&@here&": true, + "*@here*": true, + "(@here(": true, + ")@here)": true, + "-@here-": true, + "_@here_": false, // This case shouldn't mention since it would be mentioning "@here_" + "=@here=": true, "+@here+": true, "[@here[": true, "{@here{": true, "]@here]": true, "}@here}": true, "\\@here\\": true, - // "|@here|": true, - ";@here;": true, - ":@here:": true, - // "'@here'": true, - // "\"@here\"": true, - ",@here,": true, - "<@here<": true, - ".@here.": true, - ">@here>": true, - "/@here/": true, - "?@here?": true, - // "`@here`": true, - // "~@here~": true, + "|@here|": true, + ";@here;": true, + ":@here:": true, + "'@here'": true, + "\"@here\"": true, + ",@here,": true, + "<@here<": true, + ".@here.": true, + ">@here>": true, + "/@here/": true, + "?@here?": true, + "`@here`": false, // This case shouldn't mention since it's a code block + "~@here~": true, } for message, shouldMention := range cases { diff --git a/app/user_test.go b/app/user_test.go index bc5d36ef5..76829caef 100644 --- a/app/user_test.go +++ b/app/user_test.go @@ -5,9 +5,9 @@ package app import ( "bytes" + "encoding/json" "image" "image/color" - "encoding/json" "math/rand" "strings" "testing" diff --git a/model/utils.go b/model/utils.go index cddf38166..d24540683 100644 --- a/model/utils.go +++ b/model/utils.go @@ -401,8 +401,6 @@ func ClearMentionTags(post string) string { var UrlRegex = regexp.MustCompile(`^((?:[a-z]+:\/\/)?(?:(?:[a-z0-9\-]+\.)+(?:[a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel|local|internal))(:[0-9]{1,5})?(?:\/[a-z0-9_\-\.~]+)*(\/([a-z0-9_\-\.]*)(?:\?[a-z0-9+_~\-\.%=&]*)?)?(?:#[a-zA-Z0-9!$&'()*+.=-_~:@/?]*)?)(?:\s+|$)$`) var PartialUrlRegex = regexp.MustCompile(`/([A-Za-z0-9]{26})/([A-Za-z0-9]{26})/((?:[A-Za-z0-9]{26})?.+(?:\.[A-Za-z0-9]{3,})?)`) -var SplitRunes = map[rune]bool{',': true, ' ': true, '.': true, '!': true, '?': true, ':': true, ';': true, '\n': true, '<': true, '>': true, '(': true, ')': true, '{': true, '}': true, '[': true, ']': true, '+': true, '/': true, '\\': true, '^': true, '#': true, '$': true, '&': true} - func IsValidHttpUrl(rawUrl string) bool { if strings.Index(rawUrl, "http://") != 0 && strings.Index(rawUrl, "https://") != 0 { return false -- cgit v1.2.3-1-g7c22