From 165d8be1f39ddd3e58386605295891853529e7d9 Mon Sep 17 00:00:00 2001 From: EamonnMR Date: Sun, 25 Jun 2023 10:33:22 -0400 Subject: [PATCH] Show excerpts of posts in the menu --- server.py | 49 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 10 deletions(-) diff --git a/server.py b/server.py index d839f82..99b7545 100644 --- a/server.py +++ b/server.py @@ -1,7 +1,7 @@ from os import getenv from urllib.parse import urljoin from html import unescape - +from textwrap import wrap as text_wrap import pituophis from pituophis import Item, Request @@ -14,6 +14,20 @@ wordpress_url = getenv("URL") handlers = {} formatters = {} +def wrap(text): + return "\n".join(text_wrap(text, width=int(getenv("WIDTH", 80)))) + +def excise_special_characters(text): + # TODO: Actually use .encode("ascii", "excise_special_characters") and register a custom handler + for char, replacement in { + "“": '"', + "’": "'", + "”": '"', + "w": "w", + }.items(): + text = text.replace(char, replacement) + return text + def register_handler(path: str): def decorator_handler(func): handlers[path] = func @@ -41,13 +55,23 @@ def p(tag): return tag.get_text() @register_formatter -def img(_tag): - return "(Image Omitted)" +def img(tag): + if "alt" in tag: + return f"" + return "" def format_post(post): - soup = BeautifulSoup(post[0]["content"]["rendered"], features="html.parser") - tags = soup.find_all(["h1", "h2", "h3", "p", "img"]) - return "\n".join(formatters[tag.name](tag) for tag in tags) + post = post[0] + header = f""" + ** {post["title"]} ** + {post["date"]} - {post["author"]} + """ + soup = BeautifulSoup(post["content"]["rendered"], features="html.parser") + tags = soup.find_all(formatters.keys()) + return header + "\n".join( + wrap(formatters[tag.name](tag)) + for tag in tags + ) @register_handler("/post/{slug}") def post(request: Request, slug: str): @@ -59,6 +83,12 @@ def post(request: Request, slug: str): page = get(urljoin(wordpress_url, f"wp-json/wp/v2/pages?slug={slug}")).json() return format_post(page) +def format_excerpt(post): + text = BeautifulSoup(post["excerpt"]["rendered"]).get_text() + cutoff = text.find("…") + fudge_factor = 100 # Deal with the weird [html] link generated by the penny toys article + return wrap(excise_special_characters(text[:cutoff - fudge_factor] + "...")) + def handle(request): for path, handler in handlers.items(): parse_result = parse(path, request.path) @@ -72,10 +102,9 @@ def handle(request): ("Posts", posts, "/post/") ): menu.append(f"<==={heading}===>") - menu += [ - Item(itype=0, path=f"{url}{post['slug']}", text=unescape(post['title']['rendered']), host=request.host, port=request.port) - for i, post in enumerate(items) - ] + for i, post in enumerate(items): + menu.append(Item(itype=0, path=f"{url}{post['slug']}", text=unescape(post['title']['rendered']), host=request.host, port=request.port)) + menu.append(format_excerpt(post)) return menu if __name__ == '__main__':