63 lines
1.8 KiB
Python
63 lines
1.8 KiB
Python
import sys
|
|
from typing import Optional, TextIO, cast
|
|
|
|
from prompt_toolkit.patch_stdout import StdoutProxy
|
|
from prompt_toolkit.utils import (
|
|
get_term_environment_variable,
|
|
is_conemu_ansi,
|
|
is_windows,
|
|
)
|
|
|
|
from .base import Output
|
|
|
|
__all__ = [
|
|
"create_output",
|
|
]
|
|
|
|
|
|
def create_output(
|
|
stdout: Optional[TextIO] = None, always_prefer_tty: bool = True
|
|
) -> 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. (The prompt_toolkit render output is not meant to be
|
|
consumed by something other then a terminal, so this is a reasonable
|
|
default.)
|
|
"""
|
|
if stdout is None:
|
|
# By default, render to stdout. If the output is piped somewhere else,
|
|
# render to stderr.
|
|
stdout = sys.stdout
|
|
|
|
if always_prefer_tty:
|
|
for io in [sys.stdout, sys.stderr]:
|
|
if io.isatty():
|
|
stdout = io
|
|
break
|
|
|
|
# If the patch_stdout context manager has been used, then sys.stdout is
|
|
# replaced by this proxy. For prompt_toolkit applications, we want to use
|
|
# the real stdout.
|
|
while isinstance(stdout, StdoutProxy):
|
|
stdout = stdout.original_stdout
|
|
|
|
if is_windows():
|
|
from .conemu import ConEmuOutput
|
|
from .win32 import Win32Output
|
|
from .windows10 import is_win_vt100_enabled, Windows10_Output
|
|
|
|
if is_win_vt100_enabled():
|
|
return cast(Output, Windows10_Output(stdout))
|
|
if is_conemu_ansi():
|
|
return cast(Output, ConEmuOutput(stdout))
|
|
else:
|
|
return Win32Output(stdout)
|
|
else:
|
|
from .vt100 import Vt100_Output
|
|
|
|
return Vt100_Output.from_pty(stdout, term=get_term_environment_variable())
|