aboutsummaryrefslogtreecommitdiff
path: root/blog_experiment
diff options
context:
space:
mode:
authoralex <alex@pdp7.net>2023-09-17 18:12:49 +0200
committeralex <alex@pdp7.net>2023-09-17 18:12:49 +0200
commit047cfc35db5bdd438de6cea7f67be8b1a171f4a7 (patch)
tree0a71fe40d69ce23705fe82cd6f663420029b94a6 /blog_experiment
parente7d04e802ea9fcf4a56210be16aaa0b131e5e797 (diff)
Render HTML for entries
Diffstat (limited to 'blog_experiment')
-rw-r--r--blog_experiment/blog/blog_pages.py62
1 files changed, 60 insertions, 2 deletions
diff --git a/blog_experiment/blog/blog_pages.py b/blog_experiment/blog/blog_pages.py
index 7808c16d..f4124d02 100644
--- a/blog_experiment/blog/blog_pages.py
+++ b/blog_experiment/blog/blog_pages.py
@@ -7,7 +7,7 @@ import bicephalus
import htmlgenerator as h
-from blog import html, page
+from blog import html, page, gemtext
class Entry:
@@ -28,6 +28,64 @@ class Entry:
def uri(self):
return f"/{self.path.parts[1]}/{self.path.parts[2]}/{self.path.stem}/"
+ def html(self):
+ parsed = gemtext.parse(self.content)
+
+ assert isinstance(parsed[0], gemtext.Header)
+ assert parsed[0].level == 1
+ assert isinstance(parsed[1], gemtext.Line)
+ assert parsed[2] == gemtext.Line("")
+
+ parsed = parsed[3:]
+ i = 0
+
+ result = []
+ while i < len(parsed):
+ gem_element = parsed[i]
+
+ if isinstance(gem_element, gemtext.Header):
+ header = [h.H1, h.H2, h.H3, h.H4, h.H5, h.H6][gem_element.level - 1]
+ result.append(header(gem_element.text))
+ i = i + 1
+ continue
+
+ if isinstance(gem_element, gemtext.List):
+ result.append(h.UL([h.LI(i.text) for i in gem_element.items]))
+ i = i + 1
+ continue
+
+ if isinstance(gem_element, gemtext.Link):
+ result.append(h.P(h.A(gem_element.text or gem_element.url, href=gem_element.url)))
+ i = i + 1
+ continue
+
+ if gem_element == gemtext.Line(""):
+ i = i + 1
+ continue
+
+ if isinstance(gem_element, gemtext.BlockQuote):
+ assert len(gem_element.lines) == 1
+ result.append(h.BLOCKQUOTE(gem_element.lines[0].text))
+ i = i + 1
+ continue
+
+ if isinstance(gem_element, gemtext.Line):
+ paragraph = [gem_element.text]
+ i = i + 1
+ while i < len(parsed):
+ gem_element = parsed[i]
+ if isinstance(gem_element, gemtext.Line) and gem_element.text != "":
+ paragraph.append(h.BR())
+ paragraph.append(gem_element.text)
+ i = i + 1
+ else:
+ break
+ result.append(h.P(*paragraph))
+ continue
+ assert False, f"unknown element {gem_element}"
+
+ return result
+
class Root(page.BasePage):
def entries(self):
@@ -75,6 +133,6 @@ class EntryPage(page.BasePage):
bicephalus.Status.OK,
"text/html",
html.html_template(
- h.PRE(self.entry.content),
+ *self.entry.html(),
),
)