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
import codecs
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)
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(u'huri%s' % idx, u'%s.%s' % (ln,pair[0]), u'%s.%s' % (ln,pair[1]))
self.result.tag_config(u'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 decodeany(s):
if type(s) is unicode:
return s
encodings = ['mbcs', 'euc-jp', 'cp949', 'cp932']
# conservative trial
for enc in encodings:
try:
return s.decode(enc)
except:
pass
# promiscuous trial
result = []
def errorcounter(exc):
errorcounter.count += 1
return u'', exc.end
codecs.register_error('errorcounter', errorcounter)
for enc in encodings:
errorcounter.count = 0
r = s.decode(enc, 'errorcounter')
result.append((errorcounter.count, r))
result.sort()
return result[0][1]
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()
# vim: ts=8 sts=4 sw=4 et encoding=utf-8