فهرست منبع

[add][quickfix] display thumb attachment before text to avoid big empty gap
[add] prepare msgFormatter closure

B Thibault 8 سال پیش
والد
کامیت
1cd0721975
4فایلهای تغییر یافته به همراه146 افزوده شده و 141 حذف شده
  1. 11 11
      cli/dom.js
  2. 129 127
      cli/msgFormatter.js
  3. 5 3
      srv/public/slack.min.js
  4. 1 0
      srv/public/style.css

+ 11 - 11
cli/dom.js

@@ -353,16 +353,6 @@ function createAttachmentDom(channelId, msg, attachment, attachmentIndex) {
         authorBlock.appendChild(authorName);
     }
 
-    //Text
-    textBlock.className = R.klass.msg.attachment.content;
-    var textContent = formatText(attachment["text"] || "");
-    textDom.className = R.klass.msg.attachment.text;
-    if (textContent && textContent != "") {
-        textDom.innerHTML = textContent;
-    } else {
-        textDom.classList.add(R.klass.hidden);
-    }
-
     // Img (small one)
     thumbImgDom.className = R.klass.msg.attachment.thumbImg;
     if (attachment["thumb_url"]) {
@@ -377,6 +367,16 @@ function createAttachmentDom(channelId, msg, attachment, attachmentIndex) {
         thumbImgDom.classList.add(R.klass.hidden);
     }
 
+    //Text
+    textBlock.className = R.klass.msg.attachment.content;
+    var textContent = formatText(attachment["text"] || "");
+    textDom.className = R.klass.msg.attachment.text;
+    if (textContent && textContent != "") {
+        textDom.innerHTML = textContent;
+    } else {
+        textDom.classList.add(R.klass.hidden);
+    }
+
     //Img (the big one)
     imgDom.className = R.klass.msg.attachment.img;
     if (attachment["image_url"])
@@ -407,8 +407,8 @@ function createAttachmentDom(channelId, msg, attachment, attachmentIndex) {
         footerBlock.appendChild(footerTs);
     }
 
-    textBlock.appendChild(textDom);
     textBlock.appendChild(thumbImgDom);
+    textBlock.appendChild(textDom);
     attachmentBlock.appendChild(titleBlock);
     attachmentBlock.appendChild(authorBlock);
     attachmentBlock.appendChild(textBlock);

+ 129 - 127
cli/msgFormatter.js

@@ -20,144 +20,146 @@ function formatEmojis(inputString) {
  * @param {string} fullText
  * @return {string}
 **/
-function formatText(fullText) {
-    if (!fullText || fullText == "")
-        return "";
-    var msgContents = fullText.split(/\r?\n/g);
+var formatText = (function() {
+    return function (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
+        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('|');
+            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];
+                    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;
                     }
-                    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];
+                    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;
                     }
-                    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++;
                 }
-                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) === '&gt;') {
+                quote = true;
+                i += 4;
             }
-            return false;
-        } ,appendMod = function(mods) {
-            if (!Object.keys(currentMods).length)
-                return "";
-            return '<span class="' +Object.keys(mods).join(' ') +'">';
-        };
+            for (; i < msgLength; i++) {
+                var c = msgContent[i];
 
-        // Skip trailing
-        while (i < msgLength && (msgContent[i] === ' ' || msgContent[i] === '\t'))
-            i++;
-        if (msgContent.substr(i, 4) === '&gt;') {
-            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 += '</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;
 
-            if (c === '<') {
-                do {
-                    _msgContent += msgContent[i++];
-                } while (msgContent[i -1] !== '>' && msgContent[i]);
-                i--;
-                continue;
+                    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 (!(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;
         }
-        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/>');
     }
-    return msgContents.length === 0 ? "" : msgContents.join('<br/>');
-}
+})();
 

+ 5 - 3
srv/public/slack.min.js

