aboutsummaryrefslogtreecommitdiff
path: root/blog_experiment/blog/blog_pages.py
diff options
context:
space:
mode:
authoralex <alex@pdp7.net>2023-09-17 17:39:54 +0200
committeralex <alex@pdp7.net>2023-09-17 17:39:54 +0200
commite7d04e802ea9fcf4a56210be16aaa0b131e5e797 (patch)
tree071fc39e31a08dd9c91fe5c5ab4d8c05fde3feab /blog_experiment/blog/blog_pages.py
parente5a7e9667c709c20988158b30b29e5ac019c0fe2 (diff)
Refactor in modules, add gemtext parser
Diffstat (limited to 'blog_experiment/blog/blog_pages.py')
-rw-r--r--blog_experiment/blog/blog_pages.py80
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),
+ ),
+ )