You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			333 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			333 lines
		
	
	
		
			8.2 KiB
		
	
	
	
		
			Python
		
	
"""
 | 
						|
Interface for an output.
 | 
						|
"""
 | 
						|
 | 
						|
from __future__ import annotations
 | 
						|
 | 
						|
from abc import ABCMeta, abstractmethod
 | 
						|
from typing import TextIO
 | 
						|
 | 
						|
from prompt_toolkit.cursor_shapes import CursorShape
 | 
						|
from prompt_toolkit.data_structures import Size
 | 
						|
from prompt_toolkit.styles import Attrs
 | 
						|
 | 
						|
from .color_depth import ColorDepth
 | 
						|
 | 
						|
__all__ = [
 | 
						|
    "Output",
 | 
						|
    "DummyOutput",
 | 
						|
]
 | 
						|
 | 
						|
 | 
						|
class Output(metaclass=ABCMeta):
 | 
						|
    """
 | 
						|
    Base class defining the output interface for a
 | 
						|
    :class:`~prompt_toolkit.renderer.Renderer`.
 | 
						|
 | 
						|
    Actual implementations are
 | 
						|
    :class:`~prompt_toolkit.output.vt100.Vt100_Output` and
 | 
						|
    :class:`~prompt_toolkit.output.win32.Win32Output`.
 | 
						|
    """
 | 
						|
 | 
						|
    stdout: TextIO | None = None
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def fileno(self) -> int:
 | 
						|
        "Return the file descriptor to which we can write for the output."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def encoding(self) -> str:
 | 
						|
        """
 | 
						|
        Return the encoding for this output, e.g. 'utf-8'.
 | 
						|
        (This is used mainly to know which characters are supported by the
 | 
						|
        output the data, so that the UI can provide alternatives, when
 | 
						|
        required.)
 | 
						|
        """
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def write(self, data: str) -> None:
 | 
						|
        "Write text (Terminal escape sequences will be removed/escaped.)"
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def write_raw(self, data: str) -> None:
 | 
						|
        "Write text."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def set_title(self, title: str) -> None:
 | 
						|
        "Set terminal title."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def clear_title(self) -> None:
 | 
						|
        "Clear title again. (or restore previous title.)"
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def flush(self) -> None:
 | 
						|
        "Write to output stream and flush."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def erase_screen(self) -> None:
 | 
						|
        """
 | 
						|
        Erases the screen with the background color and moves the cursor to
 | 
						|
        home.
 | 
						|
        """
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def enter_alternate_screen(self) -> None:
 | 
						|
        "Go to the alternate screen buffer. (For full screen applications)."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def quit_alternate_screen(self) -> None:
 | 
						|
        "Leave the alternate screen buffer."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def enable_mouse_support(self) -> None:
 | 
						|
        "Enable mouse."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def disable_mouse_support(self) -> None:
 | 
						|
        "Disable mouse."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def erase_end_of_line(self) -> None:
 | 
						|
        """
 | 
						|
        Erases from the current cursor position to the end of the current line.
 | 
						|
        """
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def erase_down(self) -> None:
 | 
						|
        """
 | 
						|
        Erases the screen from the current line down to the bottom of the
 | 
						|
        screen.
 | 
						|
        """
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def reset_attributes(self) -> None:
 | 
						|
        "Reset color and styling attributes."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def set_attributes(self, attrs: Attrs, color_depth: ColorDepth) -> None:
 | 
						|
        "Set new color and styling attributes."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def disable_autowrap(self) -> None:
 | 
						|
        "Disable auto line wrapping."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def enable_autowrap(self) -> None:
 | 
						|
        "Enable auto line wrapping."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def cursor_goto(self, row: int = 0, column: int = 0) -> None:
 | 
						|
        "Move cursor position."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def cursor_up(self, amount: int) -> None:
 | 
						|
        "Move cursor `amount` place up."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def cursor_down(self, amount: int) -> None:
 | 
						|
        "Move cursor `amount` place down."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def cursor_forward(self, amount: int) -> None:
 | 
						|
        "Move cursor `amount` place forward."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def cursor_backward(self, amount: int) -> None:
 | 
						|
        "Move cursor `amount` place backward."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def hide_cursor(self) -> None:
 | 
						|
        "Hide cursor."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def show_cursor(self) -> None:
 | 
						|
        "Show cursor."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def set_cursor_shape(self, cursor_shape: CursorShape) -> None:
 | 
						|
        "Set cursor shape to block, beam or underline."
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def reset_cursor_shape(self) -> None:
 | 
						|
        "Reset cursor shape."
 | 
						|
 | 
						|
    def ask_for_cpr(self) -> None:
 | 
						|
        """
 | 
						|
        Asks for a cursor position report (CPR).
 | 
						|
        (VT100 only.)
 | 
						|
        """
 | 
						|
 | 
						|
    @property
 | 
						|
    def responds_to_cpr(self) -> bool:
 | 
						|
        """
 | 
						|
        `True` if the `Application` can expect to receive a CPR response after
 | 
						|
        calling `ask_for_cpr` (this will come back through the corresponding
 | 
						|
        `Input`).
 | 
						|
 | 
						|
        This is used to determine the amount of available rows we have below
 | 
						|
        the cursor position. In the first place, we have this so that the drop
 | 
						|
        down autocompletion menus are sized according to the available space.
 | 
						|
 | 
						|
        On Windows, we don't need this, there we have
 | 
						|
        `get_rows_below_cursor_position`.
 | 
						|
        """
 | 
						|
        return False
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def get_size(self) -> Size:
 | 
						|
        "Return the size of the output window."
 | 
						|
 | 
						|
    def bell(self) -> None:
 | 
						|
        "Sound bell."
 | 
						|
 | 
						|
    def enable_bracketed_paste(self) -> None:
 | 
						|
        "For vt100 only."
 | 
						|
 | 
						|
    def disable_bracketed_paste(self) -> None:
 | 
						|
        "For vt100 only."
 | 
						|
 | 
						|
    def reset_cursor_key_mode(self) -> None:
 | 
						|
        """
 | 
						|
        For vt100 only.
 | 
						|
        Put the terminal in normal cursor mode (instead of application mode).
 | 
						|
 | 
						|
        See: https://vt100.net/docs/vt100-ug/chapter3.html
 | 
						|
        """
 | 
						|
 | 
						|
    def scroll_buffer_to_prompt(self) -> None:
 | 
						|
        "For Win32 only."
 | 
						|
 | 
						|
    def get_rows_below_cursor_position(self) -> int:
 | 
						|
        "For Windows only."
 | 
						|
        raise NotImplementedError
 | 
						|
 | 
						|
    @abstractmethod
 | 
						|
    def get_default_color_depth(self) -> ColorDepth:
 | 
						|
        """
 | 
						|
        Get default color depth for this output.
 | 
						|
 | 
						|
        This value will be used if no color depth was explicitly passed to the
 | 
						|
        `Application`.
 | 
						|
 | 
						|
        .. note::
 | 
						|
 | 
						|
            If the `$PROMPT_TOOLKIT_COLOR_DEPTH` environment variable has been
 | 
						|
            set, then `outputs.defaults.create_output` will pass this value to
 | 
						|
            the implementation as the default_color_depth, which is returned
 | 
						|
            here. (This is not used when the output corresponds to a
 | 
						|
            prompt_toolkit SSH/Telnet session.)
 | 
						|
        """
 | 
						|
 | 
						|
 | 
						|
class DummyOutput(Output):
 | 
						|
    """
 | 
						|
    For testing. An output class that doesn't render anything.
 | 
						|
    """
 | 
						|
 | 
						|
    def fileno(self) -> int:
 | 
						|
        "There is no sensible default for fileno()."
 | 
						|
        raise NotImplementedError
 | 
						|
 | 
						|
    def encoding(self) -> str:
 | 
						|
        return "utf-8"
 | 
						|
 | 
						|
    def write(self, data: str) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def write_raw(self, data: str) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def set_title(self, title: str) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def clear_title(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def flush(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def erase_screen(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def enter_alternate_screen(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def quit_alternate_screen(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def enable_mouse_support(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def disable_mouse_support(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def erase_end_of_line(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def erase_down(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def reset_attributes(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def set_attributes(self, attrs: Attrs, color_depth: ColorDepth) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def disable_autowrap(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def enable_autowrap(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def cursor_goto(self, row: int = 0, column: int = 0) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def cursor_up(self, amount: int) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def cursor_down(self, amount: int) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def cursor_forward(self, amount: int) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def cursor_backward(self, amount: int) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def hide_cursor(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def show_cursor(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def set_cursor_shape(self, cursor_shape: CursorShape) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def reset_cursor_shape(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def ask_for_cpr(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def bell(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def enable_bracketed_paste(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def disable_bracketed_paste(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def scroll_buffer_to_prompt(self) -> None:
 | 
						|
        pass
 | 
						|
 | 
						|
    def get_size(self) -> Size:
 | 
						|
        return Size(rows=40, columns=80)
 | 
						|
 | 
						|
    def get_rows_below_cursor_position(self) -> int:
 | 
						|
        return 40
 | 
						|
 | 
						|
    def get_default_color_depth(self) -> ColorDepth:
 | 
						|
        return ColorDepth.DEPTH_1_BIT
 |