@@ -1,3 +1,4 @@
+(function(){
 var m;function r(a){this.id=a;this.version=0}r.prototype.update=function(a,b){void 0!==a.name&&(this.name=a.name);this.version=Math.max(this.version,b)};function aa(a){this.a=a.desc;this.name=a.name;this.type=a.type;this.usage=a.usage;this.J=a.category}function ba(){this.b={};this.a=[]}
 ba.prototype.update=function(a,b){this.b=JSON.parse(a.emoji_use);a.highlight_words?this.a=(a.highlight_words||"").split(",").filter(function(a){return""!==a.trim()}):a.highlights&&(this.a=a.highlights);this.version=Math.max(this.version,b)};function ca(){this.m=null;this.g={};this.a={};this.b=null;this.j={version:0,data:{}};this.i={version:0,data:{}};this.f={};this.F=0}"undefined"!==typeof module&&(module.G.aa=ca,module.G.ba=r,module.G.da=aa);function t(a){this.id=a;this.w=!1;this.a=this.b=0;this.i={};this.version=0}
 t.prototype.update=function(a,b,c){void 0!==a.name&&(this.name=a.name);void 0!==a.is_archived&&(this.j=a.is_archived);void 0!==a.is_member&&(this.F=a.is_member);void 0!==a.last_read&&(this.b=Math.max(parseFloat(a.last_read),this.b));void 0!==a.last_msg&&(this.a=parseFloat(a.last_msg));void 0!==a.is_private&&(this.m=a.is_private);a.latest&&(this.a=parseFloat(a.latest.ts));void 0!==a.is_starred&&(this.w=a.is_starred);if(a.members&&(this.i={},a.members))for(var d=0,f=a.members.length;d<f;d++){var e=
@@ -15,7 +16,7 @@ function K(a){if(!a||""==a)return"";a=a.split(/\r?\n/g);for(var b=0,c=a.length;b
 (c[1]=c[0]),c[2]="slackmsg-link";else return a;return'<a href="'+c[0]+'" class="'+c[2]+'"'+(b?"":' target="_blank"')+">"+c[1]+"</a>"}),d=wa(d),l=d.length,p=function(a,b,c){for(;a[b];){var d=a[b];if(("A"<=d&&"Z">=d||"a"<=d&&"z">=d||"0"<=d&&"9">=d||-1!=="\u00e0\u00e8\u00ec\u00f2\u00f9\u00c0\u00c8\u00cc\u00d2\u00d9\u00e1\u00e9\u00ed\u00f3\u00fa\u00fd\u00c1\u00c9\u00cd\u00d3\u00da\u00dd\u00e2\u00ea\u00ee\u00f4\u00fb\u00c2\u00ca\u00ce\u00d4\u00db\u00e3\u00f1\u00f5\u00c3\u00d1\u00d5\u00e4\u00eb\u00ef\u00f6\u00fc\u00ff\u00c4\u00cb\u00cf\u00d6\u00dc\u0178\u00e7\u00c7\u00df\u00d8\u00f8\u00c5\u00e5\u00c6\u00e6\u0153".indexOf(d))&&
 a[b]!=c&&a[b+1]==c)return!0;b++}return!1},k=function(a){return Object.keys(e).length?'<span class="'+Object.keys(a).join(" ")+'">':""};g<l&&(" "===d[g]||"\t"===d[g]);)g++;"&gt;"===d.substr(g,4)&&(h=!0,g+=4);for(;g<l;g++){var n=d[g];if("<"===n){do f+=d[g++];while(">"!==d[g-1]&&d[g]);g--}else if(!e["slackmsg-style-bold"]&&"*"===n&&d[g+1]&&p(d,g,n))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-bold"]=!0,f+=k(e);else if(!e["slackmsg-style-strike"]&&"~"===n&&d[g+1]&&p(d,g,n))Object.keys(e).length&&
 (f+="</span>"),e["slackmsg-style-strike"]=!0,f+=k(e);else if(!e["slackmsg-style-code"]&&"`"===n&&d[g+1]&&p(d,g,n))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-code"]=!0,f+=k(e);else if(!e["slackmsg-style-italic"]&&"_"===n&&d[g+1]&&p(d,g,n))Object.keys(e).length&&(f+="</span>"),e["slackmsg-style-italic"]=!0,f+=k(e);else{var q=!1,f=f+n;do{if(e["slackmsg-style-bold"]&&"*"!==n&&"*"===d[g+1])delete e["slackmsg-style-bold"],q=!0;else if(e["slackmsg-style-strike"]&&"~"!==n&&"~"===d[g+1])delete e["slackmsg-style-strike"],
-q=!0;else if(e["slackmsg-style-code"]&&"`"!==n&&"`"===d[g+1])delete e["slackmsg-style-code"],q=!0;else if(e["slackmsg-style-italic"]&&"_"!==n&&"_"===d[g+1])delete e["slackmsg-style-italic"],q=!0;else break;n=d[++g]}while(g<l);q&&(f+="</span>"+k(e))}}ya(e)||(console.warn("formatter warning"),f+="</span>");a[b]=h?'<span class="slackmsg-style-quote">'+f+"</span>":f}return a.length?a.join("<br/>"):""};var za=[],Aa=0;
+q=!0;else if(e["slackmsg-style-code"]&&"`"!==n&&"`"===d[g+1])delete e["slackmsg-style-code"],q=!0;else if(e["slackmsg-style-italic"]&&"_"!==n&&"_"===d[g+1])delete e["slackmsg-style-italic"],q=!0;else break;n=d[++g]}while(g<l);q&&(f+="</span>"+k(e))}}ya(e)||(console.warn("formatter warning"),f+="</span>");a[b]=h?'<span class="slackmsg-style-quote">'+f+"</span>":f}return 0===a.length?"":a.join("<br/>")};var za=[],Aa=0;
 function Ba(){var a=document.createDocumentFragment(),b=Object.keys(E.a.g||{}),c=[],d=[],f=[],e=[];b.sort(function(a,b){return a[0]!==b[0]?a[0]-b[0]:E.a.g[a].name.localeCompare(E.a.g[b].name)});b.forEach(function(a){a=E.a.g[a];if(!a.j&&!1!==a.F)if(a instanceof w){if(!a.f.i){var b=document.createElement("li");var h=document.createElement("a");b.id="room_"+a.id;h.href="#"+a.id;b.className="slack-context-room slack-ims";h.textContent=a.f.name;b.appendChild(Ca());b.appendChild(h);a.f.f||b.classList.add("away");
 G===a&&b.classList.add("selected");a.a>a.b&&(b.classList.add("unread"),0<=M.indexOf(a)&&b.classList.add("unreadHi"));b&&(a.w?c.push(b):e.push(b))}}else b=document.createElement("li"),h=document.createElement("a"),b.id="room_"+a.id,h.href="#"+a.id,a.m?(b.className="slack-context-room slack-group",b.dataset.count=Object.keys(a.i||{}).length):b.className="slack-context-room slack-channel",G===a&&b.classList.add("selected"),h.textContent=a.name,b.appendChild(Ca()),b.appendChild(h),a.a>a.b&&(b.classList.add("unread"),
 0<=M.indexOf(a)&&b.classList.add("unreadHi")),b&&(a.w?c.push(b):a.m?f.push(b):d.push(b))});c.length&&a.appendChild(Da(I.w));c.forEach(function(b){a.appendChild(b)});d.length&&a.appendChild(Da(I.g));d.forEach(function(b){a.appendChild(b)});f.forEach(function(b){a.appendChild(b)});e.length&&a.appendChild(Da(I.X));e.forEach(function(b){a.appendChild(b)});document.getElementById("chanList").textContent="";document.getElementById("chanList").appendChild(a);Ea();N();Fa(function(a){document.getElementById("slackCtx").style.backgroundImage=
@@ -48,8 +49,8 @@ a.className="slackmsg-hover-remove",a.style.backgroundImage='url("remove.svg")',
 function cb(a){var b={good:"#2fa44f",warning:"#de9e31",danger:"#d50200"};if(a){if("#"===a[0])return a;if(b[a])return b[a]}return"#e3e4e6"}
 function db(a,b){var c=document.createElement("li"),d=document.createElement("div"),f=document.createElement("div"),e=document.createElement("a"),h=document.createElement("div"),g=document.createElement("img"),l=document.createElement("a"),p=document.createElement("div"),k=document.createElement("div"),n=document.createElement("div"),q=document.createElement("img"),u=document.createElement("div");c.className="slackmsg-attachment";d.style.borderColor=cb(a.color||"");d.className="slackmsg-attachment-block";
 f.className="slackmsg-attachment-pretext";a.pretext?f.innerHTML=K(a.pretext):f.classList.add("hidden");e.target="_blank";a.title?(e.innerHTML=K(a.title),a.title_link&&(e.href=a.title_link),e.className="slackmsg-attachment-title"):e.className="hidden slackmsg-attachment-title";l.target="_blank";h.className="slackmsg-author";a.author_name&&(l.innerHTML=K(a.author_name),l.href=a.author_link||"",l.className="slackmsg-author-name",g.className="slackmsg-author-img",a.author_icon&&(g.src=a.author_icon,h.appendChild(g)),
-h.appendChild(l));p.className="slackmsg-attachment-content";g=K(a.text||"");k.className="slackmsg-attachment-text";g&&""!=g?k.innerHTML=g:k.classList.add("hidden");n.className="slackmsg-attachment-thumb";a.thumb_url?(g=document.createElement("img"),g.src=a.thumb_url,n.appendChild(g),d.classList.add("has-thumb"),a.video_html&&(n.dataset.video=a.video_html)):n.classList.add("hidden");q.className="slackmsg-attachment-img";a.image_url?q.src=a.image_url:q.classList.add("hidden");u.className="slackmsg-attachment-footer";
-a.footer&&(g=document.createElement("span"),g.className="slackmsg-attachment-footer-text",g.innerHTML=K(a.footer),a.footer_icon&&(l=document.createElement("img"),l.src=a.footer_icon,l.className="slackmsg-attachment-footer-icon",u.appendChild(l)),u.appendChild(g));a.ts&&(g=document.createElement("span"),g.className="slackmsg-ts",g.innerHTML=I.P(a.ts),u.appendChild(g));p.appendChild(k);p.appendChild(n);d.appendChild(e);d.appendChild(h);d.appendChild(p);d.appendChild(q);if(a.fields&&a.fields.length){var v=
+h.appendChild(l));n.className="slackmsg-attachment-thumb";a.thumb_url?(g=document.createElement("img"),g.src=a.thumb_url,n.appendChild(g),d.classList.add("has-thumb"),a.video_html&&(n.dataset.video=a.video_html)):n.classList.add("hidden");p.className="slackmsg-attachment-content";g=K(a.text||"");k.className="slackmsg-attachment-text";g&&""!=g?k.innerHTML=g:k.classList.add("hidden");q.className="slackmsg-attachment-img";a.image_url?q.src=a.image_url:q.classList.add("hidden");u.className="slackmsg-attachment-footer";
+a.footer&&(g=document.createElement("span"),g.className="slackmsg-attachment-footer-text",g.innerHTML=K(a.footer),a.footer_icon&&(l=document.createElement("img"),l.src=a.footer_icon,l.className="slackmsg-attachment-footer-icon",u.appendChild(l)),u.appendChild(g));a.ts&&(g=document.createElement("span"),g.className="slackmsg-ts",g.innerHTML=I.P(a.ts),u.appendChild(g));p.appendChild(n);p.appendChild(k);d.appendChild(e);d.appendChild(h);d.appendChild(p);d.appendChild(q);if(a.fields&&a.fields.length){var v=
 document.createElement("ul");d.appendChild(v);v.className="slackmsg-attachment-fields";a.fields.forEach(function(a){var b=a.title||"",c=a.value||"";a=!!a["short"];var d=document.createElement("li"),e=document.createElement("div"),f=document.createElement("div");d.className="field";a||d.classList.add("field-long");e.className="field-title";e.textContent=b;f.className="field-text";f.innerHTML=K(c);d.appendChild(e);d.appendChild(f);d&&v.appendChild(d)})}if(a.actions&&a.actions.length)for(e=document.createElement("ul"),
 e.className="slackmsg-attachment-actions "+qa,d.appendChild(e),h=0,p=a.actions.length;h<p;h++)(k=a.actions[h])&&(k=eb(b,h,k))&&e.appendChild(k);d.appendChild(u);c.appendChild(f);c.appendChild(d);return c}function eb(a,b,c){var d=document.createElement("li"),f=cb(c.style);d.textContent=c.text;f!==cb()&&(d.style.color=f);d.style.borderColor=f;d.dataset.attachmentIndex=a;d.dataset.actionIndex=b;d.className="slackmsg-attachment-actions-item "+pa;return d}
 function Ia(a){var b=document.createElement("li"),c=document.createElement("span");c.textContent=a.name;b.appendChild(Ca());b.appendChild(c);return b}function Za(a){var b=document.createElement("lh");b.textContent=a;b.className="slack-command-header";return b}
@@ -80,3 +81,4 @@ h),d=null;d&&c.appendChild(d)}a.c.o.textContent="";a.c.o.appendChild(c);a.K&&a.c
 m.B=function(){Z.B(this);return this};m.update=function(a,b){y.prototype.update.call(this,a,b);this.s()};function Y(a,b,c){x.call(this,b,c);this.b=a;this.c=Z.c;this.A=Z.A}Y.prototype=Object.create(x.prototype);m=Y.prototype;m.constructor=Y;m.s=function(){return Z.s(this)};m.H=function(){return Z.H(this)};m.D=function(){return Z.D(this)};m.N=function(){this.c=bb(this);return this};m.C=function(){return Z.C(this)};m.B=function(){Z.B(this);return this};
 m.update=function(a,b){x.prototype.update.call(this,a,b);this.s()};function X(a,b,c){x.call(this,b,c);this.b=a;this.c=Z.c;this.a=null;this.A=Z.A}X.prototype=Object.create(A.prototype);m=X.prototype;m.constructor=X;m.s=function(){return Z.s(this)};m.H=function(){this.a&&this.a.parentElement&&(this.a.remove(),delete this.a);this.c&&delete this.c;return this};m.D=function(){Z.D(this);return this.a};m.C=function(){return this.a.cloneNode(!0)};
 m.N=function(){this.c=bb(this);this.a=document.createElement("span");this.c.classList.add("slackmsg-notice");this.a.className="slackmsg-notice";this.a.textContent=I.V;return this};m.B=function(){Z.B(this);return this};m.update=function(a,b){A.prototype.update.call(this,a,b);this.s()};function ya(a){for(var b in a)if(a.hasOwnProperty(b))return!1;return!0};
+})();

+ 1 - 0
srv/public/style.css

@@ -76,6 +76,7 @@ body { display: flex; margin: 0; padding: 0; font-family: Lato, sans-serif; heig
 .slackmsg-content > .slackmsg-edited, .slackmsg-ts, .slackmsg-attachment-footer * { font-size: 0.75em; font-style: italic; }
 .slackmsg-item .slackmsg-edited { display: none; }
 .slackmsg-item.edited .slackmsg-edited { display: block; }
+.slackmsg-attachment-footer-icon { max-height: 1em; max-width: 1em; vertical-align: middle; }
 
 .slackmsg-notice { background: rgba(255, 255, 0, 0.2); }
 .slackmsg-content .slackmsg-notice { display: inline; font-style: italic; margin-right: 15px; }