« XML-RPC のバグとココログの告知 | トップページ | 監禁調教とバッシング »

2005年5月 9日

pyhighlight.py:Python ソースを HTML で色分け

コマンドライン・ツールなので ドラッグ・アンド・ドロップで Python プログラムにファイルを渡す の方法で使うと便利です。

以下がソースにして実行例。

# -*- coding: utf-8 -*-
u'''
pyhighlight.py

Python ソースの色分け表示 HTML 作成。
'''
import tokenize
import codecs
import keyword
from xml.sax.saxutils import escape

__author__ = 'kadotanimitsuru' __date__ = '2005-05-09' __license__ = 'public domain' __version__ = '1.0.0' _BUILTINS = dir(__builtins__)
_STYLE = {
    'definition':'color:#0000ff;',
    'builtin':'color:#900090;',
    'keyword':'color:#ff7700;',
    'STRING':'color:#00aa00;',
    'COMMENT':'color:#dd0000;',
    }
def _name(token_type, token_string, pre_token, definition):
    '''-> (name, definition)'''     name = tokenize.tok_name[token_type]     if name == 'NAME':
        if keyword.iskeyword(token_string):
            name = 'keyword'             if token_string in ('def', 'class'):
                return name, True         elif token_string in _BUILTINS and pre_token != '.':
            name = 'builtin'         elif definition:
            name = 'definition'     return name, False def _convert(file_):
    t = tokenize.generate_tokens(file_.readline)
    data = []
    old_row, old_col = (0,0)
    definition = False     pre_token = ''     for (token_type, token_string,
         (srow, scol), (erow, ecol), line) in t:
        name, definition = _name(
            token_type, token_string, pre_token, definition)
        pre_token = token_string
#        print '%3d,%2d %s\t%s' % (srow, scol, name, repr(token_string))
        token_string = escape(token_string)
        if name in _STYLE:
            token_string = u'<span style="%s">%s</span>' % (
                _STYLE[name], token_string)
        if old_row==srow:
            data.append(u' '*(scol-old_col))
        else:
            data.append(u' '*scol)
        data.append(token_string)
        old_row, old_col = erow, ecol
    return ''.join(data)
def html(filename, encoding='utf-8'):
    '''-> HTML body text'''     style = (         'overflow:auto;'         'border:2px inset silver;'         'padding:1ex;'         'line-height:125%;'         'font-size:small;'         'color:black;'         'background-color:white;' #        'font-family:Courier,monospace;' # フォントも IDLE のにするなら。         )     return u'<pre style="%s">\n%s</pre>' % (
        style,_convert(codecs.open(filename,'r',encoding)))
def make(filename, encoding='utf-8'):
    '''hoge.py -> hoge.py.html'''     h =  u'''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>%s</title>
</head>
<body>
%s
</body>
</html>'''
% (escape(filename), html(filename, encoding))
    file(filename+'.html','wb').write(h.encode('utf-8'))

if __name__=='__main__':
    import sys
    argv = sys.argv[1:]
    if argv:
        for i in argv:
            make(i)
    else:
        make('pyhighlight.py')
# 好きに流用してください。

たいへんな所はみんな Python 標準装備の tokenize モジュールがやってくれているので楽だ。(^o^;

« XML-RPC のバグとココログの告知 | トップページ | 監禁調教とバッシング »

Python」カテゴリの記事

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/68856/4056533

この記事へのトラックバック一覧です: pyhighlight.py:Python ソースを HTML で色分け:

» Python の HTML 色分け [プログラマの実態]
稀にこのブログにてPythonのソースを含んだエントリを投稿しているわけですが、 うまく色分けされてないんですよね・・・。 それもそのはず、今までPythonソース→HTMLの変換として、 c# code format を使用してました。 見てもらえれば分かるんですが、このサービスは... [続きを読む]

» [Pythonゲーム修行]google app engine のユニコードの処理に苦しんだ方への処方箋 [hikaliの開発日誌]
: \'ascii\' codec can\'t encode characters in position 6-32: ordinal not in range(128)  このエラーメッセージをみて、ハッと心を奪われた同士諸君、こんばんわ。そして、 : coercing to Unicode: need string or buffer, NoneType found  このエラーメッセージを見るたびに悪夢のリフレインに苦しむ戦士のみなさま、ようこそおいでくださった。 ... [続きを読む]

« XML-RPC のバグとココログの告知 | トップページ | 監禁調教とバッシング »

ブログ妖精

  • ココロ

Affiliate

無料ブログはココログ