Welcome, guest | Sign In | My Account | Store | Cart
#!/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()

History