はじめてのはてな

はてなの機能に興味が出てきたのでためしにはてなダイアリーしてみるテスト。

Python のソースも貼れるみたいなので、ためしに pyhighlight.py:Python ソースを HTML で色分け: つちのこ、のこのこ。 にて公開したソースを貼ってみます。

# -*- 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')
# 好きに流用してください。