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:
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()
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
import htmlgenerator as h
-from blog import meta, pretty
+from blog import meta, pretty, gemtext
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