Răsfoiți Sursa

[Fix #15] interpret links

B Thibault 8 ani în urmă
părinte
comite
9dc9277b93
3 a modificat fișierele cu 50 adăugiri și 15 ștergeri
  1. 4 0
      cli/resources.js
  2. 31 1
      cli/ui.js
  3. 15 14
      srv/public/slack.min.js

+ 4 - 0
cli/resources.js

@@ -35,6 +35,10 @@ var R = {
                 container: "slackmsg-hover"
                 ,reply: "slackmsg-hover-reply"
             }
+
+            ,link: "slackmsg-link"
+            ,linkuser: "slackmsg-link-user"
+            ,linkchan: "slackmsg-link-chan"
         }
     }
 };

+ 31 - 1
cli/ui.js

@@ -103,7 +103,37 @@ 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();
-    text.textContent = msg.raw["text"];
+    var msgContent = msg.raw["text"] || "";
+    msgContent = msgContent
+        .replace(new RegExp('<([@#]?)([^>]*)>', 'g'),
+            function(_, type, entity) {
+                var sub = entity.split('|');
+
+                if (type === '@') {
+                    if (!sub[1]) {
+                        var user = SLACK.context.getMember(sub[0]);
+                        sub[1] = user ? user.name : "Unknown member"; // TODO locale
+                    }
+                    sub[0] = '#' +sub[0];
+                    sub[2] = R.klass.msg.link +' ' +R.klass.msg.linkuser;
+                } else if (type === '#') {
+                    if (!sub[1]) {
+                        var chan = SLACK.context.getChannel(sub[0]);
+                        sub[1] = chan ? ('#' +chan.name) : "Unknown channel"; // TODO locale
+                    } 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[1])
+                        sub[1] = sub[0];
+                    sub[2] = R.klass.msg.link;
+                }
+                return '<a href="' +sub[0] +'" class="' +sub[2] +'"' +(!type ? ' target="_blank"' : '') +'>' +sub[1] +'</a>';
+            })
+    ;
+    text.innerHTML = msgContent;
     authorName.textContent = sender ? sender.name : (msg.raw["username"] || "?");
     authorImg.src = sender ? sender.icons.image_48 : "";
     author.appendChild(authorImg);

+ 15 - 14
srv/public/slack.min.js

