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 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__':
|
||||||
|
|
Loading…
Add table
Reference in a new issue