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);
}
}