1 #!/usr/bin/env python
2 # -*- coding: Latin-1 -*-
3 """
4 #############################################################################
5 # PySourceColor.py
6 #############################################################################
7 # A python source to colorized html/css/xhtml converter.
8 # Hacked by M.E.Farmer Jr. 2004
9 # Python license
10 #############################################################################
11 # Now supports:
12 # - HTML markup does not create w3c valid html, but it works on every
13 # browser i've tried so far.(I.E.,Mozilla/Firefox,Opera,Konqueror,wxHTML).
14 # - CSS markup is w3c validated html 4.01 strict,
15 # but will not render correctly on all browsers.
16 # - XHTML markup is w3c validated xhtml 1.0 strict,
17 # like html 4.01, will not render correctly on all browsers.
18 #############################################################################
19 # Features:
20 # -Three types of markup:
21 # html (default)
22 # css/html 4.01 strict
23 # xhtml 1.0 strict
24 #
25 # -Can tokenize and colorize:
26 # 12 types of strings
27 # 2 comment types
28 # numbers
29 # operators
30 # brackets
31 # math operators
32 # class / name
33 # def / name
34 # decorator / name
35 # keywords
36 # arguments class/def/decorator
37 # text
38 # linenumbers
39 #
40 # -Eight colorschemes built-in:
41 # null
42 # mono
43 # dark (default)
44 # dark2
45 # lite
46 # idle
47 # viewcvs
48 # pythonwin
49 #
50 # -Header and footer
51 # set to '' for builtin header / footer
52 # or give path to a file containing the html
53 # you want added as header and footer
54 #
55 # -Linenumbers
56 # Supports all styles. New token is called LINE.
57 # Defaults to NAME if not defined
58 #
59 # Style options
60 # -ALL markups support these text styles:
61 # b = bold
62 # i = italic
63 # u = underline
64 # -CSS and XHTML has limited support for borders:
65 # HTML markup functions will ignore these.
66 # Optional: Border color in RGB hex
67 # Defaults to the text forecolor.
68 # #rrggbb = border color
69 # Optional: specify one type only
70 # - = dashed
71 # . = dotted
72 # s = solid
73 # d = double
74 # g = groove
75 # r = ridge
76 # n = inset
77 # o = outset
78 # You can specify multiple sides,
79 # they will all use the same style.
80 # Optional: Default is full border.
81 # v = bottom
82 # < = left
83 # > = right
84 # ^ = top
85 # NOTE: Specify the styles you want.
86 # The markups will ignore unsupported styles
87 # Also note not all browsers can show these options
88 #
89 # -All tokens default to NAME if not defined
90 # so the only absolutely critical ones to define are:
91 # NAME, ERRORTOKEN, PAGEBACKGROUND
92 #
93 #############################################################################
94 # Example usage:
95 #############################################################################
96 # # import
97 # import PySourceColor as psc
98 # psc.convert('c:/Python22/PySourceColor.py', colors=psc.idle, show=1)
99 #----------------------------------------------------------------------------
100 # # from module import *
101 # from PySourceColor import *
102 # convert('c:/Python22/Lib', colors=lite, markup="css", header='')
103 #----------------------------------------------------------------------------
104 # # How to use a custom colorscheme, and most of the 'features'
105 # from PySourceColor import *
106 # new = {
107 # ERRORTOKEN: ('bui','#FF8080',''),
108 # DECORATOR_NAME: ('s','#AACBBC',''),
109 # DECORATOR: ('n','#333333',''),
110 # NAME: ('t.<v','#1133AA','#DDFF22'),
111 # NUMBER: ('','#236676','#FF5555'),
112 # OPERATOR: ('b','#454567','#BBBB11'),
113 # MATH_OPERATOR: ('','#935623','#423afb'),
114 # BRACKETS: ('b','#ac34bf','#6457a5'),
115 # COMMENT: ('t-#0022FF','#545366','#AABBFF'),
116 # DOUBLECOMMENT: ('<l#553455','#553455','#FF00FF'),
117 # CLASS_NAME: ('m^v-','#000000','#FFFFFF'),
118 # DEF_NAME: ('l=<v','#897845','#000022'),
119 # KEYWORD: ('.b','#345345','#FFFF22'),
120 # SINGLEQUOTE: ('mn','#223344','#AADDCC'),
121 # SINGLEQUOTE_R: ('','#344522',''),
122 # SINGLEQUOTE_U: ('','#234234',''),
123 # DOUBLEQUOTE: ('m#0022FF','#334421',''),
124 # DOUBLEQUOTE_R: ('','#345345',''),
125 # DOUBLEQUOTE_U: ('','#678673',''),
126 # TRIPLESINGLEQUOTE: ('tv','#FFFFFF','#000000'),
127 # TRIPLESINGLEQUOTE_R: ('tbu','#443256','#DDFFDA'),
128 # TRIPLESINGLEQUOTE_U: ('','#423454','#DDFFDA'),
129 # TRIPLEDOUBLEQUOTE: ('li#236fd3b<>','#000000','#FFFFFF'),
130 # TRIPLEDOUBLEQUOTE_R: ('tub','#000000','#FFFFFF'),
131 # TRIPLEDOUBLEQUOTE_U: ('-', '#CCAABB','#FFFAFF'),
132 # LINE: ('ib-','#ff66aa','#7733FF'),
133 # PAGEBACKGROUND: '#FFFAAA',
134 # }
135 # if __name__ == '__main__':
136 # import sys
137 # convert(sys.argv[1], './css.html',colors=new, markup='xhtml', show=1,
138 # linenumbers=1)
139 # convert(sys.argv[1], './html.html',colors=new, markup='html', show=1,
140 # linenumbers=1)
141 #############################################################################
142 """
143
144 __all__ = ['ERRORTOKEN','DECORATOR_NAME', 'DECORATOR', 'ARGS',
145 'NAME', 'NUMBER', 'OPERATOR', 'COMMENT', 'MATH_OPERATOR',
146 'DOUBLECOMMENT', 'CLASS_NAME', 'DEF_NAME', 'KEYWORD', 'BRACKETS',
147 'SINGLEQUOTE','SINGLEQUOTE_R','SINGLEQUOTE_U','DOUBLEQUOTE',
148 'DOUBLEQUOTE_R', 'DOUBLEQUOTE_U', 'TRIPLESINGLEQUOTE',
149 'TRIPLESINGLEQUOTE_R', 'TRIPLESINGLEQUOTE_U', 'TRIPLEDOUBLEQUOTE',
150 'TRIPLEDOUBLEQUOTE_R', 'TRIPLEDOUBLEQUOTE_U', 'PAGEBACKGROUND', 'LINE',
151 'null', 'mono', 'lite', 'dark','dark2', 'pythonwin','idle',
152 'viewcvs', 'Usage', 'cli', 'str2stdout', 'path2stdout', 'Parser',
153 'str2file', 'str2html', 'str2css', 'path2file', 'path2html',
154 'convert', 'walkdir', 'defaultColors', 'showpage']
155 __title__ = 'PySourceColor'
156 __version__ = "1.9.97"
157 __date__ = '17 December 2004'
158 __author__ = "M.E.Farmer Jr."
159 __credits__ = '''This was originally based on a python recipe
160 submitted by Jürgen Hermann to ASPN. Now based on the voices in my head.
161 M.E.Farmer 2004
162 Python license
163 '''
164 import os
165 import cgi
166 import sys
167 import time
168 import glob
169 import getopt
170 import keyword
171 import token
172 import tokenize
173 import cStringIO
174 import traceback
175 import webbrowser
176
177 # Do not edit
178 NAME = token.NAME
179 NUMBER = token.NUMBER
180 COMMENT = tokenize.COMMENT
181 OPERATOR = token.OP
182 ERRORTOKEN = token.ERRORTOKEN
183 ARGS = token.NT_OFFSET + 1
184 DOUBLECOMMENT = token.NT_OFFSET + 2
185 CLASS_NAME = token.NT_OFFSET + 3
186 DEF_NAME = token.NT_OFFSET + 4
187 KEYWORD = token.NT_OFFSET + 5
188 SINGLEQUOTE = token.NT_OFFSET + 6
189 SINGLEQUOTE_R = token.NT_OFFSET + 7
190 SINGLEQUOTE_U = token.NT_OFFSET + 8
191 DOUBLEQUOTE = token.NT_OFFSET + 9
192 DOUBLEQUOTE_R = token.NT_OFFSET + 10
193 DOUBLEQUOTE_U = token.NT_OFFSET + 11
194 TRIPLESINGLEQUOTE = token.NT_OFFSET + 12
195 TRIPLESINGLEQUOTE_R = token.NT_OFFSET + 13
196 TRIPLESINGLEQUOTE_U = token.NT_OFFSET + 14
197 TRIPLEDOUBLEQUOTE = token.NT_OFFSET + 15
198 TRIPLEDOUBLEQUOTE_R = token.NT_OFFSET + 16
199 TRIPLEDOUBLEQUOTE_U = token.NT_OFFSET + 17
200 PAGEBACKGROUND = token.NT_OFFSET + 18
201 DECORATOR = token.NT_OFFSET + 19
202 DECORATOR_NAME = token.NT_OFFSET + 20
203 BRACKETS = token.NT_OFFSET + 21
204 MATH_OPERATOR = token.NT_OFFSET + 22
205 LINE = token.NT_OFFSET + 23
206
207 # Do not edit (markup classname lookup)
208 MARKUPDICT = {
209 ERRORTOKEN: 'err',
210 DECORATOR_NAME: 'decn',
211 DECORATOR: 'dec',
212 ARGS: 'args',
213 NAME: 'name',
214 NUMBER: 'num',
215 OPERATOR: 'op',
216 COMMENT: 'com',
217 DOUBLECOMMENT: 'dcom',
218 CLASS_NAME: 'clsn',
219 DEF_NAME: 'defn',
220 KEYWORD: 'key',
221 SINGLEQUOTE: 'sq',
222 SINGLEQUOTE_R: 'sqr',
223 SINGLEQUOTE_U: 'squ',
224 DOUBLEQUOTE: 'dq',
225 DOUBLEQUOTE_R: 'dqr',
226 DOUBLEQUOTE_U: 'dqu',
227 TRIPLESINGLEQUOTE: 'tsq',
228 TRIPLESINGLEQUOTE_R: 'tsqr',
229 TRIPLESINGLEQUOTE_U: 'tsqu',
230 TRIPLEDOUBLEQUOTE: 'tdq',
231 TRIPLEDOUBLEQUOTE_R: 'tdqr',
232 TRIPLEDOUBLEQUOTE_U: 'tdqu',
233 BRACKETS: 'bra',
234 MATH_OPERATOR: 'mop',
235 LINE: 'line'
236 }
237
238 ######################################################################
239 # Edit colors and styles to taste
240 # Create your own scheme, just copy one below , rename and edit.
241 # Custom styles must at least define NAME, ERRORTOKEN, PAGEBACKGROUND,
242 # all missing elements will default to NAME.
243 # See module docstring for details on style attributes.
244 ######################################################################
245 # Copy null and use it as a starter colorscheme.
246 null = {# tokentype: ('tags border_color', 'textforecolor', 'textbackcolor')
247 ERRORTOKEN: ('','#FF8080',''),# Error token
248 DECORATOR_NAME: ('','#000000',''),# Decorator name
249 DECORATOR: ('','#000000',''),# @ symbol
250 ARGS: ('','#000000',''),# class,def,deco arguments
251 NAME: ('','#000000',''),# All other text
252 NUMBER: ('','#000000',''),# 0->10
253 OPERATOR: ('','#000000',''),# ':','`',';',',','.','='
254 MATH_OPERATOR: ('','#000000',''),# '+','-','==','!=','*',etc
255 BRACKETS: ('','#000000',''),# '[',']','(',')','{','}'
256 COMMENT: ('','#000000',''),# Single comment
257 DOUBLECOMMENT: ('','#000000',''),## Double comment
258 CLASS_NAME: ('','#000000',''),# Class name
259 DEF_NAME: ('','#000000',''),# Def name
260 KEYWORD: ('','#000000',''),# Python keywords
261 SINGLEQUOTE: ('','#000000',''),# 'SINGLEQUOTE'
262 SINGLEQUOTE_R: ('','#000000',''),# r'SINGLEQUOTE'
263 SINGLEQUOTE_U: ('','#000000',''),# u'SINGLEQUOTE'
264 DOUBLEQUOTE: ('','#000000',''),# "DOUBLEQUOTE"
265 DOUBLEQUOTE_R: ('','#000000',''),# r"DOUBLEQUOTE"
266 DOUBLEQUOTE_U: ('','#000000',''),# u"DOUBLEQUOTE"
267 TRIPLESINGLEQUOTE: ('','#000000',''),# '''TRIPLESINGLEQUOTE'''
268 TRIPLESINGLEQUOTE_R: ('','#000000',''),# r'''TRIPLESINGLEQUOTE'''
269 TRIPLESINGLEQUOTE_U: ('','#000000',''),# u'''TRIPLESINGLEQUOTE'''
270 TRIPLEDOUBLEQUOTE: ('','#000000',''),# """TRIPLEDOUBLEQUOTE"""
271 TRIPLEDOUBLEQUOTE_R: ('','#000000',''),# r"""TRIPLEDOUBLEQUOTE"""
272 TRIPLEDOUBLEQUOTE_U: ('','#000000',''),# u"""TRIPLEDOUBLEQUOTE"""
273 PAGEBACKGROUND: '#FFFFFF'# set the page background
274 }
275
276 mono = {
277 ERRORTOKEN: ('','#FF8080',''),
278 DECORATOR_NAME: ('bu','#000000',''),
279 DECORATOR: ('b','#000000',''),
280 ARGS: ('b','#000000',''),
281 NAME: ('','#000000',''),
282 NUMBER: ('b','#000000',''),
283 OPERATOR: ('b','#000000',''),
284 MATH_OPERATOR: ('b','#000000',''),
285 BRACKETS: ('b','#000000',''),
286 COMMENT: ('i','#000000',''),
287 DOUBLECOMMENT: ('b','#000000',''),
288 CLASS_NAME: ('bu','#000000',''),
289 DEF_NAME: ('b','#000000',''),
290 KEYWORD: ('b','#000000',''),
291 SINGLEQUOTE: ('','#000000',''),
292 SINGLEQUOTE_R: ('','#000000',''),
293 SINGLEQUOTE_U: ('','#000000',''),
294 DOUBLEQUOTE: ('','#000000',''),
295 DOUBLEQUOTE_R: ('','#000000',''),
296 DOUBLEQUOTE_U: ('','#000000',''),
297 TRIPLESINGLEQUOTE: ('','#000000',''),
298 TRIPLESINGLEQUOTE_R: ('','#000000',''),
299 TRIPLESINGLEQUOTE_U: ('','#000000',''),
300 TRIPLEDOUBLEQUOTE: ('i','#000000',''),
301 TRIPLEDOUBLEQUOTE_R: ('i','#000000',''),
302 TRIPLEDOUBLEQUOTE_U: ('i','#000000',''),
303 PAGEBACKGROUND: '#FFFFFF'
304 }
305
306 dark = {
307 ERRORTOKEN: ('','#FF0000',''),
308 DECORATOR_NAME: ('b','#FFBBAA',''),
309 DECORATOR: ('b','#CC5511',''),
310 ARGS: ('b','#CCCCEE',''),
311 NAME: ('','#FFFFFF',''),
312 NUMBER: ('','#FF0000',''),
313 OPERATOR: ('b','#FAF785',''),
314 MATH_OPERATOR: ('b','#FAF785',''),
315 BRACKETS: ('b','#FAF785',''),
316 COMMENT: ('','#45FCA0',''),
317 DOUBLECOMMENT: ('i','#A7C7A9',''),
318 CLASS_NAME: ('b','#B599FD',''),
319 DEF_NAME: ('b','#EBAE5C',''),
320 KEYWORD: ('b','#8680FF',''),
321 SINGLEQUOTE: ('','#F8BAFE',''),
322 SINGLEQUOTE_R: ('','#F8BAFE',''),
323 SINGLEQUOTE_U: ('','#F8BAFE',''),
324 DOUBLEQUOTE: ('','#FF80C0',''),
325 DOUBLEQUOTE_R: ('','#FF80C0',''),
326 DOUBLEQUOTE_U: ('','#FF80C0',''),
327 TRIPLESINGLEQUOTE: ('','#FF9595',''),
328 TRIPLESINGLEQUOTE_R: ('','#FF9595',''),
329 TRIPLESINGLEQUOTE_U: ('','#FF9595',''),
330 TRIPLEDOUBLEQUOTE: ('','#B3FFFF',''),
331 TRIPLEDOUBLEQUOTE_R: ('','#B3FFFF',''),
332 TRIPLEDOUBLEQUOTE_U: ('','#B3FFFF',''),
333 LINE: ('>mi#555555','#bbccbb','#333333'),
334 PAGEBACKGROUND: '#000000'
335 }
336
337 dark2 = {
338 ERRORTOKEN: ('','#FF0000',''),
339 DECORATOR_NAME: ('b','#FFBBAA',''),
340 DECORATOR: ('b','#CC5511',''),
341 ARGS: ('b','#EEEEEE',''),
342 NAME: ('','#C0C0C0',''),
343 NUMBER: ('b','#00FF00',''),
344 OPERATOR: ('b','#FF090F',''),
345 MATH_OPERATOR: ('b','#F07040',''),
346 BRACKETS: ('b','#FFB90F',''),
347 COMMENT: ('i','#D0D709','#622000'),
348 DOUBLECOMMENT: ('i','#D0D709','#622000'),
349 CLASS_NAME: ('','#7E58C7',''),
350 DEF_NAME: ('b','#FF8040',''),
351 KEYWORD: ('b','#4726E1',''),
352 SINGLEQUOTE: ('','#8080C0',''),
353 SINGLEQUOTE_R: ('','#8080C0',''),
354 SINGLEQUOTE_U: ('','#8080C0',''),
355 DOUBLEQUOTE: ('','#ADB9F1',''),
356 DOUBLEQUOTE_R: ('','#ADB9F1',''),
357 DOUBLEQUOTE_U: ('','#ADB9F1',''),
358 TRIPLESINGLEQUOTE: ('','#00C1C1',''),
359 TRIPLESINGLEQUOTE_R: ('','#00C1C1',''),
360 TRIPLESINGLEQUOTE_U: ('','#00C1C1',''),
361 TRIPLEDOUBLEQUOTE: ('','#33e3e3',''),
362 TRIPLEDOUBLEQUOTE_R: ('','#33e3e3',''),
363 TRIPLEDOUBLEQUOTE_U: ('','#33e3e3',''),
364 LINE: ('>mi#555555','#bbccbb','#333333'),
365 PAGEBACKGROUND: '#000000'
366 }
367
368 lite = {
369 ERRORTOKEN: ('','#FF8080',''),
370 DECORATOR_NAME: ('b','#BB4422',''),
371 DECORATOR: ('b','#3333af',''),
372 ARGS: ('b','#000000',''),
373 NAME: ('','#000000',''),
374 NUMBER: ('','#FF2200',''),
375 OPERATOR: ('b','#303000',''),
376 MATH_OPERATOR: ('b','#303000',''),
377 BRACKETS: ('b','#303000',''),
378 COMMENT: ('','#007F00',''),
379 DOUBLECOMMENT: ('','#606060',''),
380 CLASS_NAME: ('','#0000FF',''),
381 DEF_NAME: ('b','#9C7A00',''),
382 KEYWORD: ('b','#0000AF',''),
383 SINGLEQUOTE: ('','#600080',''),
384 SINGLEQUOTE_R: ('','#600080',''),
385 SINGLEQUOTE_U: ('','#600080',''),
386 DOUBLEQUOTE: ('','#A0008A',''),
387 DOUBLEQUOTE_R: ('','#A0008A',''),
388 DOUBLEQUOTE_U: ('','#A0008A',''),
389 TRIPLESINGLEQUOTE: ('','#337799',''),
390 TRIPLESINGLEQUOTE_R: ('','#337799',''),
391 TRIPLESINGLEQUOTE_U: ('','#337799',''),
392 TRIPLEDOUBLEQUOTE: ('','#1166AA',''),
393 TRIPLEDOUBLEQUOTE_R: ('','#1166AA',''),
394 TRIPLEDOUBLEQUOTE_U: ('','#1166AA',''),
395 PAGEBACKGROUND: '#FFFFFF'
396 }
397
398 idle = {
399 ERRORTOKEN: ('','#FF8080',''),
400 DECORATOR_NAME: ('','#900090',''),
401 DECORATOR: ('','#000000',''),
402 NAME: ('','#000000',''),
403 NUMBER: ('','#000000',''),
404 OPERATOR: ('','#000000',''),
405 MATH_OPERATOR: ('','#000000',''),
406 BRACKETS: ('','#000000',''),
407 COMMENT: ('','#DD0000',''),
408 DOUBLECOMMENT: ('','#DD0000',''),
409 CLASS_NAME: ('','#0000FF',''),
410 DEF_NAME: ('','#0000FF',''),
411 KEYWORD: ('','#FF7700',''),
412 SINGLEQUOTE: ('','#00AA00',''),
413 SINGLEQUOTE_R: ('','#00AA00',''),
414 SINGLEQUOTE_U: ('','#00AA00',''),
415 DOUBLEQUOTE: ('','#00AA00',''),
416 DOUBLEQUOTE_R: ('','#00AA00',''),
417 DOUBLEQUOTE_U: ('','#00AA00',''),
418 TRIPLESINGLEQUOTE: ('','#00AA00',''),
419 TRIPLESINGLEQUOTE_R: ('','#00AA00',''),
420 TRIPLESINGLEQUOTE_U: ('','#00AA00',''),
421 TRIPLEDOUBLEQUOTE: ('','#00AA00',''),
422 TRIPLEDOUBLEQUOTE_R: ('','#00AA00',''),
423 TRIPLEDOUBLEQUOTE_U: ('','#00AA00',''),
424 PAGEBACKGROUND: '#FFFFFF'
425 }
426
427 pythonwin = {
428 ERRORTOKEN: ('','#FF8080',''),
429 DECORATOR_NAME: ('b','#303030',''),
430 DECORATOR: ('b','#DD0080',''),
431 ARGS: ('','#000000',''),
432 NAME: ('','#303030',''),
433 NUMBER: ('','#008080',''),
434 OPERATOR: ('','#000000',''),
435 MATH_OPERATOR: ('','#000000',''),
436 BRACKETS: ('','#000000',''),
437 COMMENT: ('','#007F00',''),
438 DOUBLECOMMENT: ('','#7F7F7F',''),
439 CLASS_NAME: ('b','#0000FF',''),
440 DEF_NAME: ('b','#007F7F',''),
441 KEYWORD: ('b','#000080',''),
442 SINGLEQUOTE: ('','#808000',''),
443 SINGLEQUOTE_R: ('','#808000',''),
444 SINGLEQUOTE_U: ('','#808000',''),
445 DOUBLEQUOTE: ('','#808000',''),
446 DOUBLEQUOTE_R: ('','#808000',''),
447 DOUBLEQUOTE_U: ('','#808000',''),
448 TRIPLESINGLEQUOTE: ('','#808000',''),
449 TRIPLESINGLEQUOTE_R: ('','#808000',''),
450 TRIPLESINGLEQUOTE_U: ('','#808000',''),
451 TRIPLEDOUBLEQUOTE: ('','#808000',''),
452 TRIPLEDOUBLEQUOTE_R: ('','#808000',''),
453 TRIPLEDOUBLEQUOTE_U: ('','#808000',''),
454 PAGEBACKGROUND: '#FFFFFF'
455 }
456
457 viewcvs = {
458 ERRORTOKEN: ('b','#FF8080',''),
459 DECORATOR_NAME: ('','#000000',''),
460 DECORATOR: ('','#000000',''),
461 ARGS: ('','#000000',''),
462 NAME: ('','#000000',''),
463 NUMBER: ('','#000000',''),
464 OPERATOR: ('','#000000',''),
465 MATH_OPERATOR: ('','#000000',''),
466 BRACKETS: ('','#000000',''),
467 COMMENT: ('i','#b22222',''),
468 DOUBLECOMMENT: ('i','#b22222',''),
469 CLASS_NAME: ('','#000000',''),
470 DEF_NAME: ('b','#0000ff',''),
471 KEYWORD: ('b','#a020f0',''),
472 SINGLEQUOTE: ('b','#bc8f8f',''),
473 SINGLEQUOTE_R: ('b','#bc8f8f',''),
474 SINGLEQUOTE_U: ('b','#bc8f8f',''),
475 DOUBLEQUOTE: ('b','#bc8f8f',''),
476 DOUBLEQUOTE_R: ('b','#bc8f8f',''),
477 DOUBLEQUOTE_U: ('b'<