python (3.11.7)
       1  import sys
       2  from typing import TYPE_CHECKING, Optional, Union
       3  
       4  from .jupyter import JupyterMixin
       5  from .segment import Segment
       6  from .style import Style
       7  from ._emoji_codes import EMOJI
       8  from ._emoji_replace import _emoji_replace
       9  
      10  if sys.version_info >= (3, 8):
      11      from typing import Literal
      12  else:
      13      from pip._vendor.typing_extensions import Literal  # pragma: no cover
      14  
      15  
      16  if TYPE_CHECKING:
      17      from .console import Console, ConsoleOptions, RenderResult
      18  
      19  
      20  EmojiVariant = Literal["emoji", "text"]
      21  
      22  
      23  class ESC[4;38;5;81mNoEmoji(ESC[4;38;5;149mException):
      24      """No emoji by that name."""
      25  
      26  
      27  class ESC[4;38;5;81mEmoji(ESC[4;38;5;149mJupyterMixin):
      28      __slots__ = ["name", "style", "_char", "variant"]
      29  
      30      VARIANTS = {"text": "\uFE0E", "emoji": "\uFE0F"}
      31  
      32      def __init__(
      33          self,
      34          name: str,
      35          style: Union[str, Style] = "none",
      36          variant: Optional[EmojiVariant] = None,
      37      ) -> None:
      38          """A single emoji character.
      39  
      40          Args:
      41              name (str): Name of emoji.
      42              style (Union[str, Style], optional): Optional style. Defaults to None.
      43  
      44          Raises:
      45              NoEmoji: If the emoji doesn't exist.
      46          """
      47          self.name = name
      48          self.style = style
      49          self.variant = variant
      50          try:
      51              self._char = EMOJI[name]
      52          except KeyError:
      53              raise NoEmoji(f"No emoji called {name!r}")
      54          if variant is not None:
      55              self._char += self.VARIANTS.get(variant, "")
      56  
      57      @classmethod
      58      def replace(cls, text: str) -> str:
      59          """Replace emoji markup with corresponding unicode characters.
      60  
      61          Args:
      62              text (str): A string with emojis codes, e.g. "Hello :smiley:!"
      63  
      64          Returns:
      65              str: A string with emoji codes replaces with actual emoji.
      66          """
      67          return _emoji_replace(text)
      68  
      69      def __repr__(self) -> str:
      70          return f"<emoji {self.name!r}>"
      71  
      72      def __str__(self) -> str:
      73          return self._char
      74  
      75      def __rich_console__(
      76          self, console: "Console", options: "ConsoleOptions"
      77      ) -> "RenderResult":
      78          yield Segment(self._char, console.get_style(self.style))
      79  
      80  
      81  if __name__ == "__main__":  # pragma: no cover
      82      import sys
      83  
      84      from pip._vendor.rich.columns import Columns
      85      from pip._vendor.rich.console import Console
      86  
      87      console = Console(record=True)
      88  
      89      columns = Columns(
      90          (f":{name}: {name}" for name in sorted(EMOJI.keys()) if "\u200D" not in name),
      91          column_first=True,
      92      )
      93  
      94      console.print(columns)
      95      if len(sys.argv) > 1:
      96          console.save_html(sys.argv[1])