prompts.py
80 lines
| 2.3 KiB
| text/x-python
|
PythonLexer
Thomas Kluyver
|
r22428 | """Terminal input and output prompts.""" | ||
from __future__ import print_function | ||||
Thomas Kluyver
|
r22421 | from pygments.token import Token | ||
Thomas Kluyver
|
r22422 | import sys | ||
from IPython.core.displayhook import DisplayHook | ||||
Thomas Kluyver
|
r22421 | |||
Matthias Bussonnier
|
r22471 | from prompt_toolkit.layout.utils import token_list_width | ||
Thomas Kluyver
|
r22421 | class Prompts(object): | ||
def __init__(self, shell): | ||||
self.shell = shell | ||||
def in_prompt_tokens(self, cli=None): | ||||
return [ | ||||
(Token.Prompt, 'In ['), | ||||
(Token.PromptNum, str(self.shell.execution_count)), | ||||
(Token.Prompt, ']: '), | ||||
] | ||||
def _width(self): | ||||
Matthias Bussonnier
|
r22471 | return token_list_width(self.in_prompt_tokens()) | ||
Thomas Kluyver
|
r22421 | |||
def continuation_prompt_tokens(self, cli=None, width=None): | ||||
if width is None: | ||||
width = self._width() | ||||
return [ | ||||
(Token.Prompt, (' ' * (width - 5)) + '...: '), | ||||
] | ||||
def rewrite_prompt_tokens(self): | ||||
width = self._width() | ||||
return [ | ||||
(Token.Prompt, ('-' * (width - 2)) + '> '), | ||||
] | ||||
def out_prompt_tokens(self): | ||||
return [ | ||||
(Token.OutPrompt, 'Out['), | ||||
(Token.OutPromptNum, str(self.shell.execution_count)), | ||||
(Token.OutPrompt, ']: '), | ||||
] | ||||
Thomas Kluyver
|
r22422 | |||
Thomas Kluyver
|
r22429 | class ClassicPrompts(Prompts): | ||
def in_prompt_tokens(self, cli=None): | ||||
return [ | ||||
(Token.Prompt, '>>> '), | ||||
] | ||||
def continuation_prompt_tokens(self, cli=None, width=None): | ||||
return [ | ||||
(Token.Prompt, '... ') | ||||
] | ||||
def rewrite_prompt_tokens(self): | ||||
return [] | ||||
def out_prompt_tokens(self): | ||||
return [] | ||||
Thomas Kluyver
|
r22422 | class RichPromptDisplayHook(DisplayHook): | ||
"""Subclass of base display hook using coloured prompt""" | ||||
def write_output_prompt(self): | ||||
sys.stdout.write(self.shell.separate_out) | ||||
Thomas Kluyver
|
r23158 | # If we're not displaying a prompt, it effectively ends with a newline, | ||
# because the output will be left-aligned. | ||||
self.prompt_end_newline = True | ||||
Thomas Kluyver
|
r22422 | if self.do_full_cache: | ||
tokens = self.shell.prompts.out_prompt_tokens() | ||||
Thomas Kluyver
|
r23158 | prompt_txt = ''.join(s for t, s in tokens) | ||
if prompt_txt and not prompt_txt.endswith('\n'): | ||||
# Ask for a newline before multiline output | ||||
self.prompt_end_newline = False | ||||
Thomas Kluyver
|
r22422 | if self.shell.pt_cli: | ||
self.shell.pt_cli.print_tokens(tokens) | ||||
else: | ||||
Thomas Kluyver
|
r23158 | sys.stdout.write(prompt_txt) | ||