| from typing import TYPE_CHECKING, Any, Dict, Optional, Tuple |
|
|
| from rich import panel |
| from rich.console import ( |
| Console as RichConsole, |
| Theme, |
| ) |
| from rich.text import Text |
|
|
| from openbb_cli.config.menu_text import RICH_TAGS |
|
|
| if TYPE_CHECKING: |
| from openbb_cli.models.settings import Settings |
|
|
|
|
| class Console: |
| """Create a rich console to wrap the console print with a Panel.""" |
|
|
| def __init__( |
| self, |
| settings: "Settings", |
| style: Optional[Dict[str, Any]] = None, |
| ): |
| """Initialize the ConsoleAndPanel class.""" |
| self._console = RichConsole( |
| theme=Theme(style), |
| highlight=False, |
| soft_wrap=True, |
| ) |
| self._settings = settings |
| self.menu_text = "" |
| self.menu_path = "" |
|
|
| @staticmethod |
| def _filter_rich_tags(text): |
| """Filter out rich tags from text.""" |
| for val in RICH_TAGS: |
| text = text.replace(val, "") |
|
|
| return text |
|
|
| @staticmethod |
| def _blend_text( |
| message: str, color1: Tuple[int, int, int], color2: Tuple[int, int, int] |
| ) -> Text: |
| """Blend text from one color to another.""" |
| text = Text(message) |
| r1, g1, b1 = color1 |
| r2, g2, b2 = color2 |
| dr = r2 - r1 |
| dg = g2 - g1 |
| db = b2 - b1 |
| size = len(text) + 5 |
| for index in range(size): |
| blend = index / size |
| color = f"#{int(r1 + dr * blend):02X}{int(g1 + dg * blend):02X}{int(b1 + db * blend):02X}" |
| text.stylize(color, index, index + 1) |
| return text |
|
|
| def print(self, *args, **kwargs): |
| """Print the text to the console.""" |
| if kwargs and "text" in list(kwargs) and "menu" in list(kwargs): |
| if not self._settings.TEST_MODE: |
| if self._settings.ENABLE_RICH_PANEL: |
| if self._settings.SHOW_VERSION: |
| version = self._settings.VERSION |
| version = f"[param]OpenBB Platform CLI v{version}[/param] (https://openbb.co)" |
| else: |
| version = ( |
| "[param]OpenBB Platform CLI[/param] (https://openbb.co)" |
| ) |
| self._console.print( |
| panel.Panel( |
| "\n" + kwargs["text"], |
| title=kwargs["menu"], |
| subtitle_align="right", |
| subtitle=version, |
| ) |
| ) |
|
|
| else: |
| self._console.print(kwargs["text"]) |
| else: |
| print(self._filter_rich_tags(kwargs["text"])) |
| elif not self._settings.TEST_MODE: |
| self._console.print(*args, **kwargs) |
| else: |
| print(*args, **kwargs) |
|
|
| def input(self, *args, **kwargs): |
| """Get input from the user.""" |
| self.print(*args, **kwargs, end="") |
| return input() |
|
|