UNPKG

@dialpad/dialtone

Version:

Dialpad's Dialtone design system monorepo

172 lines (171 loc) 5.07 kB
import { emojiPattern } from "regex-combined-emojis"; import emojiJsonLocal from "emoji-toolkit/emoji_strategy.json"; const emojiRegex = new RegExp(emojiPattern, "g"); const emojiVersion = "8.0"; const defaultEmojiAssetUrl = "https://cdn.jsdelivr.net/joypixels/assets/" + emojiVersion + "/png/unicode/32/"; let customEmojiAssetUrl = null; let emojiImageUrlSmall = defaultEmojiAssetUrl; let emojiFileExtensionSmall = ".png"; let emojiImageUrlLarge = defaultEmojiAssetUrl; let emojiFileExtensionLarge = ".png"; const emojiJson = emojiJsonLocal; const emojiShortCodeRegex = new RegExp("(^| |(?<=:))(:\\w+:)", "g"); function getEmojiData() { return emojiJson; } function setEmojiAssetUrlSmall(url, fileExtension = ".png") { if (!url.endsWith("/")) { url = url + "/"; } emojiImageUrlSmall = url; emojiFileExtensionSmall = fileExtension; } function setEmojiAssetUrlLarge(url, fileExtension = ".svg") { if (!url.endsWith("/")) { url = url + "/"; } emojiImageUrlLarge = url; emojiFileExtensionLarge = fileExtension; } function setCustomEmojiUrl(url) { customEmojiAssetUrl = url; } function setCustomEmojiJson(json) { validateCustomEmojiJson(json); } function validateCustomEmojiJson(json) { const customEmojiProps = ["extension", "custom"]; const customEmojiRequiredProps = [ "name", "category", "shortname", "extension", "custom" ]; const _updateNativeEmojiData = (emojiData, propName, propValue) => { if (emojiData[propName] === void 0) { if (!customEmojiProps.includes(propName)) { return; } emojiData[propName] = propValue; } else { if (Array.isArray(emojiData[propName])) { emojiData[propName] = emojiData[propName].concat(propValue); } else { emojiData[propName] = propValue; } } }; Object.entries(json).forEach((item) => { const [customEmojiKey, customEmojiValue] = item; if (customEmojiKey in emojiJson) { const emojiData = emojiJson[customEmojiKey]; for (const customEmojiPropertyName in customEmojiValue) { const customEmojiPropertyValue = customEmojiValue[customEmojiPropertyName]; _updateNativeEmojiData(emojiData, customEmojiPropertyName, customEmojiPropertyValue); } } else { const _validateRequiredProps = () => customEmojiRequiredProps.every((val) => { return customEmojiValue[val] !== void 0; }); if (_validateRequiredProps()) { emojiJson[customEmojiKey] = customEmojiValue; } else { console.error( "The following custom emoji doesn't contain the required properties:", customEmojiValue ); } } }); } function shortcodeToEmojiData(shortcode) { function f(o, key) { if (!o || typeof o !== "object") { return; } if ("shortname" in o) { if (o.shortname === shortcode || o.shortname_alternates.includes(shortcode)) { o.key = key; reference = o; return true; } } Object.keys(o).some(function(k) { return f(o[k], k); }); } let reference; f(getEmojiData(), null); return reference; } function unicodeToString(emoji) { let key = ""; for (const codePoint of emoji) { const codepoint = codePoint.codePointAt(0).toString(16).padStart(4, "0"); if (["200d", "fe0f"].includes(codepoint)) continue; if (key !== "") { key = key + "-"; } key = key + codepoint; } return key; } function stringToUnicode(str) { const uChars = str.split("-"); let result = ""; uChars.forEach((uChar) => { result = result + String.fromCodePoint(parseInt(uChar, 16)); }); return result; } function codeToEmojiData(code) { code = code == null ? void 0 : code.trim(); if (code.startsWith(":") && code.endsWith(":")) { return shortcodeToEmojiData(code); } else { const unicodeString = unicodeToString(code); const result = emojiJson[unicodeString]; if (result) result.key = unicodeString; return result; } } function findShortCodes(textContent) { const shortcodes = (textContent.match(emojiShortCodeRegex) || []).map((code) => code.trim()); return filterValidShortCodes(shortcodes); } function filterValidShortCodes(shortcodes) { const filtered = shortcodes ? shortcodes.filter((code) => shortcodeToEmojiData(code)) : []; return new Set(filtered); } function findEmojis(textContent) { const matches = [...textContent.matchAll(emojiRegex)]; const emojis = matches.length ? matches.map((match) => match[0]) : []; return new Set(emojis); } export { codeToEmojiData, customEmojiAssetUrl, defaultEmojiAssetUrl, emojiFileExtensionLarge, emojiFileExtensionSmall, emojiImageUrlLarge, emojiImageUrlSmall, emojiJson, emojiRegex, emojiShortCodeRegex, emojiVersion, filterValidShortCodes, findEmojis, findShortCodes, getEmojiData, setCustomEmojiJson, setCustomEmojiUrl, setEmojiAssetUrlLarge, setEmojiAssetUrlSmall, shortcodeToEmojiData, stringToUnicode, unicodeToString, validateCustomEmojiJson }; //# sourceMappingURL=emoji.js.map