@@ -1,14 +1,15 @@
-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=m(b,a.members[c]);this.a[f.id]=f;f.c[this.id]=this}}function q(a,b){var c=[];this.id=b.id;this.a={};for(var d=0,f=b.members.length;d<f;d++){var e=m(a,b.members[d]);this.a[b.members[d]]=e;e.c[this.id]=this;c.push(e.name)}this.name=c.join(", ");this.b=parseFloat(b.last_read)}
-function r(a,b){this.id=b.id;this.f=a;this.b=parseFloat(b.last_read)}function u(a){this.id=a.id;this.name=a.name;this.status=a.status;this.b={A:a.profile.image_24,B:a.profile.image_32,l:a.profile.image_48,o:a.profile.image_72,w:a.profile.image_192,D:a.profile.image_512};this.c={};this.a=null}function v(a){this.id=a.id;this.name=a.name;this.b={C:a.icons.image_36,l:a.icons.image_48,o:a.icons.image_72};this.c={};this.a=null}
-function w(){this.j=null;this.c={};this.b={};this.f={};this.a={};this.h=null;this.i={}}function m(a,b){return a.a[b]||a.i[b]||null}"undefined"!==typeof module&&(module.m.s=w);function x(a){this.g=parseFloat(a.ts);this.raw=a}function y(a,b,c){this.id="string"===typeof a?a:a.id;this.a=[];this.b=b;c&&z(this,c)}function z(a,b){var c=0;b.forEach(function(a){c=Math.max(this.push(a),c)}.bind(a))}y.prototype.push=function(a){for(var b=parseFloat(a.ts),c=0,d=this.a.length;c<d;c++)if(this.a[c].g===b)return b;for(this.a.push(new x(a));this.a.length>this.b;)this.a.shift();return b};"undefined"!==typeof module&&(module.m.u=y);function A(){var a=document.createDocumentFragment(),b=B.a.h?Object.keys(B.a.h.c):[];b.sort(function(a,b){return a[0]!==b[0]?a[0]-b[0]:(B.a.c[a]||B.a.b[a]).name.localeCompare((B.a.c[b]||B.a.b[b]).name)});b.forEach(function(b){b=B.a.c[b]||B.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=B.a.a?Object.keys(B.a.a):[];b.sort(function(a,b){return B.a.a[a].name.localeCompare(B.a.a[b].name)});b.forEach(function(b){b=B.a.a[b].a;var c=document.createElement("li");c.id=b.id;c.className="slack-context-room";c.textContent=b.f.name;c&&a.appendChild(c)});document.getElementById("chanList").textContent="";document.getElementById("chanList").appendChild(a)}function C(a){a?document.body.classList.remove("no-network"):document.body.classList.add("no-network")}
-function D(a,b){var c=document.createElement("div"),d=document.createElement("div"),f=document.createElement("div"),e=document.createElement("div"),l=document.createElement("img"),n=document.createElement("span"),k=document.createElement("ul"),p=document.createElement("li"),t=b.raw.user?B.a.a[b.raw.user]:B.a.i[b.raw.bot_id];c.id=a+"_"+b.g;c.className="slackmsg-item";d.className="slackmsg-ts";f.className="slackmsg-msg";e.className="slackmsg-author";l.className="slackmsg-author-img";n.className="slackmsg-author-name";
-k.className="slackmsg-hover";p.className="slackmsg-hover-reply";d.textContent=(new Date(1E3*b.g)).toLocaleTimeString();f.textContent=b.raw.text;n.textContent=t?t.name:b.raw.username||"?";l.src=t?t.b.l:"";e.appendChild(l);e.appendChild(n);k.appendChild(p);c.appendChild(e);c.appendChild(f);c.appendChild(d);c.appendChild(k);return c}function E(){var a=0,b;for(b in F)F.hasOwnProperty(b)&&(a+=F[b]);document.title=(a?"("+a+") - ":"")+B.a.j.name}
-function G(){var a=H;F[a.id]&&(F[a.id]=0,E());a=document.getElementById(a.id);a.classList.remove("unread");a.classList.remove("unreadHi")}function I(){var a=document.createDocumentFragment(),b=H.id;document.getElementById("chatWindow").textContent="";B.b[b]&&B.b[b].a.forEach(function(c){a.appendChild(D(b,c))});var c=document.getElementById("chatWindow");c.appendChild(a);c.scrollTop=c.scrollHeight-c.clientHeight}
-function J(a){for(;a.target!==a.currentTarget&&a.target;){if(a.target.classList.contains("slack-context-room")){if((a=B.a.c[a.target.id]||B.a.f[a.target.id]||B.a.b[a.target.id])&&a!==H){H&&document.getElementById(H.id).classList.remove("selected");document.getElementById(a.id).classList.add("selected");document.body.classList.remove("no-room-selected");H=a;a=void 0;var b=H.name||(H.f?H.f.name:void 0);if(!b){b=[];for(a in H.a)b.push(H.a[a].name);b=b.join(", ")}document.getElementById("currentRoomTitle").textContent=
-b;I();G();H.b&&!B.b[H.id]&&(a=new XMLHttpRequest,a.open("GET","api/hist?room="+H.id,!0),a.send(null))}break}a.target=a.target.parentElement}}
-function K(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=B.b[H.id].a,c=0,d=b.length;c<d&&b[c].g<=a;c++)if(b[c].g===a){console.log("Replying to ",b[c]);break}}break}b=b.parentElement}}
-document.addEventListener("DOMContentLoaded",function(){document.getElementById("chatList").addEventListener("click",J);document.getElementById("chatWindow").addEventListener("click",K);document.getElementById("msgForm").addEventListener("submit",function(a){a.preventDefault();a=document.getElementById("msgInput");if(H&&a.value){var b=new XMLHttpRequest;b.open("POST","api/msg?room="+H.id+"&text="+encodeURIComponent(a.value),!0);b.send(null);a.value=""}return!1});window.addEventListener("blur",function(){window.hasFocus=
-!1});window.addEventListener("focus",function(){window.hasFocus=!0;H&&G()});window.hasFocus=!0;L()});var B,F={};B=new function(){this.f=0;this.a=new w;this.b={}};var M=0,H=null;function N(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){M&&(M=0,C(!0));c=b.response;try{c=JSON.parse(c)}catch(f){c=null}}else M?(M+=Math.floor((M||5)/2),M=Math.min(60,M)):(M=5,C(!1));a(d,c)}else M&&(M=0,C(!0)),N(a)};b.open("GET","api?v="+B.f,!0);b.send(null)}
-function O(a,b){if(a){if(b){var c=B;b.v&&(c.f=b.v);if(b["static"]){for(var d=c.a,f=b["static"],e=0,l=f.bots.length;e<l;e++)d.i[f.bots[e].id]=new v(f.bots[e]);e=0;for(l=f.users.length;e<l;e++)d.a[f.users[e].id]=new u(f.users[e]);e=0;for(l=f.ims.length;e<l;e++){var n=m(d,f.ims[e].user);n&&(n.a=new r(n,f.ims[e]),d.f[n.a.id]=n.a)}e=0;for(l=f.channels.length;e<l;e++)d.c[f.channels[e].id]=new h(f.channels[e],d);e=0;for(l=f.groups.length;e<l;e++)d.b[f.groups[e].id]=new q(d,f.groups[e]);d.j=new g(f.team);
-d.h=m(d,f.self.id);A()}if(b.live){for(var k in b.live)(d=c.b[k])?z(d,b.live[k]):c.b[k]=new y(k,500,b.live[k]);for(var p in b.live)k=c.a,k=k.c[p]||k.f[p]||k.b[p]||null,d=b.live[p],!k||k===H&&window.hasFocus||(document.getElementById(k.id).classList.add("unread"),F[k.id]=(F[k.id]||0)+d.length,E()),H&&b.live[H.id]&&I()}}L()}else setTimeout(L,1E3*M)}function L(){N(O)};
+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=m(b,a.members[c]);this.a[f.id]=f;f.c[this.id]=this}}function p(a,b){var c=[];this.id=b.id;this.a={};for(var d=0,f=b.members.length;d<f;d++){var e=m(a,b.members[d]);this.a[b.members[d]]=e;e.c[this.id]=this;c.push(e.name)}this.name=c.join(", ");this.b=parseFloat(b.last_read)}
+function q(a,b){this.id=b.id;this.f=a;this.b=parseFloat(b.last_read)}function u(a){this.id=a.id;this.name=a.name;this.status=a.status;this.b={A:a.profile.image_24,B:a.profile.image_32,l:a.profile.image_48,o:a.profile.image_72,w:a.profile.image_192,D:a.profile.image_512};this.c={};this.a=null}function v(a){this.id=a.id;this.name=a.name;this.b={C:a.icons.image_36,l:a.icons.image_48,o:a.icons.image_72};this.c={};this.a=null}
+function x(){this.j=null;this.c={};this.b={};this.f={};this.a={};this.h=null;this.i={}}function m(a,b){return a.a[b]||a.i[b]||null}function y(a,b){return a.c[b]||a.f[b]||a.b[b]||null}"undefined"!==typeof module&&(module.m.s=x);function z(a){this.g=parseFloat(a.ts);this.raw=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].g===b)return b;for(this.a.push(new z(a));this.a.length>this.b;)this.a.shift();return b};"undefined"!==typeof module&&(module.m.u=A);function C(){var a=document.createDocumentFragment(),b=D.a.h?Object.keys(D.a.h.c):[];b.sort(function(a,b){return a[0]!==b[0]?a[0]-b[0]:(D.a.c[a]||D.a.b[a]).name.localeCompare((D.a.c[b]||D.a.b[b]).name)});b.forEach(function(b){b=D.a.c[b]||D.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=D.a.a?Object.keys(D.a.a):[];b.sort(function(a,b){return D.a.a[a].name.localeCompare(D.a.a[b].name)});b.forEach(function(b){b=D.a.a[b].a;var c=document.createElement("li");c.id=b.id;c.className="slack-context-room";c.textContent=b.f.name;c&&a.appendChild(c)});document.getElementById("chanList").textContent="";document.getElementById("chanList").appendChild(a)}function E(a){a?document.body.classList.remove("no-network"):document.body.classList.add("no-network")}
+function F(a,b){var c=document.createElement("div"),d=document.createElement("div"),f=document.createElement("div"),e=document.createElement("div"),l=document.createElement("img"),n=document.createElement("span"),k=document.createElement("ul"),r=document.createElement("li"),t=b.raw.user?D.a.a[b.raw.user]:D.a.i[b.raw.bot_id];c.id=a+"_"+b.g;c.className="slackmsg-item";d.className="slackmsg-ts";f.className="slackmsg-msg";e.className="slackmsg-author";l.className="slackmsg-author-img";n.className="slackmsg-author-name";
+k.className="slackmsg-hover";r.className="slackmsg-hover-reply";d.textContent=(new Date(1E3*b.g)).toLocaleTimeString();var w=b.raw.text||"",w=w.replace(RegExp("<([@#]?)([^>]*)>","g"),function(a,b,c){a=c.split("|");"@"===b?(a[1]||(c=m(D.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=y(D.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=w;n.textContent=t?t.name:b.raw.username||"?";l.src=t?t.b.l:"";e.appendChild(l);e.appendChild(n);k.appendChild(r);c.appendChild(e);c.appendChild(f);c.appendChild(d);c.appendChild(k);return c}function G(){var a=0,b;for(b in H)H.hasOwnProperty(b)&&(a+=H[b]);document.title=(a?"("+a+") - ":"")+D.a.j.name}
+function I(){var a=J;H[a.id]&&(H[a.id]=0,G());a=document.getElementById(a.id);a.classList.remove("unread");a.classList.remove("unreadHi")}function K(){var a=document.createDocumentFragment(),b=J.id;document.getElementById("chatWindow").textContent="";D.b[b]&&D.b[b].a.forEach(function(c){a.appendChild(F(b,c))});var c=document.getElementById("chatWindow");c.appendChild(a);c.scrollTop=c.scrollHeight-c.clientHeight}
+function L(a){for(;a.target!==a.currentTarget&&a.target;){if(a.target.classList.contains("slack-context-room")){if((a=D.a.c[a.target.id]||D.a.f[a.target.id]||D.a.b[a.target.id])&&a!==J){J&&document.getElementById(J.id).classList.remove("selected");document.getElementById(a.id).classList.add("selected");document.body.classList.remove("no-room-selected");J=a;a=void 0;var b=J.name||(J.f?J.f.name:void 0);if(!b){b=[];for(a in J.a)b.push(J.a[a].name);b=b.join(", ")}document.getElementById("currentRoomTitle").textContent=
+b;K();I();J.b&&!D.b[J.id]&&(a=new XMLHttpRequest,a.open("GET","api/hist?room="+J.id,!0),a.send(null))}break}a.target=a.target.parentElement}}
+function M(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=D.b[J.id].a,c=0,d=b.length;c<d&&b[c].g<=a;c++)if(b[c].g===a){console.log("Replying to ",b[c]);break}}break}b=b.parentElement}}
+document.addEventListener("DOMContentLoaded",function(){document.getElementById("chatList").addEventListener("click",L);document.getElementById("chatWindow").addEventListener("click",M);document.getElementById("msgForm").addEventListener("submit",function(a){a.preventDefault();a=document.getElementById("msgInput");if(J&&a.value){var b=new XMLHttpRequest;b.open("POST","api/msg?room="+J.id+"&text="+encodeURIComponent(a.value),!0);b.send(null);a.value=""}return!1});window.addEventListener("blur",function(){window.hasFocus=
+!1});window.addEventListener("focus",function(){window.hasFocus=!0;J&&I()});window.hasFocus=!0;N()});var D,H={};D=new function(){this.f=0;this.a=new x;this.b={}};var O=0,J=null;function P(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){O&&(O=0,E(!0));c=b.response;try{c=JSON.parse(c)}catch(f){c=null}}else O?(O+=Math.floor((O||5)/2),O=Math.min(60,O)):(O=5,E(!1));a(d,c)}else O&&(O=0,E(!0)),P(a)};b.open("GET","api?v="+D.f,!0);b.send(null)}
+function Q(a,b){if(a){if(b){var c=D;b.v&&(c.f=b.v);if(b["static"]){for(var d=c.a,f=b["static"],e=0,l=f.bots.length;e<l;e++)d.i[f.bots[e].id]=new v(f.bots[e]);e=0;for(l=f.users.length;e<l;e++)d.a[f.users[e].id]=new u(f.users[e]);e=0;for(l=f.ims.length;e<l;e++){var n=m(d,f.ims[e].user);n&&(n.a=new q(n,f.ims[e]),d.f[n.a.id]=n.a)}e=0;for(l=f.channels.length;e<l;e++)d.c[f.channels[e].id]=new h(f.channels[e],d);e=0;for(l=f.groups.length;e<l;e++)d.b[f.groups[e].id]=new p(d,f.groups[e]);d.j=new g(f.team);
+d.h=m(d,f.self.id);C()}if(b.live){for(var k in b.live)(d=c.b[k])?B(d,b.live[k]):c.b[k]=new A(k,500,b.live[k]);for(var r in b.live)k=y(c.a,r),d=b.live[r],!k||k===J&&window.hasFocus||(document.getElementById(k.id).classList.add("unread"),H[k.id]=(H[k.id]||0)+d.length,G()),J&&b.live[J.id]&&K()}}N()}else setTimeout(N,1E3*O)}function N(){P(Q)};