From 775e70bc4593774edc41bb87eb49230773cdaa44 Mon Sep 17 00:00:00 2001
From: chylex <contact@chylex.com>
Date: Mon, 5 Jun 2017 21:54:39 +0200
Subject: [PATCH] Rewrite HTML generation in emoji-keyboard & add emoji names
 to elements

---
 Resources/Plugins/emoji-keyboard/browser.js | 83 ++++++++++++++-------
 1 file changed, 54 insertions(+), 29 deletions(-)

diff --git a/Resources/Plugins/emoji-keyboard/browser.js b/Resources/Plugins/emoji-keyboard/browser.js
index fb56b84e..ffc750ff 100644
--- a/Resources/Plugins/emoji-keyboard/browser.js
+++ b/Resources/Plugins/emoji-keyboard/browser.js
@@ -20,9 +20,10 @@ enabled(){
   
   this.emojiURL = "https://ton.twimg.com/tweetdeck-web/web/assets/emoji/";
   
-  this.emojiHTML1 = ""; // no skin tones, prepended
-  this.emojiHTML2 = {}; // contains emojis with skin tones
-  this.emojiHTML3 = ""; // no skin tones, appended
+  this.emojiData1 = []; // no skin tones, prepended
+  this.emojiData2 = {}; // contains emojis with skin tones
+  this.emojiData3 = []; // no skin tones, appended
+  this.emojiNames = [];
   
   var me = this;
   
@@ -64,7 +65,22 @@ enabled(){
   };
   
   var generateEmojiHTML = skinTone => {
-    return (this.emojiHTML1+this.emojiHTML2[skinTone]+this.emojiHTML3).replace(/u#/g, this.emojiURL);
+    let index = 0;
+    let html = [ "<p style='font-size:13px;color:#444;margin:4px;text-align:center'>Please, note that most emoji will not show up properly in the text box above, but they will display in the tweet.</p>" ];
+    
+    for(let array of [ this.emojiData1, this.emojiData2[skinTone], this.emojiData3 ]){
+      for(let emoji of array){
+        if (emoji === "___"){
+          html.push("<div class='separator'></div>");
+        }
+        else{
+          html.push(TD.util.cleanWithEmoji(emoji).replace(' class="emoji" draggable="false"', ` data-x="${this.emojiNames[index]}"`));
+          index++;
+        }
+      }
+    }
+    
+    return html.join("");
   };
   
   var selectSkinTone = skinTone => {
@@ -190,18 +206,18 @@ ready(){
   };
   
   $TDP.readFileRoot(this.$token, "emoji-ordering.txt").then(contents => {
-    let generated1 = [];
-    let generated2 = {};
-    let generated3 = [];
+    let names1 = [];
+    let names2 = [];
+    let names3 = [];
     
     for(let skinTone of this.skinToneList){
-      generated2[skinTone] = [];
+      this.emojiData2[skinTone] = [];
     }
     
     // declaration inserters
     
     let addDeclaration1 = decl => {
-      generated1.push(decl.split(" ").map(pt => convUnicode(parseInt(pt, 16))).join(""));
+      this.emojiData1.push(decl.split(" ").map(pt => convUnicode(parseInt(pt, 16))).join(""));
     };
     
     let addDeclaration2 = (tone, decl) => {
@@ -209,16 +225,16 @@ ready(){
       
       if (tone === null){
         for(let skinTone of this.skinToneList){
-          generated2[skinTone].push(gen);
+          this.emojiData2[skinTone].push(gen);
         }
       }
       else{
-        generated2[tone].push(gen);
+        this.emojiData2[tone].push(gen);
       }
     };
     
     let addDeclaration3 = decl => {
-      generated3.push(decl.split(" ").map(pt => convUnicode(parseInt(pt, 16))).join(""));
+      this.emojiData3.push(decl.split(" ").map(pt => convUnicode(parseInt(pt, 16))).join(""));
     };
     
     // line reading
@@ -228,9 +244,9 @@ ready(){
     for(let line of contents.split("\n")){
       if (line[0] === '@'){
         switch(skinToneState){
-          case 0: generated1.push("___"); break;
-          case 1: this.skinToneList.forEach(skinTone => generated2[skinTone].push("___")); break;
-          case 2: generated3.push("___"); break;
+          case 0: this.emojiData1.push("___"); break;
+          case 1: this.skinToneList.forEach(skinTone => this.emojiData2[skinTone].push("___")); break;
+          case 2: this.emojiData3.push("___"); break;
         }
         
         if (line[1] === '1'){
@@ -239,9 +255,15 @@ ready(){
         else if (line[1] === '2'){
           skinToneState = 2;
         }
+        
+        continue;
       }
-      else if (skinToneState === 1){
-        let decl = line.slice(0, line.indexOf(';'));
+      
+      let semicolon = line.indexOf(';');
+      let decl = line.slice(0, semicolon);
+      let desc = line.slice(semicolon+1);
+      
+      if (skinToneState === 1){
         let skinIndex = decl.indexOf('$');
 
         if (skinIndex !== -1){
@@ -249,35 +271,38 @@ ready(){
           let declPost = decl.slice(skinIndex+1);
           
           for(let skinTone of this.skinToneNonDefaultList){
-            generated2[skinTone].pop();
+            this.emojiData2[skinTone].pop();
             addDeclaration2(skinTone, declPre+skinTone+declPost);
           }
         }
         else{
           addDeclaration2(null, decl);
+          names2.push(desc);
         }
       }
       else if (skinToneState === 2){
-        addDeclaration3(line.slice(0, line.indexOf(';')));
+        addDeclaration3(decl);
+        names3.push(desc);
       }
       else if (skinToneState === 0){
-        addDeclaration1(line.slice(0, line.indexOf(';')));
+        addDeclaration1(decl);
+        names1.push(desc);
       }
     }
     
     // final processing
     
-    let urlRegex = new RegExp(this.emojiURL.replace(/\./g, "\\."), "g");
-    let process = str => TD.util.cleanWithEmoji(str).replace(/ class=\"emoji\" draggable=\"false\"/g, "").replace(urlRegex, "u#").replace(/___/g, "<div class='separator'></div>");
-    
-    let start = "<p style='font-size:13px;color:#444;margin:4px;text-align:center'>Please, note that most emoji will not show up properly in the text box above, but they will display in the tweet.</p>";
-    this.emojiHTML1 = start+process(generated1.join(""));
-    
-    for(let skinTone of this.skinToneList){
-      this.emojiHTML2[skinTone] = process(generated2[skinTone].join(""));
+    for(let name of names1){
+      this.emojiNames.push(name);
     }
     
-    this.emojiHTML3 = process(generated3.join(""));
+    for(let name of names2){
+      this.emojiNames.push(name);
+    }
+    
+    for(let name of names3){
+      this.emojiNames.push(name);
+    }
   }).catch(err => {
     $TD.alert("error", "Problem loading emoji keyboard: "+err.message);
   });