diff options
| author | alex <alex@pdp7.net> | 2023-10-08 21:55:35 +0200 |
|---|---|---|
| committer | alex <alex@pdp7.net> | 2023-10-08 21:55:35 +0200 |
| commit | 4716d59f08c94607c66f5ca85ce9aaaf63fd017e (patch) | |
| tree | eb63bb70881daed9b139717ad0453270da2c8b6c /blog_experiment/blog/html.py | |
| parent | 8efec5e2974570580f674e2c601e70727d5eec8a (diff) | |
Add about
Diffstat (limited to 'blog_experiment/blog/html.py')
| -rw-r--r-- | blog_experiment/blog/html.py | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/blog_experiment/blog/html.py b/blog_experiment/blog/html.py index 5263ca9b..8aa92f4a 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 |
