##// END OF EJS Templates
Implemented module and namespace pattern in js notebook.
Implemented module and namespace pattern in js notebook.

File last commit:

r3039:3f194000
r4352:c5b0c06e
Show More
splitinput.py
91 lines | 3.0 KiB | text/x-python | PythonLexer
Brian Granger
More work on refactoring things into components....
r2244 #!/usr/bin/env python
# encoding: utf-8
"""
Simple utility for splitting user input.
Authors:
* Brian Granger
* Fernando Perez
"""
#-----------------------------------------------------------------------------
# Copyright (C) 2008-2009 The IPython Development Team
#
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
import re
Fernando Perez
Unicode fixes, basic input/printing of unicode works.
r3038 import sys
Brian Granger
More work on refactoring things into components....
r2244
#-----------------------------------------------------------------------------
# Main function
#-----------------------------------------------------------------------------
# RegExp for splitting line contents into pre-char//first word-method//rest.
# For clarity, each group in on one line.
Brian Granger
Moving and renaming in preparation of subclassing InteractiveShell....
r2760 # WARNING: update the regexp if the escapes in interactiveshell are changed, as they
Brian Granger
More work on refactoring things into components....
r2244 # are hardwired in.
# Although it's not solely driven by the regex, note that:
# ,;/% only trigger if they are the first character on the line
# ! and !! trigger if they are first char(s) *or* follow an indent
# ? triggers as first or last char.
# The three parts of the regex are:
# 1) pre: pre_char *or* initial whitespace
# 2) ifun: first word/method (mix of \w and '.')
# 3) the_rest: rest of line (separated from ifun by space if non-empty)
line_split = re.compile(r'^([,;/%?]|!!?|\s*)'
r'\s*([\w\.]+)'
r'(\s+.*$|$)')
Brian Granger
First go an implementing a=!ls and a=%who syntax....
r2256 # r'[\w\.]+'
# r'\s*=\s*%.*'
Brian Granger
More work on refactoring things into components....
r2244
def split_user_input(line, pattern=None):
Brian Granger
First go an implementing a=!ls and a=%who syntax....
r2256 """Split user input into pre-char/whitespace, function part and rest.
This is currently handles lines with '=' in them in a very inconsistent
manner.
"""
Fernando Perez
Unicode fixes, basic input/printing of unicode works.
r3038 # We need to ensure that the rest of this routine deals only with unicode
if type(line)==str:
Fernando Perez
Unicode fix for case when stdin is a pipe (like during test suite)
r3039 codec = sys.stdin.encoding
if codec is None:
codec = 'utf-8'
line = line.decode(codec)
Fernando Perez
Unicode fixes, basic input/printing of unicode works.
r3038
Brian Granger
More work on refactoring things into components....
r2244 if pattern is None:
pattern = line_split
match = pattern.match(line)
if not match:
Brian Granger
First go an implementing a=!ls and a=%who syntax....
r2256 # print "match failed for line '%s'" % line
Brian Granger
More work on refactoring things into components....
r2244 try:
ifun, the_rest = line.split(None,1)
except ValueError:
Brian Granger
First go an implementing a=!ls and a=%who syntax....
r2256 # print "split failed for line '%s'" % line
Fernando Perez
Unicode fixes, basic input/printing of unicode works.
r3038 ifun, the_rest = line, u''
Brian Granger
More work on refactoring things into components....
r2244 pre = re.match('^(\s*)(.*)',line).groups()[0]
else:
pre,ifun,the_rest = match.groups()
Fernando Perez
Unicode fixes, basic input/printing of unicode works.
r3038 # ifun has to be a valid python identifier, so it better encode into
# ascii. We do still make it a unicode string so that we consistently
# return unicode, but it will be one that is guaranteed to be pure ascii
Brian Granger
More work on refactoring things into components....
r2244 try:
Fernando Perez
Unicode fixes, basic input/printing of unicode works.
r3038 ifun = unicode(ifun.encode('ascii'))
Brian Granger
More work on refactoring things into components....
r2244 except UnicodeEncodeError:
the_rest = ifun + u' ' + the_rest
ifun = u''
#print 'line:<%s>' % line # dbg
#print 'pre <%s> ifun <%s> rest <%s>' % (pre,ifun.strip(),the_rest) # dbg
return pre, ifun.strip(), the_rest.lstrip()