From 047cfc35db5bdd438de6cea7f67be8b1a171f4a7 Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 17 Sep 2023 18:12:49 +0200 Subject: [PATCH] Render HTML for entries --- blog_experiment/blog/blog_pages.py | 62 +++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/blog_experiment/blog/blog_pages.py b/blog_experiment/blog/blog_pages.py index 7808c16..f4124d0 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(), ), ) -- 2.47.3