Broken project to implement a cross-protocol browser in textual
browset: Support data protocol
Zach DeCook 2023-01-14
parent 67bccc9 · commit 03c758a
-rwxr-xr-xbrowset.py11
-rw-r--r--protocol/data.py9
2 files changed, 19 insertions, 1 deletions
diff --git a/browset.py b/browset.py
index 37e04b1..292b95d 100755
--- a/browset.py
+++ b/browset.py
@@ -8,6 +8,7 @@ from mime.gemtext import Gemtext
from mime.plaintext import Plaintext
from mime.highlightedcode import HighlightedCode,mimetolexer
from protocol.gemini import GeminiProtocol
+from protocol.data import DataProtocol
class Browset(App):
url = ""
@@ -69,8 +70,16 @@ class Browset(App):
if histore:
self.history.append(self.url)
self.url = url
- (mime, fp) = GeminiProtocol.get(url)
+ protocol = url.split(":")[0]
+ if protocol == "gemini":
+ (mime, fp) = GeminiProtocol.get(url)
+ elif protocol == "data":
+ (mime, fp) = DataProtocol.get(url)
+ else:
+ (mime, fp) = ("error", ["Unsupported protocol: " + protocol])
+
self.query_one("#content").remove()
+
if "text/gemini" in mime:
content = Gemtext(fp=fp, id="content")
elif mime in mimetolexer:
diff --git a/protocol/data.py b/protocol/data.py
new file mode 100644
index 0000000..a732d14
--- /dev/null
+++ b/protocol/data.py
@@ -0,0 +1,9 @@
+from base64 import b64decode
+class DataProtocol():
+ def get(url):
+ mime = url.split(':')[1].split(',')[0].split(';')[0]
+ base64 = 'base64' in url.split(',')[0].split(';')
+ content = ','.join(url.split(',')[1:])
+ if base64:
+ content = b64decode(content)
+ return (mime or 'text/plain', [content])