#!/usr/bin/torify /usr/bin/python import Tkinter import tkFont import requests from requests_file import FileAdapter import html2text class TkDND(object): def __init__(self, master): master.tk.eval('package require tkdnd') self.master = master self.tk = master.tk self._subst_format = ('%A', '%a', '%b', '%D', '%d', '%m', '%T', '%W', '%X', '%Y', '%x', '%y') self._subst_format_str = " ".join(self._subst_format) def bindtarget(self, window, callback, dndtype, event='<Drop>', priority=50): cmd = self._prepare_tkdnd_func(callback) return self.tk.call('dnd', 'bindtarget', window, dndtype, event, cmd, priority) def _prepare_tkdnd_func(self, callback): funcid = self.master.register(callback, self._dndsubstitute) cmd = ('%s %s' % (funcid, self._subst_format_str)) return cmd def _dndsubstitute(self, *args): if len(args) != len(self._subst_format): return args def try_int(x): x = str(x) try: return int(x) except ValueError: return x A, a, b, D, d, m, T, W, X, Y, x, y = args event = Tkinter.Event() event.action = A # Current action of the drag and drop operation. event.action_list = a # Action list supported by the drag source. event.mouse_button = b # Mouse button pressed during the drag and drop. event.data = D # The data that has been dropped. event.descr = d # The list of descriptions. event.modifier = m # The list of modifier keyboard keys pressed. event.dndtype = T event.widget = self.master.nametowidget(W) event.x_root = X # Mouse pointer x coord, relative to the root win. event.y_root = Y event.x = x # Mouse pointer x coord, relative to the widget. event.y = y event.action_list = str(event.action_list).split() for name in ('mouse_button', 'x', 'y', 'x_root', 'y_root'): setattr(event, name, try_int(getattr(event, name))) return (event, ) def handle(event): event.widget.delete(0,Tkinter.END) url = event.data.strip() event.widget.insert(0,url) textwindow(url) def convert65536(s): #convert out-of-range characters res = [] for c in s: k = ord(c) if k < 65536: res.append(c) else: res.append("{"+str(k)+"?}") return "".join(res) def gethtml(link): user_agent = "Mozilla/5.0 (Windows NT 6.1; rv:38.0) Gecko/20100101 Firefox/38.0" headers={'user-agent':user_agent} s = requests.Session() s.mount('file://', FileAdapter()) r = s.get(link,headers=headers) return r def textwindow(url): title = url h = html2text.HTML2Text() h.ignore_links = True h.ignore_images = True s = gethtml(url).text s = h.handle(s) s = h.unescape(s) text = convert65536(s) top = Tkinter.Toplevel() top.geometry("+200+100") top.title(title) top.bind("<Escape>", lambda _ : top.destroy()) S = Tkinter.Scrollbar(top) customFont = tkFont.Font(family="Arial", size=16) T = Tkinter.Text(top,height=20,width=78,font=customFont,bg="lightgrey") S.pack(side=Tkinter.RIGHT,fill=Tkinter.Y) T.pack(side=Tkinter.LEFT,fill=Tkinter.Y) S.config(command=T.yview) T.config(yscrollcommand=S.set) T.insert(Tkinter.END,text) def main(): root = Tkinter.Tk() root.geometry("950x32+200+32") root.title('markdown') dnd = TkDND(root) customFont = tkFont.Font(family="Arial", size=14) entry = Tkinter.Entry(font=customFont,bg="lightgrey") entry.pack(expand=1,fill='both') dnd.bindtarget(entry,handle,'text/plain') root.mainloop() if __name__=="__main__": main()