summaryrefslogtreecommitdiffstats
path: root/ptpython/prompt_style.py
diff options
context:
space:
mode:
Diffstat (limited to 'ptpython/prompt_style.py')
-rw-r--r--ptpython/prompt_style.py79
1 files changed, 79 insertions, 0 deletions
diff --git a/ptpython/prompt_style.py b/ptpython/prompt_style.py
new file mode 100644
index 0000000..96b738f
--- /dev/null
+++ b/ptpython/prompt_style.py
@@ -0,0 +1,79 @@
+from __future__ import annotations
+
+from abc import ABCMeta, abstractmethod
+from typing import TYPE_CHECKING
+
+from prompt_toolkit.formatted_text import AnyFormattedText
+
+if TYPE_CHECKING:
+ from .python_input import PythonInput
+
+__all__ = ["PromptStyle", "IPythonPrompt", "ClassicPrompt"]
+
+
+class PromptStyle(metaclass=ABCMeta):
+ """
+ Base class for all prompts.
+ """
+
+ @abstractmethod
+ def in_prompt(self) -> AnyFormattedText:
+ "Return the input tokens."
+ return []
+
+ @abstractmethod
+ def in2_prompt(self, width: int) -> AnyFormattedText:
+ """
+ Tokens for every following input line.
+
+ :param width: The available width. This is coming from the width taken
+ by `in_prompt`.
+ """
+ return []
+
+ @abstractmethod
+ def out_prompt(self) -> AnyFormattedText:
+ "Return the output tokens."
+ return []
+
+
+class IPythonPrompt(PromptStyle):
+ """
+ A prompt resembling the IPython prompt.
+ """
+
+ def __init__(self, python_input: PythonInput) -> None:
+ self.python_input = python_input
+
+ def in_prompt(self) -> AnyFormattedText:
+ return [
+ ("class:in", "In ["),
+ ("class:in.number", "%s" % self.python_input.current_statement_index),
+ ("class:in", "]: "),
+ ]
+
+ def in2_prompt(self, width: int) -> AnyFormattedText:
+ return [("class:in", "...: ".rjust(width))]
+
+ def out_prompt(self) -> AnyFormattedText:
+ return [
+ ("class:out", "Out["),
+ ("class:out.number", "%s" % self.python_input.current_statement_index),
+ ("class:out", "]:"),
+ ("", " "),
+ ]
+
+
+class ClassicPrompt(PromptStyle):
+ """
+ The classic Python prompt.
+ """
+
+ def in_prompt(self) -> AnyFormattedText:
+ return [("class:prompt", ">>> ")]
+
+ def in2_prompt(self, width: int) -> AnyFormattedText:
+ return [("class:prompt.dots", "...")]
+
+ def out_prompt(self) -> AnyFormattedText:
+ return []