|
/* |
|
this will hold an object containing your custom emojis |
|
as an example, here's what one of Scribble's emojis would look like: |
|
|
|
const customEmojis = { |
|
"Blob Cookie": "https://www.scribblehub.com/wp-content/themes/writeit-child/emojis/blobs/blob_cookie_3.png", |
|
}; |
|
|
|
basically, the format is: "name": "url", |
|
*/ |
|
const customEmojis = {}; |
|
|
|
|
|
// implementation |
|
function addCustomEmoji(near, name, url) { |
|
let contenteditable; |
|
do { |
|
near = near.parentElement; |
|
contenteditable = near.querySelector("[contenteditable]"); |
|
} while (!contenteditable); |
|
if (!contenteditable) |
|
return; |
|
|
|
const emoji = document.createElement("img"); |
|
emoji.id = "emoji_list"; |
|
emoji.src = url; |
|
emoji.title = name; |
|
emoji.width = 24; |
|
emoji.height = 24; |
|
const range = window.getSelection()?.getRangeAt(0); |
|
if (!range) |
|
return contenteditable.appendChild(emoji); |
|
|
|
range.deleteContents(); |
|
range.insertNode(emoji); |
|
range.setStartAfter(emoji); |
|
} |
|
|
|
window.addEventListener("click", event => { |
|
const chirimoji = event.target.closest(".chirimoji"); |
|
if (chirimoji) |
|
addCustomEmoji(chirimoji.closest(".chirimoji-panel"), chirimoji.title, chirimoji.firstElementChild.src); |
|
}); |
|
|
|
function replaceEmojisPanel() { |
|
const tabs = document.querySelector("[onclick=\"insert_emoji(this);\"]")?.closest("#tabs"); |
|
if (!tabs) |
|
return; |
|
|
|
const panel = document.createElement("div"); |
|
panel.classList.add("chirimoji-panel"); |
|
tabs.replaceWith(panel); |
|
|
|
function createEmojiButton(name, url) { |
|
const emojiWrapper = document.createElement("span"); |
|
emojiWrapper.id = "fa-list"; |
|
emojiWrapper.title = name; |
|
emojiWrapper.classList.add("chirimoji"); |
|
|
|
const emoji = document.createElement("img"); |
|
emoji.id = "rl-list-fa"; |
|
emoji.border = 0; |
|
emoji.src = url; |
|
emojiWrapper.appendChild(emoji); |
|
return emojiWrapper; |
|
} |
|
|
|
for (const [name, data] of Object.entries(customEmojis)) { |
|
if (typeof data === "string") { |
|
panel.appendChild(createEmojiButton(name, data)); |
|
continue; |
|
} |
|
|
|
const emojiSection = document.createElement("details"); |
|
emojiSection.open = true; |
|
panel.appendChild(emojiSection); |
|
|
|
const summary = document.createElement("summary"); |
|
summary.textContent = name; |
|
emojiSection.appendChild(summary); |
|
|
|
for (const [name, url] of Object.entries(data)) { |
|
emojiSection.appendChild(createEmojiButton(name, url)); |
|
} |
|
} |
|
} |
|
|
|
setInterval(replaceEmojisPanel, 100); |