| from __future__ import annotations |
|
|
| import sys |
| from typing import TextIO, cast |
|
|
| from prompt_toolkit.utils import ( |
| get_bell_environment_variable, |
| get_term_environment_variable, |
| is_conemu_ansi, |
| ) |
|
|
| from .base import DummyOutput, Output |
| from .color_depth import ColorDepth |
| from .plain_text import PlainTextOutput |
|
|
| __all__ = [ |
| "create_output", |
| ] |
|
|
|
|
| def create_output( |
| stdout: TextIO | None = None, always_prefer_tty: bool = False |
| ) -> Output: |
| """ |
| Return an :class:`~prompt_toolkit.output.Output` instance for the command |
| line. |
| |
| :param stdout: The stdout object |
| :param always_prefer_tty: When set, look for `sys.stderr` if `sys.stdout` |
| is not a TTY. Useful if `sys.stdout` is redirected to a file, but we |
| still want user input and output on the terminal. |
| |
| By default, this is `False`. If `sys.stdout` is not a terminal (maybe |
| it's redirected to a file), then a `PlainTextOutput` will be returned. |
| That way, tools like `print_formatted_text` will write plain text into |
| that file. |
| """ |
| |
| |
| |
| term_from_env = get_term_environment_variable() |
| bell_from_env = get_bell_environment_variable() |
| color_depth_from_env = ColorDepth.from_env() |
|
|
| if stdout is None: |
| |
| |
| stdout = sys.stdout |
|
|
| if always_prefer_tty: |
| for io in [sys.stdout, sys.stderr]: |
| if io is not None and io.isatty(): |
| |
| stdout = io |
| break |
|
|
| |
| |
| |
| |
| if stdout is None: |
| return DummyOutput() |
|
|
| |
| |
| |
| from prompt_toolkit.patch_stdout import StdoutProxy |
|
|
| while isinstance(stdout, StdoutProxy): |
| stdout = stdout.original_stdout |
|
|
| if sys.platform == "win32": |
| from .conemu import ConEmuOutput |
| from .win32 import Win32Output |
| from .windows10 import Windows10_Output, is_win_vt100_enabled |
|
|
| if is_win_vt100_enabled(): |
| return cast( |
| Output, |
| Windows10_Output(stdout, default_color_depth=color_depth_from_env), |
| ) |
| if is_conemu_ansi(): |
| return cast( |
| Output, ConEmuOutput(stdout, default_color_depth=color_depth_from_env) |
| ) |
| else: |
| return Win32Output(stdout, default_color_depth=color_depth_from_env) |
| else: |
| from .vt100 import Vt100_Output |
|
|
| |
| |
| |
| if not stdout.isatty(): |
| return PlainTextOutput(stdout) |
|
|
| return Vt100_Output.from_pty( |
| stdout, |
| term=term_from_env, |
| default_color_depth=color_depth_from_env, |
| enable_bell=bell_from_env, |
| ) |
|
|