Source code for pypsi.plugins.multiline
#
# Copyright (c) 2015, Adam Meily <meily.adam@gmail.com>
# Pypsi - https://github.com/ameily/pypsi
#
# Permission to use, copy, modify, and/or distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
#
from pypsi.core import Plugin
from pypsi.cmdline import StringToken
[docs]class MultilinePlugin(Plugin):
'''
Provides the ability to input and execute multiline statements. Input lines
that end in the escape character ``\`` can be continued on the subsequent
input line. This allows for the user to type the following and produces the
the statement:
| ``echo this is a multiline \``
| ``statement``
`=>`
``echo this is a multiline statement``
'''
def __init__(self, prompt='> ', preprocess=30, **kwargs):
'''
:param str prompt: the prompt when recording a multiline statement
'''
super(MultilinePlugin, self).__init__(preprocess=preprocess, **kwargs)
self.prompt = prompt
self.orig_prompt = None
self.buffer = None
def setup(self, shell):
pass
def set_ml_prompt(self, shell):
self.orig_prompt = shell.prompt
shell.prompt = self.prompt
def reset_prompt(self, shell):
if self.orig_prompt:
shell.prompt = self.orig_prompt
self.orig_prompt = ''
def on_tokenize(self, shell, tokens, origin):
if origin != 'input':
return tokens
if not tokens:
if self.buffer:
self.reset_prompt(shell)
ret = self.buffer
self.buffer = None
return ret
else:
return tokens
if not isinstance(tokens[-1], StringToken):
return self.buffer + tokens if self.buffer else tokens
last = tokens[-1]
if last.escape:
last.text = last.text[:-1]
if self.buffer:
self.buffer.extend(tokens)
else:
self.set_ml_prompt(shell)
self.buffer = tokens
tokens = None
elif self.buffer:
tokens = self.buffer + tokens
self.buffer = None
self.reset_prompt(shell)
return tokens
def on_input_canceled(self, shell):
self.reset_prompt(shell)
self.buffer = None