diff options
| author | alex <alex@pdp7.net> | 2023-09-17 18:12:49 +0200 |
|---|---|---|
| committer | alex <alex@pdp7.net> | 2023-09-17 18:12:49 +0200 |
| commit | 047cfc35db5bdd438de6cea7f67be8b1a171f4a7 (patch) | |
| tree | 0a71fe40d69ce23705fe82cd6f663420029b94a6 /blog_experiment/blog | |
| parent | e7d04e802ea9fcf4a56210be16aaa0b131e5e797 (diff) | |
Render HTML for entries
Diffstat (limited to 'blog_experiment/blog')
| -rw-r--r-- | blog_experiment/blog/blog_pages.py | 62 |
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(), ), ) |
