[Python-checkins] cpython: Add support for ANSI escape sequences

raymond.hettinger python-checkins at python.org
Tue Jul 3 23:11:49 CEST 2012


http://hg.python.org/cpython/rev/980de5b47d0d
changeset:   77940:980de5b47d0d
user:        Raymond Hettinger <python at rcn.com>
date:        Tue Jul 03 14:11:40 2012 -0700
summary:
  Add support for ANSI escape sequences

files:
  Tools/scripts/highlight.py |  52 ++++++++++++++++++++++----
  1 files changed, 44 insertions(+), 8 deletions(-)


diff --git a/Tools/scripts/highlight.py b/Tools/scripts/highlight.py
--- a/Tools/scripts/highlight.py
+++ b/Tools/scripts/highlight.py
@@ -1,7 +1,8 @@
 #!/usr/bin/env python3
-'Convert Python source code to HTML with colorized markup'
+'Add syntax highlighting to Python source code'
 
-__all__ = ['colorize', 'build_page', 'default_css', 'default_html']
+__all__ = ['colorize', 'build_page', 'default_css', 'default_html',
+           'ansi_colorize', 'default_ansi']
 __author__ = 'Raymond Hettinger'
 
 import keyword, tokenize, cgi, functools
@@ -52,7 +53,29 @@
         line_thru_token, written = combine_range(lines, written, (erow, ecol))
         yield kind, line_upto_token, line_thru_token
 
-def colorize(source):
+default_ansi = {
+    'comment': '\033[0;31m',
+    'string': '\033[0;32m',
+    'docstring': '\033[0;32m',
+    'keyword': '\033[0;33m',
+    'builtin': '\033[0;35m',
+    'definition': '\033[0;33m',
+    'defname': '\033[0;34m',
+    'operator': '\033[0;33m',
+}
+
+def colorize_ansi(source, colors=default_ansi):
+    'Add syntax highlighting to Python source code using ANSI escape sequences'
+    # http://en.wikipedia.org/wiki/ANSI_escape_code
+    result = []
+    for kind, line_upto_token, line_thru_token in isolate_tokens(source):
+        if kind:
+            result += [line_upto_token, colors[kind], line_thru_token, '\033[0m']
+        else:
+            result += [line_upto_token, line_thru_token]
+    return ''.join(result)
+
+def colorize_html(source):
     'Convert Python source code to an HTML fragment with colorized markup'
     result = ['<pre class="python">\n']
     for kind, line_upto_token, line_thru_token in isolate_tokens(source):
@@ -98,7 +121,7 @@
 def build_page(source, title='python', css=default_css, html=default_html):
     'Create a complete HTML page with colorized Python source code'
     css_str = '\n'.join(['%s %s' % item for item in css.items()])
-    result = colorize(source)
+    result = colorize_html(source)
     title = cgi.escape(title)
     return html.format(title=title, css=css_str, body=result)
 
@@ -107,26 +130,39 @@
     import sys, argparse, webbrowser, os
 
     parser = argparse.ArgumentParser(
-            description = 'Convert Python source code to colorized HTML')
+            description = 'Add syntax highlighting to Python source')
     parser.add_argument('sourcefile', metavar = 'SOURCEFILE',
             help = 'File containing Python sourcecode')
+    parser.add_argument('-a', '--ansi', action = 'store_true',
+            help = 'emit ANSI escape highlighted source')
     parser.add_argument('-b', '--browser', action = 'store_true',
             help = 'launch a browser to show results')
     parser.add_argument('-s', '--section', action = 'store_true',
             help = 'show an HTML section rather than a complete webpage')
     args = parser.parse_args()
+
     if args.browser and args.section:
         parser.error('The -s/--section option is incompatible with '
                      'the -b/--browser option')
+    if args.ansi and (args.browser or args.section):
+        parser.error('The -a/--ansi option is incompatible with '
+                     'the -b/--browser and -s/--section options')
 
     sourcefile = args.sourcefile
     with open(sourcefile) as f:
         page = f.read()
-    html = colorize(page) if args.section else build_page(page, title=sourcefile)
+
+    if args.ansi:
+        encoded = colorize_ansi(page)
+    elif args.section:
+        encoded = colorize_html(page)
+    else:
+        encoded = build_page(page, title=sourcefile)
+
     if args.browser:
         htmlfile = os.path.splitext(os.path.basename(sourcefile))[0] + '.html'
         with open(htmlfile, 'w') as f:
-            f.write(html)
+            f.write(encoded)
         webbrowser.open('file://' + os.path.abspath(htmlfile))
     else:
-        sys.stdout.write(html)
+        sys.stdout.write(encoded)

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list