Show excerpts of posts in the menu
This commit is contained in:
parent
453287e723
commit
165d8be1f3
1 changed files with 39 additions and 10 deletions
49
server.py
49
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"<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__':
|
||||
|
|
Loading…
Add table
Reference in a new issue