| """Terminal input and output prompts.""" |
|
|
| from pygments.token import Token |
| import sys |
|
|
| from IPython.core.displayhook import DisplayHook |
|
|
| from prompt_toolkit.formatted_text import fragment_list_width, PygmentsTokens |
| from prompt_toolkit.shortcuts import print_formatted_text |
| from prompt_toolkit.enums import EditingMode |
|
|
|
|
| class Prompts(object): |
| def __init__(self, shell): |
| self.shell = shell |
|
|
| def vi_mode(self): |
| if (getattr(self.shell.pt_app, 'editing_mode', None) == EditingMode.VI |
| and self.shell.prompt_includes_vi_mode): |
| mode = str(self.shell.pt_app.app.vi_state.input_mode) |
| if mode.startswith('InputMode.'): |
| mode = mode[10:13].lower() |
| elif mode.startswith('vi-'): |
| mode = mode[3:6] |
| return '['+mode+'] ' |
| return '' |
|
|
|
|
| def in_prompt_tokens(self): |
| return [ |
| (Token.Prompt, self.vi_mode() ), |
| (Token.Prompt, 'In ['), |
| (Token.PromptNum, str(self.shell.execution_count)), |
| (Token.Prompt, ']: '), |
| ] |
|
|
| def _width(self): |
| return fragment_list_width(self.in_prompt_tokens()) |
|
|
| def continuation_prompt_tokens(self, 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, ']: '), |
| ] |
|
|
| class ClassicPrompts(Prompts): |
| def in_prompt_tokens(self): |
| return [ |
| (Token.Prompt, '>>> '), |
| ] |
|
|
| def continuation_prompt_tokens(self, width=None): |
| return [ |
| (Token.Prompt, '... ') |
| ] |
|
|
| def rewrite_prompt_tokens(self): |
| return [] |
|
|
| def out_prompt_tokens(self): |
| return [] |
|
|
| class RichPromptDisplayHook(DisplayHook): |
| """Subclass of base display hook using coloured prompt""" |
| def write_output_prompt(self): |
| sys.stdout.write(self.shell.separate_out) |
| |
| |
| self.prompt_end_newline = True |
|
|
| if self.do_full_cache: |
| tokens = self.shell.prompts.out_prompt_tokens() |
| prompt_txt = ''.join(s for t, s in tokens) |
| if prompt_txt and not prompt_txt.endswith('\n'): |
| |
| self.prompt_end_newline = False |
|
|
| if self.shell.pt_app: |
| print_formatted_text(PygmentsTokens(tokens), |
| style=self.shell.pt_app.app.style, end='', |
| ) |
| else: |
| sys.stdout.write(prompt_txt) |
|
|
| def write_format_data(self, format_dict, md_dict=None) -> None: |
| if self.shell.mime_renderers: |
|
|
| for mime, handler in self.shell.mime_renderers.items(): |
| if mime in format_dict: |
| handler(format_dict[mime], None) |
| return |
| |
| super().write_format_data(format_dict, md_dict) |
|
|
|
|