Coverage for /pythoncovmergedfiles/medio/medio/usr/local/lib/python3.8/site-packages/rich/emoji.py: 60%
35 statements
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:35 +0000
« prev ^ index » next coverage.py v7.2.7, created at 2023-06-07 06:35 +0000
1import sys
2from typing import TYPE_CHECKING, Optional, Union
4from .jupyter import JupyterMixin
5from .segment import Segment
6from .style import Style
7from ._emoji_codes import EMOJI
8from ._emoji_replace import _emoji_replace
10if sys.version_info >= (3, 8):
11 from typing import Literal
12else:
13 from typing_extensions import Literal # pragma: no cover
16if TYPE_CHECKING:
17 from .console import Console, ConsoleOptions, RenderResult
20EmojiVariant = Literal["emoji", "text"]
23class NoEmoji(Exception):
24 """No emoji by that name."""
27class Emoji(JupyterMixin):
28 __slots__ = ["name", "style", "_char", "variant"]
30 VARIANTS = {"text": "\uFE0E", "emoji": "\uFE0F"}
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.
40 Args:
41 name (str): Name of emoji.
42 style (Union[str, Style], optional): Optional style. Defaults to None.
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, "")
57 @classmethod
58 def replace(cls, text: str) -> str:
59 """Replace emoji markup with corresponding unicode characters.
61 Args:
62 text (str): A string with emojis codes, e.g. "Hello :smiley:!"
64 Returns:
65 str: A string with emoji codes replaces with actual emoji.
66 """
67 return _emoji_replace(text)
69 def __repr__(self) -> str:
70 return f"<emoji {self.name!r}>"
72 def __str__(self) -> str:
73 return self._char
75 def __rich_console__(
76 self, console: "Console", options: "ConsoleOptions"
77 ) -> "RenderResult":
78 yield Segment(self._char, console.get_style(self.style))
81if __name__ == "__main__": # pragma: no cover
82 import sys
84 from rich.columns import Columns
85 from rich.console import Console
87 console = Console(record=True)
89 columns = Columns(
90 (f":{name}: {name}" for name in sorted(EMOJI.keys()) if "\u200D" not in name),
91 column_first=True,
92 )
94 console.print(columns)
95 if len(sys.argv) > 1:
96 console.save_html(sys.argv[1])