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):
src = self.edit.get(1.0,END).decode(ENCODING,'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('\([^\)]*\)',line.decode(ENCODING,'ignore'), 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('<br[ /]*>','\n'))
if __name__ == '__main__':
root = Tk()
app = App(root)
root.mainloop()