/**
* replace all :emoji: codes with corresponding image
* @param {string} inputString
* @return {string}
**/
function formatEmojis(inputString) {
return inputString.replace(/:([^ \t:]+):/g, function(returnFailed, emoji) {
var emojiDom = makeEmojiDom(emoji);
if (emojiDom) {
var domParent = document.createElement("span");
domParent.className = returnFailed === inputString ? R.klass.emoji.medium : R.klass.emoji.small;
domParent.appendChild(emojiDom);
return domParent.outerHTML;
}
return returnFailed;
});
}
/**
* @param {string} fullText
* @return {string}
**/
function formatText(fullText) {
if (!fullText || fullText == "")
return "";
var msgContents = fullText.split(/\r?\n/g);
for (var msgContentIndex=0, nbMsgContents = msgContents.length; msgContentIndex < nbMsgContents; msgContentIndex++) {
var msgContent = msgContents[msgContentIndex].trim()
,_msgContent = ""
,currentMods = {}
,quote = false
,i =0
msgContent = msgContent.replace(new RegExp('<([@#]?)([^>]*)>', 'g'),
function(matched, type, entity) {
var sub = entity.split('|');
if (type === '@') {
if (!sub[1]) {
var user = SLACK.context.users[sub[0]];
sub[1] = user ? ('@' +user.name) : locale.unknownMember;
} else if ('@' !== sub[1][0]) {
sub[1] = '@' +sub[1];
}
sub[0] = '#' +sub[0];
sub[2] = R.klass.msg.link +' ' +R.klass.msg.linkuser;
} else if (type === '#') {
if (!sub[1]) {
var chan = SLACK.context.channels[sub[0]];
sub[1] = chan ? ('#' +chan.name) : locale.unknownChannel;
} else if ('#' !== sub[1][0]) {
sub[1] = '#' +sub[1];
}
sub[0] = '#' +sub[0];
sub[2] = R.klass.msg.link +' ' +R.klass.msg.linkchan;
} else if (sub[0].indexOf("://") !== -1) {
if (!sub[1])
sub[1] = sub[0];
sub[2] = R.klass.msg.link;
} else {
return matched;
}
return '' +sub[1] +'';
});
msgContent = formatEmojis(msgContent);
var msgLength = msgContent.length;
var isAlphadec = function(c) {
return ((c >= 'A' && c <= 'Z') ||
(c >= 'a' && c <= 'z') ||
(c >= '0' && c <= '9') ||
"àèìòùÀÈÌÒÙáéíóúýÁÉÍÓÚÝâêîôûÂÊÎÔÛãñõÃÑÕäëïöüÿÄËÏÖÜŸçÇߨøÅ寿œ".indexOf(c) !== -1);
}
,checkEnd = function(str, pos, c) {
while (str[pos]) {
if (isAlphadec(str[pos]) && str[pos] != c && str[pos +1] == c) {
return true;
}
pos++;
}
return false;
} ,appendMod = function(mods) {
if (!Object.keys(currentMods).length)
return "";
return '';
};
// Skip trailing
while (i < msgLength && (msgContent[i] === ' ' || msgContent[i] === '\t'))
i++;
if (msgContent.substr(i, 4) === '>') {
quote = true;
i += 4;
}
for (; i < msgLength; i++) {
var c = msgContent[i];
if (c === '<') {
do {
_msgContent += msgContent[i++];
} while (msgContent[i -1] !== '>' && msgContent[i]);
i--;
continue;
}
if (!(currentMods[R.klass.msg.style.bold]) && c === '*' && msgContent[i +1] && checkEnd(msgContent, i, c)) {
if (Object.keys(currentMods).length)
_msgContent += '';
currentMods[R.klass.msg.style.bold] = true;
_msgContent += appendMod(currentMods);
} else if (!(currentMods[R.klass.msg.style.strike]) && c === '~' && msgContent[i +1] && checkEnd(msgContent, i, c)) {
if (Object.keys(currentMods).length)
_msgContent += '';
currentMods[R.klass.msg.style.strike] = true;
_msgContent += appendMod(currentMods);
} else if (!(currentMods[R.klass.msg.style.code]) && c === '`' && msgContent[i +1] && checkEnd(msgContent, i, c)) {
if (Object.keys(currentMods).length)
_msgContent += '';
currentMods[R.klass.msg.style.code] = true;
_msgContent += appendMod(currentMods);
} else if (!(currentMods[R.klass.msg.style.italic]) && c === '_' && msgContent[i +1] && checkEnd(msgContent, i, c)) {
if (Object.keys(currentMods).length)
_msgContent += '';
currentMods[R.klass.msg.style.italic] = true;
_msgContent += appendMod(currentMods);
} else {
var finalFound = false;
_msgContent += c;
do {
if ((currentMods[R.klass.msg.style.bold]) && c !== '*' && msgContent[i +1] === '*') {
delete currentMods[R.klass.msg.style.bold];
finalFound = true;
} else if ((currentMods[R.klass.msg.style.strike]) && c !== '~' && msgContent[i +1] === '~') {
delete currentMods[R.klass.msg.style.strike];
finalFound = true;
} else if ((currentMods[R.klass.msg.style.code]) && c !== '`' && msgContent[i +1] === '`') {
delete currentMods[R.klass.msg.style.code];
finalFound = true;
} else if ((currentMods[R.klass.msg.style.italic]) && c !== '_' && msgContent[i +1] === '_') {
delete currentMods[R.klass.msg.style.italic];
finalFound = true;
} else {
break;
}
c = msgContent[++i];
} while (i < msgLength);
if (finalFound)
_msgContent += '' +appendMod(currentMods);
}
}
if (!isObjectEmpty(currentMods)) {
// Should not append
console.warn("formatter warning");
_msgContent += '';
}
if (quote)
msgContents[msgContentIndex] = '' +_msgContent +'';
else
msgContents[msgContentIndex] = _msgContent;
}
return msgContents.length === 0 ? "" : msgContents.join('
');
}