@dialpad/dialtone
Version:
Dialpad's Dialtone design system monorepo
172 lines (171 loc) • 5.07 kB
JavaScript
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