diff options
author | Harrison Healey <harrisonmhealey@gmail.com> | 2016-11-01 17:58:44 -0400 |
---|---|---|
committer | Corey Hulen <corey@hulen.com> | 2016-11-01 14:58:44 -0700 |
commit | a7e583717825b47142d9877472ad177a6afbe04d (patch) | |
tree | 145925a2751ac4cb87f6f257275741e0ca5fab8c /webapp/utils | |
parent | ce6b4b8fdf99214ea307d1916538f8d7e97f0316 (diff) | |
download | chat-a7e583717825b47142d9877472ad177a6afbe04d.tar.gz chat-a7e583717825b47142d9877472ad177a6afbe04d.tar.bz2 chat-a7e583717825b47142d9877472ad177a6afbe04d.zip |
PLT-4454 Autolink anything that looks like an at mention (#4416)
* PLT-4454 Added autolinking for anything that looks like an at mention
* PLT-4454 Added unit tests for at mention autolinking
Diffstat (limited to 'webapp/utils')
-rw-r--r-- | webapp/utils/text_formatting.jsx | 34 |
1 files changed, 11 insertions, 23 deletions
diff --git a/webapp/utils/text_formatting.jsx b/webapp/utils/text_formatting.jsx index 9834f4b9b..dbd6a4e32 100644 --- a/webapp/utils/text_formatting.jsx +++ b/webapp/utils/text_formatting.jsx @@ -152,7 +152,7 @@ function autolinkEmails(text, tokens) { const punctuation = XRegExp.cache('[^\\pL\\d]'); -function autolinkAtMentions(text, tokens, usernameMap) { +export function autolinkAtMentions(text, tokens, usernameMap) { // Test if provided text needs to be highlighted, special mention or current user function mentionExists(u) { return (Constants.SPECIAL_MENTIONS.indexOf(u) !== -1 || Boolean(usernameMap[u])); @@ -169,30 +169,18 @@ function autolinkAtMentions(text, tokens, usernameMap) { return alias; } - function replaceAtMentionWithToken(fullMatch, mention, username) { - let usernameLower = username.toLowerCase(); - - if (mentionExists(usernameLower)) { - // Exact match - const alias = addToken(usernameLower, mention, ''); - return alias; - } - - // Not an exact match, attempt to truncate any punctuation to see if we can find a user - const originalUsername = usernameLower; + function replaceAtMentionWithToken(fullMatch, prefix, mention, username) { + const usernameLower = username.toLowerCase(); + // Check if the text makes up an explicit mention, possible trimming extra punctuation from the end of the name if necessary for (let c = usernameLower.length; c > 0; c--) { - if (punctuation.test(usernameLower[c - 1])) { - usernameLower = usernameLower.substring(0, c - 1); + const truncated = usernameLower.substring(0, c); + const suffix = usernameLower.substring(c); - if (mentionExists(usernameLower)) { - const suffix = originalUsername.substr(c - 1); - const alias = addToken(usernameLower, '@' + usernameLower); - return alias + suffix; - } - } else { - // If the last character is not punctuation, no point in going any further - break; + // If we've found a username or run out of punctuation to trim off, render it as an at mention + if (mentionExists(truncated) || !punctuation.test(truncated[truncated.length - 1])) { + const alias = addToken(truncated, '@' + truncated); + return prefix + alias + suffix; } } @@ -200,7 +188,7 @@ function autolinkAtMentions(text, tokens, usernameMap) { } let output = text; - output = output.replace(/(@([a-z0-9.\-_]*))/gi, replaceAtMentionWithToken); + output = output.replace(/(^|\W)(@([a-z0-9.\-_]*))/gi, replaceAtMentionWithToken); return output; } |