| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 |
- /**
- * 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 '<a href="' +sub[0] +'" class="' +sub[2] +'"' +(!type ? ' target="_blank"' : '') +'>' +sub[1] +'</a>';
- });
- 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 '<span class="' +Object.keys(mods).join(' ') +'">';
- };
- // 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] !== '>');
- i--;
- continue;
- }
- if (!(currentMods[R.klass.msg.style.bold]) && c === '*' && msgContent[i +1] && checkEnd(msgContent, i, c)) {
- if (Object.keys(currentMods).length)
- _msgContent += '</span>';
- 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 += '</span>';
- 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 += '</span>';
- 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 += '</span>';
- 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 += '</span>' +appendMod(currentMods);
- }
- }
- if (!isObjectEmpty(currentMods)) {
- // Should not append
- console.warn("formatter warning");
- _msgContent += '</span>';
- }
- if (quote)
- msgContents[msgContentIndex] = '<span class="' +R.klass.msg.style.quote +'">' +_msgContent +'</span>';
- else
- msgContents[msgContentIndex] = _msgContent;
- }
- return msgContents.length === 0 ? "" : msgContents.join('<br/>');
- }
|