| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  | #!/usr/bin/env python3 | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  | '''Add syntax highlighting to Python source code''' | 
					
						
							| 
									
										
										
										
											2012-07-03 14:42:33 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-30 23:19:30 -07:00
										 |  |  | __author__ = 'Raymond Hettinger' | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  | import keyword, tokenize, cgi, re, functools | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  | try: | 
					
						
							|  |  |  |     import builtins | 
					
						
							|  |  |  | except ImportError: | 
					
						
							|  |  |  |     import __builtin__ as builtins | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #### Analyze Python Source ################################# | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | def is_builtin(s): | 
					
						
							|  |  |  |     'Return True if s is the name of a builtin' | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  |     return hasattr(builtins, s) | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-03 13:13:52 -07:00
										 |  |  | def combine_range(lines, start, end): | 
					
						
							|  |  |  |     'Join content from a range of lines between start and end' | 
					
						
							| 
									
										
										
										
											2012-07-02 13:29:57 -07:00
										 |  |  |     (srow, scol), (erow, ecol) = start, end | 
					
						
							|  |  |  |     if srow == erow: | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |         return lines[srow-1][scol:ecol], end | 
					
						
							|  |  |  |     rows = [lines[srow-1][scol:]] + lines[srow: erow-1] + [lines[erow-1][:ecol]] | 
					
						
							| 
									
										
										
										
											2012-07-03 13:13:52 -07:00
										 |  |  |     return ''.join(rows), end | 
					
						
							| 
									
										
										
										
											2012-07-02 13:29:57 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  | def analyze_python(source): | 
					
						
							|  |  |  |     '''Generate and classify chunks of Python for syntax highlighting.
 | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  |        Yields tuples in the form: (category, categorized_text). | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |     '''
 | 
					
						
							| 
									
										
										
										
											2012-07-03 00:15:59 -07:00
										 |  |  |     lines = source.splitlines(True) | 
					
						
							| 
									
										
										
										
											2012-07-02 13:29:57 -07:00
										 |  |  |     lines.append('') | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  |     readline = functools.partial(next, iter(lines), '') | 
					
						
							|  |  |  |     kind = tok_str = '' | 
					
						
							|  |  |  |     tok_type = tokenize.COMMENT | 
					
						
							| 
									
										
										
										
											2012-07-02 13:29:57 -07:00
										 |  |  |     written = (1, 0) | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  |     for tok in tokenize.generate_tokens(readline): | 
					
						
							|  |  |  |         prev_tok_type, prev_tok_str = tok_type, tok_str | 
					
						
							|  |  |  |         tok_type, tok_str, (srow, scol), (erow, ecol), logical_lineno = tok | 
					
						
							| 
									
										
										
										
											2012-07-03 00:12:27 -07:00
										 |  |  |         kind = '' | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  |         if tok_type == tokenize.COMMENT: | 
					
						
							|  |  |  |             kind = 'comment' | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  |         elif tok_type == tokenize.OP and tok_str[:1] not in '{}[](),.:;@': | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  |             kind = 'operator' | 
					
						
							|  |  |  |         elif tok_type == tokenize.STRING: | 
					
						
							|  |  |  |             kind = 'string' | 
					
						
							|  |  |  |             if prev_tok_type == tokenize.INDENT or scol==0: | 
					
						
							|  |  |  |                 kind = 'docstring' | 
					
						
							|  |  |  |         elif tok_type == tokenize.NAME: | 
					
						
							|  |  |  |             if tok_str in ('def', 'class', 'import', 'from'): | 
					
						
							|  |  |  |                 kind = 'definition' | 
					
						
							|  |  |  |             elif prev_tok_str in ('def', 'class'): | 
					
						
							|  |  |  |                 kind = 'defname' | 
					
						
							|  |  |  |             elif keyword.iskeyword(tok_str): | 
					
						
							|  |  |  |                 kind = 'keyword' | 
					
						
							|  |  |  |             elif is_builtin(tok_str) and prev_tok_str != '.': | 
					
						
							|  |  |  |                 kind = 'builtin' | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |         if kind: | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  |             text, written = combine_range(lines, written, (srow, scol)) | 
					
						
							|  |  |  |             yield '', text | 
					
						
							| 
									
										
										
										
											2012-07-23 00:24:24 -05:00
										 |  |  |             text, written = tok_str, (erow, ecol) | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  |             yield kind, text | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |     line_upto_token, written = combine_range(lines, written, (erow, ecol)) | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  |     yield '', line_upto_token | 
					
						
							| 
									
										
										
										
											2012-07-03 13:13:52 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  | #### Raw Output  ########################################### | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def raw_highlight(classified_text): | 
					
						
							|  |  |  |     'Straight text display of text classifications' | 
					
						
							|  |  |  |     result = [] | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  |     for kind, text in classified_text: | 
					
						
							|  |  |  |         result.append('%15s:  %r\n' % (kind or 'plain', text)) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  |     return ''.join(result) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #### ANSI Output ########################################### | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-03 14:11:40 -07:00
										 |  |  | default_ansi = { | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |     'comment': ('\033[0;31m', '\033[0m'), | 
					
						
							|  |  |  |     'string': ('\033[0;32m', '\033[0m'), | 
					
						
							|  |  |  |     'docstring': ('\033[0;32m', '\033[0m'), | 
					
						
							|  |  |  |     'keyword': ('\033[0;33m', '\033[0m'), | 
					
						
							|  |  |  |     'builtin': ('\033[0;35m', '\033[0m'), | 
					
						
							|  |  |  |     'definition': ('\033[0;33m', '\033[0m'), | 
					
						
							|  |  |  |     'defname': ('\033[0;34m', '\033[0m'), | 
					
						
							|  |  |  |     'operator': ('\033[0;33m', '\033[0m'), | 
					
						
							| 
									
										
										
										
											2012-07-03 14:11:40 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  | def ansi_highlight(classified_text, colors=default_ansi): | 
					
						
							|  |  |  |     'Add syntax highlighting to source code using ANSI escape sequences' | 
					
						
							| 
									
										
										
										
											2012-07-03 14:11:40 -07:00
										 |  |  |     # http://en.wikipedia.org/wiki/ANSI_escape_code | 
					
						
							|  |  |  |     result = [] | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  |     for kind, text in classified_text: | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |         opener, closer = colors.get(kind, ('', '')) | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  |         result += [opener, text, closer] | 
					
						
							| 
									
										
										
										
											2012-07-03 14:11:40 -07:00
										 |  |  |     return ''.join(result) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  | #### HTML Output ########################################### | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  | def html_highlight(classified_text,opener='<pre class="python">\n', closer='</pre>\n'): | 
					
						
							|  |  |  |     'Convert classified text to an HTML fragment' | 
					
						
							|  |  |  |     result = [opener] | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  |     for kind, text in classified_text: | 
					
						
							|  |  |  |         if kind: | 
					
						
							|  |  |  |             result.append('<span class="%s">' % kind) | 
					
						
							|  |  |  |         result.append(cgi.escape(text)) | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  |         if kind: | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  |             result.append('</span>') | 
					
						
							|  |  |  |     result.append(closer) | 
					
						
							| 
									
										
										
										
											2012-07-02 13:29:57 -07:00
										 |  |  |     return ''.join(result) | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | default_css = { | 
					
						
							|  |  |  |     '.comment': '{color: crimson;}', | 
					
						
							|  |  |  |     '.string':  '{color: forestgreen;}', | 
					
						
							| 
									
										
										
										
											2012-07-03 13:13:52 -07:00
										 |  |  |     '.docstring': '{color: forestgreen; font-style:italic;}', | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  |     '.keyword': '{color: darkorange;}', | 
					
						
							|  |  |  |     '.builtin': '{color: purple;}', | 
					
						
							|  |  |  |     '.definition': '{color: darkorange; font-weight:bold;}', | 
					
						
							|  |  |  |     '.defname': '{color: blue;}', | 
					
						
							|  |  |  |     '.operator': '{color: brown;}', | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | default_html = '''\
 | 
					
						
							| 
									
										
										
										
											2012-06-30 22:19:04 -07:00
										 |  |  | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" | 
					
						
							|  |  |  |           "http://www.w3.org/TR/html4/strict.dtd"> | 
					
						
							|  |  |  | <html> | 
					
						
							|  |  |  | <head> | 
					
						
							|  |  |  | <meta http-equiv="Content-type" content="text/html;charset=UTF-8"> | 
					
						
							| 
									
										
										
										
											2012-07-02 17:17:16 -07:00
										 |  |  | <title> {title} </title> | 
					
						
							| 
									
										
										
										
											2012-06-30 22:19:04 -07:00
										 |  |  | <style type="text/css"> | 
					
						
							| 
									
										
										
										
											2012-07-02 17:17:16 -07:00
										 |  |  | {css} | 
					
						
							| 
									
										
										
										
											2012-06-30 22:19:04 -07:00
										 |  |  | </style> | 
					
						
							|  |  |  | </head> | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  | <body> | 
					
						
							| 
									
										
										
										
											2012-07-02 17:17:16 -07:00
										 |  |  | {body} | 
					
						
							| 
									
										
										
										
											2012-06-30 22:19:04 -07:00
										 |  |  | </body> | 
					
						
							|  |  |  | </html> | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  | '''
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  | def build_html_page(classified_text, title='python', | 
					
						
							|  |  |  |                     css=default_css, html=default_html): | 
					
						
							|  |  |  |     'Create a complete HTML page with colorized source code' | 
					
						
							| 
									
										
										
										
											2012-06-30 22:19:04 -07:00
										 |  |  |     css_str = '\n'.join(['%s %s' % item for item in css.items()]) | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |     result = html_highlight(classified_text) | 
					
						
							| 
									
										
										
										
											2012-06-30 23:19:30 -07:00
										 |  |  |     title = cgi.escape(title) | 
					
						
							| 
									
										
										
										
											2012-07-02 17:17:16 -07:00
										 |  |  |     return html.format(title=title, css=css_str, body=result) | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  | #### LaTeX Output ########################################## | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-14 17:58:29 -07:00
										 |  |  | default_latex_commands = { | 
					
						
							|  |  |  |     'comment': '{\color{red}#1}', | 
					
						
							|  |  |  |     'string': '{\color{ForestGreen}#1}', | 
					
						
							|  |  |  |     'docstring': '{\emph{\color{ForestGreen}#1}}', | 
					
						
							|  |  |  |     'keyword': '{\color{orange}#1}', | 
					
						
							|  |  |  |     'builtin': '{\color{purple}#1}', | 
					
						
							|  |  |  |     'definition': '{\color{orange}#1}', | 
					
						
							|  |  |  |     'defname': '{\color{blue}#1}', | 
					
						
							|  |  |  |     'operator': '{\color{brown}#1}', | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | default_latex_document = r'''
 | 
					
						
							|  |  |  | \documentclass{article} | 
					
						
							|  |  |  | \usepackage{alltt} | 
					
						
							| 
									
										
										
										
											2012-07-14 17:58:29 -07:00
										 |  |  | \usepackage{upquote} | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  | \usepackage{color} | 
					
						
							|  |  |  | \usepackage[usenames,dvipsnames]{xcolor} | 
					
						
							|  |  |  | \usepackage[cm]{fullpage} | 
					
						
							| 
									
										
										
										
											2012-07-14 17:58:29 -07:00
										 |  |  | %(macros)s | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  | \begin{document} | 
					
						
							|  |  |  | \center{\LARGE{%(title)s}} | 
					
						
							|  |  |  | \begin{alltt} | 
					
						
							|  |  |  | %(body)s | 
					
						
							|  |  |  | \end{alltt} | 
					
						
							|  |  |  | \end{document} | 
					
						
							|  |  |  | '''
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-23 00:24:24 -05:00
										 |  |  | def alltt_escape(s): | 
					
						
							|  |  |  |     'Replace backslash and braces with their escaped equivalents' | 
					
						
							|  |  |  |     xlat = {'{': r'\{', '}': r'\}', '\\': r'\textbackslash{}'} | 
					
						
							|  |  |  |     return re.sub(r'[\\{}]', lambda mo: xlat[mo.group()], s) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | def latex_highlight(classified_text, title = 'python', | 
					
						
							| 
									
										
										
										
											2012-07-14 17:58:29 -07:00
										 |  |  |                     commands = default_latex_commands, | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  |                     document = default_latex_document): | 
					
						
							|  |  |  |     'Create a complete LaTeX document with colorized source code' | 
					
						
							| 
									
										
										
										
											2012-07-14 17:58:29 -07:00
										 |  |  |     macros = '\n'.join(r'\newcommand{\py%s}[1]{%s}' % c for c in commands.items()) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  |     result = [] | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  |     for kind, text in classified_text: | 
					
						
							|  |  |  |         if kind: | 
					
						
							| 
									
										
										
										
											2012-07-14 17:58:29 -07:00
										 |  |  |             result.append(r'\py%s{' % kind) | 
					
						
							| 
									
										
										
										
											2012-07-23 00:24:24 -05:00
										 |  |  |         result.append(alltt_escape(text)) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  |         if kind: | 
					
						
							| 
									
										
										
										
											2012-07-13 11:52:45 -07:00
										 |  |  |             result.append('}') | 
					
						
							| 
									
										
										
										
											2012-07-14 17:58:29 -07:00
										 |  |  |     return default_latex_document % dict(title=title, macros=macros, body=''.join(result)) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == '__main__': | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |     import sys, argparse, webbrowser, os, textwrap | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |     parser = argparse.ArgumentParser( | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |             description = 'Add syntax highlighting to Python source code', | 
					
						
							|  |  |  |             formatter_class=argparse.RawDescriptionHelpFormatter, | 
					
						
							|  |  |  |             epilog = textwrap.dedent('''
 | 
					
						
							|  |  |  |                 examples: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                   # Show syntax highlighted code in the terminal window | 
					
						
							|  |  |  |                   $ ./highlight.py myfile.py | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                   # Colorize myfile.py and display in a browser | 
					
						
							|  |  |  |                   $ ./highlight.py -b myfile.py | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                   # Create an HTML section to embed in an existing webpage | 
					
						
							|  |  |  |                   ./highlight.py -s myfile.py | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                   # Create a complete HTML file | 
					
						
							|  |  |  |                   $ ./highlight.py -c myfile.py > myfile.html | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |                   # Create a PDF using LaTeX | 
					
						
							|  |  |  |                   $ ./highlight.py -l myfile.py | pdflatex | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |             '''))
 | 
					
						
							| 
									
										
										
										
											2012-07-03 00:12:27 -07:00
										 |  |  |     parser.add_argument('sourcefile', metavar = 'SOURCEFILE', | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |             help = 'file containing Python sourcecode') | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  |     parser.add_argument('-b', '--browser', action = 'store_true', | 
					
						
							|  |  |  |             help = 'launch a browser to show results') | 
					
						
							| 
									
										
										
										
											2012-07-03 17:55:23 -07:00
										 |  |  |     parser.add_argument('-c', '--complete', action = 'store_true', | 
					
						
							|  |  |  |             help = 'build a complete html webpage') | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  |     parser.add_argument('-l', '--latex', action = 'store_true', | 
					
						
							|  |  |  |             help = 'build a LaTeX document') | 
					
						
							|  |  |  |     parser.add_argument('-r', '--raw', action = 'store_true', | 
					
						
							|  |  |  |             help = 'raw parse of categorized text') | 
					
						
							| 
									
										
										
										
											2012-07-03 00:12:27 -07:00
										 |  |  |     parser.add_argument('-s', '--section', action = 'store_true', | 
					
						
							|  |  |  |             help = 'show an HTML section rather than a complete webpage') | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  |     args = parser.parse_args() | 
					
						
							| 
									
										
										
										
											2012-07-03 14:11:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-03 17:55:23 -07:00
										 |  |  |     if args.section and (args.browser or args.complete): | 
					
						
							| 
									
										
										
										
											2012-07-03 00:12:27 -07:00
										 |  |  |         parser.error('The -s/--section option is incompatible with ' | 
					
						
							| 
									
										
										
										
											2012-07-03 17:55:23 -07:00
										 |  |  |                      'the -b/--browser or -c/--complete options') | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-03 00:12:27 -07:00
										 |  |  |     sourcefile = args.sourcefile | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  |     with open(sourcefile) as f: | 
					
						
							| 
									
										
										
										
											2012-07-03 14:42:33 -07:00
										 |  |  |         source = f.read() | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |     classified_text = analyze_python(source) | 
					
						
							| 
									
										
										
										
											2012-07-03 14:11:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  |     if args.raw: | 
					
						
							|  |  |  |         encoded = raw_highlight(classified_text) | 
					
						
							|  |  |  |     elif args.complete or args.browser: | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |         encoded = build_html_page(classified_text, title=sourcefile) | 
					
						
							| 
									
										
										
										
											2012-07-03 14:11:40 -07:00
										 |  |  |     elif args.section: | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |         encoded = html_highlight(classified_text) | 
					
						
							| 
									
										
										
										
											2012-07-09 23:52:08 -07:00
										 |  |  |     elif args.latex: | 
					
						
							|  |  |  |         encoded = latex_highlight(classified_text, title=sourcefile) | 
					
						
							| 
									
										
										
										
											2012-07-03 14:11:40 -07:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2012-07-08 15:42:54 -07:00
										 |  |  |         encoded = ansi_highlight(classified_text) | 
					
						
							| 
									
										
										
										
											2012-07-03 14:11:40 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  |     if args.browser: | 
					
						
							|  |  |  |         htmlfile = os.path.splitext(os.path.basename(sourcefile))[0] + '.html' | 
					
						
							|  |  |  |         with open(htmlfile, 'w') as f: | 
					
						
							| 
									
										
										
										
											2012-07-03 14:11:40 -07:00
										 |  |  |             f.write(encoded) | 
					
						
							| 
									
										
										
										
											2012-06-30 16:58:06 -07:00
										 |  |  |         webbrowser.open('file://' + os.path.abspath(htmlfile)) | 
					
						
							|  |  |  |     else: | 
					
						
							| 
									
										
										
										
											2012-07-03 14:11:40 -07:00
										 |  |  |         sys.stdout.write(encoded) |