Broken project to implement a cross-protocol browser in textual
mime: Support plaintext format as well
Zach DeCook 2023-01-14
parent d236dd9 · commit 74c1b89
-rw-r--r--.gitignore1
-rwxr-xr-xbrowset.py9
-rw-r--r--mime/gemtext.py (renamed from gemtext.py)3
-rw-r--r--mime/plaintext.py16
4 files changed, 26 insertions, 3 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bee8a64
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+__pycache__
diff --git a/browset.py b/browset.py
index 5fb365e..3e65fff 100755
--- a/browset.py
+++ b/browset.py
@@ -4,7 +4,8 @@ from textual.widgets import Input, Button, Static, Footer
from textual.containers import Container
from rich.markdown import Markdown
from textual.binding import Binding
-from gemtext import Gemtext
+from mime.gemtext import Gemtext
+from mime.plaintext import Plaintext
from protocol.gemini import GeminiProtocol
class Browset(App):
@@ -69,7 +70,11 @@ class Browset(App):
self.url = url
(mime, fp) = GeminiProtocol.get(url)
self.query_one("#content").remove()
- self.mount(Gemtext(fp=fp, id="content"))
+ if "text/gemini" in mime:
+ content = Gemtext(fp=fp, id="content")
+ else:
+ content = Plaintext(fp=fp, id="content")
+ self.mount(content)
if __name__ == "__main__":
app = Browset()
diff --git a/gemtext.py b/mime/gemtext.py
index 602d308..9436d3f 100644
--- a/gemtext.py
+++ b/mime/gemtext.py
@@ -1,6 +1,7 @@
from textual.widgets import Button, Static
from textual.app import ComposeResult
from textual.containers import Container
+from rich.text import Text
class Gemtext(Static):
"""Gemtext widget."""
@@ -26,7 +27,7 @@ class Gemtext(Static):
elif line.startswith("=>"):
path = line[2:].lstrip().split(' ')[0]
text = ' '.join(line[2:].lstrip().split(' ')[1:])
- self.mount(Button(text or path, name=path))
+ self.mount(Button(Text(text or path,overflow="fold"), name=path))
elif line.startswith("#"):
count = line.split(' ')[0][0:3].count("#")
w = Static(line.lstrip("#"), markup=False, classes="header h"+str(count))
diff --git a/mime/plaintext.py b/mime/plaintext.py
new file mode 100644
index 0000000..ff548e5
--- /dev/null
+++ b/mime/plaintext.py
@@ -0,0 +1,16 @@
+from textual.widgets import Static
+
+class Plaintext(Static):
+ """Plaintext widget."""
+
+ def __init__(self, fp, id):
+ super().__init__(id=id)
+ self.addlines(fp)
+
+ def addlines(self, fp):
+ for lin in fp:
+ line = lin
+ if type(line) is bytes:
+ line = line.decode("UTF-8")
+ line = line.rstrip("\r\n")
+ self.mount(Static(line, markup=False))