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