From 453287e723fde81edef82d2394137ae161d7e805 Mon Sep 17 00:00:00 2001 From: EamonnMR Date: Thu, 22 Jun 2023 00:03:44 -0400 Subject: [PATCH] Fancy tag parsing Thanks to this post: https://mastodon.social/@makemoremusic/110545160558311215 --- README.md | 7 ++++-- server.py | 74 +++++++++++++++++++++++++++++++++++++------------------ 2 files changed, 55 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index fcb811f..3ae1392 100644 --- a/README.md +++ b/README.md @@ -8,11 +8,14 @@ Pass your desired wordpress site's URL and port with environment variables like `URL='http://wordpress.example.com' PORT='7070' python server.py` +Connect like this: + +`lynx gopher://localhost:7070` + ## Why Because I'm not just a luddite, I'm an incredibly lazy luddite. ## Project status -Experimental. Lacks basic capabilities; right now it's just a menu with your last ten posts. - +Experimental. Just shows posts and pages. Could do a lot more cleanup, maybe adding a menu within each page to extract all of the links or something. diff --git a/server.py b/server.py index a6e3636..d839f82 100644 --- a/server.py +++ b/server.py @@ -11,8 +11,8 @@ from bs4 import BeautifulSoup wordpress_url = getenv("URL") - handlers = {} +formatters = {} def register_handler(path: str): def decorator_handler(func): @@ -20,37 +20,63 @@ def register_handler(path: str): return func return decorator_handler -@register_handler("/post/{id}") -def post(request: Request, id: int): - post = get(urljoin(wordpress_url, f"wp-json/wp/v2/posts/{id}")).json() - return BeautifulSoup(post["content"]["rendered"]).get_text() +def register_formatter(func): + formatters[func.__name__] = func + return func +@register_formatter +def h1(tag): + return f"\n === {tag.get_text()} === \n" + +@register_formatter +def h2(tag): + return f"\n == {tag.get_text()} == \n" + +@register_formatter +def h3(tag): + return f"\n = {tag.get_text()} = \n" + +@register_formatter +def p(tag): + return tag.get_text() + +@register_formatter +def img(_tag): + return "(Image Omitted)" + +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) + +@register_handler("/post/{slug}") +def post(request: Request, slug: str): + post = get(urljoin(wordpress_url, f"wp-json/wp/v2/posts?slug={slug}")).json() + return format_post(post) + +@register_handler("/page/{slug}") +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 handle(request): for path, handler in handlers.items(): parse_result = parse(path, request.path) if parse_result is not None: return handler(request, **parse_result.named) - - posts = get(urljoin(wordpress_url, "wp-json/wp/v2/posts")).json() - - menu = [ - Item(itype=0, path=f"/post/{post['id']}", text=unescape(post['title']['rendered']), host=request.host, port=request.port) - for i, post in enumerate(posts) - ] + menu = [getenv("HEADER_TEXT")] + posts = get(urljoin(wordpress_url, "wp-json/wp/v2/posts?filter[posts_per_page]=-1")).json() + pages = get(urljoin(wordpress_url, "wp-json/wp/v2/pages?filter[posts_per_page]=-1")).json() + for heading, items, url in ( + ("Pages", pages, "/page/"), + ("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) + ] return menu if __name__ == '__main__': pituophis.serve("127.0.0.1", int(getenv("PORT")), handler=handle) - - # Itypes: - # 0: FILE - # 1: dir - # 2: CSO - # 3: UNKN - # 4: HQX - # 5: BIN - # 6: UUE - # 7: ? - # 8: TEL - # 9: BIN \ No newline at end of file