From 74c1b89b728d7d1013b714adf39737cd27e045f3 Mon Sep 17 00:00:00 2001 From: Zach DeCook Date: Sat, 14 Jan 2023 09:07:07 -0500 Subject: mime: Support plaintext format as well --- .gitignore | 1 + browset.py | 9 +++++++-- gemtext.py | 46 ---------------------------------------------- mime/gemtext.py | 47 +++++++++++++++++++++++++++++++++++++++++++++++ mime/plaintext.py | 16 ++++++++++++++++ 5 files changed, 71 insertions(+), 48 deletions(-) create mode 100644 .gitignore delete mode 100644 gemtext.py create mode 100644 mime/gemtext.py create mode 100644 mime/plaintext.py 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/gemtext.py deleted file mode 100644 index 602d308..0000000 --- a/gemtext.py +++ /dev/null @@ -1,46 +0,0 @@ -from textual.widgets import Button, Static -from textual.app import ComposeResult -from textual.containers import Container - -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 or path, 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() 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() 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)) -- cgit 1.4.1