# -*- coding: utf-8 -*- from httplib import HTTPConnection from urllib import urlencode from BeautifulSoup import BeautifulSoup from Tkinter import * import re 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('', 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('', 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): src = self.edit.get(1.0,END).decode('utf-8','ignore') result = yomigana(src) 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('\([^\)]*\)',unicode(line), re.UNICODE)]: 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('<','<').replace('>','>')) 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('','\n')) if __name__ == '__main__': root = Tk() app = App(root) root.mainloop()