diff --git a/IPython/PyColorize.py b/IPython/PyColorize.py index 18ae2f7..4aa6a69 100755 --- a/IPython/PyColorize.py +++ b/IPython/PyColorize.py @@ -28,7 +28,7 @@ scan Python source code and re-emit it with no changes to its original formatting (which is the hard part). - $Id: PyColorize.py 2155 2007-03-19 00:45:51Z fperez $""" + $Id: PyColorize.py 2205 2007-04-04 06:04:01Z fperez $""" __all__ = ['ANSICodeColors','Parser'] @@ -131,8 +131,7 @@ class Parser: out should be a file-type object. Optionally, out can be given as the string 'str' and the parser will automatically return the output in a string.""" - - self.raw = string.strip(string.expandtabs(raw)) + string_output = 0 if out == 'str' or self.out == 'str': out_old = self.out @@ -140,22 +139,36 @@ class Parser: string_output = 1 elif out is not None: self.out = out - # local shorthand + + # Fast return of the unmodified input for NoColor scheme + if scheme == 'NoColor': + error = False + self.out.write(raw) + if string_output: + return raw,error + else: + return None,error + + # local shorthands colors = self.color_table[scheme].colors self.colors = colors # put in object so __call__ sees it + + # Remove trailing whitespace and normalize tabs + self.raw = raw.expandtabs().rstrip() # store line offsets in self.lines self.lines = [0, 0] pos = 0 + raw_find = raw.find + lines_append = self.lines.append while 1: - pos = string.find(self.raw, '\n', pos) + 1 + pos = raw_find('\n', pos) + 1 if not pos: break - self.lines.append(pos) - self.lines.append(len(self.raw)) + lines_append(pos) + lines_append(len(self.raw)) # parse the source and write it self.pos = 0 text = cStringIO.StringIO(self.raw) - #self.out.write('
')
 
         error = False
         try:
@@ -179,8 +192,9 @@ class Parser:
     def __call__(self, toktype, toktext, (srow,scol), (erow,ecol), line):
         """ Token handler, with syntax highlighting."""
 
-        # local shorthand
+        # local shorthands
         colors = self.colors
+        owrite = self.out.write
 
         # line separator, so this works across platforms
         linesep = os.linesep
@@ -192,12 +206,12 @@ class Parser:
 
         # handle newlines
         if toktype in [token.NEWLINE, tokenize.NL]:
-            self.out.write(linesep)
+            owrite(linesep)
             return
 
         # send the original whitespace, if needed
         if newpos > oldpos:
-            self.out.write(self.raw[oldpos:newpos])
+            owrite(self.raw[oldpos:newpos])
 
         # skip indenting tokens
         if toktype in [token.INDENT, token.DEDENT]:
@@ -220,7 +234,7 @@ class Parser:
                                       (colors.normal,linesep,color))
 
         # send text
-        self.out.write('%s%s%s' % (color,toktext,colors.normal))
+        owrite('%s%s%s' % (color,toktext,colors.normal))
             
 def main():
     """Colorize a python file using ANSI color escapes and print to stdout.
diff --git a/doc/ChangeLog b/doc/ChangeLog
index 0d91c0a..05e6afa 100644
--- a/doc/ChangeLog
+++ b/doc/ChangeLog
@@ -1,3 +1,9 @@
+2007-04-04  Fernando Perez  
+
+	* IPython/PyColorize.py (Parser.format2): Fix identation of
+	colorzied output and return early if color scheme is NoColor, to
+	avoid unnecessary and expensive tokenization.  Closes #131.
+
 2007-04-03  Fernando Perez  
 
 	* IPython/Debugger.py: disable the use of pydb version 1.17.  It