You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			107 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			TypeScript
		
	
			
		
		
	
	
			107 lines
		
	
	
		
			2.3 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);
 | |
| }
 | |
| 
 | |
| 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;
 | |
| }
 |