From 91f258c725bd749fc44b177e131e61c936e7a88b Mon Sep 17 00:00:00 2001 From: hmhealey Date: Thu, 10 Sep 2015 11:05:31 -0400 Subject: Added handling for @mentions to the new text formatting --- web/react/utils/text_formatting.jsx | 63 +++++++++++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 9 deletions(-) (limited to 'web/react/utils') diff --git a/web/react/utils/text_formatting.jsx b/web/react/utils/text_formatting.jsx index 2e1416d1d..111155c3e 100644 --- a/web/react/utils/text_formatting.jsx +++ b/web/react/utils/text_formatting.jsx @@ -1,12 +1,21 @@ // Copyright (c) 2015 Spinpunch, Inc. All Rights Reserved. // See License.txt for license information. -const Constants = require('../utils/constants.jsx'); +const Constants = require('./constants.jsx'); const UserStore = require('../stores/user_store.jsx'); export function formatText(text, options = {}) { let output = sanitize(text); + let atMentions; + [output, atMentions] = stripAtMentions(output); + + output = reinsertAtMentions(output, atMentions); + + output = replaceNewlines(output, options.singleline); + + return output; + // TODO autolink @mentions // TODO highlight mentions of self // TODO autolink urls @@ -14,14 +23,6 @@ export function formatText(text, options = {}) { // TODO autolink hashtags // TODO leave space for markdown - - if (options.singleline) { - output = output.replace('\n', ' '); - } else { - output = output.replace('\n', '
'); - } - - return output; } export function sanitize(text) { @@ -34,3 +35,47 @@ export function sanitize(text) { return output; } + +function stripAtMentions(text) { + let output = text; + let atMentions = new Map(); + + function stripAtMention(fullMatch, prefix, mentionText, username) { + if (Constants.SPECIAL_MENTIONS.indexOf(username) !== -1 || UserStore.getProfileByUsername(username)) { + const index = atMentions.size; + const alias = `ATMENTION${index}`; + + atMentions.set(alias, {mentionText: mentionText, username: username}); + + return prefix + alias; + } else { + return fullMatch; + } + } + + output = output.replace(/(^|\s)(@([a-z0-9.\-_]+))/g, stripAtMention); + + return [output, atMentions]; +} +window.stripAtMentions = stripAtMentions; + +function reinsertAtMentions(text, atMentions) { + let output = text; + + function reinsertAtMention(replacement, alias) { + output = output.replace(alias, `${replacement.mentionText}`); + } + + atMentions.forEach(reinsertAtMention); + + return output; +} +window.reinsertAtMentions = reinsertAtMentions; + +function replaceNewlines(text, singleline) { + if (!singleline) { + return text.replace(/\n/g, '
'); + } else { + return text.replace(/\n/g, ' '); + } +} -- cgit v1.2.3-1-g7c22