diff options
| author | alex <alex@pdp7.net> | 2023-09-17 17:39:54 +0200 |
|---|---|---|
| committer | alex <alex@pdp7.net> | 2023-09-17 17:39:54 +0200 |
| commit | e7d04e802ea9fcf4a56210be16aaa0b131e5e797 (patch) | |
| tree | 071fc39e31a08dd9c91fe5c5ab4d8c05fde3feab /blog_experiment/blog/blog_pages.py | |
| parent | e5a7e9667c709c20988158b30b29e5ac019c0fe2 (diff) | |
Refactor in modules, add gemtext parser
Diffstat (limited to 'blog_experiment/blog/blog_pages.py')
| -rw-r--r-- | blog_experiment/blog/blog_pages.py | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/blog_experiment/blog/blog_pages.py b/blog_experiment/blog/blog_pages.py new file mode 100644 index 00000000..7808c16d --- /dev/null +++ b/blog_experiment/blog/blog_pages.py @@ -0,0 +1,80 @@ +import datetime +import itertools +import pathlib +import textwrap + +import bicephalus + +import htmlgenerator as h + +from blog import html, page + + +class Entry: + def __init__(self, path: pathlib.Path): + assert path.is_relative_to(pathlib.Path("content")), f"bad path {path}" + self.path = path + self.content = path.read_text() + + @property + def title(self): + return self.content.splitlines()[0][2:] + + @property + def posted(self): + return datetime.date.fromisoformat(self.content.splitlines()[1]) + + @property + def uri(self): + return f"/{self.path.parts[1]}/{self.path.parts[2]}/{self.path.stem}/" + + +class Root(page.BasePage): + def entries(self): + entries = map(Entry, pathlib.Path("content").glob("*/*/*.gmi")) + return sorted(entries, key=lambda e: e.posted, reverse=True) + + def get_gemini_content(self): + posts = "\n".join([f"=> {e.uri} {e.posted} {e.title}" for e in self.entries()]) + content = ( + textwrap.dedent( + """\ + # El blog es mío + + ## Hay otros como él, pero este es el mío + + ____ + """ + ) + + posts + ) + return bicephalus.Status.OK, "text/gemini", content + + def get_http_content(self): + posts = [ + (h.H3(h.A(f"{e.title} ({e.posted})", href=e.uri))) for e in self.entries() + ] + return ( + bicephalus.Status.OK, + "text/html", + html.html_template(*itertools.chain(posts)), + ) + + +class EntryPage(page.BasePage): + def __init__(self, request, path): + super().__init__(request) + self.path = path + self.entry = Entry(path) + + def get_gemini_content(self): + return bicephalus.Status.OK, "text/gemini", self.entry.content + + def get_http_content(self): + return ( + bicephalus.Status.OK, + "text/html", + html.html_template( + h.PRE(self.entry.content), + ), + ) |
