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」カテゴリの記事
- from __future__ import hatsune(2008.09.15)
- Pygame1.8.1出たよ!(2008.08.02)
- それは kokoro.py と言うプログラム(2008.04.27)
- smf2txt.py ‐ SMF をテキストに(2008.04.09)
- 2007年下半期ライトノベルサイト杯結果と、同じのに投票した方々(2008.01.28)
トラックバック
この記事へのトラックバック一覧です: 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
このエラーメッセージを見るたびに悪夢のリフレインに苦しむ戦士のみなさま、ようこそおいでくださった。
... [続きを読む]