NOTICE: By continued use of this site you understand and agree to the binding Terms of Service and Privacy Policy.
// ==UserScript==
// @name WhatsApp Emoticon
// @description Tools yang digunakan untuk mengubah emoticon menjadi emoji berdasarkan dengan emoKey.
// @copyright 2018, rzlnhd (https://openuserjs.org/users/rzlnhd)
// @license GPL-3.0-or-later; http://www.gnu.org/licenses/gpl-3.0.txt
// @icon https://i.ibb.co/pXc8bw4/WA-Emot-Icon.png
// @homepageURL https://openuserjs.org/scripts/rzlnhd/WhatsApp_Emoticon
// @supportURL https://openuserjs.org/scripts/rzlnhd/WhatsApp_Emoticon/issues
// @version 1.3.2
// @date 2020-01-23
// @author Rizal Nurhidayat
// @match https://web.whatsapp.com/
// @grant none
// @updateURL https://openuserjs.org/meta/rzlnhd/WhatsApp_Emoticon.meta.js
// @downloadURL https://openuserjs.org/install/rzlnhd/WhatsApp_Emoticon.user.js
// ==/UserScript==
// ==OpenUserJS==
// @author rzlnhd
// ==/OpenUserJS==
/* Global Variables */
var emoti = [" :)"," :D"," <:3"," (/)"," :%"," :z"," :p"," :\')"," :\'D"," :L"," :g"," :^"," :v"," :@"," :o"," ^^"," :*"],
emoji = ["🙂","😁","😍","🙏","👏","✅","😋","😂","🤣","💪","👻","👆","👇","😡","😱","😊","😘"],version = "v1.3.2",
classIn="_3u328" /*input chat*/,
i_alt = ["❤","☺"],
p_def=1,k_bool=true,
c_index=0;
/* First Function */
var timer = setInterval(general,1000);
function general(){
if(document.getElementsByClassName("app")[0] != null){
document.addEventListener("click", function(){initListener(false)});
document.addEventListener("keyup", function(){initListener(true)});
console.log("WhatsApp Emoticon "+version+" - Free Emoticon!");
console.log("Tambahkan spasi sebelum menuliskan emoKey.");
clearInterval(timer);
}
}
/*=====================================
Initial Function : Set Listener
=====================================*/
function initListener(bool){
var obj=document.querySelector("div."+classIn+".copyable-text.selectable-text");
if(obj!=null){
p_def = getCaretPosition(obj);k_bool=bool;
obj.addEventListener("input", eEmoji)
};
}
/*=====================================
Main Function : Change Emoticon to Emoji.
=====================================*/
function eEmoji(e){
var i,html = this.innerHTML,pos,j,
emo=this.getElementsByTagName("img");
for(i=0;i<emoti.length;i++){
if(html.includes(emoti[i])){
html=html.replace(emoti[i],emoji[i]);
j=i;
}
}
pos=p_def;
if(emo.length!=0){
j=-2;
for(i=0;i<i_alt.length;i++){
if(emo[0].getAttributeNode("alt").value===i_alt[i]){
j=-1;if(i==0 && k_bool){j=-3;}
}
}
for(i=0;i<emo.length;i++){
html=html.replace(emo[i].outerHTML,emo[i].getAttributeNode("alt").value)
if(i>0){pos=html.length;j=-3;}
}
this.innerHTML=html;
setCaretPosition(this,pos,j);
} else if(this.innerHTML!=html){
this.innerHTML=html;
setCaretPosition(this,pos,j);
}
}
/*=====================================
Utilities Function : Get and Set Cursor Position
=====================================*/
/* Get Cursor Position */
function getCaretPosition(el) {
var caretPos = 0, sel, range, i;
if (window.getSelection) {
sel = window.getSelection();
if (sel.rangeCount) {
range = sel.getRangeAt(0);
for(i=0;i<el.childNodes.length;i++){
if(range.commonAncestorContainer.nodeValue===el.childNodes[i].nodeValue){
c_index=i;
}
}
if (range.commonAncestorContainer.parentNode == el) {
caretPos = range.endOffset;
}
}
} else if (document.selection && document.selection.createRange) {
range = document.selection.createRange();
if (range.parentElement() == el) {
var tempEl = document.createElement("span");
el.insertBefore(tempEl, el.firstChild);
var tempRange = range.duplicate();
tempRange.moveToElementText(tempEl);
tempRange.setEndPoint("EndToEnd", range);
caretPos = tempRange.text.length;
}
}
return caretPos;
}
/* Set Cursor Position */
function setCaretPosition(el, p, i){
var range,sel;
if(i==2||i==3||i==7||i==8){p-=2;}
else if(i==-1){p+=1;}else if(i==-2){p+=2;}
else if(i==-3){p=p;}else{p-=1;}
if(document.createRange){
range = document.createRange();
sel = window.getSelection();
range.setStart(el.childNodes[c_index], p);
range.collapse(true);
sel.removeAllRanges();
sel.addRange(range);
}
}