All pastes #86815 Raw Edit

Miscellany

public text v1 · immutable
·published 2006-07-13 08:06 UTC
rendered paste body
# -*- coding: utf-8 -*-

from httplib import HTTPConnection
from urllib import urlencode
from BeautifulSoup import BeautifulSoup
from Tkinter import *
import re
import locale

ENCODING = locale.getdefaultlocale()[1]     # detect system default encoding

TRANS_GATE_URL = 'http://www.gojapan.com/translation/transmsg.php'
TRANS_REFERER = 'http://www.gojapan.com/translation/minitrans.html'

YOMI_GATE_URL = 'http://www.hiragana.jp/cgi-bin/trans2.cgi'
YOMI_REFERER = 'http://www.hiragana.jp/reading/query.php'

_COMMON_HEADERS = {
    'Accept'         : 'image/gif, image/x-xbitmap, image/jpeg, ' 
                       'image/pjpeg, application/vnd.ms-powerpoint, ' 
                       'application/vnd.ms-excel, application/msword, */*', 
    'Content-Type'   : 'application/x-www-form-urlencoded', 
    'Accept-Encoding': 'gzip, deflate', 
    'User-Agent'     : 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)', 
    'Cache-Control'  : 'no-cache', 
    'Connection'     : 'keep-alive', 
}

class App:
    def selectall(self, event=None):
        wz = event.widget


    def __init__(self, master):  # 생성자
        # 입력창
        frame1 = Frame(master)
        frame1.pack()
        self.scroll1 = Scrollbar(frame1)
        self.scroll1.pack(side=RIGHT, fill=Y)
        self.edit = Text(frame1, font="Arial 12", yscrollcommand=self.scroll1.set)
        self.edit.bind('<Control-a>', self.selectall)
        self.scroll1.config(command=self.edit.yview)
        self.edit.pack()

        # 기능버튼
        frame2 = Frame(master)
        frame2.pack()
        ## 번역버튼
        self.btnTranslate = Button(frame2, text=u'번역', command=self.doTranslate)
        self.btnTranslate.pack(side=LEFT)
        ## 요미가나버튼
        self.btnYomigana = Button(frame2, text=u'요미가나', command=self.doRuby)
        self.btnYomigana.pack(side=LEFT)

        # 출력창
        frame3 = Frame(master)
        frame3.pack()
        self.scroll2 = Scrollbar(frame3)
        self.scroll2.pack(side=RIGHT, fill=Y)
        self.result = Text(frame3, font="Arial 12", yscrollcommand=self.scroll2.set)
        self.result.bind('<Control-a>', self.selectall)
        self.scroll2.config(command=self.result.yview)
        self.result.pack()

    def doTranslate(self):
        src = self.edit.get(1.0,END)
        self.result.delete(1.0, END)
        self.result.insert(INSERT,translate(src))

    def doRuby(self):
        print repr(self.edit.get(1.0,END))
        src = self.edit.get(1.0,END) #.decode(ENCODING,'ignore')
        result = yomigana(src).decode('euc-jp', 'replace')
        self.result.delete(1.0, END)
        self.result.insert(INSERT, result)
        ## 요미가나에 색상입히기
        idx = 0
        ln = 0
        for line in result.splitlines():
            ln = ln + 1
            for pair in [(x.start(),x.end()) for x in re.finditer(u'\([^\)]*\)',line)]:
                idx = idx + 1
                self.result.tag_add('huri%s' % idx, '%s.%s' % (ln,pair[0]), '%s.%s' % (ln,pair[1]))
                self.result.tag_config('huri%s' % idx, foreground="red")

def translate(msg):
    result = httppost(
        TRANS_GATE_URL,
        {'data': msg.encode('utf-8')},
        {'Referer': TRANS_REFERER}
    )
    return result['content']

def yomigana(msg):
    result = httppost(
        YOMI_GATE_URL,
        {'html': '1', 'body': msg.encode('euc-jp','ignore')},
        {'Referer': YOMI_REFERER}
    )
    soup = BeautifulSoup(result['content'])
    return cleartag(''.join(map(str,soup('body')[0].contents)).replace('&lt;','<').replace('&gt;','>'))

def httppost(url, data={}, headers={}):
    protocol, host, uri = re.findall('^(https?://)([^/]+)(.*)$',url)[0]

    arr = headers.items()
    arr.extend([('Host',host)])
    arr.extend(_COMMON_HEADERS.items())
    headers = dict(arr)

    conn = HTTPConnection(host, 80)
    conn.request('POST', uri, urlencode(data), headers)
    resp = conn.getresponse()
    return {'header': dict(resp.getheaders()), 'content': resp.read()}

def cleartag(msg):
    return re.sub('<[^>]+>', '', msg.replace('<br[ /]*>','\n'))

if __name__ == '__main__':
    root = Tk()
    app = App(root)
    root.mainloop()

# vim: ts=8 sts=4 sw=4 et encoding=utf-8