import tkinter as tk import tkinter.messagebox import tkinter.simpledialog import gemini import renderEngine import urllib.parse # See https://tildegit.org/solderpunk/gemini-demo-1/src/branch/master/gemini-demo.py class Application(): def __init__(self): self.root = tk.Tk() self.nav_bar = NavBar(self) self.content = Content(self) self.root.mainloop() self.current_URL = "about:home" def updateContent(self): # Get url asked url=self.nav_bar.getURL() # Is it a Gemini URL if not(verifyURL(url)): tkinter.messagebox.showerror("URL error", url+" is not a correct Gemini URL ! (HTTP/S is not supported, please use a web browser instead)") return self.current_URL = self.nav_bar.getURL() # New request r = gemini.Request(self.current_URL) status = r.makeRequest() # The server asked for user input if status[0] == "1": user_input = tkinter.simpledialog.askstring("User input", "The server asked for " + r.meta + ".") self.nav_bar.URL_var.set(self.current_URL + "?" + user_input) self.updateContent() # If server asked for redirection elif status[0] == "3": # Ask to user confirm = tkinter.messagebox.askyesno("Server redirection", "This server ask for redirection to " + r.meta + ". Follow ?") # If he accepted if confirm: self.nav_bar.URL_var.set(r.meta) self.updateContent() # The server asked for client certificate, unsupported elif status[0] == "6": tkinter.messagebox.showerror("Client certificate required", "Error " + status + " : " + r.meta) else: self.content.setContent(r.content) def linkClick(self, url): # Check if it is an absolute URL if "://" in url: # Check if it is a gemini URL if verifyURL(url): self.nav_bar.URL_var.set(url) self.updateContent() # Else show error else: tkinter.messagebox.showerror("URL error", url+" is not a correct Gemini URL ! (HTTP/S is not supported, please use a web browser instead)") # It is relative else: # Join current URL and relative path base = self.current_URL base = base.replace("gemini://","http://") url = urllib.parse.urljoin(base, url) url = url.replace("http://", "gemini://") # We can verify because sometime there is errors (mailto:) if verifyURL(url): self.nav_bar.URL_var.set(url) self.updateContent() else: tkinter.messagebox.showerror("URL error", url+" is not a correct Gemini URL ! (HTTP/S is not supported, please use a web browser instead)") def verifyURL(url): if "://" in url: parsed_url = urllib.parse.urlparse(url) if parsed_url.scheme == "gemini": return True else: return False class NavBar(): def __init__(self, parent): self.parent = parent self.URL_var = tk.StringVar() self.root = tk.Frame(self.parent.root) self.root.grid(column=0, row=0) self.URL_bar = tk.Entry(self.root, textvariable=self.URL_var) self.URL_var.set("about:home") self.URL_bar.grid(column=0, row=0) self.go_button = tk.Button(self.root, text='Go !', command=self.parent.updateContent) self.go_button.grid(column=1, row=0) def getURL(self): return self.URL_var.get() class Content(): def __init__(self, parent): self.parent = parent self.root = renderEngine.Renderer(self.parent, "#Home page\nWelcome on tkGemini, a browser software for Gemini protocole\n=>gemini://rdelaage.ovh My gemini space") self.root.parse() self.root.content.grid(column=0, row=1) self.scroll_bar = tk.Scrollbar(command=self.root.content.yview, orient='vertical') self.scroll_bar.grid(column=1, row=1) self.root.content['yscrollcommand'] = self.scroll_bar.set def setContent(self, new_content): self.root.text = new_content self.root.parse() def linkClick(self, url): self.parent.nav_bar.URL_var = url self.parent.updateContent app = Application()