#!/usr/bin/env python
# -*- coding: Latin-1 -*-
"""
PySourceColor.py
----------------------------------------------------------------------------
A python source to colorized html/css/xhtml converter.
Hacked by M.E.Farmer Jr. 2004, 2005
Python license
----------------------------------------------------------------------------
- HTML markup does not create w3c valid html, but it works on every
browser i've tried so far.(I.E.,Mozilla/Firefox,Opera,Konqueror,wxHTML).
- CSS markup is w3c validated html 4.01 strict,
but will not render correctly on all browsers.
- XHTML markup is w3c validated xhtml 1.0 strict,
like html 4.01, will not render correctly on all browsers.
----------------------------------------------------------------------------
Features:
-Three types of markup:
html (default)
css/html 4.01 strict
xhtml 1.0 strict
-Can tokenize and colorize:
12 types of strings
2 comment types
numbers
operators
brackets
math operators
class / name
def / name
decorator / name
keywords
arguments class/def/decorator
linenumbers
names
text
-Eight colorschemes built-in:
null
mono
lite (default)
dark
dark2
idle
viewcvs
pythonwin
-Header and footer
set to '' for builtin header / footer.
give path to a file containing the html
you want added as header or footer.
-Arbitrary text and html
html markup converts all to raw (TEXT token)
#@# for raw -> send raw text.
#$# for span -> inline html and text.
#%# for div -> block level html and text.
-Linenumbers
Supports all styles. New token is called LINE.
Defaults to NAME if not defined.
Style options
-ALL markups support these text styles:
b = bold
i = italic
u = underline
-CSS and XHTML has limited support for borders:
HTML markup functions will ignore these.
Optional: Border color in RGB hex
Defaults to the text forecolor.
#rrggbb = border color
Border size:
l = thick
m = medium
t = thin
Border type:
- = dashed
. = dotted
s = solid
d = double
g = groove
r = ridge
n = inset
o = outset
You can specify multiple sides,
they will all use the same style.
Optional: Default is full border.
v = bottom
< = left
> = right
^ = top
NOTE: Specify the styles you want.
The markups will ignore unsupported styles
Also note not all browsers can show these options
-All tokens default to NAME if not defined
so the only absolutely critical ones to define are:
NAME, ERRORTOKEN, PAGEBACKGROUND
----------------------------------------------------------------------------
Example usage:
----------------------------------------------------------------------------
# import
import PySourceColor as psc
psc.convert('c:/Python22/PySourceColor.py', colors=psc.idle, show=1)
----------------------------------------------------------------------------
# from module import *
from PySourceColor import *
convert('c:/Python22/Lib', colors=lite, markup="css",
header='#$#<b>This is a simpe heading</b><hr/>')
----------------------------------------------------------------------------
# How to use a custom colorscheme, and most of the 'features'
from PySourceColor import *
new = {
ERRORTOKEN: ('bui','#FF8080',''),
DECORATOR_NAME: ('s','#AACBBC',''),
DECORATOR: ('n','#333333',''),
NAME: ('t.<v','#1133AA','#DDFF22'),
NUMBER: ('','#236676','#FF5555'),
OPERATOR: ('b','#454567','#BBBB11'),
MATH_OPERATOR: ('','#935623','#423afb'),
BRACKETS: ('b','#ac34bf','#6457a5'),
COMMENT: ('t-#0022FF','#545366','#AABBFF'),
DOUBLECOMMENT: ('<l#553455','#553455','#FF00FF'),
CLASS_NAME: ('m^v-','#000000','#FFFFFF'),
DEF_NAME: ('l=<v','#897845','#000022'),
KEYWORD: ('.b','#345345','#FFFF22'),
SINGLEQUOTE: ('mn','#223344','#AADDCC'),
SINGLEQUOTE_R: ('','#344522',''),
SINGLEQUOTE_U: ('','#234234',''),
DOUBLEQUOTE: ('m#0022FF','#334421',''),
DOUBLEQUOTE_R: ('','#345345',''),
DOUBLEQUOTE_U: ('','#678673',''),
TRIPLESINGLEQUOTE: ('tv','#FFFFFF','#000000'),
TRIPLESINGLEQUOTE_R: ('tbu','#443256','#DDFFDA'),
TRIPLESINGLEQUOTE_U: ('','#423454','#DDFFDA'),
TRIPLEDOUBLEQUOTE: ('li#236fd3b<>','#000000','#FFFFFF'),
TRIPLEDOUBLEQUOTE_R: ('tub','#000000','#FFFFFF'),
TRIPLEDOUBLEQUOTE_U: ('-', '#CCAABB','#FFFAFF'),
LINE: ('ib-','#ff66aa','#7733FF'),]
TEXT: ('','#546634',''),
PAGEBACKGROUND: '#FFFAAA',
}
if __name__ == '__main__':
import sys
convert(sys.argv[1], './xhtml.html', colors=new, markup='xhtml', show=1,
linenumbers=1)
convert(sys.argv[1], './html.html', colors=new, markup='html', show=1,
linenumbers=1)
----------------------------------------------------------------------------
"""
__all__ = ['ERRORTOKEN','DECORATOR_NAME', 'DECORATOR', 'ARGS','TOKEN_NAMES',
'NAME', 'NUMBER', 'OPERATOR', 'COMMENT', 'MATH_OPERATOR',
'DOUBLECOMMENT', 'CLASS_NAME', 'DEF_NAME', 'KEYWORD', 'BRACKETS',
'SINGLEQUOTE','SINGLEQUOTE_R','SINGLEQUOTE_U','DOUBLEQUOTE',
'DOUBLEQUOTE_R', 'DOUBLEQUOTE_U', 'TRIPLESINGLEQUOTE', 'TEXT',
'TRIPLESINGLEQUOTE_R', 'TRIPLESINGLEQUOTE_U', 'TRIPLEDOUBLEQUOTE',
'TRIPLEDOUBLEQUOTE_R', 'TRIPLEDOUBLEQUOTE_U', 'PAGEBACKGROUND', 'LINE',
'null', 'mono', 'lite', 'dark','dark2', 'pythonwin','idle',
'viewcvs', 'Usage', 'cli', 'str2stdout', 'path2stdout', 'Parser',
'str2file', 'str2html', 'str2css', 'str2markup', 'path2file',
'path2html', 'convert', 'walkdir', 'defaultColors', 'showpage',
'pageconvert','tagreplace']
__title__ = 'PySourceColor'
__version__ = "2.0"
__date__ = '15 February 2005'
__author__ = "M.E.Farmer Jr."
__credits__ = '''This was originally based on a python recipe
submitted by Jürgen Hermann to ASPN. Now based on the voices in my head.
M.E.Farmer 2004, 2005
Python license
'''
import os
import sys
import time
import glob
import getopt
import keyword
import token
import tokenize
import cStringIO
import traceback
import webbrowser
# Do not edit
NAME = token.NAME
NUMBER = token.NUMBER
COMMENT = tokenize.COMMENT
OPERATOR = token.OP
ERRORTOKEN = token.ERRORTOKEN
ARGS = token.NT_OFFSET + 1
DOUBLECOMMENT = token.NT_OFFSET + 2
CLASS_NAME = token.NT_OFFSET + 3
DEF_NAME = token.NT_OFFSET + 4
KEYWORD = token.NT_OFFSET + 5
SINGLEQUOTE = token.NT_OFFSET + 6
SINGLEQUOTE_R = token.NT_OFFSET + 7
SINGLEQUOTE_U = token.NT_OFFSET + 8
DOUBLEQUOTE = token.NT_OFFSET + 9
DOUBLEQUOTE_R = token.NT_OFFSET + 10
DOUBLEQUOTE_U = token.NT_OFFSET + 11
TRIPLESINGLEQUOTE = token.NT_OFFSET + 12
TRIPLESINGLEQUOTE_R = token.NT_OFFSET + 13
TRIPLESINGLEQUOTE_U = token.NT_OFFSET + 14
TRIPLEDOUBLEQUOTE = token.NT_OFFSET + 15
TRIPLEDOUBLEQUOTE_R = token.NT_OFFSET + 16
TRIPLEDOUBLEQUOTE_U = token.NT_OFFSET + 17
PAGEBACKGROUND = token.NT_OFFSET + 18
DECORATOR = token.NT_OFFSET + 19
DECORATOR_NAME = token.NT_OFFSET + 20
BRACKETS = token.NT_OFFSET + 21
MATH_OPERATOR = token.NT_OFFSET + 22
LINE = token.NT_OFFSET + 23
TEXT = token.NT_OFFSET + 24
# markup classname lookup
MARKUPDICT = {
ERRORTOKEN: 'py_err',
DECORATOR_NAME: 'py_decn',
DECORATOR: 'py_dec',
ARGS: 'py_args',
NAME: 'py_name',
NUMBER: 'py_num',
OPERATOR: 'py_op',
COMMENT: 'py_com',
DOUBLECOMMENT: 'py_dcom',
CLASS_NAME: 'py_clsn',
DEF_NAME: 'py_defn',
KEYWORD: 'py_key',
SINGLEQUOTE: 'py_sq',
SINGLEQUOTE_R: 'py_sqr',
SINGLEQUOTE_U: 'py_squ',
DOUBLEQUOTE: 'py_dq',
DOUBLEQUOTE_R: 'py_dqr',
DOUBLEQUOTE_U: 'py_dqu',
TRIPLESINGLEQUOTE: 'py_tsq',
TRIPLESINGLEQUOTE_R: 'py_tsqr',
TRIPLESINGLEQUOTE_U: 'py_tsqu',
TRIPLEDOUBLEQUOTE: 'py_tdq',
TRIPLEDOUBLEQUOTE_R: 'py_tdqr',
TRIPLEDOUBLEQUOTE_U: 'py_tdqu',
BRACKETS: 'py_bra',
MATH_OPERATOR: 'py_mop',
LINE: 'py_line',
TEXT: 'py_text',
}
# might help users that want to create custom schemes
TOKEN_NAMES= {
'ERRORTOKEN':ERRORTOKEN,
'DECORATOR_NAME':DECORATOR_NAME,
'DECORATOR':DECORATOR,
'ARGS':ARGS,
'NAME':NAME,
'NUMBER':NUMBER,
'OPERATOR':OPERATOR,
'COMMENT':COMMENT,
'DOUBLECOMMENT':DOUBLECOMMENT,
'CLASS_NAME':CLASS_NAME,
'DEF_NAME':DEF_NAME,
'KEYWORD':KEYWORD,
'SINGLEQUOTE':SINGLEQUOTE,
'SINGLEQUOTE_R':SINGLEQUOTE_R,
'SINGLEQUOTE_U':SINGLEQUOTE_U,
'DOUBLEQUOTE':DOUBLEQUOTE,
'DOUBLEQUOTE_R':DOUBLEQUOTE_R,
'DOUBLEQUOTE_U':DOUBLEQUOTE_U,
'TRIPLESINGLEQUOTE':TRIPLESINGLEQUOTE,
'TRIPLESINGLEQUOTE_R':TRIPLESINGLEQUOTE_R,
'TRIPLESINGLEQUOTE_U':TRIPLESINGLEQUOTE_U,
'TRIPLEDOUBLEQUOTE':TRIPLEDOUBLEQUOTE,
'TRIPLEDOUBLEQUOTE_R':TRIPLEDOUBLEQUOTE_R,
'TRIPLEDOUBLEQUOTE_U':TRIPLEDOUBLEQUOTE_U,
'BRACKETS':BRACKETS,
'MATH_OPERATOR':MATH_OPERATOR,
'LINE':LINE,
'TEXT':TEXT,
'PAGEBACKGROUND':PAGEBACKGROUND,
}
######################################################################
# Edit colors and styles to taste
# Create your own scheme, just copy one below , rename and edit.
# Custom styles must at least define NAME, ERRORTOKEN, PAGEBACKGROUND,
# all missing elements will default to NAME.
# See module docstring for details on style attributes.
######################################################################
# Copy null and use it as a starter colorscheme.
null = {# tokentype: ('tags border_color', 'textforecolor', 'textbackcolor')
ERRORTOKEN: ('','#000000',''),# Error token
DECORATOR_NAME: ('','#000000',''),# Decorator name
DECORATOR: ('','#000000',''),# @ symbol
ARGS: ('','#000000',''),# class,def,deco arguments
NAME: ('','#000000',''<