_emoji_replace.py 1.0 KB

12345678910111213141516171819202122232425262728293031
  1. import re
  2. from typing import Callable, Match, Optional
  3. _ReStringMatch = Match[str] # regex match object
  4. _ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub
  5. _EmojiSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re
  6. def _emoji_replace(
  7. text: str,
  8. default_variant: Optional[str] = None,
  9. _emoji_sub: _EmojiSubMethod = re.compile(r"(:(\S*?)(?:(?:\-)(emoji|text))?:)").sub,
  10. ) -> str:
  11. """Replace emoji code in text."""
  12. from ._emoji_codes import EMOJI
  13. get_emoji = EMOJI.__getitem__
  14. variants = {"text": "\ufe0e", "emoji": "\ufe0f"}
  15. get_variant = variants.get
  16. default_variant_code = variants.get(default_variant, "") if default_variant else ""
  17. def do_replace(match: Match[str]) -> str:
  18. emoji_code, emoji_name, variant = match.groups()
  19. try:
  20. return get_emoji(emoji_name.lower()) + get_variant(
  21. variant, default_variant_code
  22. )
  23. except KeyError:
  24. return emoji_code
  25. return _emoji_sub(do_replace, text)