Skip to content

Instantly share code, notes, and snippets.

@kms70847
Last active September 26, 2019 19:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kms70847/38358e86751fa55b3e7e3c90da59eed8 to your computer and use it in GitHub Desktop.
Save kms70847/38358e86751fa55b3e7e3c90da59eed8 to your computer and use it in GitHub Desktop.
Unicode Emoji Adder
// ==UserScript==
// @name UnicodeEmojiAdder
// @version 6
// @include http://chat.stackoverflow.com/rooms/*
// @include https://chat.stackoverflow.com/rooms/*
// @grant none
// ==/UserScript==
var style_template = `
.boxPositioner{
position: absolute;
top: 0;
transform: translateY(-100%);
display: block;
}
.pickerBox{
border: 1px solid black;
display: inline-block;
}
.pickerBox:not(.active){
display: none;
}
.emojiListing{
font-size: xx-large;
border-top: 1px solid black;
}
.tabSelector{
font-size: xx-large;
}
.emojiListing:not(.active){
display: none;
}`;
var picker_template = `
<span class="emojiPicker">
<span class="toggler">๐Ÿ˜Š๏ธŽ</span>
<span class="boxPositioner">
<span class="pickerBox wmd-prompt-dialog">
<table class="tabSelector">
<tr>
<td class="selected wmd-mini-button">๐Ÿ˜‹</td> <td class="wmd-mini-button">๐Ÿ‹</td> <td class="wmd-mini-button">๐Ÿ†</td> <td class="wmd-mini-button">A</td>
</tr>
</table>
<table class="emojiListing active">
<tr><td>๐Ÿ˜€</td><td>๐Ÿ˜</td><td>๐Ÿ˜‚</td><td>๐Ÿ˜ƒ</td><td>๐Ÿ˜„</td><td>๐Ÿ˜…</td><td>๐Ÿ˜†</td><td>๐Ÿ˜‡</td><td>๐Ÿ˜ˆ</td><td>๐Ÿ˜‰</td><td>๐Ÿ˜Š</td><td>๐Ÿ˜‹</td><td>๐Ÿ˜Œ</td><td>๐Ÿ˜</td><td>๐Ÿ˜Ž</td><td>๐Ÿ˜</td></tr><tr><td>๐Ÿ˜</td><td>๐Ÿ˜‘</td><td>๐Ÿ˜’</td><td>๐Ÿ˜“</td><td>๐Ÿ˜”</td><td>๐Ÿ˜•</td><td>๐Ÿ˜–</td><td>๐Ÿ˜—</td><td>๐Ÿ˜˜</td><td>๐Ÿ˜™</td><td>๐Ÿ˜š</td><td>๐Ÿ˜›</td><td>๐Ÿ˜œ</td><td>๐Ÿ˜</td><td>๐Ÿ˜ž</td><td>๐Ÿ˜Ÿ</td></tr><tr><td>๐Ÿ˜ </td><td>๐Ÿ˜ก</td><td>๐Ÿ˜ข</td><td>๐Ÿ˜ฃ</td><td>๐Ÿ˜ค</td><td>๐Ÿ˜ฅ</td><td>๐Ÿ˜ฆ</td><td>๐Ÿ˜ง</td><td>๐Ÿ˜จ</td><td>๐Ÿ˜ฉ</td><td>๐Ÿ˜ช</td><td>๐Ÿ˜ซ</td><td>๐Ÿ˜ฌ</td><td>๐Ÿ˜ญ</td><td>๐Ÿ˜ฎ</td><td>๐Ÿ˜ฏ</td></tr><tr><td>๐Ÿ˜ฐ</td><td>๐Ÿ˜ฑ</td><td>๐Ÿ˜ฒ</td><td>๐Ÿ˜ณ</td><td>๐Ÿ˜ด</td><td>๐Ÿ˜ต</td><td>๐Ÿ˜ถ</td><td>๐Ÿ˜ท</td><td>๐Ÿ˜ธ</td><td>๐Ÿ˜น</td><td>๐Ÿ˜บ</td><td>๐Ÿ˜ป</td><td>๐Ÿ˜ผ</td><td>๐Ÿ˜ฝ</td><td>๐Ÿ˜พ</td><td>๐Ÿ˜ฟ</td></tr><tr><td>๐Ÿ™€</td><td>๐Ÿ™</td><td>๐Ÿ™‚</td><td>๐Ÿ™ƒ</td><td>๐Ÿ™„</td><td>๐Ÿ™…</td><td>๐Ÿ™†</td><td>๐Ÿ™‡</td><td>๐Ÿ™ˆ</td><td>๐Ÿ™‰</td><td>๐Ÿ™Š</td><td>๐Ÿ™‹</td><td>๐Ÿ™Œ</td><td>๐Ÿ™</td><td>๐Ÿ™Ž</td><td>๐Ÿ™</td></tr>
</table>
<table class="emojiListing">
<tr><td>๐Ÿต</td><td>๐Ÿ’</td><td>๐Ÿฆ</td><td>๐Ÿถ</td><td>๐Ÿ•</td><td>๐Ÿฉ</td><td>๐Ÿบ</td><td>๐ŸฆŠ</td><td>๐Ÿฆ</td><td>๐Ÿฑ</td><td>๐Ÿˆ</td><td>๐Ÿฆ</td><td>๐Ÿฏ</td><td>๐Ÿ…</td></tr><tr><td>๐Ÿ†</td><td>๐Ÿด</td><td>๐ŸŽ</td><td>๐Ÿฆ„</td><td>๐Ÿฆ“</td><td>๐ŸฆŒ</td><td>๐Ÿฎ</td><td>๐Ÿ‚</td><td>๐Ÿƒ</td><td>๐Ÿ„</td><td>๐Ÿท</td><td>๐Ÿ–</td><td>๐Ÿ—</td><td>๐Ÿฝ</td></tr><tr><td>๐Ÿ</td><td>๐Ÿ‘</td><td>๐Ÿ</td><td>๐Ÿช</td><td>๐Ÿซ</td><td>๐Ÿฆ™</td><td>๐Ÿฆ’</td><td>๐Ÿ˜</td><td>๐Ÿฆ</td><td>๐Ÿฆ›</td><td>๐Ÿญ</td><td>๐Ÿ</td><td>๐Ÿ€</td><td>๐Ÿน</td></tr><tr><td>๐Ÿฐ</td><td>๐Ÿ‡</td><td>๐Ÿฟ</td><td>๐Ÿฆ”</td><td>๐Ÿฆ‡</td><td>๐Ÿป</td><td>๐Ÿจ</td><td>๐Ÿผ</td><td>๐Ÿฆ˜</td><td>๐Ÿฆก</td><td>๐Ÿพ</td><td>๐Ÿฆƒ</td><td>๐Ÿ”</td><td>๐Ÿ“</td></tr><tr><td>๐Ÿฃ</td><td>๐Ÿค</td><td>๐Ÿฅ</td><td>๐Ÿฆ</td><td>๐Ÿง</td><td>๐Ÿ•Š</td><td>๐Ÿฆ…</td><td>๐Ÿฆ†</td><td>๐Ÿฆข</td><td>๐Ÿฆ‰</td><td>๐Ÿฆš</td><td>๐Ÿฆœ</td><td>๐Ÿธ</td><td>๐ŸŠ</td></tr><tr><td>๐Ÿข</td><td>๐ŸฆŽ</td><td>๐Ÿ</td><td>๐Ÿฒ</td><td>๐Ÿ‰</td><td>๐Ÿฆ•</td><td>๐Ÿฆ–</td><td>๐Ÿณ</td><td>๐Ÿ‹</td><td>๐Ÿฌ</td><td>๐ŸŸ</td><td>๐Ÿ </td><td>๐Ÿก</td><td>๐Ÿฆˆ</td></tr><tr><td>๐Ÿ™</td><td>๐Ÿš</td><td>๐ŸŒ</td><td>๐Ÿฆ‹</td><td>๐Ÿ›</td><td>๐Ÿœ</td><td>๐Ÿ</td><td>๐Ÿž</td><td>๐Ÿฆ—</td><td>๐Ÿ•ท</td><td>๐Ÿ•ธ</td><td>๐Ÿฆ‚</td><td>๐ŸฆŸ</td><td>๐Ÿฆ </td></tr>
</table>
<table class="emojiListing">
<tr><td>๐Ÿ‘†</td> <td>๐Ÿ‘‡</td> <td>๐Ÿ‘ˆ</td> <td>๐Ÿ‘‰</td> <td>๐Ÿ‘</td> <td>๐Ÿ‘Ž</td> <td>๐Ÿ”’</td></tr>
<tr><td>๐Ÿ”“</td> <td>๐Ÿ‘</td> <td>๐Ÿ†</td> <td>๐ŸŒŽ</td> <td>๐Ÿ’ฃ</td> <td>๐Ÿ“ท</td> <td>๐Ÿ’ฐ</td></tr>
<tr><td>๐Ÿ </td> <td>๐Ÿ•ถ</td> <td>โ™”</td> <td>โ™•</td> <td>โ™–</td> <td>โ™—</td> <td>โ™˜</td></tr>
<tr><td>โ™™</td> <td>โ™š</td> <td>โ™›</td> <td>โ™œ</td> <td>โ™</td> <td>โ™ž</td> <td>โ™Ÿ</td></tr>
<tr><td>โ™ </td> <td>โ™ฃ</td> <td>โ™ฅ</td> <td>โ™ฆ</td> <td>โ™ช</td> <td>โ™ซ</td> <td>โ›„</td></tr>
</table>
<table class="emojiListing">
<tr><td>(โ—•โ€ฟโ—•)</td> <td>(โ•ฏยฐโ–กยฐ๏ผ‰โ•ฏ๏ธต โ”ปโ”โ”ป</td> <td>( อกยฐ อœส– อกยฐ)</td></tr><tr><td>เฒ _เฒ </td><td>ยฏ\\\\_(ใƒ„)_/ยฏ</td><td>เฒฅ_เฒฅ</td></tr>
</table>
</span>
</span>
</span>`;
function addGlobalStyle(css) {
var head, style;
head = document.getElementsByTagName('head')[0];
if (!head) { return; }
style = document.createElement('style');
style.type = 'text/css';
style.innerHTML = css;
head.appendChild(style);
}
function insert_text_at_cursor(text){
var input = document.getElementById("input");
var left = input.value.slice(0, input.selectionStart);
var middle = text;
var right = input.value.slice(input.selectionEnd);
input.value = left + middle + right;
input.setSelectionRange(left.length + middle.length, left.length + middle.length);
input.focus();
}
function register_td(td){
//putting this in a function to avoid the "late name binding" problem
td.onclick = function(){
insert_text_at_cursor(td.innerHTML);
}
}
function register_tab(tab, tabs, idx){
tab.onclick = function(){
set_classname_exclusive(tab, tabs, "selected");
var listings = document.querySelectorAll(".emojiListing");
if (idx >= listings.length){
console.log("Warning: no listing found for tab " + tab.innerHTML);
return;
}
set_classname_exclusive(listings[idx], listings, "active");
}
}
function set_classname_exclusive(target, elements, className){
//adds the className to the target element, and remove it from each other element
for(var element of elements){
if(element.classList.contains(className)){
element.classList.remove(className);
}
}
target.classList.add(className);
}
function set_up_picker(picker){
console.log("Setting up picker " + picker);
//picker.onblur = function(){toggle(picker);} //todo: figure out why this doesn't work
picker.querySelector(".toggler").onclick = function(){toggle(picker);}
on_click_elsewhere(picker, function(){
var pickerBox = picker.querySelector(".pickerBox");
if (pickerBox.classList.contains("active")){
pickerBox.classList.remove("active");
}
});
for(var td of picker.querySelectorAll(".emojiListing td")){
register_td(td);
}
var tabSelector = picker.querySelector(".tabSelector");
var tabs = tabSelector.querySelectorAll("td");
var idx = 0; //todo: find the JS equivalent of `enumerate`
for(var tab of tabs){
register_tab(tab, tabs, idx);
idx += 1;
}
}
function toggle(picker){
var pickerBox = picker.querySelector(".pickerBox");
if (pickerBox.classList.contains("active")){
pickerBox.classList.remove("active");
}
else{
pickerBox.classList.add("active");
}
}
function on_click_elsewhere(element, callback){
//whenever the user clicks anywhere that _isn't_ element, execute the callback
document.addEventListener('click', function(event){
if (event.target != element && !element.contains(event.target)){
callback();
}
}, true);
}
var buttonArea = document.getElementById("chat-buttons");
buttonArea.insertAdjacentHTML('beforeend', picker_template);
addGlobalStyle(style_template);
for(var picker of document.querySelectorAll(".emojiPicker")){
set_up_picker(picker);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment