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','#bc8f8f',''), 478 TRIPLESINGLEQUOTE: ('b','#bc8f8f',''), 479 TRIPLESINGLEQUOTE_R: ('b','#bc8f8f',''), 480 TRIPLESINGLEQUOTE_U: ('b','#bc8f8f',''), 481 TRIPLEDOUBLEQUOTE: ('b','#bc8f8f',''), 482 TRIPLEDOUBLEQUOTE_R: ('b','#bc8f8f',''), 483 TRIPLEDOUBLEQUOTE_U: ('b','#bc8f8f',''), 484 PAGEBACKGROUND: '#FFFFFF' 485 } 486 487 defaultColors = dark 488 489 def Usage(): 490 """ 491 ----------------------------------------------------------------------------- 492 PySourceColor.py ver: %s 493 ----------------------------------------------------------------------------- 494 Module summary: 495 This module is designed to colorize python source code. 496 Input python source 497 Output colorized html, css, xhtml 498 Standalone: 499 This module will work from the command line with options. 500 This module will work with redirected stdio. 501 Imported: 502 This module can be imported and used directly in your code. 503 ----------------------------------------------------------------------------- 504 Command line options: 505 -h, --help 506 Optional-> Display this help message. 507 -t, --test 508 Optional-> Will ignore all others flags but --profile 509 test all schemes and markup combinations 510 -p, --profile 511 Optional-> Works only with --test or -t 512 runs profile.py and makes the test work in quiet mode. 513 -i, --in, --input 514 Use any of these for the current dir (.,cwd) 515 Input can be file or dir. 516 Input from stdin use one of the following (-,stdin) 517 If stdin is used as input stdout is output unless specified. 518 -o, --out, --output 519 Optional-> output dir for the colorized source. 520 default: output dir is the input dir. 521 To output html to stdout use one of the following (-,stdout) 522 Stdout can be used without stdin if you give a file as input. 523 -c, --color 524 Optional-> null, mono, dark, dark2, lite, idle, pythonwin, viewcvs 525 default: dark 526 -s, --show 527 Optional-> Show webpage after creation. 528 default: no show 529 -m, --markup 530 Optional-> html, css, xhtml 531 css, xhtml also support external stylesheets (-e,--external) 532 default: HTML 533 -e, --external 534 Optional-> use with css, xhtml 535 Writes an style sheet instead of embedding it in the page 536 saves it as style.css in the same directory. 537 html markup will silently ignore this flag. 538 -H, --header 539 Opional-> add a page header to the top of the output 540 -H 541 Builtin header (name,date,hrule) 542 --header 543 You must specify a filename. 544 The header file must be valid html 545 and must handle its own font colors. 546 ex. --header c:/tmp/header.txt 547 -F, --footer 548 Opional-> add a page footer to the bottom of the output 549 -F 550 Builtin footer (hrule,name,date) 551 --footer 552 You must specify a filename. 553 The footer file must be valid html 554 and must handle its own font colors. 555 ex. --footer c:/tmp/footer.txt 556 -l, --linenumbers 557 Optional-> default is no linenumbers 558 Adds line numbers to the start of each line in the code. 559 560 ----------------------------------------------------------------------------- 561 Option usage: 562 # Test and show pages 563 python PySourceColor.py -t -s 564 # Test and only show profile results 565 python PySAourceColor.py -t -p 566 # Colorize all .py,.pyw files in cwdir you can also use: (.,cwd) 567 python PySourceColor.py -i . 568 # Using long options w/ = 569 python PySourceColor.py --in=c:/myDir/my.py --color=lite --show 570 # Using short options w/out = 571 python PySourceColor.py -i c:/myDir/ -c idle -m css -e 572 # Using any mix 573 python PySourceColor.py --in . -o=c:/myDir --show 574 # Place a custom header on your files 575 python PySourceColor.py -i . -o c:/tmp -m xhtml --header c:/header.txt 576 ----------------------------------------------------------------------------- 577 Stdio usage: 578 # Stdio using no options 579 python PySourceColor.py < c:/MyFile.py >> c:/tmp/MyFile.html 580 # Using stdin alone automatically uses stdout for output: (stdin,-) 581 python PySourceColor.py -i- < c:/MyFile.py >> c:/tmp/myfile.html 582 # Stdout can also be written to directly from a file instead of stdin 583 python PySourceColor.py -i c:/MyFile.py -m css -o- >> c:/tmp/myfile.html 584 # Stdin can be used as input , but output can still be specified 585 python PySourceColor.py -i- -o c:/pydoc.py.html -s < c:/Python22/my.py 586 _____________________________________________________________________________ 587 """ 588 print Usage.__doc__% (__version__) 589 sys.exit(1) 590 591 ###################################################### Command line interface 592 593 def cli(): 594 """Handle command line args and redirections""" 595 try: 596 # try to get command line args 597 opts, args = getopt.getopt(sys.argv[1:], 598 "hseqtplHFi:o:c:m:h:f:",["help", "show", "quiet", "profile", 599 "test", "external", "linenumbers", "input=", "output=", 600 "color=", "markup=","header=", "footer="]) 601 except getopt.GetoptError: 602 # on error print help information and exit: 603 Usage() 604 # init some names 605 input = None 606 output = None 607 colorscheme = None 608 markup = 'html' 609 header = None 610 footer = None 611 linenumbers = 0 612 show = 0 613 quiet = 0 614 test = 0 615 profile = 0 616 form = None 617 # if we have args then process them 618 for o, a in opts: 619 if o in ["-h", "--help"]: 620 Usage() 621 sys.exit() 622 if o in ["-o", "--output", "--out"]: 623 output = a 624 if o in ["-i", "--input", "--in"]: 625 input = a 626 if input in [".", "cwd"]: 627 input = os.getcwd() 628 if o in ["-s", "--show"]: 629 show = 1 630 if o in ["-q", "--quiet"]: 631 quiet = 1 632 if o in ["-t", "--test"]: 633 test = 1 634 if o in ["-p", "--profile"]: 635 profile = 1 636 if o in ["-e", "--external"]: 637 form = 'external' 638 if o in ["-m", "--markup"]: 639 markup = str(a) 640 if o in ["-l", "--linenumbers"]: 641 linenumbers = 1 642 if o in ["--header"]: 643 header = str(a) 644 elif o == "-H": 645 header = '' 646 if o in ["--footer"]: 647 footer = str(a) 648 elif o == "-F": 649 footer = '' 650 if o in ["-c", "--color"]: 651 try: 652 colorscheme = globals().get(a.lower()) 653 except: 654 traceback.print_exc() 655 Usage() 656 if test: 657 if profile: 658 import profile 659 profile.run('_test(show=%s, quiet=%s)'%(show,quiet)) 660 else: 661 # Parse this script in every possible colorscheme and markup 662 _test(show,quiet) 663 elif input in [None, "-", "stdin"] or output in ["-", "stdout"]: 664 # determine if we are going to use stdio 665 if input not in [None, "-", "stdin"]: 666 if os.path.isfile(input) : 667 path2stdout(input, colors=colorscheme, markup=markup, 668 linenumbers=linenumbers, header=header, 669 footer=footer, form=form) 670 else: 671 raise PathError, 'File does not exists!' 672 else: 673 try: 674 if sys.stdin.isatty(): 675 raise InputError, 'Please check input!' 676 else: 677 if output in [None,"-","stdout"]: 678 str2stdout(sys.stdin.read(), colors=colorscheme, 679 markup=markup