118 lines
2.6 KiB
TypeScript
118 lines
2.6 KiB
TypeScript
// @ts-ignore
|
|
import EmojiConvertor from 'emoji-js';
|
|
|
|
const instance = new EmojiConvertor();
|
|
instance.init_unified();
|
|
instance.init_colons();
|
|
instance.img_sets.apple.path =
|
|
'node_modules/emoji-datasource-apple/img/apple/64/';
|
|
instance.include_title = true;
|
|
instance.replace_mode = 'img';
|
|
instance.supports_css = false; // needed to avoid spans with background-image
|
|
|
|
export type SizeClassType = '' | 'small' | 'medium' | 'large' | 'jumbo';
|
|
|
|
export function getRegex(): RegExp {
|
|
return instance.rx_unified;
|
|
}
|
|
|
|
export function getTitle(value: string): string | undefined {
|
|
return instance.data[value][3][0];
|
|
}
|
|
|
|
export function findImage(value: string, variation?: string) {
|
|
return instance.find_image(value, variation);
|
|
}
|
|
|
|
export function replaceColons(str: string) {
|
|
return str.replace(instance.rx_colons, m => {
|
|
const name = m.substr(1, m.length - 2);
|
|
const code = instance.map.colons[name];
|
|
if (code) {
|
|
return instance.data[code][0][0];
|
|
}
|
|
|
|
return m;
|
|
});
|
|
}
|
|
|
|
function getCountOfAllMatches(str: string, regex: RegExp) {
|
|
let match = regex.exec(str);
|
|
let count = 0;
|
|
|
|
if (!regex.global) {
|
|
return match ? 1 : 0;
|
|
}
|
|
|
|
while (match) {
|
|
count += 1;
|
|
match = regex.exec(str);
|
|
}
|
|
|
|
return count;
|
|
}
|
|
|
|
function hasNormalCharacters(str: string) {
|
|
const noEmoji = str.replace(instance.rx_unified, '').trim();
|
|
|
|
return noEmoji.length > 0;
|
|
}
|
|
|
|
export function getSizeClass(str: string): SizeClassType {
|
|
if (hasNormalCharacters(str)) {
|
|
return '';
|
|
}
|
|
|
|
const emojiCount = getCountOfAllMatches(str, instance.rx_unified);
|
|
if (emojiCount > 8) {
|
|
return '';
|
|
} else if (emojiCount > 6) {
|
|
return 'small';
|
|
} else if (emojiCount > 4) {
|
|
return 'medium';
|
|
} else if (emojiCount > 2) {
|
|
return 'large';
|
|
} else {
|
|
return 'jumbo';
|
|
}
|
|
}
|
|
|
|
const VARIATION_LOOKUP: { [index: string]: string } = {
|
|
'\uD83C\uDFFB': '1f3fb',
|
|
'\uD83C\uDFFC': '1f3fc',
|
|
'\uD83C\uDFFD': '1f3fd',
|
|
'\uD83C\uDFFE': '1f3fe',
|
|
'\uD83C\uDFFF': '1f3ff',
|
|
};
|
|
|
|
// Taken from emoji-js/replace_unified
|
|
export function getReplacementData(
|
|
m: string,
|
|
p1: string | undefined,
|
|
p2: string | undefined
|
|
): string | { value: string; variation?: string } {
|
|
const unified = instance.map.unified[p1];
|
|
if (unified) {
|
|
const variation = VARIATION_LOOKUP[p2 || ''];
|
|
if (variation) {
|
|
return {
|
|
value: unified,
|
|
variation,
|
|
};
|
|
}
|
|
|
|
return {
|
|
value: unified,
|
|
};
|
|
}
|
|
|
|
const unifiedVars = instance.map.unified_vars[p1];
|
|
if (unifiedVars) {
|
|
return {
|
|
value: unifiedVars[0],
|
|
variation: unifiedVars[1],
|
|
};
|
|
}
|
|
|
|
return m;
|
|
}
|