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 os import getenv
from urllib.parse import urljoin from urllib.parse import urljoin
from html import unescape from html import unescape
from textwrap import wrap as text_wrap
import pituophis import pituophis
from pituophis import Item, Request from pituophis import Item, Request
@ -14,6 +14,20 @@ wordpress_url = getenv("URL")
handlers = {} handlers = {}
formatters = {} 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 register_handler(path: str):
def decorator_handler(func): def decorator_handler(func):
handlers[path] = func handlers[path] = func
@ -41,13 +55,23 @@ def p(tag):
return tag.get_text() return tag.get_text()
@register_formatter @register_formatter
def img(_tag): def img(tag):
return "(Image Omitted)" if "alt" in tag:
return f"<Image Omitted: {tag['alt']}>"
return "<Image Omitted (no alt text)>"
def format_post(post): def format_post(post):
soup = BeautifulSoup(post[0]["content"]["rendered"], features="html.parser") post = post[0]
tags = soup.find_all(["h1", "h2", "h3", "p", "img"]) header = f"""
return "\n".join(formatters[tag.name](tag) for tag in tags) ** {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}") @register_handler("/post/{slug}")
def post(request: Request, slug: str): 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() page = get(urljoin(wordpress_url, f"wp-json/wp/v2/pages?slug={slug}")).json()
return format_post(page) 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): def handle(request):
for path, handler in handlers.items(): for path, handler in handlers.items():
parse_result = parse(path, request.path) parse_result = parse(path, request.path)
@ -72,10 +102,9 @@ def handle(request):
("Posts", posts, "/post/") ("Posts", posts, "/post/")
): ):
menu.append(f"<==={heading}===>") menu.append(f"<==={heading}===>")
menu += [ for i, post in enumerate(items):
Item(itype=0, path=f"{url}{post['slug']}", text=unescape(post['title']['rendered']), host=request.host, port=request.port) menu.append(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) menu.append(format_excerpt(post))
]
return menu return menu
if __name__ == '__main__': if __name__ == '__main__':