[Idle-dev] [ idlefork-Bugs-837085 ] Print colored

SourceForge.net noreply at sourceforge.net
Sat Nov 8 18:22:59 EST 2003


Bugs item #837085, was opened at 2003-11-06 01:47
Message generated for change (Comment added) made by nobody
You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=109579&aid=837085&group_id=9579

Category: None
Group: None
Status: Open
Resolution: None
Priority: 5
Submitted By: Heiko Selber (drhok)
Assigned to: Nobody/Anonymous (nobody)
Summary: Print colored

Initial Comment:
It would be nice if the syntax highlighting could be 
printed.

Currently, the print function is in black and white only, 
even on color printers.


----------------------------------------------------------------------

Comment By: Nobody/Anonymous (nobody)
Date: 2003-11-08 15:22

Message:
Logged In: NO 

I wanted to print in color too. As far as I can tell, IDLE sends the contents of your editor window to 
notepad.exe (on windows) for printing; I don't know what it does on other platforms. Notepad doesn't do 
color but I found another way.

I was reading the "Python Cookbook" and there's a recipe in there for formatting python source in colorized 
HTML.

Jürgen Hermann has made a "colorizer" for the MoinMoin project
(MoinMoin urls:
http://moin.sourceforge.net/
http://twistedmatrix.com/users/jh.twistd/moin/moin.cgi/
)

You can find the colorizer here:
http://twistedmatrix.com/users/jh.twistd/python/moin.cgi/MoinMoinColorizer

If you want to get it to give you output the same as IDLE a few small modifications are needed:

In python, all name tokens are treated the same, 'if' is a name just like any identifier, so all "names" are 
colored the same. To get output like IDLE's, you want only identifiers occuring after "class" and "def" to be 
blue.


1. We need a new token type, so add the line

_DEForCLASS = token.NT_OFFSET + 3

after

_KEYWORD       = token.NT_OFFSET + 1
_TEXT          = token.NT_OFFSET + 2

(you can use any identifier you want, it doesn't have to be 
_DEForCLASS)

2. Next, edit the '_colors' dictionary to get more IDLE-like colors and add an entry for _DEForCLASS

_colors = {
    token.NUMBER:       '#000000', #black
    token.OP:              '#000000', #black
    token.STRING:        '#008000', #green
    tokenize.COMMENT: '#ff0000', #red
    token.NAME:           '#000000', #black
    token.ERRORTOKEN: '#FF8080',
    _KEYWORD:            '#ff8c00', #dark orange
    _TEXT:                  '#000000', #black
    _DEForCLASS:         '#0000ff', #blue
}

3. We need something to keep track of the previously scanned token for each current token so we can 
know to color a token blue if it follows a 'def' or 'class' token, so add the following to the __init__ function 
of the Parser class

        self.prev_tok = ''



4. Then in the if...elif statement with the comment "# map token type to a color group" in the __call__ 
function, add a branch to check if the previous token was "def" or "class"

        # map token type to a color group
        if token.LPAR <= toktype and toktype <= token.OP:
            toktype = token.OP
        elif toktype == token.NAME and keyword.iskeyword(toktext):
            toktype = _KEYWORD

#add this branch...
        elif toktype == token.NAME and self.prev_tok in ['def', 'class']:
            toktype = _NEWDEForCLASS


#in Python 2.3 you could just say self.prev_tok in 'def class'
#it might be slightly faster, but in practice it probably won't matter


5. Last but not least, somewhere before the end of the __call__ function put the following line, to remember 
the previous token for the elif from step 4.

        self.prev_tok = toktext


There ya go! This works great and is pretty simple to use. It's not as good as just clicking a menu option 
from within IDLE, but it will let you print your python source in color. Yay!

Many thanks to Jürgen Hermann for writing and making known this useful script. I hope this helps you out.

Sincerely,
~Simon Forman
calroc at mindspring.com



BTW, if you want the background to be white (in the browser, I don't think it affects printing) make the 
following changes in the format function

 <! sys.stdout.write('<body bgColor="#ffffff"><pre><font face="Lucida,Courier New">')
 !> sys.stdout.write('<pre><font face="Lucida,Courier New">')

and

 <! sys.stdout.write('</font></pre></body>')
 !> sys.stdout.write('</font></pre>')


----------------------------------------------------------------------

Comment By: Nobody/Anonymous (nobody)
Date: 2003-11-08 15:20

Message:
Logged In: NO 

I wanted to print in color too. As far as I can tell, IDLE sends the contents of your editor window to 
notepad.exe (on windows) for printing; I don't know what it does on other platforms. Notepad doesn't do 
color but I found another way.

I was reading the "Python Cookbook" and there's a recipe in there for formatting python source in colorized 
HTML.

Jürgen Hermann has made a "colorizer" for the MoinMoin project
(MoinMoin urls:
http://moin.sourceforge.net/
http://twistedmatrix.com/users/jh.twistd/moin/moin.cgi/
)

You can find the colorizer here:
http://twistedmatrix.com/users/jh.twistd/python/moin.cgi/MoinMoinColorizer

If you want to get it to give you output the same as IDLE a few small modifications are needed:

In python, all name tokens are treated the same, 'if' is a name just like any identifier, so all "names" are 
colored the same. To get output like IDLE's, you want only identifiers occuring after "class" and "def" to be 
blue.


1. We need a new token type, so add the line

_DEForCLASS = token.NT_OFFSET + 3

after

_KEYWORD       = token.NT_OFFSET + 1
_TEXT          = token.NT_OFFSET + 2

(you can use any identifier you want, it doesn't have to be 
_DEForCLASS)

2. Next, edit the '_colors' dictionary to get more IDLE-like colors and add an entry for _DEForCLASS

_colors = {
    token.NUMBER:       '#000000', #black
    token.OP:              '#000000', #black
    token.STRING:        '#008000', #green
    tokenize.COMMENT: '#ff0000', #red
    token.NAME:           '#000000', #black
    token.ERRORTOKEN: '#FF8080',
    _KEYWORD:            '#ff8c00', #dark orange
    _TEXT:                  '#000000', #black
    _DEForCLASS:         '#0000ff', #blue
}

3. We need something to keep track of the previously scanned token for each current token so we can 
know to color a token blue if it follows a 'def' or 'class' token, so add the following to the __init__ function 
of the Parser class

        self.prev_tok = ''



4. Then in the if...elif statement with the comment "# map token type to a color group" in the __call__ 
function, add a branch to check if the previous token was "def" or "class"

        # map token type to a color group
        if token.LPAR <= toktype and toktype <= token.OP:
            toktype = token.OP
        elif toktype == token.NAME and keyword.iskeyword(toktext):
            toktype = _KEYWORD

#add this branch...
        elif toktype == token.NAME and self.prev_tok in ['def', 'class']:
            toktype = _NEWDEForCLASS


#in Python 2.3 you could just say self.prev_tok in 'def class'
#it might be slightly faster, but in practice it probably won't matter


5. Last but not least, somewhere before the end of the __call__ function put the following line, to remember 
the previous token for the elif from step 4.

        self.prev_tok = toktext


There ya go! This works great and is pretty simple to use. It's not as good as just clicking a menu option 
from within IDLE, but it will let you print your python source in color. Yay!

Many thanks to Jürgen Hermann for writing and making known this useful script. I hope this helps you out.

Sincerely,
~Simon Forman
calroc at mindspring.com



BTW, if you want the background to be white (in the browser, I don't think it affects printing) make the 
following changes in the format function

 <! sys.stdout.write('<body bgColor="#ffffff"><pre><font face="Lucida,Courier New">')
 !> sys.stdout.write('<pre><font face="Lucida,Courier New">')

and

 <! sys.stdout.write('</font></pre></body>')
 !> sys.stdout.write('</font></pre>')


----------------------------------------------------------------------

You can respond by visiting: 
https://sourceforge.net/tracker/?func=detail&atid=109579&aid=837085&group_id=9579



More information about the IDLE-dev mailing list