1
0
Эх сурвалжийг харах

[add][Refs #7] Add style on bold, strike, italic, code and quote

B Thibault 8 жил өмнө
parent
commit
60ec701471

+ 8 - 0
cli/resources.js

@@ -55,6 +55,14 @@ var R = {
             ,link: "slackmsg-link"
             ,linkuser: "slackmsg-link-user"
             ,linkchan: "slackmsg-link-chan"
+
+            ,style: {
+                bold: "slackmsg-style-bold"
+                ,code: "slackmsg-style-code"
+                ,italic: "slackmsg-style-italic"
+                ,strike: "slackmsg-style-strike"
+                ,quote: "slackmsg-style-quote"
+            }
         }
     }
 };

+ 90 - 3
cli/ui.js

@@ -137,8 +137,8 @@ function createMessageDom(channelId, msg) {
     hover.className = R.klass.msg.hover.container;
     hoverReply.className = R.klass.msg.hover.reply;
     ts.textContent = (new Date(msg.ts * 1000)).toLocaleTimeString();
-    var msgContent = msg.raw["text"] || "";
-    msgContent = msgContent
+    var msgContents = msg.raw["text"] || "";
+    msgContents = msgContents
         .replace(new RegExp('<([@#]?)([^>]*)>', 'g'),
             function(_, type, entity) {
                 var sub = entity.split('|');
@@ -168,8 +168,95 @@ function createMessageDom(channelId, msg) {
                 }
                 return '<a href="' +sub[0] +'" class="' +sub[2] +'"' +(!type ? ' target="_blank"' : '') +'>' +sub[1] +'</a>';
             })
+        .split(/\r?\n/g);
     ;
-    text.innerHTML = msgContent;
+    for (var msgContentIndex=0, nbMsgContents = msgContents.length; msgContentIndex < nbMsgContents; msgContentIndex++) {
+        var msgContent = msgContents[msgContentIndex]
+            ,_msgContent = ""
+            ,currentMods = {}
+            ,quote = false
+            ,i =0
+            ,msgLength = msgContent.length;
+
+        var checkEnd = function(str, pos, c) {
+            while (str[pos]) {
+                if (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) === '&gt;') {
+            quote = true;
+            i += 4;
+        }
+        for (; i < msgLength; i++) {
+            var c = msgContent[i];
+
+            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 (currentMods) {
+            // Should not append
+            _msgContent += '</span>';
+        }
+        if (quote)
+            msgContents[msgContentIndex] = '<span class="' +R.klass.msg.style.quote +'">' +_msgContent +'</span>';
+        else
+            msgContents[msgContentIndex] = _msgContent;
+    }
+    text.innerHTML = msgContents.join('<br/>');
     authorName.textContent = sender ? sender.name : (msg.raw["username"] || "?");
     if (!sender && !msg.raw["username"])
         text.textContent = msg.raw["subtype"] || JSON.stringify(msg.raw);

+ 23 - 20
srv/public/slack.min.js

@@ -1,20 +1,23 @@
-function g(a){this.id=a.id;this.name=a.name}function h(a,b){this.id=a.id;this.name=a.name;this.b=parseFloat(a.last_read);this.a={};if(a.members)for(var c=0,d=a.members.length;c<d;c++){var f=l(b,a.members[c]);this.a[f.id]=f;f.f[this.id]=this}}function m(a,b){var c=[];this.id=b.id;this.a={};for(var d=0,f=b.members.length;d<f;d++){var e=l(a,b.members[d]);this.a[b.members[d]]=e;e.f[this.id]=this;c.push(e.name)}this.name=c.join(", ");this.b=parseFloat(b.last_read)}
-function n(a,b){this.id=b.id;this.c=a;this.b=parseFloat(b.last_read)}function r(a){this.id=a.id;this.name=a.name;this.status=a.status;this.b={B:a.profile.image_24,C:a.profile.image_32,l:a.profile.image_48,s:a.profile.image_72,A:a.profile.image_192,F:a.profile.image_512};this.f={};this.a=null}function v(a){this.id=a.id;this.name=a.name;this.b={D:a.icons.image_36,l:a.icons.image_48,s:a.icons.image_72};this.f={};this.a=null}
-function w(){this.i=null;this.f={};this.b={};this.g={};this.a={};this.c=null;this.h={}}function l(a,b){return a.a[b]||a.h[b]||null}function x(a,b){return a.f[b]||a.g[b]||a.b[b]||null}"undefined"!==typeof module&&(module.o.u=w);function z(a){this.c=a.user;this.b=parseFloat(a.ts);this.a=a}function A(a,b,c){this.id="string"===typeof a?a:a.id;this.a=[];this.b=b;c&&B(this,c)}function B(a,b){var c=0;b.forEach(function(a){c=Math.max(this.push(a),c)}.bind(a))}A.prototype.push=function(a){for(var b=parseFloat(a.ts),c=0,d=this.a.length;c<d;c++)if(this.a[c].b===b)return b;for(this.a.push(new z(a));this.a.length>this.b;)this.a.shift();return b};"undefined"!==typeof module&&(module.o.w=A);var C=null;
-function D(){var a=document.createDocumentFragment(),b=E.a.c?Object.keys(E.a.c.f):[];b.sort(function(a,b){return a[0]!==b[0]?a[0]-b[0]:(E.a.f[a]||E.a.b[a]).name.localeCompare((E.a.f[b]||E.a.b[b]).name)});b.forEach(function(b){b=E.a.f[b]||E.a.b[b];var c=document.createElement("li");c.id=b.id;"D"===b.id[0]?c.className="slack-context-room slack-ims":"G"===b.id[0]?c.className="slack-context-room slack-group":"C"===b.id[0]&&(c.className="slack-context-room slack-channel");c.textContent=b.name;c&&a.appendChild(c)});
-b=E.a.a?Object.keys(E.a.a):[];b.sort(function(a,b){return E.a.a[a].name.localeCompare(E.a.a[b].name)});b.forEach(function(b){b=E.a.a[b].a;var c=document.createElement("li");c.id=b.id;c.className="slack-context-room";c.textContent=b.c.name;c&&a.appendChild(c)});document.getElementById("chanList").textContent="";document.getElementById("chanList").appendChild(a)}function F(a){a?document.body.classList.remove("no-network"):document.body.classList.add("no-network")}
-function G(){if(C){document.body.classList.add("replyingTo");var a=document.getElementById("replyToContainer"),b=document.createElement("a");b.addEventListener("click",function(){C=null;G()});b.className="replyto-close";b.textContent="x";a.textContent="";a.appendChild(b);a.appendChild(H("reply_"+I.id,C))}else document.body.classList.remove("replyingTo")}
-function H(a,b){var c=document.createElement("div"),d=document.createElement("div"),f=document.createElement("div"),e=document.createElement("div"),k=document.createElement("img"),p=document.createElement("span"),q=document.createElement("ul"),t=document.createElement("li"),u=b.a.user?E.a.a[b.a.user]:E.a.h[b.a.bot_id];c.id=a+"_"+b.b;c.className="slackmsg-item";d.className="slackmsg-ts";f.className="slackmsg-msg";e.className="slackmsg-author";k.className="slackmsg-author-img";p.className="slackmsg-author-name";
-q.className="slackmsg-hover";t.className="slackmsg-hover-reply";d.textContent=(new Date(1E3*b.b)).toLocaleTimeString();var y=b.a.text||"",y=y.replace(RegExp("<([@#]?)([^>]*)>","g"),function(a,b,c){a=c.split("|");"@"===b?(a[1]?"@"!==a[1][0]&&(a[1]="@"+a[1]):(c=l(E.a,a[0]),a[1]=c?"@"+c.name:"Unknown member"),a[0]="#"+a[0],a[2]="slackmsg-link slackmsg-link-user"):"#"===b?(a[1]?"#"!==a[1][0]&&(a[1]="#"+a[1]):(c=x(E.a,a[0]),a[1]=c?"#"+c.name:"Unknown channel"),a[0]="#"+a[0],a[2]="slackmsg-link slackmsg-link-chan"):
-(a[1]||(a[1]=a[0]),a[2]="slackmsg-link");return'<a href="'+a[0]+'" class="'+a[2]+'"'+(b?"":' target="_blank"')+">"+a[1]+"</a>"});f.innerHTML=y;p.textContent=u?u.name:b.a.username||"?";u||b.a.username||(f.textContent=b.a.subtype||JSON.stringify(b.a));k.src=u?u.b.l:"";e.appendChild(k);e.appendChild(p);q.appendChild(t);c.appendChild(e);c.appendChild(f);c.appendChild(d);c.appendChild(q);return c}
-function J(){var a=0,b=0,c,d;for(d in K)K.hasOwnProperty(d)&&(a+=K[d].m,b+=K[d].j);b&&(c="(!"+b);a&&(c=(c?c+" - ":"(")+a);c=c?c+(") "+E.a.i.name):E.a.i.name;document.title=c}function L(){var a=document.createDocumentFragment(),b=I.id;document.getElementById("chatWindow").textContent="";E.b[b]&&E.b[b].a.forEach(function(c){a.appendChild(H(b,c))});var c=document.getElementById("chatWindow");c.appendChild(a);c.scrollTop=c.scrollHeight-c.clientHeight}
-function M(a){for(;a.target!==a.currentTarget&&a.target;){if(a.target.classList.contains("slack-context-room")){if((a=E.a.f[a.target.id]||E.a.g[a.target.id]||E.a.b[a.target.id])&&a!==I){I&&document.getElementById(I.id).classList.remove("selected");document.getElementById(a.id).classList.add("selected");document.body.classList.remove("no-room-selected");I=a;a=void 0;var b=I.name||(I.c?I.c.name:void 0);if(!b){b=[];for(a in I.a)b.push(I.a[a].name);b=b.join(", ")}document.getElementById("currentRoomTitle").textContent=
-b;L();N();document.getElementById("fileUploadContainer").classList.add("hidden");O();C&&(C=null,G());I.b&&!E.b[I.id]&&(a=new XMLHttpRequest,a.open("GET","api/hist?room="+I.id,!0),a.send(null))}break}a.target=a.target.parentElement}}
-function P(a){for(var b=a.target;b!==a.currentTarget&&b&&!b.classList.contains("slackmsg-hover");){if(b.classList.contains("slackmsg-hover-reply")){a:{for(b=b||a.target;b!==a.currentTarget&&b;){if(b.classList.contains("slackmsg-item")){a=b.id;break a}b=b.parentElement}a=void 0}if(a){a=parseFloat(a.split("_")[1]);for(var b=E.b[I.id].a,c=0,d=b.length;c<d&&b[c].b<=a;c++)if(b[c].b===a){C!==b[c]&&(C=b[c],G());break}}break}b=b.parentElement}}function N(){document.getElementById("msgInput").focus()}
-document.addEventListener("DOMContentLoaded",function(){document.getElementById("chatList").addEventListener("click",M);document.getElementById("chatWindow").addEventListener("click",P);document.getElementById("fileUploadCancel").addEventListener("click",function(a){a.preventDefault();document.getElementById("fileUploadError").classList.add("hidden");document.getElementById("fileUploadContainer").classList.add("hidden");document.getElementById("fileUploadInput").value="";return!1});document.getElementById("fileUploadForm").addEventListener("submit",
-function(a){a.preventDefault();a=document.getElementById("fileUploadInput");var b=a.value;b&&(b=b.substr(b.lastIndexOf("\\")+1),Q(b,a.files[0],function(a){var b=document.getElementById("fileUploadError");a?(b.textContent=a,b.classList.remove("hidden")):(b.classList.add("hidden"),document.getElementById("fileUploadInput").value="",document.getElementById("fileUploadContainer").classList.add("hidden"))}));return!1});document.getElementById("attachFile").addEventListener("click",function(a){a.preventDefault();
-I&&document.getElementById("fileUploadContainer").classList.remove("hidden");return!1});document.getElementById("msgForm").addEventListener("submit",function(a){a.preventDefault();a=document.getElementById("msgInput");if(I&&a.value){var b=I,c=C,d=new XMLHttpRequest,f="api/msg?room="+b.id+"&text="+encodeURIComponent(a.value);if(c){var e=l(E.a,c.c),k="Message";"C"===b.id[0]?k="Channel message":"D"===b.id[0]?k="Direct message":"G"===b.id[0]&&(k="Group message");f+="&attachments="+encodeURIComponent(JSON.stringify([{fallback:c.a.text||
-"",author_name:"<@"+e.id+"|"+e.name+">",author_icon:e.b.l,text:c.a.text||"",footer:k,ts:c.b}]))}d.open("POST",f,!0);d.send(null);a.value="";C&&(C=null,G())}N();return!1});window.addEventListener("blur",function(){window.hasFocus=!1});window.addEventListener("focus",function(){window.hasFocus=!0;I&&O();N()});window.hasFocus=!0;R()});var E,K={};function S(a,b){if(a&&(a!==I||!window.hasFocus)){var c=new RegExp("<@"+E.a.c.id),d=!1;K[a.id]||(K[a.id]={j:0,m:0});b.forEach(function(b){"message"===b.type&&("D"===a.id[0]||b.text.match(c)?(K[a.id].j++,d=!0):K[a.id].m++)});J();document.getElementById(a.id).classList.add("unread");d&&document.getElementById(a.id).classList.add("unreadHi")}}function O(){var a=I;K[a.id]&&(K[a.id]={j:0,m:0},J());a=document.getElementById(a.id);a.classList.remove("unread");a.classList.remove("unreadHi")}
-E=new function(){this.c=0;this.a=new w;this.b={}};var T=0,I=null;function U(a){var b=new XMLHttpRequest;b.timeout=6E4;b.onreadystatechange=function(){if(4===b.readyState)if(b.status){var c=null,d=2===Math.floor(b.status/100);if(d){T&&(T=0,F(!0));c=b.response;try{c=JSON.parse(c)}catch(f){c=null}}else T?(T+=Math.floor((T||5)/2),T=Math.min(60,T)):(T=5,F(!1));a(d,c)}else T&&(T=0,F(!0)),U(a)};b.open("GET","api?v="+E.c,!0);b.send(null)}
-function V(a,b){if(a){if(b){var c=E;b.v&&(c.c=b.v);if(b["static"]){for(var d=c.a,f=b["static"],e=0,k=f.bots.length;e<k;e++)d.h[f.bots[e].id]=new v(f.bots[e]);e=0;for(k=f.users.length;e<k;e++)d.a[f.users[e].id]=new r(f.users[e]);e=0;for(k=f.ims.length;e<k;e++){var p=l(d,f.ims[e].user);p&&(p.a=new n(p,f.ims[e]),d.g[p.a.id]=p.a)}e=0;for(k=f.channels.length;e<k;e++)d.f[f.channels[e].id]=new h(f.channels[e],d);e=0;for(k=f.groups.length;e<k;e++)d.b[f.groups[e].id]=new m(d,f.groups[e]);d.i=new g(f.team);
-d.c=l(d,f.self.id);D()}if(b.live){for(var q in b.live)(d=c.b[q])?B(d,b.live[q]):c.b[q]=new A(q,250,b.live[q]);for(var t in b.live)S(x(c.a,t),b.live[t]),I&&b.live[I.id]&&L()}}R()}else setTimeout(R,1E3*T)}function R(){U(V)}function Q(a,b,c){var d=I;new FileReader;var f=new FormData,e=new XMLHttpRequest;f.append("file",b);f.append("filename",a);e.onreadystatechange=function(){4===e.readyState&&(204===e.status?c(null):c(e.statusText))};e.open("POST","api/file?room="+d.id);e.send(f)};
+function g(a){this.id=a.id;this.name=a.name}function k(a,b){this.id=a.id;this.name=a.name;this.b=parseFloat(a.last_read);this.a={};if(a.members)for(var c=0,d=a.members.length;c<d;c++){var f=r(b,a.members[c]);this.a[f.id]=f;f.f[this.id]=this}}function t(a,b){var c=[];this.id=b.id;this.a={};for(var d=0,f=b.members.length;d<f;d++){var e=r(a,b.members[d]);this.a[b.members[d]]=e;e.f[this.id]=this;c.push(e.name)}this.name=c.join(", ");this.b=parseFloat(b.last_read)}
+function u(a,b){this.id=b.id;this.c=a;this.b=parseFloat(b.last_read)}function x(a){this.id=a.id;this.name=a.name;this.status=a.status;this.b={B:a.profile.image_24,C:a.profile.image_32,l:a.profile.image_48,s:a.profile.image_72,A:a.profile.image_192,F:a.profile.image_512};this.f={};this.a=null}function D(a){this.id=a.id;this.name=a.name;this.b={D:a.icons.image_36,l:a.icons.image_48,s:a.icons.image_72};this.f={};this.a=null}
+function G(){this.i=null;this.f={};this.b={};this.g={};this.a={};this.c=null;this.h={}}function r(a,b){return a.a[b]||a.h[b]||null}function H(a,b){return a.f[b]||a.g[b]||a.b[b]||null}"undefined"!==typeof module&&(module.o.u=G);function aa(a){this.c=a.user;this.b=parseFloat(a.ts);this.a=a}function J(a,b,c){this.id="string"===typeof a?a:a.id;this.a=[];this.b=b;c&&K(this,c)}function K(a,b){var c=0;b.forEach(function(a){c=Math.max(this.push(a),c)}.bind(a))}J.prototype.push=function(a){for(var b=parseFloat(a.ts),c=0,d=this.a.length;c<d;c++)if(this.a[c].b===b)return b;for(this.a.push(new aa(a));this.a.length>this.b;)this.a.shift();return b};"undefined"!==typeof module&&(module.o.w=J);var L=null;
+function ba(){var a=document.createDocumentFragment(),b=M.a.c?Object.keys(M.a.c.f):[];b.sort(function(a,b){return a[0]!==b[0]?a[0]-b[0]:(M.a.f[a]||M.a.b[a]).name.localeCompare((M.a.f[b]||M.a.b[b]).name)});b.forEach(function(b){b=M.a.f[b]||M.a.b[b];var c=document.createElement("li");c.id=b.id;"D"===b.id[0]?c.className="slack-context-room slack-ims":"G"===b.id[0]?c.className="slack-context-room slack-group":"C"===b.id[0]&&(c.className="slack-context-room slack-channel");c.textContent=b.name;c&&a.appendChild(c)});
+b=M.a.a?Object.keys(M.a.a):[];b.sort(function(a,b){return M.a.a[a].name.localeCompare(M.a.a[b].name)});b.forEach(function(b){b=M.a.a[b].a;var c=document.createElement("li");c.id=b.id;c.className="slack-context-room";c.textContent=b.c.name;c&&a.appendChild(c)});document.getElementById("chanList").textContent="";document.getElementById("chanList").appendChild(a)}function N(a){a?document.body.classList.remove("no-network"):document.body.classList.add("no-network")}
+function O(){if(L){document.body.classList.add("replyingTo");var a=document.getElementById("replyToContainer"),b=document.createElement("a");b.addEventListener("click",function(){L=null;O()});b.className="replyto-close";b.textContent="x";a.textContent="";a.appendChild(b);a.appendChild(Q("reply_"+R.id,L))}else document.body.classList.remove("replyingTo")}
+function Q(a,b){var c=document.createElement("div"),d=document.createElement("div"),f=document.createElement("div"),e=document.createElement("div"),m=document.createElement("img"),v=document.createElement("span"),w=document.createElement("ul"),z=document.createElement("li"),A=b.a.user?M.a.a[b.a.user]:M.a.h[b.a.bot_id];c.id=a+"_"+b.b;c.className="slackmsg-item";d.className="slackmsg-ts";f.className="slackmsg-msg";e.className="slackmsg-author";m.className="slackmsg-author-img";v.className="slackmsg-author-name";
+w.className="slackmsg-hover";z.className="slackmsg-hover-reply";d.textContent=(new Date(1E3*b.b)).toLocaleTimeString();for(var y=b.a.text||"",y=y.replace(RegExp("<([@#]?)([^>]*)>","g"),function(a,b,c){a=c.split("|");"@"===b?(a[1]?"@"!==a[1][0]&&(a[1]="@"+a[1]):(c=r(M.a,a[0]),a[1]=c?"@"+c.name:"Unknown member"),a[0]="#"+a[0],a[2]="slackmsg-link slackmsg-link-user"):"#"===b?(a[1]?"#"!==a[1][0]&&(a[1]="#"+a[1]):(c=H(M.a,a[0]),a[1]=c?"#"+c.name:"Unknown channel"),a[0]="#"+a[0],a[2]="slackmsg-link slackmsg-link-chan"):
+(a[1]||(a[1]=a[0]),a[2]="slackmsg-link");return'<a href="'+a[0]+'" class="'+a[2]+'"'+(b?"":' target="_blank"')+">"+a[1]+"</a>"}).split(/\r?\n/g),E=0,ca=y.length;E<ca;E++){for(var n=y[E],p="",h={},P=!1,l=0,I=n.length,F=function(a,b,c){for(;a[b];){if(" "!=a[b]&&a[b]!=c&&a[b+1]==c)return!0;b++}return!1},B=function(a){return Object.keys(h).length?'<span class="'+Object.keys(a).join(" ")+'">':""};l<I&&(" "===n[l]||"\t"===n[l]);)l++;"&gt;"===n.substr(l,4)&&(P=!0,l+=4);for(;l<I;l++){var q=n[l];if(!h["slackmsg-style-bold"]&&
+"*"===q&&n[l+1]&&F(n,l,q))Object.keys(h).length&&(p+="</span>"),h["slackmsg-style-bold"]=!0,p+=B(h);else if(!h["slackmsg-style-strike"]&&"~"===q&&n[l+1]&&F(n,l,q))Object.keys(h).length&&(p+="</span>"),h["slackmsg-style-strike"]=!0,p+=B(h);else if(!h["slackmsg-style-code"]&&"`"===q&&n[l+1]&&F(n,l,q))Object.keys(h).length&&(p+="</span>"),h["slackmsg-style-code"]=!0,p+=B(h);else if(!h["slackmsg-style-italic"]&&"_"===q&&n[l+1]&&F(n,l,q))Object.keys(h).length&&(p+="</span>"),h["slackmsg-style-italic"]=
+!0,p+=B(h);else{var C=!1,p=p+q;do{if(h["slackmsg-style-bold"]&&"*"!==q&&"*"===n[l+1])delete h["slackmsg-style-bold"],C=!0;else if(h["slackmsg-style-strike"]&&"~"!==q&&"~"===n[l+1])delete h["slackmsg-style-strike"],C=!0;else if(h["slackmsg-style-code"]&&"`"!==q&&"`"===n[l+1])delete h["slackmsg-style-code"],C=!0;else if(h["slackmsg-style-italic"]&&"_"!==q&&"_"===n[l+1])delete h["slackmsg-style-italic"],C=!0;else break;q=n[++l]}while(l<I);C&&(p+="</span>"+B(h))}}h&&(p+="</span>");y[E]=P?'<span class="slackmsg-style-quote">'+
+p+"</span>":p}f.innerHTML=y.join("<br/>");v.textContent=A?A.name:b.a.username||"?";A||b.a.username||(f.textContent=b.a.subtype||JSON.stringify(b.a));m.src=A?A.b.l:"";e.appendChild(m);e.appendChild(v);w.appendChild(z);c.appendChild(e);c.appendChild(f);c.appendChild(d);c.appendChild(w);return c}function S(){var a=0,b=0,c,d;for(d in T)T.hasOwnProperty(d)&&(a+=T[d].m,b+=T[d].j);b&&(c="(!"+b);a&&(c=(c?c+" - ":"(")+a);c=c?c+(") "+M.a.i.name):M.a.i.name;document.title=c}
+function U(){var a=document.createDocumentFragment(),b=R.id;document.getElementById("chatWindow").textContent="";M.b[b]&&M.b[b].a.forEach(function(c){a.appendChild(Q(b,c))});var c=document.getElementById("chatWindow");c.appendChild(a);c.scrollTop=c.scrollHeight-c.clientHeight}
+function da(a){for(;a.target!==a.currentTarget&&a.target;){if(a.target.classList.contains("slack-context-room")){if((a=M.a.f[a.target.id]||M.a.g[a.target.id]||M.a.b[a.target.id])&&a!==R){R&&document.getElementById(R.id).classList.remove("selected");document.getElementById(a.id).classList.add("selected");document.body.classList.remove("no-room-selected");R=a;a=void 0;var b=R.name||(R.c?R.c.name:void 0);if(!b){b=[];for(a in R.a)b.push(R.a[a].name);b=b.join(", ")}document.getElementById("currentRoomTitle").textContent=
+b;U();V();document.getElementById("fileUploadContainer").classList.add("hidden");W();L&&(L=null,O());R.b&&!M.b[R.id]&&(a=new XMLHttpRequest,a.open("GET","api/hist?room="+R.id,!0),a.send(null))}break}a.target=a.target.parentElement}}
+function ea(a){for(var b=a.target;b!==a.currentTarget&&b&&!b.classList.contains("slackmsg-hover");){if(b.classList.contains("slackmsg-hover-reply")){a:{for(b=b||a.target;b!==a.currentTarget&&b;){if(b.classList.contains("slackmsg-item")){a=b.id;break a}b=b.parentElement}a=void 0}if(a){a=parseFloat(a.split("_")[1]);for(var b=M.b[R.id].a,c=0,d=b.length;c<d&&b[c].b<=a;c++)if(b[c].b===a){L!==b[c]&&(L=b[c],O());break}}break}b=b.parentElement}}function V(){document.getElementById("msgInput").focus()}
+document.addEventListener("DOMContentLoaded",function(){document.getElementById("chatList").addEventListener("click",da);document.getElementById("chatWindow").addEventListener("click",ea);document.getElementById("fileUploadCancel").addEventListener("click",function(a){a.preventDefault();document.getElementById("fileUploadError").classList.add("hidden");document.getElementById("fileUploadContainer").classList.add("hidden");document.getElementById("fileUploadInput").value="";return!1});document.getElementById("fileUploadForm").addEventListener("submit",
+function(a){a.preventDefault();a=document.getElementById("fileUploadInput");var b=a.value;b&&(b=b.substr(b.lastIndexOf("\\")+1),fa(b,a.files[0],function(a){var b=document.getElementById("fileUploadError");a?(b.textContent=a,b.classList.remove("hidden")):(b.classList.add("hidden"),document.getElementById("fileUploadInput").value="",document.getElementById("fileUploadContainer").classList.add("hidden"))}));return!1});document.getElementById("attachFile").addEventListener("click",function(a){a.preventDefault();
+R&&document.getElementById("fileUploadContainer").classList.remove("hidden");return!1});document.getElementById("msgForm").addEventListener("submit",function(a){a.preventDefault();a=document.getElementById("msgInput");if(R&&a.value){var b=R,c=L,d=new XMLHttpRequest,f="api/msg?room="+b.id+"&text="+encodeURIComponent(a.value);if(c){var e=r(M.a,c.c),m="Message";"C"===b.id[0]?m="Channel message":"D"===b.id[0]?m="Direct message":"G"===b.id[0]&&(m="Group message");f+="&attachments="+encodeURIComponent(JSON.stringify([{fallback:c.a.text||
+"",author_name:"<@"+e.id+"|"+e.name+">",author_icon:e.b.l,text:c.a.text||"",footer:m,ts:c.b}]))}d.open("POST",f,!0);d.send(null);a.value="";L&&(L=null,O())}V();return!1});window.addEventListener("blur",function(){window.hasFocus=!1});window.addEventListener("focus",function(){window.hasFocus=!0;R&&W();V()});window.hasFocus=!0;X()});var M,T={};function ga(a,b){if(a&&(a!==R||!window.hasFocus)){var c=new RegExp("<@"+M.a.c.id),d=!1;T[a.id]||(T[a.id]={j:0,m:0});b.forEach(function(b){"message"===b.type&&("D"===a.id[0]||b.text.match(c)?(T[a.id].j++,d=!0):T[a.id].m++)});S();document.getElementById(a.id).classList.add("unread");d&&document.getElementById(a.id).classList.add("unreadHi")}}function W(){var a=R;T[a.id]&&(T[a.id]={j:0,m:0},S());a=document.getElementById(a.id);a.classList.remove("unread");a.classList.remove("unreadHi")}
+M=new function(){this.c=0;this.a=new G;this.b={}};var Y=0,R=null;function Z(a){var b=new XMLHttpRequest;b.timeout=6E4;b.onreadystatechange=function(){if(4===b.readyState)if(b.status){var c=null,d=2===Math.floor(b.status/100);if(d){Y&&(Y=0,N(!0));c=b.response;try{c=JSON.parse(c)}catch(f){c=null}}else Y?(Y+=Math.floor((Y||5)/2),Y=Math.min(60,Y)):(Y=5,N(!1));a(d,c)}else Y&&(Y=0,N(!0)),Z(a)};b.open("GET","api?v="+M.c,!0);b.send(null)}
+function ha(a,b){if(a){if(b){var c=M;b.v&&(c.c=b.v);if(b["static"]){for(var d=c.a,f=b["static"],e=0,m=f.bots.length;e<m;e++)d.h[f.bots[e].id]=new D(f.bots[e]);e=0;for(m=f.users.length;e<m;e++)d.a[f.users[e].id]=new x(f.users[e]);e=0;for(m=f.ims.length;e<m;e++){var v=r(d,f.ims[e].user);v&&(v.a=new u(v,f.ims[e]),d.g[v.a.id]=v.a)}e=0;for(m=f.channels.length;e<m;e++)d.f[f.channels[e].id]=new k(f.channels[e],d);e=0;for(m=f.groups.length;e<m;e++)d.b[f.groups[e].id]=new t(d,f.groups[e]);d.i=new g(f.team);
+d.c=r(d,f.self.id);ba()}if(b.live){for(var w in b.live)(d=c.b[w])?K(d,b.live[w]):c.b[w]=new J(w,250,b.live[w]);for(var z in b.live)ga(H(c.a,z),b.live[z]),R&&b.live[R.id]&&U()}}X()}else setTimeout(X,1E3*Y)}function X(){Z(ha)}function fa(a,b,c){var d=R;new FileReader;var f=new FormData,e=new XMLHttpRequest;f.append("file",b);f.append("filename",a);e.onreadystatechange=function(){4===e.readyState&&(204===e.status?c(null):c(e.statusText))};e.open("POST","api/file?room="+d.id);e.send(f)};

+ 6 - 0
srv/public/style.css

@@ -58,6 +58,12 @@ body {
 .replyingTo .slack-chat-content { height: calc(100vh - 13em); }
 .replyto-container .replyto-close { position: absolute; display: inline-block; top: 15px; right: 0; height: 1.5em; width: 1.5em; text-align: center; cursor: pointer; z-index: 500; }
 
+.slackmsg-style-bold { font-weight: bold; }
+.slackmsg-style-code { background: #FFF6B4; color: red; }
+.slackmsg-style-italic { font-style: italic; }
+.slackmsg-style-strike { text-decoration: line-through; }
+.slackmsg-style-quote { border-left: 3px solid grey; padding-left: 10px; }
+
 .attach-file-icon { height: 1.5em; vertical-align: bottom; }
 
 .file-upload-container { position: fixed; z-index: 5000; background: rgba(55, 55, 55, 0.8); top: 0; bottom: 0; right: 0; left: 0; max-width: 100%; margin: auto; height: 200px; width: 500px; max-height: 100%; padding: 1.5em; border: 1px solid rgba(55, 55, 55, 1); border-radius: 10px; }