From 19b31e2a3dce5776634edd0da9e85f0ea59b57fd Mon Sep 17 00:00:00 2001 From: Jiiks Date: Thu, 29 Oct 2015 15:46:08 +0200 Subject: [PATCH 01/18] Edit injection --- js/main.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/js/main.js b/js/main.js index f1c65c0..9c3ca6e 100644 --- a/js/main.js +++ b/js/main.js @@ -183,6 +183,16 @@ EmoteModule.prototype.init = function() {}; EmoteModule.prototype.obsCallback = function(mutation) { var self = this; + + //Edit injection + if(mutation.addedNodes.length == 1) { + var n = mutation.addedNodes[0]; + if(n.parentNode.tagName == "SPAN") { + //Should be edit + self.injectEmote(n); + } + } + for(var i = 0 ; i < mutation.addedNodes.length ; ++i) { var next = mutation.addedNodes.item(i); if(next) { From f5ad2ab1192176960f66ad69e12b681f77a84eda Mon Sep 17 00:00:00 2001 From: Jiiks Date: Thu, 29 Oct 2015 15:47:43 +0200 Subject: [PATCH 02/18] paretnode --- js/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/main.js b/js/main.js index 9c3ca6e..cf863ac 100644 --- a/js/main.js +++ b/js/main.js @@ -189,7 +189,7 @@ EmoteModule.prototype.obsCallback = function(mutation) { var n = mutation.addedNodes[0]; if(n.parentNode.tagName == "SPAN") { //Should be edit - self.injectEmote(n); + self.injectEmote(n.parentNode); } } From dc07c792976c4ae3a876642bf893c572eb13f422 Mon Sep 17 00:00:00 2001 From: Jiiks Date: Thu, 29 Oct 2015 15:52:12 +0200 Subject: [PATCH 03/18] dev --- js/main.js | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/js/main.js b/js/main.js index cf863ac..9059023 100644 --- a/js/main.js +++ b/js/main.js @@ -184,15 +184,6 @@ EmoteModule.prototype.init = function() {}; EmoteModule.prototype.obsCallback = function(mutation) { var self = this; - //Edit injection - if(mutation.addedNodes.length == 1) { - var n = mutation.addedNodes[0]; - if(n.parentNode.tagName == "SPAN") { - //Should be edit - self.injectEmote(n.parentNode); - } - } - for(var i = 0 ; i < mutation.addedNodes.length ; ++i) { var next = mutation.addedNodes.item(i); if(next) { @@ -200,6 +191,7 @@ EmoteModule.prototype.obsCallback = function(mutation) { for(var node in nodes) { if(nodes.hasOwnProperty(node)) { self.injectEmote(nodes[node]); + console.log(nodes[node]); } } } From 585fc7f1f49603397d885be6771769ac6689faaf Mon Sep 17 00:00:00 2001 From: Jiiks Date: Thu, 29 Oct 2015 15:54:58 +0200 Subject: [PATCH 04/18] debug --- js/main.js | 1 + 1 file changed, 1 insertion(+) diff --git a/js/main.js b/js/main.js index 9059023..a2978fe 100644 --- a/js/main.js +++ b/js/main.js @@ -187,6 +187,7 @@ EmoteModule.prototype.obsCallback = function(mutation) { for(var i = 0 ; i < mutation.addedNodes.length ; ++i) { var next = mutation.addedNodes.item(i); if(next) { + console.log("Next: " + next); var nodes = self.getNodes(next); for(var node in nodes) { if(nodes.hasOwnProperty(node)) { From bbf2c91f8cb3da1251c0792c57335e68f5f8e9c6 Mon Sep 17 00:00:00 2001 From: Jiiks Date: Thu, 29 Oct 2015 15:58:03 +0200 Subject: [PATCH 05/18] more debug --- js/main.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/js/main.js b/js/main.js index a2978fe..c105833 100644 --- a/js/main.js +++ b/js/main.js @@ -200,15 +200,17 @@ EmoteModule.prototype.obsCallback = function(mutation) { }; EmoteModule.prototype.getNodes = function(node) { + console.log("GETNODES=>"); var next; var nodes = []; var treeWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null, false); while(next = treeWalker.nextNode()) { + consol.log("NEXT: " + next); nodes.push(next); } - + console.log("<=GETNODES"); return nodes; }; From d4e12a6ce39541212356445718b02aa5d361db85 Mon Sep 17 00:00:00 2001 From: Jiiks Date: Thu, 29 Oct 2015 15:58:46 +0200 Subject: [PATCH 06/18] typo --- js/main.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/main.js b/js/main.js index c105833..7b4dcbf 100644 --- a/js/main.js +++ b/js/main.js @@ -207,7 +207,7 @@ EmoteModule.prototype.getNodes = function(node) { var treeWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null, false); while(next = treeWalker.nextNode()) { - consol.log("NEXT: " + next); + console.log("NEXT: " + next); nodes.push(next); } console.log("<=GETNODES"); From 69d85fe54a3724221833c207048455cd879797b4 Mon Sep 17 00:00:00 2001 From: Jiiks Date: Thu, 29 Oct 2015 16:51:21 +0200 Subject: [PATCH 07/18] test --- js/main.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/js/main.js b/js/main.js index 7b4dcbf..bf8bc91 100644 --- a/js/main.js +++ b/js/main.js @@ -210,6 +210,16 @@ EmoteModule.prototype.getNodes = function(node) { console.log("NEXT: " + next); nodes.push(next); } + + if(nodes.length < 1) { + treeWalker = document.createTreeWalker(node.parentElement, NodeFilter.SHOW_TEXT); + while(next = treeWalker.nextNode()) { + console.log("PACCEPTED: " + next); + console.log(next); + nodes.push(next); + } + } + console.log("<=GETNODES"); return nodes; }; From 0bd797d89ed234b1682254073c8ffb86a6f7100d Mon Sep 17 00:00:00 2001 From: Jiiks Date: Thu, 29 Oct 2015 16:52:39 +0200 Subject: [PATCH 08/18] d --- js/main.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/js/main.js b/js/main.js index bf8bc91..27c727e 100644 --- a/js/main.js +++ b/js/main.js @@ -200,27 +200,22 @@ EmoteModule.prototype.obsCallback = function(mutation) { }; EmoteModule.prototype.getNodes = function(node) { - console.log("GETNODES=>"); var next; var nodes = []; var treeWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null, false); while(next = treeWalker.nextNode()) { - console.log("NEXT: " + next); nodes.push(next); } if(nodes.length < 1) { treeWalker = document.createTreeWalker(node.parentElement, NodeFilter.SHOW_TEXT); while(next = treeWalker.nextNode()) { - console.log("PACCEPTED: " + next); - console.log(next); nodes.push(next); } } - - console.log("<=GETNODES"); + return nodes; }; From 8ec1d0d6db32a5bb44359f5e2de1b5171a54ce49 Mon Sep 17 00:00:00 2001 From: Jiiks Date: Thu, 29 Oct 2015 16:53:14 +0200 Subject: [PATCH 09/18] d --- js/main.js | 6 ------ 1 file changed, 6 deletions(-) diff --git a/js/main.js b/js/main.js index 27c727e..b7e3dff 100644 --- a/js/main.js +++ b/js/main.js @@ -209,12 +209,6 @@ EmoteModule.prototype.getNodes = function(node) { nodes.push(next); } - if(nodes.length < 1) { - treeWalker = document.createTreeWalker(node.parentElement, NodeFilter.SHOW_TEXT); - while(next = treeWalker.nextNode()) { - nodes.push(next); - } - } return nodes; }; From 5442b1d5a7a441f6c5322ab611c0261162a3efb1 Mon Sep 17 00:00:00 2001 From: Jiiks Date: Thu, 29 Oct 2015 16:53:43 +0200 Subject: [PATCH 10/18] d --- js/main.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/main.js b/js/main.js index b7e3dff..ce36bec 100644 --- a/js/main.js +++ b/js/main.js @@ -203,13 +203,13 @@ EmoteModule.prototype.getNodes = function(node) { var next; var nodes = []; - var treeWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null, false); + var treeWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT); while(next = treeWalker.nextNode()) { nodes.push(next); } - + return nodes; }; From 60fdc8ccc45ccbbfde35757d36cd7cfe6b93b2be Mon Sep 17 00:00:00 2001 From: Jiiks Date: Sat, 31 Oct 2015 23:24:40 +0200 Subject: [PATCH 11/18] Voicemode cycling --- js/main.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/js/main.js b/js/main.js index 3b6dbbf..3762013 100644 --- a/js/main.js +++ b/js/main.js @@ -143,6 +143,7 @@ Core.prototype.initObserver = function() { if(mutation.target.getAttribute('class') != null) { if(mutation.target.getAttribute('class').indexOf("titlebar") != -1) { quickEmoteMenu.obsCallback(); + voiceMode.obsCallback(); } } emoteModule.obsCallback(mutation); @@ -719,6 +720,13 @@ function VoiceMode() { } +VoiceMode.prototype.obsCallback = function() { + if(settingsCookie["bda-gs-4"]) { + this.disable(); + this.enable(); + } +} + VoiceMode.prototype.enable = function() { $(".scroller.guild-channels ul").first().css("display", "none"); $(".scroller.guild-channels header").first().css("display", "none"); From e93db396f3e4f703d5447b2ea092be733853b1fb Mon Sep 17 00:00:00 2001 From: Jiiks Date: Sat, 31 Oct 2015 23:28:09 +0200 Subject: [PATCH 12/18] Same with timeout --- js/main.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/js/main.js b/js/main.js index 3762013..d1a09b1 100644 --- a/js/main.js +++ b/js/main.js @@ -721,9 +721,13 @@ function VoiceMode() { } VoiceMode.prototype.obsCallback = function() { + var self = this; if(settingsCookie["bda-gs-4"]) { - this.disable(); - this.enable(); + self.disable(); + setTimeout(function() { + self.enable(); + }, 200); + } } From 8ee0b97c00c76b9cbf3087decc587426d35d4134 Mon Sep 17 00:00:00 2001 From: Jiiks Date: Sat, 31 Oct 2015 23:30:51 +0200 Subject: [PATCH 13/18] Replace voicemode width with flex-grow --- js/main.js | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/js/main.js b/js/main.js index d1a09b1..156779f 100644 --- a/js/main.js +++ b/js/main.js @@ -143,7 +143,6 @@ Core.prototype.initObserver = function() { if(mutation.target.getAttribute('class') != null) { if(mutation.target.getAttribute('class').indexOf("titlebar") != -1) { quickEmoteMenu.obsCallback(); - voiceMode.obsCallback(); } } emoteModule.obsCallback(mutation); @@ -720,23 +719,13 @@ function VoiceMode() { } -VoiceMode.prototype.obsCallback = function() { - var self = this; - if(settingsCookie["bda-gs-4"]) { - self.disable(); - setTimeout(function() { - self.enable(); - }, 200); - - } -} VoiceMode.prototype.enable = function() { $(".scroller.guild-channels ul").first().css("display", "none"); $(".scroller.guild-channels header").first().css("display", "none"); $(".flex-vertical.flex-spacer").first().css("overflow", "hidden"); $(".chat.flex-vertical.flex-spacer").first().css("visibility", "hidden").css("min-width", "0px"); - $(".flex-vertical.channels-wrap").first().css("width", "100%"); + $(".flex-vertical.channels-wrap").first().css("flex-grow", "100000"); $(".guild-header .btn.btn-hamburger").first().css("visibility", "hidden"); }; @@ -745,6 +734,6 @@ VoiceMode.prototype.disable = function() { $(".scroller.guild-channels header").first().css("display", ""); $(".flex-vertical.flex-spacer").first().css("overflow", ""); $(".chat.flex-vertical.flex-spacer").first().css("visibility", "").css("min-width", ""); - $(".flex-vertical.channels-wrap").first().css("width", ""); + $(".flex-vertical.channels-wrap").first().css("flex-grow", ""); $(".guild-header .btn.btn-hamburger").first().css("visibility", ""); }; \ No newline at end of file From adef28d241bf3c2c8996f7704889c8461e54aca2 Mon Sep 17 00:00:00 2001 From: Jiiks Date: Sat, 31 Oct 2015 23:34:10 +0200 Subject: [PATCH 14/18] Cycling --- js/main.js | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/js/main.js b/js/main.js index 156779f..90ebc16 100644 --- a/js/main.js +++ b/js/main.js @@ -143,6 +143,7 @@ Core.prototype.initObserver = function() { if(mutation.target.getAttribute('class') != null) { if(mutation.target.getAttribute('class').indexOf("titlebar") != -1) { quickEmoteMenu.obsCallback(); + voiceMode.obsCallback(); } } emoteModule.obsCallback(mutation); @@ -719,6 +720,14 @@ function VoiceMode() { } +VoiceMode.prototype.obsCallback = function() { + console.log("voiceMode obs"); + var self = this; + if(settingsCookie["bda-gs-4"]) { + self.disable(); + self.enable(); + } +} VoiceMode.prototype.enable = function() { $(".scroller.guild-channels ul").first().css("display", "none"); From 9a2edd168923825649407ea6ec03dd637a2b747d Mon Sep 17 00:00:00 2001 From: Jiiks Date: Sat, 31 Oct 2015 23:35:57 +0200 Subject: [PATCH 15/18] Remove unused logging --- js/main.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/js/main.js b/js/main.js index 90ebc16..8d83f2a 100644 --- a/js/main.js +++ b/js/main.js @@ -188,12 +188,10 @@ EmoteModule.prototype.obsCallback = function(mutation) { for(var i = 0 ; i < mutation.addedNodes.length ; ++i) { var next = mutation.addedNodes.item(i); if(next) { - console.log("Next: " + next); var nodes = self.getNodes(next); for(var node in nodes) { if(nodes.hasOwnProperty(node)) { self.injectEmote(nodes[node]); - console.log(nodes[node]); } } } @@ -459,7 +457,6 @@ PublicServers.prototype.show = function() { //Workaround for joining a server PublicServers.prototype.joinServer = function(code) { - console.log("Code: " + code); $(".guilds-add").click(); $(".action.join .btn").click(); $(".create-guild-container input").val(code); From a29901e0d4216799c226d0821e1e50062b04dc0d Mon Sep 17 00:00:00 2001 From: Jiiks Date: Sat, 31 Oct 2015 23:40:49 +0200 Subject: [PATCH 16/18] Move overflow to parent --- js/main.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/js/main.js b/js/main.js index 8d83f2a..d7a49c7 100644 --- a/js/main.js +++ b/js/main.js @@ -729,7 +729,8 @@ VoiceMode.prototype.obsCallback = function() { VoiceMode.prototype.enable = function() { $(".scroller.guild-channels ul").first().css("display", "none"); $(".scroller.guild-channels header").first().css("display", "none"); - $(".flex-vertical.flex-spacer").first().css("overflow", "hidden"); + // $(".flex-vertical.flex-spacer").first().css("overflow", "hidden"); + $(".app.flex-vertical").first().css("overflow", "hidden"); $(".chat.flex-vertical.flex-spacer").first().css("visibility", "hidden").css("min-width", "0px"); $(".flex-vertical.channels-wrap").first().css("flex-grow", "100000"); $(".guild-header .btn.btn-hamburger").first().css("visibility", "hidden"); @@ -738,7 +739,8 @@ VoiceMode.prototype.enable = function() { VoiceMode.prototype.disable = function() { $(".scroller.guild-channels ul").first().css("display", ""); $(".scroller.guild-channels header").first().css("display", ""); - $(".flex-vertical.flex-spacer").first().css("overflow", ""); + //$(".flex-vertical.flex-spacer").first().css("overflow", ""); + $(".app.flex-vertical").first().css("overflow", ""); $(".chat.flex-vertical.flex-spacer").first().css("visibility", "").css("min-width", ""); $(".flex-vertical.channels-wrap").first().css("flex-grow", ""); $(".guild-header .btn.btn-hamburger").first().css("visibility", ""); From 28857829751f7788bd9e2fc27e2ec9d7241a125b Mon Sep 17 00:00:00 2001 From: Jiiks Date: Sat, 31 Oct 2015 23:46:37 +0200 Subject: [PATCH 17/18] timeout --- js/main.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/js/main.js b/js/main.js index d7a49c7..043012d 100644 --- a/js/main.js +++ b/js/main.js @@ -722,7 +722,10 @@ VoiceMode.prototype.obsCallback = function() { var self = this; if(settingsCookie["bda-gs-4"]) { self.disable(); - self.enable(); + setTimeout(function() { + self.enable(); + }, 300); + } } From 007e7cfae3f66017fc44512547d07e3c92171414 Mon Sep 17 00:00:00 2001 From: Jiiks Date: Sat, 31 Oct 2015 23:49:42 +0200 Subject: [PATCH 18/18] Temp fix for voicemode bug --- js/main.js | 2 +- js/main.min.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/js/main.js b/js/main.js index 043012d..8e79dbc 100644 --- a/js/main.js +++ b/js/main.js @@ -202,7 +202,7 @@ EmoteModule.prototype.getNodes = function(node) { var next; var nodes = []; - var treeWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT); + var treeWalker = document.createTreeWalker(node, NodeFilter.SHOW_TEXT, null, false); while(next = treeWalker.nextNode()) { nodes.push(next); diff --git a/js/main.min.js b/js/main.min.js index 27bdad3..607c2c3 100644 --- a/js/main.min.js +++ b/js/main.min.js @@ -1 +1 @@ -function Core(){}function EmoteModule(){}function PublicServers(){}function QuickEmoteMenu(){}function SettingsPanel(){}function Utils(){}function VoiceMode(){}var settingsPanel,emoteModule,utils,quickEmoteMenu,opublicServers,voiceMode,jsVersion=1.3,supportedVersion="0.1.5",mainObserver,twitchEmoteUrlStart="https://static-cdn.jtvnw.net/emoticons/v1/",twitchEmoteUrlEnd="/1.0",ffzEmoteUrlStart="https://cdn.frankerfacez.com/emoticon/",ffzEmoteUrlEnd="/1",bttvEmoteUrlStart="",bttvEmoteUrlEnd="",mainCore,settings={"Save logs locally":{id:"bda-gs-0",info:"Saves chat logs locally",implemented:!1},"Public Servers":{id:"bda-gs-1",info:"BETA : Display public servers button",implemented:!0},"Minimal Mode":{id:"bda-gs-2",info:"Hide elements and reduce the size of elements.",implemented:!0},"Voice Mode":{id:"bda-gs-4",info:"Only show voice chat",implemented:!0},"Hide Channels":{id:"bda-gs-3",info:"Hide channels in minimal mode",implemented:!0},"Quick Emote Menu":{id:"bda-es-0",info:"Show quick emote menu for adding emotes",implemented:!0},"FrankerFaceZ Emotes":{id:"bda-es-1",info:"Show FrankerFaceZ Emotes",implemented:!0},"BetterTTV Emotes":{id:"bda-es-2",info:"Show BetterTTV Emotes",implemented:!0},"Emote Autocomplete":{id:"bda-es-3",info:"Autocomplete emote commands",implemented:!1},"Emote Auto Capitalization":{id:"bda-es-4",info:"Autocapitalize emote commands",implemented:!0},"Override Default Emotes":{id:"bda-es-5",info:"Override default emotes",implemented:!1}},defaultCookie={version:jsVersion,"bda-gs-0":!1,"bda-gs-1":!0,"bda-gs-2":!1,"bda-gs-3":!1,"bda-gs-4":!1,"bda-es-0":!0,"bda-es-1":!1,"bda-es-2":!1,"bda-es-3":!1,"bda-es-4":!1,"bda-es-5":!0},settingsCookie={};Core.prototype.init=function(){function e(){if(console.log((new Date).getTime()+" Defer"),$(".guilds-wrapper .guilds").children().length>0){console.log((new Date).getTime()+" Defer Loaded");var t=$(".guilds li:first-child");t.after($("
  • ",{id:"bd-pub-li",css:{height:"20px",display:1==settingsCookie["bda-gs-1"]?"":"none"}}).append($("
    ",{"class":"guild-inner",css:{height:"20px","border-radius":"4px"}}).append($("").append($("
    ",{css:{"line-height":"20px","font-size":"12px"},text:"public",id:"bd-pub-button"}))))),t.after($("
  • ",{id:"tc-settings-li"}).append($("
    ",{"class":"guild-inner"}).append($("").append($("
    ",{"class":"avatar-small",id:"tc-settings-button"}))))),settingsPanel=new SettingsPanel,settingsPanel.init(),quickEmoteMenu.init(!1),$("#tc-settings-button").on("click",function(){settingsPanel.show()}),$("#bd-pub-button").on("click",function(){opublicServers.show()}),opublicServers=new PublicServers,opublicServers.init(),emoteModule.autoCapitalize()}else setTimeout(e,100)}return version")):"undefined"!=typeof emotesFfz&&settingsCookie["bda-es-1"]&&emotesFfz.hasOwnProperty(e)?void(i=i.replace(e,"")):"undefined"!=typeof emotesBTTV&&settingsCookie["bda-es-2"]&&emotesBTTV.hasOwnProperty(e)?void(i=i.replace(e,"")):void(subEmotesTwitch.hasOwnProperty(e)&&(i=i.replace(e,"")))}),null!=t.parentElement)){var n=t.parentElement.offsetHeight;t.innerHTML=i;var a=t.parentElement.offsetHeight,s=$(".scroller.messages").first();s.scrollTop(s.scrollTop()+(a-n))}}}},EmoteModule.prototype.autoCapitalize=function(){var e=this;$("body").delegate($(".channel-textarea-inner textarea"),"keyup change paste",function(){if(settingsCookie["bda-es-4"]){var t=$(".channel-textarea-inner textarea").val();if(void 0!=t){var i=t.split(" ").pop();if(i.length>3){var o=e.capitalize(i.toLowerCase());null!=o&&$(".channel-textarea-inner textarea").val(t.replace(i,o))}}}})},EmoteModule.prototype.capitalize=function(e){return twitchAc.hasOwnProperty(e)?twitchAc[e]:null};var publicServers={servers:{server:{code:0,icon:null,title:"title",language:"EN",description:"description"}}};PublicServers.prototype.getPanel=function(){return this.container},PublicServers.prototype.init=function(){var e=this;this.container=$("
    ",{id:"bd-ps-container",style:"display:none"});var t=$("
    ",{id:"bd-ps-header"});$("

    ",{text:"Public Servers"}).appendTo(t),$("",{id:"bd-ps-close",style:"cursor:pointer;",text:"X"}).appendTo(t),t.appendTo(this.getPanel());var i=$("
    ",{id:"bd-ps-body"});i.appendTo(this.getPanel());var o=$("",{border:"0"}),n=$("");n.appendTo(o);var a=$("",{}).append($("",{id:"bd-ps-tbody"});s.appendTo(o),o.appendTo(i),$("body").append(this.getPanel()),$("#bd-ps-close").on("click",function(){e.show()});var r=publicServers.servers;for(var l in r)if(r.hasOwnProperty(l)){var d=r[l],c=d.code,p=d.title,u=d.language,m=d.description;this.addServer(l,c,p,u,m)}},PublicServers.prototype.addServer=function(e,t,i,o,n){var a=this,s=$("#bd-ps-tbody"),r=$("");l.append($("
    ",{text:"Name"})).append($("",{text:"Code"})).append($("",{text:"Language"})).append($("",{text:"Description"})).append($("",{text:"Join"}));a.appendTo(n);var s=$("
    ").append($("
    ",{"class":"bd-ps-description",text:n})),l=$("
    ",{text:i})),l.append($("",{css:{"-webkit-user-select":"initial","user-select":"initial"},text:t})),l.append($("",{text:o})),l.append(r),l.append($("").append($("