80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			80 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | """Terminal input and output prompts.""" | ||
|  | 
 | ||
|  | from pygments.token import Token | ||
|  | import sys | ||
|  | 
 | ||
|  | from yap_ipython.core.displayhook import DisplayHook | ||
|  | 
 | ||
|  | from prompt_toolkit.layout.utils import token_list_width | ||
|  | 
 | ||
|  | 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): | ||
|  |         return token_list_width(self.in_prompt_tokens()) | ||
|  | 
 | ||
|  |     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, ']: '), | ||
|  |         ] | ||
|  | 
 | ||
|  | 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 [] | ||
|  | 
 | ||
|  | class RichPromptDisplayHook(DisplayHook): | ||
|  |     """Subclass of base display hook using coloured prompt""" | ||
|  |     def write_output_prompt(self): | ||
|  |         sys.stdout.write(self.shell.separate_out) | ||
|  |         # 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 | ||
|  | 
 | ||
|  |         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'): | ||
|  |                 # Ask for a newline before multiline output | ||
|  |                 self.prompt_end_newline = False | ||
|  | 
 | ||
|  |             if self.shell.pt_cli: | ||
|  |                 self.shell.pt_cli.print_tokens(tokens) | ||
|  |             else: | ||
|  |                 sys.stdout.write(prompt_txt) |