1  #!/usr/bin/env python
    2  # -*- coding: Latin-1 -*-
    3  """
    4   PySourceColor.py
    5  ----------------------------------------------------------------------------
    6   A python source to colorized html/css/xhtml converter.
    7   Hacked by M.E.Farmer Jr. 2004, 2005
    8   Python license
    9  ----------------------------------------------------------------------------
   10   - HTML markup does not create w3c valid html, but it works on every
   11     browser i've tried so far.(I.E.,Mozilla/Firefox,Opera,Konqueror,wxHTML).
   12   - CSS markup is w3c validated html 4.01 strict,
   13     but will not render correctly on all browsers.
   14   - XHTML markup is w3c validated xhtml 1.0 strict,
   15     like html 4.01, will not render correctly on all browsers.
   16  ----------------------------------------------------------------------------
   17   Features:
   18   -Three types of markup:
   19      html (default) 
   20      css/html 4.01 strict
   21      xhtml 1.0 strict
   22  
   23   -Can tokenize and colorize:
   24      12 types of strings
   25      2 comment types
   26      numbers
   27      operators
   28      brackets
   29      math operators
   30      class / name
   31      def / name
   32      decorator / name
   33      keywords
   34      arguments class/def/decorator
   35      linenumbers
   36      names
   37      text
   38  
   39   -Eight colorschemes built-in:
   40      null
   41      mono
   42      lite (default)
   43      dark 
   44      dark2
   45      idle
   46      viewcvs
   47      pythonwin
   48  
   49   -Header and footer
   50      set to '' for builtin header / footer.
   51      give path to a file containing the html
   52          you want added as header or footer.
   53  
   54   -Arbitrary text and html
   55      html markup converts all to raw (TEXT token)
   56      #@# for raw -> send raw text.
   57      #$# for span -> inline html and text.
   58      #%# for div -> block level html and text.
   59  
   60   -Linenumbers
   61      Supports all styles. New token is called LINE.
   62      Defaults to NAME if not defined.
   63  
   64   Style options
   65   -ALL markups support these text styles:
   66           b = bold
   67           i = italic
   68           u = underline
   69   -CSS and XHTML has limited support  for borders:
   70       HTML markup functions will ignore these.
   71       Optional: Border color in RGB hex
   72       Defaults to the text forecolor.
   73           #rrggbb = border color
   74       Border size:
   75           l = thick
   76           m = medium
   77           t = thin
   78       Border type:
   79           - = dashed
   80           . = dotted
   81           s = solid
   82           d = double
   83           g = groove
   84           r = ridge
   85           n = inset
   86           o = outset
   87       You can specify multiple sides,
   88       they will all use the same style.
   89       Optional: Default is full border.
   90           v = bottom
   91           < = left
   92           > = right
   93           ^ = top
   94       NOTE: Specify the styles you want.
   95             The markups will ignore unsupported styles
   96             Also note not all browsers can show these options
   97  
   98   -All tokens default to NAME if not defined
   99       so the only absolutely critical ones to define are:
  100       NAME, ERRORTOKEN, PAGEBACKGROUND
  101  
  102  ----------------------------------------------------------------------------
  103   Example usage:
  104  ----------------------------------------------------------------------------
  105   # import
  106   import PySourceColor as psc
  107   psc.convert('c:/Python22/PySourceColor.py', colors=psc.idle, show=1)
  108  ----------------------------------------------------------------------------
  109   # from module import *
  110   from PySourceColor import *
  111   convert('c:/Python22/Lib', colors=lite, markup="css",
  112            header='#$#<b>This is a simpe heading</b><hr/>')
  113  ----------------------------------------------------------------------------
  114   # How to use a custom colorscheme, and most of the 'features'
  115   from PySourceColor import *
  116   new = {
  117     ERRORTOKEN:             ('bui','#FF8080',''),
  118     DECORATOR_NAME:         ('s','#AACBBC',''),
  119     DECORATOR:              ('n','#333333',''),
  120     NAME:                   ('t.<v','#1133AA','#DDFF22'),
  121     NUMBER:                 ('','#236676','#FF5555'),
  122     OPERATOR:               ('b','#454567','#BBBB11'),
  123     MATH_OPERATOR:          ('','#935623','#423afb'),
  124     BRACKETS:               ('b','#ac34bf','#6457a5'),
  125     COMMENT:                ('t-#0022FF','#545366','#AABBFF'),
  126     DOUBLECOMMENT:          ('<l#553455','#553455','#FF00FF'),
  127     CLASS_NAME:             ('m^v-','#000000','#FFFFFF'),
  128     DEF_NAME:               ('l=<v','#897845','#000022'),
  129     KEYWORD:                ('.b','#345345','#FFFF22'),
  130     SINGLEQUOTE:            ('mn','#223344','#AADDCC'),
  131     SINGLEQUOTE_R:          ('','#344522',''),
  132     SINGLEQUOTE_U:          ('','#234234',''),
  133     DOUBLEQUOTE:            ('m#0022FF','#334421',''),
  134     DOUBLEQUOTE_R:          ('','#345345',''),
  135     DOUBLEQUOTE_U:          ('','#678673',''),
  136     TRIPLESINGLEQUOTE:      ('tv','#FFFFFF','#000000'),
  137     TRIPLESINGLEQUOTE_R:    ('tbu','#443256','#DDFFDA'),
  138     TRIPLESINGLEQUOTE_U:    ('','#423454','#DDFFDA'),
  139     TRIPLEDOUBLEQUOTE:      ('li#236fd3b<>','#000000','#FFFFFF'),
  140     TRIPLEDOUBLEQUOTE_R:    ('tub','#000000','#FFFFFF'),
  141     TRIPLEDOUBLEQUOTE_U:    ('-', '#CCAABB','#FFFAFF'),
  142     LINE:                   ('ib-','#ff66aa','#7733FF'),]
  143     TEXT:                   ('','#546634',''), 
  144     PAGEBACKGROUND:         '#FFFAAA',
  145       }
  146   if __name__ == '__main__':
  147       import sys
  148       convert(sys.argv[1], './xhtml.html', colors=new, markup='xhtml', show=1,
  149               linenumbers=1)
  150       convert(sys.argv[1], './html.html', colors=new, markup='html', show=1,
  151               linenumbers=1)
  152  ----------------------------------------------------------------------------
  153  """
  154 
  155  __all__ = ['ERRORTOKEN','DECORATOR_NAME', 'DECORATOR', 'ARGS','TOKEN_NAMES',
  156         'NAME', 'NUMBER', 'OPERATOR', 'COMMENT', 'MATH_OPERATOR',
  157         'DOUBLECOMMENT', 'CLASS_NAME', 'DEF_NAME', 'KEYWORD', 'BRACKETS',
  158         'SINGLEQUOTE','SINGLEQUOTE_R','SINGLEQUOTE_U','DOUBLEQUOTE',
  159         'DOUBLEQUOTE_R', 'DOUBLEQUOTE_U', 'TRIPLESINGLEQUOTE', 'TEXT',
  160         'TRIPLESINGLEQUOTE_R', 'TRIPLESINGLEQUOTE_U', 'TRIPLEDOUBLEQUOTE',
  161         'TRIPLEDOUBLEQUOTE_R', 'TRIPLEDOUBLEQUOTE_U', 'PAGEBACKGROUND', 'LINE',
  162         'null', 'mono', 'lite', 'dark','dark2', 'pythonwin','idle',
  163         'viewcvs', 'Usage', 'cli', 'str2stdout', 'path2stdout', 'Parser',
  164         'str2file', 'str2html', 'str2css', 'str2markup', 'path2file',
  165         'path2html', 'convert', 'walkdir', 'defaultColors', 'showpage',
  166         'pageconvert','tagreplace']
  167  __title__ = 'PySourceColor'
  168  __version__ = "2.0"
  169  __date__ = '15 February 2005'
  170  __author__ = "M.E.Farmer Jr."
  171  __credits__ = '''This was originally based on a python recipe
  172  submitted by Jürgen Hermann to ASPN. Now based on the voices in my head.
  173  M.E.Farmer 2004, 2005
  174  Python license
  175  '''
  176  import os
  177  import sys
  178  import time
  179  import glob
  180  import getopt
  181  import keyword
  182  import token
  183  import tokenize
  184  import cStringIO
  185  import traceback
  186  import webbrowser
  187 
  188  # Do not edit
  189  NAME = token.NAME
  190  NUMBER = token.NUMBER
  191  COMMENT = tokenize.COMMENT
  192  OPERATOR = token.OP
  193  ERRORTOKEN = token.ERRORTOKEN
  194  ARGS = token.NT_OFFSET + 1
  195  DOUBLECOMMENT = token.NT_OFFSET + 2
  196  CLASS_NAME = token.NT_OFFSET + 3
  197  DEF_NAME = token.NT_OFFSET + 4
  198  KEYWORD = token.NT_OFFSET + 5
  199  SINGLEQUOTE = token.NT_OFFSET + 6
  200  SINGLEQUOTE_R = token.NT_OFFSET + 7
  201  SINGLEQUOTE_U = token.NT_OFFSET + 8
  202  DOUBLEQUOTE = token.NT_OFFSET + 9
  203  DOUBLEQUOTE_R = token.NT_OFFSET + 10
  204  DOUBLEQUOTE_U = token.NT_OFFSET + 11
  205  TRIPLESINGLEQUOTE = token.NT_OFFSET + 12
  206  TRIPLESINGLEQUOTE_R = token.NT_OFFSET + 13
  207  TRIPLESINGLEQUOTE_U = token.NT_OFFSET + 14
  208  TRIPLEDOUBLEQUOTE = token.NT_OFFSET + 15
  209  TRIPLEDOUBLEQUOTE_R = token.NT_OFFSET + 16
  210  TRIPLEDOUBLEQUOTE_U = token.NT_OFFSET + 17
  211  PAGEBACKGROUND = token.NT_OFFSET + 18
  212  DECORATOR = token.NT_OFFSET + 19
  213  DECORATOR_NAME = token.NT_OFFSET + 20
  214  BRACKETS = token.NT_OFFSET + 21
  215  MATH_OPERATOR = token.NT_OFFSET + 22
  216  LINE = token.NT_OFFSET + 23
  217  TEXT = token.NT_OFFSET + 24
  218  # markup classname lookup
  219  MARKUPDICT = {
  220          ERRORTOKEN:             'py_err',
  221          DECORATOR_NAME:         'py_decn',
  222          DECORATOR:              'py_dec',
  223          ARGS:                   'py_args',
  224          NAME:                   'py_name',
  225          NUMBER:                 'py_num',
  226          OPERATOR:               'py_op',
  227          COMMENT:                'py_com',
  228          DOUBLECOMMENT:          'py_dcom',
  229          CLASS_NAME:             'py_clsn',
  230          DEF_NAME:               'py_defn',
  231          KEYWORD:                'py_key',
  232          SINGLEQUOTE:            'py_sq',
  233          SINGLEQUOTE_R:          'py_sqr',
  234          SINGLEQUOTE_U:          'py_squ',
  235          DOUBLEQUOTE:            'py_dq',
  236          DOUBLEQUOTE_R:          'py_dqr',
  237          DOUBLEQUOTE_U:          'py_dqu',
  238          TRIPLESINGLEQUOTE:      'py_tsq',
  239          TRIPLESINGLEQUOTE_R:    'py_tsqr',
  240          TRIPLESINGLEQUOTE_U:    'py_tsqu',
  241          TRIPLEDOUBLEQUOTE:      'py_tdq',
  242          TRIPLEDOUBLEQUOTE_R:    'py_tdqr',
  243          TRIPLEDOUBLEQUOTE_U:    'py_tdqu',
  244          BRACKETS:               'py_bra',
  245          MATH_OPERATOR:          'py_mop',
  246          LINE:                   'py_line',
  247          TEXT:                   'py_text',
  248          }
  249  # might help users that want to create custom schemes
  250  TOKEN_NAMES= {
  251         'ERRORTOKEN':ERRORTOKEN,
  252         'DECORATOR_NAME':DECORATOR_NAME,
  253         'DECORATOR':DECORATOR,
  254         'ARGS':ARGS,
  255         'NAME':NAME,
  256         'NUMBER':NUMBER,
  257         'OPERATOR':OPERATOR,
  258         'COMMENT':COMMENT,
  259         'DOUBLECOMMENT':DOUBLECOMMENT,
  260         'CLASS_NAME':CLASS_NAME,
  261         'DEF_NAME':DEF_NAME,
  262         'KEYWORD':KEYWORD,
  263         'SINGLEQUOTE':SINGLEQUOTE,
  264         'SINGLEQUOTE_R':SINGLEQUOTE_R,
  265         'SINGLEQUOTE_U':SINGLEQUOTE_U,
  266         'DOUBLEQUOTE':DOUBLEQUOTE,
  267         'DOUBLEQUOTE_R':DOUBLEQUOTE_R,
  268         'DOUBLEQUOTE_U':DOUBLEQUOTE_U,
  269         'TRIPLESINGLEQUOTE':TRIPLESINGLEQUOTE,
  270         'TRIPLESINGLEQUOTE_R':TRIPLESINGLEQUOTE_R,
  271         'TRIPLESINGLEQUOTE_U':TRIPLESINGLEQUOTE_U,
  272         'TRIPLEDOUBLEQUOTE':TRIPLEDOUBLEQUOTE,
  273         'TRIPLEDOUBLEQUOTE_R':TRIPLEDOUBLEQUOTE_R,
  274         'TRIPLEDOUBLEQUOTE_U':TRIPLEDOUBLEQUOTE_U,
  275         'BRACKETS':BRACKETS,
  276         'MATH_OPERATOR':MATH_OPERATOR,
  277         'LINE':LINE,
  278         'TEXT':TEXT,
  279         'PAGEBACKGROUND':PAGEBACKGROUND,
  280         }
  281 
  282  ######################################################################
  283  # Edit colors and styles to taste
  284  # Create your own scheme, just copy one below , rename and edit.
  285  # Custom styles must at least define NAME, ERRORTOKEN, PAGEBACKGROUND,
  286  # all missing elements will default to NAME.
  287  # See module docstring for details on style attributes.
  288  ######################################################################
  289  # Copy null and use it as a starter colorscheme.
  290  null = {# tokentype: ('tags border_color', 'textforecolor', 'textbackcolor')
  291          ERRORTOKEN:             ('','#000000',''),# Error token
  292          DECORATOR_NAME:         ('','#000000',''),# Decorator name
  293          DECORATOR:              ('','#000000',''),# @ symbol
  294          ARGS:                   ('','#000000',''),# class,def,deco arguments
  295          NAME:                   ('','#000000',''),# All other text
  296          NUMBER:                 ('','#000000',''),# 0->10
  297          OPERATOR:               ('','#000000',''),# ':','`',';',',','.','='
  298          MATH_OPERATOR:          ('','#000000',''),# '+','-','==','!=','*',etc
  299          BRACKETS:               ('','#000000',''),# '[',']','(',')','{','}'
  300          COMMENT:                ('','#000000',''),# Single comment
  301          DOUBLECOMMENT:          ('','#000000',''),## Double comment
  302          CLASS_NAME:             ('','#000000',''),# Class name
  303          DEF_NAME:               ('','#000000',''),# Def name
  304          KEYWORD:                ('','#000000',''),# Python keywords
  305          SINGLEQUOTE:            ('','#000000',''),# 'SINGLEQUOTE'
  306          SINGLEQUOTE_R:          ('','#000000',''),# r'SINGLEQUOTE'
  307          SINGLEQUOTE_U:          ('','#000000',''),# u'SINGLEQUOTE'
  308          DOUBLEQUOTE:            ('','#000000',''),# "DOUBLEQUOTE"
  309          DOUBLEQUOTE_R:          ('','#000000',''),# r"DOUBLEQUOTE"
  310          DOUBLEQUOTE_U:          ('','#000000',''),# u"DOUBLEQUOTE"
  311          TRIPLESINGLEQUOTE:      ('','#000000',''),# '''TRIPLESINGLEQUOTE'''
  312          TRIPLESINGLEQUOTE_R:    ('','#000000',''),# r'''TRIPLESINGLEQUOTE'''
  313          TRIPLESINGLEQUOTE_U:    ('','#000000',''),# u'''TRIPLESINGLEQUOTE'''
  314          TRIPLEDOUBLEQUOTE:      ('','#000000',''),# """TRIPLEDOUBLEQUOTE"""
  315          TRIPLEDOUBLEQUOTE_R:    ('','#000000',''),# r"""TRIPLEDOUBLEQUOTE"""
  316          TRIPLEDOUBLEQUOTE_U:    ('','#000000',''),# u"""TRIPLEDOUBLEQUOTE"""
  317          TEXT:                   ('','#000000',''),# non python text 
  318          LINE:                   ('>ti#555555','#000000',''),# Linenumbers
  319          PAGEBACKGROUND:         '#FFFFFF'# set the page background
  320          }
  321 
  322  mono = {
  323          ERRORTOKEN:             ('s#FF0000','#FF8080',''),
  324          DECORATOR_NAME:         ('bu','#000000',''),
  325          DECORATOR:              ('b','#000000',''),
  326          ARGS:                   ('b','#000000',''),
  327          NAME:                   ('','#000000',''),
  328          NUMBER:                 ('b','#000000',''),
  329          OPERATOR:               ('b','#000000',''),
  330          MATH_OPERATOR:          ('b','#000000',''),
  331          BRACKETS:               ('b','#000000',''),
  332          COMMENT:                ('i','#000000',''),
  333          DOUBLECOMMENT:          ('b','#000000',''),
  334          CLASS_NAME:             ('bu','#000000',''),
  335          DEF_NAME:               ('b','#000000',''),
  336          KEYWORD:                ('b','#000000',''),
  337          SINGLEQUOTE:            ('','#000000',''),
  338          SINGLEQUOTE_R:          ('','#000000',''),
  339          SINGLEQUOTE_U:          ('','#000000',''),
  340          DOUBLEQUOTE:            ('','#000000',''),
  341          DOUBLEQUOTE_R:          ('','#000000',''),
  342          DOUBLEQUOTE_U:          ('','#000000',''),
  343          TRIPLESINGLEQUOTE:      ('','#000000',''),
  344          TRIPLESINGLEQUOTE_R:    ('','#000000',''),
  345          TRIPLESINGLEQUOTE_U:    ('','#000000',''),
  346          TRIPLEDOUBLEQUOTE:      ('i','#000000',''),
  347          TRIPLEDOUBLEQUOTE_R:    ('i','#000000',''),
  348          TRIPLEDOUBLEQUOTE_U:    ('i','#000000',''),
  349          TEXT:                   ('','#000000',''),
  350          LINE:                   ('>ti#555555','#000000',''),
  351          PAGEBACKGROUND:         '#FFFFFF'
  352          }
  353 
  354  dark = {
  355          ERRORTOKEN:             ('s#FF0000','#FF8080',''),
  356          DECORATOR_NAME:         ('b','#FFBBAA',''),
  357          DECORATOR:              ('b','#CC5511',''),
  358          ARGS:                   ('b','#CCCCEE',''),
  359          NAME:                   ('','#DDDDDD',''),
  360          NUMBER:                 ('','#FF0000',''),
  361          OPERATOR:               ('b','#FAF785',''),
  362          MATH_OPERATOR:          ('b','#FAF785',''),
  363          BRACKETS:               ('b','#FAF785',''),
  364          COMMENT:                ('','#45FCA0',''),
  365          DOUBLECOMMENT:          ('i','#A7C7A9',''),
  366          CLASS_NAME:             ('b','#B666FD',''),
  367          DEF_NAME:               ('b','#EBAE5C',''),
  368          KEYWORD:                ('b','#8680FF',''),
  369          SINGLEQUOTE:            ('','#F8BAFE',''),
  370          SINGLEQUOTE_R:          ('','#F8BAFE',''),
  371          SINGLEQUOTE_U:          ('','#F8BAFE',''),
  372          DOUBLEQUOTE:            ('','#FF80C0',''),
  373          DOUBLEQUOTE_R:          ('','#FF80C0',''),
  374          DOUBLEQUOTE_U:          ('','#FF80C0',''),
  375          TRIPLESINGLEQUOTE:      ('','#FF9595',''),
  376          TRIPLESINGLEQUOTE_R:    ('','#FF9595',''),
  377          TRIPLESINGLEQUOTE_U:    ('','#FF9595',''),
  378          TRIPLEDOUBLEQUOTE:      ('','#B3FFFF',''),
  379          TRIPLEDOUBLEQUOTE_R:    ('','#B3FFFF',''),
  380          TRIPLEDOUBLEQUOTE_U:    ('','#B3FFFF',''),
  381          TEXT:                   ('','#FFFFFF',''),
  382          LINE:                   ('>mi#555555','#bbccbb','#333333'),
  383          PAGEBACKGROUND:         '#000000'
  384          }
  385 
  386  dark2 = {
  387          ERRORTOKEN:             ('','#FF0000',''),
  388          DECORATOR_NAME:         ('b','#FFBBAA',''),
  389          DECORATOR:              ('b','#CC5511',''),
  390          ARGS:                   ('b','#EEEEEE',''),
  391          NAME:                   ('','#C0C0C0',''),
  392          NUMBER:                 ('b','#00FF00',''),
  393          OPERATOR:               ('b','#FF090F',''),
  394          MATH_OPERATOR:          ('b','#F07040',''),
  395          BRACKETS:               ('b','#FFB90F',''),
  396          COMMENT:                ('i','#D0D000','#522000'),#622000
  397          DOUBLECOMMENT:          ('i','#D0D000','#522000'),
  398          CLASS_NAME:             ('b','#EE4080',''),
  399          DEF_NAME:               ('b','#FF8040',''),
  400          KEYWORD:                ('b','#4726E1',''),
  401          SINGLEQUOTE:            ('','#8080C0',''),
  402          SINGLEQUOTE_R:          ('','#8080C0',''),
  403          SINGLEQUOTE_U:          ('','#8080C0',''),
  404          DOUBLEQUOTE:            ('','#ADB9F1',''),
  405          DOUBLEQUOTE_R:          ('','#ADB9F1',''),
  406          DOUBLEQUOTE_U:          ('','#ADB9F1',''),
  407          TRIPLESINGLEQUOTE:      ('','#00C1C1',''),
  408          TRIPLESINGLEQUOTE_R:    ('','#00C1C1',''),
  409          TRIPLESINGLEQUOTE_U:    ('','#00C1C1',''),
  410          TRIPLEDOUBLEQUOTE:      ('','#33E3E3',''),
  411          TRIPLEDOUBLEQUOTE_R:    ('','#33E3E3',''),
  412          TRIPLEDOUBLEQUOTE_U:    ('','#33E3E3',''),
  413          TEXT:                   ('','#C0C0C0',''),
  414          LINE:                   ('>mi#555555','#bbccbb','#333333'),
  415          PAGEBACKGROUND:         '#000000'
  416          }
  417 
  418  lite = {
  419          ERRORTOKEN:             ('s#FF0000','#FF8080',''),
  420          DECORATOR_NAME:         ('b','#BB4422',''),
  421          DECORATOR:              ('b','#3333AF',''),
  422          ARGS:                   ('b','#000000',''),
  423          NAME:                   ('','#333333',''),
  424          NUMBER:                 ('b','#DD2200',''),
  425          OPERATOR:               ('b','#000000',''),
  426          MATH_OPERATOR:          ('b','#000000',''),
  427          BRACKETS:               ('b','#000000',''),
  428          COMMENT:                ('','#007F00',''),
  429          DOUBLECOMMENT:          ('','#608060',''),
  430          CLASS_NAME:             ('b','#0000FF',''),
  431          DEF_NAME:               ('b','#9C7A00',''),#f09030
  432          KEYWORD:                ('b','#0000AF',''),
  433          SINGLEQUOTE:            ('','#600080',''),
  434          SINGLEQUOTE_R:          ('','#600080',''),
  435          SINGLEQUOTE_U:          ('','#600080',''),
  436          DOUBLEQUOTE:            ('','#A0008A',''),
  437          DOUBLEQUOTE_R:          ('','#A0008A',''),
  438          DOUBLEQUOTE_U:          ('','#A0008A',''),
  439          TRIPLESINGLEQUOTE:      ('','#337799',''),
  440          TRIPLESINGLEQUOTE_R:    ('','#337799',''),
  441          TRIPLESINGLEQUOTE_U:    ('','#337799',''),
  442          TRIPLEDOUBLEQUOTE:      ('','#1166AA',''),
  443          TRIPLEDOUBLEQUOTE_R:    ('','#1166AA',''),
  444          TRIPLEDOUBLEQUOTE_U:    ('','#1166AA',''),
  445          TEXT:                   ('','#000000',''),
  446          LINE:                   ('>ti#555555','#000000',''),
  447          PAGEBACKGROUND:         '#FFFFFF'
  448          }
  449 
  450  idle = {
  451          ERRORTOKEN:             ('s#FF0000','#FF8080',''),
  452          DECORATOR_NAME:         ('','#900090',''),
  453          DECORATOR:              ('','#000000',''),
  454          NAME:                   ('','#000000',''),
  455          NUMBER:                 ('','#000000',''),
  456          OPERATOR:               ('','#000000',''),
  457          MATH_OPERATOR:          ('','#000000',''),
  458          BRACKETS:               ('','#000000',''),
  459          COMMENT:                ('','#DD0000',''),
  460          DOUBLECOMMENT:          ('','#DD0000',''),
  461          CLASS_NAME:             ('','#0000FF',''),
  462          DEF_NAME:               ('','#0000FF',''),
  463          KEYWORD:                ('','#FF7700',''),
  464          SINGLEQUOTE:            ('','#00AA00',''),
  465          SINGLEQUOTE_R:          ('','#00AA00',''),
  466          SINGLEQUOTE_U:          ('','#00AA00',''),
  467          DOUBLEQUOTE:            ('','#00AA00',''),
  468          DOUBLEQUOTE_R:          ('','#00AA00',''),
  469          DOUBLEQUOTE_U:          ('','#00AA00',''),
  470          TRIPLESINGLEQUOTE:      ('','#00AA00',''),
  471          TRIPLESINGLEQUOTE_R:    ('','#00AA00',''),
  472          TRIPLESINGLEQUOTE_U:    ('','#00AA00',''),
  473          TRIPLEDOUBLEQUOTE:      ('','#00AA00',''),
  474          TRIPLEDOUBLEQUOTE_R:    ('','#00AA00',''),
  475          TRIPLEDOUBLEQUOTE_U:    ('','#00AA00',''),
  476          TEXT:                   ('','#000000',''),
  477          LINE:                   ('>ti#555555','#000000',''),
  478          PAGEBACKGROUND:         '#FFFFFF'
  479          }
  480 
  481  pythonwin = {
  482          ERRORTOKEN:             ('s#FF0000','#FF8080',''),
  483          DECORATOR_NAME:         ('b','#303030',''),
  484          DECORATOR:              ('b','#DD0080',''),
  485          ARGS:                   ('','#000000',''),
  486          NAME:                   ('','#303030',''),
  487          NUMBER:                 ('','#008080',''),
  488          OPERATOR:               ('','#000000',''),
  489          MATH_OPERATOR:          ('','#000000',''),
  490          BRACKETS:               ('','#000000',''),
  491          COMMENT:                ('','#007F00',''),
  492          DOUBLECOMMENT:          ('','#7F7F7F',''),
  493          CLASS_NAME:             ('b','#0000FF',''),
  494          DEF_NAME:               ('b','#007F7F',''),
  495          KEYWORD:                ('b','#000080',''),
  496          SINGLEQUOTE:            ('','#808000',''),
  497          SINGLEQUOTE_R:          ('','#808000',''),
  498          SINGLEQUOTE_U:          ('','#808000',''),
  499          DOUBLEQUOTE:            ('','#808000',''),
  500          DOUBLEQUOTE_R:          ('','#808000',''),
  501          DOUBLEQUOTE_U:          ('','#808000',''),
  502          TRIPLESINGLEQUOTE:      ('','#808000',''),
  503          TRIPLESINGLEQUOTE_R:    ('','#808000',''),
  504          TRIPLESINGLEQUOTE_U:    ('','#808000',''),
  505          TRIPLEDOUBLEQUOTE:      ('','#808000',''),
  506          TRIPLEDOUBLEQUOTE_R:    ('','#808000',''),
  507          TRIPLEDOUBLEQUOTE_U:    ('','#808000',''),
  508          TEXT:                   ('','#303030',''),
  509          LINE:                   ('>ti#555555','#000000',''),
  510          PAGEBACKGROUND:         '#FFFFFF'
  511          }
  512 
  513  viewcvs = {
  514          ERRORTOKEN:             ('s#FF0000','#FF8080',''),
  515          DECORATOR_NAME:         ('','#000000',''),
  516          DECORATOR:              ('','#000000',''),
  517          ARGS:                   ('','#000000',''),
  518          NAME:                   ('','#000000',''),
  519          NUMBER:                 ('','#000000',''),
  520          OPERATOR:               ('','#000000',''),
  521          MATH_OPERATOR:          ('','#000000',''),
  522          BRACKETS:               ('','#000000',''),
  523          COMMENT:                ('i','#b22222',''),
  524          DOUBLECOMMENT:          ('i','#b22222',''),
  525          CLASS_NAME:             ('','#000000',''),
  526          DEF_NAME:               ('b','#0000ff',''),
  527          KEYWORD:                ('b','#a020f0',''),
  528          SINGLEQUOTE:            ('b','#bc8f8f',''),
  529          SINGLEQUOTE_R:          ('b','#bc8f8f',''),
  530          SINGLEQUOTE_U:          ('b','#bc8f8f',''),
  531          DOUBLEQUOTE:            ('b','#bc8f8f',''),
  532          DOUBLEQUOTE_R:          ('b','#bc8f8f',''),
  533          DOUBLEQUOTE_U:          ('b','#bc8f8f',''),
  534          TRIPLESINGLEQUOTE:      ('b','#bc8f8f',''),
  535          TRIPLESINGLEQUOTE_R:    ('b','#bc8f8f',''),
  536          TRIPLESINGLEQUOTE_U:    ('b','#bc8f8f',''),
  537          TRIPLEDOUBLEQUOTE:      ('b','#bc8f8f',''),
  538          TRIPLEDOUBLEQUOTE_R:    ('b','#bc8f8f',''),
  539          TRIPLEDOUBLEQUOTE_U:    ('b','#bc8f8f',''),
  540          TEXT:                   ('','#000000',''),
  541          LINE:                   ('>ti#555555','#000000',''),
  542          PAGEBACKGROUND:         '#FFFFFF'
  543          }
  544 
  545  defaultColors = lite
  546 
  547  def Usage():
  548      """
  549   -----------------------------------------------------------------------------
  550    PySourceColor.py ver: %s
  551   -----------------------------------------------------------------------------
  552    Module summary:
  553       This module is designed to colorize python source code.
  554           Input--->python source
  555           Output-->colorized (html, html4.01/css, xhtml1.0)
  556       Standalone:
  557           This module will work from the command line with options.
  558           This module will work with redirected stdio.
  559       Imported:
  560           This module can be imported and used directly in your code.
  561   -----------------------------------------------------------------------------
  562    Command line options:
  563       -h, --help
  564           Optional-> Display this help message.
  565       -t, --test
  566           Optional-> Will ignore all others flags but  --profile
  567               test all schemes and markup combinations
  568       -p, --profile
  569           Optional-> Works only with --test or -t
  570               runs profile.py and makes the test work in quiet mode.
  571       -i, --in, --input
  572           Optional-> If you give input on stdin.
  573           Use any of these for the current dir (.,cwd)
  574           Input can be file or dir.
  575           Input from stdin use one of the following (-,stdin)
  576           If stdin is used as input stdout is output unless specified.
  577       -o, --out, --output
  578           Optional-> output dir for the colorized source.
  579               default: output dir is the input dir.
  580           To output html to stdout use one of the following (-,stdout)
  581           Stdout can be used without stdin if you give a file as input.
  582       -c, --color
  583           Optional-> null, mono, dark, dark2, lite, idle, pythonwin, viewcvs
  584               default: dark 
  585       -s, --show
  586           Optional-> Show page after creation.
  587               default: no show
  588       -m, --markup
  589           Optional-> html, css, xhtml
  590               css, xhtml also support external stylesheets (-e,--external)
  591               default: HTML
  592       -e, --external
  593           Optional-> use with css, xhtml
  594               Writes an style sheet instead of embedding it in the page
  595               saves it as pystyle.css in the same directory.
  596               html markup will silently ignore this flag.
  597       -H, --header
  598           Opional-> add a page header to the top of the output
  599           -H
  600               Builtin header (name,date,hrule)
  601           --header
  602               You must specify a filename.
  603               The header file must be valid html
  604               and must handle its own font colors.
  605               ex. --header c:/tmp/header.txt
  606       -F, --footer
  607           Opional-> add a page footer to the bottom of the output
  608           -F 
  609               Builtin footer (hrule,name,date)
  610           --footer
  611               You must specify a filename.
  612               The foote