Show excerpts of posts in the menu

This commit is contained in:
EamonnMR 2023-06-25 10:33:22 -04:00
parent 453287e723
commit 165d8be1f3

View file

@ -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"<Image Omitted: {tag['alt']}>"
return "<Image Omitted (no alt text)>"
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__':