From 6a390b55041c60387b8afc5e5f6a69a5e494939f Mon Sep 17 00:00:00 2001 From: alex Date: Sun, 8 Oct 2023 16:40:42 +0200 Subject: Add RSS --- blog_experiment/blog/__init__.py | 2 ++ blog_experiment/blog/blog_pages.py | 34 ++++++++++++++++++++++++++++++---- blog_experiment/blog/html.py | 6 ++++-- blog_experiment/blog/meta.py | 3 +++ 4 files changed, 39 insertions(+), 6 deletions(-) create mode 100644 blog_experiment/blog/meta.py (limited to 'blog_experiment/blog') diff --git a/blog_experiment/blog/__init__.py b/blog_experiment/blog/__init__.py index 4b1e0ba5..594d1a77 100644 --- a/blog_experiment/blog/__init__.py +++ b/blog_experiment/blog/__init__.py @@ -13,4 +13,6 @@ def handler(request: bicephalus.Request) -> bicephalus.Response: blog_file = pathlib.Path("content") / (request.path[1:-1] + ".gmi") if blog_file.exists(): return blog_pages.EntryPage(request, blog_file).response() + if request.path == "/feed/" and request.proto == bicephalus.Proto.HTTP: + return blog_pages.Root(request).feed() return page.NotFound(request).response() diff --git a/blog_experiment/blog/blog_pages.py b/blog_experiment/blog/blog_pages.py index b6776ca5..a82857b1 100644 --- a/blog_experiment/blog/blog_pages.py +++ b/blog_experiment/blog/blog_pages.py @@ -3,11 +3,15 @@ import itertools import pathlib import textwrap +import bs4 + import bicephalus import htmlgenerator as h -from blog import html, page, gemtext +from feedgen import feed + +from blog import html, page, gemtext, meta class Entry: @@ -113,10 +117,10 @@ class Root(page.BasePage): posts = "\n".join([f"=> {e.uri} {e.posted} {e.title}" for e in self.entries()]) content = ( textwrap.dedent( - """\ - # El blog es mío + f"""\ + # {meta.TITLE} - ## Hay otros como él, pero este es el mío + ## {meta.SUBTITLE} ____ """ @@ -135,6 +139,28 @@ class Root(page.BasePage): html.html_template(*itertools.chain(posts)), ) + def feed(self): + fg = feed.FeedGenerator() + fg.title(meta.TITLE) + fg.subtitle(meta.SUBTITLE) + fg.link(href=meta.BASE_URL, rel="self") + + for entry in self.entries()[0:10]: + fe = fg.add_entry() + url = f"{meta.BASE_URL}{entry.uri}" + fe.link(href=url) + fe.updated(datetime.datetime.combine(entry.posted, datetime.datetime.min.time(), tzinfo=datetime.timezone.utc)) + fe.title(entry.title) + html = h.render(h.BaseElement(*entry.html()), {}) + html = bs4.BeautifulSoup(html, features="html.parser").prettify() + fe.content(html, type="html") + + return bicephalus.Response( + status=bicephalus.Status.OK, + content_type="application/rss+xml", + content=fg.rss_str(pretty=True), + ) + class EntryPage(page.BasePage): def __init__(self, request, path): diff --git a/blog_experiment/blog/html.py b/blog_experiment/blog/html.py index 2ecf97a6..3478eb2f 100644 --- a/blog_experiment/blog/html.py +++ b/blog_experiment/blog/html.py @@ -1,6 +1,8 @@ import bs4 import htmlgenerator as h +from blog import meta + def html_template(*content, page_title=None): title = "El blog es mío" @@ -10,8 +12,8 @@ def html_template(*content, page_title=None): h.HTML( h.HEAD(h.TITLE(title)), h.BODY( - h.H1("El blog es mío"), - h.H2("Hay otros como él, pero este es el mío"), + h.H1(meta.TITLE), + h.H2(meta.SUBTITLE), *content, ), doctype="html", diff --git a/blog_experiment/blog/meta.py b/blog_experiment/blog/meta.py new file mode 100644 index 00000000..83081904 --- /dev/null +++ b/blog_experiment/blog/meta.py @@ -0,0 +1,3 @@ +TITLE = "El blog es mío" +SUBTITLE = "Hay otros como él, pero este es el mío" +BASE_URL = "https://alex.corcoles.net" -- cgit v1.2.3