diff --git a/main.py b/main.py index 8b1870e..8a4d453 100644 --- a/main.py +++ b/main.py @@ -3,6 +3,7 @@ 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 @@ -16,6 +17,13 @@ class Application(): 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 @@ -41,6 +49,39 @@ class Application(): 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 @@ -59,7 +100,7 @@ class NavBar(): class Content(): def __init__(self, parent): self.parent = parent - self.root = renderEngine.Renderer(self.parent.root, "#Home page\nWelcome on tkGemini, a browser software for Gemini protocole\n=>gemini://rdelaage.ovh My gemini space") + 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') @@ -70,4 +111,8 @@ class 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() diff --git a/renderEngine.py b/renderEngine.py index 10268a0..2fe31b2 100644 --- a/renderEngine.py +++ b/renderEngine.py @@ -5,7 +5,7 @@ class Renderer(): def __init__(self, parent, text): self.parent = parent self.text = text - self.content = tk.Text(self.parent) + self.content = tk.Text(self.parent.root) self.h1Font = tkFont.Font(weight="bold", size="26") self.content.tag_config("h1", font=self.h1Font) self.h2Font = tkFont.Font(weight="bold", size="20") @@ -23,8 +23,8 @@ class Renderer(): def addLink(self, text, url): index1 = str(self.currY)+'.'+str(self.currX) self.content.tag_config("link-"+index1, foreground="#00f", font=self.underlineFont) - self.content.tag_bind("link-"+index1, "", lambda event, url=url: - print(url)) + self.content.tag_bind("link-"+index1, "", lambda event, url=url, parent=self.parent: + parent.linkClick(url)) self.content.insert(index1, text+"\n") self.content.tag_add("link-"+index1, index1, str(self.currY)+'.'+str(self.currX+len(text))) self.currY+=1