summaryrefslogtreecommitdiffstats
path: root/Tools/scripts
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2012-07-03 21:11:40 (GMT)
committerRaymond Hettinger <python@rcn.com>2012-07-03 21:11:40 (GMT)
commit3a96161a73ce814128d1b3924b179d5eaf6d2573 (patch)
tree64ad6c462c039f2f2321ea02c2f70613eda692f8 /Tools/scripts
parented1f7c834fb38481fde3f8a317a48c8fe43d0809 (diff)
downloadcpython-3a96161a73ce814128d1b3924b179d5eaf6d2573.zip
cpython-3a96161a73ce814128d1b3924b179d5eaf6d2573.tar.gz
cpython-3a96161a73ce814128d1b3924b179d5eaf6d2573.tar.bz2
Add support for ANSI escape sequences
Diffstat (limited to 'Tools/scripts')
-rwxr-xr-xTools/scripts/highlight.py52
1 files changed, 44 insertions, 8 deletions
diff --git a/Tools/scripts/highlight.py b/Tools/scripts/highlight.py
index b2cef3d..88b709f 100755
--- 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 @@ def isolate_tokens(source):
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 @@ default_html = '''\
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 @@ if __name__ == '__main__':
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)