|
import sys |
|
from typing import TYPE_CHECKING, Optional, Union |
|
|
|
from .jupyter import JupyterMixin |
|
from .segment import Segment |
|
from .style import Style |
|
from ._emoji_codes import EMOJI |
|
from ._emoji_replace import _emoji_replace |
|
|
|
if sys.version_info >= (3, 8): |
|
from typing import Literal |
|
else: |
|
from pip._vendor.typing_extensions import Literal |
|
|
|
|
|
if TYPE_CHECKING: |
|
from .console import Console, ConsoleOptions, RenderResult |
|
|
|
|
|
EmojiVariant = Literal["emoji", "text"] |
|
|
|
|
|
class NoEmoji(Exception): |
|
"""No emoji by that name.""" |
|
|
|
|
|
class Emoji(JupyterMixin): |
|
__slots__ = ["name", "style", "_char", "variant"] |
|
|
|
VARIANTS = {"text": "\uFE0E", "emoji": "\uFE0F"} |
|
|
|
def __init__( |
|
self, |
|
name: str, |
|
style: Union[str, Style] = "none", |
|
variant: Optional[EmojiVariant] = None, |
|
) -> None: |
|
"""A single emoji character. |
|
|
|
Args: |
|
name (str): Name of emoji. |
|
style (Union[str, Style], optional): Optional style. Defaults to None. |
|
|
|
Raises: |
|
NoEmoji: If the emoji doesn't exist. |
|
""" |
|
self.name = name |
|
self.style = style |
|
self.variant = variant |
|
try: |
|
self._char = EMOJI[name] |
|
except KeyError: |
|
raise NoEmoji(f"No emoji called {name!r}") |
|
if variant is not None: |
|
self._char += self.VARIANTS.get(variant, "") |
|
|
|
@classmethod |
|
def replace(cls, text: str) -> str: |
|
"""Replace emoji markup with corresponding unicode characters. |
|
|
|
Args: |
|
text (str): A string with emojis codes, e.g. "Hello :smiley:!" |
|
|
|
Returns: |
|
str: A string with emoji codes replaces with actual emoji. |
|
""" |
|
return _emoji_replace(text) |
|
|
|
def __repr__(self) -> str: |
|
return f"<emoji {self.name!r}>" |
|
|
|
def __str__(self) -> str: |
|
return self._char |
|
|
|
def __rich_console__( |
|
self, console: "Console", options: "ConsoleOptions" |
|
) -> "RenderResult": |
|
yield Segment(self._char, console.get_style(self.style)) |
|
|
|
|
|
if __name__ == "__main__": |
|
import sys |
|
|
|
from pip._vendor.rich.columns import Columns |
|
from pip._vendor.rich.console import Console |
|
|
|
console = Console(record=True) |
|
|
|
columns = Columns( |
|
(f":{name}: {name}" for name in sorted(EMOJI.keys()) if "\u200D" not in name), |
|
column_first=True, |
|
) |
|
|
|
console.print(columns) |
|
if len(sys.argv) > 1: |
|
console.save_html(sys.argv[1]) |
|
|