_emoji_replace.py 1.0 KB

1234567891011121314151617181920212223242526272829303132
  1. from typing import Callable, Match, Optional
  2. import re
  3. from ._emoji_codes import EMOJI
  4. _ReStringMatch = Match[str] # regex match object
  5. _ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub
  6. _EmojiSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re
  7. def _emoji_replace(
  8. text: str,
  9. default_variant: Optional[str] = None,
  10. _emoji_sub: _EmojiSubMethod = re.compile(r"(:(\S*?)(?:(?:\-)(emoji|text))?:)").sub,
  11. ) -> str:
  12. """Replace emoji code in text."""
  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)