Broken project to implement a cross-protocol browser in textual
Diffstat (limited to 'mime/gemtext.py')
-rw-r--r--mime/gemtext.py47
1 files changed, 47 insertions, 0 deletions
diff --git a/mime/gemtext.py b/mime/gemtext.py
new file mode 100644
index 0000000..9436d3f
--- /dev/null
+++ b/mime/gemtext.py
@@ -0,0 +1,47 @@
+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."""
+ inPre = False
+
+ 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")
+ if line.startswith("```"):
+ self.inPre = not self.inPre
+ if self.inPre:
+ self.inPre = Preformatted()
+ self.mount(self.inPre)
+ elif self.inPre:
+ self.inPre.mount(Static(line, markup=False))
+ elif line.startswith("=>"):
+ path = line[2:].lstrip().split(' ')[0]
+ text = ' '.join(line[2:].lstrip().split(' ')[1:])
+ 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))
+ self.mount(w)
+ else:
+ self.mount(Static(line, markup=False))
+
+class Preformatted(Container):
+ pass
+
+if __name__ == "__main__":
+ from textual.app import App
+ class Test(App):
+ def compose(self) -> ComposeResult:
+ yield Gemtext(txt="#title\n=> /href link text\nworld star hiphop", id="yo")
+ app = Test()
+ app.run()