codekingpro/portable-devtools
114k
1from typing import Callable, Match, Optional2import re3 4from ._emoji_codes import EMOJI5 6 7_ReStringMatch = Match[str] # regex match object8_ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub9_EmojiSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re10 11 12def _emoji_replace(13 text: str,14 default_variant: Optional[str] = None,15 _emoji_sub: _EmojiSubMethod = re.compile(r"(:(\S*?)(?:(?:\-)(emoji|text))?:)").sub,16) -> str:17 """Replace emoji code in text."""18 get_emoji = EMOJI.__getitem__19 variants = {"text": "\uFE0E", "emoji": "\uFE0F"}20 get_variant = variants.get21 default_variant_code = variants.get(default_variant, "") if default_variant else ""22 23 def do_replace(match: Match[str]) -> str:24 emoji_code, emoji_name, variant = match.groups()25 try:26 return get_emoji(emoji_name.lower()) + get_variant(27 variant, default_variant_code28 )29 except KeyError:30 return emoji_code31 32 return _emoji_sub(do_replace, text)33 