From 4716d59f08c94607c66f5ca85ce9aaaf63fd017e Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 8 Oct 2023 21:55:35 +0200 Subject: [PATCH] Add about --- blog_experiment/blog/__init__.py | 29 ++++++++++++- blog_experiment/blog/blog_pages.py | 66 +---------------------------- blog_experiment/blog/html.py | 68 +++++++++++++++++++++++++++++- 3 files changed, 96 insertions(+), 67 deletions(-) diff --git a/blog_experiment/blog/__init__.py b/blog_experiment/blog/__init__.py index 594d1a7..c16c2a2 100644 --- a/blog_experiment/blog/__init__.py +++ b/blog_experiment/blog/__init__.py @@ -3,7 +3,31 @@ import re import bicephalus -from blog import blog_pages, page +import htmlgenerator as h + +from blog import blog_pages, page, html, pretty, gemtext + + +class AboutPage(page.BasePage): + def get_gemini_content(self): + return ( + bicephalus.Status.OK, + "text/gemini", + pathlib.Path("static/about/index.gmi").read_text(), + ) + + def get_http_content(self): + return ( + bicephalus.Status.OK, + "text/html", + pretty.pretty_html(h.render( + h.HTML( + h.HEAD( + h.TITLE("About Álex Córcoles"), + ), + h.BODY(*html.gemini_to_html(gemtext.parse(self.get_gemini_content()[2]))) + ), {})), + ) def handler(request: bicephalus.Request) -> bicephalus.Response: @@ -15,4 +39,7 @@ def handler(request: bicephalus.Request) -> bicephalus.Response: return blog_pages.EntryPage(request, blog_file).response() if request.path == "/feed/" and request.proto == bicephalus.Proto.HTTP: return blog_pages.Root(request).feed() + if request.path == "/about/": + return AboutPage(request).response() + return page.NotFound(request).response() diff --git a/blog_experiment/blog/blog_pages.py b/blog_experiment/blog/blog_pages.py index 1edf0df..7802c00 100644 --- a/blog_experiment/blog/blog_pages.py +++ b/blog_experiment/blog/blog_pages.py @@ -46,71 +46,7 @@ class Entry: assert isinstance(parsed[1], gemtext.Line) assert parsed[2] == gemtext.Line("") - result = [] - - parsed = parsed[3:] - i = 0 - 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): - url = gem_element.url - if url.startswith("gemini://"): - if url.startswith("gemini://alex.corcoles.net/"): - url = url.replace("gemini://alex.corcoles.net/", f"{meta.SCHEMA}://{meta.HOST}/") - else: - url = url.replace("gemini://", "https://portal.mozz.us/gemini/") - - result.append(h.P(h.A(gem_element.text or gem_element.url, href=url))) - i = i + 1 - continue - - if gem_element == gemtext.Line(""): - i = i + 1 - continue - - if isinstance(gem_element, gemtext.BlockQuote): - content = [] - for line in gem_element.lines: - if line.text: - content.append(line.text) - content.append(h.BR()) - result.append(h.BLOCKQUOTE(*content)) - 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 - - if isinstance(gem_element, gemtext.Pre): - result.append(h.PRE(gem_element.content)) - i = i + 1 - continue - - assert False, f"unknown element {gem_element}" - + result = html.gemini_to_html(parsed[3:]) result.append(h.P(h.A("Editar", href=self.edit_url))) return result diff --git a/blog_experiment/blog/html.py b/blog_experiment/blog/html.py index 5263ca9..8aa92f4 100644 --- a/blog_experiment/blog/html.py +++ b/blog_experiment/blog/html.py @@ -2,7 +2,7 @@ import itertools import htmlgenerator as h -from blog import meta, pretty +from blog import meta, pretty, gemtext def html_template(*content, page_title=None): @@ -33,3 +33,69 @@ def html_template(*content, page_title=None): {}, )) + +def gemini_to_html(parsed): + 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): + url = gem_element.url + if url.startswith("gemini://"): + if url.startswith("gemini://alex.corcoles.net/"): + url = url.replace("gemini://alex.corcoles.net/", f"{meta.SCHEMA}://{meta.HOST}/") + else: + url = url.replace("gemini://", "https://portal.mozz.us/gemini/") + + result.append(h.P(h.A(gem_element.text or gem_element.url, href=url))) + i = i + 1 + continue + + if gem_element == gemtext.Line(""): + i = i + 1 + continue + + if isinstance(gem_element, gemtext.BlockQuote): + content = [] + for line in gem_element.lines: + if line.text: + content.append(line.text) + content.append(h.BR()) + result.append(h.BLOCKQUOTE(*content)) + 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 + + if isinstance(gem_element, gemtext.Pre): + result.append(h.PRE(gem_element.content)) + i = i + 1 + continue + + assert False, f"unknown element {gem_element}" + + return result -- 2.47.3