Files
grin-web-wallet/scripts/emoji.js
2024-12-20 18:08:44 -08:00

1208 lines
16 KiB
JavaScript
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Use strict
"use strict";
// Classes
// Emoji class
class Emoji {
// Public
// Encode
static encode(text) {
// Get text as bytes
var bytes = (new TextEncoder()).encode(text);
// Get number of extra bits
var numberOfExtraBits = Emoji.NUMBER_BASE - bytes["length"] * Common.BITS_IN_A_BYTE % Emoji.NUMBER_BASE;
// Create bit writer
var bitWriter = new BitWriter();
// Append number of extra bits to bit writer
bitWriter.setBits(numberOfExtraBits, Emoji.NUMBER_BASE);
// Append extra bits to bit writer
bitWriter.setBits(Emoji.EXTRA_BITS_VALUE, numberOfExtraBits);
// Append bytes to bit writer
bitWriter.setBytes(bytes);
// Create bit reader from bit writer
var bitReader = new BitReader(bitWriter.getBytes());
// Initialize emoji text
var emojiText = "";
// Loop through all bit groups in bit reader
while(true) {
// Try
try {
// Get index from bit group
var index = bitReader.getBits(Emoji.NUMBER_BASE);
// Append glyph at index to emoji text
emojiText += Emoji.GLYPHS[index];
}
// Catch errors
catch(error) {
// Break
break;
}
}
// Return emoji text
return emojiText;
}
// Decode
static decode(emojiText) {
// Get emoji text as glyphs
var glyphs = Array.from(emojiText);
// Initialize bit writer
var bitWriter = new BitWriter();
// Initialize number of bits
var numberOfBits = 0;
// Go through all glyphs
for(var i = 0; i < glyphs["length"]; ++i) {
// Check if glyph isn't valid
var index = Emoji.GLYPHS.indexOf(glyphs[i]);
if(index === Common.INDEX_NOT_FOUND) {
// Throw error
throw "Invalid emoji text.";
}
// Append glyphs's index to bit writer
bitWriter.setBits(index, Emoji.NUMBER_BASE);
// Update number of bits
numberOfBits += Emoji.NUMBER_BASE;
}
// Create bit reader from bit writer
var bitReader = new BitReader(bitWriter.getBytes());
// Try
try {
// Get number of extra bits from bit reader
var numberOfExtraBits = bitReader.getBits(Emoji.NUMBER_BASE);
}
// Catch errors
catch(error) {
// Throw error
throw "Invalid emoji text.";
}
// Check if number of extra bits is invalid
if(numberOfExtraBits <= 0 || numberOfExtraBits > Emoji.NUMBER_BASE) {
// Throw error
throw "Invalid emoji text.";
}
// Try
try {
// Get extra bits from bit reader
var extraBits = bitReader.getBits(numberOfExtraBits);
}
// Catch errors
catch(error) {
// Throw error
throw "Invalid emoji text.";
}
// Check if extra bits is invalid
if(extraBits !== Emoji.EXTRA_BITS_VALUE) {
// Throw error
throw "Invalid emoji text.";
}
// Check if number of bits is invalid
if((numberOfBits - Emoji.NUMBER_BASE - numberOfExtraBits) % Common.BITS_IN_A_BYTE !== 0) {
// Throw error
throw "Invalid emoji text.";
}
// Get remaining bytes from bit reader
var bytes = bitReader.getBytes((numberOfBits - Emoji.NUMBER_BASE - numberOfExtraBits) / Common.BITS_IN_A_BYTE);
// Return bytes as text
return (new TextDecoder("utf-8", {"fatal": true})).decode(bytes);
}
// Private
// Glyphs
static get GLYPHS() {
// Return glyphs
return [
"🎨",
"🎭",
"🧵",
"🧶",
"🪢",
"🪡",
"🏆",
"🥇",
"🏅",
"🥈",
"🥉",
"🎈",
"🎏",
"🎄",
"🎊",
"🧨",
"🎆",
"🎃",
"🎎",
"🎑",
"🎉",
"🎍",
"🧧",
"🎀",
"🎇",
"✨",
"🎋",
"🎫",
"🎐",
"🎁",
"🎯",
"🔮",
"🎴",
"🎲",
"🃏",
"🪁",
"🪄",
"🀄",
"🧿",
"🪆",
"🪅",
"🎱",
"🧩",
"🎰",
"🧸",
"🎮",
"🪀",
"🏈",
"🏸",
"⚾",
"🏀",
"🎳",
"🥊",
"🏏",
"🥌",
"🤿",
"🏑",
"🎣",
"⛳",
"🥏",
"🥅",
"🏒",
"🥍",
"🥋",
"🏓",
"🏉",
"🎽",
"🎿",
"🛷",
"⚽",
"🥎",
"🎾",
"🏐",
"🐸",
"🐤",
"🐦",
"🐔",
"🦤",
"🦆",
"🦅",
"🪶",
"🦩",
"🐥",
"🐣",
"🦉",
"🦜",
"🦚",
"🐧",
"🐓",
"🦢",
"🦃",
"🐜",
"🪲",
"🐛",
"🦋",
"🪳",
"🦗",
"🪰",
"🐝",
"🐞",
"🦠",
"🦟",
"🦂",
"🐌",
"🪱",
"🦡",
"🦇",
"🐻",
"🦫",
"🦬",
"🐗",
"🐪",
"🐈",
"🐱",
"🐄",
"🐮",
"🦌",
"🐕",
"🐶",
"🐘",
"🐑",
"🦊",
"🦒",
"🐐",
"🦍",
"🦮",
"🐹",
"🦔",
"🦛",
"🐎",
"🐴",
"🦘",
"🐨",
"🐆",
"🦁",
"🦙",
"🦣",
"🐒",
"🐵",
"🐁",
"🐭",
"🦧",
"🦦",
"🐂",
"🐼",
"🐾",
"🐖",
"🐷",
"🐽",
"🐩",
"🐇",
"🐰",
"🦝",
"🐏",
"🐀",
"🦏",
"🦨",
"🦥",
"🐅",
"🐯",
"🐫",
"🦄",
"🐃",
"🐺",
"🦓",
"🐡",
"🐬",
"🐟",
"🐙",
"🦭",
"🦈",
"🐚",
"🐳",
"🐠",
"🐋",
"🐊",
"🐉",
"🐲",
"🦎",
"🦕",
"🐍",
"🐢",
"🦖",
"🌼",
"💐",
"🌸",
"🌺",
"🌹",
"🌻",
"🌷",
"💮",
"🥀",
"🌵",
"🌳",
"🌲",
"🍂",
"🍀",
"🌿",
"🍃",
"🍁",
"🌴",
"🪴",
"🌱",
"🌾",
"🏴",
"🏁",
"🎌",
"🚩",
"🏺",
"🥢",
"🍴",
"🔪",
"🥄",
"🍼",
"🍺",
"🧃",
"🍾",
"🧋",
"🍻",
"🥂",
"🍸",
"🥤",
"🥛",
"☕",
"🧊",
"🧉",
"🍶",
"🍵",
"🫖",
"🍹",
"🥃",
"🍷",
"🍱",
"🍚",
"🍛",
"🍡",
"🥟",
"🍥",
"🥠",
"🍤",
"🥮",
"🍢",
"🍙",
"🍘",
"🍠",
"🍝",
"🍜",
"🍣",
"🥡",
"🍌",
"🫐",
"🍒",
"🥥",
"🍇",
"🍏",
"🥝",
"🍋",
"🥭",
"🍈",
"🫒",
"🍑",
"🍐",
"🍍",
"🍎",
"🍓",
"🍊",
"🍅",
"🍉",
"🦀",
"🦞",
"🦪",
"🦐",
"🦑",
"🥓",
"🥯",
"🥖",
"🥣",
"🍞",
"🌯",
"🧈",
"🥫",
"🧀",
"🍳",
"🥐",
"🥩",
"🥚",
"🧆",
"🫓",
"🫕",
"🍟",
"🥗",
"🍔",
"🌭",
"🍖",
"🥞",
"🍕",
"🍿",
"🍲",
"🍗",
"🥨",
"🧂",
"🥪",
"🥘",
"🥙",
"🌮",
"🫔",
"🧇",
"🎂",
"🍬",
"🍫",
"🍪",
"🧁",
"🍮",
"🍩",
"🍯",
"🍨",
"🍭",
"🥧",
"🍧",
"🍰",
"🍦",
"🥑",
"🫑",
"🥦",
"🥕",
"🌰",
"🥒",
"🌽",
"🍆",
"🧄",
"🥬",
"🍄",
"🧅",
"🥜",
"🥔",
"📘",
"🔖",
"📑",
"📚",
"📕",
"📗",
"📒",
"📰",
"📓",
"📔",
"📖",
"📙",
"📄",
"📃",
"📜",
"🎒",
"🩰",
"👙",
"🧢",
"🩲",
"👝",
"🧥",
"👑",
"👗",
"🥿",
"💎",
"👓",
"🧤",
"🥽",
"🎓",
"👜",
"👠",
"🥾",
"👖",
"👘",
"🥼",
"💄",
"👞",
"🪖",
"👔",
"🩱",
"📿",
"👛",
"💍",
"👟",
"🦺",
"🥻",
"🧣",
"🩳",
"🧦",
"🩴",
"🎩",
"👕",
"👢",
"👚",
"👒",
"👡",
"🧮",
"🔋",
"💽",
"📀",
"🔌",
"💾",
"💻",
"💿",
"🧺",
"🛁",
"🧹",
"🪣",
"🪑",
"🚪",
"🛗",
"🧯",
"🧴",
"🪞",
"🪤",
"🪒",
"🧻",
"🧷",
"🛒",
"🚿",
"🧼",
"🧽",
"🚽",
"🪥",
"🪟",
"📷",
"📸",
"🎬",
"🪔",
"🔦",
"💡",
"🔍",
"🔎",
"🎥",
"🏮",
"📺",
"📼",
"📹",
"🔑",
"🔒",
"🔐",
"🔏",
"🔓",
"📪",
"📫",
"📩",
"📧",
"📥",
"📨",
"📭",
"📬",
"📤",
"📦",
"📮",
"🩹",
"🩸",
"💊",
"🩺",
"💉",
"💹",
"🪙",
"💳",
"💵",
"💶",
"💰",
"💸",
"💷",
"🧾",
"💴",
"🎧",
"🎤",
"🎵",
"🎶",
"🎼",
"📻",
"🪗",
"🪕",
"🥁",
"🎸",
"🪘",
"🎹",
"🎷",
"🎺",
"🎻",
"📊",
"💼",
"📅",
"📇",
"📉",
"📈",
"📋",
"📁",
"📂",
"📎",
"📌",
"📍",
"📏",
"📆",
"📐",
"🚬",
"🪦",
"🗿",
"🪧",
"📠",
"📱",
"📲",
"📟",
"📞",
"🧬",
"🔬",
"🧫",
"📡",
"🔭",
"🧪",
"🔔",
"🔕",
"📢",
"📣",
"🔇",
"📯",
"🔊",
"🔈",
"🔉",
"🪓",
"🪃",
"🏹",
"🪚",
"🔨",
"🪝",
"🪜",
"🔗",
"🧲",
"🔩",
"🪛",
"🧰",
"🔫",
"🦯",
"🔧",
"📝",
"🫀",
"🦴",
"🧠",
"👂",
"🦻",
"👀",
"💪",
"🦶",
"🦵",
"🫁",
"🦾",
"🦿",
"👄",
"👃",
"👅",
"🦷",
"🤛",
"👊",
"✊",
"🤜",
"👎",
"👍",
"🤚",
"✋",
"🖖",
"👋",
"🤙",
"🤞",
"🤟",
"👌",
"🤌",
"🤏",
"🤘",
"💅",
"🤳",
"👇",
"👈",
"👉",
"👆",
"🖕",
"👏",
"🙏",
"🤝",
"👐",
"🤲",
"🙌",
"👶",
"👦",
"🧒",
"👧",
"👨",
"🧓",
"👴",
"👵",
"🧑",
"🧔",
"👱",
"👩",
"🕺",
"👯",
"🧗",
"💇",
"💆",
"🧖",
"🧎",
"🏃",
"🧍",
"🚶",
"💃",
"👼",
"🧝",
"🧚",
"🧞",
"🧙",
"🧜",
"🤶",
"🎅",
"🦸",
"🦹",
"🧛",
"🧟",
"🧏",
"🙇",
"🤦",
"🙍",
"🙅",
"🙆",
"🙎",
"🙋",
"🤷",
"💁",
"🤱",
"👷",
"💂",
"🥷",
"🤵",
"👳",
"👲",
"👰",
"👮",
"🤰",
"🤴",
"👸",
"🧕",
"🏇",
"🤼",
"🚴",
"🤸",
"🤺",
"🤹",
"🚵",
"🤾",
"🤽",
"🚣",
"🏄",
"🏊",
"🏂",
"👥",
"👤",
"👣",
"🫂",
"💢",
"💓",
"🖤",
"💙",
"💣",
"💔",
"🤎",
"💥",
"💨",
"💫",
"💚",
"💗",
"💟",
"💘",
"💝",
"💯",
"💋",
"💌",
"🧡",
"💜",
"💞",
"💖",
"💬",
"💦",
"💭",
"💕",
"🤍",
"💛",
"💤",
"😘",
"😗",
"😚",
"😙",
"🥰",
"😍",
"🥲",
"🤩",
"😧",
"😰",
"😲",
"😖",
"😕",
"😢",
"😞",
"😓",
"😱",
"😮",
"😨",
"😳",
"😦",
"😯",
"😭",
"😣",
"🥺",
"😥",
"🙁",
"😫",
"😩",
"😟",
"🥱",
"👽",
"👾",
"🤡",
"👻",
"👺",
"👹",
"💩",
"🤖",
"🧐",
"🤓",
"😎",
"🤭",
"🤗",
"🤫",
"🤔",
"🤠",
"🥸",
"🥳",
"😠",
"👿",
"😤",
"🤬",
"😡",
"💀",
"😈",
"😑",
"😶",
"🤨",
"🙄",
"😬",
"🤥",
"😐",
"😏",
"😒",
"🤐",
"🤤",
"😔",
"😌",
"😴",
"😪",
"😁",
"😂",
"😀",
"😃",
"😄",
"😅",
"😆",
"🤣",
"🙂",
"😇",
"😊",
"🙃",
"😉",
"😋",
"😛",
"🤑",
"😝",
"😜",
"🤪",
"🥶",
"🤯",
"🤮",
"🤕",
"😷",
"🤒",
"🥵",
"😵",
"🤢",
"🤧",
"🥴",
"🆎",
"🆑",
"🆒",
"🆓",
"🆔",
"🔤",
"🔡",
"🔠",
"🔢",
"🔣",
"🉑",
"🈸",
"🉐",
"🈹",
"🈚",
"🈁",
"🈶",
"🈵",
"🈺",
"🈴",
"🈲",
"🈯",
"🈳",
"🆕",
"🆖",
"🆗",
"🆘",
"🆙",
"🆚",
"🔙",
"🔃",
"🔄",
"🔚",
"🔛",
"🔜",
"🔝",
"📶",
"🔆",
"🎦",
"🔅",
"🔽",
"⏬",
"⏩",
"⏪",
"⏫",
"📴",
"🔁",
"🔂",
"🔀",
"🔼",
"📳",
"💱",
"💲",
"➗",
"",
"",
"✅",
"❌",
"❎",
"➰",
"➿",
"⭕",
"🔰",
"📛",
"🔱",
"❗",
"❓",
"❕",
"❔",
"🏧",
"🚼",
"🛄",
"🛃",
"🛅",
"🚮",
"🚹",
"🛂",
"🚰",
"🚻",
"🚾",
"♿",
"🚺",
"🚸",
"🚱",
"🚳",
"⛔",
"🚯",
"📵",
"🔞",
"🚷",
"🚭",
"🚫",
"🏦",
"🧱",
"🏰",
"🏪",
"🏬",
"🏭",
"🏥",
"🏨",
"🏠",
"🏡",
"🛖",
"🏯",
"🏣",
"🏩",
"🏢",
"🏤",
"🪨",
"🏫",
"🗽",
"🗼",
"💒",
"🪵",
"🗻",
"🌋",
"💈",
"🌉",
"🎠",
"🎪",
"🌆",
"🎡",
"🌁",
"⛲",
"🌃",
"🎢",
"🌅",
"🌄",
"🌇",
"⛺",
"⛪",
"🛕",
"🕋",
"🕌",
"🕍",
"🌂",
"🌙",
"🌀",
"💧",
"🔥",
"🌓",
"🌛",
"🌕",
"🌝",
"🌟",
"⚡",
"🌗",
"🌜",
"🌌",
"🌑",
"🌚",
"🌈",
"🪐",
"🌠",
"⛄",
"⭐",
"⛅",
"🌞",
"☔",
"🌘",
"🌖",
"🌊",
"🌒",
"🌔",
"⏰",
"🕗",
"🕣",
"🕚",
"🕦",
"🕔",
"🕠",
"🕓",
"🕟",
"⌛",
"⏳",
"🕘",
"🕤",
"🕐",
"🕜",
"🕖",
"🕢",
"🕕",
"🕡",
"🕙",
"🕥",
"🕒",
"🕞",
"🕛",
"🕧",
"🕑",
"🕝",
"⌚",
"🚡",
"🛬",
"🛫",
"🛸",
"🚁",
"🚠",
"🪂",
"🚀",
"💺",
"🚟",
"🚑",
"🚛",
"🚗",
"🛺",
"🚲",
"🚅",
"🚌",
"🚏",
"🚧",
"🚚",
"🚒",
"⛽",
"🚄",
"🚥",
"🛴",
"🚈",
"🚂",
"🦽",
"🚇",
"🚐",
"🚝",
"🦼",
"🛵",
"🚞",
"🚘",
"🚍",
"🚔",
"🚖",
"🛻",
"🚓",
"🚨",
"🚃",
"🛼",
"🛹",
"🚙",
"🚉"
];
}
// Number base
static get NUMBER_BASE() {
// Return number base
return Math.ceil(Math.log2(Emoji.GLYPHS["length"]));
}
// Extra bits value
static get EXTRA_BITS_VALUE() {
// Return extra bits value
return 0;
}
}
// Main function
// Set global object's emoji
globalThis["Emoji"] = Emoji;