2 Backend to the console plugin. 
    4 @author: Eitan Isaacson 
    5 @organization: IBM Corporation 
    6 @copyright: Copyright (c) 2007 IBM Corporation 
    9 All rights reserved. This program and the accompanying materials are made  
   10 available under the terms of the BSD which accompanies this distribution, and  
   11 is available at U{http://www.opensource.org/licenses/bsd-license.php} 
   21 from StringIO 
import StringIO
 
   24 ansi_colors =  {
'0;30': 
'Black',
 
   37                 '1;35': 
'MediumPurple',
 
   42   def __init__(self,argv=None,user_ns=None,user_global_ns=None,
 
   43                cin=
None, cout=
None,cerr=
None, input_func=
None):
 
   45       IPython.iplib.raw_input_original = input_func
 
   47       IPython.Shell.Term.cin = cin
 
   49       IPython.Shell.Term.cout = cout
 
   51       IPython.Shell.Term.cerr = cerr
 
   58     IPython.iplib.raw_input = 
lambda x: 
None 
   60     self.
term = IPython.genutils.IOTerm(cin=cin, cout=cout, cerr=cerr)
 
   61     os.environ[
'TERM'] = 
'dumb' 
   62     excepthook = sys.excepthook
 
   63     self.
IP = IPython.Shell.make_IPython(argv,user_ns=user_ns,
 
   64                                          user_global_ns=user_global_ns,
 
   66                                          shell_class=IPython.Shell.InteractiveShell)
 
   67     self.IP.system = 
lambda cmd: self.
shell(self.IP.var_expand(cmd),
 
   68                                             header=
'IPython system call: ',
 
   69                                             verbose=self.IP.rc.system_verbose)
 
   70     sys.excepthook = excepthook
 
   77     orig_stdout = sys.stdout
 
   78     sys.stdout = IPython.Shell.Term.cout
 
   80       line = self.IP.raw_input(
None, self.
iter_more)
 
   81       if self.IP.autoindent:
 
   82         self.IP.readline_startup_hook(
None)
 
   83     except KeyboardInterrupt:
 
   84       self.IP.write(
'\nKeyboardInterrupt\n')
 
   87       self.IP.outputcache.prompt_count -= 1
 
   89       if self.IP.autoindent:
 
   90         self.IP.indent_current_nsp = 0
 
   93       self.IP.showtraceback()
 
   96       if (self.IP.SyntaxTB.last_syntax_error 
and 
   97           self.IP.rc.autoedit_syntax):
 
   98         self.IP.edit_syntax_error()
 
  100       self.
prompt = str(self.IP.outputcache.prompt2).strip()
 
  101       if self.IP.autoindent:
 
  102         self.IP.readline_startup_hook(self.IP.pre_readline)
 
  104       self.
prompt = str(self.IP.outputcache.prompt1).strip()
 
  105     sys.stdout = orig_stdout
 
  124     self.IP.user_ns.update(ns_dict)
 
  127     split_line = self.complete_sep.split(line)
 
  128     possibilities = self.IP.complete(split_line[-1])
 
  131       completed = line[:-len(split_line[-1])]+common_prefix
 
  134     return completed, possibilities
 
  137     for i 
in range(len(str1)):
 
  138       if not str2.startswith(str1[:i+1]):
 
  142   def shell(self, cmd,verbose=0,debug=0,header=''):
 
  144     if verbose 
or debug: 
print header+cmd
 
  147       input, output = os.popen4(cmd)
 
  154     gtk.TextView.__init__(self)
 
  155     self.modify_font(pango.FontDescription(
'Mono'))
 
  156     self.set_cursor_visible(
True)
 
  158     self.
mark = self.text_buffer.create_mark(
'scroll_mark',
 
  159                                              self.text_buffer.get_end_iter(),
 
  161     for code 
in ansi_colors:
 
  162       self.text_buffer.create_tag(code,
 
  163                                   foreground=ansi_colors[code],
 
  165     self.text_buffer.create_tag(
'0')
 
  166     self.text_buffer.create_tag(
'notouch', editable=
False)
 
  169                 self.text_buffer.create_mark(
'line_start',
 
  170                         self.text_buffer.get_end_iter(), 
True 
  175   def write(self, text, editable=False):
 
  176     segments = self.color_pat.split(text)
 
  177     segment = segments.pop(0)
 
  178     start_mark = self.text_buffer.create_mark(
None,
 
  179                                               self.text_buffer.get_end_iter(),
 
  181     self.text_buffer.insert(self.text_buffer.get_end_iter(), segment)
 
  184       ansi_tags = self.color_pat.findall(text)
 
  185       for tag 
in ansi_tags:
 
  186         i = segments.index(tag)
 
  187         self.text_buffer.insert_with_tags_by_name(self.text_buffer.get_end_iter(),
 
  191       self.text_buffer.apply_tag_by_name(
'notouch',
 
  192                                          self.text_buffer.get_iter_at_mark(start_mark),
 
  193                                          self.text_buffer.get_end_iter())
 
  194     self.text_buffer.delete_mark(start_mark)
 
  195     self.scroll_mark_onscreen(self.
mark)
 
  199     self.text_buffer.move_mark(self.
line_start,self.text_buffer.get_end_iter())
 
  202     iter = self.text_buffer.get_iter_at_mark(self.
line_start)
 
  203     iter.forward_to_line_end()
 
  204     self.text_buffer.delete(self.text_buffer.get_iter_at_mark(self.
line_start), iter)
 
  205     self.
write(text, 
True)
 
  208     rv = self.text_buffer.get_slice(self.text_buffer.get_iter_at_mark(self.
line_start),
 
  209                                     self.text_buffer.get_end_iter(), 
False)
 
  213     iter = self.text_buffer.get_iter_at_mark(self.
line_start)
 
  214     iter.forward_to_line_end()
 
  215     self.text_buffer.apply_tag_by_name(
'notouch',
 
  216                                        self.text_buffer.get_iter_at_mark(self.
line_start),
 
  218     self.
write(
'\n'+text)
 
  222     self.text_buffer.move_mark(self.
line_start,self.text_buffer.get_end_iter())
 
  223     self.text_buffer.place_cursor(self.text_buffer.get_end_iter())
 
  228     insert_mark = self.text_buffer.get_insert()
 
  229     insert_iter = self.text_buffer.get_iter_at_mark(insert_mark)
 
  230     selection_mark = self.text_buffer.get_selection_bound()
 
  231     selection_iter = self.text_buffer.get_iter_at_mark(selection_mark)
 
  232     start_iter = self.text_buffer.get_iter_at_mark(self.
line_start)
 
  233     if start_iter.compare(insert_iter) <= 0 
and \
 
  234           start_iter.compare(selection_iter) <= 0:
 
  236     elif start_iter.compare(insert_iter) > 0 
and \
 
  237           start_iter.compare(selection_iter) > 0:
 
  238       self.text_buffer.place_cursor(start_iter)
 
  239     elif insert_iter.compare(selection_iter) < 0:
 
  240       self.text_buffer.move_mark(insert_mark, start_iter)
 
  241     elif insert_iter.compare(selection_iter) > 0:
 
  242       self.text_buffer.move_mark(selection_mark, start_iter)
 
  247     ConsoleView.__init__(self)
 
  249     IterableIPShell.__init__(self, cout=self.
cout,cerr=self.
cout,
 
  251     self.connect(
'key_press_event', self.
keyPress)
 
  253     self.cout.truncate(0)
 
  260       raise KeyboardInterrupt
 
  264     if event.state & gtk.gdk.CONTROL_MASK 
and event.keyval == 99:
 
  268     elif event.keyval == gtk.keysyms.Return:
 
  271     elif event.keyval == gtk.keysyms.Up:
 
  274     elif event.keyval == gtk.keysyms.Down:
 
  277     elif event.keyval == gtk.keysyms.Tab:
 
  281       if len(possibilities) > 1:
 
  284         for symbol 
in possibilities:
 
  285           self.
write(symbol+
'\n')
 
  293     rv = self.cout.getvalue()
 
  294     if rv: rv = rv.strip(
'\n')
 
  296     self.cout.truncate(0)