Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

Pythonのソースをカラー表示

tokenizeモジュールを使ってpython組み込み関数に色をつけてみました。

    • -

colorizesource.py

import sys
import keyword
import token, tokenize

filename = sys.argv[0]
if len(sys.argv) > 1:
    filename = sys.argv[1]

token_colors = {
    token.NUMBER:       '#0080C0',
    token.OP:           '#0000C0',
    token.STRING:       '#004080',
    tokenize.COMMENT:   '#008000',
    token.NAME:         '#A00000',
    token.ERRORTOKEN:   '#FF8080',
    }

# parse source
source = [line.rstrip("\n") for line in open(filename).readlines()]
pos, row = 0, 1
for t in tokenize.generate_tokens(open(filename).readline):
    tok_type, tok_text, (st_row, st_col), (ed_row, ed_col), line = t

    if tok_type in token_colors:
        if tok_type == token.NAME and keyword.iskeyword(tok_text) == False:
            continue
        if row != st_row:
            pos, row = 0, st_row
        st_col += pos
        ed_col += pos
        st_tag = '<font color="%s">' % token_colors[tok_type]
        ed_tag = '</font>'
        source[row-1] = source[row-1][:st_col] + \
                        st_tag + tok_text.rstrip("\n") + ed_tag + \
                        source[row-1][ed_col:]
        pos += len(st_tag + ed_tag)

# print colored source
print "<pre>"
for l in source:
    print l
print "</pre>"

colorizesource.py test.py > test.htmlとかすると

# md5 checker
import sys, md5
print md5.new(open(sys.argv[1], "rb").read()).hexdigest()

これが↑こんな感じに。。。↓


# md5 checker
import sys, md5
print md5.new(open(sys.argv[1], "rb").read()).hexdigest()
うぅっ・・・、かえって見づらい、、、おまけにはてなキーワード自動リンクが、、、

既知の問題点:

  1. 行をまたがったコメントなどのカラーリングを考慮してない
  2. コード中に含まれるhtmlのエスケープ処理をしてない
    • -

2006.12.14追記
スーパーpre記法 シンタックス・ハイライトが実装された。
http://d.hatena.ne.jp/hatenadiary/20